diff --git a/.drone.yml b/.drone.yml new file mode 100644 index 00000000..925a22e4 --- /dev/null +++ b/.drone.yml @@ -0,0 +1,13 @@ +--- +kind: pipeline +type: exec +name: default + +platform: + os: linux + arch: amd64 + +steps: + - name: greeting + commands: + - echo HELLO WORLD! Drone on Docker diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..3cacc9d2 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,496 @@ +root = true + +[*] +charset = utf-8 +end_of_line = crlf +indent_size = 4 +indent_style = space +insert_final_newline = true +max_line_length = 120 +tab_width = 4 +ij_continuation_indent_size = 8 +ij_formatter_off_tag = @formatter:off +ij_formatter_on_tag = @formatter:on +ij_formatter_tags_enabled = false +ij_smart_tabs = false +ij_visual_guides = none +ij_wrap_on_typing = false + +[*.java] +ij_java_align_consecutive_assignments = false +ij_java_align_consecutive_variable_declarations = false +ij_java_align_group_field_declarations = false +ij_java_align_multiline_annotation_parameters = false +ij_java_align_multiline_array_initializer_expression = false +ij_java_align_multiline_assignment = false +ij_java_align_multiline_binary_operation = false +ij_java_align_multiline_chained_methods = false +ij_java_align_multiline_extends_list = false +ij_java_align_multiline_for = true +ij_java_align_multiline_method_parentheses = false +ij_java_align_multiline_parameters = true +ij_java_align_multiline_parameters_in_calls = true +ij_java_align_multiline_parenthesized_expression = false +ij_java_align_multiline_records = true +ij_java_align_multiline_resources = true +ij_java_align_multiline_ternary_operation = false +ij_java_align_multiline_text_blocks = false +ij_java_align_multiline_throws_list = false +ij_java_align_subsequent_simple_methods = false +ij_java_align_throws_keyword = false +ij_java_annotation_parameter_wrap = off +ij_java_array_initializer_new_line_after_left_brace = false +ij_java_array_initializer_right_brace_on_new_line = false +ij_java_array_initializer_wrap = off +ij_java_assert_statement_colon_on_next_line = false +ij_java_assert_statement_wrap = off +ij_java_assignment_wrap = off +ij_java_binary_operation_sign_on_next_line = false +ij_java_binary_operation_wrap = off +ij_java_blank_lines_after_anonymous_class_header = 0 +ij_java_blank_lines_after_class_header = 0 +ij_java_blank_lines_after_imports = 1 +ij_java_blank_lines_after_package = 1 +ij_java_blank_lines_around_class = 1 +ij_java_blank_lines_around_field = 0 +ij_java_blank_lines_around_field_in_interface = 0 +ij_java_blank_lines_around_initializer = 1 +ij_java_blank_lines_around_method = 1 +ij_java_blank_lines_around_method_in_interface = 1 +ij_java_blank_lines_before_class_end = 0 +ij_java_blank_lines_before_imports = 1 +ij_java_blank_lines_before_method_body = 0 +ij_java_blank_lines_before_package = 0 +ij_java_block_brace_style = end_of_line +ij_java_block_comment_at_first_column = true +ij_java_builder_methods = none +ij_java_call_parameters_new_line_after_left_paren = false +ij_java_call_parameters_right_paren_on_new_line = false +ij_java_call_parameters_wrap = normal +ij_java_case_statement_on_separate_line = true +ij_java_catch_on_new_line = false +ij_java_class_annotation_wrap = split_into_lines +ij_java_class_brace_style = end_of_line +ij_java_class_count_to_use_import_on_demand = 5 +ij_java_class_names_in_javadoc = 1 +ij_java_do_not_indent_top_level_class_members = false +ij_java_do_not_wrap_after_single_annotation = false +ij_java_do_while_brace_force = never +ij_java_doc_add_blank_line_after_description = true +ij_java_doc_add_blank_line_after_param_comments = false +ij_java_doc_add_blank_line_after_return = false +ij_java_doc_add_p_tag_on_empty_lines = true +ij_java_doc_align_exception_comments = true +ij_java_doc_align_param_comments = true +ij_java_doc_do_not_wrap_if_one_line = false +ij_java_doc_enable_formatting = true +ij_java_doc_enable_leading_asterisks = true +ij_java_doc_indent_on_continuation = false +ij_java_doc_keep_empty_lines = true +ij_java_doc_keep_empty_parameter_tag = true +ij_java_doc_keep_empty_return_tag = true +ij_java_doc_keep_empty_throws_tag = true +ij_java_doc_keep_invalid_tags = true +ij_java_doc_param_description_on_new_line = false +ij_java_doc_preserve_line_breaks = false +ij_java_doc_use_throws_not_exception_tag = true +ij_java_else_on_new_line = false +ij_java_entity_dd_suffix = EJB +ij_java_entity_eb_suffix = Bean +ij_java_entity_hi_suffix = Home +ij_java_entity_lhi_prefix = Local +ij_java_entity_lhi_suffix = Home +ij_java_entity_li_prefix = Local +ij_java_entity_pk_class = java.lang.String +ij_java_entity_vo_suffix = VO +ij_java_enum_constants_wrap = off +ij_java_extends_keyword_wrap = off +ij_java_extends_list_wrap = off +ij_java_field_annotation_wrap = split_into_lines +ij_java_finally_on_new_line = false +ij_java_for_brace_force = never +ij_java_for_statement_new_line_after_left_paren = false +ij_java_for_statement_right_paren_on_new_line = false +ij_java_for_statement_wrap = off +ij_java_generate_final_locals = false +ij_java_generate_final_parameters = false +ij_java_if_brace_force = never +ij_java_imports_layout = *,|,javax.**,java.**,|,$* +ij_java_indent_case_from_switch = true +ij_java_insert_inner_class_imports = false +ij_java_insert_override_annotation = true +ij_java_keep_blank_lines_before_right_brace = 2 +ij_java_keep_blank_lines_between_package_declaration_and_header = 2 +ij_java_keep_blank_lines_in_code = 2 +ij_java_keep_blank_lines_in_declarations = 2 +ij_java_keep_builder_methods_indents = false +ij_java_keep_control_statement_in_one_line = true +ij_java_keep_first_column_comment = true +ij_java_keep_indents_on_empty_lines = false +ij_java_keep_line_breaks = true +ij_java_keep_multiple_expressions_in_one_line = false +ij_java_keep_simple_blocks_in_one_line = false +ij_java_keep_simple_classes_in_one_line = false +ij_java_keep_simple_lambdas_in_one_line = false +ij_java_keep_simple_methods_in_one_line = false +ij_java_label_indent_absolute = false +ij_java_label_indent_size = 0 +ij_java_lambda_brace_style = end_of_line +ij_java_layout_static_imports_separately = true +ij_java_line_comment_add_space = false +ij_java_line_comment_at_first_column = true +ij_java_message_dd_suffix = EJB +ij_java_message_eb_suffix = Bean +ij_java_method_annotation_wrap = split_into_lines +ij_java_method_brace_style = end_of_line +ij_java_method_call_chain_wrap = off +ij_java_method_parameters_new_line_after_left_paren = false +ij_java_method_parameters_right_paren_on_new_line = false +ij_java_method_parameters_wrap = off +ij_java_modifier_list_wrap = false +ij_java_names_count_to_use_import_on_demand = 3 +ij_java_new_line_after_lparen_in_record_header = false +ij_java_packages_to_use_import_on_demand = java.awt.*,javax.swing.* +ij_java_parameter_annotation_wrap = off +ij_java_parentheses_expression_new_line_after_left_paren = false +ij_java_parentheses_expression_right_paren_on_new_line = false +ij_java_place_assignment_sign_on_next_line = false +ij_java_prefer_longer_names = true +ij_java_prefer_parameters_wrap = false +ij_java_record_components_wrap = normal +ij_java_repeat_synchronized = true +ij_java_replace_instanceof_and_cast = false +ij_java_replace_null_check = true +ij_java_replace_sum_lambda_with_method_ref = true +ij_java_resource_list_new_line_after_left_paren = false +ij_java_resource_list_right_paren_on_new_line = false +ij_java_resource_list_wrap = off +ij_java_rparen_on_new_line_in_record_header = false +ij_java_session_dd_suffix = EJB +ij_java_session_eb_suffix = Bean +ij_java_session_hi_suffix = Home +ij_java_session_lhi_prefix = Local +ij_java_session_lhi_suffix = Home +ij_java_session_li_prefix = Local +ij_java_session_si_suffix = Service +ij_java_space_after_closing_angle_bracket_in_type_argument = false +ij_java_space_after_colon = true +ij_java_space_after_comma = true +ij_java_space_after_comma_in_type_arguments = true +ij_java_space_after_for_semicolon = true +ij_java_space_after_quest = true +ij_java_space_after_type_cast = true +ij_java_space_before_annotation_array_initializer_left_brace = false +ij_java_space_before_annotation_parameter_list = false +ij_java_space_before_array_initializer_left_brace = false +ij_java_space_before_catch_keyword = true +ij_java_space_before_catch_left_brace = true +ij_java_space_before_catch_parentheses = true +ij_java_space_before_class_left_brace = true +ij_java_space_before_colon = true +ij_java_space_before_colon_in_foreach = true +ij_java_space_before_comma = false +ij_java_space_before_do_left_brace = true +ij_java_space_before_else_keyword = true +ij_java_space_before_else_left_brace = true +ij_java_space_before_finally_keyword = true +ij_java_space_before_finally_left_brace = true +ij_java_space_before_for_left_brace = true +ij_java_space_before_for_parentheses = true +ij_java_space_before_for_semicolon = false +ij_java_space_before_if_left_brace = true +ij_java_space_before_if_parentheses = true +ij_java_space_before_method_call_parentheses = false +ij_java_space_before_method_left_brace = true +ij_java_space_before_method_parentheses = false +ij_java_space_before_opening_angle_bracket_in_type_parameter = false +ij_java_space_before_quest = true +ij_java_space_before_switch_left_brace = true +ij_java_space_before_switch_parentheses = true +ij_java_space_before_synchronized_left_brace = true +ij_java_space_before_synchronized_parentheses = true +ij_java_space_before_try_left_brace = true +ij_java_space_before_try_parentheses = true +ij_java_space_before_type_parameter_list = false +ij_java_space_before_while_keyword = true +ij_java_space_before_while_left_brace = true +ij_java_space_before_while_parentheses = true +ij_java_space_inside_one_line_enum_braces = false +ij_java_space_within_empty_array_initializer_braces = false +ij_java_space_within_empty_method_call_parentheses = false +ij_java_space_within_empty_method_parentheses = false +ij_java_spaces_around_additive_operators = true +ij_java_spaces_around_assignment_operators = true +ij_java_spaces_around_bitwise_operators = true +ij_java_spaces_around_equality_operators = true +ij_java_spaces_around_lambda_arrow = true +ij_java_spaces_around_logical_operators = true +ij_java_spaces_around_method_ref_dbl_colon = false +ij_java_spaces_around_multiplicative_operators = true +ij_java_spaces_around_relational_operators = true +ij_java_spaces_around_shift_operators = true +ij_java_spaces_around_type_bounds_in_type_parameters = true +ij_java_spaces_around_unary_operator = false +ij_java_spaces_within_angle_brackets = false +ij_java_spaces_within_annotation_parentheses = false +ij_java_spaces_within_array_initializer_braces = false +ij_java_spaces_within_braces = false +ij_java_spaces_within_brackets = false +ij_java_spaces_within_cast_parentheses = false +ij_java_spaces_within_catch_parentheses = false +ij_java_spaces_within_for_parentheses = false +ij_java_spaces_within_if_parentheses = false +ij_java_spaces_within_method_call_parentheses = false +ij_java_spaces_within_method_parentheses = false +ij_java_spaces_within_parentheses = false +ij_java_spaces_within_record_header = false +ij_java_spaces_within_switch_parentheses = false +ij_java_spaces_within_synchronized_parentheses = false +ij_java_spaces_within_try_parentheses = false +ij_java_spaces_within_while_parentheses = false +ij_java_special_else_if_treatment = true +ij_java_subclass_name_suffix = Impl +ij_java_ternary_operation_signs_on_next_line = false +ij_java_ternary_operation_wrap = off +ij_java_test_name_suffix = Test +ij_java_throws_keyword_wrap = off +ij_java_throws_list_wrap = off +ij_java_use_external_annotations = false +ij_java_use_fq_class_names = false +ij_java_use_relative_indents = false +ij_java_use_single_class_imports = true +ij_java_variable_annotation_wrap = off +ij_java_visibility = public +ij_java_while_brace_force = never +ij_java_while_on_new_line = false +ij_java_wrap_comments = false +ij_java_wrap_first_method_in_call_chain = false +ij_java_wrap_long_lines = true + +[.editorconfig] +ij_editorconfig_align_group_field_declarations = false +ij_editorconfig_space_after_colon = false +ij_editorconfig_space_after_comma = true +ij_editorconfig_space_before_colon = false +ij_editorconfig_space_before_comma = false +ij_editorconfig_spaces_around_assignment_operators = true + +[{*.ant,*.fxml,*.jhm,*.jnlp,*.jrxml,*.pom,*.rng,*.tld,*.wadl,*.wsdd,*.wsdl,*.xjb,*.xml,*.xsd,*.xsl,*.xslt,*.xul}] +ij_xml_align_attributes = true +ij_xml_align_text = false +ij_xml_attribute_wrap = normal +ij_xml_block_comment_at_first_column = true +ij_xml_keep_blank_lines = 2 +ij_xml_keep_indents_on_empty_lines = false +ij_xml_keep_line_breaks = true +ij_xml_keep_line_breaks_in_text = true +ij_xml_keep_whitespaces = false +ij_xml_keep_whitespaces_around_cdata = preserve +ij_xml_keep_whitespaces_inside_cdata = false +ij_xml_line_comment_at_first_column = true +ij_xml_space_after_tag_name = false +ij_xml_space_around_equals_in_attribute = false +ij_xml_space_inside_empty_tag = false +ij_xml_text_wrap = normal +ij_xml_use_custom_settings = false + +[{*.bash,*.sh,*.zsh}] +indent_size = 2 +tab_width = 2 +ij_shell_binary_ops_start_line = false +ij_shell_keep_column_alignment_padding = false +ij_shell_minify_program = false +ij_shell_redirect_followed_by_space = false +ij_shell_switch_cases_indented = false +ij_shell_use_unix_line_separator = true + +[{*.cjs,*.js}] +ij_continuation_indent_size = 4 +ij_javascript_align_imports = false +ij_javascript_align_multiline_array_initializer_expression = false +ij_javascript_align_multiline_binary_operation = false +ij_javascript_align_multiline_chained_methods = false +ij_javascript_align_multiline_extends_list = false +ij_javascript_align_multiline_for = true +ij_javascript_align_multiline_parameters = true +ij_javascript_align_multiline_parameters_in_calls = false +ij_javascript_align_multiline_ternary_operation = false +ij_javascript_align_object_properties = 0 +ij_javascript_align_union_types = false +ij_javascript_align_var_statements = 0 +ij_javascript_array_initializer_new_line_after_left_brace = false +ij_javascript_array_initializer_right_brace_on_new_line = false +ij_javascript_array_initializer_wrap = off +ij_javascript_assignment_wrap = off +ij_javascript_binary_operation_sign_on_next_line = false +ij_javascript_binary_operation_wrap = off +ij_javascript_blacklist_imports = rxjs/Rx,node_modules/**,**/node_modules/**,@angular/material,@angular/material/typings/** +ij_javascript_blank_lines_after_imports = 1 +ij_javascript_blank_lines_around_class = 1 +ij_javascript_blank_lines_around_field = 0 +ij_javascript_blank_lines_around_function = 1 +ij_javascript_blank_lines_around_method = 1 +ij_javascript_block_brace_style = end_of_line +ij_javascript_call_parameters_new_line_after_left_paren = false +ij_javascript_call_parameters_right_paren_on_new_line = false +ij_javascript_call_parameters_wrap = off +ij_javascript_catch_on_new_line = false +ij_javascript_chained_call_dot_on_new_line = true +ij_javascript_class_brace_style = end_of_line +ij_javascript_comma_on_new_line = false +ij_javascript_do_while_brace_force = never +ij_javascript_else_on_new_line = false +ij_javascript_enforce_trailing_comma = keep +ij_javascript_extends_keyword_wrap = off +ij_javascript_extends_list_wrap = off +ij_javascript_field_prefix = _ +ij_javascript_file_name_style = relaxed +ij_javascript_finally_on_new_line = false +ij_javascript_for_brace_force = never +ij_javascript_for_statement_new_line_after_left_paren = false +ij_javascript_for_statement_right_paren_on_new_line = false +ij_javascript_for_statement_wrap = off +ij_javascript_force_quote_style = false +ij_javascript_force_semicolon_style = false +ij_javascript_function_expression_brace_style = end_of_line +ij_javascript_if_brace_force = never +ij_javascript_import_merge_members = global +ij_javascript_import_prefer_absolute_path = global +ij_javascript_import_sort_members = true +ij_javascript_import_sort_module_name = false +ij_javascript_import_use_node_resolution = true +ij_javascript_imports_wrap = on_every_item +ij_javascript_indent_case_from_switch = true +ij_javascript_indent_chained_calls = true +ij_javascript_indent_package_children = 0 +ij_javascript_jsx_attribute_value = braces +ij_javascript_keep_blank_lines_in_code = 2 +ij_javascript_keep_first_column_comment = true +ij_javascript_keep_indents_on_empty_lines = false +ij_javascript_keep_line_breaks = true +ij_javascript_keep_simple_blocks_in_one_line = false +ij_javascript_keep_simple_methods_in_one_line = false +ij_javascript_line_comment_add_space = true +ij_javascript_line_comment_at_first_column = false +ij_javascript_method_brace_style = end_of_line +ij_javascript_method_call_chain_wrap = off +ij_javascript_method_parameters_new_line_after_left_paren = false +ij_javascript_method_parameters_right_paren_on_new_line = false +ij_javascript_method_parameters_wrap = off +ij_javascript_object_literal_wrap = on_every_item +ij_javascript_parentheses_expression_new_line_after_left_paren = false +ij_javascript_parentheses_expression_right_paren_on_new_line = false +ij_javascript_place_assignment_sign_on_next_line = false +ij_javascript_prefer_as_type_cast = false +ij_javascript_prefer_explicit_types_function_expression_returns = false +ij_javascript_prefer_explicit_types_function_returns = false +ij_javascript_prefer_explicit_types_vars_fields = false +ij_javascript_prefer_parameters_wrap = false +ij_javascript_reformat_c_style_comments = false +ij_javascript_space_after_colon = true +ij_javascript_space_after_comma = true +ij_javascript_space_after_dots_in_rest_parameter = false +ij_javascript_space_after_generator_mult = true +ij_javascript_space_after_property_colon = true +ij_javascript_space_after_quest = true +ij_javascript_space_after_type_colon = true +ij_javascript_space_after_unary_not = false +ij_javascript_space_before_async_arrow_lparen = true +ij_javascript_space_before_catch_keyword = true +ij_javascript_space_before_catch_left_brace = true +ij_javascript_space_before_catch_parentheses = true +ij_javascript_space_before_class_lbrace = true +ij_javascript_space_before_class_left_brace = true +ij_javascript_space_before_colon = true +ij_javascript_space_before_comma = false +ij_javascript_space_before_do_left_brace = true +ij_javascript_space_before_else_keyword = true +ij_javascript_space_before_else_left_brace = true +ij_javascript_space_before_finally_keyword = true +ij_javascript_space_before_finally_left_brace = true +ij_javascript_space_before_for_left_brace = true +ij_javascript_space_before_for_parentheses = true +ij_javascript_space_before_for_semicolon = false +ij_javascript_space_before_function_left_parenth = true +ij_javascript_space_before_generator_mult = false +ij_javascript_space_before_if_left_brace = true +ij_javascript_space_before_if_parentheses = true +ij_javascript_space_before_method_call_parentheses = false +ij_javascript_space_before_method_left_brace = true +ij_javascript_space_before_method_parentheses = false +ij_javascript_space_before_property_colon = false +ij_javascript_space_before_quest = true +ij_javascript_space_before_switch_left_brace = true +ij_javascript_space_before_switch_parentheses = true +ij_javascript_space_before_try_left_brace = true +ij_javascript_space_before_type_colon = false +ij_javascript_space_before_unary_not = false +ij_javascript_space_before_while_keyword = true +ij_javascript_space_before_while_left_brace = true +ij_javascript_space_before_while_parentheses = true +ij_javascript_spaces_around_additive_operators = true +ij_javascript_spaces_around_arrow_function_operator = true +ij_javascript_spaces_around_assignment_operators = true +ij_javascript_spaces_around_bitwise_operators = true +ij_javascript_spaces_around_equality_operators = true +ij_javascript_spaces_around_logical_operators = true +ij_javascript_spaces_around_multiplicative_operators = true +ij_javascript_spaces_around_relational_operators = true +ij_javascript_spaces_around_shift_operators = true +ij_javascript_spaces_around_unary_operator = false +ij_javascript_spaces_within_array_initializer_brackets = false +ij_javascript_spaces_within_brackets = false +ij_javascript_spaces_within_catch_parentheses = false +ij_javascript_spaces_within_for_parentheses = false +ij_javascript_spaces_within_if_parentheses = false +ij_javascript_spaces_within_imports = false +ij_javascript_spaces_within_interpolation_expressions = false +ij_javascript_spaces_within_method_call_parentheses = false +ij_javascript_spaces_within_method_parentheses = false +ij_javascript_spaces_within_object_literal_braces = false +ij_javascript_spaces_within_object_type_braces = true +ij_javascript_spaces_within_parentheses = false +ij_javascript_spaces_within_switch_parentheses = false +ij_javascript_spaces_within_type_assertion = false +ij_javascript_spaces_within_union_types = true +ij_javascript_spaces_within_while_parentheses = false +ij_javascript_special_else_if_treatment = true +ij_javascript_ternary_operation_signs_on_next_line = false +ij_javascript_ternary_operation_wrap = off +ij_javascript_union_types_wrap = on_every_item +ij_javascript_use_chained_calls_group_indents = false +ij_javascript_use_double_quotes = true +ij_javascript_use_explicit_js_extension = global +ij_javascript_use_path_mapping = always +ij_javascript_use_public_modifier = false +ij_javascript_use_semicolon_after_statement = true +ij_javascript_var_declaration_wrap = normal +ij_javascript_while_brace_force = never +ij_javascript_while_on_new_line = false +ij_javascript_wrap_comments = false + +[{*.markdown,*.md}] +ij_markdown_force_one_space_after_blockquote_symbol = true +ij_markdown_force_one_space_after_header_symbol = true +ij_markdown_force_one_space_after_list_bullet = true +ij_markdown_force_one_space_between_words = true +ij_markdown_keep_indents_on_empty_lines = false +ij_markdown_max_lines_around_block_elements = 1 +ij_markdown_max_lines_around_header = 1 +ij_markdown_max_lines_between_paragraphs = 1 +ij_markdown_min_lines_around_block_elements = 1 +ij_markdown_min_lines_around_header = 1 +ij_markdown_min_lines_between_paragraphs = 1 + +[{*.yaml,*.yml}] +indent_size = 2 +ij_yaml_align_values_properties = do_not_align +ij_yaml_autoinsert_sequence_marker = true +ij_yaml_block_mapping_on_new_line = false +ij_yaml_indent_sequence_value = true +ij_yaml_keep_indents_on_empty_lines = false +ij_yaml_keep_line_breaks = true +ij_yaml_sequence_on_new_line = false +ij_yaml_space_before_colon = false +ij_yaml_spaces_within_braces = true +ij_yaml_spaces_within_brackets = true diff --git a/.travis/install.sh b/.travis/install.sh index 8ce31567..01379366 100644 --- a/.travis/install.sh +++ b/.travis/install.sh @@ -15,7 +15,7 @@ command "ls" printInfo "[INSTALL] Start to run Maven clean, install…" # Run the Maven clean install -./mvnw clean install --batch-mode --show-version -DskipTests=true -Dmaven.javadoc.skip=true -Djib.to.auth.username=$DOCKER_HUB_USERNAME -Djib.to.auth.password=$DOCKER_HUB_PASSWORD +./mvnw clean install --batch-mode --show-version --quiet -DskipTests=true -Dmaven.javadoc.skip=true -Djib.to.auth.username=$DOCKER_HUB_USERNAME -Djib.to.auth.password=$DOCKER_HUB_PASSWORD INSTALL_COMMAND_RESULT=$? if [ "$INSTALL_COMMAND_RESULT" -eq 0 ]; then printInfo "[INSTALL] Installation succeed. INSTALL_COMMAND_RESULT: $INSTALL_COMMAND_RESULT" diff --git a/CHANGELOG.md b/CHANGELOG.md index 848f5e64..837406d2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,23 +1,485 @@ -# 0.0.1 (2020-12-13) +# [0.0.2](https://github.com/johnnymillergh/muscle-and-fitness-server/compare/0.0.1...0.0.2) (2021-07-16) + +### Bug Fixes +* **$auth-center:** read nested JSON object as Java + object ([af101b2](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/af101b201c43c3d4df7891c46e6d3fd2381443ab)) +* **$MyBatis:** correct interceptors + order ([3647951](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/3647951d4019220e181b4281d86e4af2907b961f)) +* **$POM:** add test + dependency ([401587d](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/401587df23c74e3b245fb7e9cecce666612db93d)) ### Build System -* **$Configuration:** update each environment configuration ([72b6c97](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/72b6c9765dbad7109a05c71689f566899acd9cc6)) -* **$Docker:** build Docker image when it's Maven install ([93ec60d](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/93ec60dfb85052d9f76356e9fff6ec926057e4be)) -* **$Docker:** update zipkin container ([df5de9d](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/df5de9d5f749239b1e0688d9dac9891bb902be2a)) -* **$Docker:** use 20-bit block private network 172.16.1.0/24 ([44a7450](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/44a7450f5df5fb31110b832995779411bf965b87)) -* **$DockerHub:** change DockerHub repository name ([b6067aa](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/b6067aa3967e047ab013b8bec4fc278e222fe43f)) -* **$Eureka:** simplify Eureka configuration ([b74c761](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/b74c7617c731d0e2bd91bd789a69d13b4ac5cf59)) -* **$Shell:** add `auto-run-mac.sh` ([5e401d7](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/5e401d790b04b2db740a2513496eb2518dd89c16)) +* **$OpenJDK:** update Adopt OpenJDK version to + x86_64-alpine-jre-11.0.10_9 ([84d737a](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/84d737af1c5630845a4ef88b4ef0c51136ab383a)) +* **$Redis:** update redis.conf for redis + 6.0.10 ([e522c12](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/e522c126f611a88c919ac624f55fa6e5fd82a694)) + +### Code Refactoring + +* **$Docker:** abstract Docker environment variables and common + constants ([8cc6a36](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/8cc6a36a80f49d090fe669f086fbd99c928ad55f)) +* **$muscle-and-fitness-server:** enhance validation - @NotEmpty -> + @NotBlank ([b4150f1](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/b4150f1c42d9a2ca36eb9dca36456d5154aef07c)) +* **$service-registry:** remove + module `service-registry` ([61bc7cb](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/61bc7cb0301f7c20f28b11ecde85ada7ab36a56c)) +* **$Starter:** rename `spring-boot` + to `spring-cloud` ([2529e45](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/2529e450061eff00b883d5a0544792f818489f63)) + +### Features + +* **$api-gateway:** set HTTP header " + X-Username" ([d83fe38](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/d83fe38b968c2d9987466b9df8996778064943ef)) +* **$api-gateway:** support request rate + limit ([c0dc896](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/c0dc896603ea484de269555dad869558fedf8e3c)) +* **$APIGateway:** add global exception + handler ([7bb6ffa](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/7bb6ffad68fad643ec1f506f49859e2fdecb7601)) +* **$AuthCenter:** access other service by + RestTemplate ([f8df08c](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/f8df08c53fec6380fc1457ce01c2b225adfc6eb0)) +* **$AuthCenter:** add API for getting service + info ([c0b00f3](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/c0b00f3b26fc645d86f085fce5e23becca2e3bd7)) +* **$AuthCenter:** add logout + API ([66c6717](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/66c67179c7493343f1f4bfb807c15385c2abb684)) +* **$AuthCenter:** enable Redis + cache ([6c14c7b](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/6c14c7b83512317b79a9245c7e24bb6feb34c400)) +* **$AuthCenter:** expose login + API ([fe3f211](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/fe3f211454df32d907950ab27d7701655bf41683)) +* **$AuthCenter:** get services + info ([97aadce](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/97aadcef7e3febbdd1a05403d7f72dc2c23d4c43)) +* **$AuthCenter:** support admin + authorization ([6e87a2e](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/6e87a2e9c2ba2debb9e46254e29dbf764553a6a0)) +* **$Authorization:** enhance authorization flow - check HTTP + method ([01a50de](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/01a50de49b2354a2d1bd29864e3235ec68a1eaeb)) +* **$Consul:** enable Consul config + center ([9887360](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/9887360ce74d3028b2f367b7ea8a0f773add08b3)) +* **$Consul:** support Consul; abandon Netflix + Eureka ([abc1cf8](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/abc1cf835cdb46d7a23e40f14557c21b5265184d)) +* **$ELK:** integrate ELK + stack ([a42e87a](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/a42e87a7691011b391c09f9fb20192a100c3bf22)) +* **$Excel:** add abstract excel import + class ([901edbd](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/901edbd6f63b116f53dd942769aba70ef88f93f9)) +* **$gateway:** complete authentication + flow ([b0a91e0](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/b0a91e048743b76abbe66ce484908c4ea3c212d7)) +* **$gateway:** integrate Spring + Security ([f092c6b](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/f092c6b3b55baddc2cebfee556c11c001083a145)) +* **$gateway:** make Swagger and Spring Security work + together ([c2c4721](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/c2c47212e5774cb374b6cf20f127f80f482abcd6)) +* **$Gateway:** add reactive openfeign + support ([f0b7567](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/f0b756772e1e63f001ae17230c36e076f81c6e1d)) +* **$Gateway:** add reactive Redis + support ([2307c71](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/2307c711a94951b9731f78b3d27b9930f59a2cd4)) +* **$Gateway:** implement non-block + authorization ([b94944d](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/b94944d562f31baa3a6eb3549c0b40d8d17d76f7)) +* **$Gateway:** support ignored URL for WebFlux + security ([efb83ad](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/efb83adafa2a2e8491d72577194b73893d5e68ca)) +* **$Jackson:** add DateTime + serializer ([69548c4](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/69548c439fb56c1d7dd5d9f2e552a1cc0392929c)) +* **$Java:** handle LocalDateTime, LocalDate and + LocalTime ([778e152](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/778e15220e34889e9cad41fe783ece8a601ba86a)) +* **$Minio:** upload resource to + Minio ([3dc2dc0](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/3dc2dc0a1e095bca72a224ad9c62749e40d51656)) +* **$MinIO:** integrate + MinIO ([4db17c0](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/4db17c0647a7d24aacb49f6b0db3662678ee3d9a)) +* **$Pagination:** abstract page response + bean ([28928b8](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/28928b8bee5330081590dc3b3c1d63a1fb0fbf07)) +* **$Quartz:** add greeting Quartz + job ([7993f40](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/7993f40659a5f31e7aecdfbbbf2b0453f41406ba)) +* **$Quartz:** integrate + spring-boot-starter-quartz ([5a6d71d](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/5a6d71d99d43461ed68dc1591d481267ba64ea29)) +* **$RabbitMQ:** add RabbitMQ Docker + container ([414880d](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/414880daa175f7ccf06cf17336935becc49f6f08)) +* **$Starter:** abstract startup + analysis ([0802aa2](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/0802aa2008aa47cb2c1b5424e64ff48873b6da7a)) +* **$Starter:** add + HttpApiScanHelper.java ([629e066](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/629e06671be275bb7c5e47739fb8efa58d67a35f)) +* **$Starter:** integrate + RabbitMQ ([9022f77](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/9022f777e53e0df8ce3a38aeca1c72489950d0f7)) +* **$Starter:** intercept SQL + exceptions ([9f5a16f](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/9f5a16f66b96706c1b1a8334ed66342fcf121ddc)) +* **$Starter:** provide exposing HTTP + resources ([4f2ebdc](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/4f2ebdcd31c0df8f17ac3c711baf8164ee4b71a6)) +* **$Starter:** support generating recursive + tree ([624e5ab](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/624e5ab887935beeccb0fb6a6329e5fbc3349dc8)) +* **$static-resource-center:** get resource from + Minio ([da01f3c](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/da01f3cfc07d03304dd7c2320ee17a91970f5f49)) +* **$static-resource-center:** support partial + response ([7ddf6a9](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/7ddf6a975c6976627543f2a3767b736413d54d67)) +* **$STOMP:** support STOMP over + WebSocket ([be76707](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/be767070f3f484a19ca115578cb00f0b4fc30cbf)) +* **$Validation:** support Date and LocalDateTime range + validation ([f9898be](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/f9898bec3917beec91b61b826b5fd02f2e388d7a)) +* **$Validation:** support date time range value + validation ([96c8b83](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/96c8b83dff2769ecb43c7bcb6f5211f59e34ead4)) +* **$Validation:** support enum value + validation ([0951f97](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/0951f974289e639e0da28c055a34a3afd49b597b)) + +### Performance Improvements + +* **$api-gateway:** refine exception + handling ([b5e1340](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/b5e134022401751f420d10b1ada254ddda686777)) +* **$api-gateway:** refine slf4j + Logger ([af590f5](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/af590f5b2b805b8560abfd2dddd4b0e4de72195e)) +* **$ApiGateway:** capture + FeignException ([c9cdee4](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/c9cdee4d24a635764cb21ddc8c44dcfde18cd39e)) +* **$auth-center:** cache role info by user + id ([e9d935b](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/e9d935b183c05287bbc1c1a78f13a1e6140bbc02)) +* **$auth-center:** cache user info by login + token ([2bc9115](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/2bc9115ed0d055a00e87e1820f2bced0caf9b99f)) +* **$auth-center:** reduce injected + dependencies ([a12f130](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/a12f130c39af3d8f04b7af54d5b352bf92258676)) +* **$DataSource:** reduce instances of data + source ([581ac97](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/581ac97cb2f4fcd1c6f0e87dd6c56c309c9967d8)) +* **$Docker:** update container + dependencies ([aca40f6](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/aca40f68da38392e7442aca559b957c3a6225a1e)) +* **$ELK:** disable + ELK ([ecdb3e2](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/ecdb3e20d59f77a260bcfa0e3f9547e49125728d)) +* **$Excel:** make `maximumRowCount` + configurable ([8865ead](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/8865ead8266c0f356d71ad7fa7cba67e000b19d2)) +* **$Java:** migrate java.util.Date to + java.time.LocalDateTime ([a354070](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/a3540706839b6f1d84ed6fed29d569b3626e970f)) +* **$Knife4j:** roll back to + 2.0.8 ([3c0ce61](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/3c0ce61247e189de4ef6a21307098cb79a74ccf6)) +* **$maf-mis:** merge micro services as ' + maf-mis' ([7d7284c](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/7d7284cd2498ce80fe26d4a8b31f35c807944701)) +* **$MySQL:** Docker supports MySQL cluster based on binary + log ([bab526a](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/bab526ab552fb9018b3dd3bd9c2f2dce6f7b5e1a)) +* **$MySQL:** MySQL connection + retry ([b076feb](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/b076febb0291e9061dd27cb4eb2c5337c66c1e91)) +* **$MySQL:** reduce unnecessary replicate + db ([3976af1](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/3976af1bd4dc43b45d0f102f9113d4043298a0d5)) +* **$MySQL:** simplify MySQL configuration for + docker-compose ([7f4a017](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/7f4a017a41ddb7caa8df85884923e58524e8ad0e)) +* **$MySQL:** support auto start + replication ([a52619c](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/a52619c97c974963731f03a47ef9fabedf37a556)) +* **$POM:** reduce useless + dependencies ([447e072](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/447e072a8132a715672f724a202ec3f71bb11aae)) +* **$POM:** update + dependencies ([9ef9708](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/9ef97081fd464796993c813d2fec27f4d9cedc6b)) +* **$POM:** update Spring Boot Admin version to + 2.4.3 ([ad04895](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/ad048950d48aca490cb3af0c56f0794cffd60353)) +* **$POM:** update Spring Cloud version to + 2020.0.2 ([bc2241f](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/bc2241fdeba36fa47594ab041113e964016ad354)) +* **$Spring:** refine CORS + configuration ([cbb9c7c](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/cbb9c7c56c85f7e1c10a7e6c282502ab65b4c3fa)) +* **$spring-boot-admin:** exclude unnecessary + dependencies ([305e12b](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/305e12b5a7fcd6a59ec1e0cc79c594c4c1aa8d1e)) +* **$SpringCloud:** update version to + 2020.0.3 ([010e2c3](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/010e2c32ddda0130ff5da9b9ed1f2569ab65d50d)) +* **$starter:** define the order of controller + advice ([34706c9](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/34706c924d37eb6d79bbe661fb792f0eafb5278e)) +* **$starter:** improve Access Specifier Manipulation + issue ([435ea3b](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/435ea3bf70d4ef6b0ce6d47de2106ef7326bd62f)) +* **$Starter:** dynamic MinIO + client ([7d030a3](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/7d030a33af5310f247a403850b790efe59a2e8ec)) +* **$Starter:** dynamic SFTP + client ([4c37cc4](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/4c37cc4120c74e294f592ff9b80495eb257b5b92)) +* **$Starter:** enable Okhttp for + OpenFeign ([0aec942](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/0aec942dcb4472b77a5028b0a9e3dc04f131f989)) +* **$Starter:** support switching dynamic data source on runtime based on + SQL ([7dbcfc9](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/7dbcfc956aeef73a4818658de8ac4e2518969888)) +* **$Swagger:** correct Swagger + switch ([7804da0](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/7804da0257fc8f8e34fa4518f82896e2fc210aaf)) +* **$WebSocket:** use RabbitMQ STOMP as message + broker ([c666ba7](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/c666ba72c2ffa775900f7b5218cdf96c6218cc9f)) +* update + dependencies ([6f55581](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/6f555811df4778a29fa76ae38be7294da2f1959c)) +* **$api-gateway:** add IP key resolver for request rate + limiter ([ac7aabc](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/ac7aabcc3a83e471377ab1ccf269ddf808b581c8)) +* **$api-gateway:** pass rate limiter configuration + dynamically ([0bd97b0](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/0bd97b0262835ee7bb8b1240cafeec03d4010a1d)) +* **$api-gateway:** set Swagger ignored URL on + Consul ([699dd0a](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/699dd0a3da15b9a097de3c3b3829b034848431d2)) +* **$ApiGateway:** enhance global exception + handler ([0d3f265](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/0d3f265c58f9b7ed51d3c0ab324338925727e0bc)) +* **$ApiGateway:** handle service not available + exception ([235bcb8](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/235bcb8c9c51ba4f28d002512a58b5b1722f4e63)) +* **$ApiGateway:** remove JJWT + dependencies ([50c0597](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/50c05973c42b7daba898bbfd00347bd081a64673)) +* **$ApiGateway:** rename module `Gateway` + to `API Gateway` ([c367ca3](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/c367ca3f8920c7586d219744eecc6dd052cb5a77)) +* **$ApiGateway:** shorten module + name ([9d7e759](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/9d7e759d514f627264616063745863476ded2f25)) +* **$ApiGateway:** use lombok val + annotation ([aec0662](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/aec0662ddd1297aee880fad12d5bb9f3690f2471)) +* **$APIGateway:** handle + WebClientResponseException ([8c4cd5a](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/8c4cd5af945391d049a79b4d2605b884dc5cfd8a)) +* **$APIGateway:** refine remote API + calling ([4f5a20d](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/4f5a20d8d8b4f5b5de463ce2d7fe42c2f0cb3752)) +* **$APIGateway:** simplify global exception + error ([ff82751](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/ff8275119895628dce5eceb7644f5facb0747edf)) +* **$auth-center:** add PermissionTypeList for remote + API ([6928368](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/6928368c89a9af174bd55331b70faa8a94259656)) +* **$auth-center:** configure ignored + service ([78c069b](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/78c069b0651e88412cdabf3bad782bf7b31739a6)) +* **$auth-center:** refine API + parameter ([b5b5346](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/b5b5346e535d76690ffae9a3d43ec4397a3c8611)) +* **$AuthCenter:** customize + RedisTemplate ([22c9cfb](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/22c9cfbfdd056b11832e5511acb354214f152d07)) +* **$AuthCenter:** refine null check for getting service + info ([fc363fe](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/fc363fecfb875ac9ffde21cc4bbbb0819d4cafd2)) +* **$CMD:** check Java major version before running + service ([0d06475](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/0d06475081e6df1a8a6e8f3ffa24a051d21901c4)) +* **$Common:** remove useless + dependencies ([1df12c5](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/1df12c53b5c138879e94852cbd993f07ac760a30)) +* **$Consul:** deregister service when + unavailable ([d36aac3](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/d36aac3c59e0a40da2c2901d00dd4e5a59108e8b)) +* **$Database:** abstract MyBatis Plus configuration; delete Druid + configuration ([e88b4d6](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/e88b4d6b669ee4a63ab3d562c78942b6c23538ad)) +* **$Database:** update data source + configuration ([d343369](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/d3433699c8fa254d0e976467a57485cd05fdefdf)) +* **$Docker:** restrict container + dependencies ([67c968d](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/67c968d603cbaa7af32a3d27eccdd8d8845a5820)) +* **$Docker:** simplify docker compose by using environment + variables ([3216a95](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/3216a956b40791b8980378a4716129324e0a0f75)) +* **$Docker:** specify Docker container + tags ([e416c2c](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/e416c2c442be55212d956d554c00332edc8feabb)) +* **$Docker:** support Docker health + check ([7a2ce2b](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/7a2ce2b0df74c82b182441a7cfb5cec46d4b9366)) +* **$Docker:** update volume mapping for + openzipkin/zipkin-cassandra ([abb784f](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/abb784f2c2e652aaf5709820a8779171323fd0bb)) +* **$Druid:** migrate to druid-spring-boot-starter + 1.2.4 ([0a7ca5e](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/0a7ca5e174ec01c70d6e7d4c3fc021b1a189caae)) +* **$ELK:** enable elasticsearch + security ([bbe59a9](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/bbe59a90fab66a9ea2a45ceb2271d721dfaa23a0)) +* **$Excel:** make variable declare as var and + val ([e07452b](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/e07452b9eaa541062f59da7ba5285bb53cc8ea35)) +* **$Excel:** translate into + English ([60f8cd1](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/60f8cd167c20b7157df0b567282e81dfe40c90ae)) +* **$Exception:** refine global exception + handling ([dae962b](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/dae962b979384a10770892770753b825e6165b52)) +* **$Gateway:** capture + SecurityException ([77d6d34](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/77d6d34b60a73e523619b740d0c07f5291e5accb)) +* **$Gateway:** dynamic web security + switch ([b5f4333](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/b5f43336185fb2a6b55200eb8f6507e31dac878c)) +* **$Gateway:** reduce unnecessary + log ([7ba75c3](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/7ba75c30c1acfae01603cd3aac4bebb41adc392f)) +* **$Gateway:** refine access + log ([281a958](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/281a958d4a86731db52195bb5078fa072d09cd74)) +* **$Gateway:** refine RBAC + process ([fed3ea7](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/fed3ea7a4de6677f5aef1764f82fff3936208dac)) +* **$IO:** use buffered IO stream to reduce IO + times ([f6c32ee](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/f6c32ee5f3f6f952392113168948adc4325d2152)) +* **$JVM:** increase JVM heap memory; dump heap on OOM + error ([45c528b](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/45c528bce812d9dba70c0bcf0160c32ac6aa0ba9)) +* **$Log:** enhance web request log + format ([a359d07](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/a359d07c764bf1c83538e8834d79d7dc1193fef2)) +* **$LOGBack:** log file contains + HOSTNAME ([60b2b73](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/60b2b731b26ac959ade937a6fe3f9237bc4af0f9)) +* **$LOGBack:** set container + hostname ([ac3c130](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/ac3c1304455b66a8f233914cadf1a110b5161b13)) +* **$LOGBack:** set log file by + ${spring.application.name} ([ec01c8c](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/ec01c8cedf61c01126d9466c9bcb0e899e2bdfdb)) +* **$muscle-and-fitness-server:** define basePackage by groupId; devtools + switch ([e8a86b1](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/e8a86b182c85278faf989757757478ccab5278b8)) +* **$muscle-and-fitness-server:** update + dependencies ([e67a840](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/e67a840a0fef09f01e5903f7018872930f62514b)) +* **$MyBatis:** field auto + fill ([6497bcc](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/6497bcc4ca2ea913124494e903ac4cf80bd6a5b4)) +* **$MyBatisPlus:** enable logic + delete ([e48fafa](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/e48fafa45e6ed9111bca6497d493abbd749f2503)) +* **$MyBatisPlus:** update + interceptors ([9e3ce5c](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/9e3ce5cc33ac985b04eb7eaf7175de5bf1078d48)) +* **$OpenJDK:** migrate to + adoptopenjdk/openjdk11 ([9b65893](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/9b65893a22e845a7775db7f80ec988e6436b6038)) +* **$ORM:** migrate ORM library to + spring-boot-starter ([0e66476](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/0e6647615317690a16193f139fa174dbd459b527)) +* **$ORM:** migrate Redis library to + spring-boot-starter ([7af0ccc](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/7af0ccc612067f2608156cc1bd376fcb8cea8ed8)) +* **$ORM:** migrate sftp-integration to + spring-boot-starter ([c860ffa](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/c860ffa9ab08ee2aede974484b4c5517ce9c8e0d)) +* **$POI:** close workbook when destroying locale + context ([ebebd3e](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/ebebd3eaa482f19c43fef45f9458d88ee16bd9a4)) +* **$POI:** update Apache POI version to + 5.0.0 ([7b60af5](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/7b60af5ba65113c32c48520e94ac2758326032b2)) +* **$POI:** update Druid version to + 1.2.5 ([1c1a033](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/1c1a03311d8dd6d9eb796f929ecf2493a239763a)) +* **$POM:** flatten parent + dependencies ([e69537a](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/e69537a83c9f610d39e0d2e0d124dc7e0a115465)) +* **$POM:** refine dependency + structure ([d82c393](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/d82c393f4161e3b1266d1b586a572fdee2c54a4b)) +* **$POM:** update cn.hutool:hutool-all: + 5.5.7 ([e7f2193](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/e7f2193e76cc15b986692114dddbad935c3f7e1b)) +* **$POM:** update Hutool version to + 5.5.8 ([7288bc2](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/7288bc2ce02ba658db96bcdb7104f4ec2df7cef0)) +* **$POM:** update hutool-all to + 5.5.4 ([e38a37c](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/e38a37c69b48a4495f1855753571dfe5c77ad0ff)) +* **$POM:** update mybatis-plus version to + 3.4.2 ([1eeefcc](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/1eeefcc9b77a3be09528b4caf34c4ce77a3ac110)) + , + closes [/github.com/baomidou/mybatis-plus/blob/3.0/CHANGELOG.md#v342-20210115](https://github.com//github.com/baomidou/mybatis-plus/blob/3.0/CHANGELOG.md/issues/v342-20210115) +* **$POM:** update Spring Boot version to + 2.3.8.RELEASE ([bc21a41](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/bc21a41db86e2d4af0d79616c4bc2fc1e13f59c2)) +* **$POM:** update Spring Boot version to + 2.4.3 ([b955e61](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/b955e61fbd7fdc6e47946ca1c1de3498846efbec)) +* **$POM:** update Spring Cloud to + Hoxton.SR9 ([9ab311b](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/9ab311ba65b3babe18e464e39e65c0269d55d124)) +* **$RabbitMQ:** add RabbitMQ health check; set container + dependencies ([660bf49](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/660bf49ba8a1d0de4f1ada270fb763e28e99890f)) + , + closes [/devops.stackexchange.com/questions/12092/docker-compose-healthcheck-for-rabbitmq/12200#12200](https://github.com//devops.stackexchange.com/questions/12092/docker-compose-healthcheck-for-rabbitmq/12200/issues/12200) +* **$RabbitMQ:** make JSON message converter as + default ([1b9bb6d](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/1b9bb6ded2005837fe8727eababb36be6ab5175f)) +* **$ReactiveStarter:** abstract access log + filter ([d29ba21](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/d29ba212a57e21b6c9f56731e3860b3915296015)) +* **$ReactiveStarter:** abstract + beans ([8d1f040](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/8d1f040b937fd7b16ad415815d23b8cb74ad6127)) +* **$ReactiveStarter:** abstract project + property ([aafac56](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/aafac56c820fa406f77d6ae0ba6b3c7aba517e41)) +* **$ReactiveStarter:** refine + dependencies ([f8905bb](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/f8905bb74c438a12f8a9fa3aba46d95239bec64a)) +* **$ReactiveStarter:** set HTTP header as + application/json ([886124a](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/886124ad66e8f9b3d0f8a6b704c58c0707c5ca29)) +* **$ReactiveStarter:** set the order of access log filter as + -500 ([1cb0600](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/1cb06000a936caa2f1a2b310dc085c3a31d3ff47)) +* **$Security:** enhance authentication + process ([c897611](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/c8976113a101ada7712433e580837226bdb8d49c)) +* **$Sleuth:** add + dependency `spring-cloud-starter-sleuth` ([8aba675](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/8aba675ab8c85733256f7561533813043a2b1cae)) +* **$SpringBoot:** enable shutdown + gracefully ([6360027](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/63600273bd3b8947bbbdfeeddd07f7278995c800)) +* **$SpringBootAdmin:** don't check Consul service + health ([e5c8a3d](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/e5c8a3df800286d71e8716651cce8256818e7600)) +* **$SpringCloud:** update Spring Cloud version to + 2020.0.0 ([18f5843](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/18f5843c5af05a37c8c2481f4e8a3d138ee57644)) +* **$SpringCloud:** update Spring Cloud version to + 2020.0.1 ([36ecc33](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/36ecc338781a516e20840726dd0d07fc1f7d6988)) +* **$Starter:** abstract common controller and + service ([3ab8943](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/3ab8943e1e2a126cc899f680b7cf18bfaa285820)) +* **$Starter:** abstract + GlobalErrorController.java ([e22ca36](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/e22ca3617c3077de3b0cd3fbf91c86e146acf589)) +* **$Starter:** abstract project + property ([b6996c8](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/b6996c86036de985658b4e4675d516fa539382a5)) +* **$Starter:** abstract Redis + configuration ([9687151](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/9687151989353c4ec4a453f810bde131c278bbba)) +* **$Starter:** abstract rest template + configuration ([07dfbff](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/07dfbffc91137d52a1d996742372244b90ac0499)) +* **$Starter:** abstract SFTP and web security + configuration ([3306ec4](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/3306ec4defb038e20d6a3294f07e61f4d015be7c)) +* **$Starter:** abstract Swagger 2 + configuration ([5ae8a56](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/5ae8a564a71c4f2cfbc89ede097ed92f79ca1987)) +* **$Starter:** abstract swagger + configuration ([2d27aef](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/2d27aeff84a05ee88e172c92a81fd34776149378)) +* **$Starter:** dynamically init + bean `WebRequestLogAspect` ([e3176ad](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/e3176aded0ef69aaad569218747591e7cd6bdb2b)) +* **$Starter:** enable Spring Boot async + task ([418fc43](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/418fc433857bbc80a7be9af7e48bb388ed468c00)) +* **$Starter:** enhance message + format ([be3cc41](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/be3cc41a8833654247b510707f55722286ae7dc7)) +* **$Starter:** migrate static web resources to + spring-boot-starter ([83ff9eb](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/83ff9ebca68273ffc19751fc7bee20768dbc4047)) +* **$Starter:** reduce unnecessary access + log ([7e8a816](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/7e8a816575c3348d6ecdd91612521b7abb270785)) +* **$Starter:** refine + dependencies ([bd1e5b3](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/bd1e5b38fbf4180e567add86b7b5d2890464608e)) +* **$Starter:** refine error + message ([753946c](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/753946cbd6680ac035edaadcaf0cb81b4af88b4f)) +* **$Starter:** simplify internationalization ( + i18n) ([b42bc7b](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/b42bc7b3812db702dd0d5315ac09e909cfa5bb4a)) +* **$Starter:** support internationalization ( + i18n) ([1c8b38b](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/1c8b38bff6765f8206c1e3a3bf4725f9f9bec01b)) +* **$Starter:** use lettuce for + Redis ([c40c304](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/c40c3042f3bd0e0788159c9cdde681c81b9ef562)) +* **$Swagger:** correct Swagger switch + logic ([e72e8de](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/e72e8def0ac935a5ec5cd85cfb75958fbbe2fb83)) +* **$Swagger:** support service + filter ([f07e0de](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/f07e0de75020d2a5437932aa62257bcdaf9d2cf2)) +* **$universal-ui:** abstract web pages to sub + module `universal-ui` ([68a34d3](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/68a34d343da05644ce8b1d6a569a67bf107b98db)) + +### Reverts + +* **$AuthCenter:** remove + TODO ([de11944](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/de119446bd6c6590ab945e1bbcaa89d4e854f548)) +* **$ELK:** enable + ELK ([58ca161](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/58ca16111230224c8d9ff73bab2ca594dbdd3fcf)) + +### BREAKING CHANGES + +* **$starter:** improve Access Specifier Manipulation issue +* **$IO:** improve IO efficiency +* **$OpenJDK:** update Docker image from adoptopenjdk/openjdk11:x86_64-alpine-jre-11.0.10_9 +* **$Docker:** abstract Docker environment variables and common constants + +[skip ci] + +* **$ELK:** aggregate logs from all applications +* **$api-gateway:** refactor MafConfiguration.java; update configuration key +* **$CMD:** check Java major version before running service + +[skip ci] + +* **$muscle-and-fitness-server:** enhance validation - @NotEmpty -> @NotBlank + +[skip ci] + +* **$Starter:** use lettuce for Redis +* **$api-gateway:** support request rate limit +* **$Starter:** rename `spring-boot` to `spring-cloud` +[skip ci] + +* **$Docker:** simplify docker compose by using environment variables +* **$Consul:** enable Consul config center +* **$service-registry:** remove module `service-registry` + +[skip ci] + +* **$Consul:** support Consul; abandon Netflix Eureka +* **$SpringCloud:** update Spring framework dependencies: Spring Cloud 2020.0.0, Spring Boot 2.4.2 + +[skip ci] + +* **$Starter:** reduce package size by migrating static web resources + +[skip ci] + +* **$LOGBack:** set log file by ${spring.application.name} + +[skip ci] + +* **$LOGBack:** log file contains HOSTNAME + +[skip ci] + +* **$Redis:** update redis.conf for redis 6.0.10 + +[skip ci] + +* **$Authorization:** enhanced authorization flow - check HTTP method +* **$Starter:** rename MAF Spring Boot Starter package name; set bean injection order +* **$ApiGateway:** abandon custom HttpStatus, use unified Spring Web HttpStatus +* **$ApiGateway:** remove module `API Portal`; rename module `Gateway` to + `API Gateway` +* **$ReactiveStarter:** abstract access log filter +* **$Starter:** reduce unnecessary access log +* **$Gateway:** implement non-block authorization +* **$muscle-and-fitness-server:** define basePackage by groupId; devtools switch + +# 0.0.1 (2020-12-13) + +### Build System + +* **$Configuration:** update each environment + configuration ([72b6c97](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/72b6c9765dbad7109a05c71689f566899acd9cc6)) +* **$Docker:** build Docker image when it's Maven + install ([93ec60d](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/93ec60dfb85052d9f76356e9fff6ec926057e4be)) +* **$Docker:** update zipkin + container ([df5de9d](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/df5de9d5f749239b1e0688d9dac9891bb902be2a)) +* **$Docker:** use 20-bit block private network + 172.16.1.0/24 ([44a7450](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/44a7450f5df5fb31110b832995779411bf965b87)) +* **$DockerHub:** change DockerHub repository + name ([b6067aa](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/b6067aa3967e047ab013b8bec4fc278e222fe43f)) +* **$Eureka:** simplify Eureka + configuration ([b74c761](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/b74c7617c731d0e2bd91bd789a69d13b4ac5cf59)) +* **$Shell:** + add `auto-run-mac.sh` ([5e401d7](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/5e401d790b04b2db740a2513496eb2518dd89c16)) ### Code Refactoring * **$muscle-and-fitness-server:** remove demo module ([cd6a6d4](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/cd6a6d4d69c8b17708cb1c45811385dd8b458c33)) * **$Project:** change package name, groupId, DockerHub image repository ([4f65ad7](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/4f65ad795d9fdc48f49cfce8d4ab116a85786cb7)) - ### Features * **$CMD:** add auto-run-windows.cmd ([7e03aa7](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/7e03aa73a4ec3d6220c4256b7b07ccd3b1ea7f63)) @@ -42,7 +504,6 @@ * **$Validation:** throw all validation error ([19546e1](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/19546e126e111e77fa3deb69fc6c8b8db301398f)) * **$WebLog:** support web log for all HTTP methods ([9de3114](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/9de31148bc95375a5f29cd76f3022e60df8fc4f2)) - ### Performance Improvements * **$API-Portal:** use var and val for local variables ([ff54ca5](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/ff54ca5cdd1e6da0f98fc81845ae4ecfe62b205a)) @@ -76,7 +537,6 @@ * **$VarAndVal:** synchronize codes - WebRequestLogAspect.java ([f38dded](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/f38ddedea3a7998141ce7e4e1008c9c60d500481)) * **$WebLog:** trim printed JSON string ([48e7984](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/48e79844627f9b06d9316504176ef4c58860969a)) - ### BREAKING CHANGES * **$Project:** abstract common configuration into custom starter diff --git a/LICENSE b/LICENSE index 6c31e43e..56243e83 100644 --- a/LICENSE +++ b/LICENSE @@ -186,7 +186,7 @@ same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright 2020 Johnny Miller (鍾俊) + Copyright 2020 Johnny Miller (锺俊) Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/README.md b/README.md index 039dc102..b520bc16 100644 --- a/README.md +++ b/README.md @@ -26,35 +26,43 @@ Here is the highlights of **Muscle and Fitness Server**: 2. [Spring Cloud](https://spring.io/projects/spring-cloud) Feature: - - Eureka - Service registration and discovery. - + - Consul - Service registration and discovery. + - Spring Cloud Gateway - API Gateway on top of Spring WebFlux. Provide a simple, yet effective way to route to APIs and provide cross cutting concerns to them such as: security, monitoring/metrics, and resiliency. + - Spring Cloud OpenFeign - Declarative REST Client: Feign creates a dynamic implementation of an interface decorated with JAX-RS or Spring MVC annotations. Enhanced connection by Okhttp 3. - Spring Boot Admin - Admin UI for administration of spring boot applications. + - Zipkin - a distributed tracing system. It helps gather timing data needed to troubleshoot latency problems in service architectures. - - Spring Cloud OpenFeign - Declarative REST Client: Feign creates a dynamic implementation of an interface decorated with JAX-RS or Spring MVC annotations. +3. Secured API. RBAC control by API gateway and Auth Center. JWT authentication, and RBAC authorization. - - Spring Cloud Gateway - provide a simple, yet effective way to route to APIs and provide cross cutting concerns to them such as: security, monitoring/metrics, and resiliency. +4. Higher-level packaging other libraries: `Spring Cloud Starter`, auto configuration for Spring Cloud services. - - Zipkin - a distributed tracing system. It helps gather timing data needed to troubleshoot latency problems in service architectures. +5. MySQL cluster support. Multi data source. Dynamic SQL read-write isolation. MyBatis-Plus is the integrated ORM library. + +6. Redis 6.x support. + +7. Docker, Rancher Kubernetes support. Google JIB for building Docker container images. -3. Docker support. +8. OSS service, based on Minio and SFTP integration. -4. Multi-environment support. +9. STOMP over WebSocket (SockJS), real time messaging, based on RabbitMQ STOMP message broker. -5. SFTP integration. +10. Quartz support. Distributed job scheduling, based on JDBC. -6. API visualization. Enhanced Swagger API documentation. +11. Multi-environment support. -7. Log compression. +12. API visualization. Enhanced Swagger API documentation. -8. Request log. +13. Log compression. ELK log aggregation. -9. Method Argument Validation Aspect. +14. Request log. -10. Docker container log persistence. +15. Method Argument Validation Aspect. -11. Startup statistics. +16. Docker container log persistence. -12. Customized startup banner. +17. Startup statistics. + +18. Customized startup banner. ## Usage @@ -68,6 +76,59 @@ Here is the highlights of **Muscle and Fitness Server**: 3. Click the green triangle to Run. +## Useful Commands + +### Maven + +1. Compile: + + ```shell + $ mvn clean validate compile --batch-mode --show-version --quiet -f pom.xml + ``` + +2. Package: + + ```shell + $ mvn clean package --batch-mode --show-version --quiet -f pom.xml + ``` + +3. Set Version: + + ```sh + $ mvn versions:set -DgenerateBackupPoms=false -f pom.xml + ``` + +4. Build Docker Images: + + ```shell + $ mvn clean verify --batch-mode --show-version --quiet -f pom.xml + ``` + +### Conventional Changelog CLI + +1. Install global dependencies (optional if installed): + + ``` + npm install -g conventional-changelog-cli + ``` + +2. This will *not* overwrite any previous changelogs. The above generates a changelog based on commits since the last semver tag that matches the pattern of "Feature", "Fix", "Performance Improvement" or "Breaking Changes". + + ``` + conventional-changelog -p angular -i CHANGELOG.md -s + ``` + +3. If this is your first time using this tool and you want to generate all previous changelogs, you could do: + + ``` + conventional-changelog -p angular -i CHANGELOG.md -s -r 0 + ``` + +## CI (Continuous Integration) + +- [Travis CI](https://travis-ci.com/github/johnnymillergh/media-streaming) is for publishing Docker Hub images of SNAPSHOT and RELEASE. +- [GitHub Actions](https://github.com/johnnymillergh/media-streaming/actions) is for checking dependency updates and tests. + ## Maintainers [@johnnymillergh](https://github.com/johnnymillergh). @@ -94,4 +155,3 @@ Support this project by becoming a sponsor. Your logo will show up here with a l 2020 - Present - diff --git a/gateway/README.md b/api-gateway/README.md similarity index 100% rename from gateway/README.md rename to api-gateway/README.md diff --git a/exercise-mis/auto-run-windows.cmd b/api-gateway/auto-run-windows.cmd similarity index 77% rename from exercise-mis/auto-run-windows.cmd rename to api-gateway/auto-run-windows.cmd index cd3242c5..2b4a7fc1 100644 --- a/exercise-mis/auto-run-windows.cmd +++ b/api-gateway/auto-run-windows.cmd @@ -16,8 +16,10 @@ chcp 65001 @REM #################### Configurable Environment Variables ################### SET skipGitPull=true SET skipMavenBuild=true +SET minimalJavaMajorVersion=11 +SET javaExe=C:\Users\Johnny\.sdkman\candidates\java\11.0.10.hs-adpt\bin\java.exe SET mavenActiveProfile="development-local" -SET javaParameter=-Dfile.encoding=UTF-8 -Xms256m -Xmx256m +SET javaParameter=-Xms256m -Xmx256m -Dfile.encoding=UTF-8 -Dspring.cloud.consul.host=localhost GOTO:MAIN @@ -55,6 +57,22 @@ EXIT /B 0 @REM ############################ Custom Functions ############################# +@REM Check Java major version +:checkJavaMajorVersion +CALL :logWarn "Start to Check Java major version…" +%javaExe% -version 1>nul 2>nul || ( + CALL :logError "Java is not installed!" + EXIT /B 2 +) +for /f tokens^=2-6^ delims^=.-_+^" %%j in ('%javaExe% -fullversion 2^>^&1') do set "currentJavaMajorVersion=%%j" +CALL :logWarn "Got current Java major version number: %currentJavaMajorVersion%" +if %currentJavaMajorVersion% LSS %minimalJavaMajorVersion% ( + CALL :logError "Current Java version is too low, at least OpenJDK %minimalJavaMajorVersion% is needed" + EXIT /B 1 +) +CALL :logInfo "Passed Java major version cheking" +EXIT /B 0 + @REM Pull the latest code of current branch from Git. :gitPull git pull @@ -76,7 +94,7 @@ EXIT /B 0 CALL :gitPull ) CALL :logInfo "[PRE-BUILD] Java Version Information" - CALL java -version + CALL %javaExe% -version CALL :logInfo "[PRE-BUILD] Maven Version Information" CALL mvn -v CALL :logInfo "[PRE-BUILD] Current directory:" @@ -113,7 +131,7 @@ EXIT /B 0 ) CALL :logWarn "[RUN] Found JAR: %jarFileName%" CALL :setTerminalTitle %jarFileName% - SET runJarCommand=java %javaParameter% -Dspring.profiles.active=%mavenActiveProfile% -jar target\%jarFileName% + SET runJarCommand=%javaExe% %javaParameter% -Dspring.profiles.active=%mavenActiveProfile% -jar target\%jarFileName% CALL :logWarn "[RUN] Execute command: %runJarCommand%" CALL %runJarCommand% EXIT /B 0 @@ -121,6 +139,14 @@ EXIT /B 0 @REM ############################# MAIN Procedures ############################# :MAIN cls + +@REM Check Java major version +CALL :checkJavaMajorVersion +if %ERRORLEVEL% NEQ 0 ( + CALL :logError "Failed to check Java major version!" + EXIT /B %ERRORLEVEL% +) + @REM Pre-build phrase (Display version, Git pull) CALL :executePreBuildPhase if %ERRORLEVEL% NEQ 0 ( diff --git a/gateway/pom.xml b/api-gateway/pom.xml similarity index 69% rename from gateway/pom.xml rename to api-gateway/pom.xml index 0aa3ee96..ebba2a63 100644 --- a/gateway/pom.xml +++ b/api-gateway/pom.xml @@ -1,20 +1,16 @@ - 4.0.0 - gateway - Muscle and Fitness Server :: Gateway - Gateway for Muscle and Fitness microservices. - - 11 - 8080 - + api-gateway + Muscle and Fitness Server :: API Gateway + API Gateway for Muscle and Fitness microservices. com.jmsoftware.maf muscle-and-fitness-server - 0.0.1 + 0.0.2 @@ -23,22 +19,31 @@ org.springframework.boot spring-boot-maven-plugin + + + build-info + compile + + build-info + + + com.google.cloud.tools jib-maven-plugin - 2.2.0 + ${jib-maven-plugin.version} - + buildAndPushDockerImagePhase @@ -50,8 +55,8 @@ - - openjdk:11.0.9.1-jre-slim + + adoptopenjdk/openjdk11:${adoptopenjdk11.tag} docker.io/ijohnnymiller/${project.parent.artifactId}.${project.artifactId} @@ -66,7 +71,7 @@ -Dfile.encoding=${project.build.sourceEncoding} - ${gateway.port} + ${api-gateway.port} USE_CURRENT_TIMESTAMP @@ -78,40 +83,37 @@ - org.springframework.cloud - spring-cloud-starter-gateway + com.jmsoftware.maf + reactive-spring-cloud-starter + org.springframework.cloud - spring-cloud-starter-netflix-eureka-client + spring-cloud-starter-gateway + - org.springframework.cloud - spring-cloud-starter-zipkin + com.github.xiaoymin + knife4j-spring-boot-starter + ${knife4j.version} + - com.jmsoftware.maf - common - 0.0.1 + org.springframework.boot + spring-boot-starter-test + test - org.springframework.boot - spring-boot-starter-web + org.junit.vintage + junit-vintage-engine - - - de.codecentric - spring-boot-admin-starter-client - ${spring-boot-admin.version} - - - com.github.xiaoymin - knife4j-spring-boot-starter - ${knife4j.version} + io.projectreactor + reactor-test + test diff --git a/api-gateway/src/main/java/com/jmsoftware/maf/apigateway/ApiGatewayApplication.java b/api-gateway/src/main/java/com/jmsoftware/maf/apigateway/ApiGatewayApplication.java new file mode 100644 index 00000000..06ded326 --- /dev/null +++ b/api-gateway/src/main/java/com/jmsoftware/maf/apigateway/ApiGatewayApplication.java @@ -0,0 +1,33 @@ +package com.jmsoftware.maf.apigateway; + +import com.jmsoftware.maf.reactivespringcloudstarter.helper.SpringBootStartupHelper; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.client.discovery.EnableDiscoveryClient; +import org.springframework.util.StopWatch; + +/** + *

ApiGatewayApplication

+ *

+ * Change description here. + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 12/22/2020 3:39 PM + **/ +@Slf4j +@EnableDiscoveryClient +@SpringBootApplication +public class ApiGatewayApplication { + private static final StopWatch STOP_WATCH = new StopWatch(); + private static SpringBootStartupHelper springBootStartupHelper; + + public ApiGatewayApplication(SpringBootStartupHelper springBootStartupHelper) { + ApiGatewayApplication.springBootStartupHelper = springBootStartupHelper; + } + + public static void main(String[] args) { + STOP_WATCH.start(); + SpringApplication.run(ApiGatewayApplication.class, args); + springBootStartupHelper.stop(STOP_WATCH); + } +} diff --git a/api-gateway/src/main/java/com/jmsoftware/maf/apigateway/remoteapi/AuthCenterRemoteApi.java b/api-gateway/src/main/java/com/jmsoftware/maf/apigateway/remoteapi/AuthCenterRemoteApi.java new file mode 100644 index 00000000..db33ce06 --- /dev/null +++ b/api-gateway/src/main/java/com/jmsoftware/maf/apigateway/remoteapi/AuthCenterRemoteApi.java @@ -0,0 +1,117 @@ +package com.jmsoftware.maf.apigateway.remoteapi; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; +import com.jmsoftware.maf.common.bean.ResponseBodyBean; +import com.jmsoftware.maf.common.domain.authcenter.permission.GetPermissionListByRoleIdListPayload; +import com.jmsoftware.maf.common.domain.authcenter.permission.GetPermissionListByRoleIdListResponse; +import com.jmsoftware.maf.common.domain.authcenter.role.GetRoleListByUserIdSingleResponse; +import com.jmsoftware.maf.common.domain.authcenter.security.ParseJwtResponse; +import com.jmsoftware.maf.common.domain.authcenter.user.GetUserByLoginTokenResponse; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpHeaders; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.reactive.function.client.WebClient; +import reactor.core.publisher.Mono; + +import javax.validation.Valid; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + *

AuthCenterRemoteApi

+ *

+ * Change description here. + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com + * @date 5/10/20 4:50 PM + */ +@Slf4j +@Service +@Validated +@RequiredArgsConstructor +public class AuthCenterRemoteApi { + private static final String SERVICE_NAME = "auth-center"; + private final WebClient.Builder webClientBuilder; + + /** + * Gets user by login token. + * + * @param loginToken the login token, e.q. username, email or phone number + * @return the user by login token + */ + public Mono getUserByLoginToken(@PathVariable String loginToken) { + return webClientBuilder + .build() + .get() + .uri(String.format("http://%s/user-remote-api/users/{loginToken}", SERVICE_NAME), loginToken) + .retrieve() + .bodyToMono(ResponseBodyBean.class) + .map(ResponseBodyBean::getData) + .map(data -> JSONUtil.toBean(JSONUtil.parseObj(data), GetUserByLoginTokenResponse.class)); + } + + /** + * Gets role list by user id. + * + * @param userId the user id + * @return the role list by user id + */ + public Mono> getRoleListByUserId(@NotNull Long userId) { + return webClientBuilder + .build() + .get() + .uri(String.format("http://%s/role-remote-api/roles/{userId}", SERVICE_NAME), userId) + .retrieve() + .bodyToMono(ResponseBodyBean.class) + .map(ResponseBodyBean::getData) + .map(data -> JSONUtil.toList(JSONUtil.parseObj(data).getJSONArray("roleList"), + GetRoleListByUserIdSingleResponse.class)); + } + + /** + * Get permission list by role id list + * + * @param payload the payload + * @return the response body bean + */ + public Mono> getPermissionListByRoleIdList(@Valid GetPermissionListByRoleIdListPayload payload) { + return webClientBuilder + .build() + .get() + .uri(uriBuilder -> uriBuilder + .host("auth-center") + .path("/permission-remote-api/permissions") + .queryParam("roleIdList", StrUtil.join(",", payload.getRoleIdList())) + .queryParam("permissionTypeList", StrUtil.join(",", payload.getPermissionTypeList())) + .build()) + .retrieve() + .bodyToMono(ResponseBodyBean.class) + .map(ResponseBodyBean::getData) + .map(data -> JSONUtil.toList(JSONUtil.parseObj(data).getJSONArray("permissionList"), + GetPermissionListByRoleIdListResponse.Permission.class)); + } + + /** + * Parse JWT. + * + * @param authorization the authorization + * @return the mono + */ + @GetMapping("/jwt-remote-api/parse") + public Mono parse(@NotBlank String authorization) { + return webClientBuilder + .build() + .get() + .uri("http://auth-center/jwt-remote-api/parse") + .headers(httpHeaders -> httpHeaders.set(HttpHeaders.AUTHORIZATION, authorization)) + .retrieve() + .bodyToMono(ResponseBodyBean.class).map(ResponseBodyBean::getData) + .map(data -> JSONUtil.toBean(JSONUtil.parseObj(data), ParseJwtResponse.class)); + } +} diff --git a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/configuration/JwtConfiguration.java b/api-gateway/src/main/java/com/jmsoftware/maf/apigateway/security/configuration/JwtConfiguration.java similarity index 57% rename from auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/configuration/JwtConfiguration.java rename to api-gateway/src/main/java/com/jmsoftware/maf/apigateway/security/configuration/JwtConfiguration.java index 415b4cc2..15199f48 100644 --- a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/configuration/JwtConfiguration.java +++ b/api-gateway/src/main/java/com/jmsoftware/maf/apigateway/security/configuration/JwtConfiguration.java @@ -1,5 +1,6 @@ -package com.jmsoftware.maf.authcenter.universal.configuration; +package com.jmsoftware.maf.apigateway.security.configuration; +import com.jmsoftware.maf.reactivespringcloudstarter.configuration.MafProjectProperty; import lombok.Data; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.context.properties.ConfigurationProperties; @@ -12,7 +13,7 @@ *

* Ignored request configuration. * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com * @date 5/2/20 11:41 PM **/ @Data @@ -20,10 +21,19 @@ @Component @ConfigurationProperties(prefix = "jwt.configuration") public class JwtConfiguration { - public JwtConfiguration(ProjectProperty projectProperty) { - this.signingKey = String.format("%s %s", projectProperty.getProjectParentArtifactId(), projectProperty.getVersion()); + public static final String TOKEN_PREFIX = "Bearer "; + /** + * Key prefix of JWT stored in Redis. + */ + private String jwtRedisKeyPrefix; + + public JwtConfiguration(MafProjectProperty mafProjectProperty) { + this.signingKey = String.format("%s %s", mafProjectProperty.getProjectParentArtifactId(), + mafProjectProperty.getVersion()); log.info("Initiated JWT signing key: {}. The specified key byte array is {} bits", this.signingKey, this.signingKey.getBytes(StandardCharsets.UTF_8).length * 8); + jwtRedisKeyPrefix = String.format("%s:jwt:", mafProjectProperty.getProjectParentArtifactId()); + log.warn("Initiated 'jwtRedisKeyPrefix': {}", jwtRedisKeyPrefix); } /** diff --git a/api-gateway/src/main/java/com/jmsoftware/maf/apigateway/security/configuration/WebFluxSecurityConfiguration.java b/api-gateway/src/main/java/com/jmsoftware/maf/apigateway/security/configuration/WebFluxSecurityConfiguration.java new file mode 100644 index 00000000..336db14a --- /dev/null +++ b/api-gateway/src/main/java/com/jmsoftware/maf/apigateway/security/configuration/WebFluxSecurityConfiguration.java @@ -0,0 +1,111 @@ +package com.jmsoftware.maf.apigateway.security.configuration; + +import cn.hutool.core.util.BooleanUtil; +import com.google.common.collect.Lists; +import com.jmsoftware.maf.apigateway.remoteapi.AuthCenterRemoteApi; +import com.jmsoftware.maf.apigateway.security.impl.*; +import com.jmsoftware.maf.reactivespringcloudstarter.configuration.MafConfiguration; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.HttpMethod; +import org.springframework.security.authentication.ReactiveAuthenticationManager; +import org.springframework.security.authorization.ReactiveAuthorizationManager; +import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity; +import org.springframework.security.config.web.server.ServerHttpSecurity; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.web.server.SecurityWebFilterChain; +import org.springframework.security.web.server.ServerAuthenticationEntryPoint; +import org.springframework.security.web.server.authorization.AuthorizationContext; +import org.springframework.security.web.server.authorization.ServerAccessDeniedHandler; +import org.springframework.security.web.server.context.ServerSecurityContextRepository; + +/** + * Description: WebFluxSecurityConfiguration, change description here. + * + * @author 钟俊(zhongjun), email: zhongjun@toguide.cn, date: 12/18/2020 3:23 PM + * @see + * Spring Secirity Reference - Reactive Applications + * @see + * Securing Spring WebFlux Reactive APIs with JWT Auth + * @see + * SpringCloud Gateway 整合 Spring Security Webflux 的关键点(痛点解析),及示例项目 + **/ +@Slf4j +@Configuration +@EnableWebFluxSecurity +@RequiredArgsConstructor +public class WebFluxSecurityConfiguration { + private final MafConfiguration mafConfiguration; + private final AuthCenterRemoteApi authCenterRemoteApi; + + @Bean + SecurityWebFilterChain springWebFilterChain(ServerHttpSecurity http, + ServerAuthenticationEntryPoint serverAuthenticationEntryPoint, + ServerAccessDeniedHandler serverAccessDeniedHandler, + ServerSecurityContextRepository serverSecurityContextRepository, + ReactiveAuthenticationManager reactiveAuthenticationManager, + ReactiveAuthorizationManager reactiveAuthorizationManager) { + if (BooleanUtil.isFalse(this.mafConfiguration.getWebSecurityEnabled())) { + log.warn("Web security was disabled."); + return http + .cors().disable() + .csrf().disable() + .build(); + } + log.warn("Spring Security will ignore following URLs: {}", + Lists.newArrayList(this.mafConfiguration.flattenIgnoredUrls())); + return http + .cors().disable() + .csrf().disable() + .formLogin().disable() + .httpBasic().disable() + .exceptionHandling() + .authenticationEntryPoint(serverAuthenticationEntryPoint) + .accessDeniedHandler(serverAccessDeniedHandler) + .and() + // Authentication + .securityContextRepository(serverSecurityContextRepository) + .authenticationManager(reactiveAuthenticationManager) + .authorizeExchange() + .pathMatchers(this.mafConfiguration.flattenIgnoredUrls()).permitAll() + .pathMatchers(HttpMethod.OPTIONS).permitAll() + // Authorization + .anyExchange().access(reactiveAuthorizationManager) + .and() + .build(); + } + + @Bean + public ServerAuthenticationEntryPoint serverAuthenticationEntryPoint() { + return new ServerAuthenticationEntryPointImpl(); + } + + @Bean + public ServerAccessDeniedHandler serverAccessDeniedHandler() { + return new GatewayServerAccessDeniedHandlerImpl(); + } + + @Bean + public PasswordEncoder passwordEncoder() { + return new BCryptPasswordEncoder(); + } + + @Bean + public ServerSecurityContextRepository serverSecurityContextRepository(ReactiveAuthenticationManager reactiveAuthenticationManager) { + return new JwtReactiveServerSecurityContextRepositoryImpl(this.mafConfiguration, reactiveAuthenticationManager, + this.authCenterRemoteApi); + } + + @Bean + public ReactiveAuthenticationManager reactiveAuthenticationManager() { + return new JwtReactiveAuthenticationManagerImpl(this.authCenterRemoteApi); + } + + @Bean + public ReactiveAuthorizationManager reactiveAuthorizationManager() { + return new RbacReactiveAuthorizationManagerImpl(this.authCenterRemoteApi); + } +} diff --git a/api-gateway/src/main/java/com/jmsoftware/maf/apigateway/security/impl/GatewayServerAccessDeniedHandlerImpl.java b/api-gateway/src/main/java/com/jmsoftware/maf/apigateway/security/impl/GatewayServerAccessDeniedHandlerImpl.java new file mode 100644 index 00000000..cdcdff44 --- /dev/null +++ b/api-gateway/src/main/java/com/jmsoftware/maf/apigateway/security/impl/GatewayServerAccessDeniedHandlerImpl.java @@ -0,0 +1,26 @@ +package com.jmsoftware.maf.apigateway.security.impl; + +import com.jmsoftware.maf.reactivespringcloudstarter.util.ResponseUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpStatus; +import org.springframework.security.access.AccessDeniedException; +import org.springframework.security.web.server.authorization.ServerAccessDeniedHandler; +import org.springframework.web.server.ServerWebExchange; +import reactor.core.publisher.Mono; + +/** + * Description: GatewayServerAccessDeniedHandlerImpl + *

+ * Implementation os gateway server access denied handler + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 12/29/2020 9:56 AM + **/ +@Slf4j +public class GatewayServerAccessDeniedHandlerImpl implements ServerAccessDeniedHandler { + @Override + public Mono handle(ServerWebExchange exchange, AccessDeniedException denied) { + log.error("Access denied! Exception message: {}. Request URL: [{}] {}", denied.getMessage(), + exchange.getRequest().getMethod(), exchange.getRequest().getURI()); + return ResponseUtil.renderJson(exchange, HttpStatus.FORBIDDEN, denied.getMessage(), null); + } +} diff --git a/api-gateway/src/main/java/com/jmsoftware/maf/apigateway/security/impl/JwtReactiveAuthenticationManagerImpl.java b/api-gateway/src/main/java/com/jmsoftware/maf/apigateway/security/impl/JwtReactiveAuthenticationManagerImpl.java new file mode 100644 index 00000000..aafb9141 --- /dev/null +++ b/api-gateway/src/main/java/com/jmsoftware/maf/apigateway/security/impl/JwtReactiveAuthenticationManagerImpl.java @@ -0,0 +1,75 @@ +package com.jmsoftware.maf.apigateway.security.impl; + +import cn.hutool.core.util.StrUtil; +import com.jmsoftware.maf.apigateway.remoteapi.AuthCenterRemoteApi; +import com.jmsoftware.maf.common.domain.authcenter.security.UserPrincipal; +import com.jmsoftware.maf.common.exception.BusinessException; +import com.jmsoftware.maf.common.exception.SecurityException; +import lombok.RequiredArgsConstructor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.HttpStatus; +import org.springframework.security.authentication.*; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsChecker; +import reactor.core.publisher.Mono; + +/** + * Description: JwtReactiveAuthenticationManagerImpl + *

+ * Implementation of JWT reactive authentication manager + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 12/29/2020 9:57 AM + **/ +@RequiredArgsConstructor +public class JwtReactiveAuthenticationManagerImpl implements ReactiveAuthenticationManager { + private final static Logger log = LoggerFactory.getLogger(JwtReactiveAuthenticationManagerImpl.class); + private final AuthCenterRemoteApi authCenterRemoteApi; + + private final UserDetailsChecker preAuthenticationChecks = user -> { + if (!user.isAccountNonLocked()) { + log.error("User account is locked"); + throw new LockedException("User account is locked"); + } + + if (!user.isEnabled()) { + log.error("User account is disabled"); + throw new DisabledException("User is disabled"); + } + + if (!user.isAccountNonExpired()) { + log.error("User account is expired"); + throw new AccountExpiredException("User account has expired"); + } + }; + + private final UserDetailsChecker postAuthenticationChecks = user -> { + if (!user.isCredentialsNonExpired()) { + log.error("User account credentials have expired"); + throw new CredentialsExpiredException("User credentials have expired"); + } + }; + + private Mono retrieveUser(String username) { + if (StrUtil.isBlank(username)) { + log.warn("Authentication failure! Cause: the username mustn't be blank"); + return Mono.error( + new SecurityException(HttpStatus.NETWORK_AUTHENTICATION_REQUIRED, "Username mustn't be blank")); + } + return authCenterRemoteApi.getUserByLoginToken(username) + .switchIfEmpty(Mono.error(new BusinessException("Authentication failure! Cause: User not found"))) + .map(data -> { + log.info("Authentication success! Found {}", data); + return UserPrincipal.create(data, null, null); + }); + } + + @Override + public Mono authenticate(Authentication authentication) { + return this.retrieveUser(authentication.getName()) + .doOnNext(this.preAuthenticationChecks::check) + .doOnNext(this.postAuthenticationChecks::check) + .map(userDetails -> new UsernamePasswordAuthenticationToken(userDetails, null)); + } +} diff --git a/api-gateway/src/main/java/com/jmsoftware/maf/apigateway/security/impl/JwtReactiveServerSecurityContextRepositoryImpl.java b/api-gateway/src/main/java/com/jmsoftware/maf/apigateway/security/impl/JwtReactiveServerSecurityContextRepositoryImpl.java new file mode 100644 index 00000000..0f6e3a9c --- /dev/null +++ b/api-gateway/src/main/java/com/jmsoftware/maf/apigateway/security/impl/JwtReactiveServerSecurityContextRepositoryImpl.java @@ -0,0 +1,69 @@ +package com.jmsoftware.maf.apigateway.security.impl; + +import cn.hutool.core.util.StrUtil; +import com.jmsoftware.maf.apigateway.remoteapi.AuthCenterRemoteApi; +import com.jmsoftware.maf.apigateway.security.configuration.JwtConfiguration; +import com.jmsoftware.maf.common.domain.authcenter.security.UserPrincipal; +import com.jmsoftware.maf.common.exception.SecurityException; +import com.jmsoftware.maf.reactivespringcloudstarter.configuration.MafConfiguration; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import lombok.val; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.security.authentication.ReactiveAuthenticationManager; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.context.SecurityContext; +import org.springframework.security.core.context.SecurityContextImpl; +import org.springframework.security.web.server.context.ServerSecurityContextRepository; +import org.springframework.util.AntPathMatcher; +import org.springframework.web.server.ServerWebExchange; +import reactor.core.publisher.Mono; + +/** + * Description: JwtReactiveServerSecurityContextRepositoryImpl + *

+ * Implementation of JWT reactive server security context repository + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 12/29/2020 9:58 AM + **/ +@Slf4j +@RequiredArgsConstructor +public class JwtReactiveServerSecurityContextRepositoryImpl implements ServerSecurityContextRepository { + private final MafConfiguration mafConfiguration; + private final ReactiveAuthenticationManager authenticationManager; + private final AntPathMatcher antPathMatcher = new AntPathMatcher(); + private final AuthCenterRemoteApi authCenterRemoteApi; + + @Override + public Mono save(ServerWebExchange exchange, SecurityContext context) { + log.error("Unsupported operation exception: Not supported yet."); + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public Mono load(ServerWebExchange exchange) { + val request = exchange.getRequest(); + // Ignore allowed URL + for (var ignoredUrl : mafConfiguration.flattenIgnoredUrls()) { + if (antPathMatcher.match(ignoredUrl, request.getURI().getPath())) { + return Mono.empty(); + } + } + val authorization = request.getHeaders().getFirst(HttpHeaders.AUTHORIZATION); + if (StrUtil.isBlank(authorization) || !StrUtil.startWith(authorization, JwtConfiguration.TOKEN_PREFIX)) { + log.warn("Pre-authentication failure! Cause: `{}` in HTTP headers not found. Request URL: [{}] {}", + HttpHeaders.AUTHORIZATION, request.getMethod(), request.getURI()); + return Mono.error(new SecurityException(HttpStatus.NETWORK_AUTHENTICATION_REQUIRED, "JWT Required")); + } + return authCenterRemoteApi.parse(authorization) + .map(parseJwtResponse -> { + log.info("parseJwtResponse: {}", parseJwtResponse); + val userPrincipal = UserPrincipal.createByUsername(parseJwtResponse.getUsername()); + val authentication = new UsernamePasswordAuthenticationToken(userPrincipal, null); + log.warn("About to authenticate… Authentication is created. {}", authentication); + return authentication; + }).flatMap(authentication -> this.authenticationManager.authenticate(authentication) + .map(SecurityContextImpl::new)); + } +} diff --git a/api-gateway/src/main/java/com/jmsoftware/maf/apigateway/security/impl/RbacReactiveAuthorizationManagerImpl.java b/api-gateway/src/main/java/com/jmsoftware/maf/apigateway/security/impl/RbacReactiveAuthorizationManagerImpl.java new file mode 100644 index 00000000..75235ee1 --- /dev/null +++ b/api-gateway/src/main/java/com/jmsoftware/maf/apigateway/security/impl/RbacReactiveAuthorizationManagerImpl.java @@ -0,0 +1,149 @@ +package com.jmsoftware.maf.apigateway.security.impl; + +import cn.hutool.core.util.StrUtil; +import com.google.common.collect.Lists; +import com.jmsoftware.maf.apigateway.remoteapi.AuthCenterRemoteApi; +import com.jmsoftware.maf.common.constant.MafHttpHeader; +import com.jmsoftware.maf.common.domain.authcenter.permission.GetPermissionListByRoleIdListPayload; +import com.jmsoftware.maf.common.domain.authcenter.permission.GetPermissionListByRoleIdListResponse; +import com.jmsoftware.maf.common.domain.authcenter.permission.PermissionType; +import com.jmsoftware.maf.common.domain.authcenter.role.GetRoleListByUserIdSingleResponse; +import com.jmsoftware.maf.common.domain.authcenter.security.UserPrincipal; +import com.jmsoftware.maf.common.exception.SecurityException; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import lombok.val; +import org.springframework.http.HttpStatus; +import org.springframework.http.server.reactive.ServerHttpRequest; +import org.springframework.security.authorization.AuthorizationDecision; +import org.springframework.security.authorization.ReactiveAuthorizationManager; +import org.springframework.security.core.Authentication; +import org.springframework.security.web.server.authorization.AuthorizationContext; +import org.springframework.stereotype.Component; +import org.springframework.util.AntPathMatcher; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * Description: RbacReactiveAuthorizationManagerImpl + *

+ * Implementation of RBAC (Role-based access control) reactive authorization manager + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 12/29/2020 9:54 AM + * @see Role-based access control + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class RbacReactiveAuthorizationManagerImpl implements ReactiveAuthorizationManager { + private final AntPathMatcher antPathMatcher = new AntPathMatcher(); + private final AuthCenterRemoteApi authCenterRemoteApi; + + /** + * Retrieve roles flux. + * + * @param userPrincipalMono the user principal mono + * @return the flux + */ + private Flux retrieveRoles(Mono userPrincipalMono) { + // Get role list by user ID, and then convert to Flux + return userPrincipalMono + .flatMap(userPrincipal -> this.authCenterRemoteApi.getRoleListByUserId(userPrincipal.getId())) + .flatMapMany(Flux::fromIterable) + .switchIfEmpty(Flux.error(new SecurityException(HttpStatus.UNAUTHORIZED, "Roles not assigned!"))); + } + + /** + * Filter roles mono. + * + * @param roleFlux the role flux + * @return the mono + */ + private Mono> mapRole(Flux roleFlux) { + return roleFlux + .map(GetRoleListByUserIdSingleResponse::getId) + .collectList() + .switchIfEmpty(roleFlux.map(GetRoleListByUserIdSingleResponse::getId).collectList()); + } + + /** + * Retrieve permissions mono. + * + * @param roleIdListMono the role id list mono + * @return the mono + */ + private Mono> retrievePermissions(Mono> roleIdListMono) { + // Get permission list based on the Mono> + // auth-center will respond /** for role "admin" + return roleIdListMono.flatMap( + roleIdList -> { + val payload = new GetPermissionListByRoleIdListPayload(); + payload.setRoleIdList(roleIdList); + payload.setPermissionTypeList(Lists.newArrayList(PermissionType.BUTTON)); + return this.authCenterRemoteApi.getPermissionListByRoleIdList(payload); + }) + .switchIfEmpty(Mono.error(new SecurityException(HttpStatus.FORBIDDEN, "Permission not found!"))); + } + + @Override + public Mono check(Mono authentication, AuthorizationContext object) { + val request = object.getExchange().getRequest(); + val userPrincipalMono = authentication.map(auth -> (UserPrincipal) auth.getPrincipal()); + val roleFlux = this.retrieveRoles(userPrincipalMono); + val roleIdListMono = this.mapRole(roleFlux); + val permissionListMono = this.retrievePermissions(roleIdListMono); + // Aggregate 2 Mono + val zip = Mono.zip(permissionListMono, userPrincipalMono); + return zip.map(mapper -> { + val permissionList = mapper.getT1(); + val buttonPermissionList = permissionList.stream() + .filter(permission -> StrUtil.isNotBlank(permission.getUrl())) + .filter(permission -> StrUtil.isNotBlank(permission.getMethod())) + .collect(Collectors.toList()); + val userPrincipal = mapper.getT2(); + for (var buttonPermission : buttonPermissionList) { + if (this.checkRestfulAccess(buttonPermission, request)) { + log.info("Authorization success! Resource [{}] {} is accessible for user(username: {})", + request.getMethod(), request.getURI(), userPrincipal.getUsername()); + request + .mutate() + .headers(httpHeaders -> httpHeaders.set(MafHttpHeader.X_USERNAME.getHeader(), + userPrincipal.getUsername())) + .build(); + return new AuthorizationDecision(true); + } + } + log.warn("Authorization failure! Resource [{}] {} is not accessible for user(username: {})", + request.getMethod(), request.getURI(), userPrincipal.getUsername()); + return new AuthorizationDecision(false); + }); + } + + /** + *

Check Restful access.

+ * + * + * @param buttonPermission the button permission + * @param request the request + * @return true: accessible; false: not accessible + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 1/13/2021 11:04 AM + */ + private boolean checkRestfulAccess(GetPermissionListByRoleIdListResponse.Permission buttonPermission, + ServerHttpRequest request) { + val urlMatched = this.antPathMatcher.match(buttonPermission.getUrl(), request.getURI().getPath()); + // "*" is for super user. Super user's permission is like URL: "/**", method: "*" + val allMethods = StrUtil.equals(buttonPermission.getMethod(), "*"); + if (allMethods) { + return urlMatched; + } + val methodMatched = Objects.requireNonNull(request.getMethod()).matches(buttonPermission.getMethod()); + return urlMatched && methodMatched; + } +} diff --git a/api-gateway/src/main/java/com/jmsoftware/maf/apigateway/security/impl/ServerAuthenticationEntryPointImpl.java b/api-gateway/src/main/java/com/jmsoftware/maf/apigateway/security/impl/ServerAuthenticationEntryPointImpl.java new file mode 100644 index 00000000..52df39f7 --- /dev/null +++ b/api-gateway/src/main/java/com/jmsoftware/maf/apigateway/security/impl/ServerAuthenticationEntryPointImpl.java @@ -0,0 +1,24 @@ +package com.jmsoftware.maf.apigateway.security.impl; + +import com.jmsoftware.maf.reactivespringcloudstarter.util.ResponseUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpStatus; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.web.server.ServerAuthenticationEntryPoint; +import org.springframework.web.server.ServerWebExchange; +import reactor.core.publisher.Mono; + +/** + * Description: ServerAuthenticationEntryPointImpl, change description here. + * + * @author 钟俊(zhongjun), email: zhongjun@toguide.cn, date: 12/21/2020 9:48 AM + **/ +@Slf4j +public class ServerAuthenticationEntryPointImpl implements ServerAuthenticationEntryPoint { + @Override + public Mono commence(ServerWebExchange exchange, AuthenticationException e) { + log.error("Exception occurred when authenticating! Exception message: {}. Request URL: [{}] {}", e.getMessage(), + exchange.getRequest().getMethod(), exchange.getRequest().getURI()); + return ResponseUtil.renderJson(exchange, HttpStatus.NETWORK_AUTHENTICATION_REQUIRED, e.getMessage(), null); + } +} diff --git a/api-gateway/src/main/java/com/jmsoftware/maf/apigateway/universal/configuration/DiscoveryRouteConfiguration.java b/api-gateway/src/main/java/com/jmsoftware/maf/apigateway/universal/configuration/DiscoveryRouteConfiguration.java new file mode 100644 index 00000000..e1a7f243 --- /dev/null +++ b/api-gateway/src/main/java/com/jmsoftware/maf/apigateway/universal/configuration/DiscoveryRouteConfiguration.java @@ -0,0 +1,84 @@ +package com.jmsoftware.maf.apigateway.universal.configuration; + +import cn.hutool.core.util.ObjectUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import lombok.val; +import org.springframework.cloud.gateway.discovery.DiscoveryLocatorProperties; +import org.springframework.cloud.gateway.filter.FilterDefinition; +import org.springframework.cloud.gateway.filter.ratelimit.KeyResolver; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import reactor.core.publisher.Mono; + +import javax.annotation.PostConstruct; + +/** + * Description: DiscoveryRouteConfiguration, change description here. + * + * @author 钟俊(zhongjun), email: zhongjun@toguide.cn, date: 2/7/2021 1:15 PM + **/ +@Slf4j +@Configuration +@RequiredArgsConstructor +public class DiscoveryRouteConfiguration { + public static final String REQUEST_RATE_LIMITER_FILTER_NAME = "RequestRateLimiter"; + /** + * The redis-rate-limiter.replenishRate property is how many requests per second you want a user to + * be allowed to do, without any dropped requests. This is the rate at which the token bucket is filled. + */ + public static final String REPLENISH_RATE_KEY = "redis-rate-limiter.replenishRate"; + /** + * The redis-rate-limiter.burstCapacity property is the maximum number of requests a user is allowed + * to do in a single second. This is the number of tokens the token bucket can hold. Setting this value to zero + * blocks all requests. + */ + public static final String BURST_CAPACITY_KEY = "redis-rate-limiter.burstCapacity"; + /** + * The redis-rate-limiter.requestedTokens property is how many tokens a request costs. This is the + * number of tokens taken from the bucket for each request and defaults to 1. + */ + public static final String REQUESTED_TOKENS_KEY = "redis-rate-limiter.requestedTokens"; + private final DiscoveryLocatorProperties discoveryLocatorProperties; + private final RedisRateLimiterConfiguration redisRateLimiterConfiguration; + + /** + * Configure + * The Redis RateLimiter. + *

+ * The algorithm used is the Token Bucket Algorithm. + *

+ * Rate limits bellow 1 request/s are accomplished by setting replenishRate to the + * wanted number of requests, requestedTokens to the timespan in seconds and + * burstCapacity to the product of replenishRate and requestedTokens, e.g. + * setting replenishRate=1, requestedTokens=60 and burstCapacity=60 will + * result in a limit of 1 request/min. + * + * @see + * The Redis RateLimiter + */ + @PostConstruct + void postConstruct() { + val filter = new FilterDefinition(); + filter.setName(REQUEST_RATE_LIMITER_FILTER_NAME); + filter.addArg(REPLENISH_RATE_KEY, this.redisRateLimiterConfiguration.getReplenishRate()); + filter.addArg(BURST_CAPACITY_KEY, this.redisRateLimiterConfiguration.getBurstCapacity()); + filter.addArg(REQUESTED_TOKENS_KEY, this.redisRateLimiterConfiguration.getRequestedTokens()); + this.discoveryLocatorProperties.getFilters().add(filter); + log.info("Added filter [{}] for discovery services, filters: {}", REQUEST_RATE_LIMITER_FILTER_NAME, + this.discoveryLocatorProperties.getFilters()); + } + + @Bean + @Primary + public KeyResolver ipKeyResolver() { + return exchange -> { + val remoteAddress = exchange.getRequest().getRemoteAddress(); + if (ObjectUtil.isNotNull(remoteAddress)) { + return Mono.just(remoteAddress.getHostName()); + } + return Mono.just("unknown-address"); + }; + } +} diff --git a/gateway/src/main/java/com/jmsoftware/maf/gateway/universal/configuration/RedirectConfiguration.java b/api-gateway/src/main/java/com/jmsoftware/maf/apigateway/universal/configuration/RedirectConfiguration.java similarity index 86% rename from gateway/src/main/java/com/jmsoftware/maf/gateway/universal/configuration/RedirectConfiguration.java rename to api-gateway/src/main/java/com/jmsoftware/maf/apigateway/universal/configuration/RedirectConfiguration.java index 8fe56e1c..eaa16f0a 100644 --- a/gateway/src/main/java/com/jmsoftware/maf/gateway/universal/configuration/RedirectConfiguration.java +++ b/api-gateway/src/main/java/com/jmsoftware/maf/apigateway/universal/configuration/RedirectConfiguration.java @@ -1,4 +1,4 @@ -package com.jmsoftware.maf.gateway.universal.configuration; +package com.jmsoftware.maf.apigateway.universal.configuration; import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Bean; @@ -17,7 +17,7 @@ *

* Redirect Configuration. * - * @author Johnny Miller (鍾俊), e-mail: johnnysviva@outlook.com + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com * @date 2/15/20 11:54 PM **/ @Slf4j @@ -30,7 +30,7 @@ private void postConstruct() { @Bean public RouterFunction home() { - return route(GET("/home"), request -> { + return route(GET("/"), request -> { log.info("Redirect to Home page."); return ServerResponse.temporaryRedirect(URI.create("/static/home.html")).build(); }); @@ -47,7 +47,7 @@ public RouterFunction doc() { @Bean public RouterFunction favicon() { return route(GET("/favicon.ico"), request -> { - log.info("Redirect to Bootstrap Swagger API documentation."); + log.info("Redirect to favicon."); return ServerResponse.temporaryRedirect(URI.create("/static/icon/favicon.ico")).build(); }); } diff --git a/api-gateway/src/main/java/com/jmsoftware/maf/apigateway/universal/configuration/RedisRateLimiterConfiguration.java b/api-gateway/src/main/java/com/jmsoftware/maf/apigateway/universal/configuration/RedisRateLimiterConfiguration.java new file mode 100644 index 00000000..ba22acfc --- /dev/null +++ b/api-gateway/src/main/java/com/jmsoftware/maf/apigateway/universal/configuration/RedisRateLimiterConfiguration.java @@ -0,0 +1,41 @@ +package com.jmsoftware.maf.apigateway.universal.configuration; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.context.annotation.Configuration; +import org.springframework.validation.annotation.Validated; + +import javax.validation.constraints.NotBlank; + +/** + *

RedisRateLimiterConfiguration

+ * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 3/1/2021 9:59 AM + */ +@Data +@Validated +@RefreshScope +@Configuration +@ConfigurationProperties(prefix = RedisRateLimiterConfiguration.PREFIX) +public class RedisRateLimiterConfiguration { + /** + * The constant PREFIX. + */ + public static final String PREFIX = "maf.configuration.redis-rate-limiter"; + /** + * The Replenish rate. + */ + @NotBlank + private String replenishRate; + /** + * The Burst capacity. + */ + @NotBlank + private String burstCapacity; + /** + * The Requested tokens. + */ + @NotBlank + private String requestedTokens; +} diff --git a/api-gateway/src/main/java/com/jmsoftware/maf/apigateway/universal/configuration/SwaggerConfiguration.java b/api-gateway/src/main/java/com/jmsoftware/maf/apigateway/universal/configuration/SwaggerConfiguration.java new file mode 100644 index 00000000..085a24c1 --- /dev/null +++ b/api-gateway/src/main/java/com/jmsoftware/maf/apigateway/universal/configuration/SwaggerConfiguration.java @@ -0,0 +1,31 @@ +package com.jmsoftware.maf.apigateway.universal.configuration; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.context.annotation.Configuration; +import org.springframework.stereotype.Component; +import org.springframework.validation.annotation.Validated; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotEmpty; +import java.util.Set; + +/** + *

SwaggerConfiguration

+ * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 2/7/2021 3:28 PM + **/ +@Data +@Validated +@RefreshScope +@Configuration +@ConfigurationProperties(prefix = SwaggerConfiguration.PREFIX) +public class SwaggerConfiguration { + public static final String PREFIX = "maf.configuration.swagger"; + /** + * Ignored service id set + */ + @NotEmpty + private Set<@NotBlank String> ignoredServiceIds; +} diff --git a/api-gateway/src/main/java/com/jmsoftware/maf/apigateway/universal/configuration/SwaggerResourceProvider.java b/api-gateway/src/main/java/com/jmsoftware/maf/apigateway/universal/configuration/SwaggerResourceProvider.java new file mode 100644 index 00000000..8d0a8269 --- /dev/null +++ b/api-gateway/src/main/java/com/jmsoftware/maf/apigateway/universal/configuration/SwaggerResourceProvider.java @@ -0,0 +1,107 @@ +package com.jmsoftware.maf.apigateway.universal.configuration; + +import cn.hutool.core.collection.CollUtil; +import com.jmsoftware.maf.reactivespringcloudstarter.configuration.MafProjectProperty; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import lombok.val; +import org.springframework.cloud.gateway.route.RouteLocator; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Primary; +import org.springframework.stereotype.Component; +import springfox.documentation.builders.ApiInfoBuilder; +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.service.ApiInfo; +import springfox.documentation.service.Contact; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spring.web.plugins.Docket; +import springfox.documentation.swagger.web.SwaggerResource; +import springfox.documentation.swagger.web.SwaggerResourcesProvider; + +import java.util.LinkedList; +import java.util.List; + +/** + *

SwaggerResourceProvider

+ *

+ * Change description here. + *

+ * https://blog.csdn.net/ttzommed/article/details/81103609 + *

+ * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com + * @date 2/15/20 5:40 PM + * @see + * 文档聚合业务编码 + **/ +@Slf4j +@Primary +@Component +@RequiredArgsConstructor +public class SwaggerResourceProvider implements SwaggerResourcesProvider { + private static final String SWAGGER_API_URI = "/v2/api-docs"; + private static final String LINE_SEPARATOR = System.lineSeparator(); + private final MafProjectProperty mafProjectProperty; + private final RouteLocator routeLocator; + private final SwaggerConfiguration swaggerConfiguration; + + /** + * Generate Swagger resource. + * + * @return Swagger resource. + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com + * @date 2/15/20 11:06 PM + */ + @Override + public List get() { + val swaggerResourceList = new LinkedList(); + routeLocator.getRoutes().subscribe(route -> { + val serviceName = route.getUri().toString().substring(5).toLowerCase(); + if (!CollUtil.contains(swaggerConfiguration.getIgnoredServiceIds(), serviceName)) { + log.warn("{} found dynamic route. Service name: {}, route: {}", this.getClass().getSimpleName(), + serviceName, route); + val swaggerResource = new SwaggerResource(); + swaggerResource.setName(serviceName.toUpperCase()); + swaggerResource.setLocation(String.format("%s%s", serviceName, SWAGGER_API_URI)); + swaggerResource.setSwaggerVersion("2.0"); + log.warn("Exposed Swagger Resource: {}", swaggerResource.toString()); + swaggerResourceList.add(swaggerResource); + } + }); + return swaggerResourceList; + } + + @Bean + public Docket createRestApi() { + return new Docket(DocumentationType.SWAGGER_2) + .apiInfo(apiInfo()) + .select() + .apis(RequestHandlerSelectors.basePackage(mafProjectProperty.getBasePackage())) + .paths(PathSelectors.any()) + .build(); + } + + private ApiInfo apiInfo() { + val projectArtifactId = mafProjectProperty.getProjectArtifactId(); + val version = mafProjectProperty.getVersion(); + val developerEmail = mafProjectProperty.getDeveloperEmail(); + val developerUrl = mafProjectProperty.getDeveloperUrl(); + return new ApiInfoBuilder() + .title(String.format("API for %s@%s", projectArtifactId, version)) + .description(String.format("%s %sArtifact ID: %s%sEnvironment: %s", + mafProjectProperty.getDescription(), + LINE_SEPARATOR, + projectArtifactId, + LINE_SEPARATOR, + mafProjectProperty.getEnvironment())) + .contact(new Contact(String.format("%s, email: %s%sHome page: %s", + mafProjectProperty.getDeveloperName(), + developerEmail, + LINE_SEPARATOR, + developerUrl), + developerUrl, developerEmail)) + .version(version) + .build(); + } +} diff --git a/api-gateway/src/main/java/com/jmsoftware/maf/apigateway/universal/controller/SwaggerResourceController.java b/api-gateway/src/main/java/com/jmsoftware/maf/apigateway/universal/controller/SwaggerResourceController.java new file mode 100644 index 00000000..d8721332 --- /dev/null +++ b/api-gateway/src/main/java/com/jmsoftware/maf/apigateway/universal/controller/SwaggerResourceController.java @@ -0,0 +1,63 @@ +package com.jmsoftware.maf.apigateway.universal.controller; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeansException; +import org.springframework.context.ApplicationContext; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import reactor.core.publisher.Mono; +import springfox.documentation.swagger.web.*; + + +/** + *

SwaggerResourceController

+ *

+ * Change description here. + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com + * @date 2/15/20 6:07 PM + **/ +@Slf4j +@RestController +@RequiredArgsConstructor +@RequestMapping("/swagger-resources") +public class SwaggerResourceController { + private final SwaggerResourcesProvider swaggerResources; + private final ApplicationContext applicationContext; + + @GetMapping("/configuration/security") + public Mono> securityConfiguration() { + SecurityConfiguration securityConfiguration; + try { + securityConfiguration = applicationContext.getBean(SecurityConfiguration.class); + log.info("Bean [{}] is found, {}", SecurityConfiguration.class.getSimpleName(), securityConfiguration); + } catch (BeansException e) { + securityConfiguration = SecurityConfigurationBuilder.builder().build(); + log.warn("Bean [{}] is null, create one: {}", SecurityConfiguration.class.getSimpleName(), + securityConfiguration); + } + return Mono.just(new ResponseEntity<>(securityConfiguration, HttpStatus.OK)); + } + + @GetMapping("/configuration/ui") + public Mono> uiConfiguration() { + UiConfiguration uiConfiguration; + try { + uiConfiguration = applicationContext.getBean(UiConfiguration.class); + log.info("Bean [{}] is found, {}", UiConfiguration.class.getSimpleName(), uiConfiguration); + } catch (BeansException e) { + uiConfiguration = UiConfigurationBuilder.builder().build(); + log.warn("Bean [{}] is null, create one: {}", UiConfiguration.class.getSimpleName(), uiConfiguration); + } + return Mono.just(new ResponseEntity<>(uiConfiguration, HttpStatus.OK)); + } + + @GetMapping("") + public Mono> swaggerResources() { + return Mono.just((new ResponseEntity<>(swaggerResources.get(), HttpStatus.OK))); + } +} diff --git a/api-gateway/src/main/java/com/jmsoftware/maf/apigateway/universal/handler/GlobalExceptionHandler.java b/api-gateway/src/main/java/com/jmsoftware/maf/apigateway/universal/handler/GlobalExceptionHandler.java new file mode 100644 index 00000000..68bf123d --- /dev/null +++ b/api-gateway/src/main/java/com/jmsoftware/maf/apigateway/universal/handler/GlobalExceptionHandler.java @@ -0,0 +1,94 @@ +package com.jmsoftware.maf.apigateway.universal.handler; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.jmsoftware.maf.common.bean.ResponseBodyBean; +import com.jmsoftware.maf.common.exception.SecurityException; +import com.jmsoftware.maf.reactivespringcloudstarter.util.RequestUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import lombok.val; +import org.springframework.boot.web.reactive.error.ErrorWebExceptionHandler; +import org.springframework.core.annotation.Order; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.server.reactive.ServerHttpResponse; +import org.springframework.stereotype.Component; +import org.springframework.web.reactive.function.client.WebClientResponseException; +import org.springframework.web.server.ResponseStatusException; +import org.springframework.web.server.ServerWebExchange; +import reactor.core.publisher.Mono; + +import java.nio.charset.StandardCharsets; + +/** + *

GlobalExceptionHandler

+ *

+ * Change description here. + * + * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com + * @date 12/23/20 7:45 AM + **/ +@Slf4j +@Order(-1) +@Component +@RequiredArgsConstructor +public class GlobalExceptionHandler implements ErrorWebExceptionHandler { + private final ObjectMapper objectMapper; + + @Override + @SuppressWarnings("NullableProblems") + public Mono handle(ServerWebExchange exchange, Throwable ex) { + val request = exchange.getRequest(); + log.error("Exception occurred when [{}] requested access. Exception message: {}. Request URL: [{}] {}", + RequestUtil.getRequesterIpAndPort(request), ex.getMessage(), request.getMethod(), request.getURI()); + val response = exchange.getResponse(); + if (response.isCommitted()) { + return Mono.error(ex); + } + // Set HTTP header, major browsers like Chrome now comply with the specification and interpret correctly + // UTF-8 special characters without requiring a charset=UTF-8 parameter. + response.getHeaders().setContentType(MediaType.APPLICATION_JSON); + return response.writeWith(Mono.fromSupplier(() -> { + val bufferFactory = response.bufferFactory(); + val responseBody = setResponseBody(response, ex); + try { + return bufferFactory.wrap(objectMapper.writeValueAsBytes(responseBody)); + } catch (JsonProcessingException e) { + log.warn("Exception occurred when writing response", e); + return bufferFactory.wrap(e.getMessage().getBytes(StandardCharsets.UTF_8)); + } + })); + } + + /** + * Sets response body. + * + * @param response the response + * @param ex the ex + * @return the response body + */ + private ResponseBodyBean setResponseBody(ServerHttpResponse response, Throwable ex) { + if (ex instanceof ResponseStatusException) { + response.setStatusCode(((ResponseStatusException) ex).getStatus()); + return ResponseBodyBean.ofStatus(((ResponseStatusException) ex).getStatus()); + } else if (ex instanceof SecurityException) { + HttpStatus status = HttpStatus.valueOf(((SecurityException) ex).getCode()); + response.setStatusCode(status); + return ResponseBodyBean.ofStatus(status, ex.getMessage()); + } else if (ex instanceof WebClientResponseException) { + val exception = (WebClientResponseException) ex; + response.setStatusCode(exception.getStatusCode()); + try { + return objectMapper.readValue(exception.getResponseBodyAsString(), ResponseBodyBean.class); + } catch (JsonProcessingException e) { + log.warn("Exception occurred when writing response. Exception message: {}", e.getMessage()); + return ResponseBodyBean.ofStatus(exception.getStatusCode(), + exception.getResponseBodyAsString(StandardCharsets.UTF_8)); + } + } + response.setStatusCode(HttpStatus.INTERNAL_SERVER_ERROR); + return ResponseBodyBean.ofStatus(HttpStatus.INTERNAL_SERVER_ERROR, + String.format("Exception message: %s", ex.getMessage())); + } +} diff --git a/api-gateway/src/main/java/com/jmsoftware/maf/apigateway/universal/util/package-info.java b/api-gateway/src/main/java/com/jmsoftware/maf/apigateway/universal/util/package-info.java new file mode 100644 index 00000000..c516b5ef --- /dev/null +++ b/api-gateway/src/main/java/com/jmsoftware/maf/apigateway/universal/util/package-info.java @@ -0,0 +1 @@ +package com.jmsoftware.maf.apigateway.universal.util; diff --git a/api-gateway/src/main/resources/application-development-docker.yml b/api-gateway/src/main/resources/application-development-docker.yml new file mode 100644 index 00000000..ca768773 --- /dev/null +++ b/api-gateway/src/main/resources/application-development-docker.yml @@ -0,0 +1,9 @@ +spring: + zipkin: + base-url: http://maf-zipkin:9411 + devtools: + add-properties: true + redis: + host: maf-redis + port: 6379 + password: maf@redis diff --git a/api-gateway/src/main/resources/application-development-local.yml b/api-gateway/src/main/resources/application-development-local.yml new file mode 100644 index 00000000..dbdd387e --- /dev/null +++ b/api-gateway/src/main/resources/application-development-local.yml @@ -0,0 +1,13 @@ +spring: + devtools: + add-properties: true + zipkin: + base-url: http://localhost:9411 + redis: + host: localhost + port: 6379 + password: maf@redis + +maf: + configuration: + web-security-enabled: false diff --git a/api-gateway/src/main/resources/application-production.yml b/api-gateway/src/main/resources/application-production.yml new file mode 100644 index 00000000..15d4a3c7 --- /dev/null +++ b/api-gateway/src/main/resources/application-production.yml @@ -0,0 +1,9 @@ +spring: + devtools: + add-properties: false + zipkin: + base-url: http://maf-zipkin:9411 + redis: + host: maf-redis + port: 6379 + password: maf@redis diff --git a/api-gateway/src/main/resources/application-stage.yml b/api-gateway/src/main/resources/application-stage.yml new file mode 100644 index 00000000..15d4a3c7 --- /dev/null +++ b/api-gateway/src/main/resources/application-stage.yml @@ -0,0 +1,9 @@ +spring: + devtools: + add-properties: false + zipkin: + base-url: http://maf-zipkin:9411 + redis: + host: maf-redis + port: 6379 + password: maf@redis diff --git a/api-gateway/src/main/resources/application-test.yml b/api-gateway/src/main/resources/application-test.yml new file mode 100644 index 00000000..15d4a3c7 --- /dev/null +++ b/api-gateway/src/main/resources/application-test.yml @@ -0,0 +1,9 @@ +spring: + devtools: + add-properties: false + zipkin: + base-url: http://maf-zipkin:9411 + redis: + host: maf-redis + port: 6379 + password: maf@redis diff --git a/api-gateway/src/main/resources/application.yml b/api-gateway/src/main/resources/application.yml new file mode 100644 index 00000000..de382bb4 --- /dev/null +++ b/api-gateway/src/main/resources/application.yml @@ -0,0 +1,99 @@ +server: + port: @api-gateway.port@ + tomcat: + uri-encoding: @project.build.sourceEncoding@ + shutdown: GRACEFUL + servlet: + context-path: + +spring: + profiles: + active: @env@ + mvc: + throw-exception-if-no-handler-found: true + jackson: + date-format: yyyy-MM-dd HH:mm:ss + time-zone: Asia/Hong_Kong + cloud: + consul: + discovery: + register: true + instance-id: ${spring.application.name}-${spring.cloud.client.hostname}-${vcap.application.instance_id:${spring.application.instance_id:${random.value}}} + service-name: ${spring.application.name} + port: ${server.port} + prefer-ip-address: true + ip-address: ${spring.cloud.client.ip-address} + health-check-critical-timeout: 15s + gateway: + discovery: + locator: + enabled: true + lower-case-service-id: true + # https://cloud.spring.io/spring-cloud-gateway/multi/multi__cors_configuration.html + globalcors: + corsConfigurations: + '[/**]': + allowedOrigins: "*" + allowedMethods: "*" + redis: + database: 0 + timeout: 10000ms + client-type: LETTUCE + lettuce: + pool: + max-active: 20 + max-idle: 10 + max-wait: -1ms + min-idle: 0 + +management: + endpoints: + web: + exposure: + include: "*" + endpoint: + health: + show-details: ALWAYS + +logging: + config: classpath:logback-configuration/logback-${spring.profiles.active}.xml + +maf: + project-property: + base-package: @project.groupId@ + context-path: ${server.servlet.context-path} + group-id: @project.groupId@ + project-parent-artifact-id: @project.parent.artifactId@ + project-artifact-id: @project.artifactId@ + version: @project.version@ + description: @project.description@ + jdk-version: @java.version@ + environment: ${spring.profiles.active} + url: @project.url@ + inception-year: @inceptionYear@ + organization-name: @project.organization.name@ + organization-url: @project.organization.url@ + issue-management-system: @project.issueManagement.system@ + issue-management-url: @project.issueManagement.url@ + developer-name: @developerName@ + developer-email: @developerEmail@ + developer-url: @developerUrl@ + configuration: + ignored-url: + post: + - "/auth-center/users/signup" + - "/auth-center/users/login" + - "/auth-center/users/logout" + get: + - "/favicon.ico" + pattern: + - "/static/**" + - "/*/static/**" + - "/actuator/**" + - "/*/druid/**" + - "/swagger-resources/**" + - "/v2/api-docs/**" + - "/*/v2/api-docs/**" + - "/*/webjars/**" + - "/doc.html" + - "/oss-center/**" diff --git a/exercise-mis/src/main/resources/banner.txt b/api-gateway/src/main/resources/banner.txt similarity index 64% rename from exercise-mis/src/main/resources/banner.txt rename to api-gateway/src/main/resources/banner.txt index 81dc78b5..484a2316 100644 --- a/exercise-mis/src/main/resources/banner.txt +++ b/api-gateway/src/main/resources/banner.txt @@ -1,12 +1,13 @@ ${AnsiStyle.BOLD}${AnsiColor.BRIGHT_GREEN} - ______ _ __ ____________ - / ____/ _____ __________(_)_______ / |/ / _/ ___/ - / __/ | |/_/ _ \/ ___/ ___/ / ___/ _ \ / /|_/ // / \__ \ - / /____> - + - + + - + + - + + - + + - + + @@ -60,11 +65,19 @@ - ${LOG_HOME}/${PROJECT_ARTIFACT_Id}${LOG_FILE_SUFFIX}.%d{yyyy-MM-dd}.%i.log.gz + ${LOG_HOME}/${APPLICATION}-${ENVIRONMENT}-${HOSTNAME}.%d{yyyy-MM-dd}.%i.log.gz 5MB 7 1GB + + + + ${LOGSTASH_HOST}:4560 + + {"applicationName": "${APPLICATION}", "environment": "${ENVIRONMENT}"} + + diff --git a/auth-center/src/main/resources/configuration/logback/logback-development-docker.xml b/api-gateway/src/main/resources/logback-configuration/logback-development-docker.xml similarity index 68% rename from auth-center/src/main/resources/configuration/logback/logback-development-docker.xml rename to api-gateway/src/main/resources/logback-configuration/logback-development-docker.xml index f38e6c2d..86b71ee2 100644 --- a/auth-center/src/main/resources/configuration/logback/logback-development-docker.xml +++ b/api-gateway/src/main/resources/logback-configuration/logback-development-docker.xml @@ -1,10 +1,11 @@ - + + diff --git a/auth-center/src/main/resources/configuration/logback/logback-development-local.xml b/api-gateway/src/main/resources/logback-configuration/logback-development-local.xml similarity index 68% rename from auth-center/src/main/resources/configuration/logback/logback-development-local.xml rename to api-gateway/src/main/resources/logback-configuration/logback-development-local.xml index f38e6c2d..86b71ee2 100644 --- a/auth-center/src/main/resources/configuration/logback/logback-development-local.xml +++ b/api-gateway/src/main/resources/logback-configuration/logback-development-local.xml @@ -1,10 +1,11 @@ - + + diff --git a/auth-center/src/main/resources/configuration/logback/logback-production.xml b/api-gateway/src/main/resources/logback-configuration/logback-production.xml similarity index 68% rename from auth-center/src/main/resources/configuration/logback/logback-production.xml rename to api-gateway/src/main/resources/logback-configuration/logback-production.xml index f38e6c2d..86b71ee2 100644 --- a/auth-center/src/main/resources/configuration/logback/logback-production.xml +++ b/api-gateway/src/main/resources/logback-configuration/logback-production.xml @@ -1,10 +1,11 @@ - + + diff --git a/api-portal/src/main/resources/configuration/logback/logback-stage.xml b/api-gateway/src/main/resources/logback-configuration/logback-stage.xml similarity index 68% rename from api-portal/src/main/resources/configuration/logback/logback-stage.xml rename to api-gateway/src/main/resources/logback-configuration/logback-stage.xml index f38e6c2d..86b71ee2 100644 --- a/api-portal/src/main/resources/configuration/logback/logback-stage.xml +++ b/api-gateway/src/main/resources/logback-configuration/logback-stage.xml @@ -1,10 +1,11 @@ - + + diff --git a/api-portal/src/main/resources/configuration/logback/logback-test.xml b/api-gateway/src/main/resources/logback-configuration/logback-test.xml similarity index 66% rename from api-portal/src/main/resources/configuration/logback/logback-test.xml rename to api-gateway/src/main/resources/logback-configuration/logback-test.xml index f1916a0f..3c705245 100644 --- a/api-portal/src/main/resources/configuration/logback/logback-test.xml +++ b/api-gateway/src/main/resources/logback-configuration/logback-test.xml @@ -1,10 +1,11 @@ - + + diff --git a/gateway/src/test/java/com/jmsoftware/maf/gateway/GatewayApplicationTests.java b/api-gateway/src/test/java/com/jmsoftware/maf/apigateway/ApiGatewayApplicationTests.java similarity index 68% rename from gateway/src/test/java/com/jmsoftware/maf/gateway/GatewayApplicationTests.java rename to api-gateway/src/test/java/com/jmsoftware/maf/apigateway/ApiGatewayApplicationTests.java index 15696948..2ffb2727 100644 --- a/gateway/src/test/java/com/jmsoftware/maf/gateway/GatewayApplicationTests.java +++ b/api-gateway/src/test/java/com/jmsoftware/maf/apigateway/ApiGatewayApplicationTests.java @@ -1,10 +1,10 @@ -package com.jmsoftware.maf.gateway; +package com.jmsoftware.maf.apigateway; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest -class GatewayApplicationTests { +class ApiGatewayApplicationTests { @Test void contextLoads() { diff --git a/api-gateway/src/test/java/com/jmsoftware/maf/apigateway/AuthorizationTests.java b/api-gateway/src/test/java/com/jmsoftware/maf/apigateway/AuthorizationTests.java new file mode 100644 index 00000000..397289d9 --- /dev/null +++ b/api-gateway/src/test/java/com/jmsoftware/maf/apigateway/AuthorizationTests.java @@ -0,0 +1,25 @@ +package com.jmsoftware.maf.apigateway; + +import lombok.extern.slf4j.Slf4j; +import lombok.val; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.util.AntPathMatcher; + +/** + * Description: AuthorizationTests, change description here. + * + * @author 钟俊(zhongjun), email: zhongjun@toguide.cn, date: 1/13/2021 11:27 AM + **/ +@Slf4j +@SpringBootTest +public class AuthorizationTests { + @Test + void antPathMatcherTests() { + val antPathMatcher = new AntPathMatcher(); + val urlMatched = antPathMatcher.match("/**", "/spring-boot-admin/common/app-info"); + log.info("urlMatched: {}", urlMatched); + Assertions.assertTrue(urlMatched); + } +} diff --git a/api-portal/pom.xml b/api-portal/pom.xml deleted file mode 100644 index 5e555f39..00000000 --- a/api-portal/pom.xml +++ /dev/null @@ -1,165 +0,0 @@ - - - 4.0.0 - - - api-portal - Muscle and Fitness Server :: API Portal - API Portal is an entrance for upcoming requests from any external devices. Responsible for aggregating - internal microservices and exposing to external. - - - com.jmsoftware.maf - muscle-and-fitness-server - 0.0.1 - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - - com.google.cloud.tools - jib-maven-plugin - 2.2.0 - - - - buildDockerImagePhase - verify - - dockerBuild - - - - - buildAndPushDockerImagePhase - install - - build - - - - - - - openjdk:11.0.9.1-jre-slim - - - docker.io/ijohnnymiller/${project.parent.artifactId}.${project.artifactId} - - ${project.version} - - - - - /${project.artifactId} - - -Dfile.encoding=${project.build.sourceEncoding} - - - ${api-portal.port} - - USE_CURRENT_TIMESTAMP - - - - - - - - - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.cloud - spring-cloud-starter-netflix-eureka-client - - - de.codecentric - spring-boot-admin-starter-client - ${spring-boot-admin.version} - - - org.springframework.cloud - spring-cloud-starter-zipkin - - - org.springframework.boot - spring-boot-starter-security - - - org.springframework.boot - spring-boot-starter-data-redis - - - org.springframework.integration - spring-integration-sftp - - - - com.jmsoftware.maf - common - - - com.jmsoftware.maf - muscle-and-fitness-server-spring-boot-starter - - - - org.springframework.security - spring-security-test - test - - - - - com.baomidou - mybatis-plus-boot-starter - 3.3.1 - - - mysql - mysql-connector-java - runtime - - - com.alibaba - druid - 1.1.22 - - - - redis.clients - jedis - - - - - io.jsonwebtoken - jjwt-api - 0.11.1 - - - io.jsonwebtoken - jjwt-impl - 0.11.1 - runtime - - - io.jsonwebtoken - jjwt-jackson - 0.11.1 - runtime - - - diff --git a/api-portal/src/main/java/com/jmsoftware/maf/apiportal/ApiPortalApplication.java b/api-portal/src/main/java/com/jmsoftware/maf/apiportal/ApiPortalApplication.java deleted file mode 100644 index 2a3cb9e3..00000000 --- a/api-portal/src/main/java/com/jmsoftware/maf/apiportal/ApiPortalApplication.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.jmsoftware.maf.apiportal; - -import com.jmsoftware.maf.apiportal.universal.configuration.ProjectProperty; -import com.jmsoftware.maf.muscleandfitnessserverspringbootstarter.helper.IpHelper; -import lombok.extern.slf4j.Slf4j; -import lombok.val; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cloud.client.discovery.EnableDiscoveryClient; -import org.springframework.cloud.openfeign.EnableFeignClients; - -import java.time.Duration; -import java.time.Instant; -import java.util.TimeZone; - -/** - *

ApiPortalApplication

- *

- * Change description here. - * - * @author Johnny Miller (鍾俊), e-mail: johnnysviva@outlook.com - * @date 3/14/20 1:58 PM - **/ -@Slf4j -@EnableFeignClients -@EnableDiscoveryClient -@SpringBootApplication -public class ApiPortalApplication { - private static final String LINE_SEPARATOR = System.lineSeparator(); - private static ProjectProperty projectProperty; - private static IpHelper ipHelper; - - public ApiPortalApplication(ProjectProperty projectProperty, IpHelper ipHelper) { - ApiPortalApplication.projectProperty = projectProperty; - ApiPortalApplication.ipHelper = ipHelper; - } - - public static void main(String[] args) { - val startInstant = Instant.now(); - SpringApplication.run(ApiPortalApplication.class, args); - val endInstant = Instant.now(); - val duration = Duration.between(startInstant, endInstant); - log.info("🥳 Congratulations! 🎉"); - log.info("🖥 {}@{} started!", projectProperty.getProjectArtifactId(), projectProperty.getVersion()); - log.info("⚙️ Environment: {}", projectProperty.getEnvironment()); - log.info("⏳ Deployment duration: {} seconds ({} ms)", duration.getSeconds(), duration.toMillis()); - log.info("⏰ App started at {} (timezone - {})", endInstant, TimeZone.getDefault().getDisplayName()); - log.info("{} App running at{} - Local: http://localhost:{}{}/{} - Network: {}/{}", - LINE_SEPARATOR, LINE_SEPARATOR, ipHelper.getServerPort(), projectProperty.getContextPath(), - LINE_SEPARATOR, ipHelper.getPublicIp(),projectProperty.getContextPath()); - } -} diff --git a/api-portal/src/main/java/com/jmsoftware/maf/apiportal/auth/controller/AuthenticationController.java b/api-portal/src/main/java/com/jmsoftware/maf/apiportal/auth/controller/AuthenticationController.java deleted file mode 100644 index b8230877..00000000 --- a/api-portal/src/main/java/com/jmsoftware/maf/apiportal/auth/controller/AuthenticationController.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.jmsoftware.maf.apiportal.auth.controller; - -import com.jmsoftware.maf.apiportal.auth.entity.LoginPayload; -import com.jmsoftware.maf.apiportal.auth.entity.LoginResponse; -import com.jmsoftware.maf.apiportal.auth.entity.RegisterPayload; -import com.jmsoftware.maf.apiportal.auth.service.AuthenticationService; -import com.jmsoftware.maf.common.bean.ResponseBodyBean; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import javax.validation.Valid; - -/** - *

AuthenticationController

- *

- * Change description here. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 5/8/20 11:06 AM - **/ -@RestController -@RequiredArgsConstructor -@RequestMapping("/authentication") -@Api(tags = {"Authentication Controller"}) -public class AuthenticationController { - private final AuthenticationService authenticationService; - - @PostMapping("/register") - @ApiOperation(value = "/register", notes = "Register (create an account)") - public ResponseBodyBean register(@Valid @RequestBody RegisterPayload payload) { - return ResponseBodyBean.ofSuccess(authenticationService.register(payload)); - } - - @PostMapping("/login") - @ApiOperation(value = "/login", notes = "Login") - public ResponseBodyBean login(@Valid @RequestBody LoginPayload payload) { - return ResponseBodyBean.ofSuccess(authenticationService.login(payload)); - } -} diff --git a/api-portal/src/main/java/com/jmsoftware/maf/apiportal/auth/entity/LoginResponse.java b/api-portal/src/main/java/com/jmsoftware/maf/apiportal/auth/entity/LoginResponse.java deleted file mode 100644 index 61b46cbe..00000000 --- a/api-portal/src/main/java/com/jmsoftware/maf/apiportal/auth/entity/LoginResponse.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.jmsoftware.maf.apiportal.auth.entity; - -import lombok.Data; - -/** - *

LoginResponse

- *

- * Change description here. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 5/8/20 2:07 PM - **/ -@Data -public class LoginResponse { - private String jwt; -} diff --git a/api-portal/src/main/java/com/jmsoftware/maf/apiportal/auth/entity/RegisterPayload.java b/api-portal/src/main/java/com/jmsoftware/maf/apiportal/auth/entity/RegisterPayload.java deleted file mode 100644 index 7b92447d..00000000 --- a/api-portal/src/main/java/com/jmsoftware/maf/apiportal/auth/entity/RegisterPayload.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.jmsoftware.maf.apiportal.auth.entity; - -import lombok.Data; -import org.hibernate.validator.constraints.Length; - -import javax.validation.constraints.NotEmpty; - -/** - *

RegisterPayload

- *

- * Change description here. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 5/9/20 3:53 PM - **/ -@Data -public class RegisterPayload { - /** - * Username (Unique) - */ - @NotEmpty - @Length(min = 4, max = 50) - private String username; - /** - * Email (Unique) - */ - @NotEmpty - @Length(max = 100) - private String email; - /** - * Password - */ - @NotEmpty - @Length(min = 8, max = 30) - private String password; -} diff --git a/api-portal/src/main/java/com/jmsoftware/maf/apiportal/auth/service/AuthenticationService.java b/api-portal/src/main/java/com/jmsoftware/maf/apiportal/auth/service/AuthenticationService.java deleted file mode 100644 index 0d37b726..00000000 --- a/api-portal/src/main/java/com/jmsoftware/maf/apiportal/auth/service/AuthenticationService.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.jmsoftware.maf.apiportal.auth.service; - -import com.jmsoftware.maf.apiportal.auth.entity.LoginPayload; -import com.jmsoftware.maf.apiportal.auth.entity.LoginResponse; -import com.jmsoftware.maf.apiportal.auth.entity.RegisterPayload; - -/** - *

AuthenticationService

- *

- * Change description here. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 5/8/20 2:04 PM - */ -public interface AuthenticationService { - /** - * Register. - * - * @param payload the payload - * @return the long - */ - Long register(RegisterPayload payload); - - /** - * Login login response. - * - * @param payload the payload - * @return the login response - */ - LoginResponse login(LoginPayload payload); -} diff --git a/api-portal/src/main/java/com/jmsoftware/maf/apiportal/auth/service/impl/AuthenticationServiceImpl.java b/api-portal/src/main/java/com/jmsoftware/maf/apiportal/auth/service/impl/AuthenticationServiceImpl.java deleted file mode 100644 index ab3c1fa9..00000000 --- a/api-portal/src/main/java/com/jmsoftware/maf/apiportal/auth/service/impl/AuthenticationServiceImpl.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.jmsoftware.maf.apiportal.auth.service.impl; - -import com.jmsoftware.maf.apiportal.auth.entity.LoginPayload; -import com.jmsoftware.maf.apiportal.auth.entity.LoginResponse; -import com.jmsoftware.maf.apiportal.auth.entity.RegisterPayload; -import com.jmsoftware.maf.apiportal.auth.service.AuthenticationService; -import com.jmsoftware.maf.apiportal.remoteapi.AuthCenterRemoteApi; -import com.jmsoftware.maf.apiportal.universal.service.JwtService; -import com.jmsoftware.maf.common.domain.authcenter.user.SaveUserForRegisteringPayload; -import lombok.RequiredArgsConstructor; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import lombok.val; -import org.springframework.security.authentication.AuthenticationManager; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; -import org.springframework.stereotype.Service; - -/** - *

AuthenticationServiceImpl

- *

- * Change description here. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 5/8/20 2:04 PM - **/ -@Slf4j -@Service -@RequiredArgsConstructor -public class AuthenticationServiceImpl implements AuthenticationService { - private final BCryptPasswordEncoder encoder; - private final AuthenticationManager authenticationManager; - private final JwtService jwtService; - private final AuthCenterRemoteApi authCenterRemoteApi; - - @Override - public Long register(RegisterPayload payload) { - val saveUserForRegisteringPayload = new SaveUserForRegisteringPayload(); - saveUserForRegisteringPayload.setUsername(payload.getUsername()); - saveUserForRegisteringPayload.setEmail(payload.getEmail()); - saveUserForRegisteringPayload.setEncodedPassword(encoder.encode(payload.getPassword())); - val response = authCenterRemoteApi.saveUserForRegistering(saveUserForRegisteringPayload); - log.info("Registered an new user account. User ID: {}", response.getData().getUserId()); - return response.getData().getUserId(); - } - - @Override - @SneakyThrows - public LoginResponse login(LoginPayload payload) { - val authenticationToken = new UsernamePasswordAuthenticationToken(payload.getLoginToken(), - payload.getPassword()); - val authentication = authenticationManager.authenticate(authenticationToken); - SecurityContextHolder.getContext().setAuthentication(authentication); - val jwt = jwtService.createJwt(authentication, payload.getRememberMe()); - val loginResponse = new LoginResponse(); - loginResponse.setJwt(jwt); - return loginResponse; - } -} diff --git a/api-portal/src/main/java/com/jmsoftware/maf/apiportal/remoteapi/AuthCenterRemoteApi.java b/api-portal/src/main/java/com/jmsoftware/maf/apiportal/remoteapi/AuthCenterRemoteApi.java deleted file mode 100644 index 407edc12..00000000 --- a/api-portal/src/main/java/com/jmsoftware/maf/apiportal/remoteapi/AuthCenterRemoteApi.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.jmsoftware.maf.apiportal.remoteapi; - -import com.jmsoftware.maf.common.bean.ResponseBodyBean; -import com.jmsoftware.maf.common.domain.authcenter.permission.GetPermissionListByRoleIdListPayload; -import com.jmsoftware.maf.common.domain.authcenter.permission.GetPermissionListByRoleIdListResponse; -import com.jmsoftware.maf.common.domain.authcenter.permission.GetPermissionListByUserIdPayload; -import com.jmsoftware.maf.common.domain.authcenter.permission.GetPermissionListByUserIdResponse; -import com.jmsoftware.maf.common.domain.authcenter.role.GetRoleListByUserIdPayload; -import com.jmsoftware.maf.common.domain.authcenter.role.GetRoleListByUserIdResponse; -import com.jmsoftware.maf.common.domain.authcenter.user.GetUserByLoginTokenPayload; -import com.jmsoftware.maf.common.domain.authcenter.user.GetUserByLoginTokenResponse; -import com.jmsoftware.maf.common.domain.authcenter.user.SaveUserForRegisteringPayload; -import com.jmsoftware.maf.common.domain.authcenter.user.SaveUserForRegisteringResponse; -import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; - -import javax.validation.Valid; - -/** - *

AuthCenterRemoteApi

- *

- * Change description here. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 5/10/20 4:50 PM - */ -@Validated -@FeignClient(name = "auth-center") -public interface AuthCenterRemoteApi { - /** - * Gets user by login token. - * - * @param payload the payload - * @return the user by login token - */ - @PostMapping("/user-remote-api/get-user-by-login-token") - ResponseBodyBean getUserByLoginToken(@Valid @RequestBody GetUserByLoginTokenPayload payload); - - /** - * Gets role list by user id. - * - * @param payload the payload - * @return the role list by user id - */ - @PostMapping("/role-remote-api/get-role-list-by-user-id") - ResponseBodyBean getRoleListByUserId(@Valid @RequestBody GetRoleListByUserIdPayload payload); - - /** - * Save user for registering response body bean. - * - * @param payload the payload - * @return the response body bean - */ - @PostMapping("/user-remote-api/save-user-for-registering") - ResponseBodyBean saveUserForRegistering(@Valid @RequestBody SaveUserForRegisteringPayload payload); - - /** - * Gets permission list by role id list. - * - * @param payload the payload - * @return the permission list by role id list - */ - @PostMapping("/permission-remote-api/get-permission-list-by-role-id-list") - ResponseBodyBean getPermissionListByRoleIdList(@Valid @RequestBody GetPermissionListByRoleIdListPayload payload); - - /** - * Get permission list by user id response body bean. - * - * @param payload the payload - * @return the response body bean - */ - @PostMapping("/permission-remote-api/get-permission-list-by-user-id") - ResponseBodyBean getPermissionListByUserId(@Valid @RequestBody GetPermissionListByUserIdPayload payload); -} diff --git a/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/configuration/Constants.java b/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/configuration/Constants.java deleted file mode 100644 index 3e73e83b..00000000 --- a/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/configuration/Constants.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.jmsoftware.maf.apiportal.universal.configuration; - -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -/** - *

Constants

- *

- * Change description here. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 5/2/20 11:41 PM - **/ -@Slf4j -@Component -public class Constants { - public Constants(ProjectProperty projectProperty) { - REDIS_JWT_KEY_PREFIX = String.format("%s:jwt:", projectProperty.getProjectParentArtifactId()); - log.info("Initiated 'REDIS_JWT_KEY_PREFIX': {}", REDIS_JWT_KEY_PREFIX); - } - - /** - * Key prefix of JWT stored in Redis. - */ - public static String REDIS_JWT_KEY_PREFIX; - /** - * Token key of request header. - */ - public static final String REQUEST_TOKEN_KEY = "Authorization"; - /** - * Prefix of JWT. - */ - public static final String JWT_PREFIX = "Bearer "; - /** - * Star sign - */ - public static final String ASTERISK = "*"; - /** - * At sign - */ - public static final String AT_SIGN = "@"; -} diff --git a/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/configuration/CustomConfiguration.java b/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/configuration/CustomConfiguration.java deleted file mode 100644 index c189a948..00000000 --- a/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/configuration/CustomConfiguration.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.jmsoftware.maf.apiportal.universal.configuration; - -import lombok.Data; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.stereotype.Component; - -/** - *

CustomConfiguration

- *

Custom configurations which are written in .yml files, containing a variety of fragmentary configs. Such as, - * Druid login info, web security switch, web log and so on.

- * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2019-03-23 14:24 - **/ -@Data -@Component -@ConfigurationProperties(prefix = "custom.configuration") -public class CustomConfiguration { - /** - *

The username of super user who has no restriction to access any system's resources.

- *

ATTENTION: The value of username of super user must be equal to the value that is - * persistent in database.

- */ - private String superUser; - /** - * Ignore URLs - */ - private IgnoredRequest ignoredRequest; - private String druidLoginName; - private String druidPassword; - /** - *

Web security feature switch. Default is false.

- * true - disable web security; false - enable web security. - */ - private Boolean webSecurityDisabled = false; - /** - * Web request log switch. Default is false. - *

- * true - disable web request log; false - enable web request log. - */ - private Boolean webRequestLogDisabled = false; -} diff --git a/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/configuration/DruidConfiguration.java b/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/configuration/DruidConfiguration.java deleted file mode 100644 index a5a2a166..00000000 --- a/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/configuration/DruidConfiguration.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.jmsoftware.maf.apiportal.universal.configuration; - -import com.alibaba.druid.pool.DruidDataSource; -import com.alibaba.druid.support.http.StatViewServlet; -import com.alibaba.druid.support.http.WebStatFilter; -import lombok.RequiredArgsConstructor; -import lombok.val; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.boot.web.servlet.FilterRegistrationBean; -import org.springframework.boot.web.servlet.ServletRegistrationBean; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import javax.sql.DataSource; - -/** - *

DruidConfiguration

- *

- * Druid Configuration - * Click me to view Druid Monitor - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2019-03-24 13:31 - **/ -@Configuration -@RequiredArgsConstructor -public class DruidConfiguration { - @Bean - public ServletRegistrationBean druidServlet() { - val servletRegistrationBean = new ServletRegistrationBean<>(new StatViewServlet(), "/druid/*"); - servletRegistrationBean.addInitParameter("loginUsername", "admin"); - servletRegistrationBean.addInitParameter("loginPassword", "admin"); - servletRegistrationBean.addInitParameter("resetEnable", "false"); - return servletRegistrationBean; - } - - @Bean - public FilterRegistrationBean filterRegistrationBean() { - val filterRegistrationBean = new FilterRegistrationBean(); - filterRegistrationBean.setFilter(new WebStatFilter()); - filterRegistrationBean.addUrlPatterns("/*"); - // Ignored resources - filterRegistrationBean.addInitParameter("exclusions", - "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"); - filterRegistrationBean.addInitParameter("profileEnable", "true"); - filterRegistrationBean.addInitParameter("principalCookieName", "USER_COOKIE"); - filterRegistrationBean.addInitParameter("principalSessionName", "USER_SESSION"); - return filterRegistrationBean; - } - - @Bean - @ConfigurationProperties(prefix = "spring.datasource") - public DataSource druidDataSource() { - return new DruidDataSource(); - } -} diff --git a/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/configuration/IgnoredRequest.java b/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/configuration/IgnoredRequest.java deleted file mode 100644 index 9e030140..00000000 --- a/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/configuration/IgnoredRequest.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.jmsoftware.maf.apiportal.universal.configuration; - -import com.google.common.collect.Lists; -import lombok.Data; - -import java.util.List; - -/** - *

IgnoredRequest

- *

- * Ignored request configuration. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 5/2/20 11:41 PM - **/ -@Data -public class IgnoredRequest { - /** - * Ignored URL pattern. - */ - private List pattern = Lists.newArrayList(); - /** - * Ignored GET request. - */ - private List get = Lists.newArrayList(); - /** - * Ignored POST request. - */ - private List post = Lists.newArrayList(); - /** - * Ignored DELETE request. - */ - private List delete = Lists.newArrayList(); - /** - * Ignored PUT request. - */ - private List put = Lists.newArrayList(); - /** - * Ignored HEAD request. - */ - private List head = Lists.newArrayList(); - /** - * Ignored PATCH request. - */ - private List patch = Lists.newArrayList(); - /** - * Ignored OPTIONS request. - */ - private List options = Lists.newArrayList(); - /** - * Ignored TRACE request. - */ - private List trace = Lists.newArrayList(); -} diff --git a/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/configuration/JwtConfiguration.java b/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/configuration/JwtConfiguration.java deleted file mode 100644 index edd4f961..00000000 --- a/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/configuration/JwtConfiguration.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.jmsoftware.maf.apiportal.universal.configuration; - -import lombok.Data; -import lombok.extern.slf4j.Slf4j; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.stereotype.Component; - -import java.nio.charset.StandardCharsets; - -/** - *

JwtConfiguration

- *

- * Ignored request configuration. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 5/2/20 11:41 PM - **/ -@Data -@Slf4j -@Component -@ConfigurationProperties(prefix = "jwt.configuration") -public class JwtConfiguration { - public JwtConfiguration(ProjectProperty projectProperty) { - this.signingKey = String.format("%s %s", projectProperty.getProjectParentArtifactId(), projectProperty.getVersion()); - log.info("Initiated JWT signing key: {}. The specified key byte array is {} bits", this.signingKey, - this.signingKey.getBytes(StandardCharsets.UTF_8).length * 8); - } - - /** - * JWT signing key, which is equal to the string value of group id of project. - */ - private String signingKey; - /** - * Time to live of JWT. Default: 3 * 600000 milliseconds (30 min). - */ - private Long ttl = 3 * 600000L; - /** - * Time to live of JWT for remember me, Default: 7 * 86400000 milliseconds (7 day) - */ - private Long ttlForRememberMe = 7 * 86400000L; -} diff --git a/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/configuration/MyBatisPlusConfiguration.java b/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/configuration/MyBatisPlusConfiguration.java deleted file mode 100644 index 1b5cca54..00000000 --- a/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/configuration/MyBatisPlusConfiguration.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.jmsoftware.maf.apiportal.universal.configuration; - -import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor; -import com.baomidou.mybatisplus.extension.plugins.pagination.optimize.JsqlParserCountOptimize; -import lombok.val; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.transaction.annotation.EnableTransactionManagement; - -/** - *

MyBatisPlusConfiguration

- *

- * Change description here. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2019-05-02 11:57 - **/ -@Configuration -@EnableTransactionManagement -public class MyBatisPlusConfiguration { - /** - * Inject bean to enable pagination. - * - * @return bean for pagination - */ - @Bean - public PaginationInterceptor paginationInterceptor() { - val paginationInterceptor = new PaginationInterceptor(); - // Set maximum query record count - paginationInterceptor.setLimit(100L); - // Enable JSQL Parser Count Optimizing (for left join) - paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true)); - return paginationInterceptor; - } -} diff --git a/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/configuration/ProjectProperty.java b/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/configuration/ProjectProperty.java deleted file mode 100644 index 669f177d..00000000 --- a/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/configuration/ProjectProperty.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.jmsoftware.maf.apiportal.universal.configuration; - -import lombok.Data; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.stereotype.Component; - -/** - *

ProjectProperty

- *

- * Change description here. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2019-04-18 13:01 - **/ -@Data -@Component -@ConfigurationProperties(prefix = "project.property") -public class ProjectProperty { - private String basePackage; - private String contextPath; - private String groupId; - private String projectParentArtifactId; - private String projectArtifactId; - private String version; - private String description; - private String jdkVersion; - private String environment; - private String url; - private String inceptionYear; - private String organizationName; - private String organizationUrl; - private String issueManagementSystem; - private String issueManagementUrl; - private String developerName; - private String developerEmail; - private String developerUrl; -} diff --git a/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/configuration/RedisClientConfiguration.java b/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/configuration/RedisClientConfiguration.java deleted file mode 100644 index 04f9037d..00000000 --- a/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/configuration/RedisClientConfiguration.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.jmsoftware.maf.apiportal.universal.configuration; - -import lombok.val; -import org.springframework.boot.autoconfigure.AutoConfigureAfter; -import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration; -import org.springframework.cache.annotation.CachingConfigurerSupport; -import org.springframework.cache.annotation.EnableCaching; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; -import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer; -import org.springframework.data.redis.serializer.StringRedisSerializer; - -import java.io.Serializable; - -/** - *

RedisClientConfiguration

- *

- * Ignored request configuration. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 5/2/20 11:41 PM - **/ -@Configuration -@EnableCaching -@AutoConfigureAfter(RedisAutoConfiguration.class) -public class RedisClientConfiguration extends CachingConfigurerSupport { - /** - * Redis template. Support for <String, Serializable> - */ - @Bean - public RedisTemplate redisFactory(LettuceConnectionFactory lettuceConnectionFactory) { - val template = new RedisTemplate(); - template.setKeySerializer(new StringRedisSerializer()); - template.setValueSerializer(new GenericJackson2JsonRedisSerializer()); - template.setConnectionFactory(lettuceConnectionFactory); - return template; - } -} diff --git a/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/configuration/SecurityHandlerConfiguration.java b/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/configuration/SecurityHandlerConfiguration.java deleted file mode 100644 index 4971d1c1..00000000 --- a/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/configuration/SecurityHandlerConfiguration.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.jmsoftware.maf.apiportal.universal.configuration; - -import com.jmsoftware.maf.common.constant.HttpStatus; -import com.jmsoftware.maf.muscleandfitnessserverspringbootstarter.util.ResponseUtil; -import lombok.extern.slf4j.Slf4j; -import lombok.val; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.security.web.AuthenticationEntryPoint; -import org.springframework.security.web.access.AccessDeniedHandler; - -/** - *

SecurityHandlerConfiguration

- *

- * Security handler configuration. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 5/2/20 11:41 PM - **/ -@Slf4j -@Configuration -public class SecurityHandlerConfiguration { - @Bean - public AuthenticationEntryPoint authenticationEntryPoint() { - return ((request, response, authException) -> { - val formattedMessage = String.format("Authentication encountered an exception! Exception message: %s", - authException.getMessage()); - log.error(formattedMessage); - ResponseUtil.renderJson(response, HttpStatus.FORBIDDEN, formattedMessage); - }); - } - - @Bean - public AccessDeniedHandler accessDeniedHandler() { - return ((request, response, accessDeniedException) -> { - val formattedMessage = String.format("Access was denied! Exception message: %s", - accessDeniedException.getMessage()); - log.error(formattedMessage); - ResponseUtil.renderJson(response, HttpStatus.FORBIDDEN, formattedMessage); - }); - } -} diff --git a/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/configuration/SftpClientConfiguration.java b/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/configuration/SftpClientConfiguration.java deleted file mode 100644 index 8a07b4bf..00000000 --- a/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/configuration/SftpClientConfiguration.java +++ /dev/null @@ -1,108 +0,0 @@ -package com.jmsoftware.maf.apiportal.universal.configuration; - -import com.jcraft.jsch.ChannelSftp; -import lombok.Data; -import lombok.val; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.core.io.Resource; -import org.springframework.expression.common.LiteralExpression; -import org.springframework.integration.annotation.ServiceActivator; -import org.springframework.integration.file.remote.session.CachingSessionFactory; -import org.springframework.integration.file.remote.session.SessionFactory; -import org.springframework.integration.sftp.outbound.SftpMessageHandler; -import org.springframework.integration.sftp.session.DefaultSftpSessionFactory; -import org.springframework.integration.sftp.session.SftpRemoteFileTemplate; -import org.springframework.messaging.MessageHandler; -import org.springframework.stereotype.Component; - -import java.io.File; - -/** - *

SftpClientConfiguration

- *

SFTP client configuration

- * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2019-07-04 18:18 - **/ -@Data -@Component -@ConfigurationProperties(prefix = "sftp.client.configuration") -public class SftpClientConfiguration { - /** - * SFTP server IP - */ - private String host; - /** - * SFTP server port - */ - private Integer port; - /** - * Login user - */ - private String user; - /** - * Login password - */ - private String password; - /** - * Remote directory - */ - private String directory; - /** - * Private key - */ - private Resource privateKey; - /** - * Private key pass phrase - */ - private String privateKeyPassPhrase; - /** - * The maximum cache size of session. Default: 10 - */ - private Integer sessionCacheSize = 10; - /** - * The session wait timeout (time unit: MILLISECONDS). Default: 10 * 1000L (10 seconds) - */ - private Long sessionWaitTimeout = 10 * 1000L; - - @Bean - public SessionFactory sftpSessionFactory() { - val factory = new DefaultSftpSessionFactory(true); - factory.setHost(host); - factory.setPort(port); - factory.setUser(user); - if (privateKey != null) { - factory.setPrivateKey(privateKey); - factory.setPrivateKeyPassphrase(privateKeyPassPhrase); - } else { - factory.setPassword(password); - } - factory.setAllowUnknownKeys(true); - // We return a caching session factory, so that we don't have to reconnect to SFTP server for each time - val cachingSessionFactory = new CachingSessionFactory<>(factory, sessionCacheSize); - cachingSessionFactory.setSessionWaitTimeout(sessionWaitTimeout); - return cachingSessionFactory; - } - - @Bean - @ServiceActivator(inputChannel = "toSftpChannel") - @SuppressWarnings("UnresolvedMessageChannel") - public MessageHandler handler(SessionFactory sftpSessionFactory) { - val handler = new SftpMessageHandler(sftpSessionFactory); - handler.setRemoteDirectoryExpression(new LiteralExpression(directory)); - handler.setFileNameGenerator(message -> { - if (message.getPayload() instanceof File) { - return ((File) message.getPayload()).getName(); - } else { - throw new IllegalArgumentException("File expected as payload."); - } - }); - return handler; - } - - @Bean - public SftpRemoteFileTemplate template(SessionFactory sftpSessionFactory) { - return new SftpRemoteFileTemplate(sftpSessionFactory); - } -} diff --git a/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/configuration/SftpUploadGateway.java b/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/configuration/SftpUploadGateway.java deleted file mode 100644 index 8ad0a46d..00000000 --- a/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/configuration/SftpUploadGateway.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.jmsoftware.maf.apiportal.universal.configuration; - -import org.springframework.integration.annotation.Gateway; -import org.springframework.integration.annotation.MessagingGateway; -import org.springframework.stereotype.Component; - -import java.io.File; - -/** - *

SftpUploadGateway

- *

Change description here

- * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2019-07-04 21:03 - **/ -@Component -@MessagingGateway -public interface SftpUploadGateway { - /** - * Upload file - * - * @param file file - */ - @Gateway(requestChannel = "toSftpChannel") - @SuppressWarnings("UnresolvedMessageChannel") - void upload(File file); -} diff --git a/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/configuration/Swagger2Configuration.java b/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/configuration/Swagger2Configuration.java deleted file mode 100644 index b1bded5d..00000000 --- a/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/configuration/Swagger2Configuration.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.jmsoftware.maf.apiportal.universal.configuration; - -import lombok.RequiredArgsConstructor; -import lombok.val; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import springfox.documentation.builders.ApiInfoBuilder; -import springfox.documentation.builders.PathSelectors; -import springfox.documentation.builders.RequestHandlerSelectors; -import springfox.documentation.service.ApiInfo; -import springfox.documentation.service.Contact; -import springfox.documentation.spi.DocumentationType; -import springfox.documentation.spring.web.plugins.Docket; -import springfox.documentation.swagger2.annotations.EnableSwagger2; - -/** - *

Swagger2Configuration

- *

- * Swagger 2 Configuration - * Click me to view - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2019-02-07 16:15 - **/ -@Configuration -@EnableSwagger2 -@RequiredArgsConstructor -public class Swagger2Configuration { - private final ProjectProperty projectProperty; - private static final String LINE_SEPARATOR = System.lineSeparator(); - - @Bean - public Docket createRestApi() { - return new Docket(DocumentationType.SWAGGER_2) - .apiInfo(apiInfo()) - .select() - .apis(RequestHandlerSelectors.basePackage(projectProperty.getBasePackage())) - .paths(PathSelectors.any()) - .build(); - } - - private ApiInfo apiInfo() { - val projectArtifactId = projectProperty.getProjectArtifactId(); - val version = projectProperty.getVersion(); - val developerEmail = projectProperty.getDeveloperEmail(); - val developerUrl = projectProperty.getDeveloperUrl(); - return new ApiInfoBuilder() - .title(String.format("API for %s@%s", projectArtifactId, version)) - .description(String.format("%s %sArtifact ID: %s%sEnvironment: %s", - projectProperty.getDescription(), - LINE_SEPARATOR, - projectArtifactId, - LINE_SEPARATOR, - projectProperty.getEnvironment())) - .contact(new Contact(String.format("%s, email: %s%sHome page: %s", - projectProperty.getDeveloperName(), - developerEmail, - LINE_SEPARATOR, - developerUrl), - developerUrl, developerEmail)) - .version(version) - .build(); - } -} diff --git a/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/configuration/WebSecurityConfiguration.java b/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/configuration/WebSecurityConfiguration.java deleted file mode 100644 index de1cc2c4..00000000 --- a/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/configuration/WebSecurityConfiguration.java +++ /dev/null @@ -1,119 +0,0 @@ -package com.jmsoftware.maf.apiportal.universal.configuration; - -import com.jmsoftware.maf.apiportal.universal.filter.JwtAuthenticationFilter; -import com.jmsoftware.maf.apiportal.universal.service.impl.CustomUserDetailsServiceImpl; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import lombok.val; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.http.HttpMethod; -import org.springframework.security.authentication.AuthenticationManager; -import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; -import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.builders.WebSecurity; -import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; -import org.springframework.security.config.http.SessionCreationPolicy; -import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; -import org.springframework.security.web.AuthenticationEntryPoint; -import org.springframework.security.web.access.AccessDeniedHandler; -import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; - -import java.util.Optional; - -/** - *

WebSecurityConfiguration

- *

- * Security handler configuration. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 5/2/20 11:41 PM - **/ -@Slf4j -@Configuration -@EnableWebSecurity -@RequiredArgsConstructor -public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter { - private final CustomConfiguration customConfiguration; - private final AccessDeniedHandler accessDeniedHandler; - private final AuthenticationEntryPoint authenticationEntryPoint; - private final CustomUserDetailsServiceImpl customUserDetailsServiceImpl; - private final JwtAuthenticationFilter jwtAuthenticationFilter; - - @Bean - public BCryptPasswordEncoder encoder() { - return new BCryptPasswordEncoder(); - } - - @Bean - @Override - public AuthenticationManager authenticationManagerBean() throws Exception { - return super.authenticationManagerBean(); - } - - @Override - protected void configure(AuthenticationManagerBuilder auth) throws Exception { - auth.userDetailsService(customUserDetailsServiceImpl).passwordEncoder(encoder()); - } - - @Override - protected void configure(HttpSecurity http) throws Exception { - // Check if disable Web Security. - if (customConfiguration.getWebSecurityDisabled()) { - http.authorizeRequests().anyRequest().permitAll().and().csrf().disable(); - return; - } - - http.cors() - // Disable CSRF (Cross-site request forgery) - .and().csrf().disable() - // Disable form login to use custom login - .formLogin().disable() - .httpBasic().disable() - - // Allows restricting access based upon the HttpServletRequest - .authorizeRequests() - // RBAC URL authorization - .anyRequest() - .access("@rbacAuthorityServiceImpl.hasPermission(request,authentication)") - - // Disable logout to use custom logout - .and().logout().disable() - .sessionManagement() - // Disable session management - .sessionCreationPolicy(SessionCreationPolicy.STATELESS) - - // Exception handling - .and() - .exceptionHandling() - .accessDeniedHandler(accessDeniedHandler) - .authenticationEntryPoint(authenticationEntryPoint); - - // Add customized JWT filter - http.addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class); - } - - /** - * Add ignored HTTP request list - * Same as {@link #configure(HttpSecurity)} - * {@code http.authorizeRequests().antMatchers("/api/auth/**").permitAll()} - */ - @Override - public void configure(WebSecurity web) { - val and = web.ignoring().and(); - Optional.ofNullable(customConfiguration.getIgnoredRequest()) - .ifPresentOrElse((ignoredRequest -> { - ignoredRequest.getGet().forEach(url -> and.ignoring().antMatchers(HttpMethod.GET, url)); - ignoredRequest.getPost().forEach(url -> and.ignoring().antMatchers(HttpMethod.POST, url)); - ignoredRequest.getDelete().forEach(url -> and.ignoring().antMatchers(HttpMethod.DELETE, url)); - ignoredRequest.getPut().forEach(url -> and.ignoring().antMatchers(HttpMethod.PUT, url)); - ignoredRequest.getHead().forEach(url -> and.ignoring().antMatchers(HttpMethod.HEAD, url)); - ignoredRequest.getPatch().forEach(url -> and.ignoring().antMatchers(HttpMethod.PATCH, url)); - ignoredRequest.getOptions().forEach(url -> and.ignoring().antMatchers(HttpMethod.OPTIONS, url)); - ignoredRequest.getTrace().forEach(url -> and.ignoring().antMatchers(HttpMethod.TRACE, url)); - ignoredRequest.getPattern().forEach(url -> and.ignoring().antMatchers(url)); - }), () -> log.warn("Security warning: Ignored request is empty! The ignored request configuration " + - "might be invalid!")); - } -} diff --git a/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/controller/CommonController.java b/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/controller/CommonController.java deleted file mode 100644 index 4567e71a..00000000 --- a/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/controller/CommonController.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.jmsoftware.maf.apiportal.universal.controller; - -import com.jmsoftware.maf.apiportal.universal.domain.ValidationTestPayload; -import com.jmsoftware.maf.apiportal.universal.service.CommonService; -import com.jmsoftware.maf.common.bean.ResponseBodyBean; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; -import lombok.val; -import org.springframework.web.bind.annotation.*; - -import java.util.Map; - -/** - *

CommonController

- *

- * Change description here. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2/4/20 10:29 AM - **/ -@RestController -@RequiredArgsConstructor -@RequestMapping("/common") -@Api(tags = {"Common Controller"}) -public class CommonController { - private final CommonService commonService; - - @GetMapping("/app-info") - @ApiOperation(value = "/app-info", notes = "Retrieve application information") - public ResponseBodyBean> applicationInformation() { - val data = commonService.getApplicationInfo(); - return ResponseBodyBean.ofSuccess(data, "Succeed to retrieve app info."); - } - - @PostMapping("/validation-test") - @ApiOperation(value = "/validation-test", notes = "Validation of request payload test") - public ResponseBodyBean validationTest(@RequestBody ValidationTestPayload payload) { - commonService.validateObject(payload); - return ResponseBodyBean.ofSuccess(payload.getName(), "validationTest()"); - } - - @GetMapping("/get-jwt") - @ApiOperation(value = "/get-jwt", notes = "Get JWT") - public ResponseBodyBean getJwt(String username) { - return ResponseBodyBean.ofSuccess(commonService.generateJwt(username)); - } -} diff --git a/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/controller/ErrorController.java b/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/controller/ErrorController.java deleted file mode 100644 index dc90f00a..00000000 --- a/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/controller/ErrorController.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.jmsoftware.maf.apiportal.universal.controller; - -import io.swagger.annotations.Api; -import lombok.extern.slf4j.Slf4j; -import lombok.val; -import org.springframework.boot.autoconfigure.web.ServerProperties; -import org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController; -import org.springframework.boot.autoconfigure.web.servlet.error.ErrorViewResolver; -import org.springframework.boot.web.servlet.error.ErrorAttributes; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.RestController; - -import javax.servlet.http.HttpServletRequest; -import java.util.List; -import java.util.Map; -import java.util.Optional; - -/** - *

ErrorController

- *

- * Error controller. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2019-03-02 16:56 - **/ -@Slf4j -@RestController -@Api(tags = {"Error Controller"}) -public class ErrorController extends BasicErrorController { - public ErrorController(ErrorAttributes errorAttributes, - ServerProperties serverProperties, - List errorViewResolvers) { - super(errorAttributes, serverProperties.getError(), errorViewResolvers); - } - - @Override - public ResponseEntity> error(HttpServletRequest request) { - val httpStatus = getStatus(request); - val body = getErrorAttributes(request, isIncludeStackTrace(request, MediaType.ALL)); - body.put("message", httpStatus.getReasonPhrase()); - val optionalTrace = Optional.ofNullable(body.get("trace")); - optionalTrace.ifPresent(trace -> { - val message = body.get("message"); - val firstLineOfTrace = trace.toString().split("\\n")[0]; - val joinedMessage = String.format("%s %s", message, firstLineOfTrace); - body.put("message", joinedMessage); - body.put("trace", "Trace has been simplified. Refer to 'message'"); - }); - log.error("Captured HTTP request error. Response body = {}", body); - return new ResponseEntity<>(body, httpStatus); - } -} diff --git a/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/domain/SftpSubDirectory.java b/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/domain/SftpSubDirectory.java deleted file mode 100644 index f4d4fac8..00000000 --- a/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/domain/SftpSubDirectory.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.jmsoftware.maf.apiportal.universal.domain; - -import lombok.Getter; - -/** - *

SftpSubDirectory

- *

Reminder: if you want to add more custom sub directories in the future, please add en enum item in this class

- * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2019-07-04 23:10 - **/ -@Getter -public enum SftpSubDirectory { - /** - * Sub directory for video - */ - VIDEO("video", "/video/"), - /** - * Sub directory for avatar - */ - AVATAR("avatar", "/avatar/"); - - private final String directoryName; - private final String subDirectory; - - SftpSubDirectory(String directoryName, String subDirectory) { - this.directoryName = directoryName; - this.subDirectory = subDirectory; - } -} diff --git a/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/domain/ValidationTestPayload.java b/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/domain/ValidationTestPayload.java deleted file mode 100644 index 53584358..00000000 --- a/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/domain/ValidationTestPayload.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.jmsoftware.maf.apiportal.universal.domain; - -import lombok.Data; - -import javax.validation.constraints.Min; -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; - -/** - *

ValidationTestPayload

- *

- * Change description here. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2/14/20 11:34 AM - **/ -@Data -public class ValidationTestPayload { - @NotNull - @Min(value = 1L) - private Long id; - @NotEmpty - private String name; -} diff --git a/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/filter/JwtAuthenticationFilter.java b/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/filter/JwtAuthenticationFilter.java deleted file mode 100644 index 54718b75..00000000 --- a/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/filter/JwtAuthenticationFilter.java +++ /dev/null @@ -1,208 +0,0 @@ -package com.jmsoftware.maf.apiportal.universal.filter; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; -import com.jmsoftware.maf.apiportal.universal.configuration.CustomConfiguration; -import com.jmsoftware.maf.apiportal.universal.service.impl.CustomUserDetailsServiceImpl; -import com.jmsoftware.maf.apiportal.universal.service.impl.JwtServiceImpl; -import com.jmsoftware.maf.common.constant.HttpStatus; -import com.jmsoftware.maf.common.exception.SecurityException; -import com.jmsoftware.maf.muscleandfitnessserverspringbootstarter.util.RequestUtil; -import com.jmsoftware.maf.muscleandfitnessserverspringbootstarter.util.ResponseUtil; -import lombok.NonNull; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import lombok.val; -import org.springframework.http.HttpMethod; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.security.core.userdetails.UsernameNotFoundException; -import org.springframework.security.web.authentication.WebAuthenticationDetailsSource; -import org.springframework.security.web.util.matcher.AntPathRequestMatcher; -import org.springframework.stereotype.Component; -import org.springframework.web.filter.OncePerRequestFilter; - -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; -import java.util.HashSet; -import java.util.Optional; - -/** - *

JwtAuthenticationFilter

- *

Jwt Authentication Filter.

- * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2019-03-23 14:24 - **/ -@Slf4j -@Component -@RequiredArgsConstructor -public class JwtAuthenticationFilter extends OncePerRequestFilter { - private final CustomUserDetailsServiceImpl customUserDetailsServiceImpl; - private final JwtServiceImpl jwtServiceImpl; - private final CustomConfiguration customConfiguration; - - @Override - @SuppressWarnings("NullableProblems") - protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, - FilterChain filterChain) throws ServletException, IOException { - val requesterIpAndPort = RequestUtil.getRequestIpAndPort(request); - val method = request.getMethod(); - val requestUrl = request.getRequestURL(); - log.info("JWT authentication is filtering requester({}) access. Resource: [{}] {}", - requesterIpAndPort, method, requestUrl); - if (customConfiguration.getWebSecurityDisabled()) { - log.warn("The web security is disabled! Might face severe web security issue."); - filterChain.doFilter(request, response); - return; - } - if (checkIgnores(request)) { - log.info("The resource can be ignored. Resource: [{}] {}", method, requestUrl); - filterChain.doFilter(request, response); - return; - } - val passedJwtAuthentication = doJwtAuthentication(request, response); - if (!passedJwtAuthentication) { - log.warn("The requester did not pass JWT authentication. Requester: {}. Resource: [{}] {}", requesterIpAndPort, - method, requestUrl); - return; - } - try { - filterChain.doFilter(request, response); - } catch (Exception e) { - log.error("Exception occurred when filtering request. Exception message: {}", e.getMessage(), e); - val exception = recursiveTraverseExceptionCause(e); - if (exception instanceof SecurityException) { - val code = ((SecurityException) exception).getCode(); - final var httpStatus = HttpStatus.fromCode(code); - ResponseUtil.renderJson(response, httpStatus, exception.getMessage()); - return; - } - ResponseUtil.renderJson(response, HttpStatus.ERROR, e.getMessage()); - } - } - - /** - * Do JWT authentication. This method will not throw any exceptions. - * - * @param request the request - * @param response the response - * @return the boolean - * @author Johnny Miller (鍾俊), e-mail: johnnysviva@outlook.com - * @date 5 /13/20 5:30 PM - */ - private boolean doJwtAuthentication(HttpServletRequest request, HttpServletResponse response) { - val jwt = jwtServiceImpl.getJwtFromRequest(request); - if (StrUtil.isBlank(jwt)) { - log.error("Invalid JWT, the JWT of request is empty."); - ResponseUtil.renderJson(response, HttpStatus.UNAUTHORIZED, HttpStatus.UNAUTHORIZED.getMessage()); - return false; - } - String username; - try { - username = jwtServiceImpl.getUsernameFromJwt(jwt); - } catch (SecurityException e) { - log.error("Exception occurred when getting username from JWT. Exception message: {} JWT: {}", - e.getMessage(), jwt); - var httpStatus = HttpStatus.fromCode(e.getCode()); - ResponseUtil.renderJson(response, httpStatus, httpStatus.getMessage()); - return false; - } - UserDetails userDetails; - try { - userDetails = customUserDetailsServiceImpl.loadUserByUsername(username); - } catch (Exception e) { - log.error("Exception occurred when loading user by username! Exception message: {} Username: {}", - e.getMessage(), username); - if (e instanceof UsernameNotFoundException) { - ResponseUtil.renderJson(response, HttpStatus.UNAUTHORIZED, HttpStatus.UNAUTHORIZED.getMessage()); - return false; - } - ResponseUtil.renderJson(response, HttpStatus.ERROR, e.getMessage()); - return false; - } - val authentication = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities()); - authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); - log.info("JWT authentication passed! Authentication: {}", authentication); - SecurityContextHolder.getContext().setAuthentication(authentication); - return true; - } - - /** - * Check if current request needs to be ignored. (Permission interception) - * - * @param request Current request - * @return true - Ignored, false - Not ignored - */ - private boolean checkIgnores(HttpServletRequest request) { - val method = request.getMethod(); - var httpMethod = HttpMethod.resolve(method); - if (ObjectUtil.isNull(httpMethod)) { - httpMethod = HttpMethod.GET; - } - val ignoredRequestSet = new HashSet(); - val finalHttpMethod = httpMethod; - Optional.ofNullable(customConfiguration.getIgnoredRequest()) - .ifPresentOrElse((ignoredRequest -> { - ignoredRequestSet.addAll(ignoredRequest.getPattern()); - switch (finalHttpMethod) { - case GET: - ignoredRequestSet.addAll(ignoredRequest.getGet()); - break; - case PUT: - ignoredRequestSet.addAll(ignoredRequest.getPut()); - break; - case HEAD: - ignoredRequestSet.addAll(ignoredRequest.getHead()); - break; - case POST: - ignoredRequestSet.addAll(ignoredRequest.getPost()); - break; - case PATCH: - ignoredRequestSet.addAll(ignoredRequest.getPatch()); - break; - case TRACE: - ignoredRequestSet.addAll(ignoredRequest.getTrace()); - break; - case DELETE: - ignoredRequestSet.addAll(ignoredRequest.getDelete()); - break; - case OPTIONS: - ignoredRequestSet.addAll(ignoredRequest.getOptions()); - break; - default: - break; - } - }), () -> log.warn("Security warning: Ignored request is empty! The ignored request configuration " + - "might be invalid!")); - if (CollUtil.isNotEmpty(ignoredRequestSet)) { - for (val ignore : ignoredRequestSet) { - val matcher = new AntPathRequestMatcher(ignore, method); - if (matcher.matches(request)) { - return true; - } - } - } - return false; - } - - /** - * Recursive traverse exception cause exception. - * - * @param exception the exception - * @return the exception - * @author Johnny Miller (鍾俊), e-mail: johnnysviva@outlook.com - * @date 5/13/20 4:51 PM - */ - private Exception recursiveTraverseExceptionCause(@NonNull Exception exception) { - if (ObjectUtil.isNotNull(exception.getCause())) { - return recursiveTraverseExceptionCause((Exception) exception.getCause()); - } - return exception; - } -} diff --git a/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/service/CommonService.java b/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/service/CommonService.java deleted file mode 100644 index 3b123344..00000000 --- a/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/service/CommonService.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.jmsoftware.maf.apiportal.universal.service; - -import com.jmsoftware.maf.apiportal.universal.domain.ValidationTestPayload; -import org.springframework.validation.annotation.Validated; - -import javax.validation.Valid; -import java.util.Map; - -/** - *

CommonService

- *

- * Change description here. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2/4/20 11:15 AM - */ -@Validated -public interface CommonService { - /** - * Gets application info. - * - * @return the application info. - */ - Map getApplicationInfo(); - - /** - * Validate object. - * - * @param payload the payload - */ - void validateObject(@Valid ValidationTestPayload payload); - - /** - * Generate jwt string. - * - * @param username the username - * @return the string - */ - String generateJwt(String username); -} diff --git a/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/service/JwtService.java b/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/service/JwtService.java deleted file mode 100644 index 86735c9f..00000000 --- a/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/service/JwtService.java +++ /dev/null @@ -1,81 +0,0 @@ -package com.jmsoftware.maf.apiportal.universal.service; - -import com.jmsoftware.maf.common.exception.SecurityException; -import io.jsonwebtoken.Claims; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.GrantedAuthority; - -import javax.servlet.http.HttpServletRequest; -import java.util.Collection; -import java.util.List; - -/** - *

JwtService

- *

- * Change description here. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 5/7/20 5:15 PM - */ -public interface JwtService { - /** - * Create JWT string. - * - * @param authentication the authentication - * @param rememberMe the remember me - * @return the string - */ - String createJwt(Authentication authentication, Boolean rememberMe) throws SecurityException; - - /** - * Create JWT string. - * - * @param rememberMe the remember me - * @param id the user ID - * @param subject the username - * @param roles the roles - * @param authorities the authorities - * @return the JWT string - */ - String createJwt(Boolean rememberMe, Long id, String subject, List roles, Collection authorities) throws SecurityException; - - /** - * Parse JWT. - * - * @param jwt the jwt - * @return the claims - */ - Claims parseJwt(String jwt) throws SecurityException; - - /** - * Invalidate jwt. - * - * @param request the request - */ - void invalidateJwt(HttpServletRequest request) throws SecurityException; - - /** - * Gets username from jwt. - * - * @param jwt the jwt - * @return the username from jwt - */ - String getUsernameFromJwt(String jwt) throws SecurityException; - - /** - * Gets username from request. - * - * @param request the request - * @return the username from request - */ - String getUsernameFromRequest(HttpServletRequest request) throws SecurityException; - - /** - * Gets jwt from request. - * - * @param request the request - * @return the jwt from request - */ - String getJwtFromRequest(HttpServletRequest request); -} diff --git a/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/service/RbacAuthorityService.java b/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/service/RbacAuthorityService.java deleted file mode 100644 index 03e105b5..00000000 --- a/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/service/RbacAuthorityService.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.jmsoftware.maf.apiportal.universal.service; - -import org.springframework.security.core.Authentication; - -import javax.servlet.http.HttpServletRequest; - -/** - *

RbacAuthorityService

- *

Route Authority service interface

- * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2019-04-07 19:52 - **/ -public interface RbacAuthorityService { - /** - * Check whether the user from request has permission - * - * @param request HTTP request - * @param authentication authentication - * @return true - the user has permission; false - the user do not have permission - */ - boolean hasPermission(HttpServletRequest request, Authentication authentication); -} diff --git a/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/service/RedisService.java b/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/service/RedisService.java deleted file mode 100644 index ece5168c..00000000 --- a/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/service/RedisService.java +++ /dev/null @@ -1,107 +0,0 @@ -package com.jmsoftware.maf.apiportal.universal.service; - -import java.io.Serializable; -import java.util.Collection; -import java.util.List; -import java.util.concurrent.TimeUnit; - -/** - *

RedisService

- *

Redis service interface for Redis useful operations

- * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2019-07-05 09:38 - **/ -public interface RedisService { - /** - * Set key and value in Redis with expiration - * - * @param key key - * @param value value - * @param expirationTime expiration time - * @param timeUnit time unit - * @return true - operation done; false - operation failure - */ - Boolean set(String key, String value, Long expirationTime, TimeUnit timeUnit); - - /** - * Set key and list in Redis with expiration - * - * @param key key - * @param list list - * @param expirationTime expiration time - * @param timeUnit time unit - * @return true - operation done; false - operation failure - */ - Boolean set(String key, List list, Long expirationTime, TimeUnit timeUnit); - - /** - * Set key and value in Redis - * - * @param key key - * @param value value - * @return true - operation done; false - operation failure - */ - Boolean set(String key, String value); - - /** - * Set key and list in Redis - * - * @param key key - * @param list list - * @return true - operation done; false - operation failure - */ - Boolean set(String key, List list); - - /** - * Make key expire - * - * @param key key - * @param expirationTime expiration time - * @param timeUnit time unit - * @return true - operation done; false - operation failure - */ - Boolean expire(String key, long expirationTime, TimeUnit timeUnit); - - /** - * Get expiration time by key - * - * @param key key - * @param timeUnit time unit - * @return expiration time. Null when used in pipeline / transaction. - */ - Long getExpire(String key, TimeUnit timeUnit); - - /** - * Get value by key - * - * @param key key - * @return null when key does not exist or used in pipeline / transaction. - */ - String get(String key); - - /** - * Get list by key - * - * @param key key - * @param clazz type - * @return null when key does not exist or used in pipeline / transaction. - */ - List get(String key, Class clazz); - - /** - * Delete by key - * - * @param key key - * @return the number of keys that were removed. Null when used in pipeline / transaction. - */ - Long delete(String key); - - /** - * Delete by keys - * - * @param keys key list - * @return the number of keys that were removed. Null when used in pipeline / transaction. - */ - Long delete(Collection keys); -} diff --git a/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/service/SftpService.java b/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/service/SftpService.java deleted file mode 100644 index 273bfc88..00000000 --- a/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/service/SftpService.java +++ /dev/null @@ -1,105 +0,0 @@ -package com.jmsoftware.maf.apiportal.universal.service; - -import com.jmsoftware.maf.apiportal.universal.domain.SftpUploadFile; -import org.springframework.integration.file.support.FileExistsMode; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.multipart.MultipartFile; - -import javax.validation.Valid; -import java.io.IOException; -import java.io.InputStream; -import java.util.List; - -/** - *

SftpService

- *

SFTP service interface

- * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2019-07-04 20:35 - **/ -@Validated -public interface SftpService { - /** - * List all files under the full path - * - * @param fullPath directory full path - * @return file names - */ - List listFiles(String fullPath); - - /** - * Check whether file exists according to file path - * - * @param fileFullPath file's full path - * @return true - file exists; false - file not exists - */ - boolean exist(String fileFullPath); - - /** - * Get file size - * - * @param fileFullPath file's full path - * @return file size (size unit: byte). Null if the file does not exist or path refers to a directory - * @throws IllegalArgumentException when file does not exist - */ - Long getFileSize(String fileFullPath) throws IllegalArgumentException; - - /** - * Upload single file - * - * @param sftpUploadFile encapsulated object - * @return file's full path if successful, else null - */ - String upload(@Valid SftpUploadFile sftpUploadFile); - - /** - * Upload file - * - * @param multipartFile multipart file - * @param subDirectory SFTP server's sub directory (if sub directory doesn't exist, will be auto created). Not - * empty and it looks like this: "/some/sub/directory/" - * @param fileExistsMode This enumeration indicates what action shall be taken in case the destination file - * already exists. In default, it should be set as: FileExistsMode.REPLACE - * @param deleteSource true - delete source file; false - not delete source file - * @return file's full path if successful, else null - * @throws IOException IO exception - */ - String upload(MultipartFile multipartFile, - String subDirectory, - FileExistsMode fileExistsMode, - boolean deleteSource) throws IOException; - - /** - * Upload files - * - * @param files file list - * @throws IOException IO exception - */ - void upload(List files) throws IOException; - - /** - * Upload files - * - * @param files file list - * @param deleteSource true - delete source file; false - not delete source file - * @throws IOException IO exception - */ - void upload(List files, boolean deleteSource) throws IOException; - - /** - * Read file from SFTP server - * - * @param fileFullPath file's full path - * @return file's stream - * @throws IllegalArgumentException when file does not exist - */ - InputStream read(String fileFullPath) throws IllegalArgumentException; - - /** - * Delete file according to file path - * - * @param fileFullPath file's full path - * @return true - file deleted; false - file not deleted - */ - boolean delete(String fileFullPath); -} diff --git a/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/service/impl/CommonServiceImpl.java b/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/service/impl/CommonServiceImpl.java deleted file mode 100644 index 19b2605b..00000000 --- a/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/service/impl/CommonServiceImpl.java +++ /dev/null @@ -1,131 +0,0 @@ -package com.jmsoftware.maf.apiportal.universal.service.impl; - -import com.google.common.collect.Lists; -import com.jmsoftware.maf.apiportal.universal.configuration.ProjectProperty; -import com.jmsoftware.maf.apiportal.universal.domain.ValidationTestPayload; -import com.jmsoftware.maf.apiportal.universal.service.CommonService; -import lombok.RequiredArgsConstructor; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import javax.validation.Valid; -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - *

CommonServiceImpl

- *

- * Change description here. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2/4/20 11:16 AM - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class CommonServiceImpl implements CommonService { - private final ProjectProperty projectProperty; - private final JwtServiceImpl jwtServiceImpl; - - @Override - public Map getApplicationInfo() { - var map = new HashMap(16); - var fieldsInfo = getFieldsInfo(projectProperty); - fieldsInfo.forEach(fieldInfo -> { - var type = fieldInfo.get("type"); - if ("class java.lang.String".equals(type)) { - map.put((String) fieldInfo.get("name"), fieldInfo.get("value")); - } - }); - return map; - } - - @Override - public void validateObject(@Valid ValidationTestPayload payload) { - log.info("Validation passed! {}", payload); - } - - @Override - @SneakyThrows - public String generateJwt(String username) { - return jwtServiceImpl.createJwt(false, Long.MAX_VALUE, username, Lists.newLinkedList(), Lists.newLinkedList()); - } - - /** - * Gets field value by name. - * - * @param fieldName the field name - * @param object the object - * @return the field value by name - * @see Java 中遍历一个对象的所有属性 - */ - private Object getFieldValueByName(String fieldName, Object object) { - try { - String firstLetter = fieldName.substring(0, 1).toUpperCase(); - String getter = "get" + firstLetter + fieldName.substring(1); - Method method = object.getClass().getMethod(getter); - return method.invoke(object); - } catch (Exception e) { - log.error("Can't get field's value by name! Cause: {}", e.getMessage()); - return null; - } - } - - /** - * Get filed name string [ ]. - * - * @param o the o - * @return the string [ ] - * @see Java 中遍历一个对象的所有属性 - */ - private String[] getFiledName(Object o) { - Field[] fields = o.getClass().getDeclaredFields(); - String[] fieldNames = new String[fields.length]; - for (int i = 0; i < fields.length; i++) { - log.info("fields[i].getType(): {}", fields[i].getType()); - fieldNames[i] = fields[i].getName(); - } - return fieldNames; - } - - /** - * Get Fields Info - * - * @param o the o - * @return the fields info - * @see Java 中遍历一个对象的所有属性 - */ - private List> getFieldsInfo(Object o) { - Field[] fields = o.getClass().getDeclaredFields(); - var arrayList = new ArrayList>(); - for (Field field : fields) { - var infoMap = new HashMap(16); - infoMap.put("type", field.getType().toString()); - infoMap.put("name", field.getName()); - infoMap.put("value", getFieldValueByName(field.getName(), o)); - arrayList.add(infoMap); - } - return arrayList; - } - - /** - * Get Filed Values - * - * @param o the o - * @return the object [ ] - * @see Java 中遍历一个对象的所有属性 - */ - public Object[] getFiledValues(Object o) { - String[] fieldNames = this.getFiledName(o); - Object[] value = new Object[fieldNames.length]; - for (int i = 0; i < fieldNames.length; i++) { - value[i] = this.getFieldValueByName(fieldNames[i], o); - } - return value; - } -} diff --git a/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/service/impl/CustomUserDetailsServiceImpl.java b/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/service/impl/CustomUserDetailsServiceImpl.java deleted file mode 100644 index 18dd03c8..00000000 --- a/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/service/impl/CustomUserDetailsServiceImpl.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.jmsoftware.maf.apiportal.universal.service.impl; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.ObjectUtil; -import com.jmsoftware.maf.apiportal.remoteapi.AuthCenterRemoteApi; -import com.jmsoftware.maf.apiportal.universal.domain.UserPrincipal; -import com.jmsoftware.maf.common.constant.HttpStatus; -import com.jmsoftware.maf.common.domain.authcenter.permission.GetPermissionListByRoleIdListPayload; -import com.jmsoftware.maf.common.domain.authcenter.role.GetRoleListByUserIdPayload; -import com.jmsoftware.maf.common.domain.authcenter.role.GetRoleListByUserIdResponse; -import com.jmsoftware.maf.common.domain.authcenter.user.GetUserByLoginTokenPayload; -import com.jmsoftware.maf.common.exception.SecurityException; -import lombok.RequiredArgsConstructor; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import lombok.val; -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.security.core.userdetails.UserDetailsService; -import org.springframework.security.core.userdetails.UsernameNotFoundException; -import org.springframework.stereotype.Service; - -import java.util.stream.Collectors; - -/** - *

CustomUserDetailsServiceImpl

- *

Custom user detail service.

- * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2019-03-03 13:40 - **/ -@Slf4j -@Service -@RequiredArgsConstructor -public class CustomUserDetailsServiceImpl implements UserDetailsService { - private final AuthCenterRemoteApi authCenterRemoteApi; - - @Override - @SneakyThrows - public UserDetails loadUserByUsername(String credentials) throws UsernameNotFoundException { - val getUserByLoginTokenPayload = new GetUserByLoginTokenPayload(); - getUserByLoginTokenPayload.setLoginToken(credentials); - val getUserByLoginTokenResponseResponseBody = - authCenterRemoteApi.getUserByLoginToken(getUserByLoginTokenPayload); - val getUserByLoginTokenResponse = getUserByLoginTokenResponseResponseBody.getData(); - if (ObjectUtil.isNull(getUserByLoginTokenResponse)) { - val errorMessage = String.format("User's account not found, credentials: %s", credentials); - log.error(errorMessage); - throw new UsernameNotFoundException(errorMessage); - } - val getRoleListByUserIdPayload = new GetRoleListByUserIdPayload(); - getRoleListByUserIdPayload.setUserId(getUserByLoginTokenResponse.getId()); - val getRoleListByUserIdResponseResponseBody = - authCenterRemoteApi.getRoleListByUserId(getRoleListByUserIdPayload); - val roleList = getRoleListByUserIdResponseResponseBody.getData().getRoleList(); - if (CollUtil.isEmpty(roleList)) { - throw new SecurityException(HttpStatus.ROLE_NOT_FOUND); - } - val getPermissionListByRoleIdListPayload = new GetPermissionListByRoleIdListPayload(); - roleList.forEach(role -> getPermissionListByRoleIdListPayload.getRoleIdList().add(role.getId())); - val permissionListByRoleIdListResponseBody = - authCenterRemoteApi.getPermissionListByRoleIdList(getPermissionListByRoleIdListPayload); - val roleNameList = - roleList.stream().map(GetRoleListByUserIdResponse.Role::getName).collect(Collectors.toList()); - return UserPrincipal.create(getUserByLoginTokenResponse, roleNameList, - permissionListByRoleIdListResponseBody.getData().getPermissionList()); - } -} diff --git a/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/service/impl/RbacAuthorityServiceImpl.java b/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/service/impl/RbacAuthorityServiceImpl.java deleted file mode 100644 index 18f2e275..00000000 --- a/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/service/impl/RbacAuthorityServiceImpl.java +++ /dev/null @@ -1,143 +0,0 @@ -package com.jmsoftware.maf.apiportal.universal.service.impl; - -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; -import com.google.common.collect.ArrayListMultimap; -import com.google.common.collect.LinkedListMultimap; -import com.google.common.collect.Multimap; -import com.jmsoftware.maf.apiportal.remoteapi.AuthCenterRemoteApi; -import com.jmsoftware.maf.apiportal.universal.configuration.CustomConfiguration; -import com.jmsoftware.maf.apiportal.universal.domain.UserPrincipal; -import com.jmsoftware.maf.apiportal.universal.service.RbacAuthorityService; -import com.jmsoftware.maf.common.constant.HttpStatus; -import com.jmsoftware.maf.common.domain.authcenter.permission.GetPermissionListByUserIdPayload; -import com.jmsoftware.maf.common.domain.authcenter.permission.PermissionType; -import com.jmsoftware.maf.common.exception.SecurityException; -import lombok.RequiredArgsConstructor; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import lombok.val; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.security.web.util.matcher.AntPathRequestMatcher; -import org.springframework.stereotype.Service; -import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; - -import javax.servlet.http.HttpServletRequest; -import java.util.stream.Collectors; - -/** - *

RbacAuthorityServiceImpl

- *

Route Authority service implementation

- * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2019-03-23 14:25 - **/ -@Slf4j -@Service -@RequiredArgsConstructor -public class RbacAuthorityServiceImpl implements RbacAuthorityService { - private final AuthCenterRemoteApi authCenterRemoteApi; - private final RequestMappingHandlerMapping mapping; - private final CustomConfiguration customConfiguration; - private final JwtServiceImpl jwtServiceImpl; - - @Override - @SneakyThrows - public boolean hasPermission(HttpServletRequest request, Authentication authentication) { - String username; - try { - username = jwtServiceImpl.getUsernameFromRequest(request); - } catch (SecurityException e) { - log.error("Exception occurred when getting username from request. Exception message: {}", e.getMessage()); - throw e; - } - // Super user has no restriction on any requests. - if (customConfiguration.getSuperUser().equals(username)) { - log.info("Superuser(username: {}) can access any resource.", username); - return true; - } - this.checkRequest(request); - val principal = authentication.getPrincipal(); - if (!(principal instanceof UserDetails)) { - log.error("Invalid user principal. {}", principal); - return false; - } - val userPrincipal = (UserPrincipal) principal; - val userId = userPrincipal.getId(); - val getPermissionListByUserIdPayload = new GetPermissionListByUserIdPayload(); - getPermissionListByUserIdPayload.setUserId(userId); - val getPermissionListByUserIdResponse = - authCenterRemoteApi.getPermissionListByUserId(getPermissionListByUserIdPayload); - val permissionList = getPermissionListByUserIdResponse.getData().getPermissionList(); - // Filter button permission for frond-end - val buttonPermissionList = permissionList.stream() - // Sieve out page permissions - .filter(permission -> ObjectUtil.equal(permission.getType(), - PermissionType.BUTTON.getType())) - // Sieve out permission that has no URL - .filter(permission -> StrUtil.isNotBlank(permission.getUrl())) - // Sieve out permission that has no method - .filter(permission -> StrUtil.isNotBlank(permission.getMethod())) - .collect(Collectors.toList()); - for (val buttonPermission : buttonPermissionList) { - // TODO: check is AntPathRequestMatcher supports RESTFul request - val antPathMatcher = new AntPathRequestMatcher(buttonPermission.getUrl(), buttonPermission.getMethod()); - if (antPathMatcher.matches(request)) { - log.info("Resource [{}] {} is accessible for user(username: {})", request.getMethod(), - request.getRequestURL(), username); - return true; - } - } - log.warn("Resource [{}] {} is not accessible for user(username: {})", request.getMethod(), - request.getRequestURL(), username); - return false; - } - - /** - * Check request. - * - * @param request HTTP Request - */ - @SneakyThrows - private void checkRequest(HttpServletRequest request) { - val currentMethod = request.getMethod(); - val urlMapping = allUrlMapping(); - for (String uri : urlMapping.keySet()) { - // 通过 AntPathRequestMatcher 匹配 url - // 可以通过 2 种方式创建 AntPathRequestMatcher - // 1:new AntPathRequestMatcher(uri,method) 这种方式可以直接判断方法是否匹配, - // 因为这里我们把 方法不匹配 自定义抛出,所以,我们使用第2种方式创建 - // 2:new AntPathRequestMatcher(uri) 这种方式不校验请求方法,只校验请求路径 - val antPathMatcher = new AntPathRequestMatcher(uri); - if (antPathMatcher.matches(request)) { - if (!urlMapping.get(uri).contains(currentMethod)) { - throw new SecurityException(HttpStatus.METHOD_NOT_ALLOWED); - } else { - return; - } - } - } - throw new SecurityException(HttpStatus.NOT_FOUND); - } - - /** - * 获取 所有URL Mapping,返回格式为{"/test":["GET","POST"],"/sys":["GET","DELETE"]} - * - * @return {@link ArrayListMultimap} 格式的 URL Mapping - */ - private Multimap allUrlMapping() { - Multimap urlMapping = LinkedListMultimap.create(); - // 获取url与类和方法的对应信息 - val handlerMethods = mapping.getHandlerMethods(); - handlerMethods.forEach((key, value) -> { - // 获取当前 key 下的获取所有URL - val url = key.getPatternsCondition().getPatterns(); - val method = key.getMethodsCondition(); - // 为每个URL添加所有的请求方法 - url.forEach(item -> urlMapping.putAll(item, - method.getMethods().stream().map(Enum::toString).collect(Collectors.toList()))); - }); - return urlMapping; - } -} diff --git a/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/service/impl/RedisServiceImpl.java b/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/service/impl/RedisServiceImpl.java deleted file mode 100644 index b6e5352d..00000000 --- a/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/service/impl/RedisServiceImpl.java +++ /dev/null @@ -1,111 +0,0 @@ -package com.jmsoftware.maf.apiportal.universal.service.impl; - -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; -import cn.hutool.json.JSONUtil; -import com.jmsoftware.maf.apiportal.universal.service.RedisService; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.data.redis.connection.RedisStringCommands; -import org.springframework.data.redis.core.RedisCallback; -import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.data.redis.core.types.Expiration; -import org.springframework.data.redis.serializer.RedisSerializer; -import org.springframework.stereotype.Service; - -import java.io.Serializable; -import java.util.Collection; -import java.util.List; -import java.util.Objects; -import java.util.concurrent.TimeUnit; - -/** - *

RedisServiceImpl

- *

Redis service implementation for Redis useful operations

- * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2019-07-05 09:39 - **/ -@Service -public class RedisServiceImpl implements RedisService { - private final RedisTemplate redisTemplate; - - public RedisServiceImpl(@Qualifier("redisFactory") RedisTemplate redisTemplate) { - this.redisTemplate = redisTemplate; - } - - @Override - public Boolean set(String key, String value, Long expirationTime, TimeUnit timeUnit) { - return redisTemplate.execute((RedisCallback) connection -> { - RedisSerializer serializer = redisTemplate.getStringSerializer(); - Boolean result = connection.set(Objects.requireNonNull(serializer.serialize(key)), - Objects.requireNonNull(serializer.serialize(value)), - Expiration.from(expirationTime, timeUnit), - RedisStringCommands.SetOption.upsert()); - return ObjectUtil.isNotNull(result) ? result : false; - }); - } - - @Override - public Boolean set(String key, List list, Long expirationTime, TimeUnit timeUnit) { - String value = JSONUtil.toJsonStr(list); - return set(key, value, expirationTime, timeUnit); - } - - @Override - public Boolean set(String key, String value) { - return redisTemplate.execute((RedisCallback) connection -> { - RedisSerializer serializer = redisTemplate.getStringSerializer(); - Boolean result = connection.set(Objects.requireNonNull(serializer.serialize(key)), - Objects.requireNonNull(serializer.serialize(value))); - return ObjectUtil.isNotNull(result) ? result : false; - }); - } - - @Override - public Boolean set(String key, List list) { - String value = JSONUtil.toJsonStr(list); - return set(key, value); - } - - @Override - public Boolean expire(String key, long expirationTime, TimeUnit timeUnit) { - Boolean result = redisTemplate.expire(key, expirationTime, timeUnit); - return ObjectUtil.isNotNull(result) ? result : false; - } - - @Override - public Long getExpire(String key, TimeUnit timeUnit) { - return redisTemplate.getExpire(key, timeUnit); - } - - @Override - public String get(String key) { - return redisTemplate.execute((RedisCallback) connection -> { - RedisSerializer serializer = redisTemplate.getStringSerializer(); - byte[] bytes = connection.get(Objects.requireNonNull(serializer.serialize(key))); - return serializer.deserialize(bytes); - }); - } - - @Override - public List get(String key, Class clazz) { - String json = get(key); - if (StrUtil.isNotBlank(json)) { - return JSONUtil.toList(JSONUtil.parseArray(json), clazz); - } - return null; - } - - @Override - public Long delete(String key) { - return redisTemplate.execute((RedisCallback) connection -> { - RedisSerializer serializer = redisTemplate.getStringSerializer(); - return connection.del(serializer.serialize(key)); - }); - } - - @Override - public Long delete(Collection keys) { - return redisTemplate.delete(keys); - } -} diff --git a/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/service/impl/SftpServiceImpl.java b/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/service/impl/SftpServiceImpl.java deleted file mode 100644 index 882cf871..00000000 --- a/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/service/impl/SftpServiceImpl.java +++ /dev/null @@ -1,172 +0,0 @@ -package com.jmsoftware.maf.apiportal.universal.service.impl; - -import com.jcraft.jsch.ChannelSftp; -import com.jmsoftware.maf.apiportal.universal.configuration.SftpClientConfiguration; -import com.jmsoftware.maf.apiportal.universal.configuration.SftpUploadGateway; -import com.jmsoftware.maf.apiportal.universal.domain.SftpUploadFile; -import com.jmsoftware.maf.apiportal.universal.service.SftpService; -import com.jmsoftware.maf.muscleandfitnessserverspringbootstarter.util.FileUtil; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.BeanFactory; -import org.springframework.expression.common.LiteralExpression; -import org.springframework.integration.file.support.FileExistsMode; -import org.springframework.integration.sftp.session.SftpRemoteFileTemplate; -import org.springframework.messaging.Message; -import org.springframework.messaging.support.MessageBuilder; -import org.springframework.stereotype.Service; -import org.springframework.web.multipart.MultipartFile; - -import javax.validation.Valid; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.util.Arrays; -import java.util.List; - -/** - *

SftpServiceImpl

- *

SFTP Service implementation

- * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2019-07-04 20:47 - **/ -@Slf4j -@Service -@RequiredArgsConstructor -public class SftpServiceImpl implements SftpService { - private final SftpRemoteFileTemplate sftpRemoteFileTemplate; - private final SftpUploadGateway sftpUploadGateway; - private final SftpClientConfiguration sftpClientConfiguration; - private final BeanFactory beanFactory; - - @Override - public List listFiles(String fullPath) { - log.info("Listing files, full path: {}", fullPath); - return sftpRemoteFileTemplate.execute(session -> { - String[] strings = new String[0]; - try { - strings = session.listNames(fullPath); - } catch (IOException e) { - log.error("Exception occurred when listing files. Exception message: {}", e.getMessage(), e); - } - return Arrays.asList(strings); - }); - } - - @Override - public boolean exist(String fileFullPath) { - log.info("Checking whether file exists in SFTP server, file full path: {}", fileFullPath); - return sftpRemoteFileTemplate.execute(session -> session.exists(fileFullPath)); - } - - @Override - public Long getFileSize(String fileFullPath) throws IllegalArgumentException { - if (!exist(fileFullPath)) { - throw new IllegalArgumentException( - "Cannot get file size from SFTP server. Caused by: file does not exist, full path: " + fileFullPath); - } - String[] splits = fileFullPath.split("/"); - String fileName = splits[splits.length - 1]; - String listPath = fileFullPath.substring(0, fileFullPath.lastIndexOf(fileName) - 1); - log.info("Retrieve file size from SFTP server, full path: {}", fileFullPath); - final Long[] fileSize = new Long[1]; - sftpRemoteFileTemplate.execute(session -> { - ChannelSftp.LsEntry[] lsEntries = session.list(listPath); - for (ChannelSftp.LsEntry lsEntry : lsEntries) { - if (lsEntry.getFilename().equals(fileName)) { - fileSize[0] = lsEntry.getAttrs().getSize(); - } - } - return null; - }); - return fileSize[0]; - } - - @Override - public String upload(@Valid SftpUploadFile sftpUploadFile) { - log.info("Uploading single file to SFTP server. SftpUploadFile: {}", sftpUploadFile); - Message message = MessageBuilder.withPayload(sftpUploadFile.getFileToBeUploaded()).build(); - sftpRemoteFileTemplate.setRemoteDirectoryExpression( - new LiteralExpression(sftpClientConfiguration.getDirectory())); - sftpRemoteFileTemplate.setAutoCreateDirectory(true); - sftpRemoteFileTemplate.setBeanFactory(beanFactory); - // sftpRemoteFileTemplate.setCharset("UTF-8"); - sftpRemoteFileTemplate.afterPropertiesSet(); - return sftpRemoteFileTemplate.send(message, - sftpUploadFile.getSubDirectory(), - sftpUploadFile.getFileExistsMode()); - } - - @Override - @SuppressWarnings("ResultOfMethodCallIgnored") - public String upload(MultipartFile multipartFile, - String subDirectory, - FileExistsMode fileExistsMode, - boolean deleteSource) throws IOException { - log.info("Uploading single multipart file to SFTP server. File name: {}", multipartFile.getOriginalFilename()); - File file = FileUtil.convertFrom(multipartFile); - SftpUploadFile sftpUploadFile = SftpUploadFile - .builder() - .fileToBeUploaded(file) - .subDirectory(subDirectory) - .fileExistsMode(fileExistsMode) - .build(); - String fileFullPath = this.upload(sftpUploadFile); - if (deleteSource) { - file.delete(); - } - return fileFullPath; - } - - @Override - public void upload(List files) throws IOException { - upload(files, true); - } - - @Override - @SuppressWarnings("ResultOfMethodCallIgnored") - public void upload(List files, boolean deleteSource) throws IOException { - log.info("Uploading multipart files to SFTP server (delete source file: {}). Files: {}", deleteSource, files); - for (MultipartFile multipartFile : files) { - if (multipartFile.isEmpty()) { - continue; - } - File file = FileUtil.convertFrom(multipartFile); - sftpUploadGateway.upload(file); - if (deleteSource) { - file.delete(); - } - } - } - - @Override - public InputStream read(String fileFullPath) throws IllegalArgumentException { - log.info("Read file from SFTP server, file full path: {}", fileFullPath); - return sftpRemoteFileTemplate.execute(session -> { - boolean existFile = session.exists(fileFullPath); - if (existFile) { - return session.readRaw(fileFullPath); - } - log.error("Cannot read file from SFTP 'server. Caused by : file does not exist, full path: {}", - fileFullPath); - throw new IllegalArgumentException( - "Cannot read file from SFTP 'server. Caused by : file does not exist, full path: " + fileFullPath); - }); - } - - @Override - public boolean delete(String fileFullPath) { - log.info("Deleting SFTP server's file by file full path: {}", fileFullPath); - return sftpRemoteFileTemplate.execute(session -> { - boolean existFile = session.exists(fileFullPath); - if (existFile) { - return session.remove(fileFullPath); - } else { - log.info("Cannot delete SFTP server's file. Caused by: file does not exist, full path: {} ", - fileFullPath); - return false; - } - }); - } -} diff --git a/api-portal/src/main/resources/application-development-docker.yml b/api-portal/src/main/resources/application-development-docker.yml deleted file mode 100644 index 674eae8a..00000000 --- a/api-portal/src/main/resources/application-development-docker.yml +++ /dev/null @@ -1,68 +0,0 @@ -eureka: - client: - serviceUrl: - defaultZone: http://maf.service-registry.dev:8760/eureka/ - -spring: - zipkin: - base-url: http://maf.open-zipkin.dev:9411 - datasource: - name: muscle_and_fitness - driver-class-name: com.mysql.cj.jdbc.Driver - type: com.alibaba.druid.pool.DruidDataSource - url: jdbc:mysql://maf.mysql.dev:3306/muscle_and_fitness?useSSL=true&useUnicode=true - username: root - password: jm@mysql - redis: - database: 0 - host: maf.redis.dev - port: 6379 - password: 123456 - timeout: 10000ms - lettuce: - pool: - max-active: 20 - max-idle: 10 - max-wait: -1ms - min-idle: 0 - -logging: - # Configure logging level for SFTP/JSCH - level: - com.jcraft.jsch: INFO - -custom: - configuration: - super-user: "admin" - # Make `web-security-disabled` equal to true to disable web security. We suggest you do not turn off web security - # feature unless development environment. - web-security-disabled: false - # Disable web request information log - web-request-log-disabled: false - ignored-request: - post: - - "/authentication/**" - get: - - "/auth/check-username-uniqueness" - - "/auth/check-email-uniqueness" - - "/auth/validate-username/**" - - "/user/get-avatar" - - "/common/get-jwt" - pattern: - - "/actuator/**" - - "/druid/**" - - "/swagger-resources/**" - - "/v2/api-docs/**" - -sftp: - client: - configuration: - host: maf.atmoz-sftp.dev - port: 22 - user: johnny - password: atmoz@sftp - directory: upload - private-key: - private-key-pass-phrase: - session-cache-size: 20 - session-wait-timeout: 15000 diff --git a/api-portal/src/main/resources/application-development-local.yml b/api-portal/src/main/resources/application-development-local.yml deleted file mode 100644 index fff002a0..00000000 --- a/api-portal/src/main/resources/application-development-local.yml +++ /dev/null @@ -1,71 +0,0 @@ -eureka: - client: - serviceUrl: - defaultZone: http://localhost:8760/eureka/ - -spring: - zipkin: - base-url: http://localhost:9411 - datasource: - name: muscle_and_fitness - driver-class-name: com.mysql.cj.jdbc.Driver - type: com.alibaba.druid.pool.DruidDataSource - url: jdbc:mysql://localhost:3306/muscle_and_fitness?useSSL=true&useUnicode=true - username: root - password: jm@mysql - devtools: - restart: - enabled: true - redis: - database: 0 - host: localhost - port: 6379 - password: 123456 - timeout: 10000ms - lettuce: - pool: - max-active: 20 - max-idle: 10 - max-wait: -1ms - min-idle: 0 - -logging: - # Configure logging level for SFTP/JSCH - level: - com.jcraft.jsch: INFO - -custom: - configuration: - super-user: "admin" - # Make `web-security-disabled` equal to true to disable web security. We suggest you do not turn off web security - # feature unless development environment. - web-security-disabled: false - # Disable web request information log - web-request-log-disabled: false - ignored-request: - post: - - "/authentication/**" - get: - - "/auth/check-username-uniqueness" - - "/auth/check-email-uniqueness" - - "/auth/validate-username/**" - - "/user/get-avatar" - - "/common/get-jwt" - pattern: - - "/actuator/**" - - "/druid/**" - - "/swagger-resources/**" - - "/v2/api-docs/**" - -sftp: - client: - configuration: - host: localhost - port: 23 - user: johnny - password: atmoz@sftp - directory: upload - private-key: - private-key-pass-phrase: - session-cache-size: 20 - session-wait-timeout: 15000 diff --git a/api-portal/src/main/resources/application-production.yml b/api-portal/src/main/resources/application-production.yml deleted file mode 100644 index 989017fa..00000000 --- a/api-portal/src/main/resources/application-production.yml +++ /dev/null @@ -1,68 +0,0 @@ -eureka: - client: - serviceUrl: - defaultZone: http://172.16.4.20:8760/eureka/ - -spring: - zipkin: - base-url: http://172.16.4.13:9411 - datasource: - name: muscle_and_fitness - driver-class-name: com.mysql.cj.jdbc.Driver - type: com.alibaba.druid.pool.DruidDataSource - url: jdbc:mysql://172.16.4.10:3306/muscle_and_fitness?useSSL=true&useUnicode=true - username: root - password: jm@mysql - redis: - database: 0 - host: 172.16.4.11 - port: 6379 - password: 123456 - timeout: 10000ms - lettuce: - pool: - max-active: 20 - max-idle: 10 - max-wait: -1ms - min-idle: 0 - -logging: - # Configure logging level for SFTP/JSCH - level: - com.jcraft.jsch: INFO - -custom: - configuration: - super-user: "admin" - # Make `web-security-disabled` equal to true to disable web security. We suggest you do not turn off web security - # feature unless development environment. - web-security-disabled: false - # Disable web request information log - web-request-log-disabled: false - ignored-request: - post: - - "/authentication/**" - get: - - "/auth/check-username-uniqueness" - - "/auth/check-email-uniqueness" - - "/auth/validate-username/**" - - "/user/get-avatar" - - "/common/get-jwt" - pattern: - - "/actuator/**" - - "/druid/**" - - "/swagger-resources/**" - - "/v2/api-docs/**" - -sftp: - client: - configuration: - host: 172.16.4.12 - port: 22 - user: johnny - password: atmoz@sftp - directory: upload - private-key: - private-key-pass-phrase: - session-cache-size: 20 - session-wait-timeout: 15000 diff --git a/api-portal/src/main/resources/application-stage.yml b/api-portal/src/main/resources/application-stage.yml deleted file mode 100644 index 423d2ebd..00000000 --- a/api-portal/src/main/resources/application-stage.yml +++ /dev/null @@ -1,68 +0,0 @@ -eureka: - client: - serviceUrl: - defaultZone: http://172.16.3.20:8760/eureka/ - -spring: - zipkin: - base-url: http://172.16.3.13:9411 - datasource: - name: muscle_and_fitness - driver-class-name: com.mysql.cj.jdbc.Driver - type: com.alibaba.druid.pool.DruidDataSource - url: jdbc:mysql://172.16.4.10:3306/muscle_and_fitness?useSSL=true&useUnicode=true - username: root - password: jm@mysql - redis: - database: 0 - host: 172.16.3.11 - port: 6379 - password: 123456 - timeout: 10000ms - lettuce: - pool: - max-active: 20 - max-idle: 10 - max-wait: -1ms - min-idle: 0 - -logging: - # Configure logging level for SFTP/JSCH - level: - com.jcraft.jsch: INFO - -custom: - configuration: - super-user: "admin" - # Make `web-security-disabled` equal to true to disable web security. We suggest you do not turn off web security - # feature unless development environment. - web-security-disabled: false - # Disable web request information log - web-request-log-disabled: false - ignored-request: - post: - - "/authentication/**" - get: - - "/auth/check-username-uniqueness" - - "/auth/check-email-uniqueness" - - "/auth/validate-username/**" - - "/user/get-avatar" - - "/common/get-jwt" - pattern: - - "/actuator/**" - - "/druid/**" - - "/swagger-resources/**" - - "/v2/api-docs/**" - -sftp: - client: - configuration: - host: 172.16.3.12 - port: 22 - user: johnny - password: atmoz@sftp - directory: upload - private-key: - private-key-pass-phrase: - session-cache-size: 20 - session-wait-timeout: 15000 diff --git a/api-portal/src/main/resources/application-test.yml b/api-portal/src/main/resources/application-test.yml deleted file mode 100644 index 36c7664c..00000000 --- a/api-portal/src/main/resources/application-test.yml +++ /dev/null @@ -1,68 +0,0 @@ -eureka: - client: - serviceUrl: - defaultZone: http://172.16.2.20:8760/eureka/ - -spring: - zipkin: - base-url: http://172.16.2.13:9411 - datasource: - name: muscle_and_fitness - driver-class-name: com.mysql.cj.jdbc.Driver - type: com.alibaba.druid.pool.DruidDataSource - url: jdbc:mysql://172.16.2.10:3306/muscle_and_fitness?useSSL=true&useUnicode=true - username: root - password: jm@mysql - redis: - database: 0 - host: 172.16.2.11 - port: 6379 - password: 123456 - timeout: 10000ms - lettuce: - pool: - max-active: 20 - max-idle: 10 - max-wait: -1ms - min-idle: 0 - -logging: - # Configure logging level for SFTP/JSCH - level: - com.jcraft.jsch: INFO - -custom: - configuration: - super-user: "admin" - # Make `web-security-disabled` equal to true to disable web security. We suggest you do not turn off web security - # feature unless development environment. - web-security-disabled: false - # Disable web request information log - web-request-log-disabled: false - ignored-request: - post: - - "/authentication/**" - get: - - "/auth/check-username-uniqueness" - - "/auth/check-email-uniqueness" - - "/auth/validate-username/**" - - "/user/get-avatar" - - "/common/get-jwt" - pattern: - - "/actuator/**" - - "/druid/**" - - "/swagger-resources/**" - - "/v2/api-docs/**" - -sftp: - client: - configuration: - host: 172.16.2.12 - port: 22 - user: johnny - password: atmoz@sftp - directory: upload - private-key: - private-key-pass-phrase: - session-cache-size: 20 - session-wait-timeout: 15000 diff --git a/api-portal/src/main/resources/application.yml b/api-portal/src/main/resources/application.yml deleted file mode 100644 index 106b7359..00000000 --- a/api-portal/src/main/resources/application.yml +++ /dev/null @@ -1,108 +0,0 @@ -server: - port: @api-portal.port@ - tomcat: - uri-encoding: @project.build.sourceEncoding@ - -spring: - application: - name: @project.artifactId@ - profiles: - active: @env@ - mvc: - throw-exception-if-no-handler-found: true - jackson: - date-format: yyyy-MM-dd HH:mm:ss - time-zone: Asia/Hong_Kong - sleuth: - sampler: - probability: 1.0 - servlet: - multipart: - # `location` specifies the directory where uploaded files will be stored. When not specified, - # a temporary directory will be used. ATTENTION: it may differ due to OS. - location: /Users/johnny/Documents/@project.artifactId@/temprary-file - # `max-file-size` specifies the maximum size permitted for uploaded files. The default is 1MB. We set it as 64 MB. - max-file-size: 64MB - # `max-request-size` specifies the maximum size allowed for multipart/form-data requests. The default is 10MB. - max-request-size: 70MB - # `file-size-threshold` specifies the size threshold after which files will be written to disk. - # The default is 0. We set it as 0 too. - file-size-threshold: 0 - -eureka: - instance: - leaseRenewalIntervalInSeconds: 10 - health-check-url-path: /actuator/health - status-page-url-path: / - metadata-map: - # needed to trigger info and endpoint update after restart - startup: ${random.int} - instance-id: ${spring.cloud.client.ip-address}:${server.port}@${spring.cloud.client.hostname}@${spring.application.name}-${random.int} - prefer-ip-address: true - client: - registryFetchIntervalSeconds: 5 - -feign: - client: - config: - default: - connectTimeout: 5000 - readTimeout: 10000 - loggerLevel: full - compression: - request: - enabled: true - response: - enabled: true - useGzipDecoder: true - -management: - endpoints: - web: - exposure: - include: "*" - endpoint: - health: - show-details: ALWAYS - -mybatis-plus: - configuration: - map-underscore-to-camel-case: true - log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl - # mapper-locations should start with `classpath*` prefix - # when project is based on Maven multi-module to load XML mapper in different jar - mapper-locations: classpath*:/mapper/**/*Mapper.xml - -logging: - config: classpath:configuration/logback/logback-@env@.xml - # Configure logging level of project as DEBUG to enable SQL logging and other logging. - level: - com.jmsoftware: DEBUG - -project: - property: - base-package: com.jmsoftware.maf.maf.apiportal - context-path: - group-id: @project.groupId@ - project-parent-artifact-id: @project.parent.artifactId@ - project-artifact-id: @project.artifactId@ - version: @project.version@ - description: @project.description@ - jdk-version: @java.version@ - environment: @env@ - url: @project.url@ - inception-year: @inceptionYear@ - organization-name: @project.organization.name@ - organization-url: @project.organization.url@ - issue-management-system: @project.issueManagement.system@ - issue-management-url: @project.issueManagement.url@ - developer-name: @developerName@ - developer-email: @developerEmail@ - developer-url: @developerUrl@ - -# Customize JWT configuration for development environment. -jwt: - configuration: - # an hour - ttl: 3600000 - ttl-for-remember-me: 604800000 diff --git a/api-portal/src/main/resources/configuration/.empty b/api-portal/src/main/resources/configuration/.empty deleted file mode 100644 index e69de29b..00000000 diff --git a/api-portal/src/main/resources/static/script/home.js b/api-portal/src/main/resources/static/script/home.js deleted file mode 100644 index a191d8c5..00000000 --- a/api-portal/src/main/resources/static/script/home.js +++ /dev/null @@ -1,72 +0,0 @@ -// noinspection JSUnusedGlobalSymbols -const vm = new Vue({ - el: '#app', - data: { - projectArtifactId: null, - version: null, - applicationName: null, - newPerson: { - name: '', - age: 0, - sex: 'Male' - }, - people: [{ - name: 'Jack', - age: 30, - sex: 'Male' - }, { - name: 'Bill', - age: 26, - sex: 'Male' - }, { - name: 'Tracy', - age: 22, - sex: 'Female' - }, { - name: 'Chris', - age: 36, - sex: 'Male' - }] - }, - methods: { - /** - * Create a person - */ - createPerson: function () { - this.people.push(this.newPerson); - this.newPerson = {name: '', age: 0, sex: 'Male'} - - }, - /** - * delete a person - * @param index - */ - deletePerson: function (index) { - this.people.splice(index, 1); - }, - handleClickSwaggerApiDocumentation: function () { - const currentUrl = window.location.href; - const split = currentUrl.split('/'); - window.location.href = `${split[0]}//${split[2]}/doc`; - }, - handleClickVideoDemo: function () { - const currentUrl = window.location.href; - const split = currentUrl.split('/'); - window.location.href = `${split[0]}//${split[2]}/${split[3]}/video.html`; - }, - getAppInfo: async function () { - const currentUrl = window.location.href; - const split = currentUrl.split('/'); - const baseUrl = `${split[0]}//${split[2]}`; - const response = await fetch(`${baseUrl}/common/app-info`); - const responseJson = await response.json(); - this.projectArtifactId = responseJson.data.projectArtifactId; - this.version = responseJson.data.version; - this.applicationName = this.projectArtifactId.toUpperCase(); - window.document.title = this.applicationName; - } - }, - mounted: async function () { - this.getAppInfo(); - } -}); diff --git a/api-portal/src/test/java/com/jmsoftware/maf/apiportal/ApiPortalApplicationTests.java b/api-portal/src/test/java/com/jmsoftware/maf/apiportal/ApiPortalApplicationTests.java deleted file mode 100644 index 202e1338..00000000 --- a/api-portal/src/test/java/com/jmsoftware/maf/apiportal/ApiPortalApplicationTests.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.jmsoftware.maf.apiportal; - -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -class ApiPortalApplicationTests { - - @Test - void contextLoads() { - } - -} diff --git a/auth-center/auto-run-windows.cmd b/auth-center/auto-run-windows.cmd index cd3242c5..2b4a7fc1 100644 --- a/auth-center/auto-run-windows.cmd +++ b/auth-center/auto-run-windows.cmd @@ -16,8 +16,10 @@ chcp 65001 @REM #################### Configurable Environment Variables ################### SET skipGitPull=true SET skipMavenBuild=true +SET minimalJavaMajorVersion=11 +SET javaExe=C:\Users\Johnny\.sdkman\candidates\java\11.0.10.hs-adpt\bin\java.exe SET mavenActiveProfile="development-local" -SET javaParameter=-Dfile.encoding=UTF-8 -Xms256m -Xmx256m +SET javaParameter=-Xms256m -Xmx256m -Dfile.encoding=UTF-8 -Dspring.cloud.consul.host=localhost GOTO:MAIN @@ -55,6 +57,22 @@ EXIT /B 0 @REM ############################ Custom Functions ############################# +@REM Check Java major version +:checkJavaMajorVersion +CALL :logWarn "Start to Check Java major version…" +%javaExe% -version 1>nul 2>nul || ( + CALL :logError "Java is not installed!" + EXIT /B 2 +) +for /f tokens^=2-6^ delims^=.-_+^" %%j in ('%javaExe% -fullversion 2^>^&1') do set "currentJavaMajorVersion=%%j" +CALL :logWarn "Got current Java major version number: %currentJavaMajorVersion%" +if %currentJavaMajorVersion% LSS %minimalJavaMajorVersion% ( + CALL :logError "Current Java version is too low, at least OpenJDK %minimalJavaMajorVersion% is needed" + EXIT /B 1 +) +CALL :logInfo "Passed Java major version cheking" +EXIT /B 0 + @REM Pull the latest code of current branch from Git. :gitPull git pull @@ -76,7 +94,7 @@ EXIT /B 0 CALL :gitPull ) CALL :logInfo "[PRE-BUILD] Java Version Information" - CALL java -version + CALL %javaExe% -version CALL :logInfo "[PRE-BUILD] Maven Version Information" CALL mvn -v CALL :logInfo "[PRE-BUILD] Current directory:" @@ -113,7 +131,7 @@ EXIT /B 0 ) CALL :logWarn "[RUN] Found JAR: %jarFileName%" CALL :setTerminalTitle %jarFileName% - SET runJarCommand=java %javaParameter% -Dspring.profiles.active=%mavenActiveProfile% -jar target\%jarFileName% + SET runJarCommand=%javaExe% %javaParameter% -Dspring.profiles.active=%mavenActiveProfile% -jar target\%jarFileName% CALL :logWarn "[RUN] Execute command: %runJarCommand%" CALL %runJarCommand% EXIT /B 0 @@ -121,6 +139,14 @@ EXIT /B 0 @REM ############################# MAIN Procedures ############################# :MAIN cls + +@REM Check Java major version +CALL :checkJavaMajorVersion +if %ERRORLEVEL% NEQ 0 ( + CALL :logError "Failed to check Java major version!" + EXIT /B %ERRORLEVEL% +) + @REM Pre-build phrase (Display version, Git pull) CALL :executePreBuildPhase if %ERRORLEVEL% NEQ 0 ( diff --git a/auth-center/pom.xml b/auth-center/pom.xml index 3bf21d4c..a859a01c 100644 --- a/auth-center/pom.xml +++ b/auth-center/pom.xml @@ -1,5 +1,5 @@ - 4.0.0 @@ -10,7 +10,7 @@ com.jmsoftware.maf muscle-and-fitness-server - 0.0.1 + 0.0.2 @@ -19,22 +19,31 @@ org.springframework.boot spring-boot-maven-plugin + + + build-info + compile + + build-info + + + com.google.cloud.tools jib-maven-plugin - 2.2.0 + ${jib-maven-plugin.version} - + buildAndPushDockerImagePhase @@ -46,8 +55,8 @@ - - openjdk:11.0.9.1-jre-slim + + adoptopenjdk/openjdk11:${adoptopenjdk11.tag} docker.io/ijohnnymiller/${project.parent.artifactId}.${project.artifactId} @@ -73,85 +82,58 @@ - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.cloud - spring-cloud-starter-netflix-eureka-client - - - de.codecentric - spring-boot-admin-starter-client - ${spring-boot-admin.version} - - - org.springframework.cloud - spring-cloud-starter-zipkin - - - org.springframework.boot - spring-boot-starter-security - - - org.springframework.boot - spring-boot-starter-data-redis - - - org.springframework.integration - spring-integration-sftp - - - - com.jmsoftware.maf - common - com.jmsoftware.maf - muscle-and-fitness-server-spring-boot-starter - - - - - com.baomidou - mybatis-plus-boot-starter - 3.3.1 - - - mysql - mysql-connector-java - runtime - - - com.alibaba - druid - 1.1.22 - - - - redis.clients - jedis + spring-cloud-starter + + + org.springframework.integration + spring-integration-sftp + + + io.minio + minio + + + io.jsonwebtoken jjwt-api - 0.11.1 + ${jjwt.version} io.jsonwebtoken jjwt-impl - 0.11.1 + ${jjwt.version} runtime io.jsonwebtoken jjwt-jackson - 0.11.1 + ${jjwt.version} runtime + + + com.jmsoftware.maf + universal-ui + + + + + org.springframework.boot + spring-boot-starter-test + test + + + org.junit.vintage + junit-vintage-engine + + + diff --git a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/AuthCenterApplication.java b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/AuthCenterApplication.java index 927d2001..b6bead0d 100644 --- a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/AuthCenterApplication.java +++ b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/AuthCenterApplication.java @@ -1,24 +1,19 @@ package com.jmsoftware.maf.authcenter; -import com.jmsoftware.maf.authcenter.universal.configuration.ProjectProperty; -import com.jmsoftware.maf.authcenter.universal.configuration.ServerConfiguration; +import com.jmsoftware.maf.springcloudstarter.helper.SpringBootStartupHelper; import lombok.extern.slf4j.Slf4j; -import lombok.val; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.openfeign.EnableFeignClients; - -import java.time.Duration; -import java.time.Instant; -import java.util.TimeZone; +import org.springframework.util.StopWatch; /** *

AuthCenterApplication

*

* Change description here. * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com * @date 3/12/20 9:57 AM **/ @Slf4j @@ -26,27 +21,16 @@ @EnableDiscoveryClient @SpringBootApplication public class AuthCenterApplication { - private static final String LINE_SEPARATOR = System.lineSeparator(); - private static ProjectProperty projectProperty; - private static ServerConfiguration serverConfiguration; + private static final StopWatch STOP_WATCH = new StopWatch(); + private static SpringBootStartupHelper springBootStartupHelper; - public AuthCenterApplication(ProjectProperty projectProperty, ServerConfiguration serverConfiguration) { - AuthCenterApplication.projectProperty = projectProperty; - AuthCenterApplication.serverConfiguration = serverConfiguration; + public AuthCenterApplication(SpringBootStartupHelper springBootStartupHelper) { + AuthCenterApplication.springBootStartupHelper = springBootStartupHelper; } public static void main(String[] args) { - val startInstant = Instant.now(); + STOP_WATCH.start(); SpringApplication.run(AuthCenterApplication.class, args); - val endInstant = Instant.now(); - val duration = Duration.between(startInstant, endInstant); - log.info("🥳 Congratulations! 🎉"); - log.info("🖥 {}@{} started!", projectProperty.getProjectArtifactId(), projectProperty.getVersion()); - log.info("⚙️ Environment: {}", projectProperty.getEnvironment()); - log.info("⏳ Deployment duration: {} seconds ({} ms)", duration.getSeconds(), duration.toMillis()); - log.info("⏰ App started at {} (timezone - {})", endInstant, TimeZone.getDefault().getDisplayName()); - log.info("{} App running at{} - Local: http://localhost:{}{}/{} - Network: {}/", - LINE_SEPARATOR, LINE_SEPARATOR, serverConfiguration.getServerPort(), projectProperty.getContextPath(), - LINE_SEPARATOR, serverConfiguration.getBaseUrl()); + springBootStartupHelper.stop(STOP_WATCH); } } diff --git a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/permission/configuration/PermissionConfiguration.java b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/permission/configuration/PermissionConfiguration.java new file mode 100644 index 00000000..73567962 --- /dev/null +++ b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/permission/configuration/PermissionConfiguration.java @@ -0,0 +1,27 @@ +package com.jmsoftware.maf.authcenter.permission.configuration; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.context.annotation.Configuration; +import org.springframework.validation.annotation.Validated; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotEmpty; +import java.util.Set; + +/** + * Description: PermissionConfiguration, change description here. + * + * @author 钟俊(zhongjun), email: zhongjun@toguide.cn, date: 2/8/2021 5:18 PM + **/ +@Data +@Validated +@RefreshScope +@Configuration +@ConfigurationProperties(prefix = PermissionConfiguration.PREFIX) +public class PermissionConfiguration { + public static final String PREFIX = "maf.configuration.permission"; + @NotEmpty + private Set<@NotBlank String> ignoredServiceIds; +} diff --git a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/permission/controller/PermissionController.java b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/permission/controller/PermissionController.java index 6c98c62f..657ceabc 100644 --- a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/permission/controller/PermissionController.java +++ b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/permission/controller/PermissionController.java @@ -1,29 +1,42 @@ package com.jmsoftware.maf.authcenter.permission.controller; -import com.jmsoftware.maf.authcenter.permission.entity.PermissionPersistence; +import com.jmsoftware.maf.authcenter.permission.entity.GetServicesInfoResponse; import com.jmsoftware.maf.authcenter.permission.service.PermissionService; +import com.jmsoftware.maf.common.bean.ResponseBodyBean; +import com.jmsoftware.maf.common.exception.BusinessException; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import javax.annotation.Resource; - - /** +/** *

PermissionController

*

* Controller implementation of Permission.(Permission) * - * @author Johnny Miller (鍾俊), e-mail: johnnysviva@outlook.com + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com * @date 5/11/20 8:34 AM */ +@Slf4j @RestController -@RequestMapping("permission") +@RequiredArgsConstructor +@Api(tags = {"Permission API"}) public class PermissionController { - @Resource - private PermissionService permissionService; + private final PermissionService permissionService; - @GetMapping("selectOne") - public PermissionPersistence selectOne(Long id) { - return this.permissionService.queryById(id); + /** + * Services info response body bean. + * + * @return the response body bean + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 12/25/2020 5:44 PM + * @see + * RestTemplate Excample + */ + @GetMapping("/permissions/services-info") + @ApiOperation(value = "Get services info", notes = "Get services info") + public ResponseBodyBean getServicesInfo() throws BusinessException { + return ResponseBodyBean.ofSuccess(permissionService.getServicesInfo()); } } diff --git a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/permission/remote/PermissionRemoteApiController.java b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/permission/controller/PermissionRemoteApiController.java similarity index 51% rename from auth-center/src/main/java/com/jmsoftware/maf/authcenter/permission/remote/PermissionRemoteApiController.java rename to auth-center/src/main/java/com/jmsoftware/maf/authcenter/permission/controller/PermissionRemoteApiController.java index c6cc344d..b1a7fcc2 100644 --- a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/permission/remote/PermissionRemoteApiController.java +++ b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/permission/controller/PermissionRemoteApiController.java @@ -1,16 +1,13 @@ -package com.jmsoftware.maf.authcenter.permission.remote; +package com.jmsoftware.maf.authcenter.permission.controller; import com.jmsoftware.maf.authcenter.permission.service.PermissionService; import com.jmsoftware.maf.common.bean.ResponseBodyBean; import com.jmsoftware.maf.common.domain.authcenter.permission.GetPermissionListByRoleIdListPayload; import com.jmsoftware.maf.common.domain.authcenter.permission.GetPermissionListByRoleIdListResponse; -import com.jmsoftware.maf.common.domain.authcenter.permission.GetPermissionListByUserIdPayload; -import com.jmsoftware.maf.common.domain.authcenter.permission.GetPermissionListByUserIdResponse; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -21,25 +18,19 @@ *

* Change description here. * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com * @date 5/11/20 8:24 AM **/ @RestController @RequiredArgsConstructor @RequestMapping("/permission-remote-api") -@Api(tags = {"Permission Remote API Controller"}) +@Api(tags = {"Permission Remote API"}) public class PermissionRemoteApiController { private final PermissionService permissionService; - @PostMapping("/get-permission-list-by-role-id-list") - @ApiOperation(value = "Get permission list by role id list", notes = "GGet permission list by role id list") - public ResponseBodyBean getPermissionListByRoleIdList(@Valid @RequestBody GetPermissionListByRoleIdListPayload payload) { + @GetMapping("/permissions") + @ApiOperation(value = "Get permission list by role id list", notes = "Get permission list by role id list (remote)") + public ResponseBodyBean getPermissionListByRoleIdList(@Valid GetPermissionListByRoleIdListPayload payload) { return ResponseBodyBean.ofSuccess(permissionService.getPermissionListByRoleIdList(payload)); } - - @PostMapping("/get-permission-list-by-user-id") - @ApiOperation(value = "Get permission list by user id", notes = "Get permission list by user id") - public ResponseBodyBean getPermissionListByUserId(@Valid @RequestBody GetPermissionListByUserIdPayload payload) { - return ResponseBodyBean.ofSuccess(permissionService.getPermissionListByUserId(payload)); - } } diff --git a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/permission/entity/GetServicesInfoResponse.java b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/permission/entity/GetServicesInfoResponse.java new file mode 100644 index 00000000..ba8807a3 --- /dev/null +++ b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/permission/entity/GetServicesInfoResponse.java @@ -0,0 +1,23 @@ +package com.jmsoftware.maf.authcenter.permission.entity; + +import com.google.common.collect.Lists; +import com.jmsoftware.maf.common.domain.springbootstarter.HttpApiResourcesResponse; +import lombok.Data; + +import java.util.List; + +/** + * Description: GetServicesInfoResponse, change description here. + * + * @author 钟俊(zhongjun), email: zhongjun@toguide.cn, date: 12/28/2020 9:30 AM + **/ +@Data +public class GetServicesInfoResponse { + private List list = Lists.newLinkedList(); + + @Data + public static class ServiceInfo{ + private String serviceId; + private HttpApiResourcesResponse httpApiResources; + } +} diff --git a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/permission/entity/PermissionPersistence.java b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/permission/entity/PermissionPersistence.java deleted file mode 100644 index 2a1da16d..00000000 --- a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/permission/entity/PermissionPersistence.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.jmsoftware.maf.authcenter.permission.entity; - -import lombok.Data; - -import java.io.Serializable; -import java.util.Date; - -/** - * Permission.(Permission) Persistence object class - * - * @author Johnny Miller (鍾俊), e-mail: johnnysviva@outlook.com - * @date 5/11/20 8:34 AM - */ -@Data -public class PermissionPersistence implements Serializable { - private static final long serialVersionUID = -56601096713236790L; - /** - * Primary key - */ - private Long id; - /** - * URL. If type of record is page (1), URL stands for route; if type of record is button (2), URL stands for API - */ - private String url; - /** - * Permission description - */ - private String description; - /** - * Permission type. 1 - page; 2 - button - */ - private Integer type; - /** - * Permission expression - */ - private String permissionExpression; - /** - * HTTP method of API - */ - private String method; - /** - * Sort number - */ - private Integer sort; - /** - * Primary key of parent - */ - private Long parentId; - /** - * Deleted flag - */ - private Integer deleted; - /** - * Created time - */ - private Date createdTime; - /** - * Modified time - */ - private Date modifiedTime; -} diff --git a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/permission/entity/persistence/Permission.java b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/permission/entity/persistence/Permission.java new file mode 100644 index 00000000..0bb7187a --- /dev/null +++ b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/permission/entity/persistence/Permission.java @@ -0,0 +1,129 @@ +package com.jmsoftware.maf.authcenter.permission.entity.persistence; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +import static com.baomidou.mybatisplus.annotation.FieldFill.INSERT; +import static com.baomidou.mybatisplus.annotation.FieldFill.UPDATE; + +/** + *

Permission

+ *

+ * Permission Persistence object class + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 6/27/2021 3:22 PM + */ +@Data +@TableName(value = Permission.TABLE_NAME) +public class Permission { + /** + * Primary key + */ + @TableId(value = COL_ID, type = IdType.AUTO) + private Long id; + + /** + * URL. If type of record is page (1), URL stands for route; if type of record is button (2), URL stands for API + */ + @TableField(value = COL_URL) + private String url; + + /** + * Permission description + */ + @TableField(value = COL_DESCRIPTION) + private String description; + + /** + * Permission type. 1 - page; 2 - button + */ + @TableField(value = COL_TYPE) + private Byte type; + + /** + * Permission expression + */ + @TableField(value = COL_PERMISSION_EXPRESSION) + private String permissionExpression; + + /** + * HTTP method of API + */ + @TableField(value = COL_METHOD) + private Object method; + + /** + * Sort number + */ + @TableField(value = COL_SORT) + private Integer sort; + + /** + * Primary key of parent + */ + @TableField(value = COL_PARENT_ID) + private Long parentId; + + /** + * Created by + */ + @TableField(value = COL_CREATED_BY, fill = INSERT) + private Long createdBy; + + /** + * Created time + */ + @TableField(value = COL_CREATED_TIME, fill = INSERT) + private Date createdTime; + + /** + * Modified by + */ + @TableField(value = COL_MODIFIED_BY, fill = UPDATE) + private Long modifiedBy; + + /** + * Modified time + */ + @TableField(value = COL_MODIFIED_TIME, fill = UPDATE) + private Date modifiedTime; + + /** + * Deleted flag + */ + @TableField(value = COL_DELETED, fill = INSERT) + private Byte deleted; + + public static final String TABLE_NAME = "permission"; + + public static final String COL_ID = "id"; + + public static final String COL_URL = "url"; + + public static final String COL_DESCRIPTION = "description"; + + public static final String COL_TYPE = "type"; + + public static final String COL_PERMISSION_EXPRESSION = "permission_expression"; + + public static final String COL_METHOD = "method"; + + public static final String COL_SORT = "sort"; + + public static final String COL_PARENT_ID = "parent_id"; + + public static final String COL_CREATED_BY = "created_by"; + + public static final String COL_CREATED_TIME = "created_time"; + + public static final String COL_MODIFIED_BY = "modified_by"; + + public static final String COL_MODIFIED_TIME = "modified_time"; + + public static final String COL_DELETED = "deleted"; +} diff --git a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/permission/mapper/PermissionMapper.java b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/permission/mapper/PermissionMapper.java index 953704d2..bc31588f 100644 --- a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/permission/mapper/PermissionMapper.java +++ b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/permission/mapper/PermissionMapper.java @@ -1,6 +1,8 @@ package com.jmsoftware.maf.authcenter.permission.mapper; -import com.jmsoftware.maf.authcenter.permission.entity.PermissionPersistence; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.jmsoftware.maf.authcenter.permission.entity.persistence.Permission; +import com.jmsoftware.maf.common.domain.authcenter.permission.PermissionType; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -11,73 +13,18 @@ *

* Mapper of Permission.(Permission) * - * @author Johnny Miller (鍾俊), e-mail: johnnysviva@outlook.com + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com * @date 5 /11/20 8:34 AM */ @Mapper -public interface PermissionMapper { - /** - * Query by id permission persistence. - * - * @param id the id - * @return the permission persistence - */ - PermissionPersistence queryById(Long id); - - /** - * Query all by limit list. - * - * @param offset the offset - * @param limit the limit - * @return the list - */ - List queryAllByLimit(@Param("offset") int offset, @Param("limit") int limit); - - /** - * Query all list. - * - * @param permissionPersistence the permission persistence - * @return the list - */ - List queryAll(PermissionPersistence permissionPersistence); - - /** - * Insert int. - * - * @param permissionPersistence the permission persistence - * @return the int - */ - int insert(PermissionPersistence permissionPersistence); - - /** - * Update int. - * - * @param permissionPersistence the permission persistence - * @return the int - */ - int update(PermissionPersistence permissionPersistence); - - /** - * Delete by id int. - * - * @param id the id - * @return the int - */ - int deleteById(Long id); - +public interface PermissionMapper extends BaseMapper { /** * Select permission list by role id list list. * - * @param roleIdList the role id list - * @return the list - */ - List selectPermissionListByRoleIdList(List roleIdList); - - /** - * Select permission list by user id list. - * - * @param userId the user id + * @param roleIdList the role id list + * @param permissionTypeList the permission type list * @return the list */ - List selectPermissionListByUserId(Long userId); + List selectPermissionListByRoleIdList(@Param("roleIdList") List roleIdList, + @Param("permissionTypeList") List permissionTypeList); } diff --git a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/permission/service/PermissionService.java b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/permission/service/PermissionService.java index 9e8d2c89..1ef58523 100644 --- a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/permission/service/PermissionService.java +++ b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/permission/service/PermissionService.java @@ -1,14 +1,16 @@ package com.jmsoftware.maf.authcenter.permission.service; -import com.jmsoftware.maf.authcenter.permission.entity.PermissionPersistence; +import com.baomidou.mybatisplus.extension.service.IService; +import com.jmsoftware.maf.authcenter.permission.entity.GetServicesInfoResponse; +import com.jmsoftware.maf.authcenter.permission.entity.persistence.Permission; import com.jmsoftware.maf.common.domain.authcenter.permission.GetPermissionListByRoleIdListPayload; import com.jmsoftware.maf.common.domain.authcenter.permission.GetPermissionListByRoleIdListResponse; -import com.jmsoftware.maf.common.domain.authcenter.permission.GetPermissionListByUserIdPayload; -import com.jmsoftware.maf.common.domain.authcenter.permission.GetPermissionListByUserIdResponse; -import lombok.NonNull; +import com.jmsoftware.maf.common.domain.authcenter.permission.PermissionType; +import com.jmsoftware.maf.common.exception.BusinessException; import org.springframework.validation.annotation.Validated; import javax.validation.Valid; +import javax.validation.constraints.NotEmpty; import java.util.List; /** @@ -16,52 +18,11 @@ *

* Service of Permission.(Permission) * - * @author Johnny Miller (鍾俊), e-mail: johnnysviva@outlook.com + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com * @date 5 /11/20 8:34 AM */ @Validated -public interface PermissionService { - /** - * Query by ID - * - * @param id the primary key ID - * @return the entity - */ - PermissionPersistence queryById(Long id); - - /** - * Query all by limit - * - * @param offset the offset - * @param limit the limit - * @return the entity list - */ - List queryAllByLimit(int offset, int limit); - - /** - * Insert - * - * @param permissionPersistence the entity - * @return the entity - */ - PermissionPersistence insert(PermissionPersistence permissionPersistence); - - /** - * Update - * - * @param permissionPersistence the entity - * @return the entity - */ - PermissionPersistence update(PermissionPersistence permissionPersistence); - - /** - * Delete by ID - * - * @param id the primary key ID - * @return the boolean - */ - boolean deleteById(Long id); - +public interface PermissionService extends IService { /** * Gets permission list by role id list. * @@ -73,24 +34,18 @@ public interface PermissionService { /** * Gets permission list by role id list. * - * @param roleIdList the role id list + * @param roleIdList the role id list + * @param permissionTypeList the permission type list * @return the permission list by role id list */ - List getPermissionListByRoleIdList(@NonNull List roleIdList); - - /** - * Gets permission list by user id. - * - * @param payload the payload - * @return the permission list by user id - */ - GetPermissionListByUserIdResponse getPermissionListByUserId(@Valid GetPermissionListByUserIdPayload payload); + List getPermissionListByRoleIdList(@NotEmpty List roleIdList, + @NotEmpty List permissionTypeList); /** - * Gets permission list by user id. + * Gets services info. * - * @param userId the user id - * @return the permission list by user id + * @return the services info + * @throws BusinessException the business exception */ - List getPermissionListByUserId(@NonNull Long userId); + GetServicesInfoResponse getServicesInfo() throws BusinessException; } diff --git a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/permission/service/impl/PermissionServiceImpl.java b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/permission/service/impl/PermissionServiceImpl.java index 16d4d206..efbdf77c 100644 --- a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/permission/service/impl/PermissionServiceImpl.java +++ b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/permission/service/impl/PermissionServiceImpl.java @@ -2,69 +2,67 @@ import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; -import com.jmsoftware.maf.authcenter.permission.entity.PermissionPersistence; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.jmsoftware.maf.authcenter.permission.configuration.PermissionConfiguration; +import com.jmsoftware.maf.authcenter.permission.entity.GetServicesInfoResponse; +import com.jmsoftware.maf.authcenter.permission.entity.persistence.Permission; import com.jmsoftware.maf.authcenter.permission.mapper.PermissionMapper; import com.jmsoftware.maf.authcenter.permission.service.PermissionService; +import com.jmsoftware.maf.authcenter.role.service.RoleService; +import com.jmsoftware.maf.common.bean.ResponseBodyBean; import com.jmsoftware.maf.common.domain.authcenter.permission.GetPermissionListByRoleIdListPayload; import com.jmsoftware.maf.common.domain.authcenter.permission.GetPermissionListByRoleIdListResponse; -import com.jmsoftware.maf.common.domain.authcenter.permission.GetPermissionListByUserIdPayload; -import com.jmsoftware.maf.common.domain.authcenter.permission.GetPermissionListByUserIdResponse; -import lombok.NonNull; +import com.jmsoftware.maf.common.domain.authcenter.permission.PermissionType; +import com.jmsoftware.maf.common.domain.springbootstarter.HttpApiResourcesResponse; +import com.jmsoftware.maf.common.exception.BusinessException; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import lombok.val; +import org.springframework.cloud.client.discovery.DiscoveryClient; import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; -import javax.annotation.Resource; import javax.validation.Valid; -import java.util.Collections; +import javax.validation.constraints.NotEmpty; import java.util.List; +import java.util.Optional; /** *

PermissionServiceImpl

*

* Service implementation of Permission.(Permission) * - * @author Johnny Miller (鍾俊), e-mail: johnnysviva@outlook.com + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com * @date 5/11/20 8:34 AM */ -@Service("permissionService") -public class PermissionServiceImpl implements PermissionService { - @Resource - private PermissionMapper permissionMapper; - - @Override - public PermissionPersistence queryById(Long id) { - return this.permissionMapper.queryById(id); - } - - @Override - public List queryAllByLimit(int offset, int limit) { - return this.permissionMapper.queryAllByLimit(offset, limit); - } - - @Override - public PermissionPersistence insert(PermissionPersistence permissionPersistence) { - this.permissionMapper.insert(permissionPersistence); - return permissionPersistence; - } - - @Override - public PermissionPersistence update(PermissionPersistence permissionPersistence) { - this.permissionMapper.update(permissionPersistence); - return this.queryById(permissionPersistence.getId()); - } - - @Override - public boolean deleteById(Long id) { - return this.permissionMapper.deleteById(id) > 0; - } +@Slf4j +@Service +@RequiredArgsConstructor +public class PermissionServiceImpl extends ServiceImpl implements PermissionService { + private final RoleService roleService; + private final DiscoveryClient discoveryClient; + private final RestTemplate restTemplate; + private final PermissionConfiguration permissionConfiguration; @Override public GetPermissionListByRoleIdListResponse getPermissionListByRoleIdList(@Valid GetPermissionListByRoleIdListPayload payload) { - val permissionList = this.getPermissionListByRoleIdList(payload.getRoleIdList()); + val adminRole = roleService.checkAdmin(payload.getRoleIdList()); val response = new GetPermissionListByRoleIdListResponse(); + if (adminRole) { + log.warn("Admin role checked. The role can access any resources"); + val permission = new GetPermissionListByRoleIdListResponse.Permission(); + permission.setUrl("/**"); + permission.setType(PermissionType.BUTTON.getType()); + permission.setPermissionExpression("admin-permission"); + permission.setMethod("*"); + response.getPermissionList().add(permission); + return response; + } + val permissionList = this.getPermissionListByRoleIdList(payload.getRoleIdList(), + payload.getPermissionTypeList()); permissionList.forEach(permissionPersistence -> { - GetPermissionListByRoleIdListResponse.Permission permission = - new GetPermissionListByRoleIdListResponse.Permission(); + val permission = new GetPermissionListByRoleIdListResponse.Permission(); BeanUtil.copyProperties(permissionPersistence, permission); response.getPermissionList().add(permission); }); @@ -72,27 +70,37 @@ public GetPermissionListByRoleIdListResponse getPermissionListByRoleIdList(@Vali } @Override - public List getPermissionListByRoleIdList(@NonNull List roleIdList) { - if (CollUtil.isEmpty(roleIdList)) { - return Collections.emptyList(); - } - return permissionMapper.selectPermissionListByRoleIdList(roleIdList); + public List getPermissionListByRoleIdList(@NotEmpty List roleIdList, + @NotEmpty List permissionTypeList) { + return this.getBaseMapper().selectPermissionListByRoleIdList(roleIdList, permissionTypeList); } @Override - public GetPermissionListByUserIdResponse getPermissionListByUserId(@Valid GetPermissionListByUserIdPayload payload) { - val permissionList = this.getPermissionListByUserId(payload.getUserId()); - val response = new GetPermissionListByUserIdResponse(); - permissionList.forEach(permissionPersistence -> { - val permission = new GetPermissionListByUserIdResponse.Permission(); - BeanUtil.copyProperties(permissionPersistence, permission); - response.getPermissionList().add(permission); - }); + public GetServicesInfoResponse getServicesInfo() throws BusinessException { + val serviceIdList = discoveryClient.getServices(); + log.info("Getting service info from Service ID list: {}", serviceIdList); + val response = new GetServicesInfoResponse(); + val mapper = new ObjectMapper(); + log.info("Ignored service ID: {}", permissionConfiguration.getIgnoredServiceIds()); + for (String serviceId : serviceIdList) { + if (CollUtil.contains(permissionConfiguration.getIgnoredServiceIds(), serviceId)) { + log.warn("Ignored service ID: {}", serviceId); + continue; + } + ResponseBodyBean responseBodyBean = Optional.ofNullable(restTemplate.getForObject( + String.format("http://%s/http-api-resources", serviceId), ResponseBodyBean.class)) + .orElseThrow(() -> new BusinessException("Internal service mustn't respond null")); + val data = Optional.of(responseBodyBean.getData()) + .orElseThrow(() -> new BusinessException("HttpApiResourcesResponse mustn't be null")); + val httpApiResourcesResponse = mapper.convertValue(data, HttpApiResourcesResponse.class); + val serviceInfo = new GetServicesInfoResponse.ServiceInfo(); + serviceInfo.setServiceId(serviceId); + serviceInfo.setHttpApiResources(httpApiResourcesResponse); + response.getList().add(serviceInfo); + } + if (CollUtil.isEmpty(response.getList())) { + log.warn("Got am empty ServiceInfo list"); + } return response; } - - @Override - public List getPermissionListByUserId(@NonNull Long userId) { - return permissionMapper.selectPermissionListByUserId(userId); - } } diff --git a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/role/controller/RoleController.java b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/role/controller/RoleController.java index 526472e6..9fd55e81 100644 --- a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/role/controller/RoleController.java +++ b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/role/controller/RoleController.java @@ -1,29 +1,16 @@ package com.jmsoftware.maf.authcenter.role.controller; -import com.jmsoftware.maf.authcenter.role.entity.RolePersistence; import com.jmsoftware.maf.authcenter.role.service.RoleService; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; +import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.RestController; -import javax.annotation.Resource; - - /** - *

RoleController

- *

- * Controller implementation of Role.(Role) +/** + * Description: RoleController, change description here. * - * @author Johnny Miller (鍾俊) - * @date 2020-05-10 22:39:51 - */ + * @author 钟俊(zhongjun), email: zhongjun@toguide.cn, date: 12/17/2020 4:44 PM + **/ @RestController -@RequestMapping("role") +@RequiredArgsConstructor public class RoleController { - @Resource - private RoleService roleService; - - @GetMapping("selectOne") - public RolePersistence selectOne(Long id) { - return this.roleService.queryById(id); - } + private final RoleService roleService; } diff --git a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/role/remote/RoleRemoteApiController.java b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/role/controller/RoleRemoteApiController.java similarity index 57% rename from auth-center/src/main/java/com/jmsoftware/maf/authcenter/role/remote/RoleRemoteApiController.java rename to auth-center/src/main/java/com/jmsoftware/maf/authcenter/role/controller/RoleRemoteApiController.java index de0fed26..558c969f 100644 --- a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/role/remote/RoleRemoteApiController.java +++ b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/role/controller/RoleRemoteApiController.java @@ -1,37 +1,34 @@ -package com.jmsoftware.maf.authcenter.role.remote; +package com.jmsoftware.maf.authcenter.role.controller; import com.jmsoftware.maf.authcenter.role.service.RoleService; import com.jmsoftware.maf.common.bean.ResponseBodyBean; -import com.jmsoftware.maf.common.domain.authcenter.role.GetRoleListByUserIdPayload; import com.jmsoftware.maf.common.domain.authcenter.role.GetRoleListByUserIdResponse; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import javax.validation.Valid; - /** *

RoleRemoteApiController

*

* Change description here. * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com * @date 5/10/20 10:43 PM **/ @RestController @RequiredArgsConstructor @RequestMapping("/role-remote-api") -@Api(tags = {"Role Remote API Controller"}) +@Api(tags = {"Role Remote API"}) public class RoleRemoteApiController { private final RoleService roleService; - @PostMapping("/get-role-list-by-user-id") - @ApiOperation(value = "/get-role-list-by-user-id", notes = "Get role list by user id") - public ResponseBodyBean getRoleListByUserId(@Valid @RequestBody GetRoleListByUserIdPayload payload) { - return ResponseBodyBean.ofSuccess(roleService.getRoleListByUserId(payload)); + @GetMapping("/roles/{userId}") + @ApiOperation(value = "Get role list", notes = "Get role list (Remote API)") + public ResponseBodyBean getRoleList(@PathVariable Long userId) { + return ResponseBodyBean.ofSuccess(roleService.getRoleList(userId)); } } diff --git a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/role/entity/RolePersistence.java b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/role/entity/RolePersistence.java deleted file mode 100644 index 3a1cbcb0..00000000 --- a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/role/entity/RolePersistence.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.jmsoftware.maf.authcenter.role.entity; - -import lombok.Data; - -import java.io.Serializable; -import java.util.Date; - -/** - * Role.(Role) Persistence object class - * - * @author Johnny Miller (鍾俊) - * @since 2020-05-10 22:39:45 - */ -@Data -public class RolePersistence implements Serializable { - private static final long serialVersionUID = -81197803690669820L; - /** - * Primary key - */ - private Long id; - /** - * Role name - */ - private String name; - /** - * Role description - */ - private String description; - /** - * Created time - */ - private Date createdTime; - /** - * Modified time - */ - private Date modifiedTime; -} diff --git a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/role/entity/constant/RoleRedisKey.java b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/role/entity/constant/RoleRedisKey.java new file mode 100644 index 00000000..da13f1c8 --- /dev/null +++ b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/role/entity/constant/RoleRedisKey.java @@ -0,0 +1,22 @@ +package com.jmsoftware.maf.authcenter.role.entity.constant; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +/** + *

RoleRedisKey

+ *

+ * Change description here. + * + * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com, 6/28/21 9:45 PM + **/ +@Getter +@RequiredArgsConstructor +public enum RoleRedisKey { + /** + * Get user by login token key pattern, expired in random [1, 7) days + */ + GET_ROLE_LIST_BY_USER_ID(":role:get_role_list_by_user_id:%s"); + + private final String keyInfixFormat; +} diff --git a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/role/entity/package-info.java b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/role/entity/package-info.java new file mode 100644 index 00000000..8db13650 --- /dev/null +++ b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/role/entity/package-info.java @@ -0,0 +1 @@ +package com.jmsoftware.maf.authcenter.role.entity; diff --git a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/role/entity/persistence/Role.java b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/role/entity/persistence/Role.java new file mode 100644 index 00000000..c388c01b --- /dev/null +++ b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/role/entity/persistence/Role.java @@ -0,0 +1,89 @@ +package com.jmsoftware.maf.authcenter.role.entity.persistence; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +import static com.baomidou.mybatisplus.annotation.FieldFill.INSERT; +import static com.baomidou.mybatisplus.annotation.FieldFill.UPDATE; + +/** + *

Role

+ *

+ * Role Persistence object class + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 6/27/2021 3:22 PM + */ +@Data +@TableName(value = Role.TABLE_NAME) +public class Role { + /** + * Primary key + */ + @TableId(value = COL_ID, type = IdType.AUTO) + private Long id; + + /** + * Role name + */ + @TableField(value = COL_NAME) + private String name; + + /** + * Role description + */ + @TableField(value = COL_DESCRIPTION) + private String description; + + /** + * Created by + */ + @TableField(value = COL_CREATED_BY, fill = INSERT) + private Long createdBy; + + /** + * Created time + */ + @TableField(value = COL_CREATED_TIME, fill = INSERT) + private Date createdTime; + + /** + * Modified by + */ + @TableField(value = COL_MODIFIED_BY, fill = UPDATE) + private Long modifiedBy; + + /** + * Modified time + */ + @TableField(value = COL_MODIFIED_TIME, fill = UPDATE) + private Date modifiedTime; + + /** + * Deleted flag. + */ + @TableField(value = COL_DELETED, fill = INSERT) + private Byte deleted; + + public static final String TABLE_NAME = "role"; + + public static final String COL_ID = "id"; + + public static final String COL_NAME = "name"; + + public static final String COL_DESCRIPTION = "description"; + + public static final String COL_CREATED_BY = "created_by"; + + public static final String COL_CREATED_TIME = "created_time"; + + public static final String COL_MODIFIED_BY = "modified_by"; + + public static final String COL_MODIFIED_TIME = "modified_time"; + + public static final String COL_DELETED = "deleted"; +} diff --git a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/role/mapper/RoleMapper.java b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/role/mapper/RoleMapper.java index ce11eacd..77e86f1c 100644 --- a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/role/mapper/RoleMapper.java +++ b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/role/mapper/RoleMapper.java @@ -1,8 +1,9 @@ package com.jmsoftware.maf.authcenter.role.mapper; -import com.jmsoftware.maf.authcenter.role.entity.RolePersistence; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.jmsoftware.maf.authcenter.role.entity.persistence.Role; +import com.jmsoftware.maf.common.domain.authcenter.role.GetRoleListByUserIdSingleResponse; import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Param; import java.util.List; @@ -11,65 +12,24 @@ *

* Mapper of Role.(Role) * - * @author Johnny Miller (鍾俊) + * @author Johnny Miller (锺俊) * @date 2020 -05-10 22:39:48 */ @Mapper -public interface RoleMapper { +public interface RoleMapper extends BaseMapper { /** - * Query by id role. - * - * @param id the id - * @return the role - */ - RolePersistence queryById(Long id); - - /** - * Query all by limit list. - * - * @param offset the offset - * @param limit the limit - * @return the list - */ - List queryAllByLimit(@Param("offset") int offset, @Param("limit") int limit); - - /** - * Query all list. + * Select role list by user id list. * - * @param rolePersistence the role + * @param userId the user id * @return the list */ - List queryAll(RolePersistence rolePersistence); - - /** - * Insert int. - * - * @param rolePersistence the role - * @return the int - */ - int insert(RolePersistence rolePersistence); + List selectRoleListByUserId(Long userId); /** - * Update int. + * Select by id role persistence. * - * @param rolePersistence the role - * @return the int - */ - int update(RolePersistence rolePersistence); - - /** - * Delete by id int. - * - * @param id the id - * @return the int - */ - int deleteById(Long id); - - /** - * Select role list by user id list. - * - * @param userId the user id - * @return the list + * @param roleName the role name + * @return the role persistence */ - List selectRoleListByUserId(Long userId); + Role selectByName(String roleName); } diff --git a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/role/service/RoleService.java b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/role/service/RoleService.java index e0f7500b..50e5f388 100644 --- a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/role/service/RoleService.java +++ b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/role/service/RoleService.java @@ -1,10 +1,14 @@ package com.jmsoftware.maf.authcenter.role.service; -import com.jmsoftware.maf.authcenter.role.entity.RolePersistence; -import com.jmsoftware.maf.common.domain.authcenter.role.GetRoleListByUserIdPayload; +import com.baomidou.mybatisplus.extension.service.IService; +import com.jmsoftware.maf.authcenter.role.entity.persistence.Role; import com.jmsoftware.maf.common.domain.authcenter.role.GetRoleListByUserIdResponse; +import com.jmsoftware.maf.common.domain.authcenter.role.GetRoleListByUserIdSingleResponse; import lombok.NonNull; +import org.springframework.validation.annotation.Validated; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; import java.util.List; /** @@ -12,25 +16,18 @@ *

* Service of Role.(Role) * - * @author Johnny Miller (鍾俊) + * @author Johnny Miller (锺俊) * @date 2020 -05-10 22:39:49 */ -public interface RoleService { - /** - * Query by ID - * - * @param id the primary key ID - * @return the entity - */ - RolePersistence queryById(Long id); - +@Validated +public interface RoleService extends IService { /** * Gets role list by user id. * - * @param payload the payload + * @param userId the user id * @return the role list by user id */ - GetRoleListByUserIdResponse getRoleListByUserId(GetRoleListByUserIdPayload payload); + GetRoleListByUserIdResponse getRoleList(@NotNull Long userId); /** * Gets role list by user id. @@ -38,38 +35,13 @@ public interface RoleService { * @param userId the user id * @return the role list by user id */ - List getRoleListByUserId(@NonNull Long userId); - - /** - * Query all by limit - * - * @param offset the offset - * @param limit the limit - * @return the entity list - */ - List queryAllByLimit(int offset, int limit); - - /** - * Insert - * - * @param rolePersistence the entity - * @return the entity - */ - RolePersistence insert(RolePersistence rolePersistence); - - /** - * Update - * - * @param rolePersistence the entity - * @return the entity - */ - RolePersistence update(RolePersistence rolePersistence); + List getRoleListByUserId(@NonNull Long userId); /** - * Delete by ID + * Check admin boolean. * - * @param id the primary key ID + * @param roleIdList the role id list * @return the boolean */ - boolean deleteById(Long id); + boolean checkAdmin(@NotEmpty List<@NotNull Long> roleIdList); } diff --git a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/role/service/impl/RoleServiceImpl.java b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/role/service/impl/RoleServiceImpl.java index 0e25e5df..fdc72e90 100644 --- a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/role/service/impl/RoleServiceImpl.java +++ b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/role/service/impl/RoleServiceImpl.java @@ -1,72 +1,83 @@ package com.jmsoftware.maf.authcenter.role.service.impl; -import cn.hutool.core.bean.BeanUtil; -import com.jmsoftware.maf.authcenter.role.entity.RolePersistence; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.BooleanUtil; +import cn.hutool.core.util.RandomUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.jmsoftware.maf.authcenter.role.entity.constant.RoleRedisKey; +import com.jmsoftware.maf.authcenter.role.entity.persistence.Role; import com.jmsoftware.maf.authcenter.role.mapper.RoleMapper; import com.jmsoftware.maf.authcenter.role.service.RoleService; -import com.jmsoftware.maf.common.domain.authcenter.role.GetRoleListByUserIdPayload; import com.jmsoftware.maf.common.domain.authcenter.role.GetRoleListByUserIdResponse; +import com.jmsoftware.maf.common.domain.authcenter.role.GetRoleListByUserIdSingleResponse; +import com.jmsoftware.maf.springcloudstarter.configuration.MafConfiguration; +import com.jmsoftware.maf.springcloudstarter.configuration.MafProjectProperty; import lombok.NonNull; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; import lombok.val; +import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; -import javax.annotation.Resource; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; import java.util.List; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; /** *

RoleServiceImpl

*

* Service implementation of Role.(Role) * - * @author Johnny Miller (鍾俊) + * @author Johnny Miller (锺俊) * @date 2020-05-10 22:39:50 */ -@Service("roleService") -public class RoleServiceImpl implements RoleService { - @Resource - private RoleMapper roleMapper; +@Service +@RequiredArgsConstructor +public class RoleServiceImpl extends ServiceImpl implements RoleService { + private final MafProjectProperty mafProjectProperty; + private final MafConfiguration mafConfiguration; + private final RedisTemplate redisTemplate; + private final ObjectMapper objectMapper; @Override - public RolePersistence queryById(Long id) { - return this.roleMapper.queryById(id); - } - - @Override - public GetRoleListByUserIdResponse getRoleListByUserId(GetRoleListByUserIdPayload payload) { - val roleList = this.getRoleListByUserId(payload.getUserId()); - GetRoleListByUserIdResponse response = new GetRoleListByUserIdResponse(); - roleList.forEach(rolePersistence -> { - GetRoleListByUserIdResponse.Role role = new GetRoleListByUserIdResponse.Role(); - BeanUtil.copyProperties(rolePersistence, role); - response.getRoleList().add(role); - }); + @SneakyThrows({JsonProcessingException.class}) + public GetRoleListByUserIdResponse getRoleList(@NotNull Long userId) { + val key = String.format(mafProjectProperty.getProjectParentArtifactId() + + RoleRedisKey.GET_ROLE_LIST_BY_USER_ID.getKeyInfixFormat(), userId); + val hasKey = redisTemplate.hasKey(key); + if (BooleanUtil.isTrue(hasKey)) { + return objectMapper.readValue(redisTemplate.opsForValue().get(key), GetRoleListByUserIdResponse.class); + } + val response = new GetRoleListByUserIdResponse(); + response.setRoleList(this.getRoleListByUserId(userId)); + redisTemplate.opsForValue().set(key, objectMapper.writeValueAsString(response), RandomUtil.randomLong(1, 7), + TimeUnit.DAYS); return response; } @Override - public List getRoleListByUserId(@NonNull Long userId) { - return roleMapper.selectRoleListByUserId(userId); - } - - @Override - public List queryAllByLimit(int offset, int limit) { - return this.roleMapper.queryAllByLimit(offset, limit); - } - - @Override - public RolePersistence insert(RolePersistence rolePersistence) { - this.roleMapper.insert(rolePersistence); - return rolePersistence; - } - - @Override - public RolePersistence update(RolePersistence rolePersistence) { - this.roleMapper.update(rolePersistence); - return this.queryById(rolePersistence.getId()); + public List getRoleListByUserId(@NonNull Long userId) { + return this.getBaseMapper().selectRoleListByUserId(userId); } @Override - public boolean deleteById(Long id) { - return this.roleMapper.deleteById(id) > 0; + public boolean checkAdmin(@NotEmpty List<@NotNull Long> roleIdList) { + val wrapper = Wrappers.lambdaQuery(Role.class); + wrapper.select(Role::getName) + .in(Role::getId, roleIdList); + val roleList = this.list(wrapper); + val roleNameSet = roleList + .stream() + .map(Role::getName) + .filter(roleName -> StrUtil.equals(mafConfiguration.getSuperUserRole(), roleName)) + .collect(Collectors.toSet()); + // If roleNameSet is not empty (contains "admin") + return CollUtil.isNotEmpty(roleNameSet); } } diff --git a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/security/controller/JwtRemoteApiController.java b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/security/controller/JwtRemoteApiController.java new file mode 100644 index 00000000..f08559aa --- /dev/null +++ b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/security/controller/JwtRemoteApiController.java @@ -0,0 +1,43 @@ +package com.jmsoftware.maf.authcenter.security.controller; + +import com.jmsoftware.maf.authcenter.security.service.JwtService; +import com.jmsoftware.maf.common.bean.ResponseBodyBean; +import com.jmsoftware.maf.common.domain.authcenter.security.ParseJwtResponse; +import com.jmsoftware.maf.common.exception.SecurityException; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.http.HttpServletRequest; + +/** + * Description: JwtRemoteApiController, change description here. + * + * @author 钟俊(zhongjun), email: zhongjun@toguide.cn, date: 12/29/2020 11:04 AM + **/ +@Validated +@Slf4j +@RestController +@RequiredArgsConstructor +@Api(tags = {"JWT Remote API"}) +@RequestMapping("/jwt-remote-api") +public class JwtRemoteApiController { + private final JwtService jwtService; + + /** + * Parse response body bean. + * + * @return the response body bean + */ + @GetMapping("/parse") + @ApiOperation(value = "Parse JWT", notes = "Parse JWT (Remote API)") + public ResponseBodyBean parse(HttpServletRequest request) throws SecurityException { + return ResponseBodyBean.ofSuccess( + new ParseJwtResponse().setUsername(jwtService.getUsernameFromRequest(request))); + } +} diff --git a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/service/JwtService.java b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/security/service/JwtService.java similarity index 79% rename from auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/service/JwtService.java rename to auth-center/src/main/java/com/jmsoftware/maf/authcenter/security/service/JwtService.java index 0959d8c1..ddc5d5fe 100644 --- a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/service/JwtService.java +++ b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/security/service/JwtService.java @@ -1,9 +1,10 @@ -package com.jmsoftware.maf.authcenter.universal.service; +package com.jmsoftware.maf.authcenter.security.service; import com.jmsoftware.maf.common.exception.SecurityException; import io.jsonwebtoken.Claims; import org.springframework.security.core.Authentication; import org.springframework.security.core.GrantedAuthority; +import org.springframework.validation.annotation.Validated; import javax.servlet.http.HttpServletRequest; import java.util.Collection; @@ -14,9 +15,9 @@ *

* Change description here. * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 5/7/20 5:15 PM + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 12/29/2020 10:44 AM */ +@Validated public interface JwtService { /** * Create JWT string. @@ -25,7 +26,7 @@ public interface JwtService { * @param rememberMe the remember me * @return the string */ - String createJwt(Authentication authentication, Boolean rememberMe) throws SecurityException; + String createJwt(Authentication authentication, Boolean rememberMe); /** * Create JWT string. @@ -38,13 +39,14 @@ public interface JwtService { * @return the JWT string */ String createJwt(Boolean rememberMe, Long id, String subject, List roles, Collection authorities) throws SecurityException; + extends GrantedAuthority> authorities); /** * Parse JWT. * * @param jwt the jwt * @return the claims + * @throws SecurityException the security exception */ Claims parseJwt(String jwt) throws SecurityException; @@ -52,6 +54,7 @@ String createJwt(Boolean rememberMe, Long id, String subject, List roles * Invalidate jwt. * * @param request the request + * @throws SecurityException the security exception */ void invalidateJwt(HttpServletRequest request) throws SecurityException; @@ -60,6 +63,7 @@ String createJwt(Boolean rememberMe, Long id, String subject, List roles * * @param jwt the jwt * @return the username from jwt + * @throws SecurityException the security exception */ String getUsernameFromJwt(String jwt) throws SecurityException; @@ -68,6 +72,7 @@ String createJwt(Boolean rememberMe, Long id, String subject, List roles * * @param request the request * @return the username from request + * @throws SecurityException the security exception */ String getUsernameFromRequest(HttpServletRequest request) throws SecurityException; diff --git a/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/service/impl/JwtServiceImpl.java b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/security/service/impl/JwtServiceImpl.java similarity index 67% rename from api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/service/impl/JwtServiceImpl.java rename to auth-center/src/main/java/com/jmsoftware/maf/authcenter/security/service/impl/JwtServiceImpl.java index 7ee57269..e72259de 100644 --- a/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/service/impl/JwtServiceImpl.java +++ b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/security/service/impl/JwtServiceImpl.java @@ -1,20 +1,20 @@ -package com.jmsoftware.maf.apiportal.universal.service.impl; +package com.jmsoftware.maf.authcenter.security.service.impl; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; -import com.jmsoftware.maf.apiportal.universal.configuration.Constants; -import com.jmsoftware.maf.apiportal.universal.configuration.JwtConfiguration; -import com.jmsoftware.maf.apiportal.universal.domain.UserPrincipal; -import com.jmsoftware.maf.apiportal.universal.service.JwtService; -import com.jmsoftware.maf.apiportal.universal.service.RedisService; -import com.jmsoftware.maf.common.constant.HttpStatus; +import com.jmsoftware.maf.authcenter.security.service.JwtService; +import com.jmsoftware.maf.common.domain.authcenter.security.UserPrincipal; import com.jmsoftware.maf.common.exception.SecurityException; +import com.jmsoftware.maf.springcloudstarter.configuration.JwtConfiguration; import io.jsonwebtoken.*; import io.jsonwebtoken.security.Keys; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import lombok.val; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; import org.springframework.security.core.Authentication; import org.springframework.security.core.GrantedAuthority; import org.springframework.stereotype.Service; @@ -33,7 +33,7 @@ *

JwtServiceImpl

* Change description here. * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com * @date 2019-03-03 13:40 **/ @Slf4j @@ -42,7 +42,7 @@ @SuppressWarnings("unused") public class JwtServiceImpl implements JwtService { private final JwtConfiguration jwtConfiguration; - private final RedisService redisService; + private final RedisTemplate redisTemplate; private SecretKey secretKey; private JwtParser jwtParser; @@ -55,7 +55,7 @@ private void init() { } @Override - public String createJwt(Authentication authentication, Boolean rememberMe) throws SecurityException { + public String createJwt(Authentication authentication, Boolean rememberMe) { val userPrincipal = (UserPrincipal) authentication.getPrincipal(); return createJwt(rememberMe, userPrincipal.getId(), userPrincipal.getUsername(), userPrincipal.getRoles(), userPrincipal.getAuthorities()); @@ -63,7 +63,7 @@ public String createJwt(Authentication authentication, Boolean rememberMe) throw @Override public String createJwt(Boolean rememberMe, Long id, String subject, List roles, - Collection authorities) throws SecurityException { + Collection authorities) { val now = new Date(); val builder = Jwts.builder() .setId(id.toString()) @@ -71,7 +71,7 @@ public String createJwt(Boolean rememberMe, Long id, String subject, List new SecurityException(HttpStatus.TOKEN_PARSE_ERROR, + .orElseThrow(() -> new SecurityException(HttpStatus.INTERNAL_SERVER_ERROR, "The JWT Claims Set is null", null)); } catch (ExpiredJwtException e) { log.error("JWT is expired. Message: {} JWT: {}", e.getMessage(), jwt); - throw new SecurityException(HttpStatus.TOKEN_EXPIRED); + throw new SecurityException(HttpStatus.UNAUTHORIZED, "JWT is expired (JWT itself)"); } catch (UnsupportedJwtException e) { log.error("JWT is unsupported. Message: {} JWT: {}", e.getMessage(), jwt); - throw new SecurityException(HttpStatus.TOKEN_PARSE_ERROR); + throw new SecurityException(HttpStatus.UNAUTHORIZED, "JWT is unsupported"); } catch (MalformedJwtException e) { log.error("JWT is invalid. Message: {} JWT: {}", e.getMessage(), jwt); - throw new SecurityException(HttpStatus.TOKEN_PARSE_ERROR); + throw new SecurityException(HttpStatus.UNAUTHORIZED, "JWT is invalid"); } catch (IllegalArgumentException e) { log.error("The parameter of JWT is invalid. Message: {} JWT: {}", e.getMessage(), jwt); - throw new SecurityException(HttpStatus.TOKEN_PARSE_ERROR); + throw new SecurityException(HttpStatus.UNAUTHORIZED, "The parameter of JWT is invalid"); } val username = claims.getSubject(); - val redisKeyOfJwt = Constants.REDIS_JWT_KEY_PREFIX + username; + val redisKeyOfJwt = jwtConfiguration.getJwtRedisKeyPrefix() + username; // Check if JWT exists - val expire = redisService.getExpire(redisKeyOfJwt, TimeUnit.MILLISECONDS); + val expire = redisTemplate.opsForValue().getOperations().getExpire(redisKeyOfJwt, TimeUnit.MILLISECONDS); if (ObjectUtil.isNull(expire) || expire <= 0) { - throw new SecurityException(HttpStatus.TOKEN_EXPIRED); + throw new SecurityException(HttpStatus.UNAUTHORIZED, "JWT is expired (Redis expiration)"); } // Check if the current JWT is equal to the one in Redis. // If it's noe equal, that indicates current user has signed out or logged in before. // Both situations reveal the JWT has expired. - val jwtInRedis = redisService.get(redisKeyOfJwt); + val jwtInRedis = (String) redisTemplate.opsForValue().get(redisKeyOfJwt); if (!StrUtil.equals(jwt, jwtInRedis)) { - throw new SecurityException(HttpStatus.TOKEN_OUT_OF_CONTROL); + throw new SecurityException(HttpStatus.UNAUTHORIZED, "JWT is expired (Not equaled)"); } return claims; } @@ -131,8 +128,9 @@ public void invalidateJwt(HttpServletRequest request) throws SecurityException { val jwt = getJwtFromRequest(request); val username = getUsernameFromJwt(jwt); // Delete JWT from redis - val deletedKeyNumber = redisService.delete(Constants.REDIS_JWT_KEY_PREFIX + username); - log.error("Invalidate JWT. Username = {}, deleted = {}", username, deletedKeyNumber); + String redisKeyOfJwt = String.format("%s%s", jwtConfiguration.getJwtRedisKeyPrefix(), username); + val deletedKeyNumber = redisTemplate.opsForValue().getOperations().delete(redisKeyOfJwt); + log.error("Invalidate JWT. Redis key of JWT = {}, deleted = {}", redisKeyOfJwt, deletedKeyNumber); } @Override @@ -149,9 +147,9 @@ public String getUsernameFromRequest(HttpServletRequest request) throws Security @Override public String getJwtFromRequest(HttpServletRequest request) { - val bearerToken = request.getHeader(Constants.REQUEST_TOKEN_KEY); - if (StrUtil.isNotBlank(bearerToken) && bearerToken.startsWith(Constants.JWT_PREFIX)) { - return bearerToken.substring(Constants.JWT_PREFIX.length()); + val bearerToken = request.getHeader(HttpHeaders.AUTHORIZATION); + if (StrUtil.isNotBlank(bearerToken) && bearerToken.startsWith(JwtConfiguration.TOKEN_PREFIX)) { + return bearerToken.substring(JwtConfiguration.TOKEN_PREFIX.length()); } return null; } diff --git a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/configuration/Constants.java b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/configuration/Constants.java deleted file mode 100644 index daf328d2..00000000 --- a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/configuration/Constants.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.jmsoftware.maf.authcenter.universal.configuration; - -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -/** - *

Constants

- *

- * Change description here. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 5/2/20 11:41 PM - **/ -@Slf4j -@Component -public class Constants { - public Constants(ProjectProperty projectProperty) { - REDIS_JWT_KEY_PREFIX = String.format("%s:jwt:", projectProperty.getProjectParentArtifactId()); - log.info("Initiated 'REDIS_JWT_KEY_PREFIX': {}", REDIS_JWT_KEY_PREFIX); - } - - /** - * Key prefix of JWT stored in Redis. - */ - public static String REDIS_JWT_KEY_PREFIX; - /** - * Token key of request header. - */ - public static final String REQUEST_TOKEN_KEY = "Authorization"; - /** - * Prefix of JWT. - */ - public static final String JWT_PREFIX = "Bearer "; - /** - * Star sign - */ - public static final String ASTERISK = "*"; - /** - * At sign - */ - public static final String AT_SIGN = "@"; -} diff --git a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/configuration/DruidConfiguration.java b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/configuration/DruidConfiguration.java deleted file mode 100644 index f87bb65b..00000000 --- a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/configuration/DruidConfiguration.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.jmsoftware.maf.authcenter.universal.configuration; - -import com.alibaba.druid.pool.DruidDataSource; -import com.alibaba.druid.support.http.StatViewServlet; -import com.alibaba.druid.support.http.WebStatFilter; -import lombok.RequiredArgsConstructor; -import lombok.val; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.boot.web.servlet.FilterRegistrationBean; -import org.springframework.boot.web.servlet.ServletRegistrationBean; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import javax.sql.DataSource; - -/** - *

DruidConfiguration

- *

- * Druid Configuration - * Click me to view Druid Monitor - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2019-03-24 13:31 - **/ -@Configuration -@RequiredArgsConstructor -public class DruidConfiguration { - @Bean - public ServletRegistrationBean druidServlet() { - val servletRegistrationBean = new ServletRegistrationBean<>(new StatViewServlet(), "/druid/*"); - servletRegistrationBean.addInitParameter("loginUsername", "admin"); - servletRegistrationBean.addInitParameter("loginPassword", "admin"); - servletRegistrationBean.addInitParameter("resetEnable", "false"); - return servletRegistrationBean; - } - - @Bean - public FilterRegistrationBean filterRegistrationBean() { - val filterRegistrationBean = new FilterRegistrationBean(); - filterRegistrationBean.setFilter(new WebStatFilter()); - filterRegistrationBean.addUrlPatterns("/*"); - // Ignored resources - filterRegistrationBean.addInitParameter("exclusions", - "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"); - filterRegistrationBean.addInitParameter("profileEnable", "true"); - filterRegistrationBean.addInitParameter("principalCookieName", "USER_COOKIE"); - filterRegistrationBean.addInitParameter("principalSessionName", "USER_SESSION"); - return filterRegistrationBean; - } - - @Bean - @ConfigurationProperties(prefix = "spring.datasource") - public DataSource druidDataSource() { - return new DruidDataSource(); - } -} diff --git a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/configuration/MyBatisPlusConfiguration.java b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/configuration/MyBatisPlusConfiguration.java deleted file mode 100644 index 3097fc3f..00000000 --- a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/configuration/MyBatisPlusConfiguration.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.jmsoftware.maf.authcenter.universal.configuration; - -import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor; -import com.baomidou.mybatisplus.extension.plugins.pagination.optimize.JsqlParserCountOptimize; -import lombok.val; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.transaction.annotation.EnableTransactionManagement; - -/** - *

MyBatisPlusConfiguration

- *

- * Change description here. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2019-05-02 11:57 - **/ -@Configuration -@EnableTransactionManagement -public class MyBatisPlusConfiguration { - /** - * Inject bean to enable pagination. - * - * @return bean for pagination - */ - @Bean - public PaginationInterceptor paginationInterceptor() { - val paginationInterceptor = new PaginationInterceptor(); - // Set maximum query record count - paginationInterceptor.setLimit(100L); - // Enable JSQL Parser Count Optimizing (for left join) - paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true)); - return paginationInterceptor; - } -} diff --git a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/configuration/ProjectProperty.java b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/configuration/ProjectProperty.java deleted file mode 100644 index 527dc005..00000000 --- a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/configuration/ProjectProperty.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.jmsoftware.maf.authcenter.universal.configuration; - -import lombok.Data; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.stereotype.Component; - -/** - *

ProjectProperty

- *

- * Change description here. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2019-04-18 13:01 - **/ -@Data -@Component -@ConfigurationProperties(prefix = "project.property") -public class ProjectProperty { - private String basePackage; - private String contextPath; - private String groupId; - private String projectParentArtifactId; - private String projectArtifactId; - private String version; - private String description; - private String jdkVersion; - private String environment; - private String url; - private String inceptionYear; - private String organizationName; - private String organizationUrl; - private String issueManagementSystem; - private String issueManagementUrl; - private String developerName; - private String developerEmail; - private String developerUrl; -} diff --git a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/configuration/RedisClientConfiguration.java b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/configuration/RedisClientConfiguration.java deleted file mode 100644 index cc9b0956..00000000 --- a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/configuration/RedisClientConfiguration.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.jmsoftware.maf.authcenter.universal.configuration; - -import lombok.val; -import org.springframework.boot.autoconfigure.AutoConfigureAfter; -import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration; -import org.springframework.cache.annotation.CachingConfigurerSupport; -import org.springframework.cache.annotation.EnableCaching; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; -import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer; -import org.springframework.data.redis.serializer.StringRedisSerializer; - -import java.io.Serializable; - -/** - *

RedisClientConfiguration

- *

- * Ignored request configuration. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 5/2/20 11:41 PM - **/ -@Configuration -@EnableCaching -@AutoConfigureAfter(RedisAutoConfiguration.class) -public class RedisClientConfiguration extends CachingConfigurerSupport { - /** - * Redis template. Support for <String, Serializable> - */ - @Bean - public RedisTemplate redisFactory(LettuceConnectionFactory lettuceConnectionFactory) { - val template = new RedisTemplate(); - template.setKeySerializer(new StringRedisSerializer()); - template.setValueSerializer(new GenericJackson2JsonRedisSerializer()); - template.setConnectionFactory(lettuceConnectionFactory); - return template; - } -} diff --git a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/configuration/ServerConfiguration.java b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/configuration/ServerConfiguration.java deleted file mode 100644 index a59eca85..00000000 --- a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/configuration/ServerConfiguration.java +++ /dev/null @@ -1,118 +0,0 @@ -package com.jmsoftware.maf.authcenter.universal.configuration; - -import lombok.Getter; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import lombok.val; -import org.springframework.boot.web.context.WebServerInitializedEvent; -import org.springframework.context.ApplicationListener; -import org.springframework.stereotype.Component; - -import java.io.BufferedReader; -import java.io.InputStreamReader; -import java.net.Inet4Address; -import java.net.InetAddress; -import java.net.NetworkInterface; -import java.net.URL; -import java.util.Enumeration; - -/** - *

ServerConfiguration

- *

- * Change description here. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2019-04-26 16:02 - **/ -@Slf4j -@Getter -@Component -@RequiredArgsConstructor -public class ServerConfiguration implements ApplicationListener { - private static final String DEVELOPMENT_ENVIRONMENT = "development"; - private final ProjectProperty projectProperty; - private int serverPort; - - @Override - public void onApplicationEvent(WebServerInitializedEvent event) { - this.serverPort = event.getWebServer().getPort(); - } - - /** - *

Get base URL of backend server.

- *

The result will be like:

- *
    - *
  1. http://[serverIp]:[serverPort]/[contextPath]
  2. - *
  3. https://[serverIp]/[contextPath]
  4. - *
- * - * @return base URL - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2019-05-03 16:05 - */ - public String getBaseUrl() { - return "http://" + this.getPublicIp() + ":" + serverPort + projectProperty.getContextPath(); - } - - /** - * Find public IP address. - * - * @return public IP - */ - public String getPublicIp() { - if (projectProperty.getEnvironment().contains(DEVELOPMENT_ENVIRONMENT)) { - return this.getInternetIp(); - } - try { - // An API provided by https://whatismyipaddress.com/api - val url = new URL("https://ipv4bot.whatismyipaddress.com/"); - val sc = new BufferedReader(new InputStreamReader(url.openStream())); - // Read system IP Address - return sc.readLine().trim(); - } catch (Exception e) { - log.error("Cannot execute properly to get IP address from https://whatismyipaddress.com/api", e); - } - return this.getInternetIp(); - } - - /** - * Get internet IP. - * - * @return internet IP - */ - private String getInternetIp() { - val intranetIp = this.getIntranetIp(); - try { - val networks = NetworkInterface.getNetworkInterfaces(); - InetAddress ip; - Enumeration addresses; - while (networks.hasMoreElements()) { - addresses = networks.nextElement().getInetAddresses(); - while (addresses.hasMoreElements()) { - ip = addresses.nextElement(); - if (ip instanceof Inet4Address - && ip.isSiteLocalAddress() - && !ip.getHostAddress().equals(intranetIp)) { - return ip.getHostAddress(); - } - } - } - return intranetIp; - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - /** - * Get intranet IP. - * - * @return intranet IP - */ - private String getIntranetIp() { - try { - return InetAddress.getLocalHost().getHostAddress(); - } catch (Exception e) { - throw new RuntimeException(e); - } - } -} diff --git a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/configuration/SftpClientConfiguration.java b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/configuration/SftpClientConfiguration.java deleted file mode 100644 index fb7ce716..00000000 --- a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/configuration/SftpClientConfiguration.java +++ /dev/null @@ -1,108 +0,0 @@ -package com.jmsoftware.maf.authcenter.universal.configuration; - -import com.jcraft.jsch.ChannelSftp; -import lombok.Data; -import lombok.val; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.core.io.Resource; -import org.springframework.expression.common.LiteralExpression; -import org.springframework.integration.annotation.ServiceActivator; -import org.springframework.integration.file.remote.session.CachingSessionFactory; -import org.springframework.integration.file.remote.session.SessionFactory; -import org.springframework.integration.sftp.outbound.SftpMessageHandler; -import org.springframework.integration.sftp.session.DefaultSftpSessionFactory; -import org.springframework.integration.sftp.session.SftpRemoteFileTemplate; -import org.springframework.messaging.MessageHandler; -import org.springframework.stereotype.Component; - -import java.io.File; - -/** - *

SftpClientConfiguration

- *

SFTP client configuration

- * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2019-07-04 18:18 - **/ -@Data -@Component -@ConfigurationProperties(prefix = "sftp.client.configuration") -public class SftpClientConfiguration { - /** - * SFTP server IP - */ - private String host; - /** - * SFTP server port - */ - private Integer port; - /** - * Login user - */ - private String user; - /** - * Login password - */ - private String password; - /** - * Remote directory - */ - private String directory; - /** - * Private key - */ - private Resource privateKey; - /** - * Private key pass phrase - */ - private String privateKeyPassPhrase; - /** - * The maximum cache size of session. Default: 10 - */ - private Integer sessionCacheSize = 10; - /** - * The session wait timeout (time unit: MILLISECONDS). Default: 10 * 1000L (10 seconds) - */ - private Long sessionWaitTimeout = 10 * 1000L; - - @Bean - public SessionFactory sftpSessionFactory() { - val factory = new DefaultSftpSessionFactory(true); - factory.setHost(host); - factory.setPort(port); - factory.setUser(user); - if (privateKey != null) { - factory.setPrivateKey(privateKey); - factory.setPrivateKeyPassphrase(privateKeyPassPhrase); - } else { - factory.setPassword(password); - } - factory.setAllowUnknownKeys(true); - // We return a caching session factory, so that we don't have to reconnect to SFTP server for each time - val cachingSessionFactory = new CachingSessionFactory<>(factory, sessionCacheSize); - cachingSessionFactory.setSessionWaitTimeout(sessionWaitTimeout); - return cachingSessionFactory; - } - - @Bean - @ServiceActivator(inputChannel = "toSftpChannel") - @SuppressWarnings("UnresolvedMessageChannel") - public MessageHandler handler(SessionFactory sftpSessionFactory) { - val handler = new SftpMessageHandler(sftpSessionFactory); - handler.setRemoteDirectoryExpression(new LiteralExpression(directory)); - handler.setFileNameGenerator(message -> { - if (message.getPayload() instanceof File) { - return ((File) message.getPayload()).getName(); - } else { - throw new IllegalArgumentException("File expected as payload."); - } - }); - return handler; - } - - @Bean - public SftpRemoteFileTemplate template(SessionFactory sftpSessionFactory) { - return new SftpRemoteFileTemplate(sftpSessionFactory); - } -} diff --git a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/configuration/SftpSubDirectoryRunner.java b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/configuration/SftpSubDirectoryRunner.java deleted file mode 100644 index 85760bfe..00000000 --- a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/configuration/SftpSubDirectoryRunner.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.jmsoftware.maf.authcenter.universal.configuration; - -import com.jmsoftware.maf.authcenter.universal.domain.SftpSubDirectory; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import lombok.val; -import org.springframework.boot.ApplicationArguments; -import org.springframework.boot.ApplicationRunner; -import org.springframework.integration.sftp.session.SftpRemoteFileTemplate; -import org.springframework.stereotype.Component; - -/** - *

SftpSubDirectoryRunner

- *

After dependency injection finished, we must inti the SFTP server's sub directory for out business. If you want - * to customize initialization configuration, config SftpSubDirectory.

- * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2019-07-05 08:51 - * @see SftpSubDirectory - **/ -@Slf4j -@Component -@RequiredArgsConstructor -public class SftpSubDirectoryRunner implements ApplicationRunner { - private final SftpRemoteFileTemplate sftpRemoteFileTemplate; - private final SftpClientConfiguration sftpClientConfiguration; - - @Override - public void run(ApplicationArguments args) { - sftpRemoteFileTemplate.setAutoCreateDirectory(true); - sftpRemoteFileTemplate.execute(session -> { - if (!session.exists(sftpClientConfiguration.getDirectory())) { - log.info("Make directories for SFTP server. Directory: {}", sftpClientConfiguration.getDirectory()); - session.mkdir(sftpClientConfiguration.getDirectory()); - } else { - log.info("SFTP server remote directory exists: {}", sftpClientConfiguration.getDirectory()); - } - return null; - }); - - log.info("Staring to initial SFTP server sub directory."); - sftpRemoteFileTemplate.execute(session -> { - for (val sftpSubDirectory : SftpSubDirectory.values()) { - val fullPath = sftpClientConfiguration.getDirectory() + sftpSubDirectory.getSubDirectory(); - if (!session.exists(fullPath)) { - log.info("SFTP server sub directory does not exist. Creating sub directory: {}", fullPath); - session.mkdir(fullPath); - } else { - log.info("SFTP server sub directory exists. Path: {}", fullPath); - } - } - return null; - }); - log.info("Initialing SFTP server sub directory is done."); - } -} diff --git a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/configuration/SftpUploadGateway.java b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/configuration/SftpUploadGateway.java deleted file mode 100644 index dc144254..00000000 --- a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/configuration/SftpUploadGateway.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.jmsoftware.maf.authcenter.universal.configuration; - -import org.springframework.integration.annotation.Gateway; -import org.springframework.integration.annotation.MessagingGateway; -import org.springframework.stereotype.Component; - -import java.io.File; - -/** - *

SftpUploadGateway

- *

Change description here

- * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2019-07-04 21:03 - **/ -@Component -@MessagingGateway -public interface SftpUploadGateway { - /** - * Upload file - * - * @param file file - */ - @Gateway(requestChannel = "toSftpChannel") - @SuppressWarnings("UnresolvedMessageChannel") - void upload(File file); -} diff --git a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/configuration/Swagger2Configuration.java b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/configuration/Swagger2Configuration.java deleted file mode 100644 index 9d18e778..00000000 --- a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/configuration/Swagger2Configuration.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.jmsoftware.maf.authcenter.universal.configuration; - -import lombok.RequiredArgsConstructor; -import lombok.val; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import springfox.documentation.builders.ApiInfoBuilder; -import springfox.documentation.builders.PathSelectors; -import springfox.documentation.builders.RequestHandlerSelectors; -import springfox.documentation.service.ApiInfo; -import springfox.documentation.service.Contact; -import springfox.documentation.spi.DocumentationType; -import springfox.documentation.spring.web.plugins.Docket; -import springfox.documentation.swagger2.annotations.EnableSwagger2; - -/** - *

Swagger2Configuration

- *

- * Swagger 2 Configuration - * Click me to view - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2019-02-07 16:15 - **/ -@Configuration -@EnableSwagger2 -@RequiredArgsConstructor -public class Swagger2Configuration { - private final ProjectProperty projectProperty; - private static final String LINE_SEPARATOR = System.lineSeparator(); - - @Bean - public Docket createRestApi() { - return new Docket(DocumentationType.SWAGGER_2) - .apiInfo(apiInfo()) - .select() - .apis(RequestHandlerSelectors.basePackage(projectProperty.getBasePackage())) - .paths(PathSelectors.any()) - .build(); - } - - private ApiInfo apiInfo() { - val projectArtifactId = projectProperty.getProjectArtifactId(); - val version = projectProperty.getVersion(); - val developerEmail = projectProperty.getDeveloperEmail(); - val developerUrl = projectProperty.getDeveloperUrl(); - return new ApiInfoBuilder() - .title(String.format("API for %s@%s", projectArtifactId, version)) - .description(String.format("%s %sArtifact ID: %s%sEnvironment: %s", - projectProperty.getDescription(), - LINE_SEPARATOR, - projectArtifactId, - LINE_SEPARATOR, - projectProperty.getEnvironment())) - .contact(new Contact(String.format("%s, email: %s%sHome page: %s", - projectProperty.getDeveloperName(), - developerEmail, - LINE_SEPARATOR, - developerUrl), - developerUrl, developerEmail)) - .version(version) - .build(); - } -} diff --git a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/configuration/WebSecurityConfiguration.java b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/configuration/WebSecurityConfiguration.java deleted file mode 100644 index 8c32eadb..00000000 --- a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/configuration/WebSecurityConfiguration.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.jmsoftware.maf.authcenter.universal.configuration; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.context.annotation.Configuration; -import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; - -/** - *

WebSecurityConfiguration

- *

- * Security handler configuration. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 5/2/20 11:41 PM - **/ -@Slf4j -@Configuration -@EnableWebSecurity -@RequiredArgsConstructor -public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter { - @Override - protected void configure(HttpSecurity http) throws Exception { - // Disable web security. - http.cors() - // Disable CSRF (Cross-site request forgery) - .and().csrf().disable() - // Disable form login to use custom login - .formLogin().disable() - .httpBasic().disable() - .authorizeRequests().anyRequest().permitAll(); - } -} diff --git a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/controller/CommonController.java b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/controller/CommonController.java deleted file mode 100644 index a709eace..00000000 --- a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/controller/CommonController.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.jmsoftware.maf.authcenter.universal.controller; - -import com.jmsoftware.maf.authcenter.universal.service.CommonService; -import com.jmsoftware.maf.authcenter.universal.service.RedisService; -import com.jmsoftware.maf.common.bean.ResponseBodyBean; -import com.jmsoftware.maf.common.domain.ValidationTestPayload; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; -import lombok.val; -import org.springframework.web.bind.annotation.*; - -import java.util.Map; - -/** - *

CommonController

- *

- * Change description here. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2/4/20 10:29 AM - **/ -@RestController -@RequiredArgsConstructor -@RequestMapping("/common") -@Api(tags = {"Common Controller"}) -public class CommonController { - private final CommonService commonService; - private final RedisService redisService; - - @GetMapping("/app-info") - @ApiOperation(value = "/app-info", notes = "Retrieve application information") - public ResponseBodyBean> applicationInformation() { - val data = commonService.getApplicationInfo(); - redisService.set("appInfo", data.toString()); - return ResponseBodyBean.ofSuccess(data, "Succeed to retrieve app info."); - } - - @PostMapping("/validation-test") - @ApiOperation(value = "/validation-test", notes = "Validation of request payload test") - public ResponseBodyBean validationTest(@RequestBody ValidationTestPayload payload) { - commonService.validateObject(payload); - return ResponseBodyBean.ofSuccess(payload.getName(), "validationTest()"); - } -} diff --git a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/controller/ErrorController.java b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/controller/ErrorController.java deleted file mode 100644 index 603c17ae..00000000 --- a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/controller/ErrorController.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.jmsoftware.maf.authcenter.universal.controller; - -import io.swagger.annotations.Api; -import lombok.extern.slf4j.Slf4j; -import lombok.val; -import org.springframework.boot.autoconfigure.web.ServerProperties; -import org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController; -import org.springframework.boot.autoconfigure.web.servlet.error.ErrorViewResolver; -import org.springframework.boot.web.servlet.error.ErrorAttributes; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.RestController; - -import javax.servlet.http.HttpServletRequest; -import java.util.List; -import java.util.Map; -import java.util.Optional; - -/** - *

ErrorController

- *

- * Error controller. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2019-03-02 16:56 - **/ -@Slf4j -@RestController -@Api(tags = {"Error Controller"}) -public class ErrorController extends BasicErrorController { - public ErrorController(ErrorAttributes errorAttributes, - ServerProperties serverProperties, - List errorViewResolvers) { - super(errorAttributes, serverProperties.getError(), errorViewResolvers); - } - - @Override - public ResponseEntity> error(HttpServletRequest request) { - val httpStatus = getStatus(request); - val body = getErrorAttributes(request, isIncludeStackTrace(request, MediaType.ALL)); - body.put("message", httpStatus.getReasonPhrase()); - val optionalTrace = Optional.ofNullable(body.get("trace")); - optionalTrace.ifPresent(trace -> { - val message = body.get("message"); - val firstLineOfTrace = trace.toString().split("\\n")[0]; - val joinedMessage = String.format("%s %s", message, firstLineOfTrace); - body.put("message", joinedMessage); - body.put("trace", "Trace has been simplified. Refer to 'message'"); - }); - log.error("Captured HTTP request error. Response body = {}", body); - return new ResponseEntity<>(body, httpStatus); - } -} diff --git a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/domain/ApiStatus.java b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/domain/ApiStatus.java deleted file mode 100644 index 020997c0..00000000 --- a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/domain/ApiStatus.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.jmsoftware.maf.authcenter.universal.domain; - -import lombok.Getter; - -/** - * Description: ApiStatus, change description here. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2019-04-07 23:32 - **/ -@Getter -public enum ApiStatus { - /** - * Idled API (not stored in db). - */ - IDLED(0), - /** - * API in used (stored in db). - */ - IN_USE(1); - - private final Integer status; - - ApiStatus(Integer status) { - this.status = status; - } - - /** - * Get ApiStatus by status. - * - * @param status status code - * @return ApiStatus enum - */ - public static ApiStatus getByStatus(Integer status) { - ApiStatus[] apiStatuses = ApiStatus.values(); - for (ApiStatus apiStatus : apiStatuses) { - if (apiStatus.status.equals(status)) { - return apiStatus; - } - } - return null; - } -} diff --git a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/domain/GetApiListPLO.java b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/domain/GetApiListPLO.java deleted file mode 100644 index d745c1ee..00000000 --- a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/domain/GetApiListPLO.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.jmsoftware.maf.authcenter.universal.domain; - -import com.jmsoftware.maf.common.bean.PaginationBase; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - *

GetApiListPLO

- *

Change description here

- * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2019-05-11 13:48 - **/ -@Data -@EqualsAndHashCode(callSuper = true) -public class GetApiListPLO extends PaginationBase { -} diff --git a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/domain/GetUserInfoRO.java b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/domain/GetUserInfoRO.java deleted file mode 100644 index 48c49d31..00000000 --- a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/domain/GetUserInfoRO.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.jmsoftware.maf.authcenter.universal.domain; - -import lombok.Data; - -import java.util.ArrayList; -import java.util.Date; -import java.util.List; - -/** - *

GetUserInfoRO

- *

Change description here

- * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2019-06-30 11:01 - **/ -@Data -public class GetUserInfoRO { - private Long id; - private String username; - private String email; - private String cellphone; - private String fullName; - private Date birthday; - private String gender; - private Integer status; - private List usersRoles = new ArrayList<>(); - - @Data - public static class UsersRole { - private Long roleId; - private String roleName; - private String roleDescription; - } -} diff --git a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/domain/PermissionPO.java b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/domain/PermissionPO.java deleted file mode 100644 index 050ecb2d..00000000 --- a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/domain/PermissionPO.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.jmsoftware.maf.authcenter.universal.domain; - -import lombok.Data; - -import java.util.Date; - -/** - *

PermissionPO

- *

Persistence class for table `t_permission`

- * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2019-03-23 19:48 - **/ -@Data -public class PermissionPO { - /** - * Primary key - */ - private Long id; - /** - * URL. If type of record is page (1), URL stands for route; if type of record is button (2), URL stands for API - */ - private String url; - /** - * PermissionPO description - */ - private String description; - /** - * PermissionPO type. Page-1, Button-2 - */ - private Integer type; - /** - * PermissionPO expression. - */ - private String permissionExpression; - /** - * HTTP method of API. - */ - private String method; - /** - * Sort. - */ - private Integer sort; - /** - * Primary key of parent. - */ - private Long parentId; - /** - * Deleted flag - */ - private Byte deleted; - /** - * Created time - */ - private Date createdTime; - /** - * Modified time - */ - private Date modifiedTime; -} diff --git a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/domain/PermissionType.java b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/domain/PermissionType.java deleted file mode 100644 index 5f1c3955..00000000 --- a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/domain/PermissionType.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.jmsoftware.maf.authcenter.universal.domain; - -import lombok.Getter; -import lombok.extern.slf4j.Slf4j; - -/** - *

PermissionType

- *

Change description here

- * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2019-05-25 10:24 - **/ -@Slf4j -@Getter -public enum PermissionType { - /** - * Controller - */ - CONTROLLER(0, "Controller"), - /** - * Page - */ - PAGE(1, "Page"), - /** - * Button - */ - BUTTON(2, "Button (API)"); - - private final Integer type; - private final String description; - - PermissionType(Integer type, String description) { - this.type = type; - this.description = description; - } - - public static PermissionType getByType(Integer type) { - PermissionType permissionType = null; - PermissionType[] values = PermissionType.values(); - for (PermissionType pt : values) { - if (pt.getType().equals(type)) { - permissionType = pt; - } - } - return permissionType; - } - - /** - * Get enum by name - * - * @param name enum name - * @return enum - */ - public static PermissionType getByName(String name) { - try { - return PermissionType.valueOf(name); - } catch (IllegalArgumentException e) { - log.error("Invalid enum name: {}", name, e); - return null; - } - } -} diff --git a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/domain/RolePO.java b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/domain/RolePO.java deleted file mode 100644 index 74e2960a..00000000 --- a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/domain/RolePO.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.jmsoftware.maf.authcenter.universal.domain; - -import lombok.Data; - -import java.util.Date; - -/** - *

RolePO

- *

Persistence class for table `t_role`

- * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2019-03-23 19:50 - **/ -@Data -public class RolePO { - /** - * Primary key - */ - private Long id; - /** - * Role name - */ - private String name; - /** - * Role description - */ - private String description; - /** - * Create time - */ - private Date createdTime; - /** - * Modify time - */ - private Date modifiedTime; -} diff --git a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/domain/RolePermissionPO.java b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/domain/RolePermissionPO.java deleted file mode 100644 index 7e7c8868..00000000 --- a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/domain/RolePermissionPO.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.jmsoftware.maf.authcenter.universal.domain; - -import lombok.Data; - -/** - *

RolePermissionPO

- *

Role-permission relation. Persistence class for table `t_role_permission`

- * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2019-03-23 19:50 - **/ -@Data -public class RolePermissionPO { - /** - * Role's ID. - */ - private Long roleId; - /** - * Permission's ID. - */ - private Long permissionId; -} diff --git a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/domain/SftpUploadFile.java b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/domain/SftpUploadFile.java deleted file mode 100644 index d352939e..00000000 --- a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/domain/SftpUploadFile.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.jmsoftware.maf.authcenter.universal.domain; - -import lombok.Builder; -import lombok.Data; -import org.springframework.integration.file.support.FileExistsMode; - -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; -import java.io.File; - -/** - *

SftpUploadFile

- *

Change description here

- * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2019-07-06 11:22 - **/ -@Data -@Builder -public class SftpUploadFile { - /** - * File to be uploaded to SFTP server - */ - @NotNull - private File fileToBeUploaded; - /** - * SFTP server's sub directory (if sub directory does'nt exist, will be auto created). Not empty and it looks - * like this: "/some/sub/directory/" - */ - @NotEmpty - private String subDirectory; - /** - * This enumeration indicates what action shall be taken in case the destination file already exists. In default, - * it should be set as: FileExistsMode.REPLACE - */ - @NotNull - private FileExistsMode fileExistsMode; -} diff --git a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/domain/UserPO.java b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/domain/UserPO.java deleted file mode 100644 index 81adf4d0..00000000 --- a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/domain/UserPO.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.jmsoftware.maf.authcenter.universal.domain; - -import lombok.Data; - -import java.util.Date; - -/** - *

UserPO

- *

Persistence class for table `t_user`

- * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2019-03-23 19:51 - **/ -@Data -public class UserPO { - /** - * Primary key - */ - private Long id; - /** - * Username - */ - private String username; - /** - * Email - */ - private String email; - /** - * Cellphone number - */ - private String cellphone; - /** - * Password - */ - private String password; - /** - * Nickname - */ - private String fullName; - /** - * Birthday (yyyy-MM-dd) - */ - private Date birthday; - /** - * 58 gender options - */ - private String gender; - /** - * UserPersistence avatar full path on SFTP server - */ - private String avatar; - /** - * Status. 1 - enabled, 2 - disabled - */ - private Integer status; - /** - * Create time - */ - private Date createdTime; - /** - * Modify time - */ - private Date modifiedTime; -} diff --git a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/domain/UserPrincipal.java b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/domain/UserPrincipal.java deleted file mode 100644 index 2be1a4be..00000000 --- a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/domain/UserPrincipal.java +++ /dev/null @@ -1,152 +0,0 @@ -package com.jmsoftware.maf.authcenter.universal.domain; - -import cn.hutool.core.util.StrUtil; -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.jmsoftware.maf.common.domain.authcenter.user.UserStatus; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; -import org.springframework.security.core.GrantedAuthority; -import org.springframework.security.core.authority.SimpleGrantedAuthority; -import org.springframework.security.core.userdetails.UserDetails; - -import java.util.Collection; -import java.util.Date; -import java.util.List; -import java.util.Objects; -import java.util.stream.Collectors; - -/** - *

UserPrincipal

- *

Custom user details.

- * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2019-03-23 20:52 - **/ -@Data -@NoArgsConstructor -@AllArgsConstructor -public class UserPrincipal implements UserDetails { - private static final long serialVersionUID = -53353171692896501L; - - /** - * Primary key - */ - private Long id; - /** - * Username - */ - private String username; - /** - * Email - */ - private String email; - /** - * Phone - */ - private String cellphone; - /** - * Password - */ - @JsonIgnore - private String password; - /** - * Nickname - */ - private String fullName; - /** - * Birthday - */ - private Date birthday; - /** - * Gender - */ - private String gender; - /** - * Status - */ - private Integer status; - /** - * Create time - */ - private Date gmtCreated; - /** - * Modify time - */ - private Date gmtModified; - /** - * Roles that user has - */ - private List roles; - /** - * Authorities that user has - */ - private Collection authorities; - - /** - * Create user principal - * - * @param user user po - * @param roleList role po list - * @param permissionList permission po list - * @return user principal - */ - public static UserPrincipal create(UserPO user, List roleList, List permissionList) { - List roleNames = roleList.stream().map(RolePO::getName).collect(Collectors.toList()); - - List authorities = - permissionList.stream() - .filter(permission -> StrUtil.isNotBlank(permission.getPermissionExpression())) - .map(permission -> new SimpleGrantedAuthority(permission.getPermissionExpression())) - .collect(Collectors.toList()); - - return new UserPrincipal(user.getId(), - user.getUsername(), - user.getEmail(), - user.getCellphone(), - user.getPassword(), - user.getFullName(), - user.getBirthday(), - user.getGender(), - user.getStatus(), - user.getCreatedTime(), - user.getModifiedTime(), - roleNames, - authorities); - } - - @Override - public Collection getAuthorities() { - return authorities; - } - - @Override - public String getPassword() { - return password; - } - - @Override - public String getUsername() { - return username; - } - - @Override - public boolean isAccountNonExpired() { - return true; - } - - @Override - public boolean isAccountNonLocked() { - return true; - } - - @Override - public boolean isCredentialsNonExpired() { - return true; - } - - @Override - public boolean isEnabled() { - return Objects.equals(this.status, UserStatus.ENABLED.getStatus()); - } -} diff --git a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/mapper/RolePermissionMapper.java b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/mapper/RolePermissionMapper.java deleted file mode 100644 index e58f431f..00000000 --- a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/mapper/RolePermissionMapper.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.jmsoftware.maf.authcenter.universal.mapper; - -import com.jmsoftware.maf.authcenter.universal.domain.RolePermissionPO; -import org.apache.ibatis.annotations.Mapper; -import org.springframework.stereotype.Component; - -import java.util.List; - -/** - *

RolePermissionMapper

- *

CRUD operations for table `t_role_permission`

- * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2019-03-02 17:55 - **/ -@Mapper -@Component -public interface RolePermissionMapper { - /** - * Delete by role's ID - * - * @param po persistence object - * @return affected row - */ - Integer deleteByRoleId(RolePermissionPO po); - - /** - * Insert a batch of records - * - * @param poList PO list - * @return affected row - */ - Integer insertBatch(List poList); -} diff --git a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/mapper/UserMapper.java b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/mapper/UserMapper.java deleted file mode 100644 index c60a674f..00000000 --- a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/mapper/UserMapper.java +++ /dev/null @@ -1,141 +0,0 @@ -package com.jmsoftware.maf.authcenter.universal.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.jmsoftware.maf.authcenter.universal.domain.UserPO; -import org.apache.ibatis.annotations.Param; - -import java.util.List; -import java.util.Optional; - -/** - *

UserMapper

- *

CRUD operations for table `t_user`

- * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2019-03-02 17:32 - **/ -//@Mapper -//@Component -public interface UserMapper extends BaseMapper { - /** - * Find by username, email or cellphone. - *

- * TODO: do not retrieve useless fields on result map - * - * @param username Username - * @param email Email - * @param cellphone cellphone number - * @return User information. - */ - Optional selectByUsernameOrEmailOrCellphone(@Param("username") String username, - @Param("email") String email, - @Param("cellphone") String cellphone); - - /** - * Count by username. - * - * @param username username string - * @return the count of username occurrence - */ - Integer countByUsername(String username); - - /** - * Count by email. - * - * @param email email string - * @return the count of email occurrence - */ - Integer countByEmail(String email); - - /** - * Save user - * - * @param po A new user. - * @return Last inserted ID. - */ - Long save(UserPO po); - - /** - * Register - * - * @param po UserPersistence info - * @return Registered user ID - */ - Long register(UserPO po); - - /** - * Select user page list - * - * @param page pagination object - * @return user page list - */ - IPage selectUserPageList(Page page); - - /** - * Select user by ID and status - * - * @param params query params - * @return user persistence object - */ - UserPO selectByIdAndStatus(@Param("params") UserPO params); - - /** - * Update user's basic information by ID - * - * @param updated updated user - * @return affected rows - */ - int updateUserBasicInfoById(@Param("updated") UserPO updated); - - /** - * Select user by username - * - * @param username username - * @return user po - */ - UserPO selectByUsername(@Param("username") String username); - - /** - * Select user list for lazy selection - * - * @param page pagination object - * @return user page list - */ - IPage selectUserListForSelection(Page page); - - /** - * Select user status by ID and username - * - * @param id user ID - * @param username username - * @return user status - */ - Integer selectStatusByIdAndUsername(@Param("id") Long id, @Param("username") String username); - - /** - * Insert user-role relation - * - * @param userId user ID - * @param roleIdList role ID list - * @return affected rows - */ - int insertUserIdAndRoleIdList(@Param("userId") Long userId, @Param("roleIdList") List roleIdList); - - /** - * Update avatar by user's ID - * - * @param po persistence object - * @return affected rows - */ - int updateAvatarByUsername(@Param("updated") UserPO po); - - /** - * Select user's ID and avatar by username - * - * @param username username - * @return po - */ - UserPO selectIdAndAvatarByUsername(@Param("username") String username); -} diff --git a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/mapper/UserRoleMapper.java b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/mapper/UserRoleMapper.java deleted file mode 100644 index fd63ca88..00000000 --- a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/mapper/UserRoleMapper.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.jmsoftware.maf.authcenter.universal.mapper; - -/** - *

UserRoleMapper

- *

CRUD operations for table `t_user_role`

- * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2019-03-02 17:33 - **/ -public interface UserRoleMapper { -} diff --git a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/service/RedisService.java b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/service/RedisService.java deleted file mode 100644 index c5c4b331..00000000 --- a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/service/RedisService.java +++ /dev/null @@ -1,107 +0,0 @@ -package com.jmsoftware.maf.authcenter.universal.service; - -import java.io.Serializable; -import java.util.Collection; -import java.util.List; -import java.util.concurrent.TimeUnit; - -/** - *

RedisService

- *

Redis service interface for Redis useful operations

- * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2019-07-05 09:38 - **/ -public interface RedisService { - /** - * Set key and value in Redis with expiration - * - * @param key key - * @param value value - * @param expirationTime expiration time - * @param timeUnit time unit - * @return true - operation done; false - operation failure - */ - Boolean set(String key, String value, Long expirationTime, TimeUnit timeUnit); - - /** - * Set key and list in Redis with expiration - * - * @param key key - * @param list list - * @param expirationTime expiration time - * @param timeUnit time unit - * @return true - operation done; false - operation failure - */ - Boolean set(String key, List list, Long expirationTime, TimeUnit timeUnit); - - /** - * Set key and value in Redis - * - * @param key key - * @param value value - * @return true - operation done; false - operation failure - */ - Boolean set(String key, String value); - - /** - * Set key and list in Redis - * - * @param key key - * @param list list - * @return true - operation done; false - operation failure - */ - Boolean set(String key, List list); - - /** - * Make key expire - * - * @param key key - * @param expirationTime expiration time - * @param timeUnit time unit - * @return true - operation done; false - operation failure - */ - Boolean expire(String key, long expirationTime, TimeUnit timeUnit); - - /** - * Get expiration time by key - * - * @param key key - * @param timeUnit time unit - * @return expiration time. Null when used in pipeline / transaction. - */ - Long getExpire(String key, TimeUnit timeUnit); - - /** - * Get value by key - * - * @param key key - * @return null when key does not exist or used in pipeline / transaction. - */ - String get(String key); - - /** - * Get list by key - * - * @param key key - * @param clazz type - * @return null when key does not exist or used in pipeline / transaction. - */ - List get(String key, Class clazz); - - /** - * Delete by key - * - * @param key key - * @return the number of keys that were removed. Null when used in pipeline / transaction. - */ - Long delete(String key); - - /** - * Delete by keys - * - * @param keys key list - * @return the number of keys that were removed. Null when used in pipeline / transaction. - */ - Long delete(Collection keys); -} diff --git a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/service/impl/CommonServiceImpl.java b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/service/impl/CommonServiceImpl.java deleted file mode 100644 index 944aab7c..00000000 --- a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/service/impl/CommonServiceImpl.java +++ /dev/null @@ -1,122 +0,0 @@ -package com.jmsoftware.maf.authcenter.universal.service.impl; - -import com.jmsoftware.maf.authcenter.universal.configuration.ProjectProperty; -import com.jmsoftware.maf.authcenter.universal.service.CommonService; -import com.jmsoftware.maf.common.domain.ValidationTestPayload; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import javax.validation.Valid; -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - *

CommonServiceImpl

- *

- * Change description here. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2/4/20 11:16 AM - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class CommonServiceImpl implements CommonService { - private final ProjectProperty projectProperty; - - @Override - public Map getApplicationInfo() { - var map = new HashMap(16); - var fieldsInfo = getFieldsInfo(projectProperty); - fieldsInfo.forEach(fieldInfo -> { - var type = fieldInfo.get("type"); - if ("class java.lang.String".equals(type)) { - map.put((String) fieldInfo.get("name"), fieldInfo.get("value")); - } - }); - return map; - } - - @Override - public void validateObject(@Valid ValidationTestPayload payload) { - log.info("Validation passed! {}", payload); - } - - /** - * Gets field value by name. - * - * @param fieldName the field name - * @param object the object - * @return the field value by name - * @see Java 中遍历一个对象的所有属性 - */ - private Object getFieldValueByName(String fieldName, Object object) { - try { - String firstLetter = fieldName.substring(0, 1).toUpperCase(); - String getter = "get" + firstLetter + fieldName.substring(1); - Method method = object.getClass().getMethod(getter); - return method.invoke(object); - } catch (Exception e) { - log.error("Can't get field's value by name! Cause: {}", e.getMessage()); - return null; - } - } - - /** - * Get filed name string [ ]. - * - * @param o the o - * @return the string [ ] - * @see Java 中遍历一个对象的所有属性 - */ - private String[] getFiledName(Object o) { - Field[] fields = o.getClass().getDeclaredFields(); - String[] fieldNames = new String[fields.length]; - for (int i = 0; i < fields.length; i++) { - log.info("fields[i].getType(): {}", fields[i].getType()); - fieldNames[i] = fields[i].getName(); - } - return fieldNames; - } - - /** - * Get Fields Info - * - * @param o the o - * @return the fields info - * @see Java 中遍历一个对象的所有属性 - */ - private List> getFieldsInfo(Object o) { - Field[] fields = o.getClass().getDeclaredFields(); - var arrayList = new ArrayList>(); - for (Field field : fields) { - var infoMap = new HashMap(16); - infoMap.put("type", field.getType().toString()); - infoMap.put("name", field.getName()); - infoMap.put("value", getFieldValueByName(field.getName(), o)); - arrayList.add(infoMap); - } - return arrayList; - } - - /** - * Get Filed Values - * - * @param o the o - * @return the object [ ] - * @see Java 中遍历一个对象的所有属性 - */ - public Object[] getFiledValues(Object o) { - String[] fieldNames = this.getFiledName(o); - Object[] value = new Object[fieldNames.length]; - for (int i = 0; i < fieldNames.length; i++) { - value[i] = this.getFieldValueByName(fieldNames[i], o); - } - return value; - } -} diff --git a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/service/impl/JwtServiceImpl.java b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/service/impl/JwtServiceImpl.java deleted file mode 100644 index 7eba09d7..00000000 --- a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/service/impl/JwtServiceImpl.java +++ /dev/null @@ -1,158 +0,0 @@ -package com.jmsoftware.maf.authcenter.universal.service.impl; - -import cn.hutool.core.date.DateUtil; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; -import com.jmsoftware.maf.authcenter.universal.configuration.Constants; -import com.jmsoftware.maf.authcenter.universal.configuration.JwtConfiguration; -import com.jmsoftware.maf.authcenter.universal.domain.UserPrincipal; -import com.jmsoftware.maf.authcenter.universal.service.JwtService; -import com.jmsoftware.maf.authcenter.universal.service.RedisService; -import com.jmsoftware.maf.common.constant.HttpStatus; -import com.jmsoftware.maf.common.exception.SecurityException; -import io.jsonwebtoken.*; -import io.jsonwebtoken.security.Keys; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import lombok.val; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.GrantedAuthority; -import org.springframework.stereotype.Service; - -import javax.annotation.PostConstruct; -import javax.crypto.SecretKey; -import javax.servlet.http.HttpServletRequest; -import java.nio.charset.StandardCharsets; -import java.util.Collection; -import java.util.Date; -import java.util.List; -import java.util.Optional; -import java.util.concurrent.TimeUnit; - -/** - *

JwtServiceImpl

- * Change description here. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2019-03-03 13:40 - **/ -@Slf4j -@Service -@RequiredArgsConstructor -@SuppressWarnings("unused") -public class JwtServiceImpl implements JwtService { - private final JwtConfiguration jwtConfiguration; - private final RedisService redisService; - private SecretKey secretKey; - private JwtParser jwtParser; - - @PostConstruct - private void init() { - log.info("Start to init class members of {}.", this.getClass().getSimpleName()); - secretKey = Keys.hmacShaKeyFor(jwtConfiguration.getSigningKey().getBytes(StandardCharsets.UTF_8)); - log.warn("Secret key for JWT was generated. Algorithm: {}", secretKey.getAlgorithm()); - jwtParser = Jwts.parserBuilder().setSigningKey(secretKey).build(); - } - - @Override - public String createJwt(Authentication authentication, Boolean rememberMe) throws SecurityException { - val userPrincipal = (UserPrincipal) authentication.getPrincipal(); - return createJwt(rememberMe, userPrincipal.getId(), userPrincipal.getUsername(), userPrincipal.getRoles(), - userPrincipal.getAuthorities()); - } - - @Override - public String createJwt(Boolean rememberMe, Long id, String subject, List roles, - Collection authorities) throws SecurityException { - val now = new Date(); - val builder = Jwts.builder() - .setId(id.toString()) - .setSubject(subject) - .setIssuedAt(now) - .signWith(secretKey) - .claim("roles", roles); - // TODO: Don't generate authority information in JWT. - // .claim("authorities", authorities) - // Set expire duration of JWT. - val ttl = rememberMe ? jwtConfiguration.getTtlForRememberMe() : jwtConfiguration.getTtl(); - if (ttl > 0) { - builder.setExpiration(DateUtil.offsetMillisecond(now, ttl.intValue())); - } - val jwt = builder.compact(); - // Store new JWT in Redis - val redisOperationResult = redisService.set(Constants.REDIS_JWT_KEY_PREFIX + subject, jwt, ttl, - TimeUnit.MILLISECONDS); - if (redisOperationResult) { - return jwt; - } else { - throw new SecurityException(HttpStatus.ERROR, "Cannot persist JWT into Redis", null); - } - } - - @Override - public Claims parseJwt(String jwt) throws SecurityException { - Claims claims; - try { - claims = Optional.ofNullable(jwtParser.parseClaimsJws(jwt).getBody()) - .orElseThrow(() -> new SecurityException(HttpStatus.TOKEN_PARSE_ERROR, - "The JWT Claims Set is null", null)); - } catch (ExpiredJwtException e) { - log.error("JWT is expired. Message: {} JWT: {}", e.getMessage(), jwt); - throw new SecurityException(HttpStatus.TOKEN_EXPIRED); - } catch (UnsupportedJwtException e) { - log.error("JWT is unsupported. Message: {} JWT: {}", e.getMessage(), jwt); - throw new SecurityException(HttpStatus.TOKEN_PARSE_ERROR); - } catch (MalformedJwtException e) { - log.error("JWT is invalid. Message: {} JWT: {}", e.getMessage(), jwt); - throw new SecurityException(HttpStatus.TOKEN_PARSE_ERROR); - } catch (IllegalArgumentException e) { - log.error("The parameter of JWT is invalid. Message: {} JWT: {}", e.getMessage(), jwt); - throw new SecurityException(HttpStatus.TOKEN_PARSE_ERROR); - } - val username = claims.getSubject(); - val redisKeyOfJwt = Constants.REDIS_JWT_KEY_PREFIX + username; - // Check if JWT exists - val expire = redisService.getExpire(redisKeyOfJwt, TimeUnit.MILLISECONDS); - if (ObjectUtil.isNull(expire) || expire <= 0) { - throw new SecurityException(HttpStatus.TOKEN_EXPIRED); - } - // Check if the current JWT is equal to the one in Redis. - // If it's noe equal, that indicates current user has signed out or logged in before. - // Both situations reveal the JWT has expired. - val jwtInRedis = redisService.get(redisKeyOfJwt); - if (!StrUtil.equals(jwt, jwtInRedis)) { - throw new SecurityException(HttpStatus.TOKEN_OUT_OF_CONTROL); - } - return claims; - } - - @Override - public void invalidateJwt(HttpServletRequest request) throws SecurityException { - val jwt = getJwtFromRequest(request); - val username = getUsernameFromJwt(jwt); - // Delete JWT from redis - val deletedKeyNumber = redisService.delete(Constants.REDIS_JWT_KEY_PREFIX + username); - log.error("Invalidate JWT. Username = {}, deleted = {}", username, deletedKeyNumber); - } - - @Override - public String getUsernameFromJwt(String jwt) throws SecurityException { - val claims = parseJwt(jwt); - return claims.getSubject(); - } - - @Override - public String getUsernameFromRequest(HttpServletRequest request) throws SecurityException { - val jwt = this.getJwtFromRequest(request); - return this.getUsernameFromJwt(jwt); - } - - @Override - public String getJwtFromRequest(HttpServletRequest request) { - val bearerToken = request.getHeader(Constants.REQUEST_TOKEN_KEY); - if (StrUtil.isNotBlank(bearerToken) && bearerToken.startsWith(Constants.JWT_PREFIX)) { - return bearerToken.substring(Constants.JWT_PREFIX.length()); - } - return null; - } -} diff --git a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/service/impl/RedisServiceImpl.java b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/service/impl/RedisServiceImpl.java deleted file mode 100644 index 39c3fc03..00000000 --- a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/service/impl/RedisServiceImpl.java +++ /dev/null @@ -1,110 +0,0 @@ -package com.jmsoftware.maf.authcenter.universal.service.impl; - -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; -import cn.hutool.json.JSONUtil; -import com.jmsoftware.maf.authcenter.universal.service.RedisService; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.data.redis.connection.RedisStringCommands; -import org.springframework.data.redis.core.RedisCallback; -import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.data.redis.core.types.Expiration; -import org.springframework.stereotype.Service; - -import java.io.Serializable; -import java.util.Collection; -import java.util.List; -import java.util.Objects; -import java.util.concurrent.TimeUnit; - -/** - *

RedisServiceImpl

- *

Redis service implementation for Redis useful operations

- * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2019-07-05 09:39 - **/ -@Service -public class RedisServiceImpl implements RedisService { - private final RedisTemplate redisTemplate; - - public RedisServiceImpl(@Qualifier("redisFactory") RedisTemplate redisTemplate) { - this.redisTemplate = redisTemplate; - } - - @Override - public Boolean set(String key, String value, Long expirationTime, TimeUnit timeUnit) { - return redisTemplate.execute((RedisCallback) connection -> { - var serializer = redisTemplate.getStringSerializer(); - var result = connection.set(Objects.requireNonNull(serializer.serialize(key)), - Objects.requireNonNull(serializer.serialize(value)), - Expiration.from(expirationTime, timeUnit), - RedisStringCommands.SetOption.upsert()); - return ObjectUtil.isNotNull(result) ? result : false; - }); - } - - @Override - public Boolean set(String key, List list, Long expirationTime, TimeUnit timeUnit) { - var value = JSONUtil.toJsonStr(list); - return set(key, value, expirationTime, timeUnit); - } - - @Override - public Boolean set(String key, String value) { - return redisTemplate.execute((RedisCallback) connection -> { - var serializer = redisTemplate.getStringSerializer(); - var result = connection.set(Objects.requireNonNull(serializer.serialize(key)), - Objects.requireNonNull(serializer.serialize(value))); - return ObjectUtil.isNotNull(result) ? result : false; - }); - } - - @Override - public Boolean set(String key, List list) { - var value = JSONUtil.toJsonStr(list); - return set(key, value); - } - - @Override - public Boolean expire(String key, long expirationTime, TimeUnit timeUnit) { - var result = redisTemplate.expire(key, expirationTime, timeUnit); - return ObjectUtil.isNotNull(result) ? result : false; - } - - @Override - public Long getExpire(String key, TimeUnit timeUnit) { - return redisTemplate.getExpire(key, timeUnit); - } - - @Override - public String get(String key) { - return redisTemplate.execute((RedisCallback) connection -> { - var serializer = redisTemplate.getStringSerializer(); - var bytes = connection.get(Objects.requireNonNull(serializer.serialize(key))); - return serializer.deserialize(bytes); - }); - } - - @Override - public List get(String key, Class clazz) { - var json = get(key); - if (StrUtil.isNotBlank(json)) { - return JSONUtil.toList(JSONUtil.parseArray(json), clazz); - } - return null; - } - - @Override - public Long delete(String key) { - return redisTemplate.execute((RedisCallback) connection -> { - var serializer = redisTemplate.getStringSerializer(); - return connection.del(serializer.serialize(key)); - }); - } - - @Override - public Long delete(Collection keys) { - return redisTemplate.delete(keys); - } -} diff --git a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/user/controller/UserController.java b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/user/controller/UserController.java index 778567a9..36b0a901 100644 --- a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/user/controller/UserController.java +++ b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/user/controller/UserController.java @@ -1,21 +1,60 @@ package com.jmsoftware.maf.authcenter.user.controller; +import com.jmsoftware.maf.authcenter.user.entity.GetUserStatusPayload; import com.jmsoftware.maf.authcenter.user.service.UserService; +import com.jmsoftware.maf.common.bean.ResponseBodyBean; +import com.jmsoftware.maf.common.domain.authcenter.user.LoginPayload; +import com.jmsoftware.maf.common.domain.authcenter.user.LoginResponse; +import com.jmsoftware.maf.common.domain.authcenter.user.SignupPayload; +import com.jmsoftware.maf.common.domain.authcenter.user.SignupResponse; +import com.jmsoftware.maf.common.exception.SecurityException; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; - /** +import javax.servlet.http.HttpServletRequest; +import javax.validation.Valid; + +/** *

UserController

*

* Controller implementation of UserPersistence.(UserPersistence) * - * @author Johnny Miller (鍾俊) + * @author Johnny Miller (锺俊) * @date 2020-05-10 12:08:28 */ +@Validated @RestController @RequiredArgsConstructor -@RequestMapping("/user") +@Api(tags = {"User API"}) public class UserController { private final UserService userService; + + @PostMapping("/users/signup") + @ApiOperation(value = "Signup", notes = "Save user for signup") + public ResponseBodyBean signup(@Valid @RequestBody SignupPayload payload) { + return ResponseBodyBean.ofSuccess(userService.saveUserForSignup(payload)); + } + + @PostMapping("/users/login") + @ApiOperation(value = "Login", notes = "Login") + public ResponseBodyBean login(@Valid @RequestBody LoginPayload payload) throws SecurityException { + return ResponseBodyBean.ofSuccess(userService.login(payload)); + } + + @PostMapping("/users/logout") + @ApiOperation(value = "Logout", notes = "Logout") + public ResponseBodyBean logout(HttpServletRequest request) throws SecurityException { + return ResponseBodyBean.ofSuccess(userService.logout(request)); + } + + @GetMapping("/users/status") + public ResponseBodyBean getUserStatus(@Valid GetUserStatusPayload payload) { + return ResponseBodyBean.ofSuccess(userService.getUserStatus(payload), "Correct enum value"); + } } diff --git a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/user/controller/UserRemoteApiController.java b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/user/controller/UserRemoteApiController.java new file mode 100644 index 00000000..dbd107fd --- /dev/null +++ b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/user/controller/UserRemoteApiController.java @@ -0,0 +1,46 @@ +package com.jmsoftware.maf.authcenter.user.controller; + +import com.jmsoftware.maf.authcenter.user.entity.GetUserPageListPayload; +import com.jmsoftware.maf.authcenter.user.entity.persistence.User; +import com.jmsoftware.maf.authcenter.user.service.UserService; +import com.jmsoftware.maf.common.bean.PageResponseBodyBean; +import com.jmsoftware.maf.common.bean.ResponseBodyBean; +import com.jmsoftware.maf.common.domain.authcenter.user.GetUserByLoginTokenResponse; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.validation.Valid; + +/** + *

UserRemoteApiController

+ *

+ * Change description here. + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com + * @date 5/10/20 12:36 PM + **/ +@Validated +@RestController +@RequiredArgsConstructor +@RequestMapping("/user-remote-api") +@Api(tags = {"User Remote API"}) +public class UserRemoteApiController { + private final UserService userService; + + @GetMapping("/users/{loginToken}") + @ApiOperation(value = "Get user by login token", notes = "Get user by login token (Remote)") + public ResponseBodyBean getUserByLoginToken(@PathVariable String loginToken) { + return ResponseBodyBean.ofSuccess(userService.getUserByLoginToken(loginToken)); + } + + @GetMapping("/users") + public PageResponseBodyBean getUserPageList(@Valid GetUserPageListPayload payload) { + return userService.getUserPageList(payload); + } +} diff --git a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/user/entity/GetUserPageListPayload.java b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/user/entity/GetUserPageListPayload.java new file mode 100644 index 00000000..c0b293c1 --- /dev/null +++ b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/user/entity/GetUserPageListPayload.java @@ -0,0 +1,28 @@ +package com.jmsoftware.maf.authcenter.user.entity; + +import com.jmsoftware.maf.common.bean.PaginationBase; +import com.jmsoftware.maf.springcloudstarter.validation.annotation.DateTimeRangeConstraints; +import com.jmsoftware.maf.springcloudstarter.validation.annotation.DateTimeRangeGroup; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDateTime; + +import static com.jmsoftware.maf.springcloudstarter.validation.annotation.DateTimeRangeType.END_TIME; +import static com.jmsoftware.maf.springcloudstarter.validation.annotation.DateTimeRangeType.START_TIME; + +/** + * Description: GetUserPageList, change description here. + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 6/27/2021 4:32 PM + **/ +@Data +@DateTimeRangeConstraints +@EqualsAndHashCode(callSuper = true) +public class GetUserPageListPayload extends PaginationBase { + private String username; + @DateTimeRangeGroup(type = START_TIME) + private LocalDateTime startTime; + @DateTimeRangeGroup(type = END_TIME) + private LocalDateTime endTime; +} diff --git a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/user/entity/GetUserStatusPayload.java b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/user/entity/GetUserStatusPayload.java new file mode 100644 index 00000000..af7a007a --- /dev/null +++ b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/user/entity/GetUserStatusPayload.java @@ -0,0 +1,22 @@ +package com.jmsoftware.maf.authcenter.user.entity; + +import com.jmsoftware.maf.common.domain.authcenter.user.UserStatus; +import com.jmsoftware.maf.common.domain.authcenter.user.UserStatus2; +import com.jmsoftware.maf.springcloudstarter.validation.annotation.ValidEnumValue; +import lombok.Data; + +/** + *

GetUserStatusPayload

+ *

+ * Change description here. + * + * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com + * @date 6/6/21 4:31 PM + **/ +@Data +public class GetUserStatusPayload { + @ValidEnumValue(targetEnum = UserStatus.class) + private Byte status; + @ValidEnumValue(targetEnum = UserStatus2.class) + private Byte status2; +} diff --git a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/user/entity/UserPersistence.java b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/user/entity/UserPersistence.java deleted file mode 100644 index bdb46ee6..00000000 --- a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/user/entity/UserPersistence.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.jmsoftware.maf.authcenter.user.entity; - -import lombok.Data; - -import java.io.Serializable; -import java.util.Date; - -/** - *

UserPersistence

- *

- * User Persistence object class - * - * @author Johnny Miller (鍾俊), e-mail: johnnysviva@outlook.com - * @date 5/10/20 12:12 PM - */ -@Data -public class UserPersistence implements Serializable { - private static final long serialVersionUID = -11418821727467072L; - /** - * Primary key of user - */ - private Long id; - /** - * Username - */ - private String username; - /** - * Email - */ - private String email; - /** - * Cellphone number - */ - private String cellphone; - /** - * Password - */ - private String password; - /** - * Full name - */ - private String fullName; - /** - * Birthday - */ - private Date birthday; - /** - * 26 gender options - */ - private String gender; - /** - * UserPersistence avatar full path on SFTP server - */ - private String avatar; - /** - * Status. 1 - enabled, 2 - disabled - */ - private Integer status; - /** - * Created time - */ - private Date createdTime; - /** - * Modified time - */ - private Date modifiedTime; -} diff --git a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/user/entity/constant/UserRedisKey.java b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/user/entity/constant/UserRedisKey.java new file mode 100644 index 00000000..28cf2361 --- /dev/null +++ b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/user/entity/constant/UserRedisKey.java @@ -0,0 +1,20 @@ +package com.jmsoftware.maf.authcenter.user.entity.constant; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +/** + * Description: UserRedisKey, change description here. + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 6/28/2021 3:18 PM + **/ +@Getter +@RequiredArgsConstructor +public enum UserRedisKey { + /** + * Get user by login token key pattern, expired in random [1, 7) days + */ + GET_USER_BY_LOGIN_TOKEN(":user:get_user_by_login_token:%s"); + + private final String keyInfixFormat; +} diff --git a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/user/entity/persistence/User.java b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/user/entity/persistence/User.java new file mode 100644 index 00000000..37bb3f7a --- /dev/null +++ b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/user/entity/persistence/User.java @@ -0,0 +1,143 @@ +package com.jmsoftware.maf.authcenter.user.entity.persistence; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; + +import java.util.Date; + +import static com.baomidou.mybatisplus.annotation.FieldFill.INSERT; +import static com.baomidou.mybatisplus.annotation.FieldFill.UPDATE; + +/** + *

User

+ *

+ * User Persistence object class + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 6/27/2021 3:22 PM + */ +@Data +@SuppressWarnings("jol") +@TableName(value = User.TABLE_NAME) +public class User { + /** + * Primary key of user + */ + @TableId(value = COL_ID, type = IdType.AUTO) + private Long id; + + /** + * Username + */ + @TableField(value = COL_USERNAME) + private String username; + + /** + * Email + */ + @TableField(value = COL_EMAIL) + private String email; + + /** + * Cellphone number + */ + @TableField(value = COL_CELLPHONE) + private String cellphone; + + /** + * Password + */ + @TableField(value = COL_PASSWORD) + private String password; + + /** + * Full name + */ + @TableField(value = COL_FULL_NAME) + private String fullName; + + /** + * Birthday + */ + @TableField(value = COL_BIRTHDAY) + private Date birthday; + + /** + * 26 gender options + */ + @TableField(value = COL_GENDER) + private Object gender; + + /** + * User avatar full path on SFTP server + */ + @TableField(value = COL_AVATAR) + private String avatar; + + /** + * Status. 1 - enabled, 2 - disabled + */ + @TableField(value = COL_STATUS) + private Byte status; + + /** + * Created by + */ + @TableField(value = COL_CREATED_BY, fill = INSERT) + private Long createdBy; + + /** + * Created time + */ + @TableField(value = COL_CREATED_TIME, fill = INSERT) + private Date createdTime; + + /** + * Modified by + */ + @TableField(value = COL_MODIFIED_BY, fill = UPDATE) + private Long modifiedBy; + + /** + * Modified time + */ + @TableField(value = COL_MODIFIED_TIME, fill = UPDATE) + private Date modifiedTime; + + /** + * Delete flag. + */ + @TableField(value = COL_DELETED, fill = INSERT) + private Byte deleted; + + public static final String TABLE_NAME = "user"; + + public static final String COL_ID = "id"; + + public static final String COL_USERNAME = "username"; + + public static final String COL_EMAIL = "email"; + + public static final String COL_CELLPHONE = "cellphone"; + + public static final String COL_PASSWORD = "password"; + + public static final String COL_FULL_NAME = "full_name"; + + public static final String COL_BIRTHDAY = "birthday"; + + public static final String COL_GENDER = "gender"; + + public static final String COL_AVATAR = "avatar"; + + public static final String COL_STATUS = "status"; + + public static final String COL_CREATED_BY = "created_by"; + + public static final String COL_CREATED_TIME = "created_time"; + + public static final String COL_MODIFIED_BY = "modified_by"; + + public static final String COL_MODIFIED_TIME = "modified_time"; + + public static final String COL_DELETED = "deleted"; +} diff --git a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/user/entity/persistence/UserRole.java b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/user/entity/persistence/UserRole.java new file mode 100644 index 00000000..0d4907a2 --- /dev/null +++ b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/user/entity/persistence/UserRole.java @@ -0,0 +1,42 @@ +package com.jmsoftware.maf.authcenter.user.entity.persistence; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +/** + * User-role Relation. Roles that users have. + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 6/29/2021 12:09 PM + */ +@Data +@TableName(value = UserRole.TABLE_NAME) +public class UserRole { + /** + * The primary key + */ + @TableId(value = COL_ID, type = IdType.AUTO) + private Long id; + + /** + * The primary key of user + */ + @TableField(value = COL_USER_ID) + private Long userId; + + /** + * The primary key of role + */ + @TableField(value = COL_ROLE_ID) + private Long roleId; + + public static final String TABLE_NAME = "user_role"; + + public static final String COL_ID = "id"; + + public static final String COL_USER_ID = "user_id"; + + public static final String COL_ROLE_ID = "role_id"; +} diff --git a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/user/mapper/UserMapper.java b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/user/mapper/UserMapper.java index f83928e9..e7a22b9b 100644 --- a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/user/mapper/UserMapper.java +++ b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/user/mapper/UserMapper.java @@ -1,75 +1,17 @@ package com.jmsoftware.maf.authcenter.user.mapper; -import com.jmsoftware.maf.authcenter.user.entity.UserPersistence; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.jmsoftware.maf.authcenter.user.entity.persistence.User; import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Param; - -import java.util.List; /** *

UserMapper

*

* Mapper of UserPersistence.(UserPersistence) * - * @author Johnny Miller (鍾俊), e-mail: johnnysviva@outlook.com + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com * @date 5 /10/20 12:17 PM */ @Mapper -public interface UserMapper { - /** - * Select by id user persistence. - * - * @param id the id - * @return the user persistence - */ - UserPersistence selectById(Long id); - - /** - * Select all by limit list. - * - * @param offset the offset - * @param limit the limit - * @return the list - */ - List selectAllByLimit(@Param("offset") int offset, @Param("limit") int limit); - - /** - * Query all list. - * - * @param userPersistence the user persistence - * @return the list - */ - List selectAll(UserPersistence userPersistence); - - /** - * Insert int. - * - * @param userPersistence the user persistence - * @return the int - */ - int insert(UserPersistence userPersistence); - - /** - * Update int. - * - * @param userPersistence the user persistence - * @return the int - */ - int update(UserPersistence userPersistence); - - /** - * Delete by id int. - * - * @param id the id - * @return the int - */ - int deleteById(Long id); - - /** - * Select user by username or email user persistence. - * - * @param loginToken the login token - * @return the user persistence - */ - UserPersistence selectUserByUsernameOrEmail(String loginToken); +public interface UserMapper extends BaseMapper { } diff --git a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/user/mapper/UserRoleMapper.java b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/user/mapper/UserRoleMapper.java new file mode 100644 index 00000000..597b49c9 --- /dev/null +++ b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/user/mapper/UserRoleMapper.java @@ -0,0 +1,16 @@ +package com.jmsoftware.maf.authcenter.user.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.jmsoftware.maf.authcenter.user.entity.persistence.UserRole; +import org.apache.ibatis.annotations.Mapper; + +/** + *

UserRoleMapper

+ *

+ * Mapper of user_role. + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 7/4/2021 1:24 PM + */ +@Mapper +public interface UserRoleMapper extends BaseMapper { +} diff --git a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/user/remote/UserRemoteApiController.java b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/user/remote/UserRemoteApiController.java deleted file mode 100644 index 8536ef86..00000000 --- a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/user/remote/UserRemoteApiController.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.jmsoftware.maf.authcenter.user.remote; - -import com.jmsoftware.maf.authcenter.user.service.UserService; -import com.jmsoftware.maf.common.bean.ResponseBodyBean; -import com.jmsoftware.maf.common.domain.authcenter.user.GetUserByLoginTokenPayload; -import com.jmsoftware.maf.common.domain.authcenter.user.GetUserByLoginTokenResponse; -import com.jmsoftware.maf.common.domain.authcenter.user.SaveUserForRegisteringPayload; -import com.jmsoftware.maf.common.domain.authcenter.user.SaveUserForRegisteringResponse; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import javax.validation.Valid; - -/** - *

UserRemoteApiController

- *

- * Change description here. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 5/10/20 12:36 PM - **/ -@RestController -@RequestMapping("/user-remote-api") -@RequiredArgsConstructor -@Api(tags = {"User Remote API Controller"}) -public class UserRemoteApiController { - private final UserService userService; - - @PostMapping("/get-user-by-login-token") - @ApiOperation(value = "/get-user-by-login-token", notes = "Get user by login token") - public ResponseBodyBean getUserByLoginToken(@Valid @RequestBody GetUserByLoginTokenPayload payload) { - return ResponseBodyBean.ofSuccess(userService.getUserByLoginToken(payload.getLoginToken())); - } - - @PostMapping("/save-user-for-registering") - public ResponseBodyBean saveUserForRegistering(@Valid @RequestBody SaveUserForRegisteringPayload payload) { - return ResponseBodyBean.ofSuccess(userService.saveUserForRegistering(payload)); - } -} diff --git a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/user/service/UserRoleService.java b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/user/service/UserRoleService.java new file mode 100644 index 00000000..bd17de20 --- /dev/null +++ b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/user/service/UserRoleService.java @@ -0,0 +1,25 @@ +package com.jmsoftware.maf.authcenter.user.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.jmsoftware.maf.authcenter.user.entity.persistence.User; +import com.jmsoftware.maf.authcenter.user.entity.persistence.UserRole; +import lombok.NonNull; +import org.springframework.validation.annotation.Validated; + +import javax.validation.constraints.NotBlank; + +/** + * UserRoleService. + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 6/29/2021 12:09 PM + */ +@Validated +public interface UserRoleService extends IService { + /** + * Assign role by role name. + * + * @param user the user + * @param roleName the role name + */ + void assignRoleByRoleName(@NonNull User user, @NotBlank String roleName); +} diff --git a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/user/service/UserService.java b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/user/service/UserService.java index 1296162a..161ddceb 100644 --- a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/user/service/UserService.java +++ b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/user/service/UserService.java @@ -1,78 +1,75 @@ package com.jmsoftware.maf.authcenter.user.service; -import com.jmsoftware.maf.authcenter.user.entity.UserPersistence; -import com.jmsoftware.maf.common.domain.authcenter.user.GetUserByLoginTokenResponse; -import com.jmsoftware.maf.common.domain.authcenter.user.SaveUserForRegisteringPayload; -import com.jmsoftware.maf.common.domain.authcenter.user.SaveUserForRegisteringResponse; +import com.baomidou.mybatisplus.extension.service.IService; +import com.jmsoftware.maf.authcenter.user.entity.GetUserPageListPayload; +import com.jmsoftware.maf.authcenter.user.entity.GetUserStatusPayload; +import com.jmsoftware.maf.authcenter.user.entity.persistence.User; +import com.jmsoftware.maf.common.bean.PageResponseBodyBean; +import com.jmsoftware.maf.common.domain.authcenter.user.*; +import com.jmsoftware.maf.common.exception.SecurityException; import org.springframework.validation.annotation.Validated; +import javax.servlet.http.HttpServletRequest; import javax.validation.Valid; -import java.util.List; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; /** *

UserService

*

* Service of UserPersistence.(UserPersistence) * - * @author Johnny Miller (鍾俊), e-mail: johnnysviva@outlook.com - * @date 5 /10/20 12:31 PM + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 5/10/20 12:31 PM */ @Validated -public interface UserService { +public interface UserService extends IService { /** - * Query by id user persistence. - * - * @param id the id - * @return the user persistence - */ - UserPersistence queryById(Long id); - - /** - * Query all by limit list. + * Gets user by login token. * - * @param offset the offset - * @param limit the limit - * @return the list + * @param loginToken the login token + * @return the user by login token */ - List queryAllByLimit(int offset, int limit); + GetUserByLoginTokenResponse getUserByLoginToken(@NotBlank String loginToken); /** - * Insert user persistence. + * Save user for registering save user for registering response. * - * @param userPersistence the user persistence - * @return the user persistence + * @param payload the payload + * @return the save user for registering response */ - UserPersistence insert(UserPersistence userPersistence); + SignupResponse saveUserForSignup(@Valid SignupPayload payload); /** - * Update user persistence. + * Login login response. * - * @param userPersistence the user persistence - * @return the user persistence + * @param payload the payload + * @return the login response + * @throws SecurityException the security exception */ - UserPersistence update(UserPersistence userPersistence); + LoginResponse login(@Valid LoginPayload payload) throws SecurityException; /** - * Delete by id boolean. + * Logout boolean. * - * @param id the id + * @param request the request * @return the boolean + * @throws SecurityException the security exception */ - boolean deleteById(Long id); + boolean logout(HttpServletRequest request) throws SecurityException; /** - * Gets user by login token. + * Gets user status. * - * @param loginToken the login token - * @return the user by login token + * @param payload the payload + * @return the user status */ - GetUserByLoginTokenResponse getUserByLoginToken(String loginToken); + String getUserStatus(@Valid @NotNull GetUserStatusPayload payload); /** - * Save user for registering save user for registering response. + * Gets user page list. * * @param payload the payload - * @return the save user for registering response + * @return the user page list */ - SaveUserForRegisteringResponse saveUserForRegistering(@Valid SaveUserForRegisteringPayload payload); + PageResponseBodyBean getUserPageList(@Valid @NotNull GetUserPageListPayload payload); } diff --git a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/user/service/impl/UserRoleServiceImpl.java b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/user/service/impl/UserRoleServiceImpl.java new file mode 100644 index 00000000..f77a8804 --- /dev/null +++ b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/user/service/impl/UserRoleServiceImpl.java @@ -0,0 +1,49 @@ +package com.jmsoftware.maf.authcenter.user.service.impl; + +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.jmsoftware.maf.authcenter.role.entity.persistence.Role; +import com.jmsoftware.maf.authcenter.role.service.RoleService; +import com.jmsoftware.maf.authcenter.user.entity.persistence.User; +import com.jmsoftware.maf.authcenter.user.entity.persistence.UserRole; +import com.jmsoftware.maf.authcenter.user.mapper.UserRoleMapper; +import com.jmsoftware.maf.authcenter.user.service.UserRoleService; +import com.jmsoftware.maf.common.exception.BusinessException; +import lombok.NonNull; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import lombok.val; +import org.springframework.stereotype.Service; + +import javax.validation.constraints.NotBlank; +import java.util.Optional; + +/** + * UserRoleServiceImpl. + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 6/29/2021 12:09 PM + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class UserRoleServiceImpl extends ServiceImpl implements UserRoleService { + private final RoleService roleService; + + @Override + @SneakyThrows({BusinessException.class}) + public void assignRoleByRoleName(@NonNull User user, @NotBlank String roleName) { + val queryWrapper = Wrappers.lambdaQuery(Role.class); + queryWrapper.select(Role::getId) + .eq(Role::getName, roleName); + val role = Optional.ofNullable(roleService.getOne(queryWrapper)) + .orElseThrow(() -> new BusinessException("")); + val userRole = new UserRole(); + userRole.setUserId(user.getId()); + userRole.setRoleId(role.getId()); + val saved = this.save(userRole); + if (!saved) { + throw new BusinessException(String.format("Cannot assign role (%s) to user (%s)", roleName, user.getUsername())); + } + } +} diff --git a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/user/service/impl/UserServiceImpl.java b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/user/service/impl/UserServiceImpl.java index 6718f3ab..93de41bd 100644 --- a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/user/service/impl/UserServiceImpl.java +++ b/auth-center/src/main/java/com/jmsoftware/maf/authcenter/user/service/impl/UserServiceImpl.java @@ -1,96 +1,149 @@ package com.jmsoftware.maf.authcenter.user.service.impl; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.ListUtil; +import cn.hutool.core.util.BooleanUtil; import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.RandomUtil; import cn.hutool.core.util.StrUtil; -import com.jmsoftware.maf.authcenter.user.entity.UserPersistence; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.metadata.OrderItem; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.jmsoftware.maf.authcenter.security.service.JwtService; +import com.jmsoftware.maf.authcenter.user.entity.GetUserPageListPayload; +import com.jmsoftware.maf.authcenter.user.entity.GetUserStatusPayload; +import com.jmsoftware.maf.authcenter.user.entity.constant.UserRedisKey; +import com.jmsoftware.maf.authcenter.user.entity.persistence.User; import com.jmsoftware.maf.authcenter.user.mapper.UserMapper; +import com.jmsoftware.maf.authcenter.user.service.UserRoleService; import com.jmsoftware.maf.authcenter.user.service.UserService; -import com.jmsoftware.maf.common.domain.authcenter.user.GetUserByLoginTokenResponse; -import com.jmsoftware.maf.common.domain.authcenter.user.SaveUserForRegisteringPayload; -import com.jmsoftware.maf.common.domain.authcenter.user.SaveUserForRegisteringResponse; -import com.jmsoftware.maf.common.domain.authcenter.user.UserStatus; -import com.jmsoftware.maf.common.exception.BusinessException; -import lombok.SneakyThrows; +import com.jmsoftware.maf.common.bean.PageResponseBodyBean; +import com.jmsoftware.maf.common.domain.authcenter.user.*; +import com.jmsoftware.maf.common.exception.SecurityException; +import com.jmsoftware.maf.springcloudstarter.configuration.MafConfiguration; +import com.jmsoftware.maf.springcloudstarter.configuration.MafProjectProperty; +import com.jmsoftware.maf.springcloudstarter.util.UsernameUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import lombok.val; +import org.springframework.cache.annotation.CacheConfig; +import org.springframework.context.MessageSource; +import org.springframework.context.i18n.LocaleContextHolder; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.http.HttpStatus; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; -import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; import javax.validation.Valid; -import java.util.Date; -import java.util.List; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.util.concurrent.TimeUnit; /** *

UserServiceImpl

*

* Service implementation of UserPersistence.(UserPersistence) * - * @author Johnny Miller (鍾俊) + * @author Johnny Miller (锺俊) * @date 2020-05-10 12:08:28 */ -@Service("userService") -public class UserServiceImpl implements UserService { - @Resource - private UserMapper userMapper; +@Slf4j +@Service +@RequiredArgsConstructor +@CacheConfig(cacheNames = "user-service-cache") +public class UserServiceImpl extends ServiceImpl implements UserService { + private final BCryptPasswordEncoder bCryptPasswordEncoder; + private final JwtService jwtService; + private final MessageSource messageSource; + private final MafProjectProperty mafProjectProperty; + private final RedisTemplate redisTemplate; + private final UserRoleService userRoleService; + private final MafConfiguration mafConfiguration; @Override - public UserPersistence queryById(Long id) { - return this.userMapper.selectById(id); - } - - @Override - public List queryAllByLimit(int offset, int limit) { - return this.userMapper.selectAllByLimit(offset, limit); + public GetUserByLoginTokenResponse getUserByLoginToken(@NotBlank String loginToken) { + val key = String.format(mafProjectProperty.getProjectParentArtifactId() + + UserRedisKey.GET_USER_BY_LOGIN_TOKEN.getKeyInfixFormat(), loginToken); + val hasKey = redisTemplate.hasKey(key); + if (BooleanUtil.isTrue(hasKey)) { + return JSONUtil.toBean(redisTemplate.opsForValue().get(key), GetUserByLoginTokenResponse.class); + } + val wrapper = Wrappers.lambdaQuery(User.class); + wrapper.and(queryWrapper -> queryWrapper.eq(User::getUsername, loginToken) + .or() + .eq(User::getEmail, loginToken) + .or() + .eq(User::getCellphone, loginToken)); + val userPersistence = this.getBaseMapper().selectOne(wrapper); + if (ObjectUtil.isNull(userPersistence)) { + return null; + } + val response = new GetUserByLoginTokenResponse(); + BeanUtil.copyProperties(userPersistence, response); + redisTemplate.opsForValue().set(key, JSONUtil.toJsonStr(response), RandomUtil.randomLong(1, 7), TimeUnit.DAYS); + return response; } @Override - public UserPersistence insert(UserPersistence userPersistence) { - this.userMapper.insert(userPersistence); - return userPersistence; + @Transactional(rollbackFor = Throwable.class) + public SignupResponse saveUserForSignup(@Valid SignupPayload payload) { + val user = new User(); + user.setUsername(payload.getUsername()); + user.setEmail(payload.getEmail()); + user.setPassword(bCryptPasswordEncoder.encode(payload.getPassword())); + user.setStatus(UserStatus.ENABLED.getValue()); + this.save(user); + log.warn("Saved user for signup, going to assign guest role to user. {}", user); + userRoleService.assignRoleByRoleName(user, mafConfiguration.getGuestUserRole()); + val response = new SignupResponse(); + response.setUserId(user.getId()); + return response; } @Override - public UserPersistence update(UserPersistence userPersistence) { - this.userMapper.update(userPersistence); - return this.queryById(userPersistence.getId()); + public LoginResponse login(@Valid LoginPayload payload) throws SecurityException { + val user = this.getUserByLoginToken(payload.getLoginToken()); + if (ObjectUtil.isNull(user)) { + throw new SecurityException(HttpStatus.UNAUTHORIZED); + } + log.info("User login: {}", user); + val matched = bCryptPasswordEncoder.matches(payload.getPassword(), user.getPassword()); + if (!matched) { + throw new SecurityException(HttpStatus.UNAUTHORIZED); + } + val jwt = jwtService.createJwt(payload.getRememberMe(), user.getId(), user.getUsername(), null, null); + val response = new LoginResponse(); + response.setGreeting(messageSource.getMessage(("greeting"), null, LocaleContextHolder.getLocale())); + response.setJwt(jwt); + return response; } @Override - public boolean deleteById(Long id) { - return this.userMapper.deleteById(id) > 0; + public boolean logout(HttpServletRequest request) throws SecurityException { + jwtService.invalidateJwt(request); + return true; } @Override - public GetUserByLoginTokenResponse getUserByLoginToken(String loginToken) { - if (StrUtil.isBlank(loginToken)) { - return null; - } - val userPersistence = userMapper.selectUserByUsernameOrEmail(loginToken); - if (ObjectUtil.isNull(userPersistence)) { - return null; - } - val response = new GetUserByLoginTokenResponse(); - BeanUtil.copyProperties(userPersistence, response); - return response; + public String getUserStatus(@Valid @NotNull GetUserStatusPayload payload) { + log.info("Current username: {}", UsernameUtil.getCurrentUsername()); + return UserStatus.ofValue(payload.getStatus()).getDescription(); } @Override - @SneakyThrows - public SaveUserForRegisteringResponse saveUserForRegistering(@Valid SaveUserForRegisteringPayload payload) { - val userPersistence = new UserPersistence(); - userPersistence.setUsername(payload.getUsername()); - userPersistence.setEmail(payload.getEmail()); - userPersistence.setPassword(payload.getEncodedPassword()); - userPersistence.setStatus(UserStatus.ENABLED.getStatus()); - val currentTime = new Date(); - userPersistence.setCreatedTime(currentTime); - userPersistence.setModifiedTime(currentTime); - this.insert(userPersistence); - if (ObjectUtil.isNull(userPersistence.getId())) { - throw new BusinessException("Cannot insert user into database!"); + public PageResponseBodyBean getUserPageList(@Valid @NotNull GetUserPageListPayload payload) { + log.info("{}", payload); + val page = new Page(payload.getCurrentPage(), payload.getPageSize()); + val queryWrapper = Wrappers.lambdaQuery(User.class); + if (StrUtil.isNotBlank(payload.getUsername())) { + queryWrapper.like(User::getUsername, payload.getUsername()); } - val response = new SaveUserForRegisteringResponse(); - response.setUserId(userPersistence.getId()); - return response; + page.setOrders(ListUtil.of(OrderItem.desc(payload.getOrderBy()))); + this.page(page, queryWrapper); + return PageResponseBodyBean.ofSuccess(page.getRecords(), page.getTotal()); } } diff --git a/auth-center/src/main/resources/application-development-docker.yml b/auth-center/src/main/resources/application-development-docker.yml index bf476ff3..15797f14 100644 --- a/auth-center/src/main/resources/application-development-docker.yml +++ b/auth-center/src/main/resources/application-development-docker.yml @@ -1,45 +1,36 @@ -eureka: - client: - serviceUrl: - defaultZone: http://maf.service-registry.dev:8760/eureka/ - spring: zipkin: - base-url: http://maf.open-zipkin.dev:9411 + base-url: http://maf-zipkin:9411 + devtools: + add-properties: true datasource: - name: muscle_and_fitness - driver-class-name: com.mysql.cj.jdbc.Driver - type: com.alibaba.druid.pool.DruidDataSource - url: jdbc:mysql://maf.mysql.dev:3306/muscle_and_fitness?useSSL=true&useUnicode=true - username: root - password: jm@mysql + dynamic: + datasource: + master: + url: jdbc:mysql://maf-mysql-server-master:3306/muscle_and_fitness?useSSL=true&useUnicode=true + username: maf_mysql_rw + password: maf@mysql + driver-class-name: com.mysql.cj.jdbc.Driver + slave1: + url: jdbc:mysql://maf-mysql-server-slave:3306/muscle_and_fitness?useSSL=true&useUnicode=true + username: maf_mysql_r + password: maf@mysql + driver-class-name: com.mysql.cj.jdbc.Driver + quartz: + url: jdbc:mysql://maf-mysql-server-master:3306/QUARTZ_DB?useSSL=true&useUnicode=true + username: maf_mysql_rw + password: maf@mysql + driver-class-name: com.mysql.cj.jdbc.Driver redis: - database: 0 - host: maf.redis.dev + host: maf-redis port: 6379 - password: 123456 - timeout: 10000ms - lettuce: - pool: - max-active: 20 - max-idle: 10 - max-wait: -1ms - min-idle: 0 - -logging: - # Configure logging level for SFTP/JSCH - level: - com.jcraft.jsch: INFO + password: maf@redis + rabbitmq: + host: maf-rabbitmq + port: 5672 + username: maf_rabbitmq_su + password: maf@rabbitmq -sftp: - client: - configuration: - host: maf.atmoz-sftp.dev - port: 22 - user: johnny - password: atmoz@sftp - directory: upload - private-key: - private-key-pass-phrase: - session-cache-size: 20 - session-wait-timeout: 15000 +maf: + configuration: + swagger-enabled: true diff --git a/auth-center/src/main/resources/application-development-local.yml b/auth-center/src/main/resources/application-development-local.yml index 3d36f824..6ad4c92e 100644 --- a/auth-center/src/main/resources/application-development-local.yml +++ b/auth-center/src/main/resources/application-development-local.yml @@ -1,48 +1,42 @@ -eureka: - client: - serviceUrl: - defaultZone: http://localhost:8760/eureka/ - spring: zipkin: base-url: http://localhost:9411 - datasource: - name: muscle_and_fitness - driver-class-name: com.mysql.cj.jdbc.Driver - type: com.alibaba.druid.pool.DruidDataSource - url: jdbc:mysql://localhost:3306/muscle_and_fitness?useSSL=true&useUnicode=true - username: root - password: jm@mysql devtools: - restart: - enabled: true + add-properties: true + datasource: + dynamic: + datasource: + master: + url: jdbc:mysql://localhost:3306/muscle_and_fitness?useSSL=true&useUnicode=true + username: maf_mysql_rw + password: maf@mysql + driver-class-name: com.mysql.cj.jdbc.Driver + slave1: + url: jdbc:mysql://localhost:3307/muscle_and_fitness?useSSL=true&useUnicode=true + username: maf_mysql_r + password: maf@mysql + driver-class-name: com.mysql.cj.jdbc.Driver + quartz: + url: jdbc:mysql://localhost:3306/QUARTZ_DB?useSSL=true&useUnicode=true + username: maf_mysql_rw + password: maf@mysql + driver-class-name: com.mysql.cj.jdbc.Driver redis: - database: 0 host: localhost port: 6379 - password: 123456 - timeout: 10000ms - lettuce: - pool: - max-active: 20 - max-idle: 10 - max-wait: -1ms - min-idle: 0 + password: maf@redis + rabbitmq: + host: localhost + port: 5672 + username: maf_rabbitmq_su + password: maf@rabbitmq logging: # Configure logging level for SFTP/JSCH level: com.jcraft.jsch: INFO -sftp: - client: - configuration: - host: localhost - port: 23 - user: johnny - password: atmoz@sftp - directory: upload - private-key: - private-key-pass-phrase: - session-cache-size: 20 - session-wait-timeout: 15000 +maf: + configuration: + web-request-log-enabled: true + swagger-enabled: true diff --git a/auth-center/src/main/resources/application-production.yml b/auth-center/src/main/resources/application-production.yml index eb9485e6..db47a645 100644 --- a/auth-center/src/main/resources/application-production.yml +++ b/auth-center/src/main/resources/application-production.yml @@ -1,45 +1,36 @@ -eureka: - client: - serviceUrl: - defaultZone: http://172.16.4.20:8760/eureka/ - spring: zipkin: - base-url: http://172.16.4.13:9411 + base-url: http://maf-zipkin:9411 + devtools: + add-properties: false datasource: - name: muscle_and_fitness - driver-class-name: com.mysql.cj.jdbc.Driver - type: com.alibaba.druid.pool.DruidDataSource - url: jdbc:mysql://172.16.4.10:3306/muscle_and_fitness?useSSL=true&useUnicode=true - username: root - password: jm@mysql + dynamic: + datasource: + master: + url: jdbc:mysql://maf-mysql-server-master:3306/muscle_and_fitness?useSSL=true&useUnicode=true + username: maf_mysql_rw + password: maf@mysql + driver-class-name: com.mysql.cj.jdbc.Driver + slave1: + url: jdbc:mysql://maf-mysql-server-slave:3306/muscle_and_fitness?useSSL=true&useUnicode=true + username: maf_mysql_r + password: maf@mysql + driver-class-name: com.mysql.cj.jdbc.Driver + quartz: + url: jdbc:mysql://maf-mysql-server-master:3306/QUARTZ_DB?useSSL=true&useUnicode=true + username: maf_mysql_rw + password: maf@mysql + driver-class-name: com.mysql.cj.jdbc.Driver redis: - database: 0 - host: 172.16.4.11 + host: maf-redis port: 6379 - password: 123456 - timeout: 10000ms - lettuce: - pool: - max-active: 20 - max-idle: 10 - max-wait: -1ms - min-idle: 0 - -logging: - # Configure logging level for SFTP/JSCH - level: - com.jcraft.jsch: INFO + password: maf@redis + rabbitmq: + host: maf-rabbitmq + port: 5672 + username: maf_rabbitmq_su + password: maf@rabbitmq -sftp: - client: - configuration: - host: 172.16.4.12 - port: 22 - user: johnny - password: atmoz@sftp - directory: upload - private-key: - private-key-pass-phrase: - session-cache-size: 20 - session-wait-timeout: 15000 +maf: + configuration: + swagger-enabled: false diff --git a/auth-center/src/main/resources/application-stage.yml b/auth-center/src/main/resources/application-stage.yml index 0ea51375..db47a645 100644 --- a/auth-center/src/main/resources/application-stage.yml +++ b/auth-center/src/main/resources/application-stage.yml @@ -1,45 +1,36 @@ -eureka: - client: - serviceUrl: - defaultZone: http://172.16.3.20:8760/eureka/ - spring: zipkin: - base-url: http://172.16.3.13:9411 + base-url: http://maf-zipkin:9411 + devtools: + add-properties: false datasource: - name: muscle_and_fitness - driver-class-name: com.mysql.cj.jdbc.Driver - type: com.alibaba.druid.pool.DruidDataSource - url: jdbc:mysql://172.16.3.10:3306/muscle_and_fitness?useSSL=true&useUnicode=true - username: root - password: jm@mysql + dynamic: + datasource: + master: + url: jdbc:mysql://maf-mysql-server-master:3306/muscle_and_fitness?useSSL=true&useUnicode=true + username: maf_mysql_rw + password: maf@mysql + driver-class-name: com.mysql.cj.jdbc.Driver + slave1: + url: jdbc:mysql://maf-mysql-server-slave:3306/muscle_and_fitness?useSSL=true&useUnicode=true + username: maf_mysql_r + password: maf@mysql + driver-class-name: com.mysql.cj.jdbc.Driver + quartz: + url: jdbc:mysql://maf-mysql-server-master:3306/QUARTZ_DB?useSSL=true&useUnicode=true + username: maf_mysql_rw + password: maf@mysql + driver-class-name: com.mysql.cj.jdbc.Driver redis: - database: 0 - host: 172.16.3.11 + host: maf-redis port: 6379 - password: 123456 - timeout: 10000ms - lettuce: - pool: - max-active: 20 - max-idle: 10 - max-wait: -1ms - min-idle: 0 - -logging: - # Configure logging level for SFTP/JSCH - level: - com.jcraft.jsch: INFO + password: maf@redis + rabbitmq: + host: maf-rabbitmq + port: 5672 + username: maf_rabbitmq_su + password: maf@rabbitmq -sftp: - client: - configuration: - host: 172.16.3.12 - port: 22 - user: johnny - password: atmoz@sftp - directory: upload - private-key: - private-key-pass-phrase: - session-cache-size: 20 - session-wait-timeout: 15000 +maf: + configuration: + swagger-enabled: false diff --git a/auth-center/src/main/resources/application-test.yml b/auth-center/src/main/resources/application-test.yml index 3b695c54..9c992a1b 100644 --- a/auth-center/src/main/resources/application-test.yml +++ b/auth-center/src/main/resources/application-test.yml @@ -1,45 +1,36 @@ -eureka: - client: - serviceUrl: - defaultZone: http://172.16.2.20:8760/eureka/ - spring: zipkin: - base-url: http://172.16.2.13:9411 + base-url: http://maf-zipkin:9411 + devtools: + add-properties: false datasource: - name: muscle_and_fitness - driver-class-name: com.mysql.cj.jdbc.Driver - type: com.alibaba.druid.pool.DruidDataSource - url: jdbc:mysql://172.16.2.10:3306/muscle_and_fitness?useSSL=true&useUnicode=true - username: root - password: jm@mysql + dynamic: + datasource: + master: + url: jdbc:mysql://maf-mysql-server-master:3306/muscle_and_fitness?useSSL=true&useUnicode=true + username: maf_mysql_rw + password: maf@mysql + driver-class-name: com.mysql.cj.jdbc.Driver + slave1: + url: jdbc:mysql://maf-mysql-server-slave:3306/muscle_and_fitness?useSSL=true&useUnicode=true + username: maf_mysql_r + password: maf@mysql + driver-class-name: com.mysql.cj.jdbc.Driver + quartz: + url: jdbc:mysql://maf-mysql-server-master:3306/QUARTZ_DB?useSSL=true&useUnicode=true + username: maf_mysql_rw + password: maf@mysql + driver-class-name: com.mysql.cj.jdbc.Driver redis: - database: 0 - host: 172.16.2.11 + host: maf-redis port: 6379 - password: 123456 - timeout: 10000ms - lettuce: - pool: - max-active: 20 - max-idle: 10 - max-wait: -1ms - min-idle: 0 - -logging: - # Configure logging level for SFTP/JSCH - level: - com.jcraft.jsch: INFO + password: maf@redis + rabbitmq: + host: maf-rabbitmq + port: 5672 + username: maf_rabbitmq_su + password: maf@rabbitmq -sftp: - client: - configuration: - host: 172.16.2.12 - port: 22 - user: johnny - password: atmoz@sftp - directory: upload - private-key: - private-key-pass-phrase: - session-cache-size: 20 - session-wait-timeout: 15000 +maf: + configuration: + swagger-enabled: true diff --git a/auth-center/src/main/resources/application.yml b/auth-center/src/main/resources/application.yml index e52aabc1..42050999 100644 --- a/auth-center/src/main/resources/application.yml +++ b/auth-center/src/main/resources/application.yml @@ -2,10 +2,11 @@ server: port: @auth-center.port@ tomcat: uri-encoding: @project.build.sourceEncoding@ + shutdown: GRACEFUL + servlet: + context-path: spring: - application: - name: @project.artifactId@ profiles: active: @env@ mvc: @@ -20,7 +21,7 @@ spring: multipart: # `location` specifies the directory where uploaded files will be stored. When not specified, # a temporary directory will be used. ATTENTION: it may differ due to OS. - location: /Users/johnny/Documents/@project.artifactId@/temprary-file + location: ~/Documents/@project.parent.artifactId@/${spring.application.name}/temprary-file # `max-file-size` specifies the maximum size permitted for uploaded files. The default is 1MB. We set it as 64 MB. max-file-size: 64MB # `max-request-size` specifies the maximum size allowed for multipart/form-data requests. The default is 10MB. @@ -28,21 +29,96 @@ spring: # `file-size-threshold` specifies the size threshold after which files will be written to disk. # The default is 0. We set it as 0 too. file-size-threshold: 0 - -eureka: - instance: - leaseRenewalIntervalInSeconds: 10 - health-check-url-path: /actuator/health - status-page-url-path: / - metadata-map: - # needed to trigger info and endpoint update after restart - startup: ${random.int} - instance-id: ${spring.cloud.client.ip-address}:${server.port}@${spring.cloud.client.hostname}@${spring.application.name}-${random.int} - prefer-ip-address: true - client: - registryFetchIntervalSeconds: 5 + cloud: + consul: + discovery: + register: true + instance-id: ${spring.application.name}-${spring.cloud.client.hostname}-${vcap.application.instance_id:${spring.application.instance_id:${random.value}}} + service-name: ${spring.application.name} + port: ${server.port} + prefer-ip-address: true + ip-address: ${spring.cloud.client.ip-address} + health-check-critical-timeout: 15s + datasource: + type: com.alibaba.druid.pool.DruidDataSource + druid: + driver-class-name: com.mysql.cj.jdbc.Driver + initial-size: 5 + minIdle: 10 + max-active: 20 + max-wait: 60000 + min-evictable-idle-time-millis: 600000 + max-evictable-idle-time-millis: 900000 + validation-query: SELECT 1 + test-while-idle: true + test-on-borrow: false + test-on-return: false + pool-prepared-statements: true + max-open-prepared-statements: 20 + keep-alive: true + filters: stat,wall,log4j2 + filter: + stat: + enabled: true + db-type: mysql + log-slow-sql: true + slow-sql-millis: 2000 + slf4j: + enabled: true + statement-log-error-enabled: true + statement-create-after-log-enabled: false + statement-close-after-log-enabled: false + result-set-open-after-log-enabled: false + result-set-close-after-log-enabled: false + web-stat-filter: + enabled: true + url-pattern: /* + exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*" + session-stat-enable: true + session-stat-max-count: 1000 + stat-view-servlet: + enabled: true + url-pattern: /druid/* + reset-enable: false + login-username: root + login-password: maf_druid_password + allow: + redis: + database: 0 + timeout: 10000ms + client-type: LETTUCE + lettuce: + pool: + max-active: 20 + max-idle: 10 + max-wait: -1ms + min-idle: 0 + quartz: + job-store-type: JDBC + scheduler-name: ${spring.application.name}-scheduler + wait-for-jobs-to-complete-on-shutdown: true + jdbc: + initialize-schema: NEVER + properties: + org: + quartz: + scheduler: + instanceId: AUTO + jobStore: + tablePrefix: QRTZ_ + isClustered: true + clusterCheckinInterval: 3000 + useProperties: false + threadPool: + threadCount: 15 + threadPriority: 5 + class: org.quartz.simpl.SimpleThreadPool feign: + httpclient: + enabled: false + okhttp: + enabled: true client: config: default: @@ -66,30 +142,33 @@ management: show-details: ALWAYS mybatis-plus: + global-config: + db-config: + logic-delete-field: deleted configuration: map-underscore-to-camel-case: true - log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # mapper-locations should start with `classpath*` prefix # when project is based on Maven multi-module to load XML mapper in different jar mapper-locations: classpath*:/mapper/**/*Mapper.xml logging: - config: classpath:configuration/logback/logback-@env@.xml - # Configure logging level of project as DEBUG to enable SQL logging and other logging. + config: classpath:logback-configuration/logback-${spring.profiles.active}.xml level: - com.jmsoftware: DEBUG + # Configure logging level for SFTP/JSCH + com.jcraft.jsch: INFO -project: - property: - base-package: com.jmsoftware.maf.authcenter - context-path: +maf: + project-property: + base-package: @project.groupId@ + context-path: ${server.servlet.context-path} group-id: @project.groupId@ project-parent-artifact-id: @project.parent.artifactId@ project-artifact-id: @project.artifactId@ version: @project.version@ description: @project.description@ jdk-version: @java.version@ - environment: @env@ + environment: ${spring.profiles.active} url: @project.url@ inception-year: @inceptionYear@ organization-name: @project.organization.name@ @@ -99,10 +178,18 @@ project: developer-name: @developerName@ developer-email: @developerEmail@ developer-url: @developerUrl@ - -# Customize JWT configuration for development environment. -jwt: configuration: - # an hour - ttl: 3600000 - ttl-for-remember-me: 604800000 + ignored-url: + pattern: + - "/static/**" + - "/actuator/**" + - "/druid/**" + - "/swagger-resources/**" + - "/v2/api-docs/**" + - "/*/v2/api-docs/**" + - "/webjars/**" + - "/doc.html" + included-package-for-http-api-scan: ${maf.project-property.base-package} + jwt: + # an hour + ttl: 3600000 diff --git a/auth-center/src/main/resources/banner.txt b/auth-center/src/main/resources/banner.txt index d0832b7a..eefcaec9 100644 --- a/auth-center/src/main/resources/banner.txt +++ b/auth-center/src/main/resources/banner.txt @@ -4,8 +4,8 @@ ${AnsiStyle.BOLD}${AnsiColor.BRIGHT_GREEN} / /| |/ / / / __/ __ \ / / / _ \/ __ \/ __/ _ \/ ___/ / ___ / /_/ / /_/ / / / / /___/ __/ / / / /_/ __/ / /_/ |_\__,_/\__/_/ /_/ \____/\___/_/ /_/\__/\___/_/ -${AnsiStyle.BOLD}Exercise MIS :: Powered by Spring Boot ::${spring-boot.formatted-version} -${AnsiColor.CYAN}Author: Johnny Miller (鍾俊), email: johnnysviva@outlook.com +${AnsiStyle.BOLD}Auth Center :: Powered by Spring Boot ::${spring-boot.formatted-version} +${AnsiColor.CYAN}Author: Johnny Miller (锺俊), email: johnnysviva@outlook.com ${AnsiStyle.NORMAL}${AnsiColor.MAGENTA}http://patorjk.com/software/taag/#p=display&f=Slant&t=Auth%20Center ${AnsiColor.BRIGHT_BLACK} -------------------------------------------Font Info------------------------------------------- diff --git a/auth-center/src/main/resources/bootstrap.yml b/auth-center/src/main/resources/bootstrap.yml new file mode 100644 index 00000000..79e3552f --- /dev/null +++ b/auth-center/src/main/resources/bootstrap.yml @@ -0,0 +1,18 @@ +spring: + application: + name: @project.artifactId@ + cloud: + consul: + host: "should-be-passed-by-java-opts" + port: 8500 + config: + enabled: true + prefix: config + # `default-context` should be equal to Spring application name + default-context: @project.artifactId@ + profile-separator: "::" + format: YAML + data-key: "data" + watch: + enabled: true + delay: 1000 diff --git a/auth-center/src/main/resources/configuration/.empty b/auth-center/src/main/resources/configuration/.empty deleted file mode 100644 index e69de29b..00000000 diff --git a/auth-center/src/main/resources/configuration/logback/logback-base.xml b/auth-center/src/main/resources/logback-configuration/logback-base.xml similarity index 69% rename from auth-center/src/main/resources/configuration/logback/logback-base.xml rename to auth-center/src/main/resources/logback-configuration/logback-base.xml index 9fe18d6c..be7eb0ef 100644 --- a/auth-center/src/main/resources/configuration/logback/logback-base.xml +++ b/auth-center/src/main/resources/logback-configuration/logback-base.xml @@ -10,7 +10,7 @@ converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/> - + - + + - + + - + + - + + - + + @@ -60,11 +65,20 @@ - ${LOG_HOME}/${PROJECT_ARTIFACT_Id}${LOG_FILE_SUFFIX}.%d{yyyy-MM-dd}.%i.log.gz + ${LOG_HOME}/${APPLICATION}-${ENVIRONMENT}-${HOSTNAME}.%d{yyyy-MM-dd}.%i.log.gz + 5MB 7 1GB + + + + ${LOGSTASH_HOST}:4560 + + {"applicationName": "${APPLICATION}", "environment": "${ENVIRONMENT}"} + + diff --git a/exercise-mis/src/main/resources/configuration/logback/logback-development-docker.xml b/auth-center/src/main/resources/logback-configuration/logback-development-docker.xml similarity index 68% rename from exercise-mis/src/main/resources/configuration/logback/logback-development-docker.xml rename to auth-center/src/main/resources/logback-configuration/logback-development-docker.xml index f38e6c2d..86b71ee2 100644 --- a/exercise-mis/src/main/resources/configuration/logback/logback-development-docker.xml +++ b/auth-center/src/main/resources/logback-configuration/logback-development-docker.xml @@ -1,10 +1,11 @@ - + + diff --git a/exercise-mis/src/main/resources/configuration/logback/logback-development-local.xml b/auth-center/src/main/resources/logback-configuration/logback-development-local.xml similarity index 68% rename from exercise-mis/src/main/resources/configuration/logback/logback-development-local.xml rename to auth-center/src/main/resources/logback-configuration/logback-development-local.xml index f38e6c2d..86b71ee2 100644 --- a/exercise-mis/src/main/resources/configuration/logback/logback-development-local.xml +++ b/auth-center/src/main/resources/logback-configuration/logback-development-local.xml @@ -1,10 +1,11 @@ - + + diff --git a/api-portal/src/main/resources/configuration/logback/logback-production.xml b/auth-center/src/main/resources/logback-configuration/logback-production.xml similarity index 68% rename from api-portal/src/main/resources/configuration/logback/logback-production.xml rename to auth-center/src/main/resources/logback-configuration/logback-production.xml index f38e6c2d..86b71ee2 100644 --- a/api-portal/src/main/resources/configuration/logback/logback-production.xml +++ b/auth-center/src/main/resources/logback-configuration/logback-production.xml @@ -1,10 +1,11 @@ - + + diff --git a/auth-center/src/main/resources/configuration/logback/logback-stage.xml b/auth-center/src/main/resources/logback-configuration/logback-stage.xml similarity index 68% rename from auth-center/src/main/resources/configuration/logback/logback-stage.xml rename to auth-center/src/main/resources/logback-configuration/logback-stage.xml index f38e6c2d..86b71ee2 100644 --- a/auth-center/src/main/resources/configuration/logback/logback-stage.xml +++ b/auth-center/src/main/resources/logback-configuration/logback-stage.xml @@ -1,10 +1,11 @@ - + + diff --git a/auth-center/src/main/resources/configuration/logback/logback-test.xml b/auth-center/src/main/resources/logback-configuration/logback-test.xml similarity index 66% rename from auth-center/src/main/resources/configuration/logback/logback-test.xml rename to auth-center/src/main/resources/logback-configuration/logback-test.xml index f1916a0f..3c705245 100644 --- a/auth-center/src/main/resources/configuration/logback/logback-test.xml +++ b/auth-center/src/main/resources/logback-configuration/logback-test.xml @@ -1,10 +1,11 @@ - + + diff --git a/auth-center/src/main/resources/mapper/permission/PermissionMapper.xml b/auth-center/src/main/resources/mapper/permission/PermissionMapper.xml index 38142078..dd9ace1b 100644 --- a/auth-center/src/main/resources/mapper/permission/PermissionMapper.xml +++ b/auth-center/src/main/resources/mapper/permission/PermissionMapper.xml @@ -1,178 +1,53 @@ - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - - - - + + + id, url, description, `type`, permission_expression, `method`, sort, parent_id, + created_by, created_time, modified_by, modified_time, deleted + - - INSERT INTO permission(url, description, type, permission_expression, method, sort, parent_id, deleted, - created_time, modified_time) - VALUES (#{url}, #{description}, #{type}, #{permissionExpression}, #{method}, #{sort}, #{parentId}, #{deleted}, - #{createdTime}, #{modifiedTime}) - - - - UPDATE permission - - - url = #{url}, - - - description = #{description}, - - - type = #{type}, - - - permission_expression = #{permissionExpression}, - - - method = #{method}, - - - sort = #{sort}, - - - parent_id = #{parentId}, - - - deleted = #{deleted}, - - - created_time = #{createdTime}, - - - modified_time = #{modifiedTime}, - - - WHERE id = #{id} - - - - DELETE - FROM permission - WHERE id = #{id} - - - SELECT DISTINCT permission.id, permission.url, permission.type, permission.permission_expression AS permissionExpression, permission.method FROM permission - LEFT JOIN role_permission ON permission.id = role_permission.permission_id - LEFT JOIN role ON role.id = role_permission.role_id - WHERE role.id IN - - #{item} - - - - diff --git a/auth-center/src/main/resources/mapper/role/RoleMapper.xml b/auth-center/src/main/resources/mapper/role/RoleMapper.xml index 960ce224..fdf2c2b3 100644 --- a/auth-center/src/main/resources/mapper/role/RoleMapper.xml +++ b/auth-center/src/main/resources/mapper/role/RoleMapper.xml @@ -1,94 +1,38 @@ - - - - - - + + + + + + + + + + + - - - - - + + + id, `name`, description, created_by, created_time, modified_by, modified_time, deleted + - - + SELECT role.id AS id, + role.name AS name + FROM role + LEFT JOIN user_role ON role.id = user_role.role_id + LEFT JOIN user ON user_role.user_id = user.id + WHERE role.deleted = 0 AND user.id = #{userId} - - - insert into muscle_and_fitness.role(name, description, created_time, modified_time) - values (#{name}, #{description}, #{createdTime}, #{modifiedTime}) - - - - - update muscle_and_fitness.role - - - name = #{name}, - - - description = #{description}, - - - created_time = #{createdTime}, - - - modified_time = #{modifiedTime}, - - - where id = #{id} - - - - - DELETE FROM muscle_and_fitness.role WHERE id = #{id} - - - + SELECT + + from role + WHERE role.name = #{roleName} diff --git a/auth-center/src/main/resources/mapper/user/UserMapper.xml b/auth-center/src/main/resources/mapper/user/UserMapper.xml index 2782d8fb..8eda1119 100644 --- a/auth-center/src/main/resources/mapper/user/UserMapper.xml +++ b/auth-center/src/main/resources/mapper/user/UserMapper.xml @@ -1,196 +1,29 @@ - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - - - - - - - INSERT INTO user(username, - email, - cellphone, - password, - full_name, - birthday, - gender, - avatar, - status, - created_time, - modified_time) - VALUES (#{username}, - #{email}, - #{cellphone}, - #{password}, - #{fullName}, - #{birthday}, - #{gender}, - #{avatar}, - #{status}, - #{createdTime}, - #{modifiedTime}) - - - - UPDATE user - - - username = #{username}, - - - email = #{email}, - - - cellphone = #{cellphone}, - - - password = #{password}, - - - full_name = #{fullName}, - - - birthday = #{birthday}, - - - gender = #{gender}, - - - avatar = #{avatar}, - - - status = #{status}, - - - created_time = #{createdTime}, - - - modified_time = #{modifiedTime}, - - - WHERE id = #{id} - - - - DELETE FROM user WHERE id = #{id} - - - + + + id, username, email, cellphone, `password`, full_name, birthday, gender, avatar, + `status`, created_by, created_time, modified_by, modified_time, deleted + diff --git a/auth-center/src/main/resources/mapper/user/UserRoleMapper.xml b/auth-center/src/main/resources/mapper/user/UserRoleMapper.xml new file mode 100644 index 00000000..391b87fe --- /dev/null +++ b/auth-center/src/main/resources/mapper/user/UserRoleMapper.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + id, user_id, role_id + + diff --git a/auth-center/src/main/resources/messages.properties b/auth-center/src/main/resources/messages.properties new file mode 100644 index 00000000..39490033 --- /dev/null +++ b/auth-center/src/main/resources/messages.properties @@ -0,0 +1 @@ +greeting=Hello! diff --git a/auth-center/src/main/resources/messages_zh_CN.properties b/auth-center/src/main/resources/messages_zh_CN.properties new file mode 100644 index 00000000..75f72bdd --- /dev/null +++ b/auth-center/src/main/resources/messages_zh_CN.properties @@ -0,0 +1 @@ +greeting=你好! diff --git a/auth-center/src/main/resources/static/home.html b/auth-center/src/main/resources/static/home.html deleted file mode 100644 index e7599316..00000000 --- a/auth-center/src/main/resources/static/home.html +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - UNSET - - - - -

-
- Hello, World! - - Welcome to {{ projectArtifactId }}@{{ version }}! - - - - {{ applicationName }} - -
-
- Create New Person -
- - -
-
- - -
-
- - -
-
- - -
-
- - - - - - - - - - - - - - - - - -
NameAgeSexDelete
{{ person.name }}{{ person.age }}{{ person.sex }} - -
- This page is provided by - keepfool. - -
- - - - diff --git a/auth-center/src/main/resources/static/icon/favicon.ico b/auth-center/src/main/resources/static/icon/favicon.ico deleted file mode 100644 index 0798d38f..00000000 Binary files a/auth-center/src/main/resources/static/icon/favicon.ico and /dev/null differ diff --git a/auth-center/src/main/resources/static/image/muscle-and-fitness-server-social-image.png b/auth-center/src/main/resources/static/image/muscle-and-fitness-server-social-image.png deleted file mode 100644 index 83786ad8..00000000 Binary files a/auth-center/src/main/resources/static/image/muscle-and-fitness-server-social-image.png and /dev/null differ diff --git a/auth-center/src/main/resources/static/script/404.js b/auth-center/src/main/resources/static/script/404.js deleted file mode 100644 index 5401ce54..00000000 --- a/auth-center/src/main/resources/static/script/404.js +++ /dev/null @@ -1,12 +0,0 @@ -// noinspection JSUnusedGlobalSymbols -const vm = new Vue({ - el: '#app', - data: {}, - methods: { - handleClickGoToHome: function () { - const currentUrl = window.location.href; - const split = currentUrl.split('/'); - window.location.href = `${split[0]}//${split[2]}/${split[3]}`; - } - } -}); diff --git a/auth-center/src/main/resources/static/script/home.js b/auth-center/src/main/resources/static/script/home.js deleted file mode 100644 index a191d8c5..00000000 --- a/auth-center/src/main/resources/static/script/home.js +++ /dev/null @@ -1,72 +0,0 @@ -// noinspection JSUnusedGlobalSymbols -const vm = new Vue({ - el: '#app', - data: { - projectArtifactId: null, - version: null, - applicationName: null, - newPerson: { - name: '', - age: 0, - sex: 'Male' - }, - people: [{ - name: 'Jack', - age: 30, - sex: 'Male' - }, { - name: 'Bill', - age: 26, - sex: 'Male' - }, { - name: 'Tracy', - age: 22, - sex: 'Female' - }, { - name: 'Chris', - age: 36, - sex: 'Male' - }] - }, - methods: { - /** - * Create a person - */ - createPerson: function () { - this.people.push(this.newPerson); - this.newPerson = {name: '', age: 0, sex: 'Male'} - - }, - /** - * delete a person - * @param index - */ - deletePerson: function (index) { - this.people.splice(index, 1); - }, - handleClickSwaggerApiDocumentation: function () { - const currentUrl = window.location.href; - const split = currentUrl.split('/'); - window.location.href = `${split[0]}//${split[2]}/doc`; - }, - handleClickVideoDemo: function () { - const currentUrl = window.location.href; - const split = currentUrl.split('/'); - window.location.href = `${split[0]}//${split[2]}/${split[3]}/video.html`; - }, - getAppInfo: async function () { - const currentUrl = window.location.href; - const split = currentUrl.split('/'); - const baseUrl = `${split[0]}//${split[2]}`; - const response = await fetch(`${baseUrl}/common/app-info`); - const responseJson = await response.json(); - this.projectArtifactId = responseJson.data.projectArtifactId; - this.version = responseJson.data.version; - this.applicationName = this.projectArtifactId.toUpperCase(); - window.document.title = this.applicationName; - } - }, - mounted: async function () { - this.getAppInfo(); - } -}); diff --git a/auth-center/src/main/resources/static/script/video.js b/auth-center/src/main/resources/static/script/video.js deleted file mode 100644 index 3a155900..00000000 --- a/auth-center/src/main/resources/static/script/video.js +++ /dev/null @@ -1,17 +0,0 @@ -// noinspection JSUnusedGlobalSymbols -const vm = new Vue({ - el: '#app', - data: { - appInfo: null, - videoSource: '' - }, - async mounted() { - const currentUrl = window.location.href; - const split = currentUrl.split('/'); - this.videoSource = `${split[0]}//${split[2]}/${split[3]}/test-table/demo-video`; - const baseUrl = `${split[0]}//${split[2]}`; - const response = await fetch(`${baseUrl}/common/app-info`); - const responseJson = await response.json(); - this.appInfo = responseJson.data; - } -}); diff --git a/auth-center/src/main/resources/static/styles/404.css b/auth-center/src/main/resources/static/styles/404.css deleted file mode 100644 index 09a4e9bc..00000000 --- a/auth-center/src/main/resources/static/styles/404.css +++ /dev/null @@ -1,89 +0,0 @@ -* { - margin: 0; - padding: 0; - box-sizing: border-box -} - -html { - font-size: 12px; - font-family: Ubuntu, simHei, sans-serif; - font-weight: 400 -} - -body { - font-size: 1rem -} - -button { - outline: none; - padding: 5px 8px; - color: #fff; - border: 1px solid #BCBCBC; - border-radius: 3px; - background-color: #009A61; - cursor: pointer; -} - -button:hover { - opacity: 0.8; -} - -#app { - margin: 48px auto 0; - max-width: 640px; - -webkit-perspective: 500px; -} - -.text-center { - text-align: center; -} - -.message-box { - background-color: firebrick; - max-width: 700px; - padding: 20px; - border-radius: 8px; - margin: 48px auto 20px; -} - -.slide-in-bck-center { - animation: slide-in-bck-center 1.2s cubic-bezier(0.250, 0.460, 0.450, 0.940) both; -} - -@keyframes slide-in-bck-center { - 0% { - transform: translateZ(600px); - opacity: 0; - } - 100% { - transform: translateZ(0); - opacity: 1; - } -} - -.message-text { - font-size: xx-large; - text-align: center; - color: ivory; -} - -.social-image { - width: 600px; - border-radius: 8px; -} - -.message-title { - text-align: center; - display: block; - font-size: 48px; - text-shadow: black 2px 2px 6px; -} - -.server-name { - color: gold; -} - -.go-to { - display: inline-block; - margin-bottom: 6px; -} diff --git a/auth-center/src/main/resources/static/styles/home.css b/auth-center/src/main/resources/static/styles/home.css deleted file mode 100644 index 62ebe0c2..00000000 --- a/auth-center/src/main/resources/static/styles/home.css +++ /dev/null @@ -1,222 +0,0 @@ -* { - margin: 0; - padding: 0; - box-sizing: border-box -} - -html { - font-size: 12px; - font-family: Ubuntu, simHei, sans-serif; - font-weight: 400 -} - -body { - font-size: 1rem -} - -table, -td, -th { - border-collapse: collapse; - border-spacing: 0 -} - -table { - width: 100% -} - -td, -th { - border: 1px solid #bcbcbc; - padding: 5px 10px -} - -th { - background: #42b983; - font-size: 1.2rem; - font-weight: 400; - color: #fff; - cursor: pointer -} - -tr:nth-of-type(odd) { - background: #fff -} - -tr:nth-of-type(even) { - background: #eee -} - -fieldset { - border: 1px solid #BCBCBC; - padding: 15px; -} - -input { - outline: none -} - -input[type=text] { - border: 1px solid #ccc; - padding: .5rem .3rem; -} - -input[type=text]:focus { - border-color: #42b983; -} - -button { - outline: none; - padding: 5px 8px; - color: #fff; - border: 1px solid #BCBCBC; - border-radius: 3px; - background-color: #009A61; - cursor: pointer; -} - -button:hover { - opacity: 0.8; -} - -#app { - margin: 0 auto; - max-width: 640px; - -webkit-perspective: 500px; -} - -.form-group { - margin: 10px; -} - -.form-group > label { - display: inline-block; - width: 10rem; - text-align: right; -} - -.form-group > input, -.form-group > select { - display: inline-block; - height: 2.5rem; - line-height: 2.5rem; -} - -.text-center { - text-align: center; -} - -.pagination { - display: inline-block; - padding-left: 0; - margin: 21px 0; - border-radius: 3px; -} - -.pagination > li { - display: inline; -} - -.pagination > li > a { - position: relative; - float: left; - padding: 6px 12px; - line-height: 1.5; - text-decoration: none; - color: #009a61; - background-color: #fff; - border: 1px solid #ddd; - margin-left: -1px; - list-style: none; -} - -.pagination > li > a:hover { - background-color: #eee; -} - -.pagination .active { - color: #fff; - background-color: #009a61; - border-left: none; - border-right: none; -} - -.pagination .active:hover { - background: #009a61; - cursor: default; -} - -.pagination > li:first-child > a .p { - border-bottom-left-radius: 3px; - border-top-left-radius: 3px; -} - -.pagination > li:last-child > a { - border-bottom-right-radius: 3px; - border-top-right-radius: 3px; -} - -.greeting-box { - background-color: firebrick; - max-width: 700px; - padding: 20px; - border-radius: 8px; - margin: 48px auto 20px; -} - -.slide-in-bck-center { - animation: slide-in-bck-center 1.2s cubic-bezier(0.250, 0.460, 0.450, 0.940) both; -} - -@keyframes slide-in-bck-center { - 0% { - transform: translateZ(600px); - opacity: 0; - } - 100% { - transform: translateZ(0); - opacity: 1; - } -} - -.greeting-text { - font-size: xx-large; - text-align: center; - color: ivory; - display: block; -} - -.application-name { - display: inline-block; - font-weight: bold; - width: auto; - font-size: 48px; - color: rgb(7, 156, 58); - position: relative; - left: 60px; - top: 200px; - cursor: default; -} - -.social-image { - width: 600px; - border-radius: 8px; -} - -.greeting-title { - text-align: center; - display: block; - font-size: 48px; - font-weight: bold; - color: ivory; - text-shadow: black 2px 2px 6px; -} - -.server-name { - color: gold; -} - -.go-to { - display: inline-block; - margin-bottom: 6px; -} diff --git a/auth-center/src/main/resources/static/styles/video.css b/auth-center/src/main/resources/static/styles/video.css deleted file mode 100644 index 341a63f5..00000000 --- a/auth-center/src/main/resources/static/styles/video.css +++ /dev/null @@ -1,136 +0,0 @@ -* { - margin: 0; - padding: 0; - box-sizing: border-box -} - -html { - font-size: 12px; - font-family: Ubuntu, simHei, sans-serif; - font-weight: 400 -} - -body { - font-size: 1rem -} - -table, -td, -th { - border-collapse: collapse; - border-spacing: 0 -} - -table { - width: 100% -} - -td, -th { - border: 1px solid #bcbcbc; - padding: 5px 10px -} - -th { - background: #42b983; - font-size: 1.2rem; - font-weight: 400; - color: #fff; - cursor: pointer -} - -tr:nth-of-type(odd) { - background: #fff -} - -tr:nth-of-type(even) { - background: #eee -} - -fieldset { - border: 1px solid #BCBCBC; - padding: 15px; -} - -input { - outline: none -} - -input[type=text] { - border: 1px solid #ccc; - padding: .5rem .3rem; -} - -input[type=text]:focus { - border-color: #42b983; -} - -button { - outline: none; - padding: 5px 8px; - color: #fff; - border: 1px solid #BCBCBC; - border-radius: 3px; - background-color: #009A61; - cursor: pointer; -} - -button:hover { - opacity: 0.8; -} - -#app { - margin: 0 auto; - max-width: 640px; - -webkit-perspective: 500px; -} - -.greeting-box { - background-color: firebrick; - max-width: 700px; - padding: 20px; - border-radius: 8px; - margin: 48px auto 20px; -} - -.slide-in-bck-center { - animation: slide-in-bck-center 1.2s cubic-bezier(0.250, 0.460, 0.450, 0.940) both; -} - -@keyframes slide-in-bck-center { - 0% { - transform: translateZ(600px); - opacity: 0; - } - 100% { - transform: translateZ(0); - opacity: 1; - } -} - -.greeting-text { - font-size: xx-large; - text-align: center; - color: ivory; -} - -.social-image { - width: 600px; - border-radius: 8px; -} - -.greeting-title { - text-align: center; - display: block; - font-size: 48px; - text-shadow: black 2px 2px 6px; -} - -.server-name { - color: gold; -} - -.go-to { - display: inline-block; - margin-bottom: 6px; -} diff --git a/auth-center/src/main/resources/static/video.html b/auth-center/src/main/resources/static/video.html deleted file mode 100644 index 9a186caa..00000000 --- a/auth-center/src/main/resources/static/video.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - ExRx.net Crawler Server - - - - -
-
- - Hello, World! - Welcome to {{ appInfo.projectArtifactId }}@{{ appInfo.version }}! - - -
-
- - - - diff --git a/auth-center/src/test/java/com/jmsoftware/maf/authcenter/AuthCenterApplicationTests.java b/auth-center/src/test/java/com/jmsoftware/maf/authcenter/AuthCenterApplicationTests.java index 0b998518..7fa17004 100644 --- a/auth-center/src/test/java/com/jmsoftware/maf/authcenter/AuthCenterApplicationTests.java +++ b/auth-center/src/test/java/com/jmsoftware/maf/authcenter/AuthCenterApplicationTests.java @@ -1,13 +1,41 @@ package com.jmsoftware.maf.authcenter; +import cn.hutool.core.util.StrUtil; +import com.jmsoftware.maf.authcenter.security.service.JwtService; +import com.jmsoftware.maf.common.domain.authcenter.security.UserPrincipal; +import com.jmsoftware.maf.common.domain.authcenter.user.GetUserByLoginTokenResponse; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import lombok.val; +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import java.util.ArrayList; + +/** + * Description: AuthCenterApplicationTests. + * + * @author 钟俊 (zhongjun), email: zhongjun@toguide.cn, date: 12/21/2020 3:08 PM + */ +@Slf4j @SpringBootTest class AuthCenterApplicationTests { + @Autowired + private JwtService jwtService; @Test - void contextLoads() { + @SneakyThrows + void mockLogin() { + GetUserByLoginTokenResponse user = new GetUserByLoginTokenResponse(); + user.setId(1L); + user.setUsername("ijohnnymiller"); + val authenticationToken = new UsernamePasswordAuthenticationToken( + UserPrincipal.create(user, new ArrayList<>(), new ArrayList<>()), 12345678); + String jwt = jwtService.createJwt(authenticationToken, false); + log.info("Generated JWT: {}", jwt); + Assertions.assertTrue(StrUtil.isNotBlank(jwt)); } - } diff --git a/auth-center/src/test/java/com/jmsoftware/maf/authcenter/mybatis/MyBatisPlusTests.java b/auth-center/src/test/java/com/jmsoftware/maf/authcenter/mybatis/MyBatisPlusTests.java new file mode 100644 index 00000000..ad40eaec --- /dev/null +++ b/auth-center/src/test/java/com/jmsoftware/maf/authcenter/mybatis/MyBatisPlusTests.java @@ -0,0 +1,72 @@ +package com.jmsoftware.maf.authcenter.mybatis; + +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.jmsoftware.maf.authcenter.role.entity.persistence.Role; +import com.jmsoftware.maf.authcenter.role.mapper.RoleMapper; +import com.jmsoftware.maf.authcenter.role.service.RoleService; +import com.jmsoftware.maf.common.domain.DeletedField; +import lombok.extern.slf4j.Slf4j; +import lombok.val; +import org.junit.jupiter.api.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.Optional; + +/** + * Description: MyBatisPlusTests, change description here. + * + * @author 钟俊(zhongjun), email: zhongjun@toguide.cn, date: 1/13/2021 4:41 PM + **/ +@Slf4j +@SpringBootTest +@TestMethodOrder(MethodOrderer.OrderAnnotation.class) +public class MyBatisPlusTests { + @Autowired + private RoleService roleService; + @Autowired + private RoleMapper roleMapper; + + @Test + @Order(1) + void insertAutoFillTest() { + val role = new Role(); + role.setName("role-for-mybatis-plus-tests"); + role.setDescription("Role for MyBatis Plus tests. Testing functions"); + int inserted; + try { + inserted = roleService.getBaseMapper().insert(role); + } catch (Exception e) { + log.error("Error occurred when inserting role", e); + return; + } + log.info("insertAutoFillTest saved: {}", inserted); + Assertions.assertEquals(inserted, 1); + } + + @Test + @Order(2) + void logicDeleteTest() { + val lambdaQuery = Wrappers.lambdaQuery(Role.class); + lambdaQuery.eq(Role::getName, "role-for-mybatis-plus-tests"); + var optionalRolePersistence = Optional.ofNullable(roleService.getBaseMapper().selectOne(lambdaQuery)); + if (optionalRolePersistence.isEmpty()) { + optionalRolePersistence = Optional.ofNullable(roleMapper.selectByName("role-for-mybatis-plus-tests")); + } + Assertions.assertTrue(optionalRolePersistence.isPresent()); + val rolePersistence = optionalRolePersistence.get(); + if (DeletedField.DELETED.getValue().equals(rolePersistence.getDeleted())) { + log.warn("Role deleted. {}", rolePersistence); + return; + } + val deleted = roleService.getBaseMapper().delete(lambdaQuery); + log.info("Logic delete result: {}", deleted); + Assertions.assertEquals(deleted, 1); + lambdaQuery.eq(Role::getDeleted, DeletedField.DELETED.getValue()); + val rolePersistence2 = roleMapper.selectByName(rolePersistence.getName()); + log.info("Deleted role: {}", rolePersistence2); + Assertions.assertEquals(rolePersistence2.getDeleted(), DeletedField.DELETED.getValue()); + final var deletedRolePersistence = roleService.getOne(lambdaQuery); + Assertions.assertNull(deletedRolePersistence); + } +} diff --git a/auto-run-mac.sh b/auto-run-mac.sh index 26410267..72203683 100755 --- a/auto-run-mac.sh +++ b/auto-run-mac.sh @@ -2,7 +2,7 @@ ############################## auto-run ############################ # Author: Johnny Miller, date: 7:31 AM, Dec. 5, 2020 # # Copyright (c) Johnny Miller # -# Capability: macOS Big Sur 11.0.1 (20B29) # +# Capability: macOS Big Sur 11.2.1 (20D74) # # Purpose: # # 1. Integrate easy and simple deployment, # # 2. Reduce memory usage of IntelliJ IDEA to run services, # @@ -16,14 +16,12 @@ set -e ############### Configurable Environment Variables ################ readonly mavenActiveProfile="development-local" -readonly javaParameter="-Xms256m -Xmx256m -Dspring.profiles.active=$mavenActiveProfile" -# The name of service `service-registry` is `service-registry`, also equal to the directory `service-registry`. +readonly javaParameter="-Xms256m -Xmx256m -Dfile.encoding=UTF-8 -Dspring.cloud.consul.host=localhost -Dspring.profiles.active=$mavenActiveProfile" readonly runServices=( - service-registry - spring-boot-admin -# api-portal + auth-center + api-gateway ) -readonly skipGitPull=false +readonly skipGitPull=true readonly skipBuild=false # Available options for `startMode`: "keep-previous", "overlap" readonly startMode="overlap" diff --git a/common/pom.xml b/common/pom.xml index a8ca47f4..915a40b9 100644 --- a/common/pom.xml +++ b/common/pom.xml @@ -10,14 +10,34 @@ com.jmsoftware.maf muscle-and-fitness-server - 0.0.1 + 0.0.2 + + + + org.springframework + spring-web + + + org.springframework.boot + spring-boot-starter-validation + + + + org.springframework.boot + spring-boot-starter-security + true + + + org.springframework.boot + spring-boot-starter-json diff --git a/common/src/main/java/com/jmsoftware/maf/common/bean/EnumerationBase.java b/common/src/main/java/com/jmsoftware/maf/common/bean/EnumerationBase.java new file mode 100644 index 00000000..4d56b063 --- /dev/null +++ b/common/src/main/java/com/jmsoftware/maf/common/bean/EnumerationBase.java @@ -0,0 +1,18 @@ +package com.jmsoftware.maf.common.bean; + +/** + *

EnumerationBase

+ *

+ * Change description here. + * + * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com + * @date 6/6/21 5:38 PM + **/ +public interface EnumerationBase { + /** + * Gets value. + * + * @return the value + */ + T getValue(); +} diff --git a/common/src/main/java/com/jmsoftware/maf/common/bean/ExcelImportResult.java b/common/src/main/java/com/jmsoftware/maf/common/bean/ExcelImportResult.java new file mode 100644 index 00000000..17cd9bc6 --- /dev/null +++ b/common/src/main/java/com/jmsoftware/maf/common/bean/ExcelImportResult.java @@ -0,0 +1,19 @@ +package com.jmsoftware.maf.common.bean; + +import lombok.Data; + +import java.util.List; + +/** + *

ExcelImportResult

+ *

+ * Change description here. + * + * @author 钟俊 (jun.zhong), email: jun.zhong@ucarinc.com + * @date 4/29/20 8:50 PM + **/ +@Data +public class ExcelImportResult { + private List messageList; + private String excelFilePath; +} diff --git a/common/src/main/java/com/jmsoftware/maf/common/bean/PageResponseBodyBean.java b/common/src/main/java/com/jmsoftware/maf/common/bean/PageResponseBodyBean.java new file mode 100644 index 00000000..b6bdecbb --- /dev/null +++ b/common/src/main/java/com/jmsoftware/maf/common/bean/PageResponseBodyBean.java @@ -0,0 +1,329 @@ +package com.jmsoftware.maf.common.bean; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.json.JSON; +import cn.hutool.json.JSONConfig; +import cn.hutool.json.JSONUtil; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.google.common.collect.Lists; +import com.jmsoftware.maf.common.constant.UniversalDateTime; +import com.jmsoftware.maf.common.exception.BaseException; +import com.jmsoftware.maf.common.exception.BusinessException; +import lombok.*; +import org.springframework.http.HttpStatus; +import org.springframework.lang.Nullable; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; + +/** + *

PageResponseBodyBean

+ *

+ * Page Response body bean. + * + * @param the response body data type + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 6/27/2021 4:24 PM + */ +@Data +@SuppressWarnings("unused") +public class PageResponseBodyBean implements Serializable { + /** + * The constant serialVersionUID. + */ + private static final long serialVersionUID = 4645461634548783641L; + + /** + * The Timestamp. Must be annotated by '@JsonFormat', otherwise will cause following error, cuz api-gateway does not + * know how to convert LocalDateTime. + *

+ * Failed to deserialize java.time.LocalDateTime: (java.time.format.DateTimeParseException) Text '2021-06-27 + * 23:08:46' + */ + @Setter(AccessLevel.NONE) + @JsonFormat(pattern = UniversalDateTime.DATE_TIME_FORMAT) + final LocalDateTime timestamp = LocalDateTime.now(); + /** + * Default status is 200 OK. + */ + private Integer status = HttpStatus.OK.value(); + /** + * The Message. Default: 200 OK. + */ + private String message = HttpStatus.OK.getReasonPhrase(); + /** + * The List. + */ + private Collection list = Collections.emptyList(); + /** + * The Total. + */ + private long total; + + /** + *

Respond to client with IUniversalStatus (status may be OK or other).

+ *

ATTENTION:

+ *

This method CANNOT be used by controller or service or other class, only provided for Exception controller + * .

+ * + * @param the type parameter + * @param status IUniversalStatus + * @return response body for ExceptionControllerAdvice javax.servlet.http.HttpServletResponse, Exception) + */ + public static PageResponseBodyBean ofStatus(@NonNull final HttpStatus status) { + PageResponseBodyBean responseBodyBean = new PageResponseBodyBean<>(); + responseBodyBean.setStatus(status.value()); + responseBodyBean.setMessage(status.getReasonPhrase()); + return responseBodyBean; + } + + /** + * Of status response body bean. + * + * @param the type parameter + * @param status the status + * @param message the message + * @return the response body bean + */ + public static PageResponseBodyBean ofStatus(@NonNull final HttpStatus status, + @NonNull final String message) { + PageResponseBodyBean responseBodyBean = new PageResponseBodyBean<>(); + responseBodyBean.setStatus(status.value()); + responseBodyBean.setMessage(message); + return responseBodyBean; + } + + /** + *

Respond to client with IUniversalStatus and data.

+ *

ATTENTION:

+ *

This method CANNOT be used by controller or service or other class, only provided for Exception controller + * .

+ * + * @param the response body data type + * @param status IUniversalStatus + * @param data data to be responded to client + * @param total the total + * @return response body for ExceptionControllerAdvice + */ + public static PageResponseBodyBean ofStatus(@NonNull final HttpStatus status, + final Collection data, + final long total) { + PageResponseBodyBean responseBodyBean = new PageResponseBodyBean<>(); + responseBodyBean.setStatus(status.value()); + responseBodyBean.setMessage(status.getReasonPhrase()); + responseBodyBean.setList(data); + responseBodyBean.setTotal(total); + return responseBodyBean; + } + + /** + *

Highly customizable response. Status might be any HttpStatus' code value.

+ *

ATTENTION:

+ *

This method CANNOT be used by controller or service or other class, only provided for Exception controller + * .

+ * + * @param the response body data type + * @param status status code + * @param message message to be responded + * @param data data to be responded + * @param total the total + * @return response body for ExceptionControllerAdvice + */ + public static PageResponseBodyBean ofStatus(@NonNull final Integer status, + @NonNull final String message, + final Collection data, + final long total) { + PageResponseBodyBean responseBodyBean = new PageResponseBodyBean<>(); + responseBodyBean.setStatus(status); + responseBodyBean.setMessage(message); + responseBodyBean.setList(data); + responseBodyBean.setTotal(total); + return responseBodyBean; + } + + /** + *

Highly customizable response. Status might be any HttpStatus' code value.

+ *

ATTENTION:

+ *

This method CANNOT be used in ExceptionControllerAdvice.

+ * + * @param the response body data type + * @param status status code + * @param message message to be responded + * @param data data to be responded + * @param total the total + * @return response body + * @throws BaseException the base exception + */ + public static PageResponseBodyBean setResponse(@NonNull final Integer status, + @NonNull final String message, + final Collection data, + final long total) + throws BaseException { + if (!HttpStatus.valueOf(status).is2xxSuccessful()) { + throw new BaseException(status, message, data); + } + PageResponseBodyBean responseBodyBean = new PageResponseBodyBean<>(); + responseBodyBean.setStatus(status); + responseBodyBean.setMessage(message); + responseBodyBean.setList(data); + responseBodyBean.setTotal(total); + return responseBodyBean; + } + + /** + * Respond null data, and status is OK. + * + * @param the response body data type + * @return response body + */ + public static PageResponseBodyBean ofSuccess() { + return new PageResponseBodyBean<>(); + } + + /** + * Respond data and status is OK. + * + * @param the response body data type + * @param data data to be responded to client. + * @param total the total + * @return response body + */ + public static PageResponseBodyBean ofSuccess(final Collection data, + final long total) { + PageResponseBodyBean responseBodyBean = new PageResponseBodyBean<>(); + responseBodyBean.setList(data); + responseBodyBean.setTotal(total); + return responseBodyBean; + } + + /** + * Respond a message and status is OK. + * + * @param the response body data type + * @param message message to be responded + * @return response body + */ + public static PageResponseBodyBean ofSuccess(@NonNull final String message) { + PageResponseBodyBean responseBodyBean = new PageResponseBodyBean<>(); + responseBodyBean.setMessage(message); + return responseBodyBean; + } + + /** + * Respond data, message and status is OK. + * + * @param the response body data type + * @param data data to be responded + * @param message message to be responded + * @param total the total + * @return response body + */ + public static PageResponseBodyBean ofSuccess(final Collection data, + @NonNull final String message, + final long total) { + PageResponseBodyBean responseBodyBean = new PageResponseBodyBean<>(); + responseBodyBean.setMessage(message); + responseBodyBean.setList(data); + responseBodyBean.setTotal(total); + return responseBodyBean; + } + + /** + * Respond a message and status is FAILURE(464). + * + * @param the response body data type + * @param message message to be responded. + * @return response body + * @throws BusinessException the business exception + */ + public static PageResponseBodyBean ofFailure(@NonNull final String message) throws BusinessException { + throw new BusinessException(message); + } + + /** + * Respond a message and status is FAILURE(464). + * + * @param the response body data type + * @param data data to be responded + * @return response body + * @throws BusinessException the business exception + */ + public static PageResponseBodyBean ofFailure(final Collection data) throws BusinessException { + throw new BusinessException(data); + } + + /** + * Respond data and message, and status if FAILURE(464). + * + * @param the response body data type + * @param data data to be responded + * @param message message to be responded + * @return response body + * @throws BusinessException the business exception + */ + public static PageResponseBodyBean ofFailure(final Collection data, + @NonNull final String message) throws BusinessException { + throw new BusinessException(data, message); + } + + /** + * Respond an ERROR(500). + * + * @param the response body data type + * @return response body + * @throws BaseException the base exception + */ + public static PageResponseBodyBean ofError() throws BaseException { + return setResponse(HttpStatus.INTERNAL_SERVER_ERROR.value(), HttpStatus.INTERNAL_SERVER_ERROR.getReasonPhrase(), + null, 0); + } + + /** + * Respond a custom error. + * + * @param the response body data type + * @param status Error status, not OK(200) + * @return response body + * @throws BaseException the base exception + */ + public static PageResponseBodyBean ofError(@NonNull final HttpStatus status) + throws BaseException { + return setResponse(status.value(), status.getReasonPhrase(), null, 0); + } + + /** + * Response an exception. + * + * @param the response body data type + * @param Sub class of {@link BaseException} + * @param throwable exception + * @return the response body bean + * @throws BaseException the base exception + */ + public static PageResponseBodyBean ofException(@NonNull final BaseThrowable throwable) + throws BaseException { + throw throwable; + } + + /** + * Of json. + * + * @param the type parameter + * @param message the message + * @param data the data + * @param total the total + * @param status the status + * @return the json + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 12/22/2020 10:16 AM + */ + public static JSON of(@NonNull String message, + @Nullable Collection data, + long total, @NonNull Integer status) { + val responseBodyBean = PageResponseBodyBean.ofStatus(status, message, data, total); + val config = new JSONConfig(); + config.setIgnoreNullValue(false).setDateFormat("yyyy-MM-dd HH:mm:ss"); + return JSONUtil.parse(responseBodyBean, config); + } +} diff --git a/common/src/main/java/com/jmsoftware/maf/common/bean/PaginationBase.java b/common/src/main/java/com/jmsoftware/maf/common/bean/PaginationBase.java index 137afb46..94181eef 100644 --- a/common/src/main/java/com/jmsoftware/maf/common/bean/PaginationBase.java +++ b/common/src/main/java/com/jmsoftware/maf/common/bean/PaginationBase.java @@ -1,5 +1,6 @@ package com.jmsoftware.maf.common.bean; +import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.StrUtil; import com.fasterxml.jackson.annotation.JsonIgnore; import lombok.Data; @@ -7,13 +8,14 @@ import javax.validation.constraints.Min; import javax.validation.constraints.NotNull; +import javax.validation.constraints.Pattern; /** *

PaginationBase

*

* Pagination Base. * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com * @date 2/17/20 11:18 PM **/ @Data @@ -24,14 +26,14 @@ public class PaginationBase { */ @JsonIgnore @NotNull(message = "The current page is required!") - @Min(value = 1, message = "The current page is not less then 1!") + @Min(value = 1L, message = "The current page is not less then 1!") private Integer currentPage = 1; /** * The page size. Default: 10 */ @JsonIgnore @NotNull(message = "The page size is required!") - @Range(min = 10, max = 100, message = "The rage of page size: 10 <= page size <= 100!") + @Range(min = 10L, max = 100L, message = "The rage of page size: 10 <= page size <= 100!") private Integer pageSize = 10; /** * The order-by. (for table's field) @@ -42,6 +44,7 @@ public class PaginationBase { * The order rule. Default: DESC */ @JsonIgnore + @Pattern(regexp = "^(ASC|DESC)$") private String orderRule = "DESC"; /** * The order-by statement needs to be joined. @@ -49,10 +52,26 @@ public class PaginationBase { @JsonIgnore private String orderByStatement; + @JsonIgnore public String getOrderByStatement() { if (!StrUtil.isBlank(orderBy)) { - return String.format("%s %s %s", "ORDER BY", orderBy, orderRule); + return String.format("%s `%s` %s", "ORDER BY", orderBy, orderRule); } return orderByStatement; } + + /** + * Has next page boolean. + * + * @param pageResponseBodyBean the page response body bean + * @return the boolean + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 6/27/2021 4:37 PM + */ + public boolean hasNextPage(@NotNull PageResponseBodyBean pageResponseBodyBean) { + if (NumberUtil.compare(pageResponseBodyBean.getTotal(), (long) currentPage * pageSize) > 0) { + currentPage += 1; + return true; + } + return false; + } } diff --git a/common/src/main/java/com/jmsoftware/maf/common/bean/ResponseBodyBean.java b/common/src/main/java/com/jmsoftware/maf/common/bean/ResponseBodyBean.java index 6534b676..0254cfef 100644 --- a/common/src/main/java/com/jmsoftware/maf/common/bean/ResponseBodyBean.java +++ b/common/src/main/java/com/jmsoftware/maf/common/bean/ResponseBodyBean.java @@ -1,16 +1,18 @@ package com.jmsoftware.maf.common.bean; +import cn.hutool.json.JSON; +import cn.hutool.json.JSONConfig; +import cn.hutool.json.JSONUtil; import com.fasterxml.jackson.annotation.JsonFormat; -import com.jmsoftware.maf.common.constant.HttpStatus; -import com.jmsoftware.maf.common.constant.IUniversalStatus; +import com.jmsoftware.maf.common.constant.UniversalDateTime; import com.jmsoftware.maf.common.exception.BaseException; import com.jmsoftware.maf.common.exception.BusinessException; -import lombok.Builder; -import lombok.NonNull; -import lombok.Value; +import lombok.*; +import org.springframework.http.HttpStatus; +import org.springframework.lang.Nullable; import java.io.Serializable; -import java.util.Date; +import java.time.LocalDateTime; /** *

ResponseBodyBean

@@ -18,11 +20,10 @@ * Response body bean. * * @param the response body data type - * @author Johnny Miller (鍾俊), e-mail: johnnysviva@outlook.com + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com * @date 2/27/20 9:24 AM */ -@Value -@Builder +@Data @SuppressWarnings("unused") public class ResponseBodyBean implements Serializable { /** @@ -31,22 +32,27 @@ public class ResponseBodyBean implements Serializable { private static final long serialVersionUID = 4645469240048361965L; /** - * The Timestamp. + * The Timestamp. Must be annotated by '@JsonFormat', otherwise will cause following error, cuz api-gateway does not + * know how to convert LocalDateTime. + *

+ * Failed to deserialize java.time.LocalDateTime: (java.time.format.DateTimeParseException) Text '2021-06-27 + * 23:08:46' */ - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") - Date timestamp; + @Setter(AccessLevel.NONE) + @JsonFormat(pattern = UniversalDateTime.DATE_TIME_FORMAT) + private final LocalDateTime timestamp = LocalDateTime.now(); /** - * Default status is OK[200] + * Default status is 200 OK. */ - Integer status; + private Integer status = HttpStatus.OK.value(); /** - * The Message. + * The Message. Default: 200 OK. */ - String message; + private String message = HttpStatus.OK.getReasonPhrase(); /** * The Data. */ - ResponseBodyDataType data; + private ResponseBodyDataType data; /** *

Respond to client with IUniversalStatus (status may be OK or other).

@@ -58,12 +64,27 @@ public class ResponseBodyBean implements Serializable { * @param status IUniversalStatus * @return response body for ExceptionControllerAdvice javax.servlet.http.HttpServletResponse, Exception) */ - public static ResponseBodyBean ofStatus(@NonNull final IUniversalStatus status) { - return ResponseBodyBean.builder() - .timestamp(new Date()) - .status(status.getCode()) - .message(status.getMessage()) - .build(); + public static ResponseBodyBean ofStatus(@NonNull final HttpStatus status) { + ResponseBodyBean responseBodyBean = new ResponseBodyBean<>(); + responseBodyBean.setStatus(status.value()); + responseBodyBean.setMessage(status.getReasonPhrase()); + return responseBodyBean; + } + + /** + * Of status response body bean. + * + * @param the type parameter + * @param status the status + * @param message the message + * @return the response body bean + */ + public static ResponseBodyBean ofStatus(@NonNull final HttpStatus status, + @NonNull final String message) { + ResponseBodyBean responseBodyBean = new ResponseBodyBean<>(); + responseBodyBean.setStatus(status.value()); + responseBodyBean.setMessage(message); + return responseBodyBean; } /** @@ -77,14 +98,13 @@ public static ResponseBodyBean ofSt * @param data data to be responded to client * @return response body for ExceptionControllerAdvice */ - public static ResponseBodyBean ofStatus(@NonNull final IUniversalStatus status, - @NonNull final ResponseBodyDataType data) { - return ResponseBodyBean.builder() - .timestamp(new Date()) - .status(status.getCode()) - .message(status.getMessage()) - .data(data) - .build(); + public static ResponseBodyBean ofStatus(@NonNull final HttpStatus status, + final ResponseBodyDataType data) { + ResponseBodyBean responseBodyBean = new ResponseBodyBean<>(); + responseBodyBean.setStatus(status.value()); + responseBodyBean.setMessage(status.getReasonPhrase()); + responseBodyBean.setData(data); + return responseBodyBean; } /** @@ -102,12 +122,11 @@ public static ResponseBodyBean ofSt public static ResponseBodyBean ofStatus(@NonNull final Integer status, @NonNull final String message, final ResponseBodyDataType data) { - return ResponseBodyBean.builder() - .timestamp(new Date()) - .status(status) - .message(message) - .data(data) - .build(); + ResponseBodyBean responseBodyBean = new ResponseBodyBean<>(); + responseBodyBean.setStatus(status); + responseBodyBean.setMessage(message); + responseBodyBean.setData(data); + return responseBodyBean; } /** @@ -125,15 +144,14 @@ public static ResponseBodyBean setR @NonNull final String message, final ResponseBodyDataType data) throws BaseException { - if (!HttpStatus.OK.getCode().equals(status)) { + if (!HttpStatus.valueOf(status).is2xxSuccessful()) { throw new BaseException(status, message, data); } - return ResponseBodyBean.builder() - .timestamp(new Date()) - .status(status) - .message(message) - .data(data) - .build(); + ResponseBodyBean responseBodyBean = new ResponseBodyBean<>(); + responseBodyBean.setStatus(status); + responseBodyBean.setMessage(message); + responseBodyBean.setData(data); + return responseBodyBean; } /** @@ -143,11 +161,7 @@ public static ResponseBodyBean setR * @return response body */ public static ResponseBodyBean ofSuccess() { - return ResponseBodyBean.builder() - .timestamp(new Date()) - .status(HttpStatus.OK.getCode()) - .message(HttpStatus.OK.getMessage()) - .build(); + return new ResponseBodyBean<>(); } /** @@ -158,12 +172,9 @@ public static ResponseBodyBean ofSu * @return response body */ public static ResponseBodyBean ofSuccess(final ResponseBodyDataType data) { - return ResponseBodyBean.builder() - .timestamp(new Date()) - .status(HttpStatus.OK.getCode()) - .message(HttpStatus.OK.getMessage()) - .data(data) - .build(); + ResponseBodyBean responseBodyBean = new ResponseBodyBean<>(); + responseBodyBean.setData(data); + return responseBodyBean; } /** @@ -174,10 +185,9 @@ public static ResponseBodyBean ofSu * @return response body */ public static ResponseBodyBean ofSuccess(@NonNull final String message) { - return ResponseBodyBean.builder().timestamp(new Date()) - .status(HttpStatus.OK.getCode()) - .message(message) - .build(); + ResponseBodyBean responseBodyBean = new ResponseBodyBean<>(); + responseBodyBean.setMessage(message); + return responseBodyBean; } /** @@ -190,11 +200,10 @@ public static ResponseBodyBean ofSu */ public static ResponseBodyBean ofSuccess(final ResponseBodyDataType data, @NonNull final String message) { - return ResponseBodyBean.builder().timestamp(new Date()) - .status(HttpStatus.OK.getCode()) - .message(message) - .data(data) - .build(); + ResponseBodyBean responseBodyBean = new ResponseBodyBean<>(); + responseBodyBean.setMessage(message); + responseBodyBean.setData(data); + return responseBodyBean; } /** @@ -239,7 +248,8 @@ public static ResponseBodyBean ofFa * @return response body */ public static ResponseBodyBean ofError() throws BaseException { - return setResponse(HttpStatus.ERROR.getCode(), HttpStatus.ERROR.getMessage(), null); + return setResponse(HttpStatus.INTERNAL_SERVER_ERROR.value(), HttpStatus.INTERNAL_SERVER_ERROR.getReasonPhrase(), + null); } /** @@ -249,9 +259,9 @@ public static ResponseBodyBean ofEr * @param status Error status, not OK(200) * @return response body */ - public static ResponseBodyBean ofError(@NonNull final IUniversalStatus status) + public static ResponseBodyBean ofError(@NonNull final HttpStatus status) throws BaseException { - return setResponse(status.getCode(), status.getMessage(), null); + return setResponse(status.value(), status.getReasonPhrase(), null); } /** @@ -266,4 +276,20 @@ public static Respon throws BaseException { throw throwable; } + + /** + * Of json. + * + * @param message the message + * @param data the data + * @param status the status + * @return the json + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 12/22/2020 10:16 AM + */ + public static JSON of(@NonNull String message, @Nullable Object data, @NonNull Integer status) { + val responseBodyBean = ResponseBodyBean.ofStatus(status, message, data); + val config = new JSONConfig(); + config.setIgnoreNullValue(false).setDateFormat("yyyy-MM-dd HH:mm:ss"); + return JSONUtil.parse(responseBodyBean, config); + } } diff --git a/common/src/main/java/com/jmsoftware/maf/common/constant/HttpStatus.java b/common/src/main/java/com/jmsoftware/maf/common/constant/HttpStatus.java deleted file mode 100644 index 552a93ec..00000000 --- a/common/src/main/java/com/jmsoftware/maf/common/constant/HttpStatus.java +++ /dev/null @@ -1,415 +0,0 @@ -package com.jmsoftware.maf.common.constant; - -import lombok.Getter; -import lombok.ToString; -import org.springframework.lang.Nullable; - -/** - *

HttpStatus

- *

Hypertext Transfer Protocol (HTTP) Status Code

- * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2019-03-23 16:48 - * @see HTTP Status Code Registry - * @see List of HTTP status codes - */ -@Getter -@ToString -@SuppressWarnings("unused") -public enum HttpStatus implements IUniversalStatus { - /* - Value Description Reference - 100 Continue [RFC7231, Section 6.2.1] - 101 Switching Protocols [RFC7231, Section 6.2.2] - 102 Processing [RFC2518] - 103 Early Hints [RFC8297] - 104-199 Unassigned - 200 OK [RFC7231, Section 6.3.1] - 201 Created [RFC7231, Section 6.3.2] - 202 Accepted [RFC7231, Section 6.3.3] - 203 Non-Authoritative Information [RFC7231, Section 6.3.4] - 204 No Content [RFC7231, Section 6.3.5] - 205 Reset Content [RFC7231, Section 6.3.6] - 206 Partial Content [RFC7233, Section 4.1] - 207 Multi-Status [RFC4918] - 208 Already Reported [RFC5842] - 209-225 Unassigned - 226 IM Used [RFC3229] - 227-299 Unassigned - 300 Multiple Choices [RFC7231, Section 6.4.1] - 301 Moved Permanently [RFC7231, Section 6.4.2] - 302 Found [RFC7231, Section 6.4.3] - 303 See Other [RFC7231, Section 6.4.4] - 304 Not Modified [RFC7232, Section 4.1] - 305 Use Proxy [RFC7231, Section 6.4.5] - 306 (Unused) [RFC7231, Section 6.4.6] - 307 Temporary Redirect [RFC7231, Section 6.4.7] - 308 Permanent Redirect [RFC7538] - 309-399 Unassigned - 400 Bad Request [RFC7231, Section 6.5.1] - 401 Unauthorized [RFC7235, Section 3.1] - 402 Payment Required [RFC7231, Section 6.5.2] - 403 Forbidden [RFC7231, Section 6.5.3] - 404 Not Found [RFC7231, Section 6.5.4] - 405 Method Not Allowed [RFC7231, Section 6.5.5] - 406 Not Acceptable [RFC7231, Section 6.5.6] - 407 Proxy Authentication Required [RFC7235, Section 3.2] - 408 Request Timeout [RFC7231, Section 6.5.7] - 409 Conflict [RFC7231, Section 6.5.8] - 410 Gone [RFC7231, Section 6.5.9] - 411 Length Required [RFC7231, Section 6.5.10] - 412 Precondition Failed [RFC7232, Section 4.2][RFC8144, Section 3.2] - 413 Payload Too Large [RFC7231, Section 6.5.11] - 414 URI Too Long [RFC7231, Section 6.5.12] - 415 Unsupported Media Type [RFC7231, Section 6.5.13][RFC7694, Section 3] - 416 Range Not Satisfiable [RFC7233, Section 4.4] - 417 Expectation Failed [RFC7231, Section 6.5.14] - 418-420 Unassigned - 421 Misdirected Request [RFC7540, Section 9.1.2] - 422 Unprocessable Entity [RFC4918] - 423 Locked [RFC4918] - 424 Failed Dependency [RFC4918] - 425 Too Early [RFC8470] - 426 Upgrade Required [RFC7231, Section 6.5.15] - 427 Unassigned - 428 Precondition Required [RFC6585] - 429 Too Many Requests [RFC6585] - 430 Unassigned - 431 Request Header Fields Too Large [RFC6585] - 432-450 Unassigned - 451 Unavailable For Legal Reasons [RFC7725] - 452-499 Unassigned - 500 Internal Server Error [RFC7231, Section 6.6.1] - 501 Not Implemented [RFC7231, Section 6.6.2] - 502 Bad Gateway [RFC7231, Section 6.6.3] - 503 Service Unavailable [RFC7231, Section 6.6.4] - 504 Gateway Timeout [RFC7231, Section 6.6.5] - 505 HTTP Version Not Supported [RFC7231, Section 6.6.6] - 506 Variant Also Negotiates [RFC2295] - 507 Insufficient Storage [RFC4918] - 508 Loop Detected [RFC5842] - 509 Unassigned - 510 Not Extended [RFC2774] - 511 Network Authentication Required [RFC6585] - 512-599 Unassigned - */ - - // --- 2xx Success --- - /** - * OK - */ - OK(200, "OK. The standard response for successful HTTP requests."), - - // --- 4xx Client Error --- - /** - * Bad request - */ - BAD_REQUEST(400, "Bad request. The server cannot or will not process the request due to an apparent client error."), - /** - * Unauthorized - */ - UNAUTHORIZED(401, "Unauthorized. The requester is not authorized to access the resource."), - /** - * Forbidden - */ - FORBIDDEN(403, "Forbidden. The request was formatted correctly but the server is refusing to supply the requested" + - " resource."), - /** - * Not found - */ - NOT_FOUND(404, "Not found. The resource could not be found."), - /** - * Method not allowed - */ - METHOD_NOT_ALLOWED(405, "The resource was requested using a method that is not allowed."), - /** - * Not acceptable - */ - NOT_ACCEPTABLE(406, "Not acceptable. The requested resource is capable of generating only content not acceptable " + - "according to the Accept headers sent in the request."), - /** - * Param not matched - */ - PARAM_NOT_MATCH(460, "Param not matched. " + - "The request could not be fulfilled due to the incorrect syntax of the request."), - /** - * Param not null - */ - PARAM_NOT_NULL(461, "Param not null."), - /** - * Invalid param - */ - INVALID_PARAM(462, "Invalid param."), - /** - * User disabled - */ - USER_DISABLED(463, "User disabled."), - /** - * Failure - */ - FAILURE(464, "Failure. Business failure or operation failure."), - /** - * Warning - */ - WARNING(465, "Warning. Operation may by possible danger or trouble."), - - // --- 5xx Server Error --- - /** - * Internal Server Error - */ - ERROR(500, "Internal server error. A generic status for an error in the server itself."), - /** - * Not implemented - */ - NOT_IMPLEMENTED(501, "Not implemented. The server either does not recognize the request method, or it lacks the " + - "ability to fulfil the request."), - /** - * Bad gateway - */ - BAD_GATEWAY(502, "Bad gateway. The server was acting as a gateway or proxy and received an invalid response from " + - "the upstream server."), - /** - * Service unavailable - */ - SERVICE_UNAVAILABLE(503, "Service unavailable. The server cannot handle the request (because it is overloaded or " + - "down for maintenance). Generally, this is a temporary state."), - /** - * Gateway timeout - */ - GATEWAY_TIMEOUT(504, "Gateway timeout. The server was acting as a gateway or proxy and did not receive a timely " + - "response from the upstream server."), - /** - * Role not found - */ - ROLE_NOT_FOUND(552, "Role not found."), - /** - * Username or password is not correct or account error - */ - BAD_CREDENTIALS(553, "Username or password is not correct or account error."), - /** - * Token expired - */ - TOKEN_EXPIRED(554, "Token expired."), - /** - * Token parse error - */ - TOKEN_PARSE_ERROR(555, "Token parse error."), - /** - * Token out of control - */ - TOKEN_OUT_OF_CONTROL(556, "Token out of control. Current user has logged in before. " + - "Please try to reset current password or sign in again."), - /** - * Kick out self 无法手动踢出自己,请尝试退出登录操作! - */ - KICK_OUT_SELF(557, "Cannot kick self out. Please try to sign in again."); - - /** - * Code of status - */ - private final Integer code; - /** - * Message of status - */ - private final String message; - - /** - * Instantiates a new Http status. - * - * @param code the code - * @param message the message - */ - HttpStatus(Integer code, String message) { - this.code = code; - this.message = message; - } - - /** - * From code http status. - * - * @param code the code - * @return the http status - */ - public static HttpStatus fromCode(Integer code) { - HttpStatus[] httpStatuses = HttpStatus.values(); - for (HttpStatus httpStatus : httpStatuses) { - if (httpStatus.getCode().equals(code)) { - return httpStatus; - } - } - throw new IllegalArgumentException(String.format("Cannot find HTTP status by code: %d!", code)); - } - - /** - * Return the HTTP status series of this status code. - * - * @return the series - * @see HttpStatus.Series - */ - public Series series() { - return Series.valueOf(this); - } - - /** - * Whether this status code is in the HTTP series {@link org.springframework.http.HttpStatus.Series#INFORMATIONAL}. - * This is a shortcut for checking the value of {@link #series()}. - * - * @return the boolean - * @see #series() #series() - */ - public boolean is1xxInformational() { - return (series() == Series.INFORMATIONAL); - } - - /** - * Whether this status code is in the HTTP series {@link org.springframework.http.HttpStatus.Series#SUCCESSFUL}. - * This is a shortcut for checking the value of {@link #series()}. - * - * @return the boolean - * @see #series() #series() - */ - public boolean is2xxSuccessful() { - return (series() == Series.SUCCESSFUL); - } - - /** - * Whether this status code is in the HTTP series {@link org.springframework.http.HttpStatus.Series#REDIRECTION}. - * This is a shortcut for checking the value of {@link #series()}. - * - * @return the boolean - * @see #series() #series() - */ - public boolean is3xxRedirection() { - return (series() == Series.REDIRECTION); - } - - /** - * Whether this status code is in the HTTP series {@link org.springframework.http.HttpStatus.Series#CLIENT_ERROR}. - * This is a shortcut for checking the value of {@link #series()}. - * - * @return the boolean - * @see #series() #series() - */ - public boolean is4xxClientError() { - return (series() == Series.CLIENT_ERROR); - } - - /** - * Whether this status code is in the HTTP series {@link org.springframework.http.HttpStatus.Series#SERVER_ERROR}. - * This is a shortcut for checking the value of {@link #series()}. - * - * @return the boolean - * @see #series() #series() - */ - public boolean is5xxServerError() { - return (series() == Series.SERVER_ERROR); - } - - /** - * Whether this status code is in the HTTP series {@link org.springframework.http.HttpStatus.Series#CLIENT_ERROR} or - * {@link org.springframework.http.HttpStatus.Series#SERVER_ERROR}. This is a shortcut for checking the value of - * {@link #series()}. - * - * @return the boolean - * @see #is4xxClientError() #is4xxClientError() - * @see #is5xxServerError() #is5xxServerError() - * @since 5.0 - */ - public boolean isError() { - return (is4xxClientError() || is5xxServerError()); - } - - /** - * Enumeration of HTTP status series. - *

Retrievable via {@link org.springframework.http.HttpStatus#series()}. - */ - public enum Series { - /** - * Informational - */ - INFORMATIONAL(1), - /** - * Successful - */ - SUCCESSFUL(2), - /** - * Redirection - */ - REDIRECTION(3), - /** - * Client error - */ - CLIENT_ERROR(4), - /** - * Server error - */ - SERVER_ERROR(5); - - /** - * The Value. - */ - private final int value; - - /** - * Instantiates a new Series. - * - * @param value the value - */ - Series(int value) { - this.value = value; - } - - /** - * Return the integer value of this status series. Ranges from 1 to 5. - * - * @return the int - */ - public int value() { - return this.value; - } - - /** - * Return the enum constant of this type with the corresponding series. - * - * @param status a standard HTTP status enum value - * @return the enum constant of this type with the corresponding series - * @throws IllegalArgumentException if this enum has no corresponding constant - */ - public static Series valueOf(HttpStatus status) { - return valueOf(status.code); - } - - /** - * Return the enum constant of this type with the corresponding series. - * - * @param statusCode the HTTP status code (potentially non-standard) - * @return the enum constant of this type with the corresponding series - * @throws IllegalArgumentException if this enum has no corresponding constant - */ - public static Series valueOf(int statusCode) { - Series series = resolve(statusCode); - if (series == null) { - throw new IllegalArgumentException("No matching constant for [" + statusCode + "]"); - } - return series; - } - - /** - * Resolve the given status code to an {@code HttpStatus.Series}, if possible. - * - * @param statusCode the HTTP status code (potentially non-standard) - * @return the corresponding {@code Series}, or {@code null} if not found - * @since 5.1.3 - */ - @Nullable - public static Series resolve(int statusCode) { - int seriesCode = statusCode / 100; - for (Series series : values()) { - if (series.value == seriesCode) { - return series; - } - } - return null; - } - } -} diff --git a/common/src/main/java/com/jmsoftware/maf/common/constant/IUniversalStatus.java b/common/src/main/java/com/jmsoftware/maf/common/constant/IUniversalStatus.java deleted file mode 100644 index b08b6443..00000000 --- a/common/src/main/java/com/jmsoftware/maf/common/constant/IUniversalStatus.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.jmsoftware.maf.common.constant; - -/** - *

IUniversalStatus

- * The interface of Universal Status code - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2019-03-23 16:48 - * @see HTTP Status Code Registry - * @see List of HTTP status codes - **/ -public interface IUniversalStatus { - /** - * Get status code. - * - * @return Status code - */ - Integer getCode(); - - /** - * Get message of status. - * - * @return message of status - */ - String getMessage(); -} diff --git a/common/src/main/java/com/jmsoftware/maf/common/constant/MafHttpHeader.java b/common/src/main/java/com/jmsoftware/maf/common/constant/MafHttpHeader.java new file mode 100644 index 00000000..d4451928 --- /dev/null +++ b/common/src/main/java/com/jmsoftware/maf/common/constant/MafHttpHeader.java @@ -0,0 +1,22 @@ +package com.jmsoftware.maf.common.constant; + +import lombok.Getter; + +/** + * Description: MafHttpHeader, change description here. + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 6/28/2021 1:20 PM + **/ +@Getter +public enum MafHttpHeader { + /** + * X-Username + */ + X_USERNAME("X-Username"); + + private final String header; + + MafHttpHeader(String header) { + this.header = header; + } +} diff --git a/common/src/main/java/com/jmsoftware/maf/common/constant/UniversalDateTime.java b/common/src/main/java/com/jmsoftware/maf/common/constant/UniversalDateTime.java new file mode 100644 index 00000000..87b49661 --- /dev/null +++ b/common/src/main/java/com/jmsoftware/maf/common/constant/UniversalDateTime.java @@ -0,0 +1,12 @@ +package com.jmsoftware.maf.common.constant; + +/** + * Description: UniversalDateTime, change description here. + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 6/27/2021 9:42 PM + **/ +public interface UniversalDateTime { + String DATE_FORMAT = "yyyy-MM-dd"; + String TIME_FORMAT = "HH:mm:ss"; + String DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss"; +} diff --git a/common/src/main/java/com/jmsoftware/maf/common/domain/DeletedField.java b/common/src/main/java/com/jmsoftware/maf/common/domain/DeletedField.java new file mode 100644 index 00000000..013aec65 --- /dev/null +++ b/common/src/main/java/com/jmsoftware/maf/common/domain/DeletedField.java @@ -0,0 +1,42 @@ +package com.jmsoftware.maf.common.domain; + +import lombok.Getter; +import lombok.extern.slf4j.Slf4j; + +/** + * Description: DeletedField, change description here. + * + * @author 钟俊 (zhongjun), email: zhongjun@toguide.cn, date: 1/13/2021 6:32 PM + */ +@Slf4j +@Getter +public enum DeletedField { + /** + * Not deleted + */ + NOT_DELETED((byte) 0, "not deleted"), + /** + * Deleted + */ + DELETED((byte) 1, "deleted"); + + /** + * The Value. + */ + private final Byte value; + /** + * The Description. + */ + private final String description; + + /** + * Instantiates a new Delete flag. + * + * @param value the value + * @param description the description + */ + DeletedField(Byte value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/common/src/main/java/com/jmsoftware/maf/common/domain/ValidationTestPayload.java b/common/src/main/java/com/jmsoftware/maf/common/domain/ValidationTestPayload.java index 9e1f8035..741d099d 100644 --- a/common/src/main/java/com/jmsoftware/maf/common/domain/ValidationTestPayload.java +++ b/common/src/main/java/com/jmsoftware/maf/common/domain/ValidationTestPayload.java @@ -3,7 +3,7 @@ import lombok.Data; import javax.validation.constraints.Min; -import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; /** @@ -11,7 +11,7 @@ *

* Change description here. * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com * @date 2/14/20 11:34 AM **/ @Data @@ -19,6 +19,6 @@ public class ValidationTestPayload { @NotNull @Min(value = 1L) private Long id; - @NotEmpty + @NotBlank private String name; } diff --git a/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/permission/GetPermissionListByRoleIdListPayload.java b/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/permission/GetPermissionListByRoleIdListPayload.java index cb8ab016..82974478 100644 --- a/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/permission/GetPermissionListByRoleIdListPayload.java +++ b/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/permission/GetPermissionListByRoleIdListPayload.java @@ -3,7 +3,6 @@ import lombok.Data; import javax.validation.constraints.NotEmpty; -import java.util.LinkedList; import java.util.List; /** @@ -11,7 +10,7 @@ *

* Change description here. * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com * @date 5/11/20 8:38 AM **/ @Data @@ -20,5 +19,7 @@ public class GetPermissionListByRoleIdListPayload { * The Role id list. */ @NotEmpty - private final List roleIdList = new LinkedList<>(); + private List roleIdList; + @NotEmpty + private List permissionTypeList; } diff --git a/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/permission/GetPermissionListByRoleIdListResponse.java b/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/permission/GetPermissionListByRoleIdListResponse.java index 1da0632c..6f6fd3df 100644 --- a/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/permission/GetPermissionListByRoleIdListResponse.java +++ b/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/permission/GetPermissionListByRoleIdListResponse.java @@ -10,7 +10,7 @@ *

* Change description here. * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com * @date 5 /11/20 8:38 AM */ @Data @@ -29,7 +29,7 @@ public static class Permission { /** * The Type. */ - private Integer type; + private Byte type; /** * The Permission expression. */ diff --git a/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/permission/GetPermissionListByUserIdPayload.java b/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/permission/GetPermissionListByUserIdPayload.java deleted file mode 100644 index c7ed41f7..00000000 --- a/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/permission/GetPermissionListByUserIdPayload.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.jmsoftware.maf.common.domain.authcenter.permission; - -import lombok.Data; - -import javax.validation.constraints.NotNull; - -/** - *

GetPermissionListByUserIdPayload

- *

- * Change description here. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 5/12/20 9:03 AM - **/ -@Data -public class GetPermissionListByUserIdPayload { - /** - * The User id. - */ - @NotNull - private Long userId; -} diff --git a/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/permission/GetPermissionListByUserIdResponse.java b/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/permission/GetPermissionListByUserIdResponse.java deleted file mode 100644 index 6b23c7e8..00000000 --- a/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/permission/GetPermissionListByUserIdResponse.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.jmsoftware.maf.common.domain.authcenter.permission; - -import lombok.Data; - -import java.util.LinkedList; -import java.util.List; - -/** - *

GetPermissionListByUserIdResponse

- *

- * Change description here. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 5/12/20 9:04 AM - **/ -@Data -public class GetPermissionListByUserIdResponse { - /** - * The Permission list. - */ - private final List permissionList = new LinkedList<>(); - - @Data - public static class Permission { - /** - * The Url. - */ - private String url; - /** - * The Type. - */ - private Integer type; - /** - * The Permission expression. - */ - private String permissionExpression; - /** - * The Method. - */ - private String method; - } -} diff --git a/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/permission/PermissionType.java b/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/permission/PermissionType.java index 18c996b2..77433a70 100644 --- a/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/permission/PermissionType.java +++ b/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/permission/PermissionType.java @@ -7,7 +7,7 @@ *

PermissionType

*

Change description here

* - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com * @date 2019-05-25 10:24 **/ @Slf4j @@ -16,25 +16,25 @@ public enum PermissionType { /** * Controller */ - CONTROLLER(0, "Controller"), + CONTROLLER((byte) 0, "Controller"), /** * Page */ - PAGE(1, "Page"), + PAGE((byte) 1, "Page"), /** * Button */ - BUTTON(2, "Button (API)"); + BUTTON((byte) 2, "Button (API)"); - private final Integer type; + private final Byte type; private final String description; - PermissionType(Integer type, String description) { + PermissionType(Byte type, String description) { this.type = type; this.description = description; } - public static PermissionType getByType(Integer type) { + public static PermissionType getByType(Byte type) { PermissionType permissionType = null; PermissionType[] values = PermissionType.values(); for (PermissionType pt : values) { diff --git a/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/role/GetRoleListByUserIdPayload.java b/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/role/GetRoleListByUserIdPayload.java deleted file mode 100644 index eec4dab8..00000000 --- a/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/role/GetRoleListByUserIdPayload.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.jmsoftware.maf.common.domain.authcenter.role; - -import lombok.Data; - -import javax.validation.constraints.NotNull; - -/** - *

GetRoleListByUserIdPayload

- *

- * Change description here. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 5/10/20 10:52 PM - **/ -@Data -public class GetRoleListByUserIdPayload { - @NotNull - private Long userId; -} diff --git a/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/role/GetRoleListByUserIdResponse.java b/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/role/GetRoleListByUserIdResponse.java index 285580ee..eaa9b126 100644 --- a/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/role/GetRoleListByUserIdResponse.java +++ b/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/role/GetRoleListByUserIdResponse.java @@ -2,6 +2,7 @@ import lombok.Data; +import java.io.Serializable; import java.util.LinkedList; import java.util.List; @@ -10,16 +11,11 @@ *

* Change description here. * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com * @date 5/10/20 10:55 PM **/ @Data -public class GetRoleListByUserIdResponse { - private final List roleList = new LinkedList<>(); - - @Data - public static class Role { - private Long id; - private String name; - } +public class GetRoleListByUserIdResponse implements Serializable { + private static final long serialVersionUID = -8462678958191383914L; + private List roleList; } diff --git a/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/role/GetRoleListByUserIdSingleResponse.java b/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/role/GetRoleListByUserIdSingleResponse.java new file mode 100644 index 00000000..0d5202aa --- /dev/null +++ b/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/role/GetRoleListByUserIdSingleResponse.java @@ -0,0 +1,17 @@ +package com.jmsoftware.maf.common.domain.authcenter.role; + +import lombok.Data; + +import java.io.Serializable; + +/** + * Description: GetRoleListByUserIdSingleResponse, change description here. + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 6/29/2021 10:17 AM + **/ +@Data +public class GetRoleListByUserIdSingleResponse implements Serializable { + private static final long serialVersionUID = 3758434255123050684L; + private Long id; + private String name; +} diff --git a/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/security/ParseJwtResponse.java b/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/security/ParseJwtResponse.java new file mode 100644 index 00000000..42df767f --- /dev/null +++ b/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/security/ParseJwtResponse.java @@ -0,0 +1,15 @@ +package com.jmsoftware.maf.common.domain.authcenter.security; + +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * Description: ParseJwtResponse, change description here. + * + * @author 钟俊(zhongjun), email: zhongjun@toguide.cn, date: 12/29/2020 11:09 AM + **/ +@Data +@Accessors(chain = true) +public class ParseJwtResponse { + private String username; +} diff --git a/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/domain/UserPrincipal.java b/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/security/UserPrincipal.java similarity index 74% rename from api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/domain/UserPrincipal.java rename to common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/security/UserPrincipal.java index 99afffa8..48db9960 100644 --- a/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/domain/UserPrincipal.java +++ b/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/security/UserPrincipal.java @@ -1,4 +1,4 @@ -package com.jmsoftware.maf.apiportal.universal.domain; +package com.jmsoftware.maf.common.domain.authcenter.security; import cn.hutool.core.util.StrUtil; import com.fasterxml.jackson.annotation.JsonIgnore; @@ -13,17 +13,16 @@ import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.userdetails.UserDetails; -import java.util.Collection; -import java.util.Date; -import java.util.List; -import java.util.Objects; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.*; import java.util.stream.Collectors; /** *

UserPrincipal

*

Custom user details.

* - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com * @date 2019-03-23 20:52 **/ @Data @@ -60,7 +59,7 @@ public class UserPrincipal implements UserDetails { /** * Birthday */ - private Date birthday; + private LocalDate birthday; /** * Gender */ @@ -68,15 +67,15 @@ public class UserPrincipal implements UserDetails { /** * Status */ - private Integer status; + private Byte status; /** * Create time */ - private Date gmtCreated; + private LocalDateTime gmtCreated; /** * Modify time */ - private Date gmtModified; + private LocalDateTime gmtModified; /** * Roles that user has */ @@ -86,6 +85,19 @@ public class UserPrincipal implements UserDetails { */ private Collection authorities; + /** + * Create by username user principal. + * + * @param username the username + * @return the user principal + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 12/24/2020 3:12 PM + */ + public static UserPrincipal createByUsername(String username) { + UserPrincipal userPrincipal = new UserPrincipal(); + userPrincipal.setUsername(username); + return userPrincipal; + } + /** * Create user principal * @@ -96,11 +108,12 @@ public class UserPrincipal implements UserDetails { */ public static UserPrincipal create(GetUserByLoginTokenResponse user, List roleNameList, List permissionList) { - val authorities = - permissionList.stream() - .filter(permission -> StrUtil.isNotBlank(permission.getPermissionExpression())) - .map(permission -> new SimpleGrantedAuthority(permission.getPermissionExpression())) - .collect(Collectors.toList()); + val permissions = + Optional.ofNullable(permissionList).orElse(new LinkedList<>()); + val authorities = permissions.stream() + .filter(permission -> StrUtil.isNotBlank(permission.getPermissionExpression())) + .map(permission -> new SimpleGrantedAuthority(permission.getPermissionExpression())) + .collect(Collectors.toList()); return new UserPrincipal(user.getId(), user.getUsername(), @@ -149,6 +162,6 @@ public boolean isCredentialsNonExpired() { @Override public boolean isEnabled() { - return Objects.equals(this.status, UserStatus.ENABLED.getStatus()); + return Objects.equals(this.status, UserStatus.ENABLED.getValue()); } } diff --git a/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/user/GetUserByLoginTokenPayload.java b/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/user/GetUserByLoginTokenPayload.java deleted file mode 100644 index 5a2c93c2..00000000 --- a/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/user/GetUserByLoginTokenPayload.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.jmsoftware.maf.common.domain.authcenter.user; - -import lombok.Data; -import org.hibernate.validator.constraints.Length; - -import javax.validation.constraints.NotEmpty; - -/** - *

GetUserByLoginTokenPayload

- *

- * Change description here. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 5/10/20 12:41 PM - **/ -@Data -public class GetUserByLoginTokenPayload { - /** - * The Login token: username / email - */ - @NotEmpty - @Length(max = 100) - private String loginToken; -} diff --git a/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/user/GetUserByLoginTokenResponse.java b/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/user/GetUserByLoginTokenResponse.java index d9da869a..e02f9d71 100644 --- a/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/user/GetUserByLoginTokenResponse.java +++ b/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/user/GetUserByLoginTokenResponse.java @@ -2,18 +2,19 @@ import lombok.Data; -import java.util.Date; +import java.time.LocalDate; +import java.time.LocalDateTime; /** *

GetUserByLoginTokenResponse

*

* Change description here. * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com * @date 5/10/20 12:45 PM **/ @Data -public class GetUserByLoginTokenResponse { +public class GetUserByLoginTokenResponse { /** * Primary key */ @@ -41,7 +42,7 @@ public class GetUserByLoginTokenResponse { /** * Birthday (yyyy-MM-dd) */ - private Date birthday; + private LocalDate birthday; /** * 58 gender options */ @@ -53,13 +54,13 @@ public class GetUserByLoginTokenResponse { /** * Status. 1 - enabled, 2 - disabled */ - private Integer status; + private Byte status; /** * Create time */ - private Date createdTime; + private LocalDateTime createdTime; /** * Modify time */ - private Date modifiedTime; + private LocalDateTime modifiedTime; } diff --git a/api-portal/src/main/java/com/jmsoftware/maf/apiportal/auth/entity/LoginPayload.java b/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/user/LoginPayload.java similarity index 61% rename from api-portal/src/main/java/com/jmsoftware/maf/apiportal/auth/entity/LoginPayload.java rename to common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/user/LoginPayload.java index 5f9d0b77..ac353a6d 100644 --- a/api-portal/src/main/java/com/jmsoftware/maf/apiportal/auth/entity/LoginPayload.java +++ b/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/user/LoginPayload.java @@ -1,31 +1,28 @@ -package com.jmsoftware.maf.apiportal.auth.entity; +package com.jmsoftware.maf.common.domain.authcenter.user; import lombok.Data; import org.hibernate.validator.constraints.Length; -import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; /** - *

LoginPayload

- *

- * Change description here. + * Description: LoginPayload, change description here. * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 5/8/20 2:08 PM + * @author 钟俊(zhongjun), email: zhongjun@toguide.cn, date: 12/22/2020 6:26 PM **/ @Data public class LoginPayload { /** * The Login token: username / email */ - @NotEmpty + @NotBlank @Length(max = 100) private String loginToken; /** * The Password. */ - @NotEmpty + @NotBlank @Length(max = 60) private String password; /** diff --git a/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/user/LoginResponse.java b/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/user/LoginResponse.java new file mode 100644 index 00000000..6e4b874a --- /dev/null +++ b/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/user/LoginResponse.java @@ -0,0 +1,14 @@ +package com.jmsoftware.maf.common.domain.authcenter.user; + +import lombok.Data; + +/** + * Description: LoginResponse, change description here. + * + * @author 钟俊(zhongjun), email: zhongjun@toguide.cn, date: 12/22/2020 6:27 PM + **/ +@Data +public class LoginResponse { + private String greeting; + private String jwt; +} diff --git a/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/user/LogoutPayload.java b/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/user/LogoutPayload.java new file mode 100644 index 00000000..9738ed0d --- /dev/null +++ b/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/user/LogoutPayload.java @@ -0,0 +1,13 @@ +package com.jmsoftware.maf.common.domain.authcenter.user; + +import lombok.Data; + +/** + * Description: LogoutPayload, change description here. + * + * @author 钟俊(zhongjun), email: zhongjun@toguide.cn, date: 12/29/2020 3:33 PM + **/ +@Data +public class LogoutPayload { + private String jwt; +} diff --git a/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/user/SaveUserForRegisteringPayload.java b/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/user/SignupPayload.java similarity index 63% rename from common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/user/SaveUserForRegisteringPayload.java rename to common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/user/SignupPayload.java index 0e221e2f..babf5df8 100644 --- a/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/user/SaveUserForRegisteringPayload.java +++ b/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/user/SignupPayload.java @@ -3,34 +3,34 @@ import lombok.Data; import org.hibernate.validator.constraints.Length; -import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotBlank; /** - *

SaveUserForRegisteringPayload

+ *

SignupPayload

*

* Change description here. * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com * @date 5/11/20 5:34 AM **/ @Data -public class SaveUserForRegisteringPayload { +public class SignupPayload { /** * The Username. */ - @NotEmpty + @NotBlank @Length(min = 4, max = 50) private String username; /** * The Email. */ - @NotEmpty + @NotBlank @Length(max = 100) private String email; /** * The Encoded password. */ - @NotEmpty + @NotBlank @Length(min = 8, max = 60) - private String encodedPassword; + private String password; } diff --git a/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/user/SaveUserForRegisteringResponse.java b/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/user/SignupResponse.java similarity index 59% rename from common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/user/SaveUserForRegisteringResponse.java rename to common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/user/SignupResponse.java index 48d46ca6..2441acf7 100644 --- a/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/user/SaveUserForRegisteringResponse.java +++ b/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/user/SignupResponse.java @@ -3,15 +3,15 @@ import lombok.Data; /** - *

SaveUserForRegisteringResponse

+ *

SignupResponse

*

* Change description here. * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com * @date 5/11/20 5:37 AM **/ @Data -public class SaveUserForRegisteringResponse { +public class SignupResponse { /** * The User id. */ diff --git a/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/user/UserStatus.java b/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/user/UserStatus.java index 20f2dab7..6a802679 100644 --- a/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/user/UserStatus.java +++ b/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/user/UserStatus.java @@ -1,43 +1,44 @@ package com.jmsoftware.maf.common.domain.authcenter.user; +import com.jmsoftware.maf.common.bean.EnumerationBase; import lombok.Getter; /** * Description: UserStatus, change description here. * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com * @date 2019-03-23 18:48 **/ @Getter -public enum UserStatus { +public enum UserStatus implements EnumerationBase { /** * Enabled user */ - ENABLED(1, "Enabled user"), + ENABLED((byte) 1, "Enabled user"), /** * Disabled user */ - DISABLED(0, "Disabled user"); + DISABLED((byte) 0, "Disabled user"); - private final Integer status; + private final Byte value; private final String description; - UserStatus(Integer status, String description) { - this.status = status; + UserStatus(Byte value, String description) { + this.value = value; this.description = description; } /** - * Get user status enum by status value + * Get user value enum by value value * - * @param status status value - * @return user status enum + * @param value value value + * @return user value enum */ - public static UserStatus getByStatus(Integer status) { + public static UserStatus ofValue(Byte value) { UserStatus result = UserStatus.DISABLED; UserStatus[] userStatuses = UserStatus.values(); for (UserStatus userStatus : userStatuses) { - if (userStatus.status.equals(status)) { + if (userStatus.value.equals(value)) { result = userStatus; } } diff --git a/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/user/UserStatus2.java b/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/user/UserStatus2.java new file mode 100644 index 00000000..e7ad7307 --- /dev/null +++ b/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/user/UserStatus2.java @@ -0,0 +1,47 @@ +package com.jmsoftware.maf.common.domain.authcenter.user; + +import com.jmsoftware.maf.common.bean.EnumerationBase; +import lombok.Getter; + +/** + * Description: UserStatus, change description here. + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com + * @date 2019-03-23 18:48 + **/ +@Getter +public enum UserStatus2 implements EnumerationBase { + /** + * Enabled user + */ + ENABLED((byte) 1, "Enabled user"), + /** + * Disabled user + */ + DISABLED((byte) 0, "Disabled user"); + + private final Byte value; + private final String description; + + UserStatus2(Byte value, String description) { + this.value = value; + this.description = description; + } + + /** + * Get user value enum by value value + * + * @param value value value + * @return user value enum + */ + public static UserStatus2 ofValue(Byte value) { + UserStatus2 result = UserStatus2.DISABLED; + UserStatus2[] userStatuses = UserStatus2.values(); + for (UserStatus2 userStatus : userStatuses) { + if (userStatus.value.equals(value)) { + result = userStatus; + } + } + return result; + } +} diff --git a/common/src/main/java/com/jmsoftware/maf/common/domain/package-info.java b/common/src/main/java/com/jmsoftware/maf/common/domain/package-info.java deleted file mode 100644 index 3de9a9a4..00000000 --- a/common/src/main/java/com/jmsoftware/maf/common/domain/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package com.jmsoftware.maf.common.domain; diff --git a/common/src/main/java/com/jmsoftware/maf/common/domain/springbootstarter/HttpApiResourcesResponse.java b/common/src/main/java/com/jmsoftware/maf/common/domain/springbootstarter/HttpApiResourcesResponse.java new file mode 100644 index 00000000..e104b0a8 --- /dev/null +++ b/common/src/main/java/com/jmsoftware/maf/common/domain/springbootstarter/HttpApiResourcesResponse.java @@ -0,0 +1,23 @@ +package com.jmsoftware.maf.common.domain.springbootstarter; + +import com.google.common.collect.Lists; +import lombok.Data; +import org.springframework.web.bind.annotation.RequestMethod; + +import java.util.List; + +/** + * Description: HttpApiResourcesResponse, change description here. + * + * @author 钟俊(zhongjun), email: zhongjun@toguide.cn, date: 12/25/2020 4:58 PM + **/ +@Data +public class HttpApiResourcesResponse { + private List list = Lists.newLinkedList(); + + @Data + public static class HttpApiResource { + private RequestMethod method; + private String urlPattern; + } +} diff --git a/common/src/main/java/com/jmsoftware/maf/common/exception/BaseException.java b/common/src/main/java/com/jmsoftware/maf/common/exception/BaseException.java index 0a1db75c..69757969 100644 --- a/common/src/main/java/com/jmsoftware/maf/common/exception/BaseException.java +++ b/common/src/main/java/com/jmsoftware/maf/common/exception/BaseException.java @@ -1,19 +1,20 @@ package com.jmsoftware.maf.common.exception; -import com.jmsoftware.maf.common.constant.HttpStatus; -import com.jmsoftware.maf.common.constant.IUniversalStatus; import lombok.Data; import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import org.springframework.http.HttpStatus; /** *

BaseException

*

* Base exception. * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com * @date 2019-03-23 16:23 **/ @Data +@NoArgsConstructor @EqualsAndHashCode(callSuper = true) public class BaseException extends Exception { private static final long serialVersionUID = 5049763892480652887L; @@ -21,7 +22,7 @@ public class BaseException extends Exception { /** * Code is REQUIRED. Default code is 464. */ - private Integer code = HttpStatus.FAILURE.getCode(); + private Integer code = HttpStatus.INTERNAL_SERVER_ERROR.value(); /** * Message is REQUIRED. Default message is: Error. A generic status for an error in the server itself. */ @@ -29,8 +30,8 @@ public class BaseException extends Exception { private Object data; public BaseException(HttpStatus httpStatus) { - this.code = httpStatus.getCode(); - this.message = httpStatus.getMessage(); + this.code = httpStatus.value(); + this.message = httpStatus.getReasonPhrase(); } public BaseException(Object data, HttpStatus httpStatus) { @@ -38,12 +39,7 @@ public BaseException(Object data, HttpStatus httpStatus) { this.data = data; } - public BaseException(IUniversalStatus status) { - this.code = status.getCode(); - this.message = status.getMessage(); - } - - public BaseException(IUniversalStatus status, Object data) { + public BaseException(HttpStatus status, Object data) { this(status); this.data = data; } diff --git a/common/src/main/java/com/jmsoftware/maf/common/exception/BusinessException.java b/common/src/main/java/com/jmsoftware/maf/common/exception/BusinessException.java index d1261a96..82b8bf81 100644 --- a/common/src/main/java/com/jmsoftware/maf/common/exception/BusinessException.java +++ b/common/src/main/java/com/jmsoftware/maf/common/exception/BusinessException.java @@ -1,14 +1,13 @@ package com.jmsoftware.maf.common.exception; -import com.jmsoftware.maf.common.constant.HttpStatus; -import com.jmsoftware.maf.common.constant.IUniversalStatus; +import org.springframework.http.HttpStatus; /** *

BusinessException

*

* Business Exception * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com * @date 2019-03-02 17:15 **/ public class BusinessException extends BaseException { @@ -26,14 +25,6 @@ public BusinessException(HttpStatus httpStatus, String message) { super(httpStatus, message); } - public BusinessException(IUniversalStatus status) { - super(status); - } - - public BusinessException(IUniversalStatus status, Object data) { - super(status, data); - } - public BusinessException(String message) { super(message); } diff --git a/common/src/main/java/com/jmsoftware/maf/common/exception/SecurityException.java b/common/src/main/java/com/jmsoftware/maf/common/exception/SecurityException.java index 6327d8eb..8f38c79a 100644 --- a/common/src/main/java/com/jmsoftware/maf/common/exception/SecurityException.java +++ b/common/src/main/java/com/jmsoftware/maf/common/exception/SecurityException.java @@ -1,15 +1,15 @@ package com.jmsoftware.maf.common.exception; -import com.jmsoftware.maf.common.constant.HttpStatus; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.http.HttpStatus; /** *

SecurityException

*

* Change description here. * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com * @date 3/12/20 3:15 PM **/ @Data @@ -21,7 +21,11 @@ public SecurityException(HttpStatus httpStatus) { super(httpStatus); } + public SecurityException(HttpStatus httpStatus, String message) { + super(httpStatus, message); + } + public SecurityException(HttpStatus httpStatus, String message, Object data) { - super(httpStatus.getCode(), message, data); + super(httpStatus.value(), message, data); } } diff --git a/common/src/main/java/com/jmsoftware/maf/common/websocket/WebSocketMessagePayload.java b/common/src/main/java/com/jmsoftware/maf/common/websocket/WebSocketMessagePayload.java new file mode 100644 index 00000000..63c5f67f --- /dev/null +++ b/common/src/main/java/com/jmsoftware/maf/common/websocket/WebSocketMessagePayload.java @@ -0,0 +1,15 @@ +package com.jmsoftware.maf.common.websocket; + +import lombok.Data; + +/** + * Description: WebSocketMessagePayload, change description here. + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 7/15/2021 5:35 PM + **/ +@Data +public class WebSocketMessagePayload { + private String sender; + private String receiver; + private Object content; +} diff --git a/common/src/main/java/com/jmsoftware/maf/common/websocket/WebSocketMessageResponse.java b/common/src/main/java/com/jmsoftware/maf/common/websocket/WebSocketMessageResponse.java new file mode 100644 index 00000000..ea6d3845 --- /dev/null +++ b/common/src/main/java/com/jmsoftware/maf/common/websocket/WebSocketMessageResponse.java @@ -0,0 +1,18 @@ +package com.jmsoftware.maf.common.websocket; + +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * Description: WebSocketMessagePayload, change description here. + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 7/15/2021 5:35 PM + **/ +@Data +public class WebSocketMessageResponse { + private final LocalDateTime timestamp = LocalDateTime.now(); + private String sender; + private String receiver; + private Object content; +} diff --git a/common/src/test/java/.empty b/common/src/test/java/.empty deleted file mode 100644 index e69de29b..00000000 diff --git a/docker/.env b/docker/.env index 315ed6b4..b255c224 100644 --- a/docker/.env +++ b/docker/.env @@ -1,2 +1,75 @@ -# TAG must be corresponding with the version tag in pom.xml, need to modify it when new version releases -TAG=0.0.1 +################################################## +# MAF_TAG is the version number of the project # +################################################## +MAF_TAG=0.0.2 + +################################################## +# Container version # +################################################## +MYSQL_SERVER_TAG=8.0.23-1.1.19 +REDIS_TAG=6.0.10-alpine3.13 +ATMOZ_SFTP_TAG=alpine +MINIO_TAG=RELEASE.2021-06-17T00-10-46Z +RABBITMQ_TAG=3.8.14-management-alpine +ZIPKIN_MYSQL_TAG=2.22.2 +ZIPKIN_DEPENDENCIES_TAG=2.6.3 +ZIPKIN_TAG=2.23.2 +CONSUL_TAG=1.9.3 +ELASTICSEARCH_TAG=7.13.2 +LOGSTASH_TAG=7.13.2 +KIBANA_TAG=7.13.2 + +################################################## +# SPRING_ENVIRONMENT available values: # +# 1. development-docker # +# 2. test # +# 3. stage # +# 4. production # +################################################## +SPRING_ENVIRONMENT=development-docker + +################################################## +# Docker container names # +# (also docker container hostnames) # +################################################## +############# Infrastructure Services ############ +MYSQL_SERVER_MASTER_CONTAINER_NAME=maf-mysql-server-master +MYSQL_SERVER_SLAVE_CONTAINER_NAME=maf-mysql-server-slave +REDIS_CONTAINER_NAME=maf-redis +ATMOZ_SFTP_CONTAINER_NAME=maf-atmoz-sftp +MINIO_CONTAINER_NAME=maf-minio +RABBITMQ_CONTAINER_NAME=maf-rabbitmq +ZIPKIN_MYSQL_CONTAINER_NAME=maf-zipkin-mysql +ZIPKIN_DEPENDENCIES_CONTAINER_NAME=maf-zipkin-dependencies +ZIPKIN_CONTAINER_NAME=maf-zipkin +CONSUL_REGISTRY_CONTAINER_NAME=maf-consul-registry +ELASTICSEARCH_CONTAINER_NAME=maf-elasticsearch +LOGSTASH_CONTAINER_NAME=maf-logstash +KIBANA_CONTAINER_NAME=maf-kibana +SPRING_BOOT_ADMIN_CONTAINER_NAME=maf-spring-boot-admin +OSS_CENTER_CONTAINER_NAME=maf-oss-center +############### Business Services ################ +API_GATEWAY_CONTAINER_NAME=maf-api-gateway +AUTH_CENTER_CONTAINER_NAME=maf-auth-center +MAF_MIS_CONTAINER_NAME=maf-maf-mis +MUSCLE_MIS_CONTAINER_NAME=maf-muscle-mis + +################################################## +# JIB contain's Java tool options # +################################################## +JAVA_TOOL_OPTIONS="-Xms128m -Xmx128m -Dspring.profiles.active=${SPRING_ENVIRONMENT} -Dspring.cloud.consul.host=${CONSUL_REGISTRY_CONTAINER_NAME}" + +################################################## +# Accounts, Passwords & Common Constants # +################################################## +MAF_MYSQL_ROOT_PASSWORD=jm@mysql +MAF_MYSQL_DATABASE=muscle_and_fitness +MAF_MYSQL_USER_RW=maf_mysql_rw +MAF_MYSQL_USER_R=maf_mysql_r +MAF_MYSQL_PASSWORD=maf@mysql +MAF_ELASTICSEARCH_PASSWORD=maf@elasticsearch +MAF_TIMEZONE=Asia/Hong_Kong +MAF_RABBITMQ_USER=maf_rabbitmq_su +MAF_RABBITMQ_PASSWORD=maf@rabbitmq +MAF_MINIO_ROOT_USER=maf_minio_root_user +MAF_MINIO_ROOT_PASSWORD=jm@minio diff --git a/docker/config/api-gateway/application.yml b/docker/config/api-gateway/application.yml new file mode 100644 index 00000000..05a1bf30 --- /dev/null +++ b/docker/config/api-gateway/application.yml @@ -0,0 +1,13 @@ +greeting: "Hello, World! From Consul config center!" + +maf: + configuration: + swagger: + ignored-service-ids: + - "consul" + - "api-gateway" + - "spring-boot-admin" + redis-rate-limiter: + replenish-rate: 10 + burst-capacity: 1 + requested-tokens: 1 diff --git a/docker/config/auth-center/application.yml b/docker/config/auth-center/application.yml new file mode 100644 index 00000000..3b358f0d --- /dev/null +++ b/docker/config/auth-center/application.yml @@ -0,0 +1,12 @@ +greeting: "Hello, World! From Consul config center!" + +maf: + configuration: + permission: + ignored-service-ids: + - "consul" + - "api-gateway" + - "spring-boot-admin" + - "auth-center" + excel: + maximum-row-count: 3000 diff --git a/docker/config/kibana/kibana.yml b/docker/config/kibana/kibana.yml new file mode 100644 index 00000000..1bee6aca --- /dev/null +++ b/docker/config/kibana/kibana.yml @@ -0,0 +1,12 @@ +## Default Kibana configuration from Kibana base image. +## https://github.com/elastic/kibana/blob/master/src/dev/build/tasks/os_packages/docker_generator/templates/kibana_yml.template.ts +# +server.name: kibana +server.host: 0.0.0.0 +elasticsearch.hosts: [ "http://maf-elasticsearch:9200" ] +monitoring.ui.container.elasticsearch.enabled: true + +## X-Pack security credentials +# +elasticsearch.username: elastic +elasticsearch.password: maf@elasticsearch diff --git a/docker/config/local-consul/config.json b/docker/config/local-consul/config.json new file mode 100644 index 00000000..fc5c221a --- /dev/null +++ b/docker/config/local-consul/config.json @@ -0,0 +1,16 @@ +{ + "data_dir": "./opt/consul", + "log_level": "INFO", + "node_name": "local-consul", + "server": true, + "ports": { + "http": 8500, + "server": 8300 + }, + "bind_addr": "0.0.0.0", + "client_addr": "127.0.0.1", + "bootstrap_expect": 1, + "ui_config": { + "enabled": true + } +} diff --git a/docker/config/local-consul/startup.cmd b/docker/config/local-consul/startup.cmd new file mode 100644 index 00000000..2c0824e0 --- /dev/null +++ b/docker/config/local-consul/startup.cmd @@ -0,0 +1,17 @@ +@ECHO OFF +@REM ############################## auto-run ############################ +@REM # Author: Johnny Miller, date: 2021-02-08 09:23:29.314 # +@REM # Copyright (c) Johnny Miller # +@REM # Capability: Windows 10 Pro (20H2) # +@REM # Purpose: # +@REM # 1. Integrate easy and simple deployment # +@REM # Download: https://www.consul.io/downloads # +@REM #################################################################### + +SETLOCAL EnableDelayedExpansion +@REM UTF-8 +chcp 65001 + +cls +TITLE local-consul +CALL .\consul.exe agent -config-file="config.json" diff --git a/docker/config/local-consul/startup.sh b/docker/config/local-consul/startup.sh new file mode 100755 index 00000000..e22f7c7c --- /dev/null +++ b/docker/config/local-consul/startup.sh @@ -0,0 +1,16 @@ +#!/bin/bash +############################# startup ############################## +# Author: Johnny Miller, date: 7:31 AM, Dec. 5, 2020 # +# Copyright (c) Johnny Miller # +# Capability: macOS Big Sur 11.2.1 (20D74) # +# Purpose: # +# 1. Integrate easy and simple deployment # +# Download: https://www.consul.io/downloads # +#################################################################### + +# Exit immediately if a command exits with a non-zero status. +# https://stackoverflow.com/questions/19622198/what-does-set-e-mean-in-a-bash-script +set -e + +clear +./consul agent -config-file="config.json" diff --git a/docker/config/logstash/logstash-maf.conf b/docker/config/logstash/logstash-maf.conf new file mode 100644 index 00000000..e058f677 --- /dev/null +++ b/docker/config/logstash/logstash-maf.conf @@ -0,0 +1,16 @@ +input { + tcp { + mode => "server" + host => "0.0.0.0" + port => "4560" + codec => json_lines + } +} +output { + elasticsearch { + hosts => ["maf-elasticsearch:9200"] + index => "maf-logstash-%{[applicationName]}-%{[environment]}-%{+YYYY.MM.dd}" + user => "elastic" + password => "maf@elasticsearch" + } +} diff --git a/docker/config/logstash/logstash-maf.yml b/docker/config/logstash/logstash-maf.yml new file mode 100644 index 00000000..061fcc20 --- /dev/null +++ b/docker/config/logstash/logstash-maf.yml @@ -0,0 +1,11 @@ +## Default Logstash configuration from Logstash base image. +## https://github.com/elastic/logstash/blob/master/docker/data/logstash/config/logstash-full.yml +# +http.host: "0.0.0.0" +xpack.monitoring.elasticsearch.hosts: [ "http://maf-elasticsearch:9200" ] + +## X-Pack security credentials +# +xpack.monitoring.enabled: true +xpack.monitoring.elasticsearch.username: elastic +xpack.monitoring.elasticsearch.password: maf@elasticsearch diff --git a/docker/config/maf-mis/application.yml b/docker/config/maf-mis/application.yml new file mode 100644 index 00000000..d7f8feeb --- /dev/null +++ b/docker/config/maf-mis/application.yml @@ -0,0 +1,4 @@ +maf: + configuration: + excel: + maximum-row-count: 3000 diff --git a/docker/config/mysql-server/README.md b/docker/config/mysql-server/README.md new file mode 100644 index 00000000..ae9f0313 --- /dev/null +++ b/docker/config/mysql-server/README.md @@ -0,0 +1,45 @@ +# How to Configure MySQL Cluster + +[TOC] + +## File Description + +These files below are MySQL initialization scripts: + +``` +script + mysql-server-master + 1_init_user.sql + 2_mysql_and_fitness_structure_and_data_20210627.sql +``` + +## Useful MySQL command + +### On Slave MySQL Server + +1. Connect to MySQL + + ```mysql + mysql -u root -pjm@mysql + ``` + +2. Change master server configuration + + ```mysql + CHANGE MASTER TO + MASTER_HOST='maf-mysql-server-master', + MASTER_PORT=3306, + MASTER_USER='replication_user', + MASTER_PASSWORD='replication_password', + GET_MASTER_PUBLIC_KEY=1, + MASTER_AUTO_POSITION=1; + ``` + +3. Start slave + + ```mysql + START SLAVE; + ``` + + + diff --git a/docker/config/mysql-server/master/mysql-master.cnf b/docker/config/mysql-server/master/mysql-master.cnf new file mode 100644 index 00000000..1815e65f --- /dev/null +++ b/docker/config/mysql-server/master/mysql-master.cnf @@ -0,0 +1,52 @@ +[mysqld] + +# For advice on how to change settings please see +# http://dev.mysql.com/doc/refman/8.0/en/server-configuration-defaults.html +# +# Remove leading # and set to the amount of RAM for the most important data +# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%. +# innodb_buffer_pool_size = 128M +# +# Remove leading # to turn on a very important data integrity option: logging +# changes to the binary log between backups. +# log_bin +# +# Remove leading # to set options mainly useful for reporting servers. +# The server defaults are faster for transactions and fast SELECTs. +# Adjust sizes as needed, experiment to find the optimal values. +# join_buffer_size = 128M +# sort_buffer_size = 2M +# read_rnd_buffer_size = 2M + +# Remove leading # to revert to previous value for default_authentication_plugin, +# this will increase compatibility with older clients. For background, see: +# https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_default_authentication_plugin +# default-authentication-plugin=mysql_native_password +skip-host-cache +skip-name-resolve +datadir=/var/lib/mysql +socket=/var/lib/mysql/mysql.sock +secure-file-priv=/var/lib/mysql-files +user=mysql + +pid-file=/var/run/mysqld/mysqld.pid + +# Database default character set, mainstream character set supports some special emoticons (4 bytes of special emotions) +character-set-server=utf8mb4 + +# Database character set corresponds to some rules such as sorting, +# pay attention to the corresponding correspondence with CHARACTER-SET-Server +collation-server=utf8mb4_general_ci + +# Set the character set when the client is connected to MySQL, prevent garbled binlog_checksum +init_connect='SET NAMES utf8mb4' + +# GTID mode https://chanjarster.github.io/post/mysql-master-slave-docker-example/ +server_id=1 +binlog_format=ROW +log_bin=mysql-bin +gtid_mode=ON +enforce_gtid_consistency=true +binlog-ignore-db=information_schema +binlog-ignore-db=performance_schema +binlog-ignore-db=mysql diff --git a/docker/config/mysql-server/slave-1/mysql-slave.cnf b/docker/config/mysql-server/slave-1/mysql-slave.cnf new file mode 100644 index 00000000..04a999ae --- /dev/null +++ b/docker/config/mysql-server/slave-1/mysql-slave.cnf @@ -0,0 +1,55 @@ +[mysqld] + +# For advice on how to change settings please see +# http://dev.mysql.com/doc/refman/8.0/en/server-configuration-defaults.html +# +# Remove leading # and set to the amount of RAM for the most important data +# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%. +# innodb_buffer_pool_size = 128M +# +# Remove leading # to turn on a very important data integrity option: logging +# changes to the binary log between backups. +# log_bin +# +# Remove leading # to set options mainly useful for reporting servers. +# The server defaults are faster for transactions and fast SELECTs. +# Adjust sizes as needed, experiment to find the optimal values. +# join_buffer_size = 128M +# sort_buffer_size = 2M +# read_rnd_buffer_size = 2M + +# Remove leading # to revert to previous value for default_authentication_plugin, +# this will increase compatibility with older clients. For background, see: +# https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_default_authentication_plugin +# default-authentication-plugin=mysql_native_password +skip-host-cache +skip-name-resolve +datadir=/var/lib/mysql +socket=/var/lib/mysql/mysql.sock +secure-file-priv=/var/lib/mysql-files +user=mysql + +pid-file=/var/run/mysqld/mysqld.pid + +# Database default character set, mainstream character set supports some special emoticons (4 bytes of special emotions) +character-set-server=utf8mb4 + +# Database character set corresponds to some rules such as sorting, +# pay attention to the corresponding correspondence with CHARACTER-SET-Server +collation-server=utf8mb4_general_ci + +# Set the character set when the client is connected to MySQL, prevent garbled binlog_checksum +init-connect='SET NAMES utf8mb4' + +# GTID mode https://chanjarster.github.io/post/mysql-master-slave-docker-example/ +server_id=2 +binlog_format=ROW +gtid_mode=ON +enforce_gtid_consistency=true +read-only=ON +skip-log-bin +skip-log-slave-updates +replicate-ignore-db=information_schema +replicate-ignore-db=mysql +replicate-ignore-db=performance_schema +replicate-ignore-db=sys diff --git a/docker/config/oss-center/application.yml b/docker/config/oss-center/application.yml new file mode 100644 index 00000000..d7f8feeb --- /dev/null +++ b/docker/config/oss-center/application.yml @@ -0,0 +1,4 @@ +maf: + configuration: + excel: + maximum-row-count: 3000 diff --git a/docker/config/rabbitmq/enabled_plugins b/docker/config/rabbitmq/enabled_plugins new file mode 100644 index 00000000..b967f1c1 --- /dev/null +++ b/docker/config/rabbitmq/enabled_plugins @@ -0,0 +1 @@ +[rabbitmq_management,rabbitmq_prometheus,rabbitmq_delayed_message_exchange,rabbitmq_stomp,rabbitmq_web_stomp]. diff --git a/docker/config/rabbitmq/rabbitmq.conf b/docker/config/rabbitmq/rabbitmq.conf new file mode 100644 index 00000000..461e088a --- /dev/null +++ b/docker/config/rabbitmq/rabbitmq.conf @@ -0,0 +1,1074 @@ +# ====================================== +# RabbitMQ broker section +# ====================================== + +## Related doc guide: https://rabbitmq.com/configure.html. See +## https://rabbitmq.com/documentation.html for documentation ToC. +## https://github.com/rabbitmq/rabbitmq-server/blob/v3.8.x/deps/rabbit/docs/rabbitmq.conf.example + +## Networking +## ==================== +## +## Related doc guide: https://rabbitmq.com/networking.html. +## +## By default, RabbitMQ will listen on all interfaces, using +## the standard (reserved) AMQP 0-9-1 and 1.0 port. +## +# listeners.tcp.default = 5672 + + +## To listen on a specific interface, provide an IP address with port. +## For example, to listen only on localhost for both IPv4 and IPv6: +## +# IPv4 +# listeners.tcp.local = 127.0.0.1:5672 +# IPv6 +# listeners.tcp.local_v6 = ::1:5672 + +## You can define multiple listeners using listener names +# listeners.tcp.other_port = 5673 +# listeners.tcp.other_ip = 10.10.10.10:5672 + + +## TLS listeners are configured in the same fashion as TCP listeners, +## including the option to control the choice of interface. +## +# listeners.ssl.default = 5671 + +## It is possible to disable regular TCP (non-TLS) listeners. Clients +## not configured to use TLS and the correct TLS-enabled port won't be able +## to connect to this node. +# listeners.tcp = none + +## Number of Erlang processes that will accept connections for the TCP +## and TLS listeners. +## +# num_acceptors.tcp = 10 +# num_acceptors.ssl = 10 + +## Socket writer will force GC every so many bytes transferred. +## Default is 1 GiB (`1000000000`). Set to 'off' to disable. +## +# socket_writer.gc_threshold = 1000000000 +# +## To disable: +# socket_writer.gc_threshold = off + +## Maximum amount of time allowed for the AMQP 0-9-1 and AMQP 1.0 handshake +## (performed after socket connection and TLS handshake) to complete, in milliseconds. +## +# handshake_timeout = 10000 + +## Set to 'true' to perform reverse DNS lookups when accepting a +## connection. rabbitmqctl and management UI will then display hostnames +## instead of IP addresses. Default value is `false`. +## +# reverse_dns_lookups = false + +## +## Security, Access Control +## ============== +## + +## Related doc guide: https://rabbitmq.com/access-control.html. + +## The default "guest" user is only permitted to access the server +## via a loopback interface (e.g. localhost). +## {loopback_users, [<<"guest">>]}, +## +# loopback_users.guest = true + +## Uncomment the following line if you want to allow access to the +## guest user from anywhere on the network. +# loopback_users.guest = false + +## TLS configuration. +## +## Related doc guide: https://rabbitmq.com/ssl.html. +## +# listeners.ssl.1 = 5671 +# +# ssl_options.verify = verify_peer +# ssl_options.fail_if_no_peer_cert = false +# ssl_options.cacertfile = /path/to/cacert.pem +# ssl_options.certfile = /path/to/cert.pem +# ssl_options.keyfile = /path/to/key.pem +# +# ssl_options.honor_cipher_order = true +# ssl_options.honor_ecc_order = true +# +## These are highly recommended for TLSv1.2 but cannot be used +## with TLSv1.3. If TLSv1.3 is enabled, these lines MUST be removed. +# ssl_options.client_renegotiation = false +# ssl_options.secure_renegotiate = true +# +## Limits what TLS versions the server enables for client TLS +## connections. See https://www.rabbitmq.com/ssl.html#tls-versions for details. +## +## Cutting edge TLS version which requires recent client runtime +## versions and has no cipher suite in common with earlier TLS versions. +# ssl_options.versions.1 = tlsv1.3 +## Enables TLSv1.2 for best compatibility +# ssl_options.versions.2 = tlsv1.2 +## Older TLS versions have known vulnerabilities and are being phased out +## from wide use. + +## Limits what cipher suites the server will use for client TLS +## connections. Narrowing this down can prevent some clients +## from connecting. +## If TLSv1.3 is enabled and cipher suites are overridden, TLSv1.3-specific +## cipher suites must also be explicitly enabled. +## See https://www.rabbitmq.com/ssl.html#cipher-suites and https://wiki.openssl.org/index.php/TLS1.3#Ciphersuites +## for details. +# +## The example below uses TLSv1.3 cipher suites only +# +# ssl_options.ciphers.1 = TLS_AES_256_GCM_SHA384 +# ssl_options.ciphers.2 = TLS_AES_128_GCM_SHA256 +# ssl_options.ciphers.3 = TLS_CHACHA20_POLY1305_SHA256 +# ssl_options.ciphers.4 = TLS_AES_128_CCM_SHA256 +# ssl_options.ciphers.5 = TLS_AES_128_CCM_8_SHA256 +# +## The example below uses TLSv1.2 cipher suites only +# +# ssl_options.ciphers.1 = ECDHE-ECDSA-AES256-GCM-SHA384 +# ssl_options.ciphers.2 = ECDHE-RSA-AES256-GCM-SHA384 +# ssl_options.ciphers.3 = ECDHE-ECDSA-AES256-SHA384 +# ssl_options.ciphers.4 = ECDHE-RSA-AES256-SHA384 +# ssl_options.ciphers.5 = ECDH-ECDSA-AES256-GCM-SHA384 +# ssl_options.ciphers.6 = ECDH-RSA-AES256-GCM-SHA384 +# ssl_options.ciphers.7 = ECDH-ECDSA-AES256-SHA384 +# ssl_options.ciphers.8 = ECDH-RSA-AES256-SHA384 +# ssl_options.ciphers.9 = DHE-RSA-AES256-GCM-SHA384 +# ssl_options.ciphers.10 = DHE-DSS-AES256-GCM-SHA384 +# ssl_options.ciphers.11 = DHE-RSA-AES256-SHA256 +# ssl_options.ciphers.12 = DHE-DSS-AES256-SHA256 +# ssl_options.ciphers.13 = ECDHE-ECDSA-AES128-GCM-SHA256 +# ssl_options.ciphers.14 = ECDHE-RSA-AES128-GCM-SHA256 +# ssl_options.ciphers.15 = ECDHE-ECDSA-AES128-SHA256 +# ssl_options.ciphers.16 = ECDHE-RSA-AES128-SHA256 +# ssl_options.ciphers.17 = ECDH-ECDSA-AES128-GCM-SHA256 +# ssl_options.ciphers.18 = ECDH-RSA-AES128-GCM-SHA256 +# ssl_options.ciphers.19 = ECDH-ECDSA-AES128-SHA256 +# ssl_options.ciphers.20 = ECDH-RSA-AES128-SHA256 +# ssl_options.ciphers.21 = DHE-RSA-AES128-GCM-SHA256 +# ssl_options.ciphers.22 = DHE-DSS-AES128-GCM-SHA256 +# ssl_options.ciphers.23 = DHE-RSA-AES128-SHA256 +# ssl_options.ciphers.24 = DHE-DSS-AES128-SHA256 +# ssl_options.ciphers.25 = ECDHE-ECDSA-AES256-SHA +# ssl_options.ciphers.26 = ECDHE-RSA-AES256-SHA +# ssl_options.ciphers.27 = DHE-RSA-AES256-SHA +# ssl_options.ciphers.28 = DHE-DSS-AES256-SHA +# ssl_options.ciphers.29 = ECDH-ECDSA-AES256-SHA +# ssl_options.ciphers.30 = ECDH-RSA-AES256-SHA +# ssl_options.ciphers.31 = ECDHE-ECDSA-AES128-SHA +# ssl_options.ciphers.32 = ECDHE-RSA-AES128-SHA +# ssl_options.ciphers.33 = DHE-RSA-AES128-SHA +# ssl_options.ciphers.34 = DHE-DSS-AES128-SHA +# ssl_options.ciphers.35 = ECDH-ECDSA-AES128-SHA +# ssl_options.ciphers.36 = ECDH-RSA-AES128-SHA + +# ssl_options.bypass_pem_cache = true + +## Select an authentication/authorisation backend to use. +## +## Alternative backends are provided by plugins, such as rabbitmq-auth-backend-ldap. +## +## NB: These settings require certain plugins to be enabled. +## +## Related doc guides: +## +## * https://rabbitmq.com/plugins.html +## * https://rabbitmq.com/access-control.html +## + +# auth_backends.1 = rabbit_auth_backend_internal + +## uses separate backends for authentication and authorisation, +## see below. +# auth_backends.1.authn = rabbit_auth_backend_ldap +# auth_backends.1.authz = rabbit_auth_backend_internal + +## The rabbitmq_auth_backend_ldap plugin allows the broker to +## perform authentication and authorisation by deferring to an +## external LDAP server. +## +## Relevant doc guides: +## +## * https://rabbitmq.com/ldap.html +## * https://rabbitmq.com/access-control.html +## +## uses LDAP for both authentication and authorisation +# auth_backends.1 = rabbit_auth_backend_ldap + +## uses HTTP service for both authentication and +## authorisation +# auth_backends.1 = rabbit_auth_backend_http + +## uses two backends in a chain: HTTP first, then internal +# auth_backends.1 = rabbit_auth_backend_http +# auth_backends.2 = rabbit_auth_backend_internal + +## Authentication +## The built-in mechanisms are 'PLAIN', +## 'AMQPLAIN', and 'EXTERNAL' Additional mechanisms can be added via +## plugins. +## +## Related doc guide: https://rabbitmq.com/authentication.html. +## +# auth_mechanisms.1 = PLAIN +# auth_mechanisms.2 = AMQPLAIN + +## The rabbitmq-auth-mechanism-ssl plugin makes it possible to +## authenticate a user based on the client's x509 (TLS) certificate. +## Related doc guide: https://rabbitmq.com/authentication.html. +## +## To use auth-mechanism-ssl, the EXTERNAL mechanism should +## be enabled: +## +# auth_mechanisms.1 = PLAIN +# auth_mechanisms.2 = AMQPLAIN +# auth_mechanisms.3 = EXTERNAL + +## To force x509 certificate-based authentication on all clients, +## exclude all other mechanisms (note: this will disable password-based +## authentication even for the management UI!): +## +# auth_mechanisms.1 = EXTERNAL + +## This pertains to both the rabbitmq-auth-mechanism-ssl plugin and +## STOMP ssl_cert_login configurations. See the RabbitMQ STOMP plugin +## configuration section later in this file and the README in +## https://github.com/rabbitmq/rabbitmq-auth-mechanism-ssl for further +## details. +## +## To use the TLS cert's CN instead of its DN as the username +## +# ssl_cert_login_from = common_name + +## TLS handshake timeout, in milliseconds. +## +# ssl_handshake_timeout = 5000 + + +## Cluster name +## +# cluster_name = dev3.eng.megacorp.local + +## Password hashing implementation. Will only affect newly +## created users. To recalculate hash for an existing user +## it's necessary to update her password. +## +## To use SHA-512, set to rabbit_password_hashing_sha512. +## +# password_hashing_module = rabbit_password_hashing_sha256 + +## When importing definitions exported from versions earlier +## than 3.6.0, it is possible to go back to MD5 (only do this +## as a temporary measure!) by setting this to rabbit_password_hashing_md5. +## +# password_hashing_module = rabbit_password_hashing_md5 + +## +## Default User / VHost +## ==================== +## + +## On first start RabbitMQ will create a vhost and a user. These +## config items control what gets created. +## Relevant doc guide: https://rabbitmq.com/access-control.html +## +# default_vhost = / +# default_user = guest +# default_pass = guest + +# default_permissions.configure = .* +# default_permissions.read = .* +# default_permissions.write = .* + +## Tags for default user +## +## For more details about tags, see the documentation for the +## Management Plugin at https://rabbitmq.com/management.html. +## +# default_user_tags.administrator = true + +## Define other tags like this: +# default_user_tags.management = true +# default_user_tags.custom_tag = true + +## +## Additional network and protocol related configuration +## ===================================================== +## + +## Set the server AMQP 0-9-1 heartbeat timeout in seconds. +## RabbitMQ nodes will send heartbeat frames at roughly +## the (timeout / 2) interval. Two missed heartbeats from +## a client will close its connection. +## +## Values lower than 6 seconds are very likely to produce +## false positives and are not recommended. +## +## Related doc guides: +## +## * https://rabbitmq.com/heartbeats.html +## * https://rabbitmq.com/networking.html +## +# heartbeat = 60 + +## Set the max permissible size of an AMQP frame (in bytes). +## +# frame_max = 131072 + +## Set the max frame size the server will accept before connection +## tuning occurs +## +# initial_frame_max = 4096 + +## Set the max permissible number of channels per connection. +## 0 means "no limit". +## +# channel_max = 128 + +## Customising TCP Listener (Socket) Configuration. +## +## Related doc guides: +## +## * https://rabbitmq.com/networking.html +## * https://www.erlang.org/doc/man/inet.html#setopts-2 +## + +# tcp_listen_options.backlog = 128 +# tcp_listen_options.nodelay = true +# tcp_listen_options.exit_on_close = false +# +# tcp_listen_options.keepalive = true +# tcp_listen_options.send_timeout = 15000 +# +# tcp_listen_options.buffer = 196608 +# tcp_listen_options.sndbuf = 196608 +# tcp_listen_options.recbuf = 196608 + +## +## Resource Limits & Flow Control +## ============================== +## +## Related doc guide: https://rabbitmq.com/memory.html. + +## Memory-based Flow Control threshold. +## +# vm_memory_high_watermark.relative = 0.4 + +## Alternatively, we can set a limit (in bytes) of RAM used by the node. +## +# vm_memory_high_watermark.absolute = 1073741824 + +## Or you can set absolute value using memory units (with RabbitMQ 3.6.0+). +## Absolute watermark will be ignored if relative is defined! +## +# vm_memory_high_watermark.absolute = 2GB +## +## Supported unit symbols: +## +## k, kiB: kibibytes (2^10 - 1,024 bytes) +## M, MiB: mebibytes (2^20 - 1,048,576 bytes) +## G, GiB: gibibytes (2^30 - 1,073,741,824 bytes) +## kB: kilobytes (10^3 - 1,000 bytes) +## MB: megabytes (10^6 - 1,000,000 bytes) +## GB: gigabytes (10^9 - 1,000,000,000 bytes) + + + +## Fraction of the high watermark limit at which queues start to +## page message out to disc in order to free up memory. +## For example, when vm_memory_high_watermark is set to 0.4 and this value is set to 0.5, +## paging can begin as early as when 20% of total available RAM is used by the node. +## +## Values greater than 1.0 can be dangerous and should be used carefully. +## +## One alternative to this is to use durable queues and publish messages +## as persistent (delivery mode = 2). With this combination queues will +## move messages to disk much more rapidly. +## +## Another alternative is to configure queues to page all messages (both +## persistent and transient) to disk as quickly +## as possible, see https://rabbitmq.com/lazy-queues.html. +## +# vm_memory_high_watermark_paging_ratio = 0.5 + +## Selects Erlang VM memory consumption calculation strategy. Can be `allocated`, `rss` or `legacy` (aliased as `erlang`), +## Introduced in 3.6.11. `rss` is the default as of 3.6.12. +## See https://github.com/rabbitmq/rabbitmq-server/issues/1223 and rabbitmq/rabbitmq-common#224 for background. +# vm_memory_calculation_strategy = rss + +## Interval (in milliseconds) at which we perform the check of the memory +## levels against the watermarks. +## +# memory_monitor_interval = 2500 + +## The total memory available can be calculated from the OS resources +## - default option - or provided as a configuration parameter. +# total_memory_available_override_value = 2GB + +## Set disk free limit (in bytes). Once free disk space reaches this +## lower bound, a disk alarm will be set - see the documentation +## listed above for more details. +## +## Absolute watermark will be ignored if relative is defined! +# disk_free_limit.absolute = 50000 + +## Or you can set it using memory units (same as in vm_memory_high_watermark) +## with RabbitMQ 3.6.0+. +# disk_free_limit.absolute = 500KB +# disk_free_limit.absolute = 50mb +# disk_free_limit.absolute = 5GB + +## Alternatively, we can set a limit relative to total available RAM. +## +## Values lower than 1.0 can be dangerous and should be used carefully. +# disk_free_limit.relative = 2.0 + +## +## Clustering +## ===================== +## +# cluster_partition_handling = ignore + +## Pauses all nodes on the minority side of a partition. The cluster +## MUST have an odd number of nodes (3, 5, etc) +# cluster_partition_handling = pause_minority + +## pause_if_all_down strategy require additional configuration +# cluster_partition_handling = pause_if_all_down + +## Recover strategy. Can be either 'autoheal' or 'ignore' +# cluster_partition_handling.pause_if_all_down.recover = ignore + +## Node names to check +# cluster_partition_handling.pause_if_all_down.nodes.1 = rabbit@localhost +# cluster_partition_handling.pause_if_all_down.nodes.2 = hare@localhost + +## Mirror sync batch size, in messages. Increasing this will speed +## up syncing but total batch size in bytes must not exceed 2 GiB. +## Available in RabbitMQ 3.6.0 or later. +## +# mirroring_sync_batch_size = 4096 + +## Make clustering happen *automatically* at startup. Only applied +## to nodes that have just been reset or started for the first time. +## +## Relevant doc guide: https://rabbitmq.com//cluster-formation.html +## + +# cluster_formation.peer_discovery_backend = rabbit_peer_discovery_classic_config +# +# cluster_formation.classic_config.nodes.1 = rabbit1@hostname +# cluster_formation.classic_config.nodes.2 = rabbit2@hostname +# cluster_formation.classic_config.nodes.3 = rabbit3@hostname +# cluster_formation.classic_config.nodes.4 = rabbit4@hostname + +## DNS-based peer discovery. This backend will list A records +## of the configured hostname and perform reverse lookups for +## the addresses returned. + +# cluster_formation.peer_discovery_backend = rabbit_peer_discovery_dns +# cluster_formation.dns.hostname = discovery.eng.example.local + +## This node's type can be configured. If you are not sure +## what node type to use, always use 'disc'. +# cluster_formation.node_type = disc + +## Interval (in milliseconds) at which we send keepalive messages +## to other cluster members. Note that this is not the same thing +## as net_ticktime; missed keepalive messages will not cause nodes +## to be considered down. +## +# cluster_keepalive_interval = 10000 + +## +## Statistics Collection +## ===================== +## + +## Statistics collection interval (in milliseconds). Increasing +## this will reduce the load on management database. +## +# collect_statistics_interval = 5000 + +## Fine vs. coarse statistics +# +# This value is no longer meant to be configured directly. +# +# See https://www.rabbitmq.com/management.html#fine-stats. + +## +## Ra Settings +## ===================== +## +## NB: changing these on a node with existing data directory +## can lead to DATA LOSS. +## +# raft.segment_max_entries = 65536 +# raft.wal_max_size_bytes = 1048576 +# raft.wal_max_batch_size = 4096 +# raft.snapshot_chunk_size = 1000000 + +## +## Misc/Advanced Options +## ===================== +## +## NB: Change these only if you understand what you are doing! +## + +## Timeout used when waiting for Mnesia tables in a cluster to +## become available. +## +# mnesia_table_loading_retry_timeout = 30000 + +## Retries when waiting for Mnesia tables in the cluster startup. Note that +## this setting is not applied to Mnesia upgrades or node deletions. +## +# mnesia_table_loading_retry_limit = 10 + +## Size in bytes below which to embed messages in the queue index. +## Related doc guide: https://rabbitmq.com/persistence-conf.html +## +# queue_index_embed_msgs_below = 4096 + +## You can also set this size in memory units +## +# queue_index_embed_msgs_below = 4kb + +## Whether or not to enable background periodic forced GC runs for all +## Erlang processes on the node in "waiting" state. +## +## Disabling background GC may reduce latency for client operations, +## keeping it enabled may reduce median RAM usage by the binary heap +## (see https://www.erlang-solutions.com/blog/erlang-garbage-collector.html). +## +## Before trying this option, please take a look at the memory +## breakdown (https://www.rabbitmq.com/memory-use.html). +## +# background_gc_enabled = false + +## Target (desired) interval (in milliseconds) at which we run background GC. +## The actual interval will vary depending on how long it takes to execute +## the operation (can be higher than this interval). Values less than +## 30000 milliseconds are not recommended. +## +# background_gc_target_interval = 60000 + +## Whether or not to enable proxy protocol support. +## Once enabled, clients cannot directly connect to the broker +## anymore. They must connect through a load balancer that sends the +## proxy protocol header to the broker at connection time. +## This setting applies only to AMQP clients, other protocols +## like MQTT or STOMP have their own setting to enable proxy protocol. +## See the plugins documentation for more information. +## +# proxy_protocol = false + +## Overriden product name and version. +## They are set to "RabbitMQ" and the release version by default. +# product.name = RabbitMQ +# product.version = 1.2.3 + +## "Message of the day" file. +## Its content is used to expand the logged and printed banners. +## Default to /etc/rabbitmq/motd on Unix, %APPDATA%\RabbitMQ\motd.txt +## on Windows. +# motd_file = /etc/rabbitmq/motd + +## Consumer timeout +## If a message delivered to a consumer has not been acknowledge before this timer +## triggers the channel will be force closed by the broker. This ensure that +## faultly consumers that never ack will not hold on to messages indefinitely. +## +# consumer_timeout = 900000 + +## ---------------------------------------------------------------------------- +## Advanced Erlang Networking/Clustering Options. +## +## Related doc guide: https://rabbitmq.com/clustering.html +## ---------------------------------------------------------------------------- + +# ====================================== +# Kernel section +# ====================================== + +## Timeout used to detect peer unavailability, including CLI tools. +## Related doc guide: https://www.rabbitmq.com/nettick.html. +## +# net_ticktime = 60 + +## Inter-node communication port range. +## The parameters inet_dist_listen_min and inet_dist_listen_max +## can be configured in the classic config format only. +## Related doc guide: https://www.rabbitmq.com/networking.html#epmd-inet-dist-port-range. + + +## ---------------------------------------------------------------------------- +## RabbitMQ Management Plugin +## +## Related doc guide: https://rabbitmq.com/management.html. +## ---------------------------------------------------------------------------- + +# ======================================= +# Management section +# ======================================= + +## Preload schema definitions from the following JSON file. +## Related doc guide: https://rabbitmq.com/management.html#load-definitions. +## +# management.load_definitions = /path/to/exported/definitions.json + +## Log all requests to the management HTTP API to a file. +## +# management.http_log_dir = /path/to/access.log + +## HTTP listener and embedded Web server settings. +# ## See https://rabbitmq.com/management.html for details. +# +# management.tcp.port = 15672 +# management.tcp.ip = 0.0.0.0 +# +# management.tcp.shutdown_timeout = 7000 +# management.tcp.max_keepalive = 120 +# management.tcp.idle_timeout = 120 +# management.tcp.inactivity_timeout = 120 +# management.tcp.request_timeout = 120 +# management.tcp.compress = true + +## HTTPS listener settings. +## See https://rabbitmq.com/management.html and https://rabbitmq.com/ssl.html for details. +## +# management.ssl.port = 15671 +# management.ssl.cacertfile = /path/to/ca_certificate.pem +# management.ssl.certfile = /path/to/server_certificate.pem +# management.ssl.keyfile = /path/to/server_key.pem + +## More TLS options +# management.ssl.honor_cipher_order = true +# management.ssl.honor_ecc_order = true + +## These are highly recommended for TLSv1.2 but cannot be used +## with TLSv1.3. If TLSv1.3 is enabled, these lines MUST be removed. +# management.ssl.client_renegotiation = false +# management.ssl.secure_renegotiate = true + +## Supported TLS versions +# management.ssl.versions.1 = tlsv1.2 + +## Cipher suites the server is allowed to use +# management.ssl.ciphers.1 = ECDHE-ECDSA-AES256-GCM-SHA384 +# management.ssl.ciphers.2 = ECDHE-RSA-AES256-GCM-SHA384 +# management.ssl.ciphers.3 = ECDHE-ECDSA-AES256-SHA384 +# management.ssl.ciphers.4 = ECDHE-RSA-AES256-SHA384 +# management.ssl.ciphers.5 = ECDH-ECDSA-AES256-GCM-SHA384 +# management.ssl.ciphers.6 = ECDH-RSA-AES256-GCM-SHA384 +# management.ssl.ciphers.7 = ECDH-ECDSA-AES256-SHA384 +# management.ssl.ciphers.8 = ECDH-RSA-AES256-SHA384 +# management.ssl.ciphers.9 = DHE-RSA-AES256-GCM-SHA384 + +## URL path prefix for HTTP API and management UI +# management.path_prefix = /a-prefix + +## One of 'basic', 'detailed' or 'none'. See +## https://rabbitmq.com/management.html#fine-stats for more details. +# management.rates_mode = basic + +## Configure how long aggregated data (such as message rates and queue +## lengths) is retained. Please read the plugin's documentation in +## https://rabbitmq.com/management.html#configuration for more +## details. +## Your can use 'minute', 'hour' and 'day' keys or integer key (in seconds) +# management.sample_retention_policies.global.minute = 5 +# management.sample_retention_policies.global.hour = 60 +# management.sample_retention_policies.global.day = 1200 + +# management.sample_retention_policies.basic.minute = 5 +# management.sample_retention_policies.basic.hour = 60 + +# management.sample_retention_policies.detailed.10 = 5 + +## ---------------------------------------------------------------------------- +## RabbitMQ Shovel Plugin +## +## Related doc guide: https://rabbitmq.com/shovel.html +## ---------------------------------------------------------------------------- + +## See advanced.config.example for a Shovel plugin example + + +## ---------------------------------------------------------------------------- +## RabbitMQ STOMP Plugin +## +## Related doc guide: https://rabbitmq.com/stomp.html +## ---------------------------------------------------------------------------- + +# ======================================= +# STOMP section +# ======================================= + +## See https://rabbitmq.com/stomp.html for details. + +## TCP listeners. +## +# stomp.listeners.tcp.1 = 127.0.0.1:61613 +# stomp.listeners.tcp.2 = ::1:61613 + +## TCP listener settings +## +# stomp.tcp_listen_options.backlog = 2048 +# stomp.tcp_listen_options.recbuf = 131072 +# stomp.tcp_listen_options.sndbuf = 131072 +# +# stomp.tcp_listen_options.keepalive = true +# stomp.tcp_listen_options.nodelay = true +# +# stomp.tcp_listen_options.exit_on_close = true +# stomp.tcp_listen_options.send_timeout = 120 + +## Proxy protocol support +## +# stomp.proxy_protocol = false + +## TLS listeners +## See https://rabbitmq.com/stomp.html and https://rabbitmq.com/ssl.html for details. +# stomp.listeners.ssl.default = 61614 +# +# ssl_options.cacertfile = path/to/cacert.pem +# ssl_options.certfile = path/to/cert.pem +# ssl_options.keyfile = path/to/key.pem +# ssl_options.verify = verify_peer +# ssl_options.fail_if_no_peer_cert = true + + +## Number of Erlang processes that will accept connections for the TCP +## and TLS listeners. +## +# stomp.num_acceptors.tcp = 10 +# stomp.num_acceptors.ssl = 1 + +## Additional TLS options + +## Extract a name from the client's certificate when using TLS. +## +# stomp.ssl_cert_login = true + +## Set a default user name and password. This is used as the default login +## whenever a CONNECT frame omits the login and passcode headers. +## +## Please note that setting this will allow clients to connect without +## authenticating! +## +stomp.default_user = maf_rabbitmq_su +stomp.default_pass = maf@rabbitmq + +## If a default user is configured, or you have configured use TLS client +## certificate based authentication, you can choose to allow clients to +## omit the CONNECT frame entirely. If set to true, the client is +## automatically connected as the default user or user supplied in the +## TLS certificate whenever the first frame sent on a session is not a +## CONNECT frame. +## +# stomp.implicit_connect = true + +## Whether or not to enable proxy protocol support. +## Once enabled, clients cannot directly connect to the broker +## anymore. They must connect through a load balancer that sends the +## proxy protocol header to the broker at connection time. +## This setting applies only to STOMP clients, other protocols +## like MQTT or AMQP have their own setting to enable proxy protocol. +## See the plugins or broker documentation for more information. +## +# stomp.proxy_protocol = false + +## ---------------------------------------------------------------------------- +## RabbitMQ MQTT Adapter +## +## See https://github.com/rabbitmq/rabbitmq-mqtt/blob/stable/README.md +## for details +## ---------------------------------------------------------------------------- + +# ======================================= +# MQTT section +# ======================================= + +## TCP listener settings. +## +# mqtt.listeners.tcp.1 = 127.0.0.1:61613 +# mqtt.listeners.tcp.2 = ::1:61613 + +## TCP listener options (as per the broker configuration). +## +# mqtt.tcp_listen_options.backlog = 4096 +# mqtt.tcp_listen_options.recbuf = 131072 +# mqtt.tcp_listen_options.sndbuf = 131072 +# +# mqtt.tcp_listen_options.keepalive = true +# mqtt.tcp_listen_options.nodelay = true +# +# mqtt.tcp_listen_options.exit_on_close = true +# mqtt.tcp_listen_options.send_timeout = 120 + +## TLS listener settings +## ## See https://rabbitmq.com/mqtt.html and https://rabbitmq.com/ssl.html for details. +# +# mqtt.listeners.ssl.default = 8883 +# +# ssl_options.cacertfile = /path/to/tls/ca_certificate_bundle.pem +# ssl_options.certfile = /path/to/tls/server_certificate.pem +# ssl_options.keyfile = /path/to/tls/server_key.pem +# ssl_options.verify = verify_peer +# ssl_options.fail_if_no_peer_cert = true +# + + +## Number of Erlang processes that will accept connections for the TCP +## and TLS listeners. +## +# mqtt.num_acceptors.tcp = 10 +# mqtt.num_acceptors.ssl = 10 + +## Whether or not to enable proxy protocol support. +## Once enabled, clients cannot directly connect to the broker +## anymore. They must connect through a load balancer that sends the +## proxy protocol header to the broker at connection time. +## This setting applies only to STOMP clients, other protocols +## like STOMP or AMQP have their own setting to enable proxy protocol. +## See the plugins or broker documentation for more information. +## +# mqtt.proxy_protocol = false + +## Set the default user name and password used for anonymous connections (when client +## provides no credentials). Anonymous connections are highly discouraged! +## +# mqtt.default_user = guest +# mqtt.default_pass = guest + +## Enable anonymous connections. If this is set to false, clients MUST provide +## credentials in order to connect. See also the mqtt.default_user/mqtt.default_pass +## keys. Anonymous connections are highly discouraged! +## +# mqtt.allow_anonymous = true + +## If you have multiple vhosts, specify the one to which the +## adapter connects. +## +# mqtt.vhost = / + +## Specify the exchange to which messages from MQTT clients are published. +## +# mqtt.exchange = amq.topic + +## Specify TTL (time to live) to control the lifetime of non-clean sessions. +## +# mqtt.subscription_ttl = 1800000 + +## Set the prefetch count (governing the maximum number of unacknowledged +## messages that will be delivered). +## +# mqtt.prefetch = 10 + + +## ---------------------------------------------------------------------------- +## RabbitMQ AMQP 1.0 Support +## +## See https://github.com/rabbitmq/rabbitmq-amqp1.0/blob/stable/README.md. +## ---------------------------------------------------------------------------- + +# ======================================= +# AMQP 1.0 section +# ======================================= + + +## Connections that are not authenticated with SASL will connect as this +## account. See the README for more information. +## +## Please note that setting this will allow clients to connect without +## authenticating! +## +# amqp1_0.default_user = guest + +## Enable protocol strict mode. See the README for more information. +## +# amqp1_0.protocol_strict_mode = false + +## Logging settings. +## +## See https://rabbitmq.com/logging.html and https://github.com/erlang-lager/lager for details. +## + +## Log directory, taken from the RABBITMQ_LOG_BASE env variable by default. +## +# log.dir = /var/log/rabbitmq + +## Logging to file. Can be false or a filename. +## Default: +# log.file = rabbit.log + +## To disable logging to a file +# log.file = false + +## Log level for file logging +## +# log.file.level = info + +## File rotation config. No rotation by default. +## DO NOT SET rotation date to ''. Leave the value unset if "" is the desired value +# log.file.rotation.date = $D0 +# log.file.rotation.size = 0 + +## Logging to console (can be true or false) +## +# log.console = false + +## Log level for console logging +## +# log.console.level = info + +## Logging to the amq.rabbitmq.log exchange (can be true or false) +## +# log.exchange = false + +## Log level to use when logging to the amq.rabbitmq.log exchange +## +# log.exchange.level = info + + + +## ---------------------------------------------------------------------------- +## RabbitMQ LDAP Plugin +## +## Related doc guide: https://rabbitmq.com/ldap.html. +## +## ---------------------------------------------------------------------------- + +# ======================================= +# LDAP section +# ======================================= + +## +## Connecting to the LDAP server(s) +## ================================ +## + +## Specify servers to bind to. You *must* set this in order for the plugin +## to work properly. +## +# auth_ldap.servers.1 = your-server-name-goes-here + +## You can define multiple servers +# auth_ldap.servers.2 = your-other-server + +## Connect to the LDAP server using TLS +## +# auth_ldap.use_ssl = false + +## Specify the LDAP port to connect to +## +# auth_ldap.port = 389 + +## LDAP connection timeout, in milliseconds or 'infinity' +## +# auth_ldap.timeout = infinity + +## Or number +# auth_ldap.timeout = 500 + +## Enable logging of LDAP queries. +## One of +## - false (no logging is performed) +## - true (verbose logging of the logic used by the plugin) +## - network (as true, but additionally logs LDAP network traffic) +## +## Defaults to false. +## +# auth_ldap.log = false + +## Also can be true or network +# auth_ldap.log = true +# auth_ldap.log = network + +## +## Authentication +## ============== +## + +## Pattern to convert the username given through AMQP to a DN before +## binding +## +# auth_ldap.user_dn_pattern = cn=${username},ou=People,dc=example,dc=com + +## Alternatively, you can convert a username to a Distinguished +## Name via an LDAP lookup after binding. See the documentation for +## full details. + +## When converting a username to a dn via a lookup, set these to +## the name of the attribute that represents the user name, and the +## base DN for the lookup query. +## +# auth_ldap.dn_lookup_attribute = userPrincipalName +# auth_ldap.dn_lookup_base = DC=gopivotal,DC=com + +## Controls how to bind for authorisation queries and also to +## retrieve the details of users logging in without presenting a +## password (e.g., SASL EXTERNAL). +## One of +## - as_user (to bind as the authenticated user - requires a password) +## - anon (to bind anonymously) +## - {UserDN, Password} (to bind with a specified user name and password) +## +## Defaults to 'as_user'. +## +# auth_ldap.other_bind = as_user + +## Or can be more complex: +# auth_ldap.other_bind.user_dn = User +# auth_ldap.other_bind.password = Password + +## If user_dn and password defined - other options is ignored. + +# ----------------------------- +# Too complex section of LDAP +# ----------------------------- + +## +## Authorisation +## ============= +## + +## The LDAP plugin can perform a variety of queries against your +## LDAP server to determine questions of authorisation. +## +## Related doc guide: https://rabbitmq.com/ldap.html#authorisation. + +## Following configuration should be defined in advanced.config file +## DO NOT UNCOMMENT THESE LINES! + +## Set the query to use when determining vhost access +## +## {vhost_access_query, {in_group, +## "ou=${vhost}-users,ou=vhosts,dc=example,dc=com"}}, + +## Set the query to use when determining resource (e.g., queue) access +## +## {resource_access_query, {constant, true}}, + +## Set queries to determine which tags a user has +## +## {tag_queries, []} +# ]}, +# ----------------------------- + +loopback_users.guest = false + +listeners.tcp.default = 5672 + +default_pass = maf@rabbitmq + +default_user = maf_rabbitmq_su + +management.tcp.port = 15672 diff --git a/docker/script/redis/redis.conf b/docker/config/redis/redis.conf similarity index 90% rename from docker/script/redis/redis.conf rename to docker/config/redis/redis.conf index ec185116..ba888a00 100644 --- a/docker/script/redis/redis.conf +++ b/docker/config/redis/redis.conf @@ -24,7 +24,7 @@ # to customize a few per-server settings. Include files can include # other files, so use this wisely. # -# Notice option "include" won't be rewritten by command "CONFIG REWRITE" +# Note that option "include" won't be rewritten by command "CONFIG REWRITE" # from admin or Redis Sentinel. Since Redis always uses the last processed # line as value of a configuration directive, you'd better put includes # at the beginning of this file to avoid overwriting config change at runtime. @@ -46,7 +46,7 @@ ################################## NETWORK ##################################### # By default, if no "bind" configuration directive is specified, Redis listens -# for connections from all the network interfaces available on the server. +# for connections from all available network interfaces on the host machine. # It is possible to listen to just one or multiple selected interfaces using # the "bind" configuration directive, followed by one or more IP addresses. # @@ -58,13 +58,12 @@ # ~~~ WARNING ~~~ If the computer running Redis is directly exposed to the # internet, binding to all the interfaces is dangerous and will expose the # instance to everybody on the internet. So by default we uncomment the -# following bind directive, that will force Redis to listen only into -# the IPv4 loopback interface address (this means Redis will be able to -# accept connections only from clients running into the same computer it -# is running). +# following bind directive, that will force Redis to listen only on the +# IPv4 loopback interface address (this means Redis will only be able to +# accept client connections from the same host that it is running on). # # IF YOU ARE SURE YOU WANT YOUR INSTANCE TO LISTEN TO ALL THE INTERFACES -# JUST COMMENT THE FOLLOWING LINE. +# JUST COMMENT OUT THE FOLLOWING LINE. # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # bind 127.0.0.1 @@ -93,8 +92,8 @@ port 6379 # TCP listen() backlog. # -# In high requests-per-second environments you need an high backlog in order -# to avoid slow clients connections issues. Note that the Linux kernel +# In high requests-per-second environments you need a high backlog in order +# to avoid slow clients connection issues. Note that the Linux kernel # will silently truncate it to the value of /proc/sys/net/core/somaxconn so # make sure to raise both the value of somaxconn and tcp_max_syn_backlog # in order to get the desired effect. @@ -118,8 +117,8 @@ timeout 0 # of communication. This is useful for two reasons: # # 1) Detect dead peers. -# 2) Take the connection alive from the point of view of network -# equipment in the middle. +# 2) Force network equipment in the middle to consider the connection to be +# alive. # # On Linux, the specified value (in seconds) is the period used to send ACKs. # Note that to close the connection the double of the time is needed. @@ -142,7 +141,7 @@ tcp-keepalive 300 # server to connected clients, masters or cluster peers. These files should be # PEM formatted. # -# tls-cert-file redis.crt +# tls-cert-file redis.crt # tls-key-file redis.key # Configure a DH parameters file to enable Diffie-Hellman (DH) key exchange: @@ -159,9 +158,12 @@ tcp-keepalive 300 # By default, clients (including replica servers) on a TLS port are required # to authenticate using valid client side certificates. # -# It is possible to disable authentication using this directive. +# If "no" is specified, client certificates are not required and not accepted. +# If "optional" is specified, client certificates are accepted and must be +# valid if provided, but are not required. # # tls-auth-clients no +# tls-auth-clients optional # By default, a Redis replica does not attempt to establish a TLS connection # with its master. @@ -176,9 +178,10 @@ tcp-keepalive 300 # tls-cluster yes # Explicitly specify TLS versions to support. Allowed values are case insensitive -# and include "TLSv1", "TLSv1.1", "TLSv1.2", "TLSv1.3" (OpenSSL >= 1.1.1) +# and include "TLSv1", "TLSv1.1", "TLSv1.2", "TLSv1.3" (OpenSSL >= 1.1.1) or +# any combination. To enable only TLSv1.2 and TLSv1.3, use: # -# tls-protocols TLSv1.2 +# tls-protocols "TLSv1.2 TLSv1.3" # Configure allowed ciphers. See the ciphers(1ssl) manpage for more information # about the syntax of this string. @@ -198,6 +201,22 @@ tcp-keepalive 300 # # tls-prefer-server-ciphers yes +# By default, TLS session caching is enabled to allow faster and less expensive +# reconnections by clients that support it. Use the following directive to disable +# caching. +# +# tls-session-caching no + +# Change the default number of TLS sessions cached. A zero value sets the cache +# to unlimited size. The default size is 20480. +# +# tls-session-cache-size 5000 + +# Change the default timeout of cached TLS sessions. The default timeout is 300 +# seconds. +# +# tls-session-cache-timeout 60 + ################################# GENERAL ##################################### # By default Redis does not run as a daemon. Use 'yes' if you need it. @@ -208,11 +227,12 @@ daemonize no # supervision tree. Options: # supervised no - no supervision interaction # supervised upstart - signal upstart by putting Redis into SIGSTOP mode +# requires "expect stop" in your upstart job config # supervised systemd - signal systemd by writing READY=1 to $NOTIFY_SOCKET # supervised auto - detect upstart or systemd method based on # UPSTART_JOB or NOTIFY_SOCKET environment variables # Note: these supervision methods only signal "process is ready." -# They do not enable continuous liveness pings back to your supervisor. +# They do not enable continuous pings back to your supervisor. supervised no # If a pid file is specified, Redis writes it where specified at startup @@ -271,7 +291,7 @@ always-show-logo yes # Will save the DB if both the given number of seconds and the given # number of write operations against the DB occurred. # -# In the example below the behaviour will be to save: +# In the example below the behavior will be to save: # after 900 sec (15 min) if at least 1 key changed # after 300 sec (5 min) if at least 10 keys changed # after 60 sec if at least 10000 keys changed @@ -304,7 +324,7 @@ save 60 10000 stop-writes-on-bgsave-error yes # Compress string objects using LZF when dump .rdb databases? -# For default that's set to 'yes' as it's almost always a win. +# By default compression is enabled as it's almost always a win. # If you want to save some CPU in the saving child set it to 'no' but # the dataset will likely be bigger if you have compressible values or keys. rdbcompression yes @@ -392,11 +412,11 @@ dir ./ # still reply to client requests, possibly with out of date data, or the # data set may just be empty if this is the first synchronization. # -# 2) if replica-serve-stale-data is set to 'no' the replica will reply with -# an error "SYNC with master in progress" to all the kind of commands -# but to INFO, replicaOF, AUTH, PING, SHUTDOWN, REPLCONF, ROLE, CONFIG, -# SUBSCRIBE, UNSUBSCRIBE, PSUBSCRIBE, PUNSUBSCRIBE, PUBLISH, PUBSUB, -# COMMAND, POST, HOST: and LATENCY. +# 2) If replica-serve-stale-data is set to 'no' the replica will reply with +# an error "SYNC with master in progress" to all commands except: +# INFO, REPLICAOF, AUTH, PING, SHUTDOWN, REPLCONF, ROLE, CONFIG, SUBSCRIBE, +# UNSUBSCRIBE, PSUBSCRIBE, PUNSUBSCRIBE, PUBLISH, PUBSUB, COMMAND, POST, +# HOST and LATENCY. # replica-serve-stale-data yes @@ -467,7 +487,7 @@ repl-diskless-sync-delay 5 # # Replica can load the RDB it reads from the replication link directly from the # socket, or store the RDB to a file and read that file after it was completely -# recived from the master. +# received from the master. # # In many cases the disk is slower than the network, and storing and loading # the RDB file may increase replication time (and even increase the master's @@ -497,7 +517,8 @@ repl-diskless-load disabled # # It is important to make sure that this value is greater than the value # specified for repl-ping-replica-period otherwise a timeout will be detected -# every time there is low traffic between the master and the replica. +# every time there is low traffic between the master and the replica. The default +# value is 60 seconds. # # repl-timeout 60 @@ -522,21 +543,21 @@ repl-disable-tcp-nodelay no # partial resync is enough, just passing the portion of data the replica # missed while disconnected. # -# The bigger the replication backlog, the longer the time the replica can be -# disconnected and later be able to perform a partial resynchronization. +# The bigger the replication backlog, the longer the replica can endure the +# disconnect and later be able to perform a partial resynchronization. # -# The backlog is only allocated once there is at least a replica connected. +# The backlog is only allocated if there is at least one replica connected. # # repl-backlog-size 1mb -# After a master has no longer connected replicas for some time, the backlog -# will be freed. The following option configures the amount of seconds that -# need to elapse, starting from the time the last replica disconnected, for -# the backlog buffer to be freed. +# After a master has no connected replicas for some time, the backlog will be +# freed. The following option configures the amount of seconds that need to +# elapse, starting from the time the last replica disconnected, for the backlog +# buffer to be freed. # # Note that replicas never free the backlog for timeout, since they may be # promoted to masters later, and should be able to correctly "partially -# resynchronize" with the replicas: hence they should always accumulate backlog. +# resynchronize" with other replicas: hence they should always accumulate backlog. # # A value of 0 means to never release the backlog. # @@ -586,8 +607,8 @@ replica-priority 100 # Another place where this info is available is in the output of the # "ROLE" command of a master. # -# The listed IP and address normally reported by a replica is obtained -# in the following way: +# The listed IP address and port normally reported by a replica is +# obtained in the following way: # # IP: The address is auto detected by checking the peer address # of the socket used by the replica to connect with the master. @@ -597,7 +618,7 @@ replica-priority 100 # listen for connections. # # However when port forwarding or Network Address Translation (NAT) is -# used, the replica may be actually reachable via different IP and port +# used, the replica may actually be reachable via different IP and port # pairs. The following two options can be used by a replica in order to # report to its master a specific set of IP and port, so that both INFO # and ROLE will report those values. @@ -614,7 +635,7 @@ replica-priority 100 # This is implemented using an invalidation table that remembers, using # 16 millions of slots, what clients may have certain subsets of keys. In turn # this is used in order to send invalidation messages to clients. Please -# to understand more about the feature check this page: +# check this page to understand more about the feature: # # https://redis.io/topics/client-side-caching # @@ -646,7 +667,7 @@ replica-priority 100 ################################## SECURITY ################################### -# Warning: since Redis is pretty fast an outside user can try up to +# Warning: since Redis is pretty fast, an outside user can try up to # 1 million passwords per second against a modern box. This means that you # should use very strong passwords, otherwise they will be very easy to break. # Note that because the password is really a shared secret between the client @@ -670,7 +691,7 @@ replica-priority 100 # AUTH (or the HELLO command AUTH option) in order to be authenticated and # start to work. # -# The ACL rules that describe what an user can do are the following: +# The ACL rules that describe what a user can do are the following: # # on Enable the user: it is possible to authenticate as this user. # off Disable the user: it's no longer possible to authenticate @@ -698,7 +719,7 @@ replica-priority 100 # It is possible to specify multiple patterns. # allkeys Alias for ~* # resetkeys Flush the list of allowed keys patterns. -# > Add this passowrd to the list of valid password for the user. +# > Add this password to the list of valid password for the user. # For example >mypass will add "mypass" to the list. # This directive clears the "nopass" flag (see later). # < Remove this password from the list of valid passwords. @@ -743,17 +764,16 @@ replica-priority 100 # ACL LOG # # The ACL Log tracks failed commands and authentication events associated -# with ACLs. The ACL Log is useful to troubleshoot failed commands blocked -# by ACLs. The ACL Log is stored in and consumes memory. There is no limit -# to its length.You can reclaim memory with ACL LOG RESET or set a maximum -# length below. +# with ACLs. The ACL Log is useful to troubleshoot failed commands blocked +# by ACLs. The ACL Log is stored in memory. You can reclaim memory with +# ACL LOG RESET. Define the maximum entry length of the ACL Log below. acllog-max-len 128 # Using an external ACL file # # Instead of configuring users here in this file, it is possible to use # a stand-alone file just listing users. The two methods cannot be mixed: -# if you configure users here and at the same time you activate the exteranl +# if you configure users here and at the same time you activate the external # ACL file, the server will refuse to start. # # The format of the external ACL user file is exactly the same as the @@ -761,13 +781,13 @@ acllog-max-len 128 # # aclfile /etc/redis/users.acl -# IMPORTANT NOTE: starting with Redis 6 "requirepass" is just a compatiblity +# IMPORTANT NOTE: starting with Redis 6 "requirepass" is just a compatibility # layer on top of the new ACL system. The option effect will be just setting # the password for the default user. Clients will still authenticate using # AUTH as usually, or more explicitly with AUTH default # if they follow the new protocol: both will work. # -requirepass 123456 +requirepass maf@redis # Command renaming (DEPRECATED). # @@ -805,6 +825,11 @@ requirepass 123456 # Once the limit is reached Redis will close all the new connections sending # an error 'max number of clients reached'. # +# IMPORTANT: When Redis Cluster is used, the max number of connections is also +# shared with the cluster bus: every node in the cluster will use two +# connections, one incoming and another outgoing. It is important to size the +# limit accordingly in case of very large clusters. +# # maxclients 10000 ############################## MEMORY MANAGEMENT ################################ @@ -867,8 +892,8 @@ requirepass 123456 # LRU, LFU and minimal TTL algorithms are not precise algorithms but approximated # algorithms (in order to save memory), so you can tune it for speed or -# accuracy. For default Redis will check five keys and pick the one that was -# used less recently, you can change the sample size using the following +# accuracy. By default Redis will check five keys and pick the one that was +# used least recently, you can change the sample size using the following # configuration directive. # # The default of 5 produces good enough results. 10 Approximates very closely @@ -908,8 +933,8 @@ requirepass 123456 # it is possible to increase the expire "effort" that is normally set to # "1", to a greater value, up to the value "10". At its maximum value the # system will use more CPU, longer cycles (and technically may introduce -# more latency), and will tollerate less already expired keys still present -# in the system. It's a tradeoff betweeen memory, CPU and latecy. +# more latency), and will tolerate less already expired keys still present +# in the system. It's a tradeoff between memory, CPU and latency. # # active-expire-effort 1 @@ -977,7 +1002,7 @@ lazyfree-lazy-user-del no # # Now it is also possible to handle Redis clients socket reads and writes # in different I/O threads. Since especially writing is so slow, normally -# Redis users use pipelining in order to speedup the Redis performances per +# Redis users use pipelining in order to speed up the Redis performances per # core, and spawn multiple instances in order to scale more. Using I/O # threads it is possible to easily speedup two times Redis without resorting # to pipelining nor sharding of the instance. @@ -995,14 +1020,14 @@ lazyfree-lazy-user-del no # io-threads 2 # -# Setting io-threads to 1 will just use the main thread as usually. +# Setting io-threads to 1 will just use the main thread as usual. # When I/O threads are enabled, we only use threads for writes, that is # to thread the write(2) syscall and transfer the client buffers to the # socket. However it is also possible to enable threading of reads and # protocol parsing using the following configuration directive, by setting # it to yes: # -io-threads-do-reads yes +# io-threads-do-reads no # # Usually threading reads doesn't help much. # @@ -1012,9 +1037,40 @@ io-threads-do-reads yes # # NOTE 2: If you want to test the Redis speedup using redis-benchmark, make # sure you also run the benchmark itself in threaded mode, using the -# --threads option to match the number of Redis theads, otherwise you'll not +# --threads option to match the number of Redis threads, otherwise you'll not # be able to notice the improvements. +############################ KERNEL OOM CONTROL ############################## + +# On Linux, it is possible to hint the kernel OOM killer on what processes +# should be killed first when out of memory. +# +# Enabling this feature makes Redis actively control the oom_score_adj value +# for all its processes, depending on their role. The default scores will +# attempt to have background child processes killed before all others, and +# replicas killed before masters. +# +# Redis supports three options: +# +# no: Don't make changes to oom-score-adj (default). +# yes: Alias to "relative" see below. +# absolute: Values in oom-score-adj-values are written as is to the kernel. +# relative: Values are used relative to the initial value of oom_score_adj when +# the server starts and are then clamped to a range of -1000 to 1000. +# Because typically the initial value is 0, they will often match the +# absolute values. +oom-score-adj no + +# When oom-score-adj is used, this directive controls the specific values used +# for master, replica and background child processes. Values range -2000 to +# 2000 (higher means more likely to be killed). +# +# Unprivileged processes (not root, and without CAP_SYS_RESOURCE capabilities) +# can freely increase their value, but not decrease it below its initial +# settings. This means that setting oom-score-adj to "relative" and setting the +# oom-score-adj-values to positive values will always succeed. +oom-score-adj-values 0 200 800 + ############################## APPEND ONLY MODE ############################### # By default Redis asynchronously dumps the dataset on disk. This mode is @@ -1139,8 +1195,8 @@ aof-load-truncated yes # # [RDB file][AOF tail] # -# When loading Redis recognizes that the AOF file starts with the "REDIS" -# string and loads the prefixed RDB file, and continues loading the AOF +# When loading, Redis recognizes that the AOF file starts with the "REDIS" +# string and loads the prefixed RDB file, then continues loading the AOF # tail. aof-use-rdb-preamble yes @@ -1154,7 +1210,7 @@ aof-use-rdb-preamble yes # # When a long running script exceeds the maximum execution time only the # SCRIPT KILL and SHUTDOWN NOSAVE commands are available. The first can be -# used to stop a script that did not yet called write commands. The second +# used to stop a script that did not yet call any write commands. The second # is the only way to shut down the server in the case a write command was # already issued by the script but the user doesn't want to wait for the natural # termination of the script. @@ -1180,7 +1236,7 @@ lua-time-limit 5000 # Cluster node timeout is the amount of milliseconds a node must be unreachable # for it to be considered in failure state. -# Most other internal time limits are multiple of the node timeout. +# Most other internal time limits are a multiple of the node timeout. # # cluster-node-timeout 15000 @@ -1207,18 +1263,18 @@ lua-time-limit 5000 # the failover if, since the last interaction with the master, the time # elapsed is greater than: # -# (node-timeout * replica-validity-factor) + repl-ping-replica-period +# (node-timeout * cluster-replica-validity-factor) + repl-ping-replica-period # -# So for example if node-timeout is 30 seconds, and the replica-validity-factor +# So for example if node-timeout is 30 seconds, and the cluster-replica-validity-factor # is 10, and assuming a default repl-ping-replica-period of 10 seconds, the # replica will not try to failover if it was not able to talk with the master # for longer than 310 seconds. # -# A large replica-validity-factor may allow replicas with too old data to failover +# A large cluster-replica-validity-factor may allow replicas with too old data to failover # a master, while a too small value may prevent the cluster from being able to # elect a replica at all. # -# For maximum availability, it is possible to set the replica-validity-factor +# For maximum availability, it is possible to set the cluster-replica-validity-factor # to a value of 0, which means, that replicas will always try to failover the # master regardless of the last time they interacted with the master. # (However they'll always try to apply a delay proportional to their @@ -1249,7 +1305,7 @@ lua-time-limit 5000 # cluster-migration-barrier 1 # By default Redis Cluster nodes stop accepting queries if they detect there -# is at least an hash slot uncovered (no available node is serving it). +# is at least a hash slot uncovered (no available node is serving it). # This way if the cluster is partially down (for example a range of hash slots # are no longer covered) all the cluster becomes, eventually, unavailable. # It automatically returns available as soon as all the slots are covered again. @@ -1272,18 +1328,18 @@ lua-time-limit 5000 # cluster-replica-no-failover no # This option, when set to yes, allows nodes to serve read traffic while the -# the cluster is in a down state, as long as it believes it owns the slots. +# the cluster is in a down state, as long as it believes it owns the slots. # -# This is useful for two cases. The first case is for when an application +# This is useful for two cases. The first case is for when an application # doesn't require consistency of data during node failures or network partitions. # One example of this is a cache, where as long as the node has the data it -# should be able to serve it. +# should be able to serve it. # -# The second use case is for configurations that don't meet the recommended -# three shards but want to enable cluster mode and scale later. A +# The second use case is for configurations that don't meet the recommended +# three shards but want to enable cluster mode and scale later. A # master outage in a 1 or 2 shard configuration causes a read/write outage to the # entire cluster without this option set, with it set there is only a write outage. -# Without a quorum of masters, slot ownership will not change automatically. +# Without a quorum of masters, slot ownership will not change automatically. # # cluster-allow-reads-when-down no @@ -1304,7 +1360,7 @@ lua-time-limit 5000 # * cluster-announce-port # * cluster-announce-bus-port # -# Each instruct the node about its address, client port, and cluster message +# Each instructs the node about its address, client port, and cluster message # bus port. The information is then published in the header of the bus packets # so that other nodes will be able to correctly map the address of the node # publishing the information. @@ -1315,7 +1371,7 @@ lua-time-limit 5000 # Note that when remapped, the bus port may not be at the fixed offset of # clients port + 10000, so you can specify any port and bus-port depending # on how they get remapped. If the bus-port is not set, a fixed offset of -# 10000 will be used as usually. +# 10000 will be used as usual. # # Example: # @@ -1444,7 +1500,7 @@ notify-keyspace-events "" # two kind of inline requests that were anyway illegal: an empty request # or any request that starts with "/" (there are no Redis commands starting # with such a slash). Normal RESP2/RESP3 requests are completely out of the -# path of the Gopher protocol implementation and are served as usually as well. +# path of the Gopher protocol implementation and are served as usual as well. # # If you open a connection to Redis when Gopher is enabled and send it # a string like "/foo", if there is a key named "/foo" it is served via the @@ -1468,8 +1524,11 @@ notify-keyspace-events "" # # So use the 'requirepass' option to protect your instance. # -# To enable Gopher support uncomment the following line and set -# the option from no (the default) to yes. +# Note that Gopher is not currently supported when 'io-threads-do-reads' +# is enabled. +# +# To enable Gopher support, uncomment the following line and set the option +# from no (the default) to yes. # # gopher-enabled no @@ -1616,8 +1675,8 @@ client-output-buffer-limit pubsub 32mb 8mb 60 # client-query-buffer-limit 1gb # In the Redis protocol, bulk requests, that are, elements representing single -# strings, are normally limited ot 512 mb. However you can change this limit -# here. +# strings, are normally limited to 512 mb. However you can change this limit +# here, but must be 1mb or greater # # proto-max-bulk-len 512mb @@ -1645,7 +1704,7 @@ hz 10 # # Since the default HZ value by default is conservatively set to 10, Redis # offers, and enables by default, the ability to use an adaptive HZ value -# which will temporary raise when there are many connected clients. +# which will temporarily raise when there are many connected clients. # # When dynamic HZ is enabled, the actual configured HZ will be used # as a baseline, but multiples of the configured HZ value will be actually @@ -1712,7 +1771,7 @@ rdb-save-incremental-fsync yes # for the key counter to be divided by two (or decremented if it has a value # less <= 10). # -# The default value for the lfu-decay-time is 1. A Special value of 0 means to +# The default value for the lfu-decay-time is 1. A special value of 0 means to # decay the counter every time it happens to be scanned. # # lfu-log-factor 10 @@ -1732,7 +1791,7 @@ rdb-save-incremental-fsync yes # restart is needed in order to lower the fragmentation, or at least to flush # away all the data and create it again. However thanks to this feature # implemented by Oran Agra for Redis 4.0 this process can happen at runtime -# in an "hot" way, while the server is running. +# in a "hot" way, while the server is running. # # Basically when the fragmentation is over a certain level (see the # configuration options below) Redis will start to create new copies of the @@ -1782,4 +1841,37 @@ rdb-save-incremental-fsync yes # the main dictionary scan # active-defrag-max-scan-fields 1000 -# Timestamp 10:16 AM, May.15, 2020 +# Jemalloc background thread for purging will be enabled by default +jemalloc-bg-thread yes + +# It is possible to pin different threads and processes of Redis to specific +# CPUs in your system, in order to maximize the performances of the server. +# This is useful both in order to pin different Redis threads in different +# CPUs, but also in order to make sure that multiple Redis instances running +# in the same host will be pinned to different CPUs. +# +# Normally you can do this using the "taskset" command, however it is also +# possible to this via Redis configuration directly, both in Linux and FreeBSD. +# +# You can pin the server/IO threads, bio threads, aof rewrite child process, and +# the bgsave child process. The syntax to specify the cpu list is the same as +# the taskset command: +# +# Set redis server/io threads to cpu affinity 0,2,4,6: +# server_cpulist 0-7:2 +# +# Set bio threads to cpu affinity 1,3: +# bio_cpulist 1,3 +# +# Set aof rewrite child process to cpu affinity 8,9,10,11: +# aof_rewrite_cpulist 8-11 +# +# Set bgsave child process to cpu affinity 1,10,11 +# bgsave_cpulist 1,10-11 + +# In some cases redis will emit warnings and even refuse to start if it detects +# that the system is in bad state, it is possible to suppress these warnings +# by setting the following config which takes a space delimited list of warnings +# to suppress +# +# ignore-warnings ARM64-COW-BUG diff --git a/docker/config/spring-boot-admin/application.yml b/docker/config/spring-boot-admin/application.yml new file mode 100644 index 00000000..c16a9d4c --- /dev/null +++ b/docker/config/spring-boot-admin/application.yml @@ -0,0 +1,6 @@ +greeting: "Hello, World! From Consul config center!" + +maf: + configuration: + excel: + maximum-row-count: 3000 diff --git a/docker/docker-compose.development-docker.yml b/docker/docker-compose.development-docker.yml deleted file mode 100644 index 6b3a4ff3..00000000 --- a/docker/docker-compose.development-docker.yml +++ /dev/null @@ -1,301 +0,0 @@ -version: "3.7" - -################################################################################ -# ATTENTIONS of Docker Compose # -################################################################################ -# 1. Pattern of 'container_name' must be: # -# [service-name]-[system-short-name]-[environment-alias] # -# For instance, there is a 'MySQL service' for 'Muscle and Fitness Server', # -# the 'container_name' must be: mysql-maf.dev_dkr. # -# In Kubernetes, 'container_name' must not be set. # -# 2. ${TAG} is defined in file '.env'. # -# 3. The differences between each environment docker-compose.yml: # -# a. Environmental suffix. There are 4 types of environmental suffix: # -# * '-dev_dkr' # -# * '-test' # -# * '-stage' # -# * '-prod' # -# b. 'subnet' and 'ipv4_address'. # -# 4. IP range definition (for instance of 'development-docker'): # -# a. 172.16.1.10 ~ 172.16.1.19: middleware of Muscle and Fitness # -# b. 172.16.1.19 ~ 172.16.1.253: microservice of Muscle and Fitness # -# c. 172.16.1.254: gateway for Muscle and Fitness # -# CAUTION: 172.16.1.255 is not available for container. # -# 5. Conceal some service ports: # -# a. api-portal # -# b. auth-center # -# c. exercise-mis # -# d. muscle-mis # -# 6. Define timezone for environment variable: Asia/Hong_Kong # -# 7. Define 'depends_on' for service # -################################################################################ - -################################################ -# Private Network Subnet Assignment # -################################################ -# Subnet # Environment (profile's ID) # -#-----------------#----------------------------# -# 172.16.1.0/24 # development-docker # -# 172.16.2.0/24 # test # -# 172.16.3.0/24 # stage # -# 172.16.4.0/24 # production # -################################################ - -services: - ################################################################################ - # Middleware of Muscle and Fitness # - ################################################################################ - mysql: - container_name: maf.mysql.dev - image: mysql:latest - environment: - MYSQL_ROOT_PASSWORD: "jm@mysql" - MYSQL_DATABASE: muscle_and_fitness - TZ: Asia/Hong_Kong - ports: - - "3306:3306" - restart: always - volumes: - - ~/docker-file-mapping/maf.mysql.dev_dkr:/var/lib/mysql - - ./script/mysql-init-script:/docker-entrypoint-initdb.d - command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci - networks: - muscle_and_fitness_network: - - redis: - container_name: maf.redis.dev - image: redis:latest - ports: - - "6379:6379" - restart: always - volumes: - - ~/docker-file-mapping/maf.redis.dev_dkr:/data - - ./script/redis/redis.conf:/usr/local/etc/redis/redis.conf - environment: - TZ: Asia/Hong_Kong - command: "redis-server /usr/local/etc/redis/redis.conf" - networks: - muscle_and_fitness_network: - - atmoz-sftp: - container_name: maf.atmoz-sftp.dev - image: atmoz/sftp:latest - ports: - - "23:22" - restart: always - volumes: - - ~/docker-file-mapping/maf.atmoz-sftp.dev_dkr:/home/johnny/upload - environment: - TZ: Asia/Hong_Kong - command: "johnny:atmoz@sftp:::upload" - networks: - muscle_and_fitness_network: - - zipkin-cassandra: - image: openzipkin/zipkin-cassandra - # Uncomment to use DSE instead (minimum version 5.1) - # image: datastax/dse-server:5.1.20 - container_name: maf.zipkin-cassandra.dev - environment: - CASSANDRA_USERNAME: cassandra_admin - CASSANDRA_PASSWORD: cassandra_password - # Uncomment to expose the storage port for testing - # ports: - # - "9042:9042" - networks: - muscle_and_fitness_network: - - zipkin-dependencies: - image: openzipkin/zipkin-dependencies - container_name: maf.zipkin-dependencies.dev - entrypoint: crond -f - environment: - # Uncomment to see dependency processing logs - ZIPKIN_LOG_LEVEL: DEBUG - STORAGE_TYPE: cassandra3 - CASSANDRA_USERNAME: cassandra_admin - CASSANDRA_PASSWORD: cassandra_password - CASSANDRA_CONTACT_POINTS: 172.16.1.13:9042 - depends_on: - - zipkin-cassandra - networks: - muscle_and_fitness_network: - - open-zipkin: - container_name: maf.open-zipkin.dev - image: openzipkin/zipkin - # Environment settings are defined here https://github.com/openzipkin/zipkin/blob/master/zipkin-server/README.md#environment-variables - depends_on: - zipkin-cassandra: - condition: service_healthy - environment: - STORAGE_TYPE: cassandra3 - CASSANDRA_CONTACT_POINTS: maf.zipkin-cassandra.dev:9042 - # Uncomment to configure authentication - CASSANDRA_USERNAME: cassandra_admin - CASSANDRA_PASSWORD: cassandra_password - # Uncomment to enable request logging (TRACE shows query values) - command: --logging.level.com.datastax.oss.driver.internal.core.tracker.RequestLogger=TRACE - JAVA_OPTS: -Xms128m -Xmx128m -XX:+ExitOnOutOfMemoryError - TZ: Asia/Hong_Kong - # Uncomment to enable scribe - # - SCRIBE_ENABLED=true - # Uncomment to enable self-tracing - # - SELF_TRACING_ENABLED=true - # Uncomment to enable debug logging - # - JAVA_OPTS=-Dlogging.level.zipkin2=DEBUG - ports: - # Port used for the Zipkin UI and HTTP Api - - 9411:9411 - # Uncomment if you set SCRIBE_ENABLED=true - # - 9410:9410 - restart: always - networks: - muscle_and_fitness_network: - - ################################################################################ - # Microservice of Muscle and Fitness # - ################################################################################ - # Infrastructure Service # - #------------------------------------------------------------------------------# - service-registry: - container_name: maf.service-registry.dev - image: "ijohnnymiller/muscle-and-fitness-server.service-registry:${TAG}" - depends_on: - open-zipkin: - condition: service_healthy - ports: - - "8760:8760" - restart: always - volumes: - - ~/docker-file-mapping/maf.logs:/logs - environment: - JAVA_TOOL_OPTIONS: -Xms128m -Xmx128m -Dspring.profiles.active=development-local - TZ: Asia/Hong_Kong - networks: - muscle_and_fitness_network: - - spring-boot-admin: - container_name: maf.spring-boot-admin.dev - image: "ijohnnymiller/muscle-and-fitness-server.spring-boot-admin:${TAG}" - depends_on: - service-registry: - condition: service_started - ports: - - "8761:8761" - volumes: - - ~/docker-file-mapping/maf.logs:/logs - environment: - JAVA_TOOL_OPTIONS: -Xms128m -Xmx128m -Dspring.profiles.active=development-local - TZ: Asia/Hong_Kong - networks: - muscle_and_fitness_network: - - api-portal: - container_name: maf.api-portal.dev - image: "ijohnnymiller/muscle-and-fitness-server.api-portal:${TAG}" - depends_on: - mysql: - condition: service_started - redis: - condition: service_started - atmoz-sftp: - condition: service_started - service-registry: - condition: service_started - restart: always - volumes: - - ~/docker-file-mapping/maf.logs:/logs - environment: - JAVA_TOOL_OPTIONS: -Xms128m -Xmx128m -Dspring.profiles.active=development-local - TZ: Asia/Hong_Kong - networks: - muscle_and_fitness_network: - - ################################################################################ - # Microservice of Muscle and Fitness # - ################################################################################ - # Business Service # - #------------------------------------------------------------------------------# - auth-center: - container_name: maf.auth-center.dev - image: "ijohnnymiller/muscle-and-fitness-server.auth-center:${TAG}" - depends_on: - mysql: - condition: service_started - service-registry: - condition: service_started - restart: always - volumes: - - ~/docker-file-mapping/maf.logs:/logs - environment: - JAVA_TOOL_OPTIONS: -Xms128m -Xmx128m -Dspring.profiles.active=development-local - TZ: Asia/Hong_Kong - networks: - muscle_and_fitness_network: - - exercise-mis: - container_name: maf.exercise-mis.dev - image: "ijohnnymiller/muscle-and-fitness-server.exercise-mis:${TAG}" - depends_on: - mysql: - condition: service_started - service-registry: - condition: service_started - restart: always - volumes: - - ~/docker-file-mapping/maf.logs:/logs - environment: - JAVA_TOOL_OPTIONS: -Xms128m -Xmx128m -Dspring.profiles.active=development-local - TZ: Asia/Hong_Kong - networks: - muscle_and_fitness_network: - - muscle-mis: - container_name: maf.muscle-mis.dev - image: "ijohnnymiller/muscle-and-fitness-server.muscle-mis:${TAG}" - depends_on: - mysql: - condition: service_started - service-registry: - condition: service_started - restart: always - volumes: - - ~/docker-file-mapping/maf.logs:/logs - environment: - JAVA_TOOL_OPTIONS: -Xms128m -Xmx128m -Dspring.profiles.active=development-local - TZ: Asia/Hong_Kong - networks: - muscle_and_fitness_network: - - ################################################################################ - # Gateway for Muscle and Fitness # - ################################################################################ - gateway: - container_name: maf.gateway.dev - image: "ijohnnymiller/muscle-and-fitness-server.gateway:${TAG}" - depends_on: - service-registry: - condition: service_started - ports: - - "8080:8080" - restart: always - volumes: - - ~/docker-file-mapping/maf.logs:/logs - environment: - JAVA_TOOL_OPTIONS: -Xms128m -Xmx128m -Dspring.profiles.active=development-local - TZ: Asia/Hong_Kong - networks: - muscle_and_fitness_network: - -################################################################################ -# Network for Muscle and Fitness # -################################################################################ -networks: - muscle_and_fitness_network: - ipam: - driver: default -# config: - # Private Network (20-bit block): https://en.wikipedia.org/wiki/Private_network - # IP range of the private network: https://ipgeolocation.io/browse/ipv4/172.16.1.0/24 -# - subnet: "172.16.1.0/24" diff --git a/docker/docker-compose.production.yml b/docker/docker-compose.production.yml deleted file mode 100644 index 67fdd469..00000000 --- a/docker/docker-compose.production.yml +++ /dev/null @@ -1,260 +0,0 @@ -version: "3.7" - -################################################################################ -# ATTENTIONS of Docker Compose # -################################################################################ -# 1. Pattern of 'container_name' must be: # -# [service-name]-[system-short-name]-[environment-alias] # -# For instance, there is a 'MySQL service' for 'Muscle and Fitness Server', # -# the 'container_name' must be: mysql-maf-dev_dkr. # -# In Kubernetes, 'container_name' must not be set. # -# 2. ${TAG} is defined in file '.env'. # -# 3. The differences between each environment docker-compose.yml: # -# a. Environmental suffix. There are 4 types of environmental suffix: # -# * '-dev_dkr' # -# * '-test' # -# * '-stage' # -# * '-prod' # -# b. 'subnet' and 'ipv4_address'. # -# 4. IP range definition (for instance of 'development-docker'): # -# a. 172.16.1.10 ~ 172.16.1.19: middleware of Muscle and Fitness # -# b. 172.16.1.19 ~ 172.16.1.253: microservice of Muscle and Fitness # -# c. 172.16.1.254: gateway for Muscle and Fitness # -# CAUTION: 172.16.1.255 is not available for container. # -# 5. Conceal some service ports: # -# a. api-portal # -# b. auth-center # -# c. exercise-mis # -# d. muscle-mis # -# 6. Define timezone for environment variable: Asia/Hong_Kong # -# 7. Define 'depends_on' for service # -################################################################################ - -################################################ -#       Private Network Subnet Assignment      # -################################################ -#     Subnet      # Environment (profile's ID) # -#-----------------#----------------------------# -#  172.16.1.0/24  #     development-docker     # -#  172.16.2.0/24  #            test            # -#  172.16.3.0/24  #           stage            # -#  172.16.4.0/24  #         production         # -################################################ - -services: - ################################################################################ - # Middleware of Muscle and Fitness # - ################################################################################ - mysql: - container_name: mysql-maf-prod - image: mysql:latest - environment: - MYSQL_ROOT_PASSWORD: "jm@mysql" - MYSQL_DATABASE: muscle_and_fitness - TZ: Asia/Hong_Kong - ports: - - "3306:3306" - restart: always - volumes: - - /Users/johnny/docker-file-mapping/mysql-maf-prod:/var/lib/mysql - - ./script/mysql-init-script:/docker-entrypoint-initdb.d - command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci - networks: - muscle_and_fitness_network: - ipv4_address: 172.16.4.10 - - redis: - container_name: redis-maf-prod - image: redis:latest - ports: - - "6379:6379" - restart: always - volumes: - - /Users/johnny/docker-file-mapping/redis-maf-prod:/data - - ./script/redis/redis.conf:/usr/local/etc/redis/redis.conf - environment: - TZ: Asia/Hong_Kong - command: "redis-server /usr/local/etc/redis/redis.conf" - networks: - muscle_and_fitness_network: - ipv4_address: 172.16.4.11 - - atmoz-sftp: - container_name: atmoz-sftp-maf-prod - image: atmoz/sftp:latest - ports: - - "23:22" - restart: always - volumes: - - /Users/johnny/docker-file-mapping/atmoz-sftp-maf-prod:/home/johnny/upload - environment: - TZ: Asia/Hong_Kong - command: "johnny:atmoz@sftp:::upload" - networks: - muscle_and_fitness_network: - ipv4_address: 172.16.4.12 - - open-zipkin: - container_name: open-zipkin-maf-prod - image: openzipkin/zipkin - # Environment settings are defined here https://github.com/openzipkin/zipkin/blob/master/zipkin-server/README.md#environment-variables - depends_on: - - mysql - environment: - STORAGE_TYPE: mysql - MYSQL_DB: zipkin - MYSQL_USER: root - MYSQL_PASS: "jm@mysql" - MYSQL_HOST: 172.16.4.10 - MYSQL_TCP_PORT: 3306 - TZ: Asia/Hong_Kong - # Uncomment to enable scribe - # - SCRIBE_ENABLED=true - # Uncomment to enable self-tracing - # - SELF_TRACING_ENABLED=true - # Uncomment to enable debug logging - # - JAVA_OPTS=-Dlogging.level.zipkin2=DEBUG - ports: - # Port used for the Zipkin UI and HTTP Api - - 9411:9411 - # Uncomment if you set SCRIBE_ENABLED=true - # - 9410:9410 - restart: always - networks: - muscle_and_fitness_network: - ipv4_address: 172.16.4.13 - - ################################################################################ - # Microservice of Muscle and Fitness # - ################################################################################ - # Infrastructure Service # - #------------------------------------------------------------------------------# - service-registry: - container_name: service-registry-maf-prod - image: "ijohnnymiller/muscle-and-fitness-server.service-registry-prod:${TAG}" - depends_on: - - open-zipkin - ports: - - "8760:8760" - restart: always - volumes: - - /Users/johnny/docker-file-mapping/logs-maf-prod:/logs-prod - environment: - TZ: Asia/Hong_Kong - networks: - muscle_and_fitness_network: - ipv4_address: 172.16.4.20 - - spring-boot-admin: - container_name: spring-boot-admin-maf-prod - image: "ijohnnymiller/muscle-and-fitness-server.spring-boot-admin-prod:${TAG}" - depends_on: - - service-registry - ports: - - "8761:8761" - volumes: - - /Users/johnny/docker-file-mapping/logs-maf-prod:/logs-prod - environment: - TZ: Asia/Hong_Kong - networks: - muscle_and_fitness_network: - ipv4_address: 172.16.4.21 - - api-portal: - container_name: api-portal-maf-prod - image: "ijohnnymiller/muscle-and-fitness-server.api-portal-prod:${TAG}" - depends_on: - - mysql - - redis - - atmoz-sftp - - service-registry - restart: always - volumes: - - /Users/johnny/docker-file-mapping/logs-maf-prod:/logs-prod - environment: - TZ: Asia/Hong_Kong - networks: - muscle_and_fitness_network: - ipv4_address: 172.16.4.22 - - ################################################################################ - # Microservice of Muscle and Fitness # - ################################################################################ - # Business Service # - #------------------------------------------------------------------------------# - auth-center: - container_name: auth-center-maf-prod - image: "ijohnnymiller/muscle-and-fitness-server.auth-center-prod:${TAG}" - depends_on: - - mysql - - service-registry - restart: always - volumes: - - /Users/johnny/docker-file-mapping/logs-maf-prod:/logs-prod - environment: - TZ: Asia/Hong_Kong - networks: - muscle_and_fitness_network: - ipv4_address: 172.16.4.23 - - exercise-mis: - container_name: exercise-mis-maf-prod - image: "ijohnnymiller/muscle-and-fitness-server.exercise-mis-prod:${TAG}" - depends_on: - - mysql - - service-registry - restart: always - volumes: - - /Users/johnny/docker-file-mapping/logs-maf-prod:/logs-prod - environment: - TZ: Asia/Hong_Kong - networks: - muscle_and_fitness_network: - ipv4_address: 172.16.4.24 - - muscle-mis: - container_name: muscle-mis-maf-prod - image: "ijohnnymiller/muscle-and-fitness-server.muscle-mis-prod:${TAG}" - depends_on: - - mysql - - service-registry - restart: always - volumes: - - /Users/johnny/docker-file-mapping/logs-maf-prod:/logs-prod - environment: - TZ: Asia/Hong_Kong - networks: - muscle_and_fitness_network: - ipv4_address: 172.16.4.25 - - ################################################################################ - # Gateway for Muscle and Fitness # - ################################################################################ - gateway: - container_name: gateway-maf-prod - image: "ijohnnymiller/muscle-and-fitness-server.gateway-prod:${TAG}" - depends_on: - - service-registry - ports: - - "8080:8080" - restart: always - volumes: - - /Users/johnny/docker-file-mapping/logs-maf-prod:/logs-prod - environment: - TZ: Asia/Hong_Kong - networks: - muscle_and_fitness_network: - # Gateway uses the last IP of the subnet - ipv4_address: 172.16.4.254 - -################################################################################ -# Network for Muscle and Fitness # -################################################################################ -networks: - muscle_and_fitness_network: - ipam: - driver: default - config: - # Private Network (20-bit block): https://en.wikipedia.org/wiki/Private_network - # IP range of the private network: https://ipgeolocation.io/browse/ipv4/172.16.4.0/24 - - subnet: "172.16.4.0/24" diff --git a/docker/docker-compose.stage.yml b/docker/docker-compose.stage.yml deleted file mode 100644 index 170add50..00000000 --- a/docker/docker-compose.stage.yml +++ /dev/null @@ -1,260 +0,0 @@ -version: "3.7" - -################################################################################ -# ATTENTIONS of Docker Compose # -################################################################################ -# 1. Pattern of 'container_name' must be: # -# [service-name]-[system-short-name]-[environment-alias] # -# For instance, there is a 'MySQL service' for 'Muscle and Fitness Server', # -# the 'container_name' must be: mysql-maf-dev_dkr. # -# In Kubernetes, 'container_name' must not be set. # -# 2. ${TAG} is defined in file '.env'. # -# 3. The differences between each environment docker-compose.yml: # -# a. Environmental suffix. There are 4 types of environmental suffix: # -# * '-dev_dkr' # -# * '-test' # -# * '-stage' # -# * '-prod' # -# b. 'subnet' and 'ipv4_address'. # -# 4. IP range definition (for instance of 'development-docker'): # -# a. 172.16.1.10 ~ 172.16.1.19: middleware of Muscle and Fitness # -# b. 172.16.1.19 ~ 172.16.1.253: microservice of Muscle and Fitness # -# c. 172.16.1.254: gateway for Muscle and Fitness # -# CAUTION: 172.16.1.255 is not available for container. # -# 5. Conceal some service ports: # -# a. api-portal # -# b. auth-center # -# c. exercise-mis # -# d. muscle-mis # -# 6. Define timezone for environment variable: Asia/Hong_Kong # -# 7. Define 'depends_on' for service # -################################################################################ - -################################################ -#       Private Network Subnet Assignment      # -################################################ -#     Subnet      # Environment (profile's ID) # -#-----------------#----------------------------# -#  172.16.1.0/24  #     development-docker     # -#  172.16.2.0/24  #            test            # -#  172.16.3.0/24  #           stage            # -#  172.16.4.0/24  #         production         # -################################################ - -services: - ################################################################################ - # Middleware of Muscle and Fitness # - ################################################################################ - mysql: - container_name: mysql-maf-stage - image: mysql:latest - environment: - MYSQL_ROOT_PASSWORD: "jm@mysql" - MYSQL_DATABASE: muscle_and_fitness - TZ: Asia/Hong_Kong - ports: - - "3306:3306" - restart: always - volumes: - - /Users/johnny/docker-file-mapping/mysql-maf-stage:/var/lib/mysql - - ./script/mysql-init-script:/docker-entrypoint-initdb.d - command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci - networks: - muscle_and_fitness_network: - ipv4_address: 172.16.3.10 - - redis: - container_name: redis-maf-stage - image: redis:latest - ports: - - "6379:6379" - restart: always - volumes: - - /Users/johnny/docker-file-mapping/redis-maf-stage:/data - - ./script/redis/redis.conf:/usr/local/etc/redis/redis.conf - environment: - TZ: Asia/Hong_Kong - command: "redis-server /usr/local/etc/redis/redis.conf" - networks: - muscle_and_fitness_network: - ipv4_address: 172.16.3.11 - - atmoz-sftp: - container_name: atmoz-sftp-maf-stage - image: atmoz/sftp:latest - ports: - - "23:22" - restart: always - volumes: - - /Users/johnny/docker-file-mapping/atmoz-sftp-maf-stage:/home/johnny/upload - environment: - TZ: Asia/Hong_Kong - command: "johnny:atmoz@sftp:::upload" - networks: - muscle_and_fitness_network: - ipv4_address: 172.16.3.12 - - open-zipkin: - container_name: open-zipkin-maf-stage - image: openzipkin/zipkin - # Environment settings are defined here https://github.com/openzipkin/zipkin/blob/master/zipkin-server/README.md#environment-variables - depends_on: - - mysql - environment: - STORAGE_TYPE: mysql - MYSQL_DB: zipkin - MYSQL_USER: root - MYSQL_PASS: "jm@mysql" - MYSQL_HOST: 172.16.3.10 - MYSQL_TCP_PORT: 3306 - TZ: Asia/Hong_Kong - # Uncomment to enable scribe - # - SCRIBE_ENABLED=true - # Uncomment to enable self-tracing - # - SELF_TRACING_ENABLED=true - # Uncomment to enable debug logging - # - JAVA_OPTS=-Dlogging.level.zipkin2=DEBUG - ports: - # Port used for the Zipkin UI and HTTP Api - - 9411:9411 - # Uncomment if you set SCRIBE_ENABLED=true - # - 9410:9410 - restart: always - networks: - muscle_and_fitness_network: - ipv4_address: 172.16.3.13 - - ################################################################################ - # Microservice of Muscle and Fitness # - ################################################################################ - # Infrastructure Service # - #------------------------------------------------------------------------------# - service-registry: - container_name: service-registry-maf-stage - image: "ijohnnymiller/muscle-and-fitness-server.service-registry-stage:${TAG}" - depends_on: - - open-zipkin - ports: - - "8760:8760" - restart: always - volumes: - - /Users/johnny/docker-file-mapping/logs-maf-stage:/logs-stage - environment: - TZ: Asia/Hong_Kong - networks: - muscle_and_fitness_network: - ipv4_address: 172.16.3.20 - - spring-boot-admin: - container_name: spring-boot-admin-maf-stage - image: "ijohnnymiller/muscle-and-fitness-server.spring-boot-admin-stage:${TAG}" - depends_on: - - service-registry - ports: - - "8761:8761" - volumes: - - /Users/johnny/docker-file-mapping/logs-maf-stage:/logs-stage - environment: - TZ: Asia/Hong_Kong - networks: - muscle_and_fitness_network: - ipv4_address: 172.16.3.21 - - api-portal: - container_name: api-portal-maf-stage - image: "ijohnnymiller/muscle-and-fitness-server.api-portal-stage:${TAG}" - depends_on: - - mysql - - redis - - atmoz-sftp - - service-registry - restart: always - volumes: - - /Users/johnny/docker-file-mapping/logs-maf-stage:/logs-stage - environment: - TZ: Asia/Hong_Kong - networks: - muscle_and_fitness_network: - ipv4_address: 172.16.3.22 - - ################################################################################ - # Microservice of Muscle and Fitness # - ################################################################################ - # Business Service # - #------------------------------------------------------------------------------# - auth-center: - container_name: auth-center-maf-stage - image: "ijohnnymiller/muscle-and-fitness-server.auth-center-stage:${TAG}" - depends_on: - - mysql - - service-registry - restart: always - volumes: - - /Users/johnny/docker-file-mapping/logs-maf-stage:/logs-stage - environment: - TZ: Asia/Hong_Kong - networks: - muscle_and_fitness_network: - ipv4_address: 172.16.3.23 - - exercise-mis: - container_name: exercise-mis-maf-stage - image: "ijohnnymiller/muscle-and-fitness-server.exercise-mis-stage:${TAG}" - depends_on: - - mysql - - service-registry - restart: always - volumes: - - /Users/johnny/docker-file-mapping/logs-maf-stage:/logs-stage - environment: - TZ: Asia/Hong_Kong - networks: - muscle_and_fitness_network: - ipv4_address: 172.16.3.24 - - muscle-mis: - container_name: muscle-mis-maf-stage - image: "ijohnnymiller/muscle-and-fitness-server.muscle-mis-stage:${TAG}" - depends_on: - - mysql - - service-registry - restart: always - volumes: - - /Users/johnny/docker-file-mapping/logs-maf-stage:/logs-stage - environment: - TZ: Asia/Hong_Kong - networks: - muscle_and_fitness_network: - ipv4_address: 172.16.3.25 - - ################################################################################ - # Gateway for Muscle and Fitness # - ################################################################################ - gateway: - container_name: gateway-maf-stage - image: "ijohnnymiller/muscle-and-fitness-server.gateway-stage:${TAG}" - depends_on: - - service-registry - ports: - - "8080:8080" - restart: always - volumes: - - /Users/johnny/docker-file-mapping/logs-maf-stage:/logs-stage - environment: - TZ: Asia/Hong_Kong - networks: - muscle_and_fitness_network: - # Gateway uses the last IP of the subnet - ipv4_address: 172.16.3.254 - -################################################################################ -# Network for Muscle and Fitness # -################################################################################ -networks: - muscle_and_fitness_network: - ipam: - driver: default - config: - # Private Network (20-bit block): https://en.wikipedia.org/wiki/Private_network - # IP range of the private network: https://ipgeolocation.io/browse/ipv4/172.16.3.0/24 - - subnet: "172.16.3.0/24" diff --git a/docker/docker-compose.test.yml b/docker/docker-compose.test.yml deleted file mode 100644 index 59cbe5ed..00000000 --- a/docker/docker-compose.test.yml +++ /dev/null @@ -1,260 +0,0 @@ -version: "3.7" - -################################################################################ -# ATTENTIONS of Docker Compose # -################################################################################ -# 1. Pattern of 'container_name' must be: # -# [service-name]-[system-short-name]-[environment-alias] # -# For instance, there is a 'MySQL service' for 'Muscle and Fitness Server', # -# the 'container_name' must be: mysql-maf-dev_dkr. # -# In Kubernetes, 'container_name' must not be set. # -# 2. ${TAG} is defined in file '.env'. # -# 3. The differences between each environment docker-compose.yml: # -# a. Environmental suffix. There are 4 types of environmental suffix: # -# * '-dev_dkr' # -# * '-test' # -# * '-stage' # -# * '-prod' # -# b. 'subnet' and 'ipv4_address'. # -# 4. IP range definition (for instance of 'development-docker'): # -# a. 172.16.1.10 ~ 172.16.1.19: middleware of Muscle and Fitness # -# b. 172.16.1.19 ~ 172.16.1.253: microservice of Muscle and Fitness # -# c. 172.16.1.254: gateway for Muscle and Fitness # -# CAUTION: 172.16.1.255 is not available for container. # -# 5. Conceal some service ports: # -# a. api-portal # -# b. auth-center # -# c. exercise-mis # -# d. muscle-mis # -# 6. Define timezone for environment variable: Asia/Hong_Kong # -# 7. Define 'depends_on' for service # -################################################################################ - -################################################ -#       Private Network Subnet Assignment      # -################################################ -#     Subnet      # Environment (profile's ID) # -#-----------------#----------------------------# -#  172.16.1.0/24  #     development-docker     # -#  172.16.2.0/24  #            test            # -#  172.16.3.0/24  #           stage            # -#  172.16.4.0/24  #         production         # -################################################ - -services: - ################################################################################ - # Middleware of Muscle and Fitness # - ################################################################################ - mysql: - container_name: mysql-maf-test - image: mysql:latest - environment: - MYSQL_ROOT_PASSWORD: "jm@mysql" - MYSQL_DATABASE: muscle_and_fitness - TZ: Asia/Hong_Kong - ports: - - "3306:3306" - restart: always - volumes: - - /Users/johnny/docker-file-mapping/mysql-maf-test:/var/lib/mysql - - ./script/mysql-init-script:/docker-entrypoint-initdb.d - command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci - networks: - muscle_and_fitness_network: - ipv4_address: 172.16.2.10 - - redis: - container_name: redis-maf-test - image: redis:latest - ports: - - "6379:6379" - restart: always - volumes: - - /Users/johnny/docker-file-mapping/redis-maf-test:/data - - ./script/redis/redis.conf:/usr/local/etc/redis/redis.conf - environment: - TZ: Asia/Hong_Kong - command: "redis-server /usr/local/etc/redis/redis.conf" - networks: - muscle_and_fitness_network: - ipv4_address: 172.16.2.11 - - atmoz-sftp: - container_name: atmoz-sftp-maf-test - image: atmoz/sftp:latest - ports: - - "23:22" - restart: always - volumes: - - /Users/johnny/docker-file-mapping/atmoz-sftp-maf-test:/home/johnny/upload - environment: - TZ: Asia/Hong_Kong - command: "johnny:atmoz@sftp:::upload" - networks: - muscle_and_fitness_network: - ipv4_address: 172.16.2.12 - - open-zipkin: - container_name: open-zipkin-maf-test - image: openzipkin/zipkin - # Environment settings are defined here https://github.com/openzipkin/zipkin/blob/master/zipkin-server/README.md#environment-variables - depends_on: - - mysql - environment: - STORAGE_TYPE: mysql - MYSQL_DB: zipkin - MYSQL_USER: root - MYSQL_PASS: "jm@mysql" - MYSQL_HOST: 172.16.2.10 - MYSQL_TCP_PORT: 3306 - TZ: Asia/Hong_Kong - # Uncomment to enable scribe - # - SCRIBE_ENABLED=true - # Uncomment to enable self-tracing - # - SELF_TRACING_ENABLED=true - # Uncomment to enable debug logging - # - JAVA_OPTS=-Dlogging.level.zipkin2=DEBUG - ports: - # Port used for the Zipkin UI and HTTP Api - - 9411:9411 - # Uncomment if you set SCRIBE_ENABLED=true - # - 9410:9410 - restart: always - networks: - muscle_and_fitness_network: - ipv4_address: 172.16.2.13 - - ################################################################################ - # Microservice of Muscle and Fitness # - ################################################################################ - # Infrastructure Service # - #------------------------------------------------------------------------------# - service-registry: - container_name: service-registry-maf-test - image: "ijohnnymiller/muscle-and-fitness-server.service-registry-test:${TAG}" - depends_on: - - open-zipkin - ports: - - "8760:8760" - restart: always - volumes: - - /Users/johnny/docker-file-mapping/logs-maf-test:/logs-test - environment: - TZ: Asia/Hong_Kong - networks: - muscle_and_fitness_network: - ipv4_address: 172.16.2.20 - - spring-boot-admin: - container_name: spring-boot-admin-maf-test - image: "ijohnnymiller/muscle-and-fitness-server.spring-boot-admin-test:${TAG}" - depends_on: - - service-registry - ports: - - "8761:8761" - volumes: - - /Users/johnny/docker-file-mapping/logs-maf-test:/logs-test - environment: - TZ: Asia/Hong_Kong - networks: - muscle_and_fitness_network: - ipv4_address: 172.16.2.21 - - api-portal: - container_name: api-portal-maf-test - image: "ijohnnymiller/muscle-and-fitness-server.api-portal-test:${TAG}" - depends_on: - - mysql - - redis - - atmoz-sftp - - service-registry - restart: always - volumes: - - /Users/johnny/docker-file-mapping/logs-maf-test:/logs-test - environment: - TZ: Asia/Hong_Kong - networks: - muscle_and_fitness_network: - ipv4_address: 172.16.2.22 - - ################################################################################ - # Microservice of Muscle and Fitness # - ################################################################################ - # Business Service # - #------------------------------------------------------------------------------# - auth-center: - container_name: auth-center-maf-test - image: "ijohnnymiller/muscle-and-fitness-server.auth-center-test:${TAG}" - depends_on: - - mysql - - service-registry - restart: always - volumes: - - /Users/johnny/docker-file-mapping/logs-maf-test:/logs-test - environment: - TZ: Asia/Hong_Kong - networks: - muscle_and_fitness_network: - ipv4_address: 172.16.2.23 - - exercise-mis: - container_name: exercise-mis-maf-test - image: "ijohnnymiller/muscle-and-fitness-server.exercise-mis-test:${TAG}" - depends_on: - - mysql - - service-registry - restart: always - volumes: - - /Users/johnny/docker-file-mapping/logs-maf-test:/logs-test - environment: - TZ: Asia/Hong_Kong - networks: - muscle_and_fitness_network: - ipv4_address: 172.16.2.24 - - muscle-mis: - container_name: muscle-mis-maf-test - image: "ijohnnymiller/muscle-and-fitness-server.muscle-mis-test:${TAG}" - depends_on: - - mysql - - service-registry - restart: always - volumes: - - /Users/johnny/docker-file-mapping/logs-maf-test:/logs-test - environment: - TZ: Asia/Hong_Kong - networks: - muscle_and_fitness_network: - ipv4_address: 172.16.2.25 - - ################################################################################ - # Gateway for Muscle and Fitness # - ################################################################################ - gateway: - container_name: gateway-maf-test - image: "ijohnnymiller/muscle-and-fitness-server.gateway-test:${TAG}" - depends_on: - - service-registry - ports: - - "8080:8080" - restart: always - volumes: - - /Users/johnny/docker-file-mapping/logs-maf-test:/logs-test - environment: - TZ: Asia/Hong_Kong - networks: - muscle_and_fitness_network: - # Gateway uses the last IP of the subnet - ipv4_address: 172.16.2.254 - -################################################################################ -# Network for Muscle and Fitness # -################################################################################ -networks: - muscle_and_fitness_network: - ipam: - driver: default - config: - # Private Network (20-bit block): https://en.wikipedia.org/wiki/Private_network - # IP range of the private network: https://ipgeolocation.io/browse/ipv4/172.16.2.0/24 - - subnet: "172.16.2.0/24" diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml new file mode 100644 index 00000000..f46099c7 --- /dev/null +++ b/docker/docker-compose.yml @@ -0,0 +1,401 @@ +version: "3.8" + +services: + ################################################################################ + # Infrastructure Services # + ################################################################################ + mysql-server-master: + container_name: ${MYSQL_SERVER_MASTER_CONTAINER_NAME} + image: mysql/mysql-server:${MYSQL_SERVER_TAG} + environment: + MYSQL_ROOT_HOST: "%" + MYSQL_ROOT_PASSWORD: ${MAF_MYSQL_ROOT_PASSWORD} + MYSQL_DATABASE: ${MAF_MYSQL_DATABASE} + TZ: ${MAF_TIMEZONE} + ports: + - "3306:3306" + restart: always + volumes: + - "~/docker-file-mapping/${MYSQL_SERVER_MASTER_CONTAINER_NAME}:/var/lib/mysql" + - ./config/mysql-server/master/mysql-master.cnf:/etc/my.cnf + - ./script/mysql-server-master:/docker-entrypoint-initdb.d + command: > + bash -c " + chmod 644 /etc/my.cnf + && /entrypoint.sh mysqld + " + networks: + muscle_and_fitness_network: + + mysql-server-slave: + container_name: ${MYSQL_SERVER_SLAVE_CONTAINER_NAME} + image: mysql/mysql-server:${MYSQL_SERVER_TAG} + depends_on: + mysql-server-master: + condition: service_healthy + environment: + MYSQL_ROOT_HOST: "%" + MYSQL_ROOT_PASSWORD: ${MAF_MYSQL_ROOT_PASSWORD} + MYSQL_DATABASE: ${MAF_MYSQL_DATABASE} + ports: + - "3307:3306" + restart: always + volumes: + - "~/docker-file-mapping/${MYSQL_SERVER_SLAVE_CONTAINER_NAME}:/var/lib/mysql" + - ./config/mysql-server/slave-1/mysql-slave.cnf:/etc/my.cnf + - ./script/mysql-server-slave:/docker-entrypoint-initdb.d + command: > + bash -c " + chmod 644 /etc/my.cnf + && /entrypoint.sh mysqld + " + networks: + muscle_and_fitness_network: + + redis: + container_name: ${REDIS_CONTAINER_NAME} + image: redis:${REDIS_TAG} + ports: + - "6379:6379" + restart: always + volumes: + - "~/docker-file-mapping/${REDIS_CONTAINER_NAME}:/data" + - ./config/redis/redis.conf:/usr/local/etc/redis/redis.conf + environment: + TZ: ${MAF_TIMEZONE} + command: "redis-server /usr/local/etc/redis/redis.conf" + networks: + muscle_and_fitness_network: + + atmoz-sftp: + container_name: ${ATMOZ_SFTP_CONTAINER_NAME} + image: atmoz/sftp:${ATMOZ_SFTP_TAG} + ports: + # mapping local machine's port 23 to container port 22 + - "23:22" + restart: always + volumes: + - "~/docker-file-mapping/${ATMOZ_SFTP_CONTAINER_NAME}:/home/johnny/upload" + environment: + TZ: ${MAF_TIMEZONE} + command: "johnny:atmoz@sftp:::upload" + networks: + muscle_and_fitness_network: + + minio: + container_name: ${MINIO_CONTAINER_NAME} + image: minio/minio:${MINIO_TAG} + ports: + - "9900:9000" + restart: always + volumes: + - "~/docker-file-mapping/${MINIO_CONTAINER_NAME}/minio:/data" + environment: + MINIO_ROOT_USER: ${MAF_MINIO_ROOT_USER} + MINIO_ROOT_PASSWORD: ${MAF_MINIO_ROOT_PASSWORD} + command: server /data + healthcheck: + test: [ "CMD", "curl", "-f", "http://localhost:9000/minio/health/live" ] + interval: 30s + timeout: 20s + retries: 3 + networks: + muscle_and_fitness_network: + + rabbitmq: + container_name: ${RABBITMQ_CONTAINER_NAME} + hostname: ${RABBITMQ_CONTAINER_NAME} + image: rabbitmq:${RABBITMQ_TAG} + ports: + - "5672:5672" + - "15672:15672" + - "61613:61613" + restart: always + volumes: + - ./config/rabbitmq:/etc/rabbitmq + - ./plugin/rabbitmq/rabbitmq_delayed_message_exchange-3.8.9-0199d11c.ez:/plugins/rabbitmq_delayed_message_exchange-3.8.9-0199d11c.ez + - "~/docker-file-mapping/${RABBITMQ_CONTAINER_NAME}:/var/lib/rabbitmq" + environment: + RABBITMQ_DEFAULT_USER: ${MAF_RABBITMQ_USER} + RABBITMQ_DEFAULT_PASS: ${MAF_RABBITMQ_PASSWORD} + healthcheck: + test: rabbitmq-diagnostics -q ping + interval: 30s + timeout: 30s + retries: 3 + networks: + muscle_and_fitness_network: + + zipkin-mysql: + container_name: ${ZIPKIN_MYSQL_CONTAINER_NAME} + image: openzipkin/zipkin-mysql:${ZIPKIN_MYSQL_TAG} + restart: always + networks: + muscle_and_fitness_network: + + zipkin-dependencies: + container_name: ${ZIPKIN_DEPENDENCIES_CONTAINER_NAME} + image: openzipkin/zipkin-dependencies:${ZIPKIN_DEPENDENCIES_TAG} + entrypoint: crond -f + environment: + # Uncomment to see dependency processing logs + ZIPKIN_LOG_LEVEL: DEBUG + STORAGE_TYPE: mysql + MYSQL_HOST: ${ZIPKIN_MYSQL_CONTAINER_NAME} + MYSQL_USER: zipkin + MYSQL_PASS: zipkin + depends_on: + zipkin-mysql: + condition: service_healthy + restart: always + networks: + muscle_and_fitness_network: + + zipkin: + container_name: ${ZIPKIN_CONTAINER_NAME} + image: openzipkin/zipkin:${ZIPKIN_TAG} + depends_on: + zipkin-mysql: + condition: service_healthy + # Environment settings are defined here https://github.com/openzipkin/zipkin/blob/master/zipkin-server/README.md#environment-variables + environment: + STORAGE_TYPE: mysql + # Point the zipkin at the storage backend + MYSQL_HOST: ${ZIPKIN_MYSQL_CONTAINER_NAME} + MYSQL_USER: zipkin + MYSQL_PASS: zipkin + # Uncomment to enable request logging (TRACE shows query values) + command: --logging.level.com.datastax.oss.driver.internal.core.tracker.RequestLogger=TRACE + JAVA_OPTS: -Xms128m -Xmx128m -XX:+ExitOnOutOfMemoryError + TZ: ${MAF_TIMEZONE} + # Uncomment to enable scribe + # - SCRIBE_ENABLED=true + # Uncomment to enable self-tracing + # - SELF_TRACING_ENABLED=true + # Uncomment to enable debug logging + # - JAVA_OPTS=-Dlogging.level.zipkin2=DEBUG + ports: + # Port used for the Zipkin UI and HTTP Api + - 9411:9411 + # Uncomment if you set SCRIBE_ENABLED=true + # - 9410:9410 + restart: always + networks: + muscle_and_fitness_network: + + consul-registry: + container_name: ${CONSUL_REGISTRY_CONTAINER_NAME} + hostname: ${CONSUL_REGISTRY_CONTAINER_NAME} + image: consul:${CONSUL_TAG} + depends_on: + zipkin: + condition: service_healthy + ports: + - "8500:8500" + restart: always + volumes: + - "~/docker-file-mapping/${CONSUL_REGISTRY_CONTAINER_NAME}:/consul/data" + command: "agent -server -ui -disable-host-node-id -bootstrap-expect=1 -client=0.0.0.0" + networks: + muscle_and_fitness_network: + + elasticsearch: + container_name: ${ELASTICSEARCH_CONTAINER_NAME} + image: elasticsearch:${ELASTICSEARCH_TAG} + ports: + - "9200:9200" + restart: always + volumes: + # - "~/docker-file-mapping/${ELASTICSEARCH_CONTAINER_NAME}/plugins:/usr/share/elasticsearch/plugins" + - "~/docker-file-mapping/${ELASTICSEARCH_CONTAINER_NAME}/data:/usr/share/elasticsearch/data" + environment: + cluster.name: elasticsearch + discovery.type: single-node + ES_JAVA_OPTS: "-Xms512m -Xmx1G" + ELASTIC_PASSWORD: ${MAF_ELASTICSEARCH_PASSWORD} + xpack.security.enabled: "true" + # Force publishing on the 'elk' overlay. + network.publish_host: _eth0_ + networks: + muscle_and_fitness_network: + + logstash: + container_name: ${LOGSTASH_CONTAINER_NAME} + image: logstash:${LOGSTASH_TAG} + depends_on: + elasticsearch: + condition: service_started + ports: + - "4560:4560" + restart: always + volumes: + - ./config/logstash/logstash-maf.conf:/usr/share/logstash/pipeline/logstash.conf + - ./config/logstash/logstash-maf.yml:/usr/share/logstash/config/logstash.yml + networks: + muscle_and_fitness_network: + + kibana: + container_name: ${KIBANA_CONTAINER_NAME} + image: kibana:${KIBANA_TAG} + depends_on: + elasticsearch: + condition: service_started + ports: + - "5601:5601" + restart: always + volumes: + - ./config/kibana/kibana.yml:/usr/share/kibana/config/kibana.yml + networks: + muscle_and_fitness_network: + + spring-boot-admin: + container_name: ${SPRING_BOOT_ADMIN_CONTAINER_NAME} + hostname: ${SPRING_BOOT_ADMIN_CONTAINER_NAME} + image: ijohnnymiller/muscle-and-fitness-server.spring-boot-admin:${MAF_TAG} + depends_on: + consul-registry: + condition: service_started + ports: + - "8761:8761" + restart: always + volumes: + - "~/docker-file-mapping/${SPRING_BOOT_ADMIN_CONTAINER_NAME}:/logs" + environment: + JAVA_TOOL_OPTIONS: "${JAVA_TOOL_OPTIONS}" + TZ: ${MAF_TIMEZONE} + healthcheck: + test: "wget localhost:8761/actuator/health -q -O - > /dev/null 2>&1" + interval: 20s + timeout: 5s + retries: 5 + start_period: 40s + networks: + muscle_and_fitness_network: + + ################################################################################ + # Microservice of Muscle and Fitness # + ################################################################################ + # Business Service # + #------------------------------------------------------------------------------# + api-gateway: + container_name: ${API_GATEWAY_CONTAINER_NAME} + hostname: ${API_GATEWAY_CONTAINER_NAME} + image: ijohnnymiller/muscle-and-fitness-server.api-gateway:${MAF_TAG} + depends_on: + consul-registry: + condition: service_started + redis: + condition: service_started + restart: always + ports: + - "8080:8080" + volumes: + - "~/docker-file-mapping/${API_GATEWAY_CONTAINER_NAME}:/logs" + environment: + JAVA_TOOL_OPTIONS: ${JAVA_TOOL_OPTIONS} + TZ: ${MAF_TIMEZONE} + healthcheck: + test: "wget localhost:8080/actuator/health -q -O - > /dev/null 2>&1" + interval: 20s + timeout: 5s + retries: 5 + start_period: 40s + networks: + muscle_and_fitness_network: + + auth-center: + container_name: ${AUTH_CENTER_CONTAINER_NAME} + hostname: ${AUTH_CENTER_CONTAINER_NAME} + image: ijohnnymiller/muscle-and-fitness-server.auth-center:${MAF_TAG} + depends_on: + consul-registry: + condition: service_started + redis: + condition: service_started + rabbitmq: + condition: service_healthy + mysql-server-master: + condition: service_healthy + mysql-server-slave: + condition: service_healthy + restart: always + volumes: + - "~/docker-file-mapping/${AUTH_CENTER_CONTAINER_NAME}:/logs" + environment: + JAVA_TOOL_OPTIONS: ${JAVA_TOOL_OPTIONS} + TZ: ${MAF_TIMEZONE} + healthcheck: + test: "wget localhost:8800/actuator/health -q -O - > /dev/null 2>&1" + interval: 20s + timeout: 5s + retries: 5 + start_period: 40s + networks: + muscle_and_fitness_network: + + oss-center: + container_name: ${OSS_CENTER_CONTAINER_NAME} + hostname: ${OSS_CENTER_CONTAINER_NAME} + image: ijohnnymiller/muscle-and-fitness-server.oss-center:${MAF_TAG} + depends_on: + consul-registry: + condition: service_started + redis: + condition: service_started + rabbitmq: + condition: service_healthy + minio: + condition: service_started + mysql-server-master: + condition: service_healthy + mysql-server-slave: + condition: service_healthy + restart: always + volumes: + - "~/docker-file-mapping/${OSS_CENTER_CONTAINER_NAME}:/logs" + environment: + JAVA_TOOL_OPTIONS: ${JAVA_TOOL_OPTIONS} + TZ: ${MAF_TIMEZONE} + healthcheck: + test: "wget localhost:8760/actuator/health -q -O - > /dev/null 2>&1" + interval: 20s + timeout: 5s + retries: 5 + start_period: 40s + networks: + muscle_and_fitness_network: + + maf-mis: + container_name: ${MAF_MIS_CONTAINER_NAME} + hostname: ${MAF_MIS_CONTAINER_NAME} + image: ijohnnymiller/muscle-and-fitness-server.maf-mis:${MAF_TAG} + depends_on: + consul-registry: + condition: service_started + redis: + condition: service_started + mysql-server-master: + condition: service_healthy + mysql-server-slave: + condition: service_healthy + rabbitmq: + condition: service_healthy + restart: always + volumes: + - "~/docker-file-mapping/${MAF_MIS_CONTAINER_NAME}:/logs" + environment: + JAVA_TOOL_OPTIONS: ${JAVA_TOOL_OPTIONS} + TZ: ${MAF_TIMEZONE} + healthcheck: + test: "wget localhost:8801/actuator/health -q -O - > /dev/null 2>&1" + interval: 20s + timeout: 5s + retries: 5 + start_period: 40s + networks: + muscle_and_fitness_network: + +networks: + muscle_and_fitness_network: + ipam: + driver: default diff --git a/docker/plugin/rabbitmq/download-link.txt b/docker/plugin/rabbitmq/download-link.txt new file mode 100644 index 00000000..8ae65abe --- /dev/null +++ b/docker/plugin/rabbitmq/download-link.txt @@ -0,0 +1 @@ +https://github.com/rabbitmq/rabbitmq-delayed-message-exchange/releases/tag/3.8.9 diff --git a/docker/plugin/rabbitmq/rabbitmq_delayed_message_exchange-3.8.9-0199d11c.ez b/docker/plugin/rabbitmq/rabbitmq_delayed_message_exchange-3.8.9-0199d11c.ez new file mode 100644 index 00000000..2ba64115 Binary files /dev/null and b/docker/plugin/rabbitmq/rabbitmq_delayed_message_exchange-3.8.9-0199d11c.ez differ diff --git a/docker/script/mysql-init-script/musle_and_fitness.sql b/docker/script/mysql-init-script/musle_and_fitness.sql deleted file mode 100644 index c1a9cbaa..00000000 --- a/docker/script/mysql-init-script/musle_and_fitness.sql +++ /dev/null @@ -1,486 +0,0 @@ --- MySQL dump 10.13 Distrib 8.0.19, for macos10.15 (x86_64) --- --- Host: 127.0.0.1 Database: muscle_and_fitness --- ------------------------------------------------------ --- Server version 8.0.19 - -/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; -/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; -/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; -/*!50503 SET NAMES utf8 */; -/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; -/*!40103 SET TIME_ZONE='+00:00' */; -/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; -/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; -/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; -/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; - --- --- Table structure for table `body_part` --- - -DROP TABLE IF EXISTS `body_part`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `body_part` ( - `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'The ID of body part.', - `name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'The name of body part.', - PRIMARY KEY (`id`), - UNIQUE KEY `body_part_name_uindex` (`name`) -) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Human Body Part.'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `body_part` --- - -LOCK TABLES `body_part` WRITE; -/*!40000 ALTER TABLE `body_part` DISABLE KEYS */; -INSERT INTO `body_part` VALUES (5,'Back'),(10,'Calves'),(6,'Chest'),(4,'Forearms'),(8,'Hips'),(1,'Neck'),(11,'Other Exercises'),(2,'Shoulders'),(9,'Thighs'),(3,'Upper Arms'),(7,'Waist'); -/*!40000 ALTER TABLE `body_part` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `equipment` --- - -DROP TABLE IF EXISTS `equipment`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `equipment` ( - `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'The ID of exercise equipment.', - `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'The name of equipment.', - PRIMARY KEY (`id`), - UNIQUE KEY `equipment_name_uindex` (`name`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Exercise Equipment.'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `equipment` --- - -LOCK TABLES `equipment` WRITE; -/*!40000 ALTER TABLE `equipment` DISABLE KEYS */; -/*!40000 ALTER TABLE `equipment` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `exercise` --- - -DROP TABLE IF EXISTS `exercise`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `exercise` ( - `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'The ID of exercise.', - `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'The name of exercise.', - `preparation` varchar(800) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'Exercise preparation description.', - `execution` varchar(800) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'Exercise execution description.', - `exercise_gif_path` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'Exercise GIF image path.', - PRIMARY KEY (`id`), - UNIQUE KEY `exercise_name_uindex` (`name`) -) ENGINE=InnoDB AUTO_INCREMENT=1692 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Exercise.\n\nhttps://exrx.net/Lists/Directory'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `exercise` --- - -LOCK TABLES `exercise` WRITE; -/*!40000 ALTER TABLE `exercise` DISABLE KEYS */; -INSERT INTO `exercise` VALUES (1,'Cable Neck Flexion (with belt)','Attach belt on low pulley cable by attaching carabiner on belt buckle. Grasp attached belt, face away from pulley, and place head in belt loop. With belt above ears, clamp belt snugly around head by tightly gripping ends close to back of mid-head. With neck braced and assistance of arm, lunge forward to angle torso forward with feet staggered. Place hand on lower thigh for support.','Pull head forward and down by flexing neck until chin touches upper chest. Return by hyperextending neck until head is angled upward. Repeat.','upload/exercise-picture/CBNeckFlexionBelt.gif'),(2,'Cable Neck Flexion','Sit on bench facing away from middle pulley. Place neck in harness cable attachment. Place arms on lower thighs for support.','Move head away from pulley by bending neck forward until chin touches upper chest. Return head by hyperextending neck and repeat.','upload/exercise-picture/CBNeckFlexion.gif'),(3,'Lever Neck Flexion (plate loaded)','Sit on seat in machine. Position padded lever on face. Position body so neck is in line with lever axis. Grasp handles for support.','Move head forward by flexing neck until chin touches upper chest. Return head by hyperextending neck and repeat.','upload/exercise-picture/LVNeckFlexionH.gif'),(4,'Cable Neck Rotation (with belt)','Place workout chair or bench with vertical back support facing to one side near adjustable height cable pulley. Adjust pulley approximately height of head when seated. Attach belt on low pulley cable by attaching carabiner on belt buckle. Sit on bench, grasp attached belt from side. Face toward cable pulley and place head in belt loop. With belt above ears, clamp belt snugly around head by tightly gripping ends close forehead. Position torso upright with feet wide apart and hand nearest cable pulley on lower thigh for added support.','Turn head away from pulley cable by rotating head away from pulley. Turn head back toward cable pulley and repeat. Turn seat the opposite direction or attach belt to pulley on opposite side and continue with other side.','upload/exercise-picture/CBNeckRotationBelt.gif'),(5,'Lever Lateral Neck Flexion','Sit on seat in machine with feet apart. Position side of head on padded lever. Center body so neck is in line with lever axis. Grasp handles for support.','Move head down to side by laterally flexing neck. Return head to opposite side and repeat. Sit in machine backwards and continue with opposite side.','upload/exercise-picture/LVNeckLateralFlexion.gif'),(6,'Cable Lateral Neck Flexion (with belt)','Adjust pulley approximately height of neck or head when seated. Attach belt on low pulley cable by attaching carabiner on belt buckle. Sit on bench with pulley to one side and feet apart. Place head in belt loop. With belt above ears, clamp belt snugly around head by tightly gripping ends close to side of head. Pull torso upright by bracing opposite hand on far side of bench.','Pull head away from pulley cable by laterally flexing neck. Tilt head back toward cable pulley and repeat. Sit on bench the opposite direction and continue with other side.','upload/exercise-picture/CBLateralNeckFlexionBelt.gif'),(7,'Lever Lateral Neck Flexion (plate loaded)','Sit on seat in machine with feet apart\n\n\n. Position padded lever on side of head. Center body so neck is in line with lever axis. Grasp handles for support.','Move head down to side by laterally flexing neck. Return head to opposite side and repeat. Sit in machine backwards and continue with opposite side.','upload/exercise-picture/LVLateralNeckFlexionH.gif'),(8,'Lever Neck Flexion','Sit on seat in machine. Position padded lever on face. Position body so neck is in line with lever axis. Grasp handles for support.','Move head forward by flexing neck until chin touches upper chest. Return head by hyperextending neck and repeat.','upload/exercise-picture/LVNeckFlexion.gif'),(9,'Weighted Lying Neck Flexion','Place folded towel on weight plate(s). Lie supine on bench, head extending off of end of bench. Place plates on forehead with towel placed in between for comfort.','Move head up by flexing neck until chin touches upper chest. Return by hyperextending neck and repeat.','upload/exercise-picture/WtNeckFlexion.gif'),(10,'Weighted Neck Flexion','Place folded towel on weight plate. Lie supine perpendicular on bench with low back and hips extending off and feet on floor. Place weight and towel on forehead. Place plates on forehead with towel placed in between for comfort.','Move head up by flexing neck until chin touches upper chest. Return by hyperextending neck and repeat.','upload/exercise-picture/WTNeckFlexionCrossBench.gif'),(11,'Weighted Lateral Neck Flexion','Place folded towel on weight plate. Lie on bench on side with knees and hips bent and arm hanging over edge. Position weight and towel on side of upper head. Hold weight on side of head with hand of upper arm. Place hand of lower arm on floor for support.','Move head up to side by laterally flexing neck. Lower head to opposite side and repeat. Lie on other side and continue.','upload/exercise-picture/WTLateralNeckFlexion.gif'),(12,'Neck Rotation Stretch','Stand or sit.','Turn head over shoulder to one side. Hold stretch. Repeat to other side.','upload/exercise-picture/2fbe7e69b265b483d2414574acf6142e.jpg'),(13,'Wall Side Neck Bridge','Place small or folded cushioned mat on column or at end of wall approximately shoulder height. With hands supporting mat, stand with side toward mat. Step far to side so feet are away from wall or column forward. Place side of head on mat with shoulder extending over end of adjacent side of column or wall so body leans to side. Fold hands behind low back or hips.','Push side of head into mat and roll onto top of head moving body away from mat. Return to original position by rolling back down to side of head while bringing shoulder back over end of column or wall. Repeat.','upload/exercise-picture/BWWallSideNeckBridge.gif'),(14,'Neck Retraction Stretch','Stand or sit.','Pull head back as far possible while looking slightly down and hold stretch.','upload/exercise-picture/360cb46b3b96821a6d08e84228e08c07.jpg'),(15,'Suspended Neck Flexion','Place belt or strap around end of suspension trainer. Face away from suspension trainer with belt in hand. Place belt around head above ears and clamp belt snugly around head by tightly gripping ends close to back of mid-head. Step forward until suspension trainer is taut. Lean forward at angle against support of belt and suspension trainer by stepping back slightly while keeping head and body straight.','Increase angle of body by bowing head until chin touches upper chest. Lower angle of body by raising head. Repeat.','upload/exercise-picture/STNeckFlexion.gif'),(16,'Front Neck Bridge','Kneel on all fours on well cushioned mat. Place head on mat between hands. Rise and straighten knees. Fold hands behind low back or hips.','Roll back onto forehead until nose touches mat. Roll forward onto top of head until chin touches upper chest. Repeat.','upload/exercise-picture/BWFrontNeckBridge.gif'),(17,'Wall Front Neck Bridge','Place small or folded cushioned mat on wall or column approximately chest height. With hands supporting mat on each side stand back so feet are away from wall or column with body leaning forward. Place top of forehead on mat. Fold hands behind low back or hips.','Roll down onto forehead until nose touches mat. Roll up onto top of head until chin touches upper chest. Repeat.','upload/exercise-picture/BWWallFrontNeckBridge.gif'),(18,'Suspended Lateral Neck Flexion','Place belt or strap around end of suspension trainer. Hold belt in hand and stand away from suspension trainer so it hangs to one side. Place belt around head above ears and clamp belt snugly around head by tightly gripping ends close to head above ear closest to suspension trainer. Step further away from suspension trainer until it is taut. Lean away at angle against support of belt and suspension trainer by positioning feet closer to side of suspension trainer while keeping head and body straight.','Lower angle of body by tilting head to side of suspension trainer. Increase angle of body by tilting head away from side of suspension trainer. Repeat and continue in opposite position.','upload/exercise-picture/STNeckLateralExtension.gif'),(19,'Cable Neck Extension','Sit on bench facing pulley. Place neck in harness cable attachment. Place forearms on lower thighs for support.','Move head away from pulley by hyperextending neck. Return by bending neck forward until chin touches upper chest. Repeat.','upload/exercise-picture/CBNeckExtension.gif'),(20,'Lever Neck Extension','Sit on seat in machine. Place back of head under padded lever. Position body so neck is in line with lever axis. Grasp handles for support.','Move head back by hyperextending neck. Return by bending neck forward until chin touches upper chest. Repeat.','upload/exercise-picture/LVNeckExtension.gif'),(21,'Lever Neck Extension (plate loaded)','Sit on seat in machine. Place back of head under padded lever. Position body so neck is in line with lever axis. Grasp handles for support.','Move head back by hyperextending neck. Return by bending neck forward until chin touches upper chest. Repeat.','upload/exercise-picture/LVNeckExtensionH.gif'),(22,'Weighted Lying Neck Extension','Lie prone on bench with head extended off of end and folded towel and weight plate(s) on floor. With both hands, place plate(s) on back of head with towel placed in between for comfort.','Move head up by hyperextending neck up as high as possible. Return by bending neck down until chin touches upper chest. Repeat.','upload/exercise-picture/WTLyingNeckExtension.gif'),(23,'Weighted Neck Extension','Kneel on side of bench with weight plates on end of bench. With both hands, hold weight plate(s) cushioned with towel. Position upper body prone and perpendicular on bench with head and arms extending off of side. With both hands, place weight plate(s) on back of head with towel placed in between for comfort.','Move head up by hyperextending neck up as high as possible. Return by bending neck down until chin touches upper chest. Repeat.','upload/exercise-picture/WTNeckExtensionCrossBench.gif'),(24,'Cable Neck Extension (with belt)','Sit on bench facing low pulley. Attach belt on low pulley cable by attaching carabiner on belt buckle. Place head in belt loop. With belt above ears, clamp belt snugly around head by tightly gripping ends close to forehead. Place other hand or forearm on lower thighs for support.','Pull head up and back by hyperextending neck. Return by bending neck forward until chin touches upper chest. Repeat.','upload/exercise-picture/CBNeckExtensionBelt.gif'),(25,'Weighted Neck Harness Extension','Sit on bench with weighted neck harness on head. Allow weight to dangle in front by bending over.','Move head up by hyperextending neck. Return by bending neck down until chin touches upper chest. Repeat.','upload/exercise-picture/WTNeckExtensionHarness.gif'),(26,'Weighted Seated Neck Extension','Place folded towel on weight plate. On bench or stool, sit bent over on thighs. With both hands, place plate(s) on back of head with towel placed in between for comfort.','Move head up by hyperextending neck up as high as possible. Return by bending neck down until chin touches upper chest. Repeat.','upload/exercise-picture/WtNeckExtension.gif'),(27,'Band Resistive Neck Retraction','Execution\nPush back of neck into band by retracting head. Returning head to neutral postion and repeat.','Comments','upload/exercise-picture/BRNeckRetraction.gif'),(28,'Wall Rear Neck Bridge','Hold small or folded cushioned mat behind head. Facing away from wall or column position head and back of shoulders low on wall or column with mat between. Stand with feet far away from wall or column so body is angled back. Position hips and back straight and bend knees just slightly. Place arms to side or hold hands on abdomen.','Push head back into mat and roll head upward. Arch spine and straighten knees. Hyperextend neck so head is facing up. Return to origianl position by rolling head down while allowing low back to straighten and knees to bend slightly. Continue down until back of head and shoulders make contact with mat. Repeat.','upload/exercise-picture/BWWallRearNeckBridge.gif'),(29,'Rear Neck Bridge','Lying supine on well cushioned mat. Position feet very close to hips. Raise buttocks and low back slightly off of floor and fold hands on abdomen.','Extend hips and knees while pushing head back into floor. Roll back on head while arching spine high off of floor. Hyperextend neck back in attempt to bring forehead toward mat. Return body to close to mat until back of head and shoulders make contact with mat. Repeat.','upload/exercise-picture/BWRearNeckBridge.gif'),(30,'Neck Extensor Stretch','Bow head forward with jaw shut. Depress chin into top of sternum.','Slightly turn head to one side. Hold stretch. Repeat to other side.','upload/exercise-picture/0b4142cf0100659361840fb8e05756e4.jpg'),(31,'Suspended Neck Extension','Place belt or strap around end of suspension trainer. Place belt around head above ears and clamp belt snugly around head by tightly gripping ends close to forehead. Step back facing direction of suspension trainer until it is taut. Lean back at angle against support of belt and suspension trainer by stepping forward slightly while keeping head and body straight.','Lower angle of body by bowing head until chin is near upper chest. Increase angle of body by raising head. Repeat.','upload/exercise-picture/STNeckExtension.gif'),(32,'Lying Neck Retraction Isometric','Execution\nPush head into mat and hold position. Relax and repeat.','Comments','upload/exercise-picture/IsometricNeckRetraction.jpg'),(33,'Barbell Behind Neck Press','Grasp barbell with overhand grip from rack or clean from floor. Position bar behind neck.','Press bar upward until arms are extended overhead. Return behind neck and repeat.','upload/exercise-picture/BBSeatedBehindNeckPress.gif'),(34,'Barbell Incline Front Raise','Grasp barbell with shoulder width overhand grip. Lie supine on upper portion of 45 degree incline bench with legs straight. Position barbell on top of upper thighs.','With elbows straight or slightly bent, raise barbell up and over shoulders until uppers arm are vertical. Lower barbell to upper thigh and repeat.','upload/exercise-picture/BBInclineFrontRaise.gif'),(35,'Barbell Military Press','Grasp barbell from rack or clean barbell from floor with overhand grip, slightly wider than shoulder width. Position bar in front of neck.','Press bar upward until arms are extended overhead. Lower to front of neck and repeat.','upload/exercise-picture/BBMilitaryPressBentLeg.gif'),(36,'Barbell Front Raise','Grasp barbell with overhand grip with elbows straight or slightly bent.','Raise barbell forward and upward until upper arms are above horizontal. Lower and repeat.','upload/exercise-picture/BBFrontRaise.gif'),(37,'Barbell Shoulder Press','Grasp barbell with slightly wider than shoulder width overhand grip from rack. Position bar near upper chest.','Press bar upward until arms are extended overhead. Return to upper chest and repeat.','upload/exercise-picture/BBShoulderPress.gif'),(38,'Cable Bar Behind Neck Press','Stand facing cable bar, mounted on each side to upper waist height narrow double pulley cables. Grasp cable bar with wide overhand grip upper chest height. Stand directly between both cable pulleys with one foot forward and other foot back. Push cable bar over head and position cable bar behind neck or rest on shoulders.','Press cable bar upward until arms are extended overhead. Return behind neck and repeat.','upload/exercise-picture/CBBarBehindNeckPressSide.gif'),(39,'Cable Bar Military Press','Stand facing cable bar, mounted on each side to upper waist height narrow double pulley cables. Grasp cable bar with overhand grip, slightly wider than shoulder width. Position cable bar upper chest height. Stand directly between both cable pulleys with one foot forward and other foot back.','Press cable bar upward until arms are extended overhead. Return to upper chest and repeat.','upload/exercise-picture/CBBarMilitaryPressSide.gif'),(40,'Cable Bar Shoulder Press','Stand facing cable bar mounted on each side to upper waist height narrow double pulley cables. Grasp cable bar with wide overhand grip and position upper chest height. Stand directly between both cable pulleys with one foot forward and other foot back.','Press cable bar upward until arms are extended overhead. Return to upper chest and repeat.','upload/exercise-picture/CBBarMilitaryPressSide.gif'),(41,'Barbell Seated Military Press','Grasp barbell with slightly wider than shoulder width overhand grip from rack. Position bar near upper chest.','Press bar upward until arms are extended overhead. Return to upper chest and repeat.','upload/exercise-picture/BBSeatedMilitaryPressFF.gif'),(42,'Cable Seated Front Raise','Sit on seat above twin cable pulleys. Grasp stirrups on each side. Sit upright with arms straight down to each side with palms facing back.','Raise stirrups forward and upward until upper arms are well above horizontal. Lower and repeat.','upload/exercise-picture/CBSeatedFrontRaise.gif'),(43,'Cable Alternating Front Raise','Stand with low double pulleys behind. Grasp stirrup attachments, one in each hand. Stand away from pulley slightly with arms back somewhat at side and elbows straight or slightly bent.','Raise one stirrup forward and upward until upper arm is well above horizontal. Lower and repeat with opposite arm, alternating between arms.','upload/exercise-picture/CBAlternatingFrontLateralRaise.gif'),(44,'Cable Alternating Seated Front Raise','Sit on seat above twin cable pulleys. Grasp stirrups on each side. Sit upright with arms straight down to each side with palms facing back.','Raise one stirrup forward and upward until upper arm is well above horizontal. Lower and repeat with opposite arm. Continue by alternating raises between sides.','upload/exercise-picture/CBAlternatingSeatedFrontRaise.gif'),(45,'Cable One Arm Front Raise (with rope)','Grasp end of Triceps Rope Cable attachment with one hand so that protruding end is in contact with side of hand (thumb and index finger). Stand away from\n\n\npulley with arm back at side and elbow straight.','Raise stirrup forward and upward until arm is well above horizontal or cable makes contact with underside of upper arm. Lower and repeat. Repeat with opposite arm.','upload/exercise-picture/CBFrontRaiseRope.gif'),(46,'Cable Shoulder Press','Sit on seat and grasp stirrups from low to medium low position from each side. Position stirrups to each side of shoulders with elbows down to sides and stirrups above or slightly narrower than elbows.','Push stirrups upward until arms are extended overhead. Return stirrups to sides of shoulders and repeat.','upload/exercise-picture/CBShoulderPress.gif'),(47,'Cable One Arm Front Raise','Grasp stirrup attachment. Stand away from pulley slightly with arm back somewhat at side and elbow straight or slightly bent.','Raise stirrup forward and upward until upper arm is well above horizontal. Lower and repeat. Repeat with opposite arm.','upload/exercise-picture/CBFrontRaise.gif'),(48,'Dumbbell Alternating Incline Front Raise','Grasp dumbbells and lie supine on upper portion of 45 degree incline bench with legs straight. Position dumbbells downward below each shoulder.','With elbows straight or slightly bent, raise one dumbbell forward, up and over shoulder until upper arm is vertical. Lower dumbbell down to starting position. Repeat raise with other arm, alternating between sides.','upload/exercise-picture/DBAlternInclineFrontRaise.gif'),(49,'Cable Twisting Overhead Press','Stand beside low to medium height pulley. Grasp cable stirrup. Position stirrup to front of shoulder with elbow down to side. Place opposite hand on hip. With feet wide apart, squat down slightly.','Rotate body away from pulley and straighten legs while pushing stirrup diagonally upward toward opposite side of body. Return to original position and repeat.','upload/exercise-picture/CBTwistingOverheadPress.gif'),(50,'Cable Standing Shoulder Press','Stand between two low to medium height pulleys. Grasp cable stirrups from each side. Position stirrups to each side of shoulders with elbows down to sides and stirrups above or slightly narrower than elbows.','Push stirrups upward until arms are extended overhead. Return stirrups to sides of shoulders and repeat.','upload/exercise-picture/CBStandingShoulderPress.gif'),(51,'Dumbbell Front Raise','Grasp dumbbells in both hands. Position dumbbells in front of upper legs with elbows straight or slightly bent.','Raise dumbbells forward and upward until upper arms are above horizontal. Lower and repeat.','upload/exercise-picture/DBFrontRaise.gif'),(52,'Dumbbell Alternating Front Raise','Grasp dumbbells in both hands. Position dumbbells in front of upper legs with elbows straight or slightly bent.','Raise one dumbbell forward and upward with until upper arm is above horizontal. Lower and repeat with opposite arm, alternating between arms.','upload/exercise-picture/DBAlternatingFrontRaise.gif'),(53,'Dumbbell Arnold Press','Stand with two dumbbells position in front of shoulders, palms facing body and elbows under wrists.','Initiate movement by bringing elbows out to sides. Continue to raise elbows outward while pressing dumbbells overhead until arms are straight. Lower to front of shoulders in opposite pattern and repeat.','upload/exercise-picture/DBArnoldPress.gif'),(54,'Dumbbell Shoulder Press','Position dumbbells to each side of shoulders with elbows below wrists.','Press dumbbells upward until arms are extended overhead. Lower to sides of shoulders and repeat.','upload/exercise-picture/DBShoulderPress.gif'),(55,'Lever Reclined Shoulder Press (plate loaded)','Lie on back pad facing up. Grasp lever handles on each side with overhand grip.','Press lever until arms are extended. Lower and repeat.','upload/exercise-picture/LVReclinedShoulderPressPL.gif'),(56,'Lever Behind Neck Press (plate loaded)','Sit back on seat. Grasp lever bars to each side with overhand grip.','Press levers upward until arms are extended overhead. Lower and repeat.','upload/exercise-picture/LVBehindNeckShoulderPressH.gif'),(57,'Lever Barbell Behind Neck Press (plate loaded)','Sit on bench with bar positioned behind shoulders, also facing away from fulcrum. Grasp bar with wide overhand grip. Disengage bar by rotating bar back.','Press bar upward until arms are extended overhead. Lower bar behind neck and repeat.','upload/exercise-picture/LVSMSeatedBehindNeckPress.gif'),(58,'Lever Military Press (plate loaded)','Set and grasp lever handles to each side with overhand grip.','Press lever until arms are extended upward. Lower and repeat.','upload/exercise-picture/LVMilitaryInclinePressH.gif'),(59,'Dumbbell One Arm Shoulder Press','Stand with dumbbells positioned near shoulder with elbow below wrists.','Press dumbbell upward until arm is extended overhead. Lower to side of shoulder and repeat.','upload/exercise-picture/DBOneArmShoulderPressLean.gif'),(60,'Lever One Arm Front Raise','Stand with lever to side, fulcrum approximately shoulder height and handle just below hip. Grasp lever handle with elbow straight or slightly bent.','Raise lever handle forward and upward until upper arm is well above horizontal. Lower and repeat. Repeat with opposite arm.','upload/exercise-picture/LVOneArmFrontRaise.gif'),(61,'Lever Shoulder Press (plate loaded)','Set and grasp lever handles to each side with overhand grip.','Press lever upward until arms are extended overhead. Lower and repeat.','upload/exercise-picture/LVShoulderPressH.gif'),(62,'Lever Barbell Shoulder Press (plate loaded)','Sit on bench with bar positioned in front of shoulders. Grasp bar with wide overhand grip. Disengage bar by rotating bar back.','Press bar upward until arms are extended overhead. Lower bar to front of shoulders and repeat.','upload/exercise-picture/LVSMSeatedShoulderPress.gif'),(63,'Lever One Arm Shoulder Press (plate loaded)','Stand to one side, near loaded end of barbell, opposite of landmine lever. Lift end of barbell and position near shoulder with underhand grip. Stand with feet far apart (leg on same side of loaded arm is back and opposite leg is forward and bent).','Press end of barbell upward and forward until arm is extended. Lower to shoulder and repeat. Repeat with opposite side.','upload/exercise-picture/LVOneArmShoulderPress.gif'),(64,'Lever Reclined Shoulder Press','Lie on back pad facing up. Grasp lever handles to each side with overhand grip.','Press lever until arms are extended. Lower and repeat.','upload/exercise-picture/LVReclinedShoulderPress.gif'),(65,'Lever Reclined Parallel Grip Shoulder Press','Lie on back pad facing up. Grasp parallel lever handles on each side.','Press lever until arms are extended. Lower and repeat.','upload/exercise-picture/LVReclinedShoulderPressParGrip.gif'),(66,'Sled Shoulder Press','Set and grasp lever handles to each side with overhand grip.','Press handles upward until arms are extended overhead. Lower and repeat.','upload/exercise-picture/SLShoulderPress.gif'),(67,'Lever Shoulder Press','Set and grasp lever handles to each side with overhand grip.','Press lever upward until arms are extended overhead. Lower and repeat.','upload/exercise-picture/LVShoulderPress.gif'),(68,'Sled Shoulder Press (parallel grip)','Sit on seat and grasp parallel bar grips to front of shoulders on each side.','Press handles upward until arms are extended overhead. Lower and repeat.','upload/exercise-picture/SLShoulderPress.gif'),(69,'Lever Alternating Shoulder Press','Set and grasp lever handles to each side with overhand grip.','Press one lever upward until arm is extended overhead. Lower to original position. Repeat with opposite arm. Continue by alternating movement between arms.','upload/exercise-picture/LVAlternatingShoulderPress.gif'),(70,'Lever Shoulder Press (parallel grip)','Sit on seat and grasp parallel bar grips in front of shoulders on each side.','Press lever upward until arms are extended overhead. Lower and repeat.','upload/exercise-picture/LVClosWidParGripShouldPress.gif'),(71,'Smith Shoulder Press','Sit on bench with bar positioned in front of shoulders. Grasp bar with wide overhand grip. Disengage bar by rotating bar back.','Press bar upward until arms are extended overhead. Lower bar to front of shoulders and repeat.','upload/exercise-picture/SMShoulderPress.gif'),(72,'Smith Behind Neck Press','Sit on bench with bar positioned behind shoulders. Grasp bar with wide overhand grip. Disengage bar by rotating bar back.','Press bar upward until arms are extended overhead. Lower bar behind neck and repeat.','upload/exercise-picture/SMBehindNeckPress.gif'),(73,'Handstand Shoulder Press (between benches)','Stand facing wall between two benches positioned side by side, slightly apart, and slightly away and perpendicular to wall. Place hands on ends of benches closest to wall. Place forefeet on bench and kick lower body up to handstand position with arms and legs straight. Maintain balance with lower body against wall.','Lower head between ends of benches by bending arms. Push body back up to original position by extending arms. Repeat.','upload/exercise-picture/BWHandstandPressBenches.gif'),(74,'Lying Front Deltoid Stretch','Sit on floor or mat. Lean back and place hands flat on floor behind body slightly wider than shoulder width with fingers positioned away from body.','Scoot hips forward away from hands. Hold stretch.','upload/exercise-picture/55ab2c829aa0fcebd5d58d00c31dd5cb.jpg'),(75,'PNF Seated Front Deltoid Stretch','Instruct participant to sit on floor or bench and place arms to behind hips. From behind, grasp participant\'s wrists, positioning them wider than shoulder width.','Continue to raise participant\'s arms upward behind their body, out to sides. Hold stretch.','upload/exercise-picture/653009242a6a02fb25ad40c66eb2737b.jpg'),(76,'Doorway Front Deltoid Stretch','Stand at end of wall or in doorway facing perpendicular to wall. Position palm on surface of wall slightly lower than shoulder. Bend elbow slightly.','Turn body away from positioned arm. Hold stretch. Repeat with opposite arm.','upload/exercise-picture/5616f45948903873fa68bfd777cf1388.jpg'),(77,'Pike Press','Kneel on two benches positioned side by side slightly apart at end nearest head. Place hands on ends of benches. With forefeet on opposite ends of bench, raise rear end high up with arms, back, and knees straight. Adjust feet so they are somewhat close to hands while keeping back and legs straight.','Lower head between ends of benches by bending arms. Push body back up to original position by extending arms. Repeat.','upload/exercise-picture/BWPikePress.gif'),(78,'Decline Pike Press','Stand between two incline benches positioned side by side slightly apart at end nearest head. Place hands on ends of benches and straighten arms. Position forefeet on opposite ends of bench. Raise rear end high up with arms, back, and knees straight.','Lower head between ends of benches by bending arms. Push body back up to original position by extending arms. Repeat.','upload/exercise-picture/BWPikePressDeclined.gif'),(79,'Suspended Front Raise','Grasp suspension handles and momentarily step back until arms are extended forward and straight. While keeping arms straight and shoulders back, step forward so body reclines back behind suspension handles. Position body and legs straight at desired angle, hanging from handles with arms straight and palms facing downward.','Raise arms upward over head by flexing shoulders with arms straight. Return and lower body back until arms are extended straight forward in original position. Repeat.','upload/exercise-picture/STFrontRaise.gif'),(80,'Wall Front Deltoid Stretch','Face away from wall. Bend over and place hands slightly wider than shoulder width as high as possible on wall with fingers positioned upward.','Bring rear end and back toward wall and squat down. Hold stretch for 20 seconds.','upload/exercise-picture/ff15584ed4d354bd3c44c8e22fae9f77.jpg'),(81,'Cable Lateral Raise','With low pulleys to each side, grasp left stirrup with right hand and right stirrup with left hand. Stand upright.','With elbows slightly bent, raise arms to sides\n\n\nuntil elbows are shoulder height. Lower and repeat.','upload/exercise-picture/CBLateralRaise.gif'),(82,'Barbell Wide Grip Upright Row','Grasp bar with wide overhand grip.','Pull bar to neck with elbows leading. Allow wrists to flex\nas bar rises. Lower and repeat.','upload/exercise-picture/BBWideGripUprightRow.gif'),(83,'Cable One Arm Lateral Raise','Grasp stirrup cable attachment. Stand facing with side of resting arm toward low pulley. Grasp ballet bar if available.','With elbow slightly bent, raise arm to side away from low pulley until elbow is shoulder height. Lower and repeat.','upload/exercise-picture/CBOneArmLateralRaise.gif'),(84,'Barbell Upright Row','Grasp bar with shoulder width or slightly narrower overhand grip.','Pull bar to neck with elbows leading. Allow wrists to flex as bar rises. Lower and repeat.','upload/exercise-picture/BBUprightRowM.gif'),(85,'Cable Seated Lateral Raise','Sit on seat above twin cable pulleys. Grasp stirrups on each side. Sit upright with arms nearly straight down to each side.','With elbows slightly bent, raise arms to side until elbows are shoulder height. Lower and repeat.','upload/exercise-picture/CBSeatedLateralRaise.gif'),(86,'Cable Upright Row','Grasp cable bar with shoulder width or slightly narrower overhand grip. Stand close to pulley.','Pull bar to neck with elbows leading. Allow wrists to flex as bar rises. Lower and repeat.','upload/exercise-picture/CBUprightRow.gif'),(87,'Cable Bar Upright Row','Grasp cable bar with shoulder width or slightly narrower overhand grip. Stand close to cable bar.','Pull bar to neck with elbows leading. Allow wrists to flex as bar rises. Lower and repeat.','upload/exercise-picture/CBBarUprightRow.gif'),(88,'Cable Upright Row (dual pulley)','Stand between low dual pulleys. Grasp handles with opposite hands - right hand holds left stirrup and left hand holds right stirrup. Stand upright with arms straight and palms facing back (overhand grip), one stirrup in front of other.','Pull handles up to front of shoulders with elbows leading and cables crossed. Allow wrists to flex as stirrups are lifted. Lower and repeat.','upload/exercise-picture/CBUprightRowDoublePulley.gif'),(89,'Cable One Arm Upright Row','Grasp stirrup on low pulley with overhand grip. Stand with side of arm with stirup away from pulley machine, arm against front of body. Place other hand on ballet bar or side of pulley column for support.','Pull stirup to front side of shoulder with elbow leading. Allow wrist to flex as stirrup is lifted. Lower and repeat.','upload/exercise-picture/CBOneArmUprightRow.gif'),(90,'Cable Upright Row (with rope attachment)','Grasp each side of rope with overhand grip, just under rope\nends. Stand close to pulley.','Pull rope ends to front of shoulders with elbows leading.\nAllow wrists to flex as stirrups are lifted. Lower and repeat.','upload/exercise-picture/CBUprightRowRope.gif'),(91,'Cable Lateral Raise (pulleys close)','Stand facing two low pulleys positioned side by side. Grasp stirrups with each hand. Stand upright with arms staight down to each side.','With elbows slightly bent, raise arms to side until elbows are shoulder height. Lower and repeat.','upload/exercise-picture/CBLateralRaiseClose.gif'),(92,'Cable Seated Y Raise (with rope attachment)','Sit slightly forward on seat or bench and grasp ends of rope attachment with hand. Place feet on vertical platform. Slide hips back so knees are slightly bent.','With torso upright pull rope upward over head until elbows are approximately lateral to each ear. Lower stirrups forward and downward until arms are extended straight in front of body. Repeat.','upload/exercise-picture/CBSeatedYRowRope.gif'),(93,'Cable Y Raise','Stand facing between low pulleys medium width apart, grasp left stirrup with right hand and right stirrup with left hand. Step back slightly away from pulleys and stand upright with cables crossed in front of hips.','With elbows slightly bent, raise arms upward and outward to sides in Y configuration until elbows are approximately lateral to each ear. Lower stirrups forward and downward in reverse pattern. Repeat.','upload/exercise-picture/CBYRaise.gif'),(94,'Dumbbell One Arm Lateral Raise','Position dumbbell in front of pelvis with elbow slightly bent. Grasp stationary object with other hand for support. Bend over with hips and knees bent slightly.','Raise upper arm to side until elbow is shoulder height. Maintain elbow\'s height above or equal to wrist. Lower and repeat. Continue with opposite arm.','upload/exercise-picture/DBOneArmLateralRaise.gif'),(95,'Cable Wide Grip Upright Row','Grasp cable bar with wide overhand grip. Stand close to pulley.','Pull bar to neck with elbows leading. Allow wrists to flex\nas bar rises. Lower and repeat.','upload/exercise-picture/CBWideGripUprightRow.gif'),(96,'Dumbbell Incline Lateral Raise','Grasp dumbbell in one hand. Lie on 30° to 45° incline bench with opposite side of body on incline, arm over top of bench, lower leg positioned on front side of seat, and upper leg on back side of seat. Position dumbbell inside of lower leg, just in front of upper leg.','Raise dumbbell from until upper arm is perpendicular to torso. Maintain slight fixed bend in elbow throughout exercise. Lower dumbbell to front of upper leg and repeat.','upload/exercise-picture/DBInclineLateralRaise.gif'),(97,'Cable Seated Y Raise','On dual pulley seated row machine, sit slightly forward on seat or bench in order to grasp both cable attachments. Place feet on vertical platform. Position torso upright and slide hips back so knees are slightly bent.','Raise arms upward and outward to sides in Y configuration while allowing elbows to partially bend. Pull back until elbows are approximately lateral to each ear. Lower stirrups forward and downward until arms are extended straight in front of body. Repeat.','upload/exercise-picture/CBSeatedYRaise.gif'),(98,'Cable Upright Row (stirrup attachments)','Grasp handles of both stirrups with overhand grip. Stand close to pulley.','Pull handles to front of shoulders with elbows leading. Allow wrists to flex as stirrups are lifted. Lower and repeat.','upload/exercise-picture/CBUprightRowStirrups.gif'),(99,'Dumbbell Lateral Raise','Grasp dumbbells in front of thighs with elbows slightly bent. Bend over slightly with hips and knees bent slightly.','Raise upper arms to sides until elbows are shoulder height. Maintain elbows\' height above or equal to wrists. Lower and repeat.','upload/exercise-picture/DBLateralRaise.gif'),(100,'Dumbbell Lying Lateral Raise','Lie on side with legs separated for support. Grasp dumbbell in front of thigh.','Raise dumbbell from floor until arm is vertical. Maintain fixed elbow position (10° to 30° angle) throughout exercise. Lower and repeat.','upload/exercise-picture/DBLyingLateralRaise.gif'),(101,'Dumbbell One Arm Seated Lateral Raise','Sit on stool or end of bench with legs together. Position dumbbell to side with elbow slightly bent. Angle torso slightly forward and place free hand on end of thigh for support.','Raise upper arm to side until elbow is shoulder height. Maintain elbow\'s height above or equal to wrist. Lower and repeat. Continue with opposite arm.','upload/exercise-picture/DBOneArmSeatedLateralRaise.gif'),(102,'Lever Barbell Upright Row (plate loaded)','Stand behind bar mid-thigh height, facing away from from fulcrum. Grasp bar with shoulder width or slightly narrower overhand grip. Disengage bar by rotating bar back and stand upright.','Pull bar to neck with elbows leading. Allow wrists to flex as bar rises. Lower and repeat.','upload/exercise-picture/LVSMUprightRow.gif'),(103,'Dumbbell Raise','Stand and grasp dumbbells with arms to side, palms facing sides of thighs.','Pull dumbbells up to sides of ribs with elbows out to sides. Lower and repeat.','upload/exercise-picture/DBRaise8.gif'),(104,'Dumbbell Upright Row','Grasp dumbbells and stand with palms facing front of thighs.','Pull dumbbells to front of shoulder with elbows leading out to sides. Allow wrists to flex as dumbbells rise upward. Lower and repeat.','upload/exercise-picture/DBUprightRow.gif'),(105,'Dumbbell One Arm Upright Row','Grasp dumbbells with palms facing front of thighs. Position other hand for support.','Pull dumbbell to front of shoulder with elbow leading. Allow wrist to flex as dumbbell rises upward. Lower and repeat. Continue with opposite arm.','upload/exercise-picture/DBOneArmUprightRow.gif'),(106,'Lever Lateral Raise','Sit in machine. Situate bent arms between padded lever and sides of body. Grasp handles if available.','Raise arms to sides until upper arms are horizontal. Return and repeat.','upload/exercise-picture/LVLateralRaise.gif'),(107,'Lever Lateral Raise (plate loaded)','Sit in machine. Situate bent arms between padded lever and sides of body.','Raise arms to sides until upper arms are horizontal. Return and repeat.','upload/exercise-picture/LVLateralRaiseH.gif'),(108,'Dumbbell Seated Upright Row','Sit on end of bench with legs far apart. Grasp dumbbell between legs with arm vertical under shoulder. Position torso slightly forward with hand on knee for support.','Pull dumbbell to front of shoulder with elbow leading out to side. Allow wrists to flex as dumbbell rises upward. Lower and repeat.','upload/exercise-picture/DBOneArmSeatedUprightRow.gif'),(109,'Lever Extended Arm Lateral Raise','Stand facing machine and grasp lever handles to each side with elbows straight or slightly bent.','Raise lever handles to sides until elbows are shoulder height. Maintain elbows\' height above or equal to wrists. Lower and repeat.','upload/exercise-picture/LVExtendedArmLateralRaise.gif'),(110,'Lever Extended Arm Kneeling Lateral Raise','Kneel on shin pads facing machine and grasp lever handles to each side with elbows straight or slightly bent.','Raise lever handles to sides until elbows are shoulder height. Maintain elbows\' height above or equal to wrists. Lower and repeat.','upload/exercise-picture/LVExtendedArmKneelingLateralRaise.gif'),(112,'Side Deltoid Stretch','Position arm across chest. Place opposite hand on elbow.','Push elbow toward chest. Hold stretch. Repeat with opposite arm.','upload/exercise-picture/217101e410d8d1d25cfc6478d0115ad1.jpg'),(113,'Fixed Bar Side Deltoid Stretch','Face stationary bar. Grasp stationary bar with one hand approximately chest height. Rotate body so upper arm is positioned across chest.','Turn body into upper arm. Hold stretch. Repeat with opposite arm.','upload/exercise-picture/d9fca31f579fd29d33241749ea84f365.jpg'),(114,'Suspended Y Lateral Raise','Grasp suspension handles and momentarily step back until arms are extended forward and straight. While keeping arms straight and shoulders back, step forward so body reclines back behind suspension handles. Position body and legs straight at desired angle hanging from handles with arms straight and palms angled inward.','Raise arms upward and outward in shape of a Y while keeping arms straight. Return and lower body back in opposite motion until arms are extended straight forward in original position. Repeat.','upload/exercise-picture/STYShoulderRaise.gif'),(115,'Smith Wide Grip Upright Row','Stand behind bar mid-thigh height. Grasp bar with wide grip\noverhand grip. Disengage bar by rotating bar back and stand upright.','Pull bar to neck with elbows leading. Allow wrists to flex\nas bar rises. Lower and repeat.','upload/exercise-picture/SMWideGripUprightRow.gif'),(116,'Smith Upright Row','Stand behind bar mid-thigh height. Grasp bar with shoulder width or slightly narrower overhand grip. Disengage bar by rotating bar back and stand upright.','Pull bar to neck with elbows leading. Allow wrists to flex as bar rises. Lower and repeat.','upload/exercise-picture/SMUprightRow.gif'),(117,'Barbell Lying Rear Delt Row','Lie chest down on elevated bench. Grasp bar with wide overhand grip.','Keeping upper arm perpendicular to torso, pull barbell up toward upper chest until upper arms are just beyond parallel to floor. Return and repeat.','upload/exercise-picture/BBLyingRearDeltRow.gif'),(118,'Cable Reverse Fly','Stand facing twin pulley cables positioned close together and approximately shoulder height. Grasp stirrup cable attachment in each hand. Step back away from machine so cable is taut. Stand with feet staggered. Point elbows outward with arms straight or slightly bent.','Pull stirrups out to sides, maintaining stiff elbow position throughout exercise. Return to original position and repeat.','upload/exercise-picture/CBStandingRearDeltFly.gif'),(119,'Cable Standing Rear Delt Row (with rope)','Stand facing rope attachment on high pulley cable. Grasp\neach end of rope just above enlarged ends. Step back with one\nfoot so arms and shoulders are positioned straight forward with\ncable taut. Point elbows outward.','Pull rope to upper chest or neck, keeping elbows at shoulder\nheight until elbows travel slightly behind back. Keep upper arms\nperpendicular to trunk. Return until arms are extended forward.\nRepeat.','upload/exercise-picture/CBStandingRearDeltRowRope.gif'),(120,'Cable Supine Reverse Fly','With bench between two high pulleys to each side, grasp left stirrup with right hand and right stirrup with left hand. Lie on bench with pulleys to each side of shoulders. Arms should be crossed above upper chest with elbows slightly bent.','Pull upper arms down to sides until elbows are shoulder height. Maintain upper arms perpendicular to torso and fixed elbow position (just slightly bent) as arms are pulled down to sides. Return arms to original position and repeat.','upload/exercise-picture/CBSupineRearLateralPull_.gif'),(121,'Barbell Rear Delt Raise','Stand holding barbell behind thighs or hips with arms straight down to sides.','Pull barbell behind hips and low back up as far as possible allowing elbows to travel up behind body to each side. Flex wrists near top of movement so bar can be raised higher. Lower until arms and wrists are straight. Repeat.','upload/exercise-picture/BBRearDeltRaise.gif'),(122,'Cable Seated Reverse Fly','Sit on seat facing twin pulley cables positioned approximately shoulder height. Grasp stirrup cable attachment in each hand. Straighten lower back upright so cable is taut. Point elbows outward with arms slightly bent.','Keeping elbows pointed high, pull stirrups out to sides, maintaining slightly bent elbow position throughout exercise. Return to original position and repeat.','upload/exercise-picture/CBSeatedRearDeltPull.gif'),(123,'Cable Rear Delt Row','Sit slightly forward on bench or platform in order to grasp cable bar attachment. With elbow width overhand grip, straighten torso upright and slide hips back until knees are only\n\n\nslightly bent.','Pull cable attachment toward upper chest, just below neck, with elbows up out to sides until elbows travel slightly behind back. Keep upper arms horizontal, perpendicular to trunk. Return until arms are extended and shoulders are stretched forward. Repeat.','upload/exercise-picture/CBRearDeltRow.gif'),(124,'Barbell Rear Delt Row','Bend knees slightly and bend over bar with back straight, approximately horizontal. Grasp bar with wide overhand grip.','Keeping upper arm perpendicular to torso, pull barbell up toward upper chest until upper arms are just beyond horizontal. Return and repeat.','upload/exercise-picture/BBRearDeltRow.gif'),(125,'Cable One Arm Reverse Fly','Stand with side to shoulder height cable pulley. Grasp stirrup cable attachment with hand furthest from pulley. Position arm across neck with elbow bent 30° to 45° outward.','Keeping elbows pointed high, pull stirrup out to side, maintaining fixed elbow position throughout exercise. Return to original position and repeat. Repeat with other arm.','upload/exercise-picture/CBRearDeltPull.gif'),(126,'Cable Rear Delt Row (stirrups)','On dual pulley seated row machine, sit slightly forward on seat or bench in order to grasp both cable attachments. Place feet on vertical platform. Position torso upright and slide hips back until knees are only slightly bent and cable taut. Point elbows outward.','Pull stirrups out to sides, keeping elbows at shoulder height until elbows travel slightly behind back. Allow wrists to follow elbows. Keep upper arms horizontal, perpendicular to trunk. Return until arms are extended and shoulders are stretched forward. Repeat.','upload/exercise-picture/CBRearDeltRowStirrups.gif'),(127,'Cable One Arm Rear Delt Row','Sit slightly forward on bench or platform in order to grasp stirrup cable attachment with one hand. Straighten torso upright and slide hips back until knees are only slightly bent. Point elbow out to side.','Pull stirrup out to side, elbows up shoulder height until elbows travel slightly behind back. Allow wrist to follow elbow. Keep upper arm horizontal, perpendicular to trunk. Return until arm is extended and shoulder is stretched forward. Repeat.','upload/exercise-picture/CBOneArmRearDeltRow.gif'),(128,'Cable Seated Rear Delt Row (stirrups)','Sit on seat facing twin pulley cables positioned shoulder height. Grasp stirrup cable attachment in each hand. Straighten lower back upright so arms and shoulders are positioned straight forward with cable taut. Point elbows outward.','Pull stirrups out to sides, keeping elbows at shoulder height until elbows travel slightly behind back. Allow wrists to follow elbows. Keep upper arms horizontal, perpendicular to trunk. Return until arms are extended and shoulders are stretched forward. Repeat.','upload/exercise-picture/CBSeatedRearDeltRow.gif'),(129,'Cable Seated Rear Lateral Raise','Sit at edge of bench with feet of floor ahead of knees. Rest torso on thighs. Reach under legs and grasp stirrup cable attachments, right hand holding left stirrup, left hand holding right stirrup.','Pull stirrups out to sides until elbows are shoulder height. Maintain upper arms perpendicular to torso and fixed elbow position (10° to 30° angle) throughout exercise. Lower until arms contact sides of legs. Repeat.','upload/exercise-picture/CBSeatedRearLateralRaise.gif'),(130,'Cable One Arm Rear Lateral Raise','Stand with side to low pulley. Grasp stirrup attachment with hand furthest from pulley. Bend knees slightly and bend over with resting arm to side of low pulley.','Raise arm to side until elbow is shoulder height. Maintain upper arm perpendicular to torso and fixed elbow position (10° to 30° angle) throughout exercise. Lower and repeat. Repeat with other arm.','upload/exercise-picture/CBRearLateralRaise.gif'),(131,'Cable Standing Rear Delt Row (stirrups)','Stand facing twin pulley cables positioned shoulder height. Grasp stirrup cable attachment in each hand. Step back with one foot so arms and shoulders are positioned straight forward with cable taut. Point elbows outward.','Pull stirrups out to sides, keeping elbows at shoulder height until elbows travel slightly behind back. Allow wrists to follow elbows. Keep upper arms horizontal, perpendicular to trunk. Return until arms are extended and shoulders are stretched forward. Repeat.','upload/exercise-picture/CBStandingRearDeltRow.gif'),(132,'Dumbbell Lying Rear Lateral Raise','Lie chest down on elevated bench. Grasp dumbbells below to each side.','Raise upper arms to sides until elbows are shoulder height. Maintain upper arms perpendicular to torso and fixed elbow position (10° to 30° angle) throughout exercise. Maintain height of elbows above wrists by raising \"pinkie\" side up. Lower and repeat.','upload/exercise-picture/DBLyingRearLateralRaise.gif'),(133,'Dumbbell Lying Rear Delt Row','Lie chest down on elevated bench. Grasp dumbbells below.','Keeping upper arm perpendicular to torso and dumbbells just below elbows, pull dumbbells up until elbows are just above shoulders. Return and repeat.','upload/exercise-picture/DBLyingRearDeltRow.gif'),(134,'Cable Rear Lateral Raise','Stand with cable columns to each side. Grasp left stirrup with right hand and right stirrup with left hand. Bend knees and bend over at hips, so torso is approximately horizontal with back straight. Point elbows outward with arms slightly bent.','Raise upper arms to sides until elbows are shoulder height. Maintain upper arms perpendicular to torso and slight bend in elbows as arms are raised to sides. Lower and repeat.','upload/exercise-picture/CableBentOverLateralRaise.gif'),(135,'Cable Standing Cross Row','Stand between two shoulder-high cable pulleys (adjustable cross-over machine). Grasp right stirrup with left hand and left stirrup with right hand. Step back until cables are angled back 30° to 45°. Position both elbows at height of shoulders, one over other.','Pull both cable attachments by moving elbows back to sides. Keep upper arms horizontal, perpendicular to trunk. Return and repeat.','upload/exercise-picture/CBStandingCrossRow.gif'),(136,'Cable One Arm Standing Cross Row','Facing shoulder height cable pulley, grasp stirrup cable attachment with one hand, palm orientated down. Step back and turn body inward about 30° to 45° to face extended arm about. Stand back just enough to allow arm to be fully extended with weight raised up slightly.','Pull stirrup back with elbow up at shoulder height until elbow travels just behind shoulder. Keep upper arm horizontal, perpendicular to trunk. Return until arm is fully extended. Repeat.','upload/exercise-picture/CBOneArmCrossRow.gif'),(137,'Dumbbell Side Lying Rear Delt Raise','Lie on side with legs separated for support. Grasp dumbbell in front of chest, palm facing down, arm extended forward with slight bend.','Raise dumbbell from floor until it travels above shoulder. Return dumbbell to floor at original position. Repeat.','upload/exercise-picture/DBLyingRearDeltRaise.gif'),(138,'Dumbbell Rear Lateral Raise','Grasp dumbbells to each side. Bend knees and bend over through hips with back flat, close to horizontal. Position elbows with slight bend and palms facing together.','Raise upper arms to sides until elbows are shoulder height. Maintain upper arms perpendicular to torso and fixed elbow position (10° to 30° angle) throughout exercise. Maintain height of elbows above wrists by raising \"pinkie finger\" side up. Lower and repeat.','upload/exercise-picture/DBRearLateralRaise.gif'),(139,'Dumbbell Lying One Arm Rear Lateral Raise','With dumbbell in one hand, lie chest down on elevated bench. Position palm forward (thumb up) with elbow straight or slightly bent.','Raise upper arm to side until elbow is shoulder height. Maintain upper arms perpendicular to torso with elbow straight throughout exercise. Maintain palm forward position. Lower and repeat.','upload/exercise-picture/DBOneArmLyingLateralRaise.gif'),(140,'Dumbbell Rear Delt Row','Kneel over side of bench with arm and leg to side. Grasp dumbbell.','Pull dumbbell up out to side with upper arm perpendicular to trunk until upper arm is just beyond horizontal. Lower and repeat.','upload/exercise-picture/DBRearDeltRow.gif'),(141,'Lever Incline Rear Delt Row (plate loaded)','Lie chest low on inclined platform and grasp forward lever handles with wide overhand grip.','Pull lever with elbows\n\nforward\n\nout to sides until upper arms are just beyond parallel, keeping upper arm perpendicular to torso. Return and repeat.','upload/exercise-picture/LVInclineRearDeltRow.gif'),(142,'Lever Lying Rear Lateral Raise (plate loaded)','Lie on machine with chest against padding. Position arms between padded lever arms with elbows below shoulders.','Pull arms up until elbows are beyond back. Return and repeat.','upload/exercise-picture/LVLyingRearDeltRaiseH.gif'),(143,'Lever Seated Rear Delt Row (plate loaded)','Place seat at low position. Sit on seat with chest against pad and grasp upper handles.','Pull lever with elbows up out to sides until upper arms are just beyond parallel, keeping upper arm horizontal, perpendicular to torso. Return and repeat.','upload/exercise-picture/LVRearDeltRowH.gif'),(144,'Dumbbell Seated Rear Lateral Raise','Sit on edge of bench with feet placed beyond knees. Bend over and rest torso on thighs. Grasp dumbbells with each hand under legs. Position elbows with slight bend with palms facing together behind ankles (as shown) or just to sides of ankles.','Raise upper arms to sides until elbows are shoulder height. Maintain upper arms perpendicular to torso and fixed elbow position (10° to 30° angle) throughout exercise. Maintain elbows height above wrists by raising \"pinkie finger\" side up. Lower and repeat.','upload/exercise-picture/DBSeatedRearLateralRaise.gif'),(145,'Lever Rear Delt Raise (plate loaded)','Stand between lever handles facing away from machine. Squat down and grasp lever handles to each side. Stand up with arms straight to sides.','Pull lever up as far as possible allowing elbows to travel up behind body to each side. Lower until arms are straight and repeat.','upload/exercise-picture/LVRearRaiseH.gif'),(147,'Lever Seated Rear Lateral Raise (plate loaded)','Sit on seat with feet placed on platform ahead of knees. Rest torso on thighs. Reach under legs and grasp lever handles on each side.','Pull lever handles out to sides until elbows are shoulder height. Maintain upper arms perpendicular to torso and fixed elbow position (10° to 30° angle) throughout exercise. Lower and repeat.','upload/exercise-picture/LVSeatedRearLateralRaise.gif'),(148,'Lever Rear Lateral Raise (on extended arm kneeling lateral raise machine)','Stand on platform facing lateral raise machine. Bend knees and bend over at hips with back flat close to horizontal. With arms straight or slightly bent, grasp lever handles with each hand.','Maintaining torso position, raise handles to sides until upper arm is shoulder height. Lower and repeat.','upload/exercise-picture/LVBentOverExtArmLateralRaise.gif'),(149,'Lever Seated Rear Delt Row','Place seat at low position. Sit on seat with chest against pad and grasp upper handles.','Pull lever with elbows up out to sides until upper arms are just beyond parallel, keeping upper arm horizontal, perpendicular to torso. Return and repeat.','upload/exercise-picture/LVSeatedRearDeltRow.gif'),(150,'Lever Seated Reverse Fly (parallel grip)','Sit on machine with chest against pad. Grasp parallel handles with thumbs up at shoulder height. Slightly bend elbows and internally rotate shoulders so elbows are also at height of shoulders.','Keeping elbows pointed high, pull handles apart and to rear until elbows are just behind back. Return and repeat.','upload/exercise-picture/LVSeatedReverseFlyParallelGrip.gif'),(151,'Lever Rear Lateral Raise (on lateral raise machine)','Stand on platform facing lateral raise machine. Bend knees and bend over at hips with back flat close to horizontal. With elbows bent under shoulders, position back of upper arms against arm pads.','Maintaining torso position, raise upper arms to sides until elbows are shoulder height. Lower and repeat.','upload/exercise-picture/LVRearLateralRaiseOnLatRsMch.gif'),(152,'Lever T-Bar Rear Delt Row (plate loaded)','Straddle lever bar facing handles. Bend knees slightly and bend over handles with back straight. Grasp wide grip handles with overhand grip. With arms extended, position torso just high enough to allow weight to make contact with floor.','With elbows out to sides, pull bar up toward upper chest until elbows are same height as shoulders or just beyond, keeping upper arm perpendicular to torso. Return and repeat.','upload/exercise-picture/LVTBarRearDeltRow.gif'),(153,'Lever Lying Rear Lateral Raise','Lie on machine with chest against padding. Position arms between padded lever arms with elbows below shoulders.','Pull arms up until elbows are beyond back. Lower and repeat.','upload/exercise-picture/LVLyingRearLateralRaise.gif'),(154,'Lever Seated Reverse Fly (on pec deck)','Sit on machine with chest against vertical pad. Position arms against padded lever arms at height of shoulders.','Pull arms back until elbows are beyond back. Return and repeat.','upload/exercise-picture/LVSeatedRearDeltFlyOnPecDeck.gif'),(155,'Lever Seated Reverse Fly (overhand grip)','Sit on machine with chest against pad. Grasp horizontal handles with overhand grip at shoulder height. Internally rotate shoulders so elbows are also at height of shoulders.','Keeping elbows pointed high, pull handles apart and to rear until elbows are just behind back Return and repeat.','upload/exercise-picture/LVRearDeltFlyOverhandGrip.gif'),(156,'Lever Seated Reverse Fly (pronated parallel grip)','Sit in machine with chest against pad. Grasp parallel handles from inside with thumbs down at shoulder height.','Keeping elbows pointed high, pull handles apart and to rear until elbows are just behind back. Return and repeat.','upload/exercise-picture/LVSeatedRearDeltFlyInsideParallelGrip.gif'),(157,'Lever Seated Reverse Fly (gripless)','Sit on machine with back against vertical pad and roller pads in front of body. Place feet forward on foot bars. Cross both arms in front of body situated between roller pads. Position arms one on top of another, shoulder height.','Pull arms apart and back until elbows are slightly beyond back. Return to starting position and repeat.','upload/exercise-picture/LVSeatedRearDeltFly.gif'),(158,'Rear Delt Inverted Row (high bar)','Stand facing lower to upper chest height horizontal bar. Step toward bar so chest makes contact. Grasp bar with wide overhand grip. Turn elbows outward to sides. Position feet forward on floor so body is reclined back with legs, hips and spine straight. Position forearms perpendicular to body, orientated forward. Also, position upper arms perpendicular to body, orientated to each side.','Lower body back until arms are extended straight while keeping body straight and elbows high (upper arm perpendicular to torso). Pull body toward bar until upper arms are just beyond parallel to one another. Return and repeat.','upload/exercise-picture/BWRearDeltInvertedRowHigh.gif'),(159,'Rear Delt Inverted Row','Stand facing waist to lower chest height horizontal bar. Grasp bar with wide overhand grip. Turn elbows outward to sides. Walk forward under bar while pulling upper chest close to bar. With heels on floor, position body at angle under bar with legs, hips and spine straight. Position forearms perpendicular to body, orientated forward. Also, position upper arms perpendicular to body, orientated to each side.','Lower body downward until arms are extended straight while keeping body straight and elbows high (upper arm perpendicular to torso). Pull body toward bar until upper arms are just beyond parallel to one another. Return and repeat.','upload/exercise-picture/BWRearDeltInvertedRow.gif'),(160,'Smith Rear Delt Row','Stand near low smith bar. Bend knees and bend over bar with back straight. Grasp bar with wide\n\n\noverhand grip. Disengage bar by rotating bar back.','Keeping upper arm perpendicular to torso, pull bar up toward upper chest until upper arms are just beyond parallel to floor. Return and repeat.','upload/exercise-picture/SMBentoverRearDeltRowSideView.gif'),(162,'Suspended Reverse Fly','Grasp suspension handles and momentarily step back until arms are extended forward and straight. While keeping arms straight and shoulders back, step forward so body reclines back behind suspension handles. Position body and legs straight at desired angle hanging from handles with arms straight. Internally rotate shoulders so elbows are positioned directly outwards with arms straight or slightly bent. Shoulder should be positioned approximately 90° relative to torso position.','Pull handles out to sides while keeping stiff elbow position and maintaining shoulder at 90° plane to torso throughout exercise. Raise up until upper arms are in-line to one another. Return to original position in same plane and repeat.','upload/exercise-picture/STReverseFlyStaggered.gif'),(163,'Suspended Rear Delt Row','Grasp suspension handles and momentarily step back until arms are extended forward and straight. While keeping arms straight and shoulders back, step forward so body reclines back behind suspension handles.\nPosition body and legs straight at desired angle hanging from handles with arms straight. Internally rotate shoulders so elbows are positioned directly outwards.','Pull body up while keeping elbows pointed directly out to each side and body and legs straight. Pull until elbows are directly lateral to each side without allowing elbows to drop. Return until arms are extended straight and shoulders are stretched forward, maintaining high elbow position. Repeat.','upload/exercise-picture/STRearDeltRow.gif'),(164,'Rear Deltoid Stretch','Position arm across neck. Place opposite hand on elbow.','Push elbow toward neck. Hold stretch. Repeat with opposite arm.','upload/exercise-picture/e804bc162a98017991aec45287ea60f3.jpg'),(165,'Fixed Bar Rear Deltoid Stretch','Face stationary bar. Grasp stationary bar with one hand approximately face height. Rotate body so upper arm is positioned across neck.','Turn body into upper arm. Hold stretch. Repeat with opposite arm.','upload/exercise-picture/277fbfe41e0114de998ccabb0af995e7.jpg'),(167,'Dumbbell Seated Front Lateral Raise','Sit on stool or end of bench with dumbbell. Position dumbbell down to side with arm straight. Turn pinkie finger side outward.','Raise arms to side, slightly in front until shoulder height or slightly higher. Lower and repeat. Continue with opposite arm.','upload/exercise-picture/DBOneArmSeatedFrontLateralRaise.gif'),(168,'Dumbbell Front Lateral Raise','Grasp dumbbell and position in front of thigh with arm straight. Turn pinkie finger side outward.','Raise arms to side, slightly to front until shoulder height or slightly higher. Lower and repeat. Continue with opposite arm.','upload/exercise-picture/DBFrontLateralRaise.gif'),(169,'Dumbbell Full Can Lateral Raise','Grasp dumbbells with each hand with palms facing forward.','Raise arms to side with thumb side up. Lower and repeat.','upload/exercise-picture/DBFullCanLateralRaise.gif'),(170,'Cable Front Lateral Raise','Grasp dumbbell cable attachment. Stand facing side with resting arm toward low pulley. Grasp ballet bar if available for support. Internally rotate shoulders so elbows point out to sides.','With elbow straight or slightly bent, raise upper arm away from low pulley to side, slightly to front (30°) until upper arm is shoulder height. Lower and repeat. Continue with opposite arm.','upload/exercise-picture/CBFrontLateralRaise.gif'),(171,'Cable Seated Front Lateral Raise','Sit on seat above twin cable pulleys. Grasp stirrups on each side. Sit upright with arms nearly straight down to each side. Internally rotate shoulders so elbows point out to sides.','With elbows straight or slightly bent, raise upper arm away from low pulley to side, slightly to front (30° to 45°) until upper arm is shoulder height or slightly higher. Lower and repeat.','upload/exercise-picture/CBSeatedFrontLateralRaise.gif'),(172,'Barbell Close Grip Bench Press','Lie on bench and grasp barbell from rack with shoulder width grip.','Lower weight to chest with elbows close to body. Push barbell back up until arms are straight. Repeat.','upload/exercise-picture/BBCloseGripBenchPress.gif'),(173,'Machine-assisted Triceps Dip','Mount shoulder width dip bar, arms straight with shoulders above hands. Step down onto assistance lever. Keep hips and knees straight.','Lower body until slight stretch is felt in shoulders. Push body up until arms are straight. Repeat.','upload/exercise-picture/ASTricepsDip.gif'),(174,'Barbell JM Bench Press','Lie on bench with back flat on bench and grasp barbell from rack with shoulder width or slightly narrower grip.','Lower in straight line toward neck while keeping elbows relatively high and bending them out to sides, approximately 45° from midline of body. Flex wrists slightly as bar is lowered as to keep weight of bar on base of palms. Pause when forearms mak\n\n\ne solid contact with biceps. Push barbell back up until arms are straight. Repeat.','upload/exercise-picture/BBJMPress.gif'),(175,'Machine-assisted Triceps Dip (kneeling)','Mount shoulder width dip bar, arms straight with shoulders above hands. Kneel on padded platform, lowering it down slightly so hips are slightly bent.','Lower body until slight stretch is felt in shoulders. Push body up until arms are straight. Repeat.','upload/exercise-picture/ASTricepsDipKneeling.gif'),(176,'Barbell Lying Triceps Extension','Lie on bench with narrow overhand grip on barbell. Position barbell over forehead with arms extended.','Lower bar by bending elbows. As bar nears head, move elbows slightly back just enough to allow bar to clear around curvature of head. Extend arms. As bar clears head, reposition elbows to their former position until arms are fully extended. Repeat.','upload/exercise-picture/BBLyingTricepsExtension.gif'),(177,'Barbell Close Grip Incline Bench Press','Lie on bench with bar above chest. Grasp bar from rack with shoulder width or slightly narrower grip. Disengage bar by rotating bar back.','Lower weight to chest with elbows close to body. Push barbell up until arms are straight. Repeat.','upload/exercise-picture/BBCloseGripInclineBenchPress.gif'),(178,'Barbell Lying Triceps Extension \"Skull Crusher\"','Lie on bench with narrow overhand grip on barbell. Position barbell over shoulders with arms extended.','Lower bar to forehead by bending elbows. Extend arms and repeat.','upload/exercise-picture/BBLyingTricepsExtensionSC.gif'),(179,'Barbell Incline Triceps Extension','Lie on slightly incline bench with narrow overhand grip on barbell. Position barbell over shoulders with arms extended.','Lower bar by bending elbows. As bar nears head, move elbows slightly back just enough to allow bar to clear around curvature of head. Extend arms. As bar clears head, reposition elbows to their former position until arms are fully extended. Repeat.','upload/exercise-picture/BBInclineTricepsExtension.gif'),(180,'Barbell Triceps Extension','Position barbell overhead with narrow overhand grip.','Lower forearm behind upper arm with elbows remaining overhead. Extend forearm overhead. Lower and repeat.','upload/exercise-picture/BBSeatedTricepsExtension.gif'),(181,'Barbell Decline Triceps Extension','Lie on decline bench with narrow overhand grip on barbell. Position barbell over shoulders with arms extended.','Lower bar by bending elbows. As bar nears head, move elbows slightly back just enough to allow bar to clear around curvature of head. Extend arms. As bar clears head, reposition elbows to its former position until arms are fully extended. Repeat.','upload/exercise-picture/BBDeclineTricepsExt.gif'),(182,'Cable Bent-over Triceps Extension','Grasp cable bar from medium high pulley with narrow or shoulder width overhand grip. Turn body away from pulley apparatus and position turned cable bar behind neck. Bend over downward with cable bar positioned behind neck, gripped at each side. Lunge forward with one leg. Allow elbows to be pulled back under cable resistance.','Extend forearms forward until elbows are straight. Allow cable bar to return back over neck. Repeat.','upload/exercise-picture/CBOverheadTricepsExt.gif'),(183,'Cable Forward Triceps Extension','Grasp stirrup from medium high pulley. Turn body away from pulley apparatus and position stirrup over shoulder with palms down. Step forward with one foot so cable is taut. Position elbow forward about shoulder height.','Push stirrup forward by extending forearm until elbow is straight. Allow stirrup to return back over shoulder. Repeat and repeat. Continue with opposite arm.','upload/exercise-picture/CBOneArmForwardTricepsExt.gif'),(184,'Cable Incline Triceps Extension','Grasp cable bar from behind with narrow overhand grip. Position elbows overhead.','Extend forearm overhead until elbows are straight. Lower until forearms are against upper arms. Repeat.','upload/exercise-picture/CBInclineTricepsExtension.gif'),(185,'Cable Bent-over Triceps Extension (with rope attachment)','Grasp rope attachment from medium high pulley. Turn body away from pulley apparatus and position turned rope attachment behind neck. Bend over downward with rope attachment positioned behind neck gripped at each side. Lunge forward with one leg. Allow elbows to be pulled back under cable resistance.','Extend forearms forward until elbows are straight. Allow cable bar to return back over neck. Repeat.','upload/exercise-picture/CBOverheadTricepsExtRope.gif'),(186,'Cable Lying Triceps Extension','Lie on bench and grasp bar with narrow overhand grip. With arms extended, position bar over forehead.','Lower bar by bending elbow. As bar nears head, move elbows slightly back just enough to allow bar to clear around curvature of head. Extend arm. As bar clears head, reposition elbows to its former position until arm is fully extended. Repeat.','upload/exercise-picture/CBLyingTricepsExtension.gif'),(187,'Cable Kneeling Triceps Extension','Grasp cable bar from middle pulley with narrow or shoulder width overhand grip. Turn body away from pulley apparatus with cable bar above head. Kneel before bench, bend over and place elbows on edge of bench. Maintain upper arms parallel with shoulders as low as possible.','Extend forearms over head until elbow are fully extended. Return and repeat.','upload/exercise-picture/CBKneelingTricepsExt.gif'),(188,'Cable Decline Triceps Extension','Position legs under lower leg pad and lie back on bench. Grasp bar with narrow overhand grip. Position bar near forehead or top of head.','Extend elbows to raise bar attachment until arms are straight. As arms extended, position them vertically. Lower bar by bending elbows. As bar nears head, reposition elbows back just enough to allow bar to clear around curvature of head. Repeat.','upload/exercise-picture/CBDeclineTricepsExt.gif'),(189,'Cable Pushdown (forward leaning)','Face high pulley and grasp revolving bar cable attachment with overhand grip. Position one leg back and bend forward leg with body leaning forward. Position revolving bar down in front of face with forearms nearing vertical.','Push cable bar downward by extending arms until elbows are straight. Return to front of face until forearms are nearly vertical and close to upper arm. Repeat.','upload/exercise-picture/CBForwardLeaningPushdown.gif'),(190,'Cable Bar Pushdown','Position adjustable pulleys slightly above head. Face cable bar and grasp with overhand narrow grip. Position elbows to side.','Extend arms down. Return until forearm is close to upper arm. Repeat.','upload/exercise-picture/CBBarPushdown.gif'),(191,'Cable Pushdown','Face high pulley and grasp cable attachment with narrow overhand grip. Position elbows to side.','Extend arms down. Return until forearm is close to upper arm. Repeat.','upload/exercise-picture/CBPushdown.gif'),(192,'Cable Alternating Seated Pushdown','Sit on seat or bench in font of two close high pulleys. Grasp stirrup with each hand (over or underhand grip). Position elbows to side.','Push one stirrup down by extending elbow until arm is straight. Return until forearm returns to original positon, keeping elbow close to side. Repeat with opposite arm and alternate.','upload/exercise-picture/CBAlternatingSeatedPushdown.gif'),(193,'Cable Pushdown (with V-bar)','Face high pulley and grasp V-bar attachment with narrow overhand grip. Position elbows to side.','Extend arms down. Return until forearm is close to upper arm. Repeat.','upload/exercise-picture/CBPushdownV.gif'),(194,'Cable Side Triceps Extension','Grasp stirrup from medium high pulley. Turn body so pulley is to side of free arm while lifting stirrup over head. Step forward, just slightly to allow stirrup to be placed behind head, just over shoulder. Place elbow just slightly higher than shoulder height and position palm down.','Push stirrup out to side by extending forearm until elbow is straight. Allow stirrup to return back over shoulder. Repeat and repeat. Continue with opposite arm.','upload/exercise-picture/CBOneArmSideTricepsExt.gif'),(195,'Cable Pushdown (with rope attachment)','Face high pulley and grasp rope attachment with clinched hands side by side (palms in). Position elbows to side.','Extend arms down. Turn palms down at bottom. Return until forearm is close to upper arm and hands are in original position. Repeat.','upload/exercise-picture/CBPushdownRope.gif'),(196,'Cable Pushdown (with back support)','Place back against vertical back support. Grasp cable attachment from high pulley with narrow overhand grip. Position elbows to side.','Extend arms down. Return until forearm is close to upper arm. Repeat.','upload/exercise-picture/CBStandingTricepsExtensionBackSupport.gif'),(197,'Cable One Arm Pushdown','Grasp dumbbell cable attachment with underhand grip. Position elbow to side.','Extend arm down. Return until forearm is close to upper arm. Repeat. Continue with opposite arm.','upload/exercise-picture/CBOneArmPushdown.gif'),(198,'Cable Incline Pushdown','Lie on incline bench facing away from high pulley. Grasp cable attachment overhead with overhand narrow grip. Position elbow to sides, slightly up.','Extend arms with elbows stationary. Return until forearm is close to upper arm. Repeat.','upload/exercise-picture/CBInclinePushdown.gif'),(199,'Cable One Arm Triceps Extension (supinated grip)','Grasp stirrup cable attachment from behind. Place hand with cable behind neck; palm toward neck and elbow positioned upward.','Extend arm upward. Return and repeat. Continue with opposite arm.','upload/exercise-picture/CBSeatedTricepsExtSupGrip.gif'),(200,'Cable Triceps Dip','Step between shoulder width dip bars with dip belt around waist. Kneel as close to low pulley and attach cable to dip belt. Stand up and mount dip bar, arms straight with shoulders above hands. Keep hips straight.','Lower body by bending arms until slight stretch is felt in shoulders. Push body up until arms are straight. Repeat.','upload/exercise-picture/CBTricepsDip.gif'),(201,'Cable Triceps Extension','Stand or sit on bench or seat with back support just below shoulders. Position cable bar behind neck or shoulders with narrow overhand grip. Position elbows over head.','Extend forearm overhead until arms are straight. Lower until forearms are against upper arms. Repeat.','upload/exercise-picture/CBSeatedTricepsExtension.gif'),(202,'Cable One Arm Triceps Extension (pronated grip)','Grasp stirrup cable attachment from behind. Place hand with cable behind neck; palm toward neck and elbow positioned upward.','Extend arm upward. Return and repeat. Continue with opposite arm.','upload/exercise-picture/CBOneArmTricepsExtensionPronated.gif'),(203,'Dumbbell One Arm Triceps Extension','Sit on seat with back support just below shoulder height. Position dumbbell over head with arm straight up or slightly back.','Lower dumbbell behind neck or shoulder while maintaining upper arm\'s vertical position throughout exercise. Extend arm until straight. Return and repeat. Continue with opposite arm.','upload/exercise-picture/DBSeatedTricepsExtBackSupport.gif'),(204,'Dumbbell Lying Triceps Extension','Lie on bench and position dumbbells over head with arms extended.','Lower dumbbells by bending elbow until they are to sides of head. Extend arm. Repeat.','upload/exercise-picture/DBLyingTricepsExtension.gif'),(205,'Dumbbell Kickback','Kneel over bench with arm supporting body. Grasp dumbbell. Position upper arm parallel to floor.','Extend arm until it is straight. Return and repeat. Continue with opposite arm.','upload/exercise-picture/DBKickback.gif'),(206,'Dumbbell Decline Triceps Extension','Lie on decline bench and position dumbbells over shoulders with arms extended.','Lower dumbbells by bending elbow until they are to sides of head; dumbbells touch shoulder. Extend arm. Repeat.','upload/exercise-picture/DBDeclineTricepsExtension.gif'),(207,'Cable Triceps Extension (with rope)','From low pulley cable, grasp ends of rope attachment just\nunder enlarged ends. Raise one arm over head while turning body\naway from pulley. Face away from pulley with feet staggered.\nPosition ends of ropes behind head or neck and elbows upward\nover head.','Raise ends of rope overhead by extending forearms until arms\nare straight. Lower rope attachment until forearms are against\nupper arms. Repeat.','upload/exercise-picture/CBTricepsExtensionRope.gif'),(208,'Dumbbell Incline Triceps Extension','Lie supine on incline bench with back of head on upper corner of bench. Position dumbbells over head with arms extended.','Lower dumbbells by bending elbow until they are to sides of head. Extend arm and repeat.','upload/exercise-picture/DBInclineTricepsExtension.gif'),(209,'Dumbbell Triceps Extension','Position one dumbbell over head with both hands under inner plate (heart shaped grip).','With elbows over head, lower forearm behind upper arm by flexing elbows. Flex wrists at bottom to avoid hitting dumbbell on back of neck. Raise dumbbell over head by extending elbows while hyperextending wrists. Return and repeat.','upload/exercise-picture/DBTricepsExtension.gif'),(210,'Dumbbell One Arm Triceps Extension (on bench)','Position dumbbell behind neck with elbow positioned upward.','Extend arm until straight while maintaining upper arm\'s vertical position throughout exercise. Return until dumbbell is behind neck or shoulder and repeat. Continue with opposite arm.','upload/exercise-picture/DBOneArmTricepsExtension.gif'),(211,'Lever Close Grip Bench Press (plate loaded)','Lie on bench with lever handles above sides of chest. Grasp handles with narrow overhand grip just above each side of chest.','Press lever up until arms are extended. Return weights down to starting position. Repeat.','upload/exercise-picture/LVCloseGripBenchPressH.gif'),(212,'Lever Barbell Close Grip Bench Press (plate loaded)','Lie on bench with bar above chest and grasp bar with shoulder width or slightly narrower grip. Disengage bar by rotating bar back.','Lower weight to chest with elbows close to body. Push barbell back up until arms are straight. Repeat.','upload/exercise-picture/LVSMCloseGripBenchPress.gif'),(213,'Lever Overhead Triceps Extension','Sit on seat. Push foot lever down with foot and grasp lever handles from behind. With lever handles behind neck, place both feet on support or floor.','Push lever handles up over head until arms are fully extended. Return and repeat.','upload/exercise-picture/LVOverheadTricepsExtension.gif'),(214,'Lever Incline Triceps Extension','Sit on seat and lie back on back support. Push foot lever down with foot and grasp lever handles from behind. With lever handles behind head, place both feet on support or floor.','Push lever handles up over head until arms are fully extended. Return and repeat.','upload/exercise-picture/LVInclineTricepsExtension.gif'),(215,'Lever Pushdown','Sit on seat and grasp handles by shoulders. Position elbows to sides.','Push lever down beyond hips until arm is fully extended. Return and repeat.','upload/exercise-picture/LVPushdown.gif'),(216,'Lever Triceps Extension (no seat, plate loaded)','Stand behind arm pad facing lever handles. Place one foot forward under arm pad and opposite foot back on foot bar. Grasp handles with narrow overhand grip. Squat down and position chest up against side of pad and back of upper arms on upper angled padded surface.','Push lever down until arms are fully extended. Return and repeat.','upload/exercise-picture/LVTricepsExtensionNoSeatPL.gif'),(217,'Lever Triceps Dip (plate loaded)','Sit upright on seat. If possible, place handles in narrow position. Grasp handles.','Push levers down with elbows pointing back. Allow lever bar to raise until shoulders are slightly stretched. Repeat.','upload/exercise-picture/LVTricepsDipH.gif'),(218,'Lever Triceps Extension (plate loaded)','Sit on seat. Place forearms on lever pad and back of upper arms, parallel on padding with elbows in line with lever\'s fulcrum.','Push lever down until arms are fully extended. Return and repeat.','upload/exercise-picture/LVTriExtGripless.gif'),(219,'Lever Triceps Dip','If possible, place handles in narrow position. Sit on seat with legs under pads. Grasp handles and position elbows back.','Push levers down by straightening arms downward. Allow lever bar to raise with elbows pointing back until shoulders are slightly stretched. Repeat.','upload/exercise-picture/LVTricepsDip2.gif'),(220,'Lever Seated Close Grip Press','Sit on seat with chest at height of handles. Grasp handles with shoulder width or slightly narrower overhand grip, just against sides of chest; elbows somewhat down to sides.','Press lever until arms are extended. Return weight until forearm is against upper arm. Repeat.','upload/exercise-picture/LVCloseGripChestPress.gif'),(222,'Lever Close Grip Incline Bench Press','Lie on incline bench with parallel lever bars close to sides of chest. Grasp handles with shoulder width grip.','Press lever until arms are ext\n\n\nended. Return weight until wrists are at side of chest. Repeat.','upload/exercise-picture/LVCloseGripInclineBenchPress.gif'),(223,'Lever Alternating Triceps Extension','Sit on seat. Grasp handles and place back of upper arms on padding.','Push one lever out and down until arm is fully extended. Return until forearm contacts upper arm. Repeat with opposite arm. Continue alternating movement between arms.','upload/exercise-picture/LVAlternatingTricepsExtensionS.gif'),(224,'Lever Triceps Extension','Sit on seat. Grasp handles and place back of upper arms parallel on padding with elbows approximately in line with lever\'s fulcrum.','Push lever down until arms are fully extended. Return until forearms contact upper arms. Repeat.','upload/exercise-picture/LVTricepsExtension.gif'),(225,'Sled Standing Triceps Dip','Stand between handles facing machine. Grasp parallel handles and position elbows back. Squat down slightly by bending hips and knees, just enough to raise selected weight up from remaining weight stack.','Push levers down by straightening arms downward. Allow lever bar to raise with elbows pointing back until slight stretch is felt in shoulders. Repeat.','upload/exercise-picture/SLStandingTricepsDip.gif'),(226,'Smith Close Grip Bench Press','Lie on bench with bar above chest and grasp bar with shoulder width or slightly narrower grip. Disengage bar by rotating bar back.','Lower weight to chest with elbows close to body. Push bar back up until arms are straight. Repeat.','upload/exercise-picture/SMCloseGripBenchPress.gif'),(228,'Lever Overhand Triceps Dip','Sit on seat with back against pad. Gra\n\n\nsp end of handles with overhand grip and position elbows back.','Push levers down by straightening arms downward. Allow lever bar to raise with elbows pointing back until shoulders are slightly stretched. Repeat.','upload/exercise-picture/LVTricepsDipOverhand.gif'),(229,'Smith Close Grip Incline Bench Press','Lie on incline bench with bar above chest and grasp bar with shoulder width or slightly narrower grip. Disengage bar by rotating bar back.','Lower weight to chest with elbows close to body. Push bar back up until arms are straight. Repeat.','upload/exercise-picture/SMCloseGripInclineBenchPress.gif'),(230,'Weighted Bench Dip','Sit on inside of one of two benches placed parallel, slightly less than leg\'s length away. Place hands on edge of bench. Straighten arms, slide rear end off of edge of bench and position heels on adjacent bench with legs straight. Have assistant place weight on lap near hips.','Lower body by bending arms until slight stretch is felt in chest or shoulder, or rear end touches floor. Raise body and repeat.','upload/exercise-picture/WTBenchDip.gif'),(231,'Weighted Triceps Dip','Place weight on dip belt around waist or place dumbbell between lower legs just above feet. Mount shoulder width dip bar, arms straight with shoulders above hands. Keep hips straight.','Lower body until slight stretch is felt in shoulders. Push body up until arms are straight. Repeat.','upload/exercise-picture/WtTricepsDip.gif'),(232,'Weighted Close Grip Push-up','Lie prone on floor with hands under shoulders or slightly narrower. Position body up off floor with extended arms and body straight. Partner can place weight plate(s) on back if needed.','Keeping body straight, lower body to floor by bending arms. Push body up until arms are extended. Repeat.','upload/exercise-picture/WTCloseGripPushUp.gif'),(233,'Close Grip Push-up (on knees)','Lie prone on floor with hands under shoulders or slightly narrower. Position body up off floor with extended arms and body straight.','Keeping body straight, lower body to floor by bending arms. Push body up until arms are extended. Repeat.','upload/exercise-picture/BWCloseGripPushUpKnees.gif'),(234,'Bench Dip','Sit on inside of one of two benches placed parallel, slightly less than leg\'s length away. Place hands on edge of bench, straighten arms, slide rear end off of bench, and position heels on adjacent bench with legs straight.','Lower body by bending arms until slight stretch is felt in chest or shoulder, or rear end touches floor. Raise body and repeat.','upload/exercise-picture/BWBenchDipLegsElevated.gif'),(235,'Close Grip Push-up','Lie prone on floor with hands under shoulders or slightly narrower. Position body up off floor with extended arms and body straight.','Keeping body straight, lower body to floor by bending arms. Push body up until arms are extended. Repeat.','upload/exercise-picture/BWCloseGripPush.gif'),(236,'Bench Dip (heels on floor)','Sit on side of bench. Place hands on edge of bench. Position feet away from bench. Straighten arms, slide rear end off of edge of bench, and rest heels on floor with legs straight.','Lower body by bending arms until slight stretch is felt in chest or shoulder, or rear end touches floor. Raise body and repeat.','upload/exercise-picture/BWBenchDipFloor.gif'),(237,'Band-assisted Triceps Dip','Place one foot on middle of exercise band with ends looped on shoulder width dip bars. Push band down partially by extending leg. Mount dip bar with arms straight and shoulders above hands. Place other foot on exercise band next to other foot. Keep hips straight.','Lower body until slight stretch is felt in shoulders. Push body up until arms are straight. Repeat.','upload/exercise-picture/ASTricepsDipFootBand.gif'),(238,'Bench Dip (knees bent)','Sit on side of bench. Place hands on edge of bench. Place feet on floor away from bench. Straighten arms, slide rear end off of edge of bench, and position feet on floor with knees bent.','Lower body by bending arms until slight stretch is felt in chest or shoulder, or rear end touches floor. Raise body and repeat.','upload/exercise-picture/BWBenchDipBentKnee.gif'),(240,'Triceps Dip','Mount shoulder width dip bar, arms straight with shoulders above hands. Keep hips straight.','Lower body until slight stretch is felt in shoulders. Push body up until arms are straight. Repeat.','upload/exercise-picture/BWTricepsDip.gif'),(241,'Suspended Triceps Extension (with rope)','Grasp triceps rope hanging from secured bar (chest height or lower). Position forefeet on floor, back from bar with body straight. Elbows can be either be completely bent or straight during mount with upper arms somewhat perpendicular with body.','Keeping body straight, raise body up and back up until arms are extended. Lower body by bending elbows, allowing head to travel between ends of rope. Repeat.','upload/exercise-picture/BWSuspendedTricepsExtension.gif'),(242,'Close Grip Incline Push-up (on bar)','Grasp horizontal bar (lower than chest height) with hands shoulder width or slightly narrower. Position forefeet back from bar with arms and body straight. Arms should be perpendicular to body.','Keeping body straight, lower chest to bar by bending arms. Push body up until arms are extended. Repeat.','upload/exercise-picture/BWCloseGripInclinePushUpOnBar.gif'),(243,'Triceps Dip (between benches)','Stand between ends of two benches. Place hands on ends of benches with fingers off end of benches. Grip should be somewhat narrow. Position feet out in front with legs straight, heels on floor, and torso upright.','Lower body by bending arms, allowing elbows to point back. When slight stretch is felt in chest or shoulders, push body up until arms are straight. Repeat.','upload/exercise-picture/BWDoubleBenchDipsTriceps.gif'),(244,'Suspended Self-assisted Triceps Dip','Stand between two suspension handles, approximately mid-thigh height. Grasp handles on each side and straighten arms with shoulders above hands. Holding position firmly and place bodyweight on handles. Place toes on floor behind with knees bent and feet back.','Lower body by bending arms back. If necessary, use minimal assistance of lower body to control descent, allowing knees to bend, keeping toes in contact with floor. When slight stretch is felt in chest or shoulders, push body up back up until arms are straight. Repeat with minimal assistance from legs.','upload/exercise-picture/STSelfAssistedDipOnToes.gif'),(245,'Triceps Dip (bent knees between benches)','Stand between ends of two benches. Place hands on ends of benches with fingers off ends of benches. Grip should be somewhat narrow. Position feet in front with legs bent and torso upright.','Lower body by bending arms, allowing elbows to point back. When slight stretch is felt in chest or shoulders, push body up until arms are straight. Repeat.','upload/exercise-picture/BWDoubleBenchDipBentKneeTriceps.gif'),(246,'Suspended Triceps Extension','Grasp handles and step forward between suspension trainers. Position arms downward and slightly forward, nearly parallel with suspension straps. Lean forward, placing upper body weight onto handles with arms straight, while stepping back onto forefeet so body is leaning forward at desired angle. Straighten body, so torso is in-line with legs.','Lower body by bending elbows, allowing head to travel between suspension handles. Raise body up and back up until arms are extended. Repeat.','upload/exercise-picture/STTricepsExtension.gif'),(247,'Suspended Triceps Dip','Stand between two suspension handles and grasp handles on each side of torso. Hold position firmly and lift feet from floor.','Push body up until arms are straight. Lower body until slight stretch is felt in shoulders. Repeat.','upload/exercise-picture/STDip.gif'),(249,'Towel Triceps Stretch','Grasp near end of towel or rope. Position towel behind head so towel dangles down behind body. Reach behind back or waist with opposite hand and grasp opposite end of towel. Position upper arm close to back side of head.','Pull towel downward with lower arm. Hold stretch. Repeat with opposite arm.','upload/exercise-picture/3799ed8a83c8eac5efb901d9b10cdba5.jpg'),(250,'Overhead Triceps Stretch','Put one arm overhead. Position forearm as close as possible to upper arm. Grasp elbow overhead with other hand.','Pull elbow back and toward head. Hold stretch. Repeat with opposite arm.','upload/exercise-picture/edeae1cee9ffa6dc4c5e5fed632f9bba.jpg'),(251,'PNF Overhead Triceps Stretch','Instruct participant to stand or sit on floor, chair, or bench and place arm overhead. Standing behind participant, grasp their wrist and position their forearm against upper arm.','Pull participant\'s elbow behind their head while keeping forearm against upperarm. Hold stretch. Repeat with opposite arm.','upload/exercise-picture/389b7b9e3728a886909b6b7a5f9a6e8a.jpg'),(252,'Self-assisted Triceps Dip','Stand on bench or elevation between parallel bars. Mount shoulder width dip bar, arms straight with shoulders above hands. Bend knees and place toes on bench or elevation behind and below body.','Lower body by bending arms back. If necessary, use minimal assistance of lower body to control descent, allowing knees to bend, keeping toes in contact with bench or elevation. When slight stretch is felt in chest or shoulders push body up until arms are straight. Repeat with minimal assistance from legs.','upload/exercise-picture/ASTricepsDipSelf.gif'),(253,'Cable Alternating Seated Curl','Sit on seat situated between two low pulleys down to each side. Grasp stirrups in each hand, palms facing forward.','Pull one stirrup up toward shoulder while keeping elbow stationary. Return until arm is fully extended. Repeat with other arm, alternating between sides.','upload/exercise-picture/CBSeatedAlternatingCurl.gif'),(254,'Cable Alternating Curl','Stand between or facing double low pulleys. Grasp stirrups to each side, palms facing forward.','Pull one stirrup up forward and upward toward shoulder while keeping elbow stationary. Return until arm is fully extended. Repeat on other arm, alternating between sides.','upload/exercise-picture/CBAlternatingCurl.gif'),(255,'Barbell Drag Curl','Grasp bar with shoulder width underhand grip.','Raise barbell straight up so elbows travel back as elbows flex. Follow contour of hips and waist. As elbows continues to flex, begin bringing elbows forward when forearms rises past horizontal position. Continue upward over chest until forearms are perpendicular. Lower until arms are fully extended. Repeat.','upload/exercise-picture/BBDragCurl.gif'),(256,'Barbell Curl','Grasp bar with shoulder width underhand grip.','With elbows to side, raise bar until forearms are vertical. Lower until arms are fully extended. Repeat.','upload/exercise-picture/BBCurl.gif'),(257,'Cable Curl','Grasp low pulley cable bar with shoulder width underhand grip. Stand close to pulley.','With elbows to side, raise bar until forearms are vertical. Lower until arms are fully extended. Repeat.','upload/exercise-picture/CBCurl.gif'),(258,'Cable Seated Curl','Sit on seat situated between two low pulleys down to each side. Grasp stirrups in each hand, palms facing forward.','Pull both stirrups up toward shoulders while keeping elbows stationary. Return until arms are fully extended and repeat.','upload/exercise-picture/CBSeatedCurl.gif'),(259,'Cable Bar Curl','Grasp low cable bar with shoulder width underhand grip. Stand close to cable bar.','With elbows to side, raise bar until forearms are vertical. Lower until arms are fully extended. Repeat.','upload/exercise-picture/CBBarCurl.gif'),(260,'Cable One Arm Curl','Face low pulley and grasp stirrup cable attachment to one side with underhand grip.','With elbow to side, raise bar until forearms are vertical. Lower until arms are fully extended. Repeat. Continue with opposite arm.','upload/exercise-picture/CBOneArmCurl.gif'),(261,'Cable Curl (with stirrups)','Stand between or facing double low pulleys. Grasp stirrups to each side, palms facing forward.','Pull stirrups forward and upward toward shoulders while keeping elbows stationary. Return until arms are fully extended. Repeat.','upload/exercise-picture/CBCurlStirrups.gif'),(262,'Cable Supine Curl','Sit on floor with feet or heels against pulley machine. Grasp low pulley cable bar with shoulder width underhand grip. Lie back on floor with arms to sides.','With elbows to side, pull bar until elbows are flexed. Lower until arms are fully extended. Repeat.','upload/exercise-picture/CBSupineArmCurl.gif'),(263,'Dumbbell Curl','Position two dumbbells to sides, palms facing in, arms straight.','With elbows to sides, raise one dumbbell and rotate forearm until forearm is vertical and palm faces shoulder. Lower to original position and repeat with opposite arm. Continue to alternate between sides.','upload/exercise-picture/DBCurl.gif'),(264,'Underhand Inverted Row (high bar)','Stand facing arms length away from waist to head height horizontal bar. Grasp bar with shoulder width underhand grip. Position body under bar with legs, hips and spine straight. Arms should be straight, approximately perpendicular to body. Heels should make contact with floor with feet about perpendicular to legs.','Keeping body straight, pull body up to bar. Return until arms are extended and shoulders are stretched forward. Repeat.','upload/exercise-picture/BWSupineRowUnderhandHigh.gif'),(265,'Lever Alternating Curl','Sit on seat and grasp handles with underhand grip.','Raise lever on handle until elbow is fully flexed with back of upper arm remaining on pad. Lower handle until arm is fully extended. Repeat with opposite arm. Continue to alternate movement between sides.','upload/exercise-picture/LVAlternatingCurl.gif'),(266,'Lever Curl','Sit on seat and grasp handles with underhand grip.','Raise lever handles until elbows are fully flexed with back of upper arm remaining on pad. Lower handles until arm is fully extended. Repeat.','upload/exercise-picture/LVCurl.gif'),(267,'Doorway Biceps Stretch','Stand at end of wall or in doorway facing perpendicular to wall. Position front of straight arm and palm on surface of wall. Situate arm around same height of shoulder with elbow positioned away from wall.','Turn body away from positioned arm. Hold stretch. Repeat with opposite arm.','upload/exercise-picture/43d668452405c4e4fc3558c7198e186a.jpg'),(268,'Seated Biceps Stretch','Sit on floor or mat. Lean back and place hands flat on floor close together behind body with fingers positioned away from body.','Scoot hips forward away from hands. Hold stretch.','upload/exercise-picture/055a2e3f70a4c9da644902025b37f71d.jpg'),(269,'Dumbbell Incline Curl','Sit back on 45-60 degree incline bench. With arms hanging down straight, position two dumbbells with palms facing inward.','With elbows back to sides, raise one dumbbell and rotate forearm until forearm is vertical and palm faces shoulder. Lower to original position and repeat with opposite arm. Continue to alternate between sides.','upload/exercise-picture/DBInclineCurl.gif'),(270,'Chin-up','Step up and grasp bar with underhand shoulder width grip.','Pull body up until elbows are to sides. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/BWUnderhandChinup.gif'),(271,'Underhand Inverted Row','Lay on back under fixed horizontal bar. Grasp bar with shoulder width underhand grip.','Keeping body straight, pull body up to bar. Return until arms are extended and shoulders are stretched forward. Repeat.','upload/exercise-picture/BWSupineRowUnderhand.gif'),(272,'Standing Biceps Stretch','Clasp hands behind back with palms together. Straighten arms and rotate arms (inside down) so palm turn downward.','Raise arms away from body. Hold stretch.','upload/exercise-picture/6cb903dd82c279b928786e7c041a8650.jpg'),(273,'PNF Seated Biceps Stretch','Instruct participant to sit on floor or bench and place arms to behind hips. From behind, grasp participant\'s wrists, positioning them downward and close together.','Continue to raise participant\'s arms upward behind their body. Hold stretch.','upload/exercise-picture/7fb262891ac5c6933385580cfca31e8d.jpg'),(274,'Wall Biceps Stretch','Face away from wall. Bend over and place hands close together as high as possible on wall with fingers positioned upward.','Bring rear end and back toward wall and squat down. Hold stretch for 20 seconds.','upload/exercise-picture/e56394f43d421e81a3dcd5db1bc18917.jpg'),(275,'Cable Preacher Curl','Sit on preacher bench placing back of arms on pad. Grasp cable bar with shoulder width underhand grip.','Raise cable bar toward shoulders. Lower cable bar until arms are fully extended. Repeat.','upload/exercise-picture/CBPreacherCurl.gif'),(276,'Cable Alternating Preacher Curl','Grasp cable stirrups with each hand. Sit on preacher bench placing back of arms on pad with palms up.','Raise one stirrup upward toward shoulder of same arm. Lower stirrup until arm is fully extended. Repeat with opposite arm. Continue alternating between arms.','upload/exercise-picture/CBAlternatingPreacherCurl.gif'),(277,'Cable Concentration Curl','Facing low pulley cable, sit on seat or bench with legs apart to each side. Grasp stirrup attachment. Place upper arm against inner thigh.','Pull stirrup to front of shoulder until elbow is completely flexed. Lower stirrup until arm is fully extended. Repeat. Continue with opposite arm.','upload/exercise-picture/CBConcentrationCurl.gif'),(278,'Cable Preacher Curl (stirrups)','Grasp cable stirrups with each hand. Sit on preacher bench placing back of arms on pad with palms up.','Raise both stirrups upward toward shoulders. Lower stirrups until arm is fully extended. Repeat.','upload/exercise-picture/CBPreacherCurlStirrups.gif'),(279,'Cable One Arm Standing Preacher Curl','Standing behind standing preacher bench and grasp cable stirrup.\nPlace back of arm on pad with palm up.','Raise stirrup upward toward shoulder of same arm. Lower stirrup\nuntil arm is fully extended. Repeat.','upload/exercise-picture/CBOneArmStandingPreacherCurl.gif'),(280,'Barbell Prone Incline Curl','Lie prone on incline bench with shoulders near top of incline. Knees can rest on seat or legs can be straddled to sides. From low rack or partner, grasp curl bar with shoulder width underhand grip.','Raise bar until arms are flexed. Lower barbell until arms are fully extended. Repeat.','upload/exercise-picture/BBProneInclineCurl.gif'),(281,'Cable Standing Preacher Curl','Stand behind preacher bench. Grasp cable bar with shoulder\nwidth underhand grip. Position back of arms on pad.','Raise cable bar toward shoulders. Lower cable bar until arms\nare fully extended. Repeat.','upload/exercise-picture/CBStandingPreacherCurl.gif'),(282,'Barbell Standing Preacher Curl','Placing back of arms on pad with one foot forward, grasp curl bar with shoulder width underhand grip.','Raise bar until forearms are vertical. Lower barbell until arms are fully extended. Repeat.','upload/exercise-picture/BBStandingPreacherCurl.gif'),(283,'Barbell Preacher Curl','Sit on preacher bench placing back of arms on pad. Grasp curl bar with shoulder width underhand grip.','Raise bar until forearms are vertical. Lower barbell until arms are fully extended. Repeat.','upload/exercise-picture/BBPreacherCurl.gif'),(284,'Cable Prone Incline Curl','Lie prone on incline bench with shoulders near top of incline. Knees can rest on seat or legs can be straddled to sides. Grasp cable attachment with shoulder width underhand grip.','Raise bar until arms are flexed. Lower barbell until arms are fully extended. Repeat.','upload/exercise-picture/CBProneInclineCurl.gif'),(285,'Cable One Arm Preacher Curl','Grasp cable stirrup. Sit on preacher bench placing back of arm on pad with palm up.','Raise stirrup upward toward shoulder of same arm. Lower stirrup until arm is fully extended. Repeat.','upload/exercise-picture/CBOneArmPreacherCurl.gif'),(286,'Dumbbell Preacher Curl','Grasp dumbbell and sit on preacher bench. With arm bent and palm facing shoulder, place back of arm down on pad.','Lower dumbbell until arm is fully extended. Raise dumbbell until forearm is vertical. Repeat. Continue with opposite arm.','upload/exercise-picture/DBPreacherCurl.gif'),(287,'Dumbbell Concentration Curl','Sit on bench. Grasp dumbbell between feet. Place back of upper arm to inner thigh. Lean into leg to raise elbow slightly.','Raise dumbbell to front of shoulder. Lower dumbbell until arm is fully extended. Repeat. Continue with opposite arm.','upload/exercise-picture/DBConcentrationCurl.gif'),(288,'Lever Preacher Curl (plate loaded)','Sit on curl machine placing back of arms on pad. Grasp lever handles with underhand grip. Align elbows at same pivot point as fulcrum of lever.','Raise lever handles toward shoulders. Lower handles until arms are fully extended. Repeat.','upload/exercise-picture/LVPreacherCurlH.gif'),(289,'Lever Preacher Curl (arms high, plate loaded)','Sit on curl machine. Grasp lever handles with underhand grip. Align elbows at same pivot point as fulcrum of lever while placing back of arms up on pads.','Pull lever handles toward shoulders. Return handles until arms are fully extended. Repeat.','upload/exercise-picture/LVHighPreacherCurlArmsHighPL.gif'),(290,'Dumbbell Prone Incline Curl','Lie prone on incline bench with shoulders near top of incline. Knees can rest on seat or legs can be straddled to sides. From elevated platform or partner, grasp dumbbell and position palms forward.','Raise dumbbells until arms are flexed. Lower dumbbells until arms are fully extended. Repeat.','upload/exercise-picture/DBProneInclineCurl.gif'),(291,'Dumbbell Standing Preacher Curl','With dummbell in hand, arm bent, and palm facing shoulder, place back of arm on pad.','Lower dumbbell until arm is fully extended. Raise dumbbell until forearm is vertical. Repeat. Continue with opposite arm.','upload/exercise-picture/DBStandingOneArmPreacherCurl.gif'),(292,'Lever Alternating Preacher Curl (arms high, plate loaded)','Sit on curl machine. Grasp lever handles with underhand grip. Align elbows at same pivot point as fulcrum of lever while placing back of arms up on pads.','Pull one lever handle toward shoulder. Return handle until arm is fully extended. Repeat with opposite arm. Continue alternating movement between arms.','upload/exercise-picture/LVAlternatingHighPreacherCurlArmsHighPL.gif'),(293,'Lever Preacher Curl (no seat, plate loaded)','Stand behind arm pad and face lever handles on opposite side. Place one foot forward under arm pad and opposite foot back on foot bar. Lean over arm pads and grasp handles with slightly narrower than shoulder width underhand grip. Squat down and position back of upper arms on arm pads.','Raise lever handles toward shoulders. Lower handles until arms are fully extended. Repeat.','upload/exercise-picture/LVStandingPreacherCurl.gif'),(294,'Lever Preacher Curl (arms high)','Sit on curl machine. Grasp lever handles with underhand grip. Align elbows at same pivot point as fulcrum of lever while placing back of arms up on pads.','Pull lever handles toward shoulders. Return handles until arms are fully extended. Repeat.','upload/exercise-picture/LVHighPreacherCurlS.gif'),(295,'Lever Preacher Curl','Sit on curl machine placing back of arms on pad. Grasp lever handles with underhand grip. Align elbows at same pivot point as fulcrum of lever.','Raise lever handles toward shoulders. Lower handles until arms are fully extended. Repeat.','upload/exercise-picture/LVPreacherCurl.gif'),(296,'Lever Alternating Preacher Curl (arms high)','Sit on curl machine. Grasp lever handles with underhand grip. Align elbows at same pivot point as fulcrum of lever while placing back of arms up on pads.','Pull one lever handle toward shoulder. Return handle until arm is fully extended. Repeat with opposite arm. Continue alternating movement between arms.','upload/exercise-picture/LVAlternatingHighPreacherCurl.gif'),(297,'Suspension Arm Curl','Grasp suspension handles and momentarily step back until arms are extended forward and straight. While keeping arms straight and shoulders back, step forward so body is reclined back. Position palms up or slightly inward.','Bring handles toward shoulders by flexing arms, while keeping elbows pointed forward. Return by straightening arms and repeat.','upload/exercise-picture/STArmCurl.gif'),(298,'Lever Preacher Curl (no seat)','Stand behind arm pad and face lever handles on opposite side. Place one foot forward under arm pad and opposite foot back on foot bar. Lean over arm pads and grasp\n\n\nhandles with slightly narrower than shoulder width underhand grip. Squat down and position back of upper arms on arm pads.','Raise lever handles toward shoulders. Lower handles until arms are fully extended. Repeat.','upload/exercise-picture/LVPreacherCurlSeatless.gif'),(299,'Barbell Standing Reverse Preacher Curl','Place back of arms on pad with one foot forward. Grasp curl bar with shoulder width underhand grip.','Raise bar until forearms are vertical. Lower barbell until arm is fully extended. Repeat.','upload/exercise-picture/BBStandingReversePreacherCurl.gif'),(300,'Cable Hammer Curl','Grasp cable rope with palms facing inward. Stand upright with arms straight down to sides.','With elbows to side, raise rope forward and upward with both arms until forearms are vertical. Lower until arms are fully extended. Repeat.','upload/exercise-picture/CBHammerCurlRope.gif'),(301,'Barbell Reverse Curl','Grasp bar with shoulder width overhand grip.','With elbows to side, raise bar until forearms are vertical. Lower until arms are fully extended. Repeat.','upload/exercise-picture/BBReverseCurl.gif'),(302,'Cable Reverse Curl','Grasp cable bar with shoulder width overhand grip.','With elbows to side, raise bar until forearms are vertical. Lower until arms are fully extended. Repeat.','upload/exercise-picture/CBReverseCurl.gif'),(303,'Cable Bar Reverse Curl','Grasp cable bar with shoulder width overhand grip. Stand close to cable bar.','With elbows to side, raise bar until forearms are vertical. Lower until arms are fully extended. Repeat.','upload/exercise-picture/CBBarReverseCurl.gif'),(304,'Dumbbell Hammer Curl','Position two dumbbells to sides, palms facing in, arms straight.','With elbows to sides, raise one dumbbell until forearm is vertical and thumb faces shoulder. Lower to original position and repeat with alternative arm.','upload/exercise-picture/DBHammerCurl.gif'),(305,'Lever Reverse Curl','Sit on seat and grasp handles with overhand grip. Position elbows to sides so they are in line with lever\'s fulcrum.','Raise lever handles until elbows are fully flexed with back of upper arm remaining on pad. Lower handles until arm is fully extended. Repeat.','upload/exercise-picture/LVReverseCurl.gif'),(306,'Lever Hammer Preacher Curl','Sit on curl machine placing back of arms on pad. Grasp lever handles and position grips with thumb side up. Align elbows at near same pivot point as fulcrum of lever.','Raise lever handles toward shoulders, maintaining palms in grip. Lower handles until arm is fully extended. Repeat.','upload/exercise-picture/LVHammerPreacherCurl.gif'),(307,'Cable Standing Reverse Preacher Curl','Stand behind preacher bench. Grasp cable bar with shoulder\nwidth overhand grip. Position back of arms on pad.','Raise cable bar toward shoulders. Lower cable bar until arm\nis fully extended. Repeat.','upload/exercise-picture/CBStandingReversePreacherCurl.gif'),(308,'Barbell Reverse Preacher Curl','Sit on preacher bench placing back of arms on pad. Grasp curl bar with shoulder width overhand grip.','Raise bar until forearms are vertical. Lower barbell until arm is fully extended. Repeat.','upload/exercise-picture/BBReversePreacherCurl.gif'),(309,'Cable Reverse Preacher Curl','Sit on preacher bench placing back of arms on pad. Grasp cable bar with shoulder width overhand grip.','Raise cable bar toward shoulders. Lower cable bar until arm is fully extended. Repeat.','upload/exercise-picture/CBReversePreacherCurl.gif'),(310,'Standing Brachioradialis Stretch','Cross wrists, point thumbs downward, and clasp hands.','Straighten arms and externally rotate shoulders by back. Hold stretch.','upload/exercise-picture/e5de318835474e554b63aa69f6b28291.jpg'),(311,'Lever Reverse Preacher Curl','Sit on curl machine placing back of arms on pad. Grasp lever handles with overhand grip. Align elbows at near same pivot point as fulcrum of lever.','Raise lever handles toward shoulders. Lower handles until arm is fully extended. Repeat.','upload/exercise-picture/LVReversePreacherCurl.gif'),(312,'Cable Roller Wrist Flexion','Stand behind weight plate(s) on floor and grasp wrist roller handle with both hands; over hand grip.','With left hand gripping handle, relax grip of right hand and slide grip behind handle (by hypexending wrist) and regrip. Relax grip of left hand and flex right wrist. Repeat sequence with opposite hands, alternating back and forth until weight plate has raised up near hands. Lower weight steadily with opposite movement.','upload/exercise-picture/CableRollerWristFlexion.gif'),(313,'Lever Wrist Curl (plate loaded)','Grasp bar with underhand grip. Place forearm on padded platform.','Raise bar up until wrist is fully flexed. Lower and repeat.','upload/exercise-picture/LVWristCurl.gif'),(314,'Cable One Arm Wrist Curl','Sit and grasp cable stirrup. Rest forearm on thigh with palm up and wrist just beyond knees.','Allow cable bar to roll out of palms down to fingers. Raise cable bar back up by gripping and pointing knuckles up as high as possible. Lower and repeat.','upload/exercise-picture/CBOneArmWristCurl.gif'),(315,'Barbell Wrist Curl','Sit and grasp bar with narrow to shoulder width underhand grip. Rest forearms on thighs with wrists just beyond knees.','Allow barbell to roll out of palms down to fingers. Raise barbell back up by gripping and pointing knuckles up as high as possible. Lower and repeat.','upload/exercise-picture/BBWristCurl.gif'),(316,'Dumbbell Ulnar Deviation','Grasp half loaded dumbbell with plate on pinkie side. Position arm down to side.','Bend wrist so weighted side is pulled upward. Lower until weighted side is pointing downward. Repeat.','upload/exercise-picture/DBUlnarFlexion.gif'),(317,'Cable Wrist Curl','Sit and grasp cable bar with narrow to shoulder width underhand grip. Rest forearms on thighs with wrists just beyond knees.','Allow cable bar to roll out of palms down to fingers. Raise cable bar back up by gripping and pointing knuckles up as high as possible. Lower and repeat.','upload/exercise-picture/CBWristCurl.gif'),(318,'Dumbbell Wrist Curl','Sit and grasp dumbbell with underhand grip. Rest forearm on thigh with wrist just beyond knee.','Allow dumbbell to roll out of palm down to fingers. Raise dumbbell back up by gripping and pointing knuckles up as high as possible. Lower and repeat.','upload/exercise-picture/DBWristCurl.gif'),(319,'Lever Grip (plate loaded)','Sit on seat, straddling apparatus. Grasp lever handles on each side; fingers around lever handles and base of thumbs around stationary bars.','Squeeze bars together with both hands until lower lever makes contact with upper bars. Lower to original position and repeat.','upload/exercise-picture/LVGripper.gif'),(320,'Lever Grip','Sit on seat. Grasp lever handles on each side; fingers around lever handles and base of thumbs around stationary bars.','Squeeze bars together with both hands until lever makes contact with stationary bars. Lower to original position and repeat.','upload/exercise-picture/LVSeatedGripper.gif'),(321,'Lever Wrist Curl','Grasp bar with underhand grip to each side. Place forearms on arm pads.','Raise handles up until wrist is fully flexed. Lower handles until wrists are full hyperextended. Repeat.','upload/exercise-picture/LVSeatedWristCurl.gif'),(322,'Lever Ulnar Deviation','Rotate handle over and under so handle is in slightly downward position toward thighs. Grasp handle with thumb ups grip so fist is pulled up under resistance.','Bend wrist so pinky side of fist is pulled down. Return to starting position and repeat.','upload/exercise-picture/LVUlnarDeviation.gif'),(323,'Sled One Hand Grip','Stand in front of apparatus. Grasp bar grips with one hand; fingers around far bar and base of thumb around near stationary bar.','Squeeze bar grips together until far bar makes contact with nearest bar. Release to original position and repeat.','upload/exercise-picture/SLGripper.gif'),(324,'Sled One Hand Pinch Grip (plate loaded)','Place hand around horizontal surfaces; fingers along lower surface and thumb on upper surface.','Pinch surfaces together until lower part makes contact with upper part. Release to original position or just before surfaces become too far apart. Repeat.','upload/exercise-picture/SLOneHandGripPinchPL.gif'),(325,'Sled Grip (plate loaded)','Bend over and grasp bar grips with both hands; fingers under lower bar and base of thumbs over top stationary bar.','Squeeze bar grips together until lower bar makes contact with upper bar. Release to original position and repeat.','upload/exercise-picture/SLGripPL.gif'),(326,'Lever Roller Wrist Flexion','Grasp wrist roller handles with both hands; over hand grip.','With left hand gripping handle, relax grip of right hand and slide grip behind handle (by hypexending wrist) and regrip. Relax grip of left hand and flex right wrist. Repeat sequence with opposite hands, alternating back and forth until weight plate has raised up near hands. Lower weight steadily with opposite movement or loosen grip slightly to control descent of weight stack. Repeat.','upload/exercise-picture/LVRollerAlternatingWristFlexion.gif'),(327,'Praying Wrist Flexor Stretch','Place palms together in front of body. Point fingers toward neck.','Pushing hands together, lower away from body until wrists separate. Hold stretch. Repeat with opposite arm.','upload/exercise-picture/687f3c5f65553be7ab1ce1453499fdf2.jpg'),(328,'Sled One Hand Grip (plate loaded)','Bend over and grasp bar grips with one hand; fingers under lower bar and base of thumb over top stationary bar.','Squeeze bar grips together until lower bar makes contact with upper bar. Release to original position and repeat.','upload/exercise-picture/SLOneHandGripPL.gif'),(329,'Seated Wrist Flexor Stretch','Sit on floor. Place palms on floor to sides, behind hips with fingers pointing to back.','Lean back with arms straight. Hold stretch.','upload/exercise-picture/0e6c9ab24bc1acaa9bbb811fa0f0f70a.jpg'),(330,'Single Arm Wrist Flexor Stretch','With palm facing downward, grasp underside of fingers with other hand and straighten elbow.','Pull finger and wrist upward and back toward forearm. Hold stretch. Repeat with opposite arm.','upload/exercise-picture/87d4e6a3bad34ced76d50c60a6b2fbf8.jpg'),(331,'Kneeling Wrist Flexor Stretch','Kneel on floor or mat. Place palms of hand on floor with fingers pointing toward knees.','Shift body back with elbows straight. Hold stretch.','upload/exercise-picture/f4b4e6a42d8874f9e70106cf09e141d9.jpg'),(332,'Lever Roller Ulnar Deviation','Place hands on knobs at each end of roller.','With left hand gripping knob, relax grip of right hand and slide grip upward so fingers are more over knob (by radial deviation) and regrip. Relax grip of left hand and rotate knob with right hand so thumb travels away from body (by ulnar deviation). Repeat sequence with opposite hands, alternating back and forth until weight plate has raised up near hands. Lower weight steadily with opposite movement or loosen grip slightly to control descent of weight stack.','upload/exercise-picture/LVWristRollerUlnarFlexion.gif'),(333,'Dumbbell Radial Deviation','Grasp half loaded dumbbell with plate on thumb side. Position arm down to side.','Bend wrist so weighted side is pulled upward. Lower until weighted side is pointing downward. Repeat.','upload/exercise-picture/DBRadialDeviation.gif'),(334,'Cable Reverse Wrist Curl','Sit and grasp cable bar with narrow to shoulder width overhand grip. Rest forearms on thighs with wrists just beyond knees.','Raise stirrup by pointing knuckles upward as high as possible. Return until knuckles are pointing downward as far as possible. Repeat.','upload/exercise-picture/CBReverseWristCurl.gif'),(335,'Dumbbell Reverse Wrist Curl','Sit and grip dumbbell with overhand grip. Rest forearm on thigh with wrist just beyond knee.','Raise dummbell by pointing knuckles upward as high as possible. Return until knuckles are pointing downward as far as possible. Repeat.','upload/exercise-picture/DBReverseWristCurl.gif'),(336,'Lever Radial Deviation','Rotate handle under and over so handle is in slightly upward position toward head. Grasp handle with thumb ups grip so thumb side of fist is pulled away under resistance.','Bend wrist so thumb side of fist is pulled up. Return to starting position and repeat.','upload/exercise-picture/LVRadialDeviation.gif'),(337,'Cable One Arm Reverse Wrist Curl','Sit and grasp cable stirrup. Rest forearm on thigh with palm facing down and with wrist just beyond knee.','Raise stirrup by pointing knuckles upward as high as possible. Return until knuckles are pointing downward as far as possible. Repeat.','upload/exercise-picture/CBOneArmReverseWristCurl.gif'),(338,'Barbell Reverse Wrist Curl','Sit and grasp bar with narrow to shoulder width overhand grip. Rest forearms on thighs with wrists just beyond knees.','Raise barbell by pointing knuckles upward as high as possible. Return until knuckles are pointing downward as far as possible. Repeat.','upload/exercise-picture/BBReverseWristCurl.gif'),(339,'Lever Reverse Wrist Curl (plate loaded)','Grasp bar with overhand grip. Place forearm on padded platform.','Raise bar until wrist is fully hyperextended and return until wrist is fully flexed. Repeat.','upload/exercise-picture/LVReverseWristCurl.gif'),(340,'Cable Roller Wrist Extension','Stand behind weight plate(s) on floor and grasp wrist roller handle with both hands; over hand grip.','With left hand gripping handle, relax grip of right hand and slide grip in front of handle (by flexing wrist) and regrip. Relax grip of left hand and hyperextend right wrist. Repeat sequence with opposite hands, alternating back and forth until weight plate has raised up near hands. Lower weight steadily with opposite movement.','upload/exercise-picture/CableRollerWristExtension.gif'),(341,'Lever Reverse Wrist Curl','Grasp handles with overhand grip to each side. Place forearms on arm pads.','Raise handles until wrist is fully hyperextended. Lower handles until wrists are fully flexed. Repeat.','upload/exercise-picture/LVSeatedReverseWristCurl.gif'),(342,'Lever Roller Radial Deviation','Place hands on knobs at each end of roller.','With left hand gripping knob, relax grip of right hand and slide grip downward so fingers are under bottom of knob (by ulnar deviation) and regrip. Relax grip of left hand and rotate knob with right hand so thumb travels closer to body (by radial deviation). Repeat sequence with opposite hands, alternating back and forth until weight plate has raised up near hands. Lower weight steadily with opposite movement or loosen grip slightly to control descent of weight stack.','upload/exercise-picture/LVWristRollerRadialFlexion.gif'),(343,'Single Arm Wrist Extensor Stretch','With palm facing downward, pull wrist and fingers downward toward forearm.','Extend or straighten elbow. Hold stretch. Repeat with opposite arm.','upload/exercise-picture/1ef1476e3bcaf5b7a89a2cbfcc3bdd8f.jpg'),(344,'Kneeling Wrist Extensor Stretch','Kneel on floor or mat. Flex wrists and place tops of hand on floor with fingers pointing toward knees.','Lean against floor with elbows straight. Hold stretch for 20 seconds.','upload/exercise-picture/KneelingWristExtensor.gif'),(345,'Dumbbell Lying Pronation (arm up)','Lie on bench or mat. With hand of upper arm, grasp unilaterally loaded dumbbell; pinkie positioned near weighted side. Bend elbow approximately 90-degrees and place arm on hip or side of waist. Position thumb upward (supinated).','Rotate dumbbell so thumb turns downward (pronation). Return and repeat.','upload/exercise-picture/DBPronationUp.gif'),(346,'Dumbbell Seated Pronation','Sit next to elevated surface, approximately arm pit height. With hand of upper arm, grasp unilaterally loaded dumbbell; pinkie positioned near weighted side. Bend elbow approximately 90-degrees and place upperarm on elevated surface. Position thumb upward (supinated).','Rotate dumbbell so thumb turns downward (pronation). Return and repeat.','upload/exercise-picture/DBSeatedPronation.gif'),(347,'Lever Seated Forearm Pronation','Sit on seat. Grasp rotating handles with underhand grip on each side and place forearms on pads.','Rotate shafts by turning palm downward. Return and repeat.','upload/exercise-picture/LVSeatedPronation.gif'),(348,'Lever Standing Forearm Pronation','Grasp open handle at end of shaft with underhand grip.','Rotate shaft by turning palm downward. Return and repeat.','upload/exercise-picture/LVWristPronation.gif'),(349,'Dumbbell Lying Pronation (arm down)','Grasp unilaterally loaded dumbbell with thumb next to weighted side. Lie on bench on side with weight and position arm with \"half dumbbell\" on bench. Bend elbow approximately 90-degrees and tucked bent elbow under body. Position thumb down (supinated).','Rotate dumbbell so thumb turns upward (pronation). Return and repeat.','upload/exercise-picture/DBPronationDown.gif'),(350,'Lever Standing Forearm Supination','Grasp open handle at end of shaft with overhand grip.','Rotate shaft by turning palm upward. Return and repeat.','upload/exercise-picture/LVForearmSupination.gif'),(351,'Dumbbell Lying Supination (arm down)','Grasp unilaterally loaded dumbbell with pinkie finger next to weight side. Lie on bench on side with weight and position arm with \"half dumbbell\" on bench. Bend elbow approximately 90-degrees and tuck bent elbow under body. Position thumb up (pronated).','Rotate dumbbell so thumb turns downward (supinated). Return and repeat.','upload/exercise-picture/DBSupinateDown.gif'),(352,'Dumbbell Lying Supination','Lie on bench or mat. With hand of upper arm, grasp unilaterally loaded dumbbell; thumb next to side with weight. Bend elbow approximately 90-degrees and place forearm on hip, or side of waist. Position thumb downward (pronated).','Rotate dumbbell so thumb turns upward (supination). Return and repeat.','upload/exercise-picture/DBSupinationUp.gif'),(353,'Dumbbell Seated Supination','Sit next to elevated surface, approximately arm pit height. With hand of arm next to elevated surface, grasp unilaterally loaded dumbbell; thumb next to side with weight. Bend elbow approximately 90-degrees and place upperarm on elevated surface. Position thumb downward (pronated).','Rotate dumbbell so thumb turns upward (supination). Return and repeat.','upload/exercise-picture/DBSeatedSupination.gif'),(354,'Lever Seated Forearm Supination','Sit on seat. Grasp rotating handles with overhand grip on each side and place forearms on pads.','Rotate shafts by turning palm upward. Return and repeat.','upload/exercise-picture/LVSeatedSupination.gif'),(355,'Barbell Close Grip Bent-over Row','Bend knees slightly and bend over bar with back straight. Grasp bar with shoulder width overhand grip.','Pull bar to waist. Return until arms are extended and shoulders are stretched forward. Repeat.','upload/exercise-picture/BBBentOverRowClose.gif'),(356,'Cable Incline Row','Sit on incline and place feet on lower bar, or foot platform. Slide hips down by bending knees. Bend over and grasp cable attachment. Slide hips back, positioning knees with slight bend.','Pull cable attachment to waist while straightening back upright. Pull shoulders back and push chest forward while arching back. Return until arms are extended, shoulders are stretched forward, and lower back is flexed forward. Repeat.','upload/exercise-picture/CBInclineRow.gif'),(357,'Cambered Barbell Lying Row','Lie chest down on elevated bench. Grasp cambered barbell below with overhand grip.','Pull bar to upper waist or lower chest. Return until arms are extended and shoulders are stretched downward. Repeat.','upload/exercise-picture/CMBLyingRow.gif'),(358,'Cable Straight Back Incline Row','Sit on incline and place feet on lower bar, or foot platform. Slide hips down by bending knees. Bend over and grasp cable attachment. Slide hips back, positioning knees with slight bend. Straighten lower back so it is approximately perpendicular to incline.','Pull cable attachment to waist. Pull shoulders back and lift chest by arching back. Return until arms are extended, back is straight and perpendicular to incline, and shoulders are stretched forward. Repeat.','upload/exercise-picture/CBStraightBackInclineRow.gif'),(359,'Barbell Bent-over Row','Bend knees slightly and bend over bar with back straight. Grasp bar with wide overhand grip.','Pull bar to upper waist. Return until arms are extended and shoulders are stretched downward. Repeat.','upload/exercise-picture/BBBentOverRow.gif'),(360,'Barbell Underhand Bent-over Row','Bend knees slightly and bend over bar with back straight. Grasp bar with underhand grip.','Pull bar to waist. Return until arms are extended and shoulders are stretched downward. Repeat.','upload/exercise-picture/BBUnderhandBentOverRow.gif'),(361,'Cable Kneeling Row','Place right knee on lower pad (positioned to right side) with foot of other leg slightly back out to side and knee slightly bent. Place right forearm on right side of upper pad and grasp handle. Grasp cable stirrup below with left hand. Allow left shoulder to be pulled forward without spinal rotation.','Pull stirrup up to side until elbow travels beyond surface of back. Return until arm is extended and shoulder is stretched downward. Repeat and continue with opposite side.','upload/exercise-picture/CBOneArmKneelingRow.gif'),(362,'Cable Lying Row','Straddle head of bench and grasp stirrups on two high pulley cables. Lie on bench with stirrups in each hand and arms extended upward.','Pull stirrups down to each side of chest until elbows are behind back and shoulders are pulled back. Return until arms are extended and shoulders are stretched upward. Repeat.','upload/exercise-picture/CBLyingRow.gif'),(363,'Cable One Arm Bent-over Row','Grasp cable stirrup. Step back away from pulley, with foot on same side as exercising arm, positioned out to side well behind forward foot. Bend over with hand on nearby bar or above knee for support. Keep back straight and knees slightly bent. Allow shoulder with stirrup to be pulled forward.','Pull cable attachment to side of torso, pulling shoulder back. Return until arm is extended and shoulder is stretched forward. Repeat. Continue with opposite arm.','upload/exercise-picture/CBOneArmBentOverRow.gif'),(364,'Cable One Arm Seated Row','Sit slightly forward on platform or secured bench in order to grasp cable stirrup with one hand. Position hips back with knees slightly bent\n\n\n. Allow shoulder with stirrup to be pulled forward.','Pull cable attachment to side of torso, slightly twisting through waist. Pull shoulder back and push chest forward during contraction. Return until arm is extended and shoulder is stretched forward. Repeat. Continue with opposite arm.','upload/exercise-picture/CBOneArmRow.gif'),(365,'Cable Twisting Seated Row','Sit slightly forward on platform or secured bench close to cable attachment. Bend forward and grasp cable stirrup with one hand. Slide hips back by positioning knees with slight bend. Allow shoulder with stirrup to be pulled forward with forward bend and twist through waist.','Pull cable attachment to side, extending and twisting through waist. Pull shoulders back and sit upright while pushing chest forward during contraction. Return until arm is extended and shoulder is stretched forward. Repeat and perform exercise with opposite arm.','upload/exercise-picture/CBOneArmTwistingRow.gif'),(366,'Cable One Arm Seated High Row','Sit slightly forward on platform or secured bench close to cable attachment. Bend forward and grasp cable stirrup with one hand. Slide hips back by positioning knees with slight bend. Allow arm, shoulder, and torso to be pulled forward under weight on cable.','Pull cable attachment to side of torso, straightening back and leaning back slightly. Pull shoulder back and push chest forward during contraction. Return until arm is extended and torso is pulled forward. Repeat. Continue with opposite arm.','upload/exercise-picture/CBOneArmHighRow.gif'),(367,'Cable Seated High Row','Sit slightly forward on bench or platform in order to\n\n\ngrasp cable attachment. Place feet on vertical platform. Slide hips back positioning knees with slight bend. Allow weight on cable to pull torso forward while stretching arms and shoulders upward.','Pull cable attachment to waist and lean back slightly. Pull shoulders back and push chest forward while arching back. Return until torso, arms, and shoulders pulled forward. Repeat.','upload/exercise-picture/CBHighRow.gif'),(368,'Cable Twisting Seated High Row','Sit on seat or bench. Bend forward and grasp cable stirrup with one hand. Allow shoulder with stirrup to be pulled forward with twist through waist.','Pull cable attachment to side of torso while twisting though waist in opposite direction. Pull shoulder back and push chest forward. Return until arm is extended and shoulder is pulled forward. Repeat. Continue with opposite arm.','upload/exercise-picture/CBOneArmTwistingHighRow.gif'),(369,'Cable Alternating Seated High Row','Sit and grasp cable stirrups one with each hand. Lean back slightly allowing arms, shoulders, and torso to be pulled forward under weight on cables.','Pull one cable stirrup to side. Pull shoulder back, push chest forward, and rotate body slightly toward pulling arm. Return until arm is extended and torso faces forward. Pull with opposite arm alternating between each side. Repeat.','upload/exercise-picture/CBAlternatingHighRowLeanBack.gif'),(370,'Cable Seated Row','Sit slightly forward on seat or bench in order to grasp cable attachment. Place feet on vertical platform. Slide hips back positioning knees with slight bend.','Pull cable attachment to waist while straightening lower back. Pull shoulders back and push chest forward while arching back. Return until arms are extended, shoulders are stretched forward, and lower back is flexed forward. Repeat.','upload/exercise-picture/CBSeatedRow.gif'),(371,'Cable One Arm Straight Back Seated High Row','Sit on seat or bench. Bend forward and grasp cable stirrup with one hand. Position torso upright allowing shoulder to be pulled forward under weight on cable.','Pull cable attachment to side of torso while pulling shoulder back, arching spine, and pushing chest forward. Return until arm is extended and shoulder is pulled forward. Repeat. Continue with opposite arm.','upload/exercise-picture/CBOneArmStrBackHighRow.gif'),(372,'Cable Wide Grip Seated Row','Sit slightly forward on platform in order to grasp cable attachment. With awider than shoulder width grip, slide hips back positioning knees with slight bend.','Pull cable attachment to waist while pulling torso upright. Pull shoulders back and push chest forward while arching back. Return until arms are extended, shoulders are stretched forward, and lower back is flexed forward. Repeat.','upload/exercise-picture/CBWideGripSeatedRow.gif'),(373,'Cable Straight Back Seated Row','Sit slightly forward on bench with feet on foot bar or vertical platform. Grasp close grip cable attachment. Straighten torso\n\n\nupright and slide hips back so knees are slightly bent.','Pull cable attachment to waist. Pull shoulders back and lift chest by arching back. Return until arms are extended, back is straight, and shoulders are stretched forward. Repeat.','upload/exercise-picture/CBSeatedRowStraightBack.gif'),(374,'Cable Wide Grip Straight Back Seated Row','Sit slightly forward on bench or platform in order to grasp cable bar attachment. With wider than shoulder width overhand grip, straighten torso upright and slide hips back until knees are only\n\n\nslightly bent.','Pull cable attachment to waist. Pull shoulders back and lift chest by arching back. Return until arms are extended, back is straight, and shoulders are stretched forward. Repeat.','upload/exercise-picture/CBSeatedRowWideGripStrBack.gif'),(375,'Cable Standing Row','Stand to side of medium height, rotating pulley. Place hand shoulder height or slightly lower on support bar with arm straight. Place foot nearest supporting arm forward with knee slightly bent and opposite foot back. Grasp cable stirrup with one hand, allowing shoulder to be pulled forward under weight on cable.','Pull cable attachment to side of torso while pulling shoulder back, arching spine, and pushing chest forward. Return until arm is extended and shoulder is pulled forward. Repeat. Continue with opposite arm.','upload/exercise-picture/CBOneArmStandingRow.gif'),(376,'Dumbbell Bent-over Row','Kneel over side of bench by placing knee and hand of supporting arm on bench. Position foot of opposite leg slightly back to side. Grasp dumbbell from floor.','Pull dumbbell to up to side until it makes contact with ribs or until upper arm is just beyond horizontal. Return until arm is extended and shoulder is stretched downward. Repeat and continue with opposite arm.','upload/exercise-picture/DBBentoverRow.gif'),(377,'Cable Standing Low Row','Stand to side of low pulley. Place hand on support bar with arm straight. Place foot nearest supporting arm forward with knee slightly bent and opposite foot back. Grasp cable stirrup with one hand, allowing shoulder to be pulled forward under weight on cable.','Pull cable attachment to side of torso while pulling shoulder back, arching spine, and pushing chest forward. Return until arm is extended and shoulder is pulled forward. Repeat. Continue with opposite arm.','upload/exercise-picture/CBStandingLowRow.gif'),(378,'Dumbbell Lying Row','Lie chest down on elevated bench. Grasp dumbbells below.','Pull dumbbells to sides until upper arm is just beyond horizontal or height of back. Return until arms are extended and shoulders are stretched downward. Repeat.','upload/exercise-picture/DBLyingRow.gif'),(379,'Cable Twisting Standing High Row','Stand facing high pulley positioned slightly above head level. Grasp stirrup with one hand and step back so arm is straight. With leg of opposite side as loaded arm, plant forefoot far back on floor. Slightly bend knee of forward leg, same direction as foot. Allow shoulder with stirrup to be pulled forward with twist through waist.','Pull cable attachment to side of torso and rotate body toward side of pulling arm. Pull shoulder back and push chest forward. Return until arm is extended and shoulder is pulled forward. Repeat. Continue with opposite arm.','upload/exercise-picture/CBStandingTwistingRowOpStance.gif'),(380,'Lever Bent-over Row (plate loaded)','With lever handles to sides, bend knees slightly and bend over with back straight. Grasp lower handles.','Pull lever handles up to sides. Return until arms are extended and shoulders are stretched downward. Repeat.','upload/exercise-picture/LVBentOverRowH.gif'),(381,'Lever Wide Grip Bent-over Row (plate loaded)','With lever handles to sides, bend knees slightly and bend over with back straight. Grasp wider handles.','Pull lever handles up to sides. Return until arms are extended and shoulders are stretched downward. Repeat.','upload/exercise-picture/LVWideGripBentOverRowH.gif'),(382,'Lever Barbell Bent-over Row (plate loaded)','Stand with toes under bar facing fulcrum. Bend knees slightly and bend over bar with back straight. Grasp bar with wide overhand grip.','Pull bar to waist. Return until arms are extended and shoulders are stretched downward. Repeat.','upload/exercise-picture/LVSMBentoverRow.gif'),(383,'Lever Incline Row (plate loaded)','Lie chest on inclined platform and grasp lever handles with overhand grip.','Pull lever up as high as possible. Return until arms are extended and shoulders are stretched downward. Repeat.','upload/exercise-picture/LVInclineRow.gif'),(384,'Lever One Arm Bent-over Row (plate loaded)','Kneel over side of bench facing loaded side of lever bar by placing knee and hand of supporting arm on bench. Position foot of opposite leg slightly back to side, straddling bar. Grasp bar from floor, several inches under barbell plates.','Pull lever bar up to side until bar contacts shoulder or just until elbow travels behind height of back. Return until arm is extended and shoulder is stretched downward. Repeat and continue with opposite arm.','upload/exercise-picture/LVOneArmBentOverRow.gif'),(385,'Lever Close Grip Incline Row (plate loaded)','Lie chest on inclined platform and grasp lever close grip handles.','Pull lever up as high as possible. Return until arms are extended and shoulders are stretched downward. Repeat.','upload/exercise-picture/LVCloseGripInclineRow.gif'),(386,'Lever One Arm Standing Row (plate loaded)','Place hand on support bar and grasp lever far forward. Place foot on side of moving arm on foot support and position opposite foot behind.','Pull lever to side while twisting torso toward opposite side. Pull shoulder back and push chest forward during contraction. Return until arm is extended and torso is pulled toward original direction. Repeat. Continue with opposite arm.','upload/exercise-picture/LVOneArmStandingRow.gif'),(387,'Lever Narrow Grip Seated Row (plate loaded)','Sit on seat and position chest against pad. Grasp lever handles with underhand grip.','Pull levers back until elbows are behind back and shoulders are pulled back. Return until arms are extended and shoulders are stretched forward. Repeat.','upload/exercise-picture/LVSeatedRowLowNarrowH.gif'),(388,'Lever Alternating Wide Grip Seated Row (plate loaded)','Sit on seat and position chest against pad. Grasp lever handles with underhand grip.','Pull one lever back until elbow is behind back and shoulder is pulled back. Return until arm is extended and shoulder is stretched forward. Repeat with opposite arm, alternating between sides.','upload/exercise-picture/LVAlternatingWideGripSeatedRowH.gif'),(389,'Lever Alternating Narrow Grip Seated Row (plate loaded)','Sit on seat and position chest against pad. Grasp lever handles with underhand grip.','Pull one lever back until elbow is behind back and shoulder is pulled back. Return until arm is extended and shoulder is stretched forward. Repeat with opposite arm, alternating between sides.','upload/exercise-picture/LVSeatedRowAlternatingNarrowH.gif'),(390,'Lever Wide Grip Seated Row (high bar, plate loaded)','Sit on seat and position chest against pad. Grasp lever handles with underhand grip.','Pull levers back until elbows are behind back and shoulders are pulled back. Return until arms are extended and shoulders are stretched forward. Repeat.','upload/exercise-picture/LVWideGripSeatedRowH.gif'),(391,'Lever Wide Grip Seated Row (plate loaded)','Sit on seat and position chest against pad. Grasp lever handles with underhand grip.','Pull levers back until elbows are behind back and shoulders are pulled back. Return until arms are extended and shoulders are stretched forward. Repeat.','upload/exercise-picture/LVSeatedRowWideH.gif'),(392,'Lever Seated High Row (plate loaded)','Sit on seat and position chest against pad. Grasp lever handles with overhand grip.','Pull lever back until elbows are behind back and shoulders are pulled back. Return until arms are extended and shoulders are stretched forward. Repeat.','upload/exercise-picture/LVSeatedHighRowH.gif'),(393,'Lever Straight Back Seated Row (no chest pad, plate loaded)','Sit on seat with feet positioned on foot bar or platform. Grasp handles with each hand. Position torso upright with knees bent slightly.','Pull handles to body. Pull shoulders back and lift chest by arching back. Return until arms are extended, back is straight, and shoulders are stretched forward. Repeat.','upload/exercise-picture/LVStrBackSeatedRowNoPadPL.gif'),(394,'Lever Seated Low Row (plate loaded)','Sit on seat and position chest against pad. Grasp lever handles with overhand/neutral grip.','Pull levers back until elbows are behind back and shoulders are pulled back. Return until arms are extended and shoulders are stretched forward. Repeat.','upload/exercise-picture/LVSeatedLowRowH.gif'),(395,'Lever Seated Row (no chest pad, plate loaded)','Sit on seat and grasp handles with each hand. Place feet on vertically angled platform. Slide hips back with knees slightly bent.','Pull handles to waist while straightening torso upright. Pull shoulders back and push chest forward while arching back. Return until arms are extended, shoulders are stretched forward, and lower back is flexed forward. Repeat.','upload/exercise-picture/LVSeatedRowNoPadPL.gif'),(396,'Lever Close Grip T-bar Row (plate loaded)','Bend knees slightly and bend over lever handles with back straight. Grasp parallel lever handles.','Pull handles up to waist. Return until arms are extended and shoulders are stretched downward. Repeat.','upload/exercise-picture/LVCloseGripTBarRowPL.gif'),(398,'Lever T-bar Row (plate loaded)','Bend knees slightly and bend over lever handles with back straight. Grasp lever handles with shoulder width to wide overhand grip.','Pull lever up to torso. Return until arms are extended and shoulders are stretched downward. Repeat.','upload/exercise-picture/LVBentOverRow.gif'),(399,'Lever Alternating Underhand Seated Row (plate loaded)','Sit on seat and position chest against pad. Grasp lever handles with underhand grip.','Pull one lever back until elbow is behind back and shoulder is pulled back. Return until arm is extended and shoulder is stretched forward. Repeat with opposite arm, alternating between sides.','upload/exercise-picture/LVAlternatingSeatedUnderhandRowH.gif'),(401,'Lever Seated High Row','Sit on seat and position thighs under pad. Lean\n\nforward\n\nand grasp lever handles above.','Pull lever down while leaning back slightly. As elbows travel to sides, lift chest slightly and pull shoulders and elbows back. Return until arms are extended and body and shoulders are stretched forward. Repeat.','upload/exercise-picture/LVHighRowB.gif'),(402,'Lever Seated Row','Sit on seat and position chest against pad. Push foot lever if available. Grasp narrower parallel grip handles.','Pull lever back until elbows are behind back and shoulders are pulled back. Return until arms are extended and shoulders are stretched forward. Repeat.','upload/exercise-picture/LVSeatedRow.gif'),(403,'Lever Alternating Seated High Row','Sit on seat and position chest against pad. Grasp lever handles with overhand grip.','Pull one lever handle back until elbow is behind back and shoulder is pulled back. Return until arm is extended and shoulder is stretched forward. Repeat with opposite arm, alternating between sides.','upload/exercise-picture/LVAlternatingHighRow.gif'),(405,'Lever Underhand Seated Row (plate loaded)','Sit on seat and position chest against pad. Grasp lever handles with underhand grip.','Pull levers back until elbows are behind back and shoulders are pulled back. Return until arms are extended and shoulders are stretched forward. Repeat.','upload/exercise-picture/LVSeatedUnderhandRowH.gif'),(406,'Lever Wide Grip Seated Row','Sit on seat and position chest against pad. Grasp outer lever handles with overhand grip.','Pull lever back until elbows are behind back and shoulders are pulled back. Return until arms are extended and shoulders are stretched forward. Repeat.','upload/exercise-picture/LVWideGripSeatedRow.gif'),(407,'Lever Alternating Underhand Seated Row','Sit on seat and position chest against pad. Grasp lever handles with underhand grip.','Pull one lever handle back until elbow is behind back and shoulder is pulled back. Return until arm is extended and shoulder is stretched forward. Repeat with opposite arm, alternating between sides.','upload/exercise-picture/LVAlternatingUnderhandSeatedRowS.gif'),(408,'Lever Underhand Seated Row','Sit on seat and position chest against pad. Grasp lever handles with underhand grip.','Pull lever handles back until elbows are behind back and shoulders are pulled back. Return until arms are extended and shoulders are stretched forward. Repeat.','upload/exercise-picture/LVUnderhandSeatedRowS.gif'),(410,'Lever Seated Row (no chest pad)','Sit on seat and grasp handles with each hand. Place feet on vertically angled platform. Slide hips back with knees slightly bent.','Pull handles to waist while straightening torso upright. Pull shoulders back and push chest forward while arching back. Return until arms are extended, shoulders are stretched forward, and lower back is flexed forward. Repeat.','upload/exercise-picture/LVSeatedRowNoPad.gif'),(411,'Lever Straight Back Seated Row (no chest pad)','Sit on seat with feet positioned on foot bar or platform. Grasp handles with each hand. Position torso upright with knees bent slightly.','Pull handles to body. Pull shoulders back and lift chest by arching back. Return until arms are extended, back is straight, and shoulders are stretched forward. Repeat.','upload/exercise-picture/LVStraightBackSeatedRowNoPad.gif'),(412,'Inverted Row (feet elevated)','Lay on back under fixed horizontal bar. Grasp bar with wide overhand grip. Place back of heels on elevated surface.','Keeping body straight, pull body up to bar. Return until arms are extended and shoulders are stretched forward. Repeat.','upload/exercise-picture/BWSupineRowFeetElevated.gif'),(413,'Smith Bent-over Row','Bend knees slightly and bend over bar with back straight. Grasp bar with wide overhand grip. Disengage bar by rotating bar back.','Pull bar to upper waist. Return until arms are extended and shoulders are stretched downward. Repeat.','upload/exercise-picture/SMBentoverRow.gif'),(414,'Inverted Row','Lay on back under fixed horizontal bar. Grasp bar with wide overhand grip.','Keeping body straight, pull body up to bar. Return until arms are extended and shoulders are stretched forward. Repeat.','upload/exercise-picture/BWSupineRow.gif'),(415,'Weighted Inverted Row','Lay on back under fixed horizontal bar. Grasp bar with wide overhand grip. Place back of heels on elevated surface.','Keeping body straight, pull body up to bar. Return until arms are extended and shoulders are stretched forward. Repeat.','upload/exercise-picture/WTInvertedRowFeetElevated.gif'),(417,'Inverted Row (on hips)','Lay on back with belly under fixed horizontal bar. Bend knees and position feet on floor. Grasp bar with wide overhand grip.','Comments','upload/exercise-picture/BWSupineRowOnHip.gif'),(419,'Inverted Row (high bar)','Stand facing arms length away from waist to head height horizontal bar. Grasp bar with wide overhand grip. Position body under bar with legs, hips and spine straight. Arms should be straight, approximately perpendicular to body. Heels should make contact with floor.','Keeping body straight, pull body up to bar. Return until arms are extended and shoulders are stretched forward. Repeat.','upload/exercise-picture/BWSupineRowHigh.gif'),(420,'Suspended Row','Grasp suspension handles and momentarily step back until arms are extended forward and straight. While keeping arms straight and shoulders back, step forward so body reclines back behind suspension handles. Position body and legs straight at desired angle, hanging from handles with arms straight.','Pull body up so sides of chest make contact with handles while keeping body and legs straight. Return until arms are extended straight and shoulders are stretched forward. Repeat.','upload/exercise-picture/STRow.gif'),(421,'Fixed Bar Back Stretch','Stand facing stationary bar. Grasp stationary bar with one hand approximately waist height.','Bend over allowing hips to fall back. Slightly lean torso toward stretched arm. Hold stretch. Repeat with opposite side.','upload/exercise-picture/2febe4db68138ccd83658bc2e5387d62.jpg'),(422,'Suspended Inverted Row','Position suspension handles higher than arms\' length above floor. Sit on floor and grasp handles. Position body supine hanging from handles with arms straight, shoulders under handles, body straight, and back of heels on floor.','Pull body up so sides of chest make contact with handles while keeping body straight. Return until arms are extended straight and shoulders are stretched forward. Repeat.','upload/exercise-picture/STInvertedRow.gif'),(423,'Suspended Bent-knee Inverted Row','Position suspension handles higher than arms\' length above floor. Sit on floor and grasp handles. Hang shoulders under handles with arms straight, back and hips straight, with knees bent and feet flat on floor.','Pull body up so sides of chest make contact with handles while keeping body straight. Return until arms are extended straight and shoulders are stretched forward. Repeat.','upload/exercise-picture/STInvertedRowLowKneesBent.gif'),(424,'Lever Back Stretch','Sit on seat in forward position with lower legs on shin pad, feet on foot rest. Place hands through wrist straps. Hold upper bar with arms crossed, overhand grip.','Push and lower seat back. Hold stretch. Repeat with opposite arm position.','upload/exercise-picture/PCCrosshand8.gif'),(425,'Suspended Power Pull','Grasp suspension handle(s) with one hand. Step back until handle is chest height when held to side of chest. Facing suspension apparatus with feet shoulder width apart, point other arm and its shoulder forward, parallel with angle of strap.','Rotate body and extended arm, reaching outward while lowering body downward by extending arm holding onto handle. Extend arms and shoulders in-line with suspension strap so body is angled back to one side. Return by raising body back upward in opposite motion, reaching outward and toward suspension strap while pulling handle back to side of chest until body is upright and arm parallel with angle of strap. Repeat and continue with opposite side.','upload/exercise-picture/STPowerPull.gif'),(426,'Barbell Pullover','Lie upper back perpendicular on bench. Flex hips slightly. Grasp barbell from behind and position over chest with elbows bent slightly.','With elbows bent slightly, lower bar over and beyond head until shoulders are fully flexed or upper arms are approximately parallel to torso. Return and repeat.','upload/exercise-picture/BBPullover.gif'),(427,'Machine-assisted Pull-up (open-centered bar)','Step up and grasp bar with wide overhand grip. Kneel on padded platform and lower body down with arm extended.','Pull body up until neck reaches height of hands. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/ASPullUpKneelingOpen.gif'),(428,'Machine-assisted Parallel Close Grip Pull-up (standing)','Step up and grasp parallel grips. Step down onto assistance lever or platform.','Pull body up until elbow are to sides. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/AsCloseGripPullup.gif'),(429,'Machine-assisted Pull-up','Step up and grasp bar with wide overhand grip. Kneel on padded platform and lower body down with arm extended.','Pull body up until neck reaches height of hands. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/ASPullupKneeling.gif'),(430,'Machine-assisted Pull-up (open-centered bar, standing)','Step up and grasp bar with wide overhand grip. Step down onto assistance lever or platform.','Pull body up until neck reaches height of hands. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/AsPullup.gif'),(431,'Machine-assisted Chin-up','Step up and grasp bar with underhand shoulder width grip. Kneel onto platform or step onto bar.','Pull body up until elbows are to sides. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/ASUnderhandChinupKneeling.gif'),(432,'Cable One Arm Pulldown','Grasp stirrup in one hand. Sit with thighs under supports.','Pull down cable attachment to side of chest. Return until arm and shoulder is fully extended, allowing shoulder to raise. Repeat and continue with other arm.','upload/exercise-picture/CBOneArmPulldown.gif'),(433,'Barbell Bent Arm Pullover','Lie upper back perpendicular on bench. Flex hips slightly. Grasp barbell from behind and position over chest with elbows bent approximately 90°.','With elbow bent, lower bar over and just behind head until upper arm is approximately parallel to torso. Return and repeat.','upload/exercise-picture/BBBentArmPullover.gif'),(434,'Cable Close Grip Pulldown','Grasp parallel cable attachment. Sit with thighs under supports.','Pull down cable attachment to upper chest. Return until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/CBCloseGripPulldown.gif'),(435,'Machine-assisted Parallel Close Grip Pull-up','Step up and grasp parallel grips. Kneel on padded platform and lower body down with arm extended.','Pull body up until elbows are to sides. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/ASCloseGripPullUpKneeling.gif'),(436,'Cable Alternating Close Grip Pulldown','Grasp stirrups in each hand. Sit with thighs under supports.','Pull down one cable attachment to side of chest. Return until arm and shoulder is fully extended. Repeat with opposite arm, alternating between sides.','upload/exercise-picture/LVAlternatingCloseGripPulldown.gif'),(437,'Cable One Arm Kneeling Pulldown','Grasp stirrup in one hand and kneel on floor.','Pull down cable attachment to side of chest. Return until arm and shoulder is fully extended, allowing shoulder to raise. Repeat and continue with other arm.','upload/exercise-picture/CBOneArmKneelingPulldown.gif'),(438,'Cable Pulldown','Grasp cable bar with wide grip. Sit with thighs under supports.','Pull down cable bar to upper chest. Return until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/CBFrontPulldown.gif'),(439,'Cable Close Grip Pulldown (stirrups)','Grasp stirrups in each hand. Sit with thighs under supports.','Pull down cable attachments to sides of chest. Return until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/CBCloseGripPulldownStirrups.gif'),(440,'Cable Kneeling Bent-over Pulldown','Kneel on mat slightly away from high pulley. Grasp cable rope attachment with both hands. Sit with hips back and bend down by flexing hips so torso is bent over at approximately 30º angle. Allow resistance on cable pulley to pull arms upward with elbows bent.','Pull cable rope down until elbows are back and inside of rope attachment is behind neck. Return attachment over head until shoulder is completely flexed upward. Repeat.','upload/exercise-picture/KneelingBentOverPulldown.gif'),(441,'Cable Parallel Grip Pulldown','Grasp parallel cable attachment. Sit with thighs under supports.','Pull down cable attachment to upper chest. Return until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/CBParallelGripPulldown.gif'),(442,'Cable Alternating Pulldown','Grasp stirrups in each hand. Sit with thighs under supports.','Pull down one cable attachment to front side shoulder. Return until arm and shoulder are fully extended. Repeat with opposite arm, alternating between sides.','upload/exercise-picture/CBAlternatingPulldown.gif'),(443,'Cable Pullover','Lie upper back perpendicular on bench. Flex hips slightly, so hips are slightly lower than torso. Grasp revolving barbell cable attachment from behind. Pull to position cable attachment over chest. Fix elbows with small bend.','Lower cable attachment toward pulley with elbows bent only slightly. Lower until shoulders are fully flexed or upper arms are in-line with upper torso. Raise cable attachment over head and continue toward lower body until cable becomes very close to head. Repeat.','upload/exercise-picture/CBPullover.gif'),(444,'Cable Pulldown (pro lat bar)','Grasp pro lat bar with wide parallel grip. Sit with thighs under supports.','Pull down cable bar to upper chest. Return until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/CBFrontPulldownProBar.gif'),(445,'Cable Pulldown (stirrups)','Grasp stirrups in each hand. Sit with thighs under supports.','Pull down cable attachments to front sides of shoulders. Return until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/CBPulldownStirrups.gif'),(446,'Cable Bent-over Pullover','Face high pulley and grasp revolving cable attachment with arm slightly bent. Place one foot slightly back and bend over at hip until shoulder is fully flexed (upper arms at sides of head).','With elbows fixed approximately 30°, pull cable attachment down until upper arms are to sides. Return attachment overhead. Repeat.','upload/exercise-picture/CBStraightArmPullDown.gif'),(447,'Cable Parallel Close Grip Pull-up','Place dip belt around waist. Kneel as close as possible to low pulley or lever and attach hook to dip belt in front between legs. Step up and grasp close grip p\n\n\narallel bars with hands facing inward. Lift legs off of steps or floor.','Pull body up until elbow are to sides. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/CBParallelCloseGripPullup.gif'),(448,'Cable Chin-up','Place dip belt around waist. Kneel close to low pulley or lever and attach hook to dip belt chains. Step up and grasp bars with shoulder width underhand grip. Lift legs off of steps or floor.','Pull body up until elbow are to sides. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/CBChinup.gif'),(449,'Cable Parallel Grip Pull-up','Place dip belt around waist. Kneel as close as possible to low pulley or lever and attach hook to dip belt in front between legs. Step up and grasp parallel bars with hands facing inward. Lift legs off of steps or floor.','Pull body up until elbow are to sides. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/LVPullup.gif'),(450,'Cable Seated Pullover','Sit on bench facing away from cable pulley apparatus. Grasp revolving cable attachment over head with overhand grip.','With elbows fixed with slight bend, pull cable attachment forward and down as far as possible. Return cable attachment forward and overhead. Repeat.','upload/exercise-picture/CBSeatedStraightArmPulldown.gif'),(451,'Cable Rear Pull-up','Place dip belt around waist. Kneel close to low pulley or lever and attach hook to dip belt. Step up and grasp bars with overhand wide grip. Lift legs off of steps or floor.','Pull body up until bar touches back of neck. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/CBRearPullup.gif'),(452,'Cable Pull-up','Place dip belt around waist. Kneel close to low pulley or lever and attach hook to dip belt. Step up and grasp bars with overhand wide grip. Lift legs off of steps or floor.','Pull body up until chin is above bar. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/CBPullup.gif'),(453,'Cable Rear Pulldown','Grasp cable bar with wide grip. Sit with thighs under supports.','Pull cable bar down behind neck. Return until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/CBRearPulldown.gif'),(454,'Lever Close Grip Pulldown (plate-loaded)','Grasp handles and sit with thighs under padded supports.','Pull down handles to sides of chest while leaning back slightly. Return until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/LVCloseGripPulldownPL.gif'),(455,'Cable Twisting Standing Overhead Pull','Stand facing very high pulley. Grasp stirrup in one hand and step back so arm is straight. With leg of opposite side as loaded arm, plant forefoot far back on floor. Slightly bend knee of forward leg, same direction as foot.','Pull down cable attachment to side of chest and rotate body toward side of pulling arm. Return until arm and shoulder is fully extended, allowing shoulder to raise. Repeat. Continue with opposite arm.','upload/exercise-picture/CBStandTwistPulldownOpStance.gif'),(456,'Cable Underhand Pulldown','Grasp cable bar with underhand grip. Sit with thighs under supports.','Pull down cable bar to upper chest until elbows are to sides. Return until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/CBUnderhandPulldown.gif'),(457,'Lever Rear Pulldown (plate loaded)','Grasp lever bar with wide grip. Sit with thighs under supports.','Pull lever bar down behind neck. Return until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/LVRearPulldownPL.gif'),(458,'Lever Pulldown (plate loaded)','Grasp handles to each side with overhand grip. Sit on seat and position thighs under leg pads.','Pull levers down to sides of shoulders. Return until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/LVPulldownH.gif'),(459,'Lever Underhand Pulldown (plate loaded)','Grasp lever handles with underhand grip. Sit with thighs under supports.','Pull down lever handles toward sides until elbows are to sides. Return until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/LVUnderhandPulldownH.gif'),(460,'Lever Front Pulldown (plate loaded)','Grasp lever bar with wide grip. Sit with thighs under supports.','Pull down lever bar to upper chest. Return until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/LVFrontPulldownPL.gif'),(462,'Lever Pullover (plate loaded)','Adjust seat height so lever is near shoulder axis. Sit on machine. Place elbows on pads and grasp bar from behind.','Pull lever forward and down until elbows are to sides. Return until shoulders are fully flexed, or upper arms are parallel to torso. Repeat.','upload/exercise-picture/LVPulloverH.gif'),(463,'Lever Close Grip Pulldown','Grasp parallel lever bars. Sit with thighs under supports.','Pull down handles to sides of chest while leaning back slightly. Return until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/LVCloseGripPulldown.gif'),(464,'Lever Front Pulldown','Grasp lever handles. Sit with thighs under supports.','Pull down lever to upper chest. Return until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/LVFrontPulldown.gif'),(465,'Lever Iron Cross','Stand on platform and grasp handles to sides with palms down grip.','With arms straight, pull lever handles down below hips. Return lever handles upward just above shoulder high, or just before slight pressure in shoulder is felt. Repeat.','upload/exercise-picture/LVIronCross.gif'),(467,'Lever Underhand Pulldown','Grasp lever handles with underhand grip. Sit with thighs under supports.','Pull down lever handles to sides until elbows are to sides. Return until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/LVBiLateralUnderhandPulldownS.gif'),(468,'Lever Pullover','Adjust seat height so lever is near shoulder axis. Sit on machine and push foot lever. Place elbows on pads and grasp bar from behind. Release foot lever and place feet on platform or to sides.','Pull lever forward and down until elbows are to sides. Return until shoulders are fully flexed, or upper arms are parallel to torso. Repeat.','upload/exercise-picture/LVPullover.gif'),(470,'Lever Pulldown','Sit on seat. Reach up and grasp handles with wide overhand grip.','Pull levers down to sides of shoulders. Return until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/LVPullDown.gif'),(471,'Lever Pulldown (parallel grip)','Sit on seat. Reach up and grasp parallel handles.','Pull levers down to sides of shoulders. Return until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/LVPullDownParallelGrip.gif'),(473,'Weighted Parallel Close Grip Pull-up','Step up and grasp close grip parallel bars.','Pull body up until elbow are to sides. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/WTCloseGripChinup.gif'),(474,'Weighted Chin-up','Step up and grasp bar with underhand shoulder width grip.','Pull body up until elbows are to sides. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/WTChinUpUnderhand.gif'),(475,'Lever Alternating Underhand Pulldown','Grasp lever handles with underhand grip. Sit with thighs under supports.','Pull down one lever handle to side until elbow is down to side. Return until arm and shoulder are fully extended. Repeat with opposite arm. Continue to alternate pulldown between arms.','upload/exercise-picture/LVAlternatingUnderhandPulldownS.gif'),(476,'Weighted Pull-up','Step up and grasp bar with overhand wide grip.','Pull body up until chin is above bar. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/WTChinUp.gif'),(477,'Band-assisted Pull-up','Grab each side of hanging exercise band with both hands. Stretch exercise band down and step onto bottom inside of band with one foot. Stretch band down further by extending leg straight down. Reach up and grasp bar with overhand wide grip while keeping banded leg straight.','Pull body up until chin is above bar. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/ASPullupFootBand.gif'),(478,'Weighted Pull-up (open-centered bar)','Reach up and grasp bar with wide overhand grip.','Pull body up until neck reaches height of hands. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/WTPullUpDB.gif'),(479,'Band-assisted Chin-up','Grab each side of hanging exercise band with both hands. Stretch exercise band down and step onto bottom inside of band with one foot. Stretch band down further by extending leg straight down. Reach up and grasp bar with underhand shoulder width grip while keeping banded leg straight.','Pull body up until elbows are to sides. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/ASChinupFootBand.gif'),(480,'Weighted Rear Pull-up','Step up and grasp bar with overhand wide grip.','Pull body up until bar touches back of neck. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/WTRearPullup.gif'),(481,'Band-assisted Parallel Grip Pull-up','Grab each side of hanging exercise band with both hands. Stretch exercise band down and step onto bottom inside of band with one foot. Stretch band down further by extending leg straight down. Reach up and grasp parallel bars while keeping banded leg straight.','Pull body up until elbow are to sides. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/ASParallelGripPullupFootBand.gif'),(483,'Weighted Pull-up (neutral grip)','Step up and grasp bar with neutral grip.','Pull body up until neck reaches height of hands. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/WTPullUpN.gif'),(484,'Band-assisted Neutral Grip Pull-up','Grab each side of hanging exercise band with both hands. Stretch exercise band down and step onto bottom inside of band with one foot. Stretch band down further by extending leg straight down. Reach up and grasp bar with neutral grip while keeping banded leg straight.','Pull body up until neck reaches height of hands. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/ASNeutralGripPullupFootBand.gif'),(485,'Parallel Close Grip Pull-up','Step up and grasp parallel bars.','Pull body up until elbow are to sides. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/BWCloseGripPullup.gif'),(486,'Band-assisted Rear Pull-up','Grasp middle of hanging exercise band and pull down to side of leg. Lift foot and hook band under heel. Stretch band down further by extending leg straight down. Face perpendicular under pullup bar and position band behind body. Pull band apart and place other foot onto band so both feet are together inside of band. Reach up and grasp pull-up bar with overhand wide grip while keeping legs straight.','Pull body up until bar touches back of neck. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/ASRearPullupFootBand.gif'),(487,'Pull-up','Step up and grasp bar with overhand wide grip.','Pull body up until chin is above bar. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/BWWideGripChinup.gif'),(488,'Partner-assisted Rear Pull-up','Step up and grasp bar with overhand wide grip. Bend knees so partner can assist from behind.','Pull body up until bar touches back of neck. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/AsRearPullupPartner.gif'),(489,'Pull-up (open-centered bar)','Reach up and grasp bar with wide overhand grip.','Pull body up until neck reaches height of hands. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/BWPullUp.gif'),(490,'Pull-up (neutral grip)','Step up and grasp bar with neutral grip.','Pull body up until neck reaches height of hands. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/BWPullUpN.gif'),(491,'Rear Pull-up','Step up and grasp bar with overhand wide grip.','Pull body up until bar touches back of neck. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/BWRearPullup.gif'),(492,'Partner-assisted Chin-up','Step up and grasp bar with underhand shoulder width grip. Bend knees so partner can assist from behind.','Pull body up until elbows are to sides or chin is just above bar. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/AsUnderhandChinupPartner.gif'),(493,'Partner-assisted Pull-up','Step up and grasp bar with wide overhand grip. Bend knees so partner can assist from behind.','Pull body up until chin is just above bar. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/AsChinupPartner.gif'),(494,'Self-assisted Rear Pull-up','Grasp bar with overhand wide grip. Position forefeet on floor just behind low bar or on bench just behind high bar.','Lower body until arms and shoulders are fully extended. If necessary, use minimal assistance of lower body to control descent allowing knees to bend. Pull body up until bar touches back of neck, again with minimal assistance from lower body. Repeat.','upload/exercise-picture/BWRearPullupSelfAssistedRear.gif'),(495,'Self-assisted Pull-up','Stand facing fixed horizontal bar at neck height. Grasp bar with wide overhand grip. Position feet forward on floor, slightly in front of bar.','Lower body under bar until arms and shoulders are fully extended. If necessary, use minimal assistance of lower body to control descent, allowing knees and hips to bend, keeping flat on floor. Pull body up until chin is just above bar, again with minimal assistance from legs. Repeat.','upload/exercise-picture/BWChinupSelfAssistedFront.gif'),(496,'Self-assisted Chin-up','Stand facing fixed horizontal bar at neck height. Grasp bar with underhand grip shoulder width. Position feet forward on floor, slightly in front of bar.','Lower body under bar until arms and shoulders are fully extended. If necessary, use minimal assistance of lower body to control descent, allowing knees and hips to bend, keeping flat on floor. Pull body up until elbows are to sides, again with minimal assistance from lower body. Repeat.','upload/exercise-picture/BWUnderHandChinupSelfAssistedFront.gif'),(497,'Wheel Rollout','Kneel on floor or mat. Grasp handles on wheel to each side with overhand grip. Position wheel near front of knees and lean over wheel with arms extended downward, supporting upper body.','With arms straight, roll wheel out as far as possible. Lower body gently to floor extending arms forward. Raise body back up by flexing hips and pulling arms back to original position. Return until hips are extended. Repeat.','upload/exercise-picture/BWKneelingWheelRollout.gif'),(498,'Suspended Rollout','Kneel on floor or mat and grasp suspension trainer handles. Position body upright with subtle bend through hip. Also, straighten arms in front of body with slight bend.','Lean body forward while maintaining small bend in hip. Allow arms to bend forward to sides of head. Bend over as far as possible. Raise body back up by pulling arms back until kneeling upright in original position. Repeat.','upload/exercise-picture/STKneelingRollout.gif'),(499,'Suspended Self-assisted Pull-up','Stand facing suspension handles placed at neck height. Grasp handles and position feet forward on floor, slightly in front of handles.','Lower body under handles until arms and shoulders are fully extended. If necessary, use minimal assistance of lower body to control descent, allowing knees and hips to bend, keeping flat on floor. Pull body up until chin is just above handles, again with minimal assistance from legs. Repeat.','upload/exercise-picture/STSelfAssistedPullup.gif'),(500,'Bar Lat Stretch','Standing distance facing bar approximately lower chest height. Grasp bar with both hands. Lean body forward so bar is behind/under bar and arms are to sides of head. Feet are keep away from bar.','Allow upper body to hang downward while keeping arms to sides of head. Hold stretch.','upload/exercise-picture/01d980e27b31196413c44429d1bf8e00.jpg'),(501,'Suspended Pull-up','Grasp high suspension handles.','Pull body up until neck reaches height of hands. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/STPullup.gif'),(502,'Bent-over Lat Stretch (on chair or bench)','Kneel in front of chair on floor or mat. Place inside of crossed arms on end of chair and position head between arms.','Lower torso. Hold stretch.','upload/exercise-picture/Bentover.jpg'),(503,'Stability Ball Rollout','Kneel on floor or mat facing stability ball within arm\'s reach. Straighten hips with subtle bend. Also straighten arms with slight bend, down in front of body. Place fists side by side on upper side of ball closest to hips.','Lean forward and roll ridged arms out over ball. Roll forward as far as possible. Raise body back up by pulling arms back until kneeling upright in original position. Repeat.','upload/exercise-picture/BWRolloutBall.gif'),(504,'Lever Lat Stretch','Sit on seat in forward position with lower legs on shin pad, feet on foot rest. Place hands through wrist straps. Hold upper bar with underhand grip.','Push and lower seat back. Hold stretch.','upload/exercise-picture/PCUnderhand8.gif'),(505,'Bent-over Lat Stretch','Kneel on mat or floor. Extend arms well beyond knees and place forearms on floor.','Lower torso as far down as possible and sit back. Hold stretch.','upload/exercise-picture/BentoverFloorLat.jpg'),(506,'Overhead Lat Stretch','Put one arm overhead. Grasp elbow or wrist overhead with other hand.','Pull elbow toward head and back or pull arm down toward opposite shoulder. Lean torso to side, away from direction of arm behind head. Hold stretch. Repeat with opposite arm.','upload/exercise-picture/StandingSideBendLat.jpg'),(507,'Seated Side Reach Lat Stretch','Sit on bench or floor. Place one arm down to side on bench or floor, slightly behind for support. Put opposite arm overhead.','Lean and reach to side away from raised arm. Hold stretch. Repeat with opposite arm.','upload/exercise-picture/524bb061bc1d45f04e9d210ca87e864b.jpg'),(508,'Standing Side Reach Lat Stretch','Stand with feet far apart. Place one arm on side of thigh. Put opposite arm overhead.','Lean and reach to side away from raised arm. Hold stretch. Repeat with opposite arm.','upload/exercise-picture/7926682b1fd64e1118a13f8b734fecef.jpg'),(509,'Wall Lat Stretch','Standing toward wall. Bend over and place palms of hands on wall, approximately shoulder width and waist height.','Lower torso. Hold stretch.','upload/exercise-picture/8ba64011570f73050fcd1c3d26fe4b02.jpg'),(510,'PNF Overhead Lat Stretch','Instruct participant to stand or sit on floor, chair, or bench and place arm overhead. Standing behind participant, grasp their wrist and position their forearm behind their head.','Pull participant\'s wrist toward back of shoulder. Lean torso to side, away from direction of arm behind head. Hold stretch. Repeat with opposite arm.','upload/exercise-picture/af32125548f8472201151459ae3d6336.jpg'),(511,'Cambered Barbell Seated Shrug','Sit on end of bench and grasp cambered bar from beneath with overhand or mixed grip.','Elevate shoulders as high as possible. Lower and repeat.','upload/exercise-picture/CMBSeatedShrug.gif'),(512,'Trap Bar Shrug','Step into trap barbell and stand holding handles of trap bar to sides.','Elevate shoulders as high as possible. Lower and repeat.','upload/exercise-picture/TBShrug.gif'),(513,'Cable Bar Shrug','Position adjustable pulleys at low position. Stand close to cable bar and grasp with shoulder width or slightly wider overhand grip.','Elevate shoulders as high as possible. Lower and repeat.','upload/exercise-picture/CBBarShrug.gif'),(514,'Barbell Shrug','Stand holding barbell with overhand or mixed grip; shoulder width or slightly wider.','Elevate shoulders as high as possible. Lower and repeat.','upload/exercise-picture/BBShrug.gif'),(515,'Trap Bar Shrug (elevated stand)','Step into elevated trap bar stand. Bend down and grasp handles of apparatus to sides. Stand upright.','Elevate shoulders as high as possible. Lower and repeat.','upload/exercise-picture/SBShrugStand.gif'),(516,'Cable Shrug (with stirrups)','Stand between two low pulleys and grasp stirrups to each side. Stand upright with arms straight down to each side.','With arms straight, elevate shoulders as high as possible. Lower and repeat.','upload/exercise-picture/CBShrugStirrups.gif'),(517,'Cable Shrug','Stand facing low pulley and grasp cable bar with shoulder width or slightly wider overhand grip. Stand close to pulley.','With arms straight, elevate shoulders as high as possible. Lower and repeat.','upload/exercise-picture/CBShrug.gif'),(518,'Cable One Arm Shrug','Grasp stirrup with one hand and stand close to low pulley to side.','With arms straight, elevate shoulder as high as possible. Lower and repeat.','upload/exercise-picture/CBOneArmShrug.gif'),(519,'Dumbbell Shrug','Stand holding dumbbells to sides.','Elevate shoulders as high as possible. Lower and repeat.','upload/exercise-picture/DBShrug.gif'),(520,'Cable Shrug (dual pulley)','Stand between two low pulleys and grasp stirrups to each side. Stand upright with arms straight down to each side.','With arms straight, elevate shoulders as high as possible. Lower and repeat.','upload/exercise-picture/CBShrugDualPulley.gif'),(521,'Lever Gripless Shrug (plate loaded)','Stand with shoulders under padded lever.','Elevate shoulders as high as possible. Lower and repeat.','upload/exercise-picture/LVGriplessShrugPL.gif'),(522,'Lever Narrow Grip Shrug (plate loaded)','Stand very near to close lever handles. Bend over and grasp handles with each hand. Stand upright.','Elevate shoulders as high as possible. Lower and repeat.','upload/exercise-picture/LVShrugNarrow.gif'),(523,'Lever Shrug (plate loaded)','Stand between lever handles to sides. Squat down with feet flat on floor and grasp upper handles to sides. Stand upright by extending hips and knees to full extension.','Elevate shoulders as high as possible. Lower and repeat.','upload/exercise-picture/LVShrugH.gif'),(524,'Lever Seated Gripless Shrug','Sit on seat and place forearms in padded bars.','Elevate shoulders as high as possible. Lower and repeat.','upload/exercise-picture/LVSeatedGriplessShrug.gif'),(525,'Lever Barbell Shrug (plate loaded)','Stand behind bar mid-thigh height. Stand grasping bar with shoulder width or slightly wider overhand grip. Disengage bar by rotating bar back and stand upright.','Elevate shoulders as high as possible. Lower and repeat.','upload/exercise-picture/LVSMShrug.gif'),(526,'Lever Shrug','Stand holding lever bar with shoulder width overhand or mixed grip.','Elevate shoulders as high as possible. Lower and repeat.','upload/exercise-picture/LVShrug.gif'),(527,'Smith Shrug','Stand grasping smith bar with shoulder width or slightly wider overhand grip. Disengage bar by rotating bar back.','Elevate shoulders as high as possible. Lower and repeat.','upload/exercise-picture/SMShrug.gif'),(528,'Lever Seated Shrug (plate loaded)','Sit on bench and grasp lower handles to each side. Sit upright.','Elevate shoulders as high as possible. Lower and repeat.','upload/exercise-picture/LVSeatedShrugH.gif'),(529,'Inverted Shrug (on parallel bars)','Stand between parallel bars. Squat down and grasp parallel bars from above. Kick legs up inverting and balancing body upside down. Legs can be kept bent or straight, positioned vertically.','Raise body up a high as possible by pulling shoulders toward ears. Lower body to original position and repeat.','upload/exercise-picture/BWBentKneeInvertedShrug.gif'),(530,'Sled Gripless Shrug','Stand with shoulders under padded bar.','Elevate shoulders as high as possible. Lower and repeat.','upload/exercise-picture/SLGriplessShrug.gif'),(531,'Lever Gripless Shrug','Stand with shoulders under padded lever.','Elevate shoulders as high as possible. Lower and repeat.','upload/exercise-picture/LVGriplessShrug.gif'),(532,'Upper Trapezius Stretch','Grasp wrist or hand from behind and pull arm to opposite side','Tilt head away from lowered shoulder by positioning ear toward front of opposite shoulder. Hold stretch. Repeat to other side.','upload/exercise-picture/90b391614b804836394c8232d1f1bc8b.jpg'),(533,'Suspended Inverted Shrug','Grasp gymnastics rings, one in each hand. Sit on mat between parallel bars. Kick legs up inverting and balancing body upside down.','Raise body up a high as possible by pulling shoulders toward ears. Lower body to original position and repeat.','upload/exercise-picture/BWInvertedShrugsRings.gif'),(534,'Fixed Bar Rhomboids Stretch','Stand facing very close to stationary bar. Grasp stationary bar with both hands just below chest height.','Lean back allowing body and hips to fall back and shoulders to be pulled forward. Hold stretch.','upload/exercise-picture/d3bb866a867c108318859f20ac343f44.jpg'),(535,'Hugging Stretch','Cross both arms and place both hands behind shoulders of opposite arms.','Bring elbows closer together in front of body. Raise elbows slightly and hold stretch.','upload/exercise-picture/247d61a1ccbd2df25a96521b4a9f1d46.jpg'),(536,'Dumbbell Seated Shoulder External Rotation','Sit on bench. Place foot on other side of bench and other foot on floor with knees bent. Place upper elbow on knee with dumbbell positioned above knee.','Lower dumbbell downward toward lower leg by rotating shoulder until slight stretch is felt. Return and repeat. Continue with opposite arm.','upload/exercise-picture/DBSeatedShoulderExternalRotation.gif'),(537,'Cable Seated Shoulder External Rotation','Sit with side to low pulley. Grasp dumbbell cable attachment with far arm. Position elbow against side and forearm across belly.','Pull cable attachment away from body by externally rotating shoulder. Return and repeat. Turn around and continue with opposite arm.','upload/exercise-picture/CBSeatedExternalRotation.gif'),(538,'Dumbbell Lying Shoulder External Rotation','Lie on side with legs separated for support. Grasp dumbbell and position elbow against side and forearm across belly.','Lift dumbbell by rotating shoulder. Return and repeat. Flip over and continue with opposite arm.','upload/exercise-picture/DBLyingExternalRotation.gif'),(539,'Dumbbell Incline Shoulder External Rotation','Lie high up on low incline bench or reverse on decline bench on side with arm pit over leg pad (as demonstrated). Position legs lower on bench for support. Grasp dumbbell and position elbow against side and forearm across belly.','Lift dumbbell upright above elbow by rotating shoulder. Return and repeat. Flip body over and continue with opposite arm.','upload/exercise-picture/DBExternalRotationDecline.gif'),(540,'Cable Upright Shoulder External Rotation','Stand facing low to medium height cable pulley. Grasp stirrup attachment and position bent elbow shoulder height out to side with forearm in line with cable.','Pull stirrup up and back as far as possible. Return by lowering stirrup to original position. Repeat. Continue with opposite arm.','upload/exercise-picture/CBExternalShoulderRotation2.gif'),(541,'Dumbbell Upright Shoulder External Rotation','Stand or sit with dumbbell positioned out to side of head; bend elbow, shoulder height with dumbbell above elbow.','Lower dumbbell forward by rotating shoulder. Return and repeat. Continue with opposite arm.','upload/exercise-picture/DBUprightShoulderExtRotation.gif'),(542,'Cable Standing Shoulder External Rotation','Stand with side to elbow height cable pulley. Grasp stirrup attachment with far arm. Position elbow against side and forearm across belly.','Pull cable attachment away from body as far as possible by externally rotating shoulder. Return and repeat. Turn around and continue with opposite arm.','upload/exercise-picture/CBStandingExternalRotation.gif'),(543,'Lever Shoulder External Rotation','Place elbow on forearm pad and grasp handle with upper arm to side of body and forearm against body.','Pull lever away from body. Return and repeat. Adjust lever to opposite side and repeat with other arm.','upload/exercise-picture/LVShoulderExternalRotation.gif'),(544,'Dumbbell Upright Shoulder External Rotation (with support)','Stand or sit with side against chest height platform. With dumbbell in hand, position upper arm horizontally on platform, elbow bent so forearm is upright.','Lower dumbbell forward by rotating shoulder. Return and repeat. Continue with opposite arm.','upload/exercise-picture/DBStandingExternalRotationSupport.gif'),(545,'Lever Upright Shoulder External Rotation','Lever should be forward with lever handle down. Push elbow pad forward with forearm, grasp handle with overhand grip. Sit on seat with arm pads and lever to side and position in elbow pad at shoulder height. With opposite hand, grasp seat handle if available, for added stability.','Pull lever handle upward and back as far as possible by rotating upper arm. Lower lever to original position. Repeat. Continue with opposite arm.','upload/exercise-picture/LVUprightExternalRotation.gif'),(546,'Lever Shoulder External Rotation (plate loaded)','Lie supine on section of bench nearest pads to each side. Position body so shoulders and elbows are aligned to fulcrum on each side. Place wrists or back of hands on under upper set of pads to each side.','Pull both lever arms back and down as far as possible to each side of head by simultaneously rotating upper arms. Lower lever arms to original position and repeat.','upload/exercise-picture/LVShoulderExternalRotationPL.gif'),(547,'Side Lying Infraspinatus Stretch','Lie supine on mat or floor with knees bent approximately 90 degrees. Position hand under side of waist, palm down.','Allow legs and hips to fall to side of positioned arm. Hold stretch. Repeat on opposite side.','upload/exercise-picture/e83cc4e80c252e68fe01e3d0a4891143.jpg'),(548,'Seated Bent-over Infraspinatus Stretch','Sit on bench or chair. Place both hands on waist with thumbs facing forward. Lean over and rest torso on thighs.','Allow elbows to fall downward toward floor. Hold stretch.','upload/exercise-picture/681599629550fe54ecfdc24bff39e6db.jpg'),(549,'Bent-over Infraspinatus Stretch','Place both hands on waist with thumbs facing forward. Bend over so torso is parallel to floor.','Allow elbows to fall downward toward floor. Hold stretch .','upload/exercise-picture/af975066da66427c3e87e4ed52c67e18.jpg'),(550,'Side Lying Teres Minor Stretch','Lie down on side on mat or floor. Position arm on floor with bent elbow positioned forward on mat and hand above elbow. With other hand, grasp back of wrist.','Keeping elbow bend at a right angle, push forearm downward toward floor. Hold stretch. Repeat on opposite side.','upload/exercise-picture/ae28a6393c675efab53e9fbae0240a63.jpg'),(551,'Broom Stick Infraspinatus Stretch','Grasp pole at one end and position overhead with other end of pole behind opposite arm. Grasp other end of pole with hand positioned below elbow. Position elbow at height of shoulder.','Pull upper end of pole forward so shoulder is internally rotated. Hold stretch. Repeat with opposite arm.','upload/exercise-picture/f9fdd43b88238a8e619a6d655b251781.jpg'),(552,'Suspended Shoulder External Rotation','Grasp suspension handles and position bent elbows to each sides of waist.','Pull handles apart from each side, while keeping fixed elbow position and body and legs straight throughout movement. Raise forward so handles are to each side of body. Return back until handles come back together in front of body. Repeat.','upload/exercise-picture/STShoulderExternalRotation.gif'),(553,'Dumbbell Shoulder Internal Rotation (on floor)','Hold dumbbell in one hand. Lie on mat with dumbbell in hand. Position upper arm on mat close to body. Bend elbow approximately 90° with dumbbell held upright above elbow.','Maintaining 90° bend in elbow, lower dumbbell toward floor until slight stretch is felt in shoulder. Lift dumbbell toward body by internally rotating shoulder until forearm is vertical and repeat. Continue with opposite arm.','upload/exercise-picture/DBInternalRotationFloor.gif'),(554,'Cable Standing Shoulder Internal Rotation','Stand with side to elbow height cable pulley. Grasp cable stirrup with near arm. Position elbow against side with elbow bent approximately 90°.','Pull cable stirrup toward body by internally rotating shoulder until forearm is across belly. Return and repeat. Continue with opposite arm.','upload/exercise-picture/CBStandingInternalRotation.gif'),(555,'Dumbbell Shoulder Internal Rotation (on bench)','Hold dumbbell in one hand. Lie on bench close to edge on side with dumbbell in hand. Position elbow on edge of bench against side of body with elbow bent approximately 90°. Position legs on bench for support.','Maintaining 90° bend in elbow, lower dumbbell away from body until slight stretch is felt in shoulder. Lift dumbbell toward body by internally rotating shoulder until forearm is across belly. Continue with opposite arm.','upload/exercise-picture/DBInternalRotation.gif'),(556,'Lever Shoulder Internal Rotation','Place elbow on forearm pad and grasp handle with upper arm to side of body and forearm away from body.','Pull lever toward from body. Return and repeat. Adjust lever to opposite side and repeat with other arm.','upload/exercise-picture/LVShoulderInternalRotation.gif'),(557,'Cable Seated Shoulder Internal Rotation','Sit with side to low pulley. Grasp cable stirrup with near arm. Position elbow against side with elbow bent approximately 90°.','Pull cable stirrup toward body by internally rotating shoulder until forearm is across belly. Return and repeat. Continue with opposite arm.','upload/exercise-picture/CBInternalRotation.gif'),(558,'Lever Shoulder Internal Rotation (plate loaded)','Lie supine on section of bench furthest away from pads to each side. Position body so shoulders and elbows are aligned to fulcrum on each side. Place wrists or hands on under lower set of pads to each side of head.','Pull lever arms upward and toward each side of torso as far as possible by simultaneously rotating upper arms. Lower lever arms to original position and repeat.','upload/exercise-picture/LVShoulderInternalRotationPL.gif'),(559,'Doorway Subscapularis Stretch','Stand at end of wall or in doorway facing perpendicular to wall. Bent elbow and place inside of forearm on surface of wall. Position bent elbow just below height of shoulder. Place far leg forward and near leg back.','Bent over at hip while bending knees slightly. Hold stretch . Repeat with opposite arm.','upload/exercise-picture/7e7c92a3099c3dc0c2eb456ebadd0a5e.jpg'),(560,'Broom Stick Subscapularis Stretch','Grasp end of pole to side of head with other end of pole behind arm. Bring elbow forward slightly and bend wrist back. Reach around body with opposite arm and grasp lower end of pole. Place pole in middle of back side of upper arm. Position elbow at height of shoulder.','Pull lower end of pole forward so shoulder is externally rotated.. Hold stretch. Repeat with opposite arm.','upload/exercise-picture/04ab06bb0ae4639867ed65834a7aff6a.jpg'),(561,'Lever Upright Shoulder Internal Rotation','Primary lever should be positioned back with lever handle resting forward on elbow pad. Lift lever handle and sit on seat with arm pads and lever to side. Place elbow in elbow pads at shoulder height and grip handle with over hand grip so forearm is orientated upward and back. With opposite hand, grasp seat handle if available, for added stability.','Pull lever handle forward and downward as far as possible by rotating upper arm. Allow lever to return to original position. Repeat. Continue with opposite arm.','upload/exercise-picture/LVUprightInternalRotation.gif'),(562,'Machine-assisted Chest Dip','Mount wide dip bar with oblique grip (bar diagonal under palm), arms straight with shoulders above hands. Step down onto assistance lever with hips and knees bent.','Lower body by bending arms, allowing elbows to flare out to sides. When slight stretch is felt in chest or shoulders, push body up until arms are straight. Repeat.','upload/exercise-picture/AsChestDip.gif'),(563,'Machine-assisted Chest Dip (kneeling)','Mount wide dip bar with oblique grip (bar diagonal under palm), arms straight with shoulders above hands. Kneel on padded platform, lowering it down slightly so hips are slightly bent.','Lower body by bending arms, allowing elbows to flare out to sides. When slight stretch is felt in chest or shoulders push body up until arms are straight. Repeat.','upload/exercise-picture/ASChestDipKneeling.gif'),(564,'Barbell Board Press','Lie supine on bench. Grasp bar with overhand and slightly wider than shoulder width grip. Arch back, extend hips, and position feet back flat on floor. Dismount barbell from rack over chest. Have assistant hold board on center of chest.','Lower weight toward lower chest on\n\n\nto board. Press bar upward until arms are extended. Repeat.','upload/exercise-picture/BBBoardPress.gif'),(565,'Barbell Guillotine Bench Press','Lie supine on bench. Dismount barbell from rack over upper chest using wide oblique overhand grip.','Lower weight to neck to upper chest. Upper arms will be perpendicular to torso. Press bar until arms are extended. Repeat.','upload/exercise-picture/BBBenchPressGuillotine.gif'),(566,'Barbell Bench Press (power lift)','Lie supine on bench. Grasp bar with overhand and slightly wider than shoulder width grip. Arch back, extend hips, and position feet back flat on floor. Dismount barbell from rack over chest.','Lower weight to lower chest. Press bar upward until arms are extended. Repeat.','upload/exercise-picture/BBBenchPressPowerlift.gif'),(567,'Barbell Bench Press','Lie supine on bench. Dismount barbell from rack over upper chest using wide oblique overhand grip.','Lower weight to chest. Press bar upward until arms are extended. Repeat.','upload/exercise-picture/BBBenchPress.gif'),(568,'Barbell Floor Press','Lie supine on floor at base of power rack. Place feet on floor with knees bent. Grasp bar from rack with overhand and slightly wider than shoulder width grip. Dismount barbell from rack over chest.','Lower weight to lower chest until the triceps are completely on the floor. Relax momentarily, then press bar upward until arms are extended. Repeat.','upload/exercise-picture/BBFloorPress.gif'),(569,'Barbell Decline Bench Press','Lie supine on decline bench with feet under leg brace. Dismount barbell from rack over chest using wide oblique overhand grip.','Lower weight to chest. Press bar until arms are extended. Repeat.','upload/exercise-picture/BBDeclineBenchPress.gif'),(570,'Cable Chest Dip','Step between wide dip bars with dip belt around waist. Kneel as close as possible to low pulley and attach cable to dip belt. Stand up and mount dip bar with oblique grip (bar diagonal under palm), arms straight with shoulders above hands. Keep hips and knees bent.','Lower body by bending arms, allowing elbows to flare out to sides. When slight stretch is felt in chest or shoulders, push body up until arms are straight and repeat.','upload/exercise-picture/CBChestDip.gif'),(571,'Cable Decline Fly','Grasp two opposing high pulley dumbbell attachments. Lie supine on decline bench, in middle and perpendicular to both pulleys. Slightly bend elbows and internally rotate shoulders so elbows are back.','Bring cable stirrups together above upper abdomen in hugging motion; elbows in fixed position and shoulders internally rotated so elbows are to sides. Return to starting position until chest is slightly stretched. Repeat.','upload/exercise-picture/CBDeclineFly.gif'),(572,'Barbell Bench Press (with chains)','Lie supine on bench. Grasp barbell loaded with thick chains from each side, with overhand and slightly wider than shoulder width grip. Dismount barbell from rack over chest.','Lower weight to chest. Press bar upward until arms are extended. Repeat.','upload/exercise-picture/BBBenchPressChain.gif'),(573,'Cable Seated Fly','Sit on seat and grasp stirrups to each side. Slightly bend elbows and internally rotate shoulders so elbows are back.','Keeping elbows pointed high, bring cable attachments together in hugging motion with elbows in fixed position. Return to starting position until slight stretch. Repeat.','upload/exercise-picture/CBSeatedFly.gif'),(574,'Cable Lying Fly','Grasp two opposing low pulley stirrup attachments. Lie supine on bench, in middle and perpendicular to both pulleys. Slightly bend elbows and internally rotate shoulders so elbows are back.','Bring cable attachments together in hugging motion with elbows in fixed position and shoulders internally rotated so elbows are to sides. Return to starting position until slight stretch. Repeat.','upload/exercise-picture/CBLyingFly.gif'),(575,'Cable Bench Press','Lie on bench and grasp stirrups attached to low cable pulley on each side. Position stirrups out to each side of chest with bent arm under each wrist.','Push stirrups up over each shoulder until arms are straight and parallel to one another. Return stirrups to original position, until slight stretch is felt in shoulders or chest. Repeat.','upload/exercise-picture/CBBenchPress.gif'),(576,'Cable Standing Fly','Grasp two opposing high pulley dumbbell attachments. Stand with pulleys to each side. Bend over slightly by flexing hips and knees. Bend elbows slightly and internally rotate shoulders so elbows are back initially.','Bring cable attachments together in hugging motion with elbows in fixed position. Keep shoulders internally rotated so elbows are pointed upward at top and out to sides at bottom. Return to starting position until chest muscles are stretched. Repeat.','upload/exercise-picture/CBStandingFly.gif'),(577,'Cable One Arm Chest Press','Sit on seat and grasp stirrup to one side. Position elbows out to side, slightly lower than shoulder height. Position hand slightly narrower than elbow width in front of upper arm.','Push stirrups out straight in front of shoulder until arm is straight. Return stirrups to original position until slight stretch is felt through shoulder or chest. Repeat.','upload/exercise-picture/CBOneArmChestPress.gif'),(578,'Cable Bar Standing Chest Press','Stand facing behind cable bar, mounted on each side to shoulder height narrow double pulley cables. Grasp cable bar with wide overhand grip. Position bar chest height with elbows angled behind. Lean and step forward with one foot in front, bending forward leg.','Push cable bar forward until arms are straight. Return cable bar to original position until slight stretch is felt in chest or shoulders. Repeat.','upload/exercise-picture/CBBarStandingChestPress.gif'),(579,'Cable Twisting Chest Press','Sit on seat and grasp stirrup to one side. Position elbow out to side, slightly lower than shoulder height. Position hand slightly narrower than elbow width, in front of upper arm. Lean forward in seat.','Push stirrup out in front of upper chest while turning torso away from pulley. Return stirrup and torso back to original position allowing torso to rotate back until slight stretch is felt through chest, shoulder or waist. Repeat.','upload/exercise-picture/CBTwistingChestPress.gif'),(580,'Cable Bar Bench Press','Position adjustable pulley higher than intended height but within arms reach from bench. Position bench under cable bar. Lie supine on bench. While lying on bench, reach over and lower each pulley into intended position so that cables are taut in lowest position with bar on chest. Grasp bar with both hands using wide oblique overhand grip.','Press bar upward until arms are extended. Lower bar to chest or until slight stretch is felt in shoulders. Repeat.','upload/exercise-picture/CBBarBenchPress.gif'),(581,'Cable Chest Press','Sit on seat and grasp stirrups to each side. Position elbows out to sides, slightly lower than shoulder height. Position hands slightly narrower than elbow width in front of upper arms.','Push stirrups out straight until arms are straight and parallel to one another. Return stirrups to original position, until slight stretch is felt in shoulders or chest. Repeat.','upload/exercise-picture/CBChestPress.gif'),(582,'Cable Standing Chest Press','Stand between two shoulder height pulleys, facing away from cable columns. Grasp cable stirrups from each side. Position stirrups to sides of chest with elbows out to sides. Position forearms horizontally and parallel with hands elbow width. Step forward in lunging posture (one foot in front and other foot behind). Lean and step forward with one foot in front, bending forward leg.','Push stirrups forward until arms are straight and parallel to one another. Return stirrups to original position until slight stretch is felt in chest or shoulders. Repeat.','upload/exercise-picture/CBStandingChestPress.gif'),(583,'Dumbbell Bench Press','Sit down on bench with dumbbells resting on lower thigh. Kick weights to shoulder and lie back. Position dumbbells to sides of chest with bent arm under each dumbbell.','Press dumbbells up with elbows to sides until arms are extended. Lower weight to sides of chest until slight stretch is felt in chest or shoulder. Repeat.','upload/exercise-picture/DBBenchPress.gif'),(584,'Cable Decline Chest Press','Sit on seat and grasp stirrups to each side. Position elbows out to sides, slightly lower than shoulder height. Position hands slightly narrower than elbow width in front of upper arms.','Push stirrups forward and slightly downward until arms are straight and parallel to one another. Return stirrups to original position, until slight stretch is felt in shoulders or chest. Repeat.','upload/exercise-picture/CBDeclineChestPress.gif'),(585,'Cable Twisting Standing Chest Press','Grasp cable stirrup from chest height pulley. Turn body away from pulley. Position elbow of loaded arm out to side, lower chest height. Position loaded hand back approximately shoulder height and elbow width. Step far forward with foot of opposite side of loaded arm. Bend knees and position heel off rear foot off floor.','Push stirrups away from body, horizontally until arm is straight and inline with cable. Return stirrups to original position until slight stretch is felt in chest or shoulder. Repeat. Continue with opposite arm.','upload/exercise-picture/CBStandingTwistingChestPress.gif'),(586,'Cable Standing Decline Chest Press','Stand between two high pulleys, facing away from cable columns. Grasp cable stirrups from each side. Position stirrups down to sides of lower chest with elbows high out to sides. Angle forearms downward with hands elbow width or slightly narrower. Lean and step forward with forward leg bent or stand feet side by side with both legs slightly bent (as shown).','Push stirrups at forward/downward angle until arms are straight and parallel to one another. Return stirrups to original position until slight stretch is felt in chest or shoulders. Repeat.','upload/exercise-picture/CBStandingDeclinePress.gif'),(587,'Cable Bar Standing Decline Chest Press','Stand facing behind cable bar mounted on each side to shoulder height narrow double pulley cables. Grasp cable bar with wide overhand grip. Position bar\n\n\nchest height with elbows angled behind and above. Lean and step forward with one foot in front, bending forward knee.','Push cable bar forward and downward until bar is about hip height and arms are straight. Return cable bar to original position until slight stretch is felt in chest or shoulders. Repeat.','upload/exercise-picture/CBBarStandingDeclineChestPress.gif'),(588,'Dumbbell Decline Bench Press','Sit down on decline bench with feet under leg brace and dumbbells resting on thigh. Lie back with dumbbells. Position dumbbells to sides of chest with bent arm under each dumbbell.','Press dumbbells up with elbows to sides until arms are extended. Lower weight to sides of chest until slight stretch is felt in chest or shoulder. Repeat.','upload/exercise-picture/DBDeclineBenchPress.gif'),(589,'Dumbbell Decline Fly','Grasp two dumbbells. Lie supine on decline bench. Support dumbbells above upper abdomen with arms fixed in slightly bent position. Internally rotate shoulders so elbows are to sides.','Lower dumbbells to sides until chest muscles are stretched with elbows fixed. Bring dumbbells together in wide hugging motion until dumbbells are nearly together. Repeat.','upload/exercise-picture/DBDeclineFly.gif'),(590,'Dumbbell Pullover (on apparatus)','Sit on lower pad with back against upper pad, facing dumbbell in rack. Position feet under padded bars. Grasp dumbbell by handle with both hands. Pull top of dumbbell to chest. Push dumbbell up over chest with both hands under inner plate of dumbbell. Raise hips up from pad and recline torso back so chest faces upward. Keep hips and elbows slightly bent.','Keeping elbows slightly bent throughout movement, lower dumbbell over and beyond head until upper arms are in-line with torso. Pull dumbbell up and over chest. Repeat.','upload/exercise-picture/DBPulloverBench.gif'),(591,'Dumbbell Fly','Grasp two dumbbells. Lie supine on bench. Support dumbbells above chest with arms fixed in slightly bent position. Internally rotate shoulders so elbows point out to sides.','Lower dumbbells to sides until chest muscles are stretched with elbows fixed in slightly bent position. Bring dumbbells together in wide hugging motion until dumbbells are nearly together. Repeat.','upload/exercise-picture/DBFly.gif'),(592,'Dumbbell Pullover','Lie on upper back perpendicular to bench. Flex hips slightly. Grasp one dumbbell from behind or from side with both hands under inner plate of dumbbell. Position dumbbell over chest with elbows slightly bent.','Keeping elbows slightly bent throughout movement, lower dumbbell over and beyond head until upper arms are in-line with torso. Pull dumbbell up and over chest. Repeat.','upload/exercise-picture/DBPullover.gif'),(593,'Lever Barbell Bench Press (plate loaded)','Lie supine on bench with upper chest under bar. Grasp bar with wide oblique overhand grip. Disengage bar by rotating bar.','Lower weight to chest. Press bar until arms are extended. Repeat.','upload/exercise-picture/LVSMBenchPress.gif'),(594,'Lever Decline Chest Press (plate loaded)','Sit on seat with handles lower chest height. Grasp handle with wide overhand grip; elbows out to sides just below shoulders.','Press lever until arms are extended. Return weight until chest muscles are slightly stretched. Repeat.','upload/exercise-picture/LVDeclineChestPressHighH.gif'),(595,'Lever Chest Press (plate loaded)','Sit on seat with chest approximately height of handles. Grasp handles with wide overhand grip; elbows out to sides just below shoulders.','Press levers until arms are extended. Return weight until chest muscles are slightly stretched. Repeat.','upload/exercise-picture/LVChestPressH.gif'),(596,'Dumbbell Pullover (on arched bench)','Sit on seat of arched bench with dumbbell on lower thigh. Kick dumbbell up to shoulder while lying back on bench. Grasp both hands under inner plate of dumbbell. Position dumbbell over chest with elbows slightly bent.','Keeping elbows slightly bent throughout movement, lower dumbbell over and beyond head until upper arms are in-line with torso. Pull dumbbell up and over chest. Repeat.','upload/exercise-picture/DBPulloverArchedBench.gif'),(597,'Lever Bench Press (plate loaded)','Lie supine on bench with chest under lever bar. Grasp lever bar with wide oblique overhand grip.','Press bar until arms are extended. Lower weight to upper chest. Repeat.','upload/exercise-picture/LVBenchPressH.gif'),(598,'Lever Chest Dip (plate loaded)','Sit on seat and grasp handles with oblique grip. If possible, place handles in wide position. Lean forward slightly.','Push lever down with elbows away from body. Return until chest is slightly stretched. Repeat.','upload/exercise-picture/LVChestDipH.gif'),(599,'Lever Chest Dip','If possible, place handles in wide position. Sit on seat and grasp handles with oblique grip. Lean forward slightly and allow elbows to flare out.','Push lever down by straightening arms. Return lever up with elbows flaring out until chest is slightly stretched. Repeat.','upload/exercise-picture/LVChestDip.gif'),(602,'Lever Wide Grip Chest Press (plate loaded)','Sit on seat with chest approximately height of handles. Grasp handles with wide overhand grip and elbows out to sides.','Press lever until arms are extended. Return weight until chest muscles are slightly stretched. Repeat.','upload/exercise-picture/LVWideGripChestPressSeatLowH.gif'),(603,'Lever Decline Pec Deck Fly','Sit on machine with back on pad. If available, push foot lever until padded lever moves forward. Place forearms on padded lever. Position upper arms approximately parallel. Release foot lever.','Push levers together. Return until chest muscles are stretched. Repeat.','upload/exercise-picture/LVDeclineFly.gif'),(604,'Lever Pec Deck Fly','Sit on machine with back on pad. If available, push foot lever until padded lever moves forward. Place forearms on padded lever. Position upper arms approximately parallel. Release foot lever.','Push levers together. Return until chest muscles are stretched. Repeat.','upload/exercise-picture/LVFly.gif'),(605,'Lever Bent-over Fly (on iron cross machine)','Stand on platform in front of Lever Iron Cross Machine. Grasp handles to each side. Bend over at hips with knees and elbows bent slightly. Internally rotate shoulders so elbows are pointing upward.','Bring lever handles together in hugging motion with elbows in fixed position. Keep shoulders internally rotated so elbows are pointed upward at top and out to sides at bottom. Return to starting position until chest muscles are stretched. Repeat.','upload/exercise-picture/LVBentOverFly.gif'),(606,'Lever Seated Decline Fly (gripless)','Sit on seat with back against seat. Position both arms over back of padded levers. Slightly bend elbows and internally rotate shoulders, wrists are slightly lower than elbows.','Bring padded levers together by pushing pads forward and downward in hugging motion. Return to starting position until chests muscle are stretched. Repeat.','upload/exercise-picture/LVSeatedDeclineFly.gif'),(607,'Lever Seated Iron Cross Fly','Straddle seat with both levers positioned slightly above horizontal. Grasp both lever ends with elbows slightly above levers. Sit down near end of seat with torso leaning\n\nforward\n\nslightly and slightly bent elbows pointing back.','Push levers downward and together in hugging motion. Keep shoulders internally rotated so elbows are pointed slightly upward at top and out to sides at bottom. Return to starting position until chest muscles are stretched. Repeat.','upload/exercise-picture/LVSeatedFlyIronCross.gif'),(608,'Lever Seated Fly (gripless)','Sit on seat with back against pad and feet on foot bar. Position both arms behind padded levers. Slightly bend elbows and internally rotate shoulders so elbows are pointed back.','Bring padded levers forward and together in hugging motion. Return to starting position until stretch in chests or shoulder is felt. Repeat.','upload/exercise-picture/LVSeatedFlyGripless.gif'),(609,'Lever Seated Fly','Sit on machine with back on pad. Grasp handles to both sides, shoulder height. Slightly bend elbows and internally rotate shoulders so elbows are back.','Keeping elbows pointed high, push lever handles forward and together. Return to back toward original position until mild stretch is felt in chest or shoulder. Repeat.','upload/exercise-picture/LVSeatedFly2.gif'),(611,'Lever Lying Fly','Lie supine on bench. Position both arms under padded levers. Slightly bend elbows and internally rotate shoulders so elbows are back.','Bring padded levers upward and together in hugging motion. Return to starting position until chest muscles are stretched. Repeat.','upload/exercise-picture/LVLyingFly.gif'),(612,'Lever Bench Press','Lie supine on bench with chest under lever bar. Grasp lever bar with wide oblique overhand grip.','Press bar until arms are extended. Lower weight to upp\n\n\ner chest. Repeat.','upload/exercise-picture/LVBenchPress.gif'),(613,'Lever Alternating Chest Press','Sit on seat with lever grips lower chest height. Grasp grips with wide overhand grip; elbows out to sides just below shoulders.','Press one lever until arm is extended. Return lever back until chest muscle is slightly stretched. Repeat with opposite arm, alternating between sides.','upload/exercise-picture/LVAlternatingChestPress.gif'),(614,'Lever Decline Chest Press','Sit on seat with lever grips lower chest height. Grasp grips with wide overhand grip; elbows out to sides just below shoulders.','Press lever until arms are extended. Return weight until chest muscles are slightly stretched. Repeat.','upload/exercise-picture/LVDeclineChestPress2.gif'),(615,'Lever Chest Press','Sit on seat with chest approximately height of horizontal handles. If available, push foot lever until lever is within grasping range. Grasp handles with wide overhand grip; elbows out to sides just below shoulders. Release foot lever.','Press lever until arms are extended. Return weight until chest muscles are slightly stretched. Repeat.','upload/exercise-picture/LVChestPress.gif'),(617,'Lever Alternating Decline Chest Press','Sit on seat with lever grips lower chest height. Grasp grips with wide overhand grip; elbows out to sides just below shoulders.','Press one lever until arm is extended. Return lever back until chest muscle is slightly stretched. Repeat with opposite arm, alternating between sides.','upload/exercise-picture/LVAlternatingDeclineChestPress.gif'),(618,'Lever Parallel Grip Chest Press','Sit on seat with sides of ribs approximately height of parallel handles. If available, push foot lever until handles are within grasping range. Grasp parallel handles. Release foot lever.','Press lever until arms are extended. Return weight until shoulders or chest feels slightly stretched. Repeat.','upload/exercise-picture/LVParallelGripBenchPressB.gif'),(619,'Sled Horizontal Grip Standing Chest Dip','Stand between handles facing machine. Bend forward slightly and grasp transverse handles with overhand grip. Position elbows upward and outward. Bend knees just enough to raise selected weight up from remaining weight stack.','Push lever down by straightening arms. Return lever up with elbows flaring out until chest is slightly stretched. Repeat.','upload/exercise-picture/SLStandingChestDipWideHorizontalGrip.gif'),(620,'Sled Standing Chest Dip','Stand between handles facing machine. Bend forward slightly and grasp parallel handles with oblique grip. Position elbows upward and outward. Bend knees just enough to raise selected weight up from remaining weight stack.','Push lever down by straightening arms. Return lever up with elbows flaring out until chest is slightly stretched. Repeat.','upload/exercise-picture/SLStandingChestDip.gif'),(621,'Smith Bench Press','Lie supine on bench with chest under bar. Grasp bar with wide oblique overhand grip. Disengage bar by rotating bar back.','Lower weight to chest. Press bar until arms are extended. Repeat.','upload/exercise-picture/SMBenchPress.gif'),(622,'Lever Decline Bench Press','Lie supine on decline bench with feet under leg brace and chest under lever bar. Grasp lever bar with wide oblique overhand grip.','Press bar until arms are extended. Lower weight to chest. Repeat.','upload/exercise-picture/LVDeclineBenchPress.gif'),(623,'Weighted Push-up','Lie prone on floor with hands slightly wider than shoulder width. Raise body up off floor by extending arms with body straight. Partner can place weight plate(s) on back if needed.','Keeping body straight, lower body to floor by bending arms. Push body up until arms are extended. Repeat.','upload/exercise-picture/WtPushup.gif'),(624,'Chest Dip','Mount wide dip bar with oblique grip (bar diagonal under palm), arms straight with shoulders above hands. Bend knees and hips slightly.','Lower body by bending arms, allowing elbows to flare out to sides. When slight stretch is felt in chest or shoulders, push body up until arms are straight. Repeat.','upload/exercise-picture/BWChestDip.gif'),(625,'Band-assisted Chest Dip','Place one foot on middle of exercise band with ends looped on wide dip bars. Push band down partially by extending leg. Mount dip bar with oblique grip (bar diagonal under palm), arms straight, and shoulders above hands. Place other foot on exercise band next to other foot. Bend knees and hips slightly.','Lower body by bending arms, allowing elbows to flare out to sides. When slight stretch is felt in chest or shoulders, push body up until arms are straight. Repeat.','upload/exercise-picture/ASChestDipFootBand.gif'),(626,'Smith Decline Bench Press','Lie supine on decline bench with feet under leg brace and chest under bar. Grasp bar with wide oblique overhand grip. Disengage bar by rotating bar back.','Lower weight to chest. Press bar until arms are extended. Repeat.','upload/exercise-picture/SMDeclineBenchPress.gif'),(627,'Weighted Push-up (on handles)','Kneel before two push-up handles placed slightly wider than shoulder width apart. Grasp both handles and place feet back on floor or slightly elevated platform. Position body straight with arms extended. Partner can place weight plate(s) on back if needed.','Keeping body ridged, lower body downward by bending arms until slight stretch is felt in chest or shoulders. Push body back up until arms are extended. Repeat.','upload/exercise-picture/WTPushupHandles.gif'),(628,'Push-up','Lie prone on floor with hands slightly wider than shoulder width. Raise body up off floor by extending arms with body straight.','Keeping body straight, lower body to floor by bending arms. Push body up until arms are extended. Repeat.','upload/exercise-picture/BWPushupWide.gif'),(629,'Weighted Chest Dip','Place weight on dip belt around waist or place dumbbell between lower legs just above feet. Mount wide dip bar with oblique grip (bar diagonal under palm), arms straight with shoulders above hands. Keep hips and knees bent.','Lower body by bending arms, allowing elbows to flare out to sides. When slight stretch is felt in chest or shoulders, push body up until arms are straight. Repeat.','upload/exercise-picture/WTChestDip.gif'),(630,'Chest Dip (between benches)','Stand between ends of two benches. Place hands on ends of benches with fingers off ends of benches. Grip should be somewhat wide. Position feet out in front with legs straight, heels on floor, and torso upright.','Lower body by bending arms, allowing elbows to flare out to sides. When slight stretch is felt in chest or shoulders, push body up until arms are straight. Repeat.','upload/exercise-picture/BWDoubleBenchDips.gif'),(631,'Chest Dip (bent knees between benches)','Stand between ends of two benches. Place hands on ends of benches with fingers off ends of benches. Position feet out in front with legs bent and torso upright.','Lower body by bending arms, allowing elbows to flare out to sides. When slight stretch is felt in chest or shoulders, push body up until arms are straight. Repeat.','upload/exercise-picture/BWDoubleBenchDipsBentKnee.gif'),(632,'Incline Push-up','Stand facing bench or sturdy elevated platform. Place hands on edge of bench or platform, slightly wider than shoulder width. Position forefoot back from bench or platform with arms and body straight. Arms should be perpendicular to body.','Keeping body straight, lower chest to edge of box or platform by bending arms. Push body up until arms are extended. Repeat.','upload/exercise-picture/BWPushupOnBox.gif'),(633,'Suspended Chest Dip','Stand between two suspension handles and grasp handles on each side of torso. Hold position firmly and lift feet from floor.','Push body up until arms are straight. Lower body until slight stretch is felt in shoulders. Repeat.','upload/exercise-picture/STDip.gif'),(634,'Incline Push-up (on bar)','Grasp horizontal bar (lower than chest height) with hands slightly wider than shoulder width. Position forefeet back from bar with arms and body straight. Arms should be perpendicular to body.','Keeping body straight, lower chest to bar by bending arms. Push body up until arms are extended. Repeat.','upload/exercise-picture/BWPushupOnBar.gif'),(635,'Suspended Self-assisted Chest Dip','Stand between two suspension handles, approximately mid-thigh height. Grasp handles on each side and straighten arms with shoulders above hands. Hold position firmly and place portion of body weight on handles.','Lower body by bending arms back. If necessary, use minimal assistance of lower body to control descent, allowing knees to bend, keeping feet in contact with floor. When slight stretch is felt in chest or shoulders, push body up back up until arms are straight. Repeat with minimal assistance from legs.','upload/exercise-picture/STSelfAssistedChestDip.gif'),(636,'Suspended Chest Press','Grasp handles and step forward between suspension trainers. Position arms downward and slightly forward, nearly parallel with suspension straps. Lean forward, placing upper body weight onto handles with arms straight, while stepping back onto forefeet so body is leaning forward at desired angle. Straighten body so torso is in-line with legs.','Lower body by bending arms while keeping body straight. Allow handles to come apart slightly to keep in-line with elbows flaring out. Stop descent once mild stretch is felt through shoulders or chest. Push body up to original position, allowing handles to travel inward to keep in line with elbows converging until arms are fully extended. Repeat.','upload/exercise-picture/STChestPress.gif'),(637,'Behind Head Chest Stretch','Place hands behind head.','Pull elbows back further behind ears. Hold stretch.','upload/exercise-picture/31a7b461c0ecbd48cc96c1d82724df4e.jpg'),(638,'Self-assisted Chest Dip','Stand on bench or elevation between parallel bars. Mount wide dip bar with oblique grip (bar diagonal under palm), arms straight with shoulders above hands. Bend knees and hips slightly and place forefoot on bench or elevation below.','Lower body by bending arms, allowing elbows to flare out to sides. If necessary, use minimal assistance of lower body to control descent, allowing knees and hips to bend, keeping forefeet in contact with bench or elevation. When slight stretch is felt in chest or shoulders, push body up until arms are straight and repeat, again with minimal assistance from legs.','upload/exercise-picture/ASChestDipSelfAssisted.gif'),(639,'Suspended Fly','Grasp handles and step forward between suspension trainer. Position arms downward and slightly forward, nearly parallel with suspension straps. Lean forward, placing upper body weight onto handles with arms straight, while stepping back onto forefeet, so body is leaning forward at desired angle. Straighten body so torso is in-line with legs. Bend elbows slightly and internally rotate shoulders, so elbows are pointed outward to each side.','Lower body by allowing suspension handles to separate outward until mild stretch is felt in chest. Reverse motion by bringing handles back together in hugging motion. Repeat.','upload/exercise-picture/STChestFly.gif'),(640,'Push-up (on knees)','Lie prone on floor with hands slightly wider than shoulder width. Bend knees and raise body up off floor by extending arms with body straight.','Keeping body straight and knees bent, lower body to floor by bending arms. Push body up until arms are extended. Repeat.','upload/exercise-picture/BWPushupWideKnee.gif'),(641,'Straight Arm Chest Stretch','With arm extended, position hand on fixed structure shoulder height.','Turn body away from positioned arm. Hold stretch. Repeat with opposite arm.','upload/exercise-picture/35105281f94e7095770bdd334abaf11b.jpg'),(642,'Doorway Modified Chest Stretch','Stand at end of wall or in doorway facing perpendicular to wall. Place front of shoulder and inside of bent arm on surface of wall. Position bent elbow around same height of shoulder. Position both feet back behind original stance.','Lean into wall allowing shoulder to be pushed back. Turn body away from positioned arm. Hold stretch. Repeat with opposite arm.','upload/exercise-picture/9d5fa017ad5d4a4b9ccaad68c16a6db6.jpg'),(643,'PNF Behind Head Chest Stretch','Instruct participant to sit on floor or bench and place hands behind head, facing forward. Stand behind participant and position leg behind their head. Place hands on participant\'s elbows.','Pull participant\'s elbows back. Hold stretch.','upload/exercise-picture/fd41223d6c4bf840b668fe7cd1810421.jpg'),(644,'Doorway Chest Stretch','Stand at end of wall or in doorway facing perpendicular to wall. Place inside of bent arm on surface of wall. Position bent elbow shoulder height.','Turn body away from positioned arm. Hold stretch. Repeat with opposite arm.','upload/exercise-picture/274cce510915d8b305b711f55c0f015c.jpg'),(645,'Cable Incline Chest Press','Sit on seat and grasp stirrups to each side (attached to medium height pulleys). Position elbows out to sides, slightly lower than shoulder height. Position hands back approximately shoulder height and elbow width.','Push stirrups away from body, slightly upward at 30º to 45º until arms are straight and parallel to one another. Return stirrups to original position until slight stretch is felt in chest or shoulders. Repeat.','upload/exercise-picture/CBInclineChestPress.gif'),(646,'Cable Bar Incline Bench Press','Position adjustable pulley higher than intended height, but within arms reach from incline bench. Position incline bench under cable bar. Lie supine on incline bench. While lying on bench, reach over and lower each pulley into intended position so that cables are taut in lowest position with bar on chest. Grasp bar with both hands using wide oblique overhand grip.','Press bar upward until arms are extended. Lower bar to upper chest or until slight stretch is felt in shoulders. Repeat.','upload/exercise-picture/CBBarInclineBenchPress.gif'),(647,'Cable Standing Incline Chest Press','Stand between two hip height pulleys, facing away from cable columns. Grasp cable stirrups from each side. Position elbows out to sides, lower chest height. Position hands back approximately shoulder height and elbow width. Lean and step forward with one foot in front bending forward knee.','Push stirrups forward and upward at 30º to 45º angle until arms are straight and parallel to one another. Return stirrups to original position until slight stretch is felt in chest or shoulders. Repeat.','upload/exercise-picture/CBStandingInclinePress.gif'),(648,'Barbell Incline Bench Press','Lie supine on incline bench. Dismount barbell from rack over upper chest using wide oblique overhand grip.','Lower weight to upper chest. Press bar until arms are extended. Repeat.','upload/exercise-picture/BBInclineBenchPress.gif'),(649,'Cable Incline Bench Press','Sit on seat and grasp stirrups to each side (attached to low cable pulleys). Lie back on incline back support. Position stirrups out to each side of chest with bent arm under each wrist.','Push stirrups up over each shoulder until arms are straight and parallel to one another. Return stirrups to original position, until slight stretch is felt in chest or shoulders. Repeat.','upload/exercise-picture/CBInclineBenchPress.gif'),(650,'Cable Bar Standing Incline Chest Press','Stand facing behind cable bar, mounted on each side to lower chest height narrow double pulley cables. Grasp cable bar with wide overhand grip. Position bar upper mid-chest height with elbows angled behind and downward. Lean and step forward with one foot in front, bending forward knee.','Push cable bar forward and upward at 30º to 45º until arms are straight. Return cable bar to original position until slight stretch is felt in chest or shoulders. Repeat.','upload/exercise-picture/CBBarStandingInclineChestPress.gif'),(651,'Dumbbell Incline Fly','Grasp two dumbbells. Lie supine on bench. Support dumbbells above upper chest with arms fixed in slightly bent position. Bend elbows slightly and internally rotate shoulders so elbows point out to sides.','Lower dumbbells outward to sides of shoulders. Keep elbows fixed in slightly bent position. When a stretch is felt in chest or shoulders, bring dumbbells back together in hugging motion above upper chest until dumbbells are nearly together. Repeat.','upload/exercise-picture/DBInclineFly.gif'),(652,'Dumbbell Incline Bench Press','Sit down on incline bench with dumbbells resting on lower thigh. Kick weights to shoulders and lean back. Position dumbbells to sides of chest with upper arm under each dumbbell.','Press dumbbells up with elbows to sides until arms are extended. Lower weight to sides of upper chest until slight stretch is felt in chest or shoulder. Repeat.','upload/exercise-picture/DBInclineBenchPress.gif'),(653,'Cable Standing Incline Fly','Stand between two pulleys position hip height and arms width or slightly wider apart. Grasp stirrups, one in each hand. Extend arms out with elbows slightly bent, pointed back and downward slightly. Step forward until cables are taut or when weights are lifted up slightly. Stand with feet staggered.','Keeping elbows fixed in slightly bent position, bring stirrups together in upwardly arching, hugging motion, at 30º to 45º angle until they meet at top of motion. Lower stirrups to original position in reverse pattern. As soon as stretch is felt in chest or shoulders, repeat motion.','upload/exercise-picture/CBStandingInclineFly.gif'),(654,'Cable One Arm Standing Incline Chest Press','Grasp cable stirrup from hip height pulley. Turn body away from pulley. Position elbow of loaded arm out to side, lower chest height. Position loaded hand back approximately shoulder height and elbow width. Step far forward with foot of opposite side of loaded arm. Bend knees and position heel of rear foot off floor.','Push stirrups forward and upward at 30º to 45º until arm is straight and in-line with cable. Return stirrup to original position until slight stretch is felt in chest or shoulder. Repeat. Continue with opposite arm.','upload/exercise-picture/CBStandTwistInclineChestPress.gif'),(655,'Cable Incline Fly','Sit on seat with stirrups in each hand (attached to low cable pulleys). Lie back on incline back support. Position stirrups out to each side of chest with bent arm under each wrist. Press stirrups over each shoulder until arms vertical. Bend elbows slightly and internally rotate shoulders so elbows point out to sides.','Lower stirrups outward to sides of shoulders. Keep elbows fixed in slightly bent position. When a stretch is felt in chest or shoulders, bring stirrups back together in hugging motion above upper chest until stirrups are nearly together Repeat.','upload/exercise-picture/CBInclineFly.gif'),(656,'Lever Incline Chest Press (on Hammer military press)','Sit on seat with upper chest just above base of handles on lever. Grasp grips with wide overhand grip. Lift levers into starting position with elbows slightly low.','Press levers until arms are extended. Return weight until chest muscles are slightly stretched with elbows positioned out to sides. Repeat.','upload/exercise-picture/LVInclineChestPressOnHammerMilitaryPress.gif'),(657,'Lever Incline Chest Press (plate loaded)','Sit on seat with upper chest just above grips on lever. Grasp grips with wide overhand grip and position elbows out to sides.','Press lever until arms are extended. Return weight until chest muscles are slightly stretched. Repeat.','upload/exercise-picture/LVInclineChestPressSeatLowH.gif'),(658,'Lever Barbell Incline Bench Press (plate loaded)','Lie supine on incline bench with upper chest under bar. Grasp bar with wide oblique overhand grip. Disengage bar by rotating bar back.','Lower weight to chest. Press bar until arms are extended. Repeat.','upload/exercise-picture/LVSMInclineBenchPress.gif'),(659,'Lever Incline Bench Press','Lie supine on incline bench with upper chest under lever bar. Grasp lever bar with wide oblique overhand grip.','Press bar until arms are extended. Lower weight to upper chest. Repeat.','upload/exercise-picture/LVInclineBenchPress.gif'),(660,'Lever Parallel Grip Incline Bench Press (plate loaded)','Lie supine on incline bench with parallel lever bars out to sides of rib cage. Grasp parallel handles.','Press lever bars up until arms are extended. Lower weight toward upper chest. Repeat.','upload/exercise-picture/LVParellelGripInclineBenchPressNPL.gif'),(661,'Lever Incline Bench Press (plate loaded)','Lie supine on incline bench with lever bars out to sides of chest. Grasp handles with wide overhand grip.','Press lever bars up until arms are extended. Lower weight toward upper chest. Repeat.','upload/exercise-picture/LVInclineBenchPressNPL.gif'),(662,'Lever Parallel Grip Incline Bench Press','Lie supine on incline bench with parallel lever bars out to sides of rib cage. Grasp parallel handles.','Press lever bars up until arms are extended. Lower weight toward upper chest. Repeat.','upload/exercise-picture/LVInclineParallelGripBenchPress.gif'),(663,'Lever Parallel Grip Incline Chest Press','Sit on seat with lower chest at height of parallel handles. If available, push foot lever until handles are within grasping range. Grasp parallel handles.','Press lever bars up until arms are extended. Return weight until shoulders or chest feels slightly stretched. Repeat.','upload/exercise-picture/LVParallelGripInclineChestPress.gif'),(664,'Lever Alternating Incline Chest Press','Sit on seat with upper chest just above grips on lever. Grasp grips with wide overhand grip and position elbows out to sides.','Press one lever until arm is extended. Return lever back down until chest muscle is slightly stretched. Repeat with opposite arm, alternating between sides.','upload/exercise-picture/LVAlternatingInclineChestPress.gif'),(665,'Lever Incline Chest Press','Sit on seat with upper chest just above grips on lever. If available, push foot lever until handles are within grasping range. Grasp handles with wide oblique overhand grip and position elbows out to sides. Release foot lever.','Press lever until arms are extended. Return weight until shoulders or chest feels slightly stretched. Repeat.','upload/exercise-picture/LVInclineChestPress.gif'),(666,'Smith Incline Bench Press','Lie supine on incline bench with upper chest under bar. Grasp bar with wide oblique overhand grip. Disengage bar by rotating bar back.','Lower weight to upper chest. Press bar until arms are extended. Repeat.','upload/exercise-picture/SMInclineBenchPress.gif'),(667,'Decline Push-up','Kneel on floor with bench or elevation behind body. Position hands on floor slightly wider than shoulder width. Place feet on bench or elevation. Raise body body in plank position with body straight and arms extended.','Keeping body straight, lower upper body to floor by bending arms. To allow for full descent, pull head back slightly without arching back. Push body up until arms are extended. Repeat.','upload/exercise-picture/BWDeclinePushup.gif'),(668,'Lever Incline Fly','Lie supine on bench. Position inside of forearms under roller pads with arms out to each side. Slightly bend elbows and internally rotate shoulders so elbows are back.','Raise lever upward and together in hugging motion. Lower weight until slight stretch is felt in chest or shoulder. Repeat.','upload/exercise-picture/LVInclineFly.gif'),(669,'Pike Push-up','Kneel on two benches positioned side by side slightly apart at end nearest head. Place hands on ends of benches. With forefeet on opposite ends of bench, raise rear end high up with arms, back, and knees straight.','Lower head between ends of benches by bending arms. Push body back up to original position by extending arms. Repeat.','upload/exercise-picture/BWFarPikePress.gif'),(670,'Decline Push-up (on stability ball)','Kneel with chest or waist on exercise ball. Dive over top and place hands on floor with arms extended down supporting upper body. While keeping body horizontal, walk hands further away from ball until thighs are positioned on top of ball and hands are slightly wider than shoulder width. Bend knees so feet are up above knees.','Keeping hips straight, lower upper body to floor by bending arms. To allow for full descent, pull head back slightly without arching back. Push body up until arms are extended. Repeat.','upload/exercise-picture/DeclinePushUpOnBall.gif'),(671,'Lying Shoulder Girdle Stretch','Lie supine with soles of feet on floor, hips and knees bent. Bend elbows and position back of arms against floor or mat with elbows to sides.','Push shoulders, forearms, and back of hand into floor or mat and slowly move arms toward sides of head. Still pushing shoulders and back of arms into floor, slowly arms toward sides.','upload/exercise-picture/81c9c6613602c71360e4ca55e904cf66.jpg'),(677,'Towel Shoulder Girdle Stretch','Grasp large towel or rope with very wide overhand grip, approximately length of arm to opposite elbow. Raise towel over head.','Pull towel back away from back of head while attempting to pull towel outward on each side.','upload/exercise-picture/fac48a97a71ddfde86c8d863dcbd396d.jpg'),(678,'Wall Shoulder Girdle Stretch','Position back against wall. Place feet away from wall, slightly bending hips and knees. Bend elbows and position back of arms against wall with elbows to sides.','Push shoulders and back of arms and hands into wall and slowly raise arms as high as possible. Still pushing shoulders arms, slowly lower arms to starting position.','upload/exercise-picture/WallShoulderGirdle.gif'),(679,'Lever Incline Shoulder Raise','Sit on lever chest press machine with shoulders aligned with lever grips. Grasp lever grips with shoulder width overhand grip. Push weight up so arms are straight.','Raise shoulders toward lever grips as far as possible. Lower shoulders to bench and repeat.','upload/exercise-picture/LVInclineShoulderRaise.gif'),(680,'Barbell Incline Shoulder Raise','Lie supine on incline bench. Dismount barbell from rack with shoulder width overhand grip. Position barbell over upper chest with elbows extended.','Raise shoulders toward bar as high as possible. Lower shoulders to bench and repeat.','upload/exercise-picture/BBInclineShoulderRaise.gif'),(681,'Dumbbell Incline Shoulder Raise','Sit down on incline bench with dumbbells resting on lower thigh. Kick weights to shoulders and lean back. Position dumbbells above shoulders with elbows extended.','Raise shoulders toward dumbbells as high as possible. Lower shoulders to bench and repeat.','upload/exercise-picture/DBInclineShoulderRaise.gif'),(682,'Cable Incline Shoulder Raise','Sit on seat and grasp stirrups to each side. Push stirrups out at 30º to 45º until arms are straight and parallel to one another.','Raise shoulders toward stirrups as high as possible. Lower shoulders down and back and repeat.','upload/exercise-picture/CBShoulderRaise.gif'),(683,'Lever Incline Shoulder Raise (plate loaded)','Sit on lever chest press machine with shoulders aligned with lever grips. Grasp lever grips with shoulder width overhand grip. Push weight up so arms are straight.','Raise shoulders toward lever grips as far as possible. Lower shoulders to bench and repeat.','upload/exercise-picture/LVInclineShoulderRaisePL.gif'),(685,'Cable One Arm Incline Push','Sit on seat and grasp stirrup with one hand. Position elbow out to side, slightly lower than shoulder height. Position hand down, slightly higher than shoulder height, slightly narrower than elbow width.','Push stirrup forward and up at 30º to 45º while rotating torso away allowing shoulder to be extended forward. Return stirrups to original position, until slight stretch, and repeat. Continue with opposite side.','upload/exercise-picture/CBOneArmInclinePush.gif'),(686,'Smith Incline Shoulder Raise','Lie supine on incline bench with shoulders under bar. Grasp bar with shoulder width overhand grip. Extend elbows. Disengage bar by rotating bar back.','Raise shoulders toward bar as high as possible. Lower shoulders to bench and repeat.','upload/exercise-picture/SMInclineShoulderRaise.gif'),(687,'Push-up Plus','Lie prone on floor with hands slightly wider than shoulder width. Raise body up off floor by extending arms with body straight.','Keeping body straight, lower body to floor by bending arms. Push body up until arms are extended. Continue lifting body further up by pushing shoulders infront of chest. Repeat.','upload/exercise-picture/BWPushUpPlus.gif'),(689,'Barbell Push Crunch','Position feet under foot pad and lie supine on steep incline bench. Pull barbell from floor or grasp from rack behind with overhand grip. Position barbell over chest with shoulder width or slightly wider grip.','Flex waist to raise upper torso from bench, keeping low back on bench. Return until back of shoulders contact padded incline board. Repeat.','upload/exercise-picture/BBPushCrunch.gif'),(690,'Cable Lying Crunch (on stability ball)','Sit on stability ball against low pulley column. Roll back away from low pulley column, so back is on ball. Reach back and grasp cable rope attachment with both hands and place inside of wrists on sides of head. Allow weight to hyperextend lower back against stability ball.','With hips stationary, flex waist so elbows travel toward thighs. Return and repeat.','upload/exercise-picture/CBLyingCrunchStabBall.gif'),(691,'Cable Lying Leg-Hip Raise (on bench)','Attach cable ankle straps to both ankles, then attach ankle straps to cable. Lie supine on floor or mat, back far enough so cable is taut. Grasp support behind head.','Raise legs by flexing hips while flexing knees until hips are fully flexed. Raise hips from floor by flexing waist. Return until legs are extended horizontally. Repeat.','upload/exercise-picture/CBLyingLegHipRaiseBench.gif'),(692,'Barbell Push Sit-up','Position feet under foot pad and lie supine on flat or incline bench. Pull barbell from floor or grasp from rack behind with overhand grip. Position barbell over chest with shoulder width or slightly wider grip.','Raise torso from bench as high as possible by bending waist and hips. Keep weight positioned above shoulders. Achieve near upright posture (hip flexibility, incline, and initial hip position permitting). Return to original lying posture with back of shoulders contacting padded incline board. Repeat.','upload/exercise-picture/BBInclineSitup.gif'),(693,'Cable Seated Crunch (plate loaded)','Sit on apparatus with back on back support. Grasp cable rope attachment with both hands and place securely over both shoulders. Allow weight to lift chest up with spine arched back slightly.','With hips stationary, flex waist small of back pushes into back of seat as upper back travels forward. Return and repeat.','upload/exercise-picture/CBInclineCrunch.gif'),(694,'Cable Lying Leg-Hip Raise','Attach cable ankle straps to both ankles then attach ankle straps to cable. Lie supine on floor or mat, back far enough so cable is taut. Grasp support behind head.','Raise legs by flexing hips while flexing knees until hips are fully flexed. Raise hips from floor by flexing waist. Return until waist, hips and knees are extended downward. Repeat.','upload/exercise-picture/CBLyingLegHipRaise.gif'),(695,'Cable Lying Straight Leg-Hip Raise','Attach cable ankle straps to both ankles, then attach ankle straps to cable. Lie supine on floor or mat, back far enough so cable is taut. Grasp support behind head.','Raise legs by flexing hips until fully flexed. Raise hips from floor by flexing waist. Return until waist and hips are extended downward. Repeat.','upload/exercise-picture/CBLyingStraightLegHipRaise.gif'),(696,'Cable Seated Crunch','Seat with back support away from medium high pulley. Grasp cable rope attachment with both hands and place securely over both shoulders. Allow weight to lift chest up with spine arched back slightly.','With hips stationary, flex waist so elbows travel toward hips. Return and repeat.','upload/exercise-picture/CBSeatedCrunch.gif'),(697,'Cable Kneeling Crunch','Kneel below high pulley. Grasp cable rope attachment with both hands. Place wrists against head. Position hips back and flex hips, allowing resistance on cable pulley to lift torso upward so spine is hyperextended.','With hips stationary, flex waist so elbows travel toward middle of thighs. Return and repeat.','upload/exercise-picture/CBKneelingCrunch.gif'),(698,'Cable Overhead Seated Crunch','Sit on bench or seat below two very close high pulleys. Grasp two separate cable stirrups, one with each hand. Pull stirrups down with palms facing back over each shoulder. Holding arms in place, allow weight to pull torso up, hyperextend lower back slightly.','With arms fixed in place, flex waist so shoulders travel forward and downward toward thighs. Return until chest is high and back is hyperextended. Repeat.','upload/exercise-picture/CBOverheadSeatedCrunch.gif'),(699,'Cable Standing Crunch','Position back against back pad with knees slightly bent, shoulders back, and chest high. Position both cable ropes over shoulders, one in each hand. Place hands with cable ropes in front of each shoulder so that cable is taut. If available, place hand in rope slot that allows cable to be taut when hands are in position.','Flex waist so torso pulls ropes forward and downward. Return until back of shoulders return to surface. Repeat alternating twists with opposite sides.','upload/exercise-picture/CBStandingCrunch.gif'),(700,'Dumbbell Push Crunch','With dumbbells in each hand, position feet under foot pad and lie supine on steep incline bench. Position dumbbells straight over shoulders.','Flex waist to raise upper torso from bench, keeping low back on bench. Return until back of shoulders contact padded incline bench. Repeat.','upload/exercise-picture/DBPushCrunch.gif'),(701,'Lever Lying Crunch (plate loaded)','Lie on machine with feet on foot bar. Place forearms on bars at sides or grasp handles above to each side.','With hips stationary, raise upper back pad by flexing waist. Return and repeat.','upload/exercise-picture/LVLyingCrunchArmsSide.gif'),(702,'Cable Standing Overhead Crunch (multi-exercise bar)','Stand below high pulley. Grasp multi-exercise bar cable attachment with parallel grip. Position hands near sides of head. Squat down slightly with hips flexed, allowing resistance on cable pulley to lift torso upward so spine is hyperextended.','With knees and hips stationary, flex waist so elbows travel toward middle of thighs. Return and repeat.','upload/exercise-picture/CBStandingOverheadCrunchMultiBar.gif'),(703,'Cable Standing Overhead Crunch','Stand below high pulley. Grasp cable rope attachment and place wrists against head. Squat down slightly with hips flexed, allowing resistance on cable pulley to lift torso upward so spine is hyperextended.','With knees and hips stationary, flex waist so elbows travel toward middle of thighs. Return and repeat.','upload/exercise-picture/CBStandingOverheadCrunch.gif'),(704,'Dumbbell Push Sit-up','Position feet under foot pad and lie supine on flat or incline bench. Position dumbbells straight over shoulders.','Raise torso from bench as high as possible by bending waist and hips. Keep weight positioned above shoulders. Achieve near upright posture (hip flexibility, incline, and initial hip position permitting). Return to original lying posture with back of shoulders, contacting padded incline board. Repeat.','upload/exercise-picture/DBInclineSitup.gif'),(705,'Lever Lying Crunch','Lie on machine with legs over pads or feet on foot bar. Grasp bars near head at each side.','With hips stationary, raise upper back pad by flexing waist. Return and repeat.','upload/exercise-picture/LVLyingCrunch.gif'),(706,'Lever Lying Leg-Hip Raise (plate loaded)','Lie supine on machine with lower legs between padded bars. Grasp handles on each side.','Pull lower leg bar up by flexing hips toward arms by flexing hips then waist. Continue to raise knees toward shoulders by flexing waist, raising hips from board. Return until waist and hips are extended down to original position. Repeat.','upload/exercise-picture/LVLyingLegHipRaise.gif'),(707,'Lever Lying Leg Raise Crunch (plate loaded)','Lie supine on machine with lower legs between padded bars. Grasp handles on each side.','Pull handles toward legs while pulling lower leg bar toward arms by flexing waist and hips. Return and repeat.','upload/exercise-picture/LVCrunchLegRaise.gif'),(708,'Lever Vertical Leg-Hip Raise (plate loaded)','Grasp handles slightly to front and stand on foot bar with knees slightly bent and hips against pad.','Raise legs as high as possible by flexing hips then waist. Return and repeat.','upload/exercise-picture/LVVerticalLegHipRaise.gif'),(709,'Lever Seated Leg Raise Crunch (plate loaded)','Sit on machine with back against back support and lower legs under padded bar. Grasp handles above to each side.','Pull handles down while pulling lower leg bar up by flexing waist and pelvis. Return and repeat.','upload/exercise-picture/LVSeatedLegRaiseCrunchPL.gif'),(710,'Lever Seated Leg Raise Crunch','Sit on machine with back against back support and lower legs under padded bar. Grasp handles above to each side.','Pull handles down while pulling lower leg bar up by flexing waist and pelvis. Return and repeat.','upload/exercise-picture/LVCrunchHipRaiseN.gif'),(711,'Lever Seated Crunch (chest pad)','Position seat so chest is same height of padded lever. Sit on machine with back of hips against hip pad. Place hands on outside of lever pad.','With hips stationary, flex waist in \"C\" shape so shoulders travel forward and downward. Return and repeat.','upload/exercise-picture/LVCrunchChestPad.gif'),(712,'Lever Push Crunch','Sit on machine with back of hips against hip support. Push hips securely back by pushing feet against foot bar. Grasp handles and push resistance lever until arms are extended in front of body.','Push resistance lever forward by flexing waist. Return by allowing upper body to be pushed back until low back is hyperextended. Repeat.','upload/exercise-picture/LVPushCrunch.gif'),(713,'Lever Seated Crunch (arm pad)','Position seat so shoulders are same height of padded lever. Sit on machine and place arms over lever pad. Push padded lever down slightly until shoulder is fixed at approximately 90º or slightly greater.','With hips stationary, flex waist in \"C\" shape so elbows point downward. Return and repeat.','upload/exercise-picture/LVSeatedCrunchArmPad.gif'),(714,'Sled Leg Hip Raise (ab coaster)','Straddle machine facing handles. Grasp handles on each side and place forearms on pads. Place shins on padded sled with knees forward and feet hanging off of back end. Sit back toward heels without bending over.','Slide forward and up by pulling knees up high. Deliberately attempt to flex waist in a \"C\" shape. Return sled down and back arching spine in opposite direction while keeping hips bent. Repeat.','upload/exercise-picture/SLLegHipRaiseAbCoaster.gif'),(715,'Lever Seated Crunch','Sit on machine with back and hips against back supports. If available, place lower legs under pads or on platform. Grasp handles above and position back of arm against pads to each side.','With hips stationary, flex waist so elbows travel downward. Return and repeat.','upload/exercise-picture/LVSeatedCrunch.gif'),(716,'Lever Seated Crunch (arm bar)','Sit on machine with back and hips against padded supports. Place feet on floor or feet bars so thigh is approximately horizontal. Grasp handles and position forearms on bars or pads.','With hips stationary, flex waist so arms and upper torso travel forward and downward. Return and repeat.','upload/exercise-picture/LVSeatedCrunchArmsForward.gif'),(717,'Lever Side Lying Leg Hip Raise','Lie on side with head on elevated head pad and legs between padded rollers. Flex hips slightly until rear and front of thighs are snugly positioned against pads. Flex knees so back of lower leg is against furthest padded roller. Grasp handles in front of head.','Pull knees toward arms by flexing waist and hips. Return and repeat.','upload/exercise-picture/LVSideLyingLegHipRaise.gif'),(718,'Weighted Crunch','Lie supine on bench with head hanging off and knees and hips bent. Hold plate behind neck.','Flex waist to raise upper torso from bench. Keep low back on bench and raise torso up as high as possible. Return until back of shoulders contact padded incline board. Repeat.','upload/exercise-picture/WTCrunch.gif'),(719,'Weighted Crunch (plate on chest)','Lie supine on mat with lower legs on bench. Hold plate on chest with both hands.','Flex waist to raise upper torso from mat. Keep low back on mat and raise torso up as high as possible. Return until back of shoulders contact mat. Repeat.','upload/exercise-picture/WtCrunchChestX.gif'),(720,'Weighted Incline Crunch (arms crossed)','Hook feet under foot brace and lie supine on incline board with hips bent. Hold plate on chest with both hands or use no weight.','Flex waist to raise upper torso from bench. Keep low back on bench and raise torso up as high as possible. Return until back of shoulders contact padded incline board. Repeat.','upload/exercise-picture/WTInclineCrunchX.gif'),(721,'Weighted Incline Sit-up (arms crossed)','Hook feet under foot brace and lie supine on incline board with hips bent. Hold plate on chest with both hands or use no weight.','Raise torso from bench by bending waist and hips. Return until back of shoulders contact padded incline board. Repeat.','upload/exercise-picture/WTInclineSitupX.gif'),(722,'Weighted Incline Sit-up','Hook feet under support and lie supine on incline bench with hips bent. Hold plate behind neck or clasp hands behind neck with no weight.','Raise torso from bench by bending waist and hips. Return until back of shoulders contact padded incline board. Repeat.','upload/exercise-picture/WtInclineSitUp.gif'),(723,'Weighted Overhead Crunch (on stability ball)','Sit on exercise ball with medicine ball in hands. Walk forward on ball and lie back on ball with shoulders and head hanging off and knees and hips bent. Gently hyperextend back to contour of ball. Position medicine ball over upper chest with arms extended.','Keeping arms extended and medicine ball over upper chest, flex waist to raise upper torso. Return to original position. Repeat.','upload/exercise-picture/WTOverheadBallCrunch.gif'),(724,'Weighted Incline Crunch','Hook feet under support and lie supine on incline bench with hips bent. Hold plate behind neck or clasp hands behind neck with no weight.','Flex waist to raise upper torso from bench. Keep low back on bench and raise torso up as high as possible. Return until back of shoulders contact padded incline board. Repeat.','upload/exercise-picture/WtInclineCrunch.gif'),(725,'Weighted Crunch (on stability ball)','Sit on exercise ball. Walk forward on ball and lie back on ball with shoulders and head hanging off and knees and hips bent. Gently hyperextend back to contour of ball. Hold plate behind neck or on chest with both hands or use no weight.','Flex waist to raise upper torso. Return to original position. Repeat.','upload/exercise-picture/WTBallCrunch.gif'),(726,'Medicine Ball Chest Throw Sit-up (machine)','Position feet under support with knees bent. With two medicine\nballs at bottom of chute, grasp closest medicine ball with both\nhands.','With ball in both hands, lie down onto back support while\nlowering medicine ball to chest. Raise torso from back support\nby bending waist and hips while pushing ball away from chest.\nImmediately throw ball into target and grasp other medicine ball\nat bottom of chute. Repeat movement.','upload/exercise-picture/MBSitupChest.gif'),(727,'Weighted Sit-up','Hook feet under support and lie supine on floor or mat with hips bent. Hold plate behind neck.','Raise torso from floor by bending waist and hips. Return until back of shoulders contact with floor or mat. Repeat.','upload/exercise-picture/WTSitUp.gif'),(728,'Weighted Sit-up (arms on chest)','Hook feet under support and lie supine on floor or mat with hips and knees bent. With both hands, hold plate on chest with forearms crossed or use no weight.','Raise torso from floor by bending waist and hips. Return until back of shoulders contact with floor or mat. Repeat.','upload/exercise-picture/WTSitUpX.gif'),(729,'Medicine Ball Overhead Throw Sit-up (machine)','Position feet under support with knees bent. With two medicine balls at bottom of chute, grasp closest medicine ball with both hands.','With ball in both hands, lie down onto back support while lowering medicine ball behind head. Raise torso from back support by bending waist and hips while raising ball overhead. Immediately throw ball into target and grasp other medicine ball at bottom of chute. Repeat movement.','upload/exercise-picture/Absolo.gif'),(730,'Weighted Vertical Leg-Hip Raise (Bosu support)','Place weight between ankles. Position forearms on padded parallel bars with hands on handles and back on convexed surface.','Raise legs by flexing hips and knees. As hips approach full flexion, lean back. Continue to raise knees toward shoulders by flexing waist and raising hips and low back from convexed surface. Return until waist, hips, and knees are extended. Repeat.','upload/exercise-picture/WTVerticalLegHipRaiseConvex.gif'),(731,'Weighted Vertical Leg-Hip Raise','Place weight between ankles or use no weight. Position forearms on padded parallel bars with hands on handles and back on vertical pad.','Raise legs by flexing hips and knees until hips are fully flexed. Continue to raise knees toward shoulders by flexing waist, raising hips from back board. Return until waist, hips, and knees are extended. Repeat.','upload/exercise-picture/WtVerticalLegHipRaise.gif'),(732,'Weighted Vertical Leg-Hip Raise (on parallel bars)','Place weight between ankles. Stand between parallel bars and grip bar on each side with overhand grip. Lift body off floor and balance body upright with arms straight.','Raise legs by flexing hips and knees until hips are fully flexed. Continue to raise knees toward shoulders by flexing waist. Return until waist, hips, and knees are extended. Repeat.','upload/exercise-picture/WTVerticalLegHipRaiseDipBar.gif'),(733,'Weighted Lying Leg-Hip Raise','Place weight between ankles or use no weight. Lie supine on bench or floor. Grasp sides of bench for support.','Raise legs by flexing hips while flexing knees until hips are fully flexed. Continue to raise knees toward shoulders by flexing waist, raising hips from board. Return until waist, hips and knees are extended. Repeat.','upload/exercise-picture/WTLyingLegHipRaise.gif'),(734,'Weighted Hanging Leg-Hip Raise','Place weight between ankles or use no weight. Grasp and hang from high bar.','Raise legs by flexing hips and knees until hips are fully flexed. Continue to raise knees toward shoulders by flexing waist. Return until waist, hips, and knees are extended. Repeat.','upload/exercise-picture/WTHangingLegHipRaise.gif'),(735,'Weighted Side Crunch','Lie upper back supine on floor or mat. With both legs together, knees and hips bent, position outside of leg down to side. Use no weight or hold weight to opposite side of head or across upper chest.','Flex waist, raising upper torso off surface. Return until back of shoulders return to surface. Repeat and continue with movement in opposite position.','upload/exercise-picture/WTSideCrunch.gif'),(736,'Weighted Incline Twisting Crunch (arms crossed)','Hook feet under padding and lie supine on incline bench with hips bent. Hold plate on upper chest with both hands or use no weight.','Flex and twist waist to raise upper torso from bench to one side. Return until back of shoulders contact padded incline board. Repeat to opposite side alternating twists.','upload/exercise-picture/WTInclineTwistingCrunch.gif'),(737,'Cable Standing Twisting Crunch','Position back against back pad with knees slightly bent, shoulders back, and chest high. Place both cable straps over shoulders, one in each hand. Place hands with cable strap in front of each shoulder so that cable is taut. If available, place hands in strap slots that allow cable to be taut when hands are in position with shoulders back.','Flex and twist spine so torso pulls strap forward and downward while twisting one shoulder to forward center. Return until back of shoulders return to back pad. Repeat alternating twists with opposite sides.','upload/exercise-picture/CBStandingTwistingCrunch.gif'),(738,'Lever Seated Twisting Leg Raise Crunch (plate loaded)','Sit on machine with position back against back support and lower legs under padded bar. Grasp handles above to each side.','Pull handles down while pulling lower leg bar up and over to one side by flexing and twisting waist and pelvis. Return and repeat movement to opposite side. Continue alternating between sides.','upload/exercise-picture/LVSeatedTwistingLegRaiseCrunch.gif'),(739,'Weighted Incline Leg-Hip Raise','Sit on incline board. Place weight between ankles or use no weight. Lie supine on incline board with torso elevated. Grasp feet hooks or sides of board by head for support.','Raise legs by flexing hips while flexing knees until hips are fully flexed. Continue to raise knees toward shoulders by flexing waist, raising hips from board. Return until waist, hips and knees are extended. Repeat.','upload/exercise-picture/WtInclineLegHipRaise.gif'),(740,'Weighted Incline Twisting Situp','Hook feet under foot or ankle brace and lie supine on incline bench with hips and knees bent. Hold plate behind neck with both hands.','Flex and twist waist to one direction while raising torso from bench by bending hips. Return until back of shoulders contact padded incline board. Repeat to opposite side, alternating twists.','upload/exercise-picture/WtInclineTwistingSitUp.gif'),(741,'Weighted Twisting Crunch','Lie supine on floor or bench with knees and hips bent. Hold plate behind neck or on chest with both hands.','Flex and twist waist to raise upper torso off surface to one side. Return until back of shoulders return to surface. Repeat to opposite side alternating twists.','upload/exercise-picture/WTTwistingCrunch.gif'),(742,'Weighted Side Crunch (on stability ball)','Sit on exercise ball. Walk forward on ball and lie back on ball with shoulders and head hanging off. Switch position of feet by positioning bent leg under extended leg so waist is twisted with hip positioned sideways. Gently hyperextend back to contour of ball. Hold plate behind neck or on chest with both hands or use no weight.','Flex waist to raise upper torso. Return to original position and repeat. Position legs in opposite position and continue.','upload/exercise-picture/WTSideCrunchOnBall.gif'),(743,'Weighted Incline Twisting Situp (arms crossed)','Hook feet under foot brace and lie supine on incline board with hips and knees bent. Hold plate on chest with both hands or use no weight.','Flex and twist waist to one direction while raising torso from bench by bending hips. Return until back of shoulders contact padded incline board. Repeat to opposite side alternating twists.','upload/exercise-picture/WtInclineTwistingSitUpChest.gif'),(744,'Crunch (arms down)','Lie supine on mat or bench. Bend knees and hips and place feet on floor. Extend arms down to sides.','Flex waist to raise upper torso from mat or bench. Keep low back on floor or mat and raise torso up as high as possible. Extend hands toward sides of heels. Return until back of shoulders contact mat or bench. Repeat.','upload/exercise-picture/CrunchArmsStraight.gif'),(745,'Crunch','Lie supine on mat with lower legs on bench. Place hands behind neck or head.','Flex waist to raise upper torso from mat. Keep low back on mat and raise torso up as high as possible. Return until back of shoulders contact mat. Repeat.','upload/exercise-picture/BWCrunchHead.gif'),(746,'Weighted Twisting Situp','Place feet under low overhanging stationary object. Lie supine on floor or mat with hips and knees bent. Hold plate behind neck with both hands.','Flex and twist waist to one direction while raising torso from bench by bending hips. Return until back of shoulders contact floor or mat. Repeat to opposite side alternating twists.','upload/exercise-picture/WTTwistingSitUp.gif'),(747,'Crunch (arms crossed)','Lie supine on mat with lower legs on bench. Cross wrists on chest.','Flex waist to raise upper torso from mat. Keep low back on mat and raise torso up as high as possible. Return until back of shoulders contact mat. Repeat.','upload/exercise-picture/BWCrunchX.gif'),(748,'Weighted Twisting Crunch (on stability ball)','Sit on exercise ball. Walk forward on ball and lie back on ball with shoulders and head hanging off and knees and hips bent. Gently hyperextend back to contour of ball. Hold plate behind neck or on chest with both hands or use no weight.','Flex waist to raise upper torso. Return to original position and repeat.','upload/exercise-picture/WTTwistingCrunchOnBall.gif'),(749,'Weighted Twisting Situp (arms crossed)','Place feet under low overhanging stationary object. Lie supine on floor or mat with hips and knees bent. With both hands, hold plate on chest with forearms crossed.','Flex and twist waist to one direction while raising torso from bench by bending hips. Return until back of shoulders contact floor or mat. Repeat to opposite side alternating twists.','upload/exercise-picture/WTTwistingSitUpX.gif'),(750,'Crunch Up','Lie supine on mat or floor with bent leg and arms pointed up.','Flex waist to raise upper torso from floor. Return until back of shoulders contact padded incline board. Repeat.','upload/exercise-picture/CrunchUps.gif'),(751,'Jack-knife Sit-up','Sit on floor or mat. Lie supine with hands to sides.','Simultaneously raise knees and torso until hips and knees are flexed. Return to starting position with waist, hips and knees extended. Repeat.','upload/exercise-picture/WtJacknifeSitUp.gif'),(752,'Incline Crunch','Hook feet under foot brace and lie supine on incline board with hips bent. Place hands behind neck or head.','Flex waist to raise upper torso from bench. Keep low back on bench and raise torso up as high as possible. Return until back of shoulders contact incline board. Repeat.','upload/exercise-picture/BWInclineCrunchHead.gif'),(753,'Ball Crunch (on stability ball)','Sit on exercise ball. Walk forward on ball and lie back on ball with shoulders and head hanging off and knees and hips bent. Gently hyperextend back on contour of ball. Place hands behind neck or beside head.','Flex waist to raise upper torso. Return to original position. Repeat.','upload/exercise-picture/BWBallCrunch.gif'),(754,'Crunch (on stability ball, arms crossed)','Sit on exercise ball. Walk forward on ball and lie back on ball with shoulders and head hanging off and knees and hips bent. Gently hyperextend back on contour of ball. Cross arms on chest.','Flex waist to raise upper torso. Return to original position. Repeat.','upload/exercise-picture/BWCrunchBallX.gif'),(755,'Incline Crunch (arms down)','Hook feet under foot brace and lie supine on incline board with hips bent. Extend arms down to sides or cross arms on chest.','Flex waist to raise upper torso from bench. Keep low back on bench and raise torso up as high as possible. Return until back of shoulders contact incline board. Repeat.','upload/exercise-picture/BWInclineCrunchDown.gif'),(756,'Hanging Leg-Hip Raise','Stand below ab straps hanging from high bar. Place upper arms in straps and grasp straps above.','Raise legs by flexing hips and knees until hips are fully flexed. Continue to raise knees toward shoulders by flexing waist. Return until waist, hips, and knees are extended downward. Repeat.','upload/exercise-picture/BWHangingHipLegRaiseAbStrap.gif'),(757,'Hanging Straight Leg-Hip Raise','Grasp and hang from high bar.','Raise legs by flexing hips until fully flexed. Continue to raise feet toward bar by flexing waist. Return until waist and hips are extended downward. Repeat.','upload/exercise-picture/BWHangingStraightLegHipRaise.gif'),(758,'Incline Leg-Hip Raise','Lie supine on incline board with torso elevated. Grasp feet hooks or sides of board by head for support.','Raise legs by flexing hips and knees until hips are fully flexed. Continue to raise knees toward shoulders by flexing waist, raising hips from board. Return until waist, hips and knees are extended. Repeat.','upload/exercise-picture/BWInclineLegHipRaise.gif'),(759,'Lying Leg-Hip Raise','Lie supine on bench or floor. Grasp sides of bench for support.','Raise legs by flexing hips while flexing knees until hips are fully flexed. Continue to raise knees toward shoulders by flexing waist, raising hips from board. Return until waist, hips and knees are extended. Repeat.','upload/exercise-picture/BWLyingLegHipRaise.gif'),(760,'Vertical Leg-Hip Raise (parallel bars)','Stand between parallel bars and grip bar on each side with overhand grip. Lift body off floor and balance body upright with arms straight.','Raise legs by flexing hips and knees until hips are fully flexed. Continue to raise knees toward shoulders by flexing waist. Return until waist, hips, and knees are extended. Repeat.','upload/exercise-picture/WTVerticalLegHipRaisePB.gif'),(761,'Leg-Hip Raise (on stability ball)','Position ball against sturdy support. Lie with back on ball and heels on floor with legs straight. Grasp sturdy bar(s) near head for support.','Raise legs by flexing hips and knees until hips are fully flexed. Continue to raise knees toward shoulders by flexing waist, raising hips from board. Return until waist, hips and knees are extended. Repeat.','upload/exercise-picture/BWLegHipRaiseExerciseBall.gif'),(762,'Vertical Leg-Hip Raise (Bosu support)','Position forearms on padded parallel bars with hands on handles and back on convexed surface.','Raise legs by flexing hips and knees. As hips approach full flexion, lean back. Continue to raise knees toward shoulders by flexing waist and raising hips and low back from convexed surface. Return until waist, hips, and knees are extended. Repeat.','upload/exercise-picture/BWVerticalLegHipRaiseConvex.gif'),(763,'Vertical Straight Leg-Hip Raise (parallel bars)','Stand between parallel bars and grip bar on each side with overhand grip. Lift body off floor and balance body upright with arms straight.','Raise legs by flexing hips until fully flexed. Continue to raise feet toward bar by flexing waist. Return until waist and hips are extended downward. Repeat.','upload/exercise-picture/BWVertStraightLegHipRaiseDipBar.gif'),(764,'Vertical Leg-Hip Raise','Position forearms on padded parallel bars with hands on handles, and back on vertical pad.','Raise legs by flexing hips and knees until hips are fully flexed. Continue to raise knees toward shoulders by flexing waist, raising hips from back board. Return until waist, hips, and knees are extended. Repeat.','upload/exercise-picture/BWVerticalLegHipRaise.gif'),(765,'Incline Sit-up','Hook feet under support and lie supine on incline bench with hips bent. Place hands behind neck or on side of neck.','Raise torso from bench by bending waist and hips. Return until back of shoulders contact incline board. Repeat.','upload/exercise-picture/BWInclineSitups.gif'),(766,'Incline Sit-up (arms crossed)','Hook feet under foot brace and lie supine on incline board with hips bent. Cross arms on chest.','Raise torso from bench by bending waist and hips. Raise crossed arms over knees at top. Return until back of shoulders contact incline board. Repeat.','upload/exercise-picture/BWInclineSitupX.gif'),(767,'Inverted Sit-up','Hang inverted from high bar with gravity boots on each leg. Lie supine with hands on floor over head.','Raise trunk as high as possible by flexing hips and waist. Return to starting position. Repeat.','upload/exercise-picture/BWInvertedSitup.gif'),(768,'Sit-up','Hook feet under foot brace or secure low overhang. Lie supine on floor or bench with hips bent. Place hands behind neck or on side of neck.','Raise torso from bench by bending waist and hips. Return until back of shoulders contact incline board. Repeat.','upload/exercise-picture/BWSitupNeck.gif'),(769,'Sit-up (arms crossed)','Hook feet under foot brace or secure low overhang. Lie supine on mat or bench with hips bent. Cross arms and place hands in front of shoulders.','Raise torso from mat or bench by bending waist and hips. Raise crossed arms over knees at top. Return until back of shoulders contact mat or bench. Repeat.','upload/exercise-picture/BWSitupShoulder.gif'),(771,'Suspended Jack-knife','Sit on floor facing suspension trainer loops in low position. Place right foot in left lower loop. Cross left leg over right leg placed in right lower loop. Turn body to right and place hands on floor, shoulder width apart. Turn body to kneel on hands and knees. Reposition hands squared with desired distance from suspension trainer, shoulder width or slightly wider. With arms straight, raise knees from ground so body is supported by arms and suspension trainer.','Pull legs under torso by bending hips and knees. Pull knees toward chest hips and knees until completely flexed. Return by extending hips and knees to original position. Repeat.','upload/exercise-picture/STJackknife.gif'),(772,'Sit-up (arms down)','Lie supine on mat or bench with hips bent and feet on floor or bench. Hook feet under foot brace or secure low overhang if required to keep feet down. Extend arms down to sides.','Raise torso from mat or bench by bending waist and hips. Extend hands toward sides of heels. Return until back of shoulders contact mat or bench. Repeat.','upload/exercise-picture/BWSitupArmsSides.gif'),(773,'Suspended Pull Through','Sit on floor with feet under suspension trainer loops in low position. Reach and grasp bottom of loops and lay back supine. Raise legs and place heels in loops with soles contacting handles (or ankles through loops as shown). Extend legs out straight. Sit up and place hands on floor to sides at desired distance from suspension trainer. Raise hips from floor supporting upper body with arms.','Pull hips back while flexing spine in C shape. Raise hips up high by straightening spine and hips until straight.','upload/exercise-picture/STPullThrough.gif'),(774,'V-up','Sit on floor or mat. Lie supine with hands on floor over head.','Simultaneously raise straight legs and torso. Reach toward raised feet. Return to starting position. Repeat.','upload/exercise-picture/BWVup.gif'),(775,'Kneeling Abdominal Stretch','Kneel on floor or mat with hips straight. Place hands on back of hips','Lean torso back by arching back. Hold stretch.','upload/exercise-picture/c3e400f67216ec0dad67111d3c0e6460.jpg'),(776,'Suspended Jack-knife Pike','Sit on floor facing suspension trainer loops in low position. Place right foot in left lower loop. Cross left leg over right leg placed in right lower loop. Turn body to right and place hands on floor, shoulder width apart. Turn body to kneel on hands and knees. Reposition hands (shoulder width or slightly wider) at desired distance from suspension trainer so that body is square with suspension trainer straps. With arm straight, raise knees from ground so body is supported by arms and suspension trainer.','Pull knees toward shoulders while raising hips very high. Lower hips by extending body to original straight position, while keeping shins close to horizontal. Repeat.','upload/exercise-picture/STJackknifePike.gif'),(778,'Front Plank','Lie prone on mat. Place forearms on mat, elbows under shoulders. Place legs together with forefeet on floor.','Raise body upward by straightening body in straight line. Hold position.','upload/exercise-picture/FrontPlank.jpg'),(779,'Lying (Prone) Abdominal Stretch','Lie prone on mat or floor. Position hands on floor to sides of shoulders.','Push torso up keeping pelvis on floor. Hold stretch.','upload/exercise-picture/8c63d5a850f5767f5c7fde0838087164.jpg'),(780,'Lying (supine) Abdominal Stretch','Lie supine on mat or floor with arms extended overhead and legs straight.','Lift chest away from lower body while reach away with arms. Hold stretch.','upload/exercise-picture/31b12e7d0a1eda93f9822786a1ea0687.jpg'),(781,'Standing Abdominal Stretch','Stand with arms extended overhead.','Arch back by lift chest up and bringing arms back as far as possible. Hold stretch.','upload/exercise-picture/bd73ab9130ed13b74774ee88fc716f62.jpg'),(782,'Abdominal Vacuum','Sit, kneel, lie, or stand.','Pull navel into spine and hold.','upload/exercise-picture/AbdominalVacuum.jpg'),(783,'Cable Side Bend','With side to low pulley, grasp stirrup attachment with near arm. Stand with arm straight.','Pull stirrup by bending sideways through waist so torso moves away from pulley. Lower stirrup by leaning torso toward pulley. Repeat. Continue with opposite side.','upload/exercise-picture/CBSideBend.gif'),(784,'Cable Seated Cross Arm Twist','Grasp stirrup from medium height cable pulley with far hand. Sit on stool or straddle bench with lower body facing away from pulley. Allow torso to turn to side of near arm. Place far arm across body onto near arm. Support far elbow with near hand.','Rotate torso through waist to face opposite side until slight stretch if felt. Return to original side until slight stretch is felt. Repeat. Continue with opposite side.','upload/exercise-picture/CBSeatedCrossArmTwist.gif'),(785,'Cable Seated Twist','Grasp stirrup and straddle bench orientated with side facing medium height cable pulley. Sit with feet on floor. Hold onto stirrup with both hands with arms extending out straight toward stirrup.','Keeping arms straight, rotate torso to opposite side until cable makes contact with shoulder. Return to original position and repeat. Continue with opposite side.','upload/exercise-picture/CBSeatedTwistB.gif'),(787,'Cable Kneeling Twisting Crunch','Kneel below high pulley. Grasp cable rope attachment with both hands. Place wrists against head. Position hips back and flex hips, allowing resistance on cable pulley to lift torso upward so spine is hyperextended.','With hips stationary, flex waist to one side so elbow travels toward mid-thigh on opposite side. Return to original position and repeat on opposite side. Continue by alternating between sides.','upload/exercise-picture/CBKneelingTwistingCrunch.gif'),(788,'Cable Side Crunch','With side close to high pulley, grasp stirrup attachment with near hand. Position stirrup at side of shoulder, palm orientated inward, and elbow down to side.','Pull stirrup downward by bending toward cable column through waist so torso moves toward base of cable column. Bend in opposite direction by leaning torso away from cable column, allowing stirrup to rise upward. Repeat. Continue with opposite side.','upload/exercise-picture/CBSideCrunch.gif'),(789,'Cable Standing Twisting Crunch (single side)','Position back against back pad with knees slightly bent, shoulders back, and chest high. Place cable straps over shoulder. Hold against front of body with opposite hand so that cable is taut. If available, place hand in rope slot that allows cable to be taut when hand is in position with shoulders back.','Flex and twist spine so shoulder pulls strap diagonally forward and downward away from pulley. Return until back of shoulder returns to back pad and repeat.','upload/exercise-picture/LVStandingTwistingCrunchSingle.gif'),(790,'Cable Russian Twist (on stability ball)','Grasp stirrup and sit on stability ball with side facing low cable pulley. Roll body down and lie with back on ball, hips nearly straight, and feet apart on floor. Hold onto stirrup with both hands with arms extending straight upward.','Allow resistance from cable to turn torso downward, toward direction of pulley while keeping arms straight and perpendicular to torso throughout movement. Pull stirrup in an arch over shoulders by rotating torso to opposite direction of pulley until cable makes contact with shoulder. Return to original position in opposite direction and repeat. Continue with opposite side.','upload/exercise-picture/CBRussianTwistBall.gif'),(791,'Cable Twist','Grasp stirrup from shoulder height cable pulley with both hands. Step and turn lower body away from pulley until near arm is horizontal and straight. Position feet wide apart facing away from pulley, furthest foot further away from pulley. Raise heel of nearest foot off floor. Bend knees of both legs slightly. Place far hand over other hand or interlace fingers.','Keeping arms straight, rotate torso to opposite side until cable makes contact with shoulder. Return to original position and repeat. Continue with opposite side.','upload/exercise-picture/CBTwist.gif'),(792,'Cable Twist (down up)','Grasp stirrup from low cable pulley. Turn to one side, away from pulley. Position feet wide apart with furthest foot away from pulley and nearest foot close to pulley. Point both feet away from pulley. Raise heel of nearest foot off floor. Bend knees of both legs slightly. Place far hand over other hand or interlace fingers.','Keeping arms straight, pull stirrup diagonally upward around shoulders by rotating torso and raising arms gradually upward until cable makes contact with side of body. Bend knees slightly more as stirrup approaches top. Return to original position and repeat. Continue with opposite side.','upload/exercise-picture/CBDownUpTwist.gif'),(793,'Cable Twist (up down)','Grasp stirrup from shoulder height cable pulley. Turn to one side, away from pulley until near arm is extended straight. Position feet wide apart with furthest foot away from pulley and nearest foot close to pulley. Point both feet away from pulley. Raise heel of nearest foot off floor. Place far hand over other hand or interlace fingers.','Keeping arms straight, pull stirrup diagonally downward around shoulders by rotating torso and gradually lowering arms downward until cable is just above shoulder. Gradually bend knees as stirrup makes its way around body and approaches bottom. Return to original position and repeat. Continue with opposite side.','upload/exercise-picture/CBUpDownTwist.gif'),(794,'Lever Barbell Side Bend (plate loaded)','Stand with side to bar mid-thigh height. Grasp bar and disengage.','Bend waist to opposite side of bar. Lower weight by bending toward side with bar and repeat. Continue with opposite side facing opposite direction.','upload/exercise-picture/LVSMSideBend.gif'),(795,'Dumbbell Russian Twist (on stability ball)','With dumbbell in hand, sit on stability ball. Roll body down and lie with back on ball, hips nearly straight, and feet apart on floor. Hold onto dumbbell with both hands with arms extending straight upward.','Turn torso to one side while keeping arms straight and perpendicular to torso throughout movement. Return dumbbell back over shoulders by rotating torso to original position. Continue lowering dumbbell to opposite side. Repeat.','upload/exercise-picture/DBRussianTwistBall.gif'),(796,'Lever Seated Side Bend','Position seat so shoulders are same height of padded lever. Sit in machine with legs to one side. Place over lever pad. Push padded lever down slightly until shoulder is fixed at approximately 90º; upper arm parallel to floor.','With hips stationary, push down lever by bending to side so elbow points downward. Return and repeat. Position lower body to opposite side and repeat.','upload/exercise-picture/LVSideBend.gif'),(797,'Lever Seated Side Leg Raise Crunch (plate loaded)','Sit on machine with seat turned to one side. Position back against back support and lower legs under padded bar. Grasp handles above to each side.','Pull handles down while pulling lower leg bar up by flexing waist and pelvis. Return and repeat. Turn seat to opposite side and repeat.','upload/exercise-picture/LVSeatedSideLegRaiseCrunchOblique.gif'),(799,'Lever Kneeling Twist','Adjust range of motion setting on machine to one side. Kneel on padded stool with both knees between leg pads. Place torso against upper pads and grasp handles.','Rotate lower body through waist to opposite side. Return and repeat. Adjust range of motion setting to opposite side and repeat in opposite direction.','upload/exercise-picture/LVKneelingTwist.gif'),(800,'Dumbbell Side Bend','Grasp dumbbell with arm straight to side.','Bend waist to opposite side of dumbbell until slight stretch is felt. Lower to opposite side, same distance and repeat. Continue with opposite side.','upload/exercise-picture/DBSideBend.gif'),(801,'Dumbbell 45° Side Bend','Position side of thigh on padding and side of feet on leg padding or platform lip. Hold dumbbell straight downward with lower arm.','Raise torso upward by lateral flexing waist. Lower torso by bending waist downward. Repeat. Position body facing opposite side and continue with opposite side.','upload/exercise-picture/DB45SideBend.gif'),(802,'Lever Seated Twist','Adjust range of motion setting on machine to one side. Sit with legs against padding. Place torso against pad and grasp handles.','Rotate torso through waist to opposite side. Return and repeat. Adjust range of motion setting to opposite side and repeat in opposite direction.','upload/exercise-picture/LVTwist.gif'),(803,'Lever Lying Twist','Lie in machine with hands on handles, head on pad, partition between legs, and feet on foot bars. Disengage hand lever and rotate apparatus to one side until full spinal rotation is felt. Re-engage hand lever.','Rotate torso through waist to opposite side. Return and repeat. Readjust range of motion setting to opposite side and repeat in opposite direction.','upload/exercise-picture/LVLyingTwist.gif'),(805,'Lever Seated Twist (gripless)','Adjust range of motion setting on seat to one side. Sit with legs straddled against padding. Wrap arms behind and under padded bars around each side.','Rotate torso through waist to opposite side. Return and repeat. Adjust range of motion setting to opposite side and repeat in opposite direction.','upload/exercise-picture/LVTwistGripless.gif'),(806,'Sled Side Leg Hip Raise (ab coaster)','Straddle machine facing handles with seat turned to one side. Grasp handles on each side and place forearms on pads. Place shins on padded sled with knees in front of turned seat and feet hanging off of back end. Sit back toward heels without bending over.','Slide forward and up by pulling knees up high. Deliberately attempt to flex waist in a \"C\" shape. Return sled down and back arching spine in opposite direction while keeping hips bent. Repeat. Turn seat to opposite side and repeat.','upload/exercise-picture/SLSideHipRaiseAbCoaster.gif'),(808,'Lever Seated Side Crunch','Position seat so shoulders are same height of padded lever. Sit on machine with legs angled to one side. Place arms over lever pad. Push padded lever down slightly until shoulders are are approximately 90º; upper arm parallel to floor.','With hips stationary, flex waist in \"C\" shape so elbows point downward. Return and repeat. Position lower body to opposite side and repeat.','upload/exercise-picture/LVSideCrunch.gif'),(809,'Lever Standing Side Bend','Stand with side to lever handle and grasp. Stand upright.','Bend waist to opposite side of lever. Lower weight by bending to opposite side and repeat. Continue with opposite side facing opposite direction.','upload/exercise-picture/LVStandingSideBend.gif'),(810,'Weighted Bent-knee Lying Twist','On floor or mat, place medicine ball between bent knees. Lie on back with arms extended out to sides. Raise bent legs so thighs are vertical and lower legs are horizontal.','Lower legs to one side until side of thigh is on floor. Raise and lower legs to opposite side. Repeat.','upload/exercise-picture/WTLyingBentKneeTwist.gif'),(811,'Weighted Lying Twist','On floor or mat, place exercise ball between lower legs. Lie on back with arms extended out to sides. Raise legs upward with knees slightly bent.','Lower legs to one side until side of thigh is on floor. Raise and lower legs to opposite side. Repeat.','upload/exercise-picture/EBLyingTwist.gif'),(812,'Weighted 45° Side Bend','Position side of thigh on padding and side of feet on leg padding or platform lip. Hold weight to chest or behind head.','Raise torso upward by lateral flexing waist. Lower torso by bending waist downward. Repeat. Position body facing opposite side and continue with opposite side.','upload/exercise-picture/Wt45SideBend.gif'),(813,'Weighted Russian Twist (on stability ball)','With weight plate or medicine ball in hand, sit on stability ball. Roll body down and lie with back on ball, hips nearly straight, and feet apart on floor. Hold onto weight with both hands with arms extending straight upward.','Turn torso to one side while keeping arms straight and perpendicular to torso throughout movement. Return weight back over shoulders by rotating torso to original position. Continue lowering weight to opposite side. Repeat.','upload/exercise-picture/MBRussianTwistBall.gif'),(817,'Weighted Side Bend (on stability ball)','Lie on ball on side of torso, waist, and hip. Position legs outward with feet on floor or against floor board. Hold weight behind or above head.','Raise side of torso up by laterally flexing waist. Lower torso back on ball and repeat. Position other side on ball and repeat with opposite side.','upload/exercise-picture/WTSideBendOnBall.gif'),(826,'Dumbbell One Arm Straight Leg Deadlift','Stand with shoulder width or wide stance. Grasp dumbbell to side. Place opposite hand to side or behind low back.','With knees straight, lower dumbbell between feet by bending hips and twisting waist, so shoulder of weighted side is turned forward. Allow hips to fall back and waist to bend as dumbbell approaches floor. Lift dumbbell upward and back to side by extending hips and waist until standing upright. Pull shoulder back if rounded. Repeat. Perform exercise with opposite arm.','upload/exercise-picture/DBOneArmStraightlegDeadlift.gif'),(827,'Bent-knee Lying Twist','Lie on back on floor or mat with arms extended out to sides. Raise bent legs so thighs are vertical and lower legs are horizontal.','Lower legs to one side until side of thigh is on floor. Raise and lower legs to opposite side. Repeat.','upload/exercise-picture/BWLyingBentKneeTwist.gif'),(828,'Angled Side Bridge','Place forearm on padded elevated surface, positioned perpendicular to body. Position feet out away from elevated surface, one foot in front of other with hips and knees straight. Place free hand on upper hip and allow lower hip and waist to bend downward.','Raise hips upward by lateral flexion of spine. Lower to original position and repeat. Repeat with opposite side.','upload/exercise-picture/BWAngledSideBridgeRaise.gif'),(829,'Lying Twist','Lie on back on floor or mat with arms extended out to sides. Raise legs upward with knees slightly bent.','Lower legs to one side until side of thigh is on floor. Raise and lower legs to opposite side. Repeat.','upload/exercise-picture/BWLyingStraightLegTwist1.gif'),(830,'Side Bridge','Lie on side on mat. Place forearm on mat under shoulder perpendicular to body. Place upper leg directly on top of lower leg and straighten knees and hips.','Raise hips upward by lateral flexion of spine. Lower to original position and repeat. Repeat with opposite side.','upload/exercise-picture/BWSideBridgeRaise.gif'),(831,'Bent Knee Side Bridge','Lie on side on mat. Place forearm on mat under shoulder perpendicular to body. Bend knees at a right angle. Place upper leg directly on top of lower leg and straighten hips.','Raise hips upward by lateral flexion of spine. Lower to original position and repeat. Repeat with opposite side.','upload/exercise-picture/BWBentKneeSideBridgeRaise.gif'),(832,'Side Bend (on stability ball)','Lie on ball on side of torso, waist, and hip. Position legs outward with feet on floor or against floor board.','Raise side of torso up by lateral flexing waist. Lower torso back on ball and repeat. Position other side on ball and repeat with opposite side.','upload/exercise-picture/EBSideBend.gif'),(833,'Plank Twist (on stability ball)','Kneel with chest or waist on exercise ball. Dive over top and place hands on floor with arms extended down supporting upper body. While keeping body horizontal, walk hands further away from ball until thighs are positioned on top of ball. Bend knees so feet are up above knees.','Rotate hips so thighs roll over top of ball to one side. Rotate to opposite side and repeat.','upload/exercise-picture/BWExerciseBallPlankTwist.gif'),(834,'Incline Twisting Crunch','Hook feet under foot bar and lie supine on incline bench with hips bent. Place hands behind neck.','Flex and twist waist to raise upper torso from bench to one side. Return until back of shoulders contact padded incline board. Repeat to opposite side alternating twists.','upload/exercise-picture/BWInclineTwistingCrunchNeck.gif'),(835,'Twisting Situp (arms crossed)','Place feet under foot bar or low overhanging stationary object. Lie supine on floor, mat, or sit-up bench with hips and knees bent. Cross arms on chest.','Flex and twist waist to one direction while raising torso from bench by bending hips. Return until back of shoulders contact floor or mat. Repeat to opposite side alternating twists.','upload/exercise-picture/BWTwistingSitupShoulders.gif'),(836,'Incline Twisting Situp (arms crossed)','Hook feet under foot or ankle brace and lie supine on incline bench with hips and knees bent. Cross arms on chest.','Flex and twist waist to one direction while raising torso from bench by bending hips. Raise crossed arm over opposite knees at top. Return until back of shoulders contact padded incline board. Repeat to opposite side alternating twists.','upload/exercise-picture/BWInclineTwistingSitupChest.gif'),(837,'Twisting Situp','Place feet under foot bar or low overhanging stationary object. Lie supine on floor, mat, or sit-up bench with hips and knees bent. Place hands behind neck.','Flex and twist waist to one direction while raising torso from bench by bending hips. Return until back of shoulders contact floor or mat. Repeat to opposite side alternating twists.','upload/exercise-picture/BWTwistingSitupNeck.gif'),(838,'Incline Twisting Crunch (arms crossed)','Hook feet under foot bar and lie supine on incline bench with hips bent. Cross arms on chest.','Flex and twist waist to raise upper torso from bench to one side. Return until back of shoulders contact padded incline board. Repeat to opposite side alternating twists.','upload/exercise-picture/BWInclineTwistingCrunchChest.gif'),(839,'Incline Twisting Situp','Hook feet under foot or ankle brace and lie supine on incline bench with hips and knees bent. Place hands behind neck.','Flex and twist waist to one direction while raising torso from bench by bending hips. Return until back of shoulders contact padded incline board. Repeat to opposite side alternating twists.','upload/exercise-picture/BWTwistingSitupsNeck.gif'),(840,'Twisting Crunch (on stability ball)','Sit on exercise ball. Walk forward on ball and lie back on ball with shoulders and head hanging off, and knees and hips bent. Gently hyperextend back to contour of ball. Hold plate behind neck or on chest with both hands or use no weight.','Flex waist to raise upper torso. Return to original position. Repeat.','upload/exercise-picture/BWTwistingCrunchBallHead.gif'),(841,'Side Crunch','Lie upper back supine on floor or mat. With both legs together, knees and hips bent, position outside of leg down to side. Place one hand base on of neck or place arms across upper chest.','Flex waist, raising upper torso off mat or floor. Return until back of shoulders return to mat or floor. Repeat and continue with movement in opposite position.','upload/exercise-picture/BWSideCrunchOneArm.gif'),(842,'Suspended Side Bend','Grasp handles, step away, and face body to one side of suspension trainer anchor. Hold handles above head with arms bent. Stand far enough away to make suspension trainer straps taut. Step in just enough to achieve desired lean of body, while keeping tension on suspension trainer straps.','Lower hips away from direction of suspension trainer anchor by laterally flexing spine. Return to original upright position and repeat. Reposition body facing opposite direction. Continue with other side.','upload/exercise-picture/STSideBend.gif'),(843,'Twisting Crunch','Lie supine on mat with lower legs on bench. Place hands behind neck or head.','Flex and twist waist to raise upper torso from mat to one side. Return until back of shoulders contact mat. Repeat to opposite side alternating twists.','upload/exercise-picture/BWTwistingCrunchHead.gif'),(844,'Suspended Side Bridge','Sit on floor or mat, facing suspension trainer loops in low position. Grasp bottom of loops, then lay supine. Raise legs and place heels in loops with soles contacting handles. Extend legs out with one leg crossed over other. Turn on side of lower leg so legs are parallel. Place forearm on mat or floor under shoulder perpendicular to body.','Raise hips upward by lateral flexion of spine. Lower to original position and repeat. Reposition to opposite side and continue.','upload/exercise-picture/STSideBridge.gif'),(845,'Suspended Twist','Grasp suspension handle(s) with both hands, together with either one hand over other hand or with interlaced fingers. Momentarily step back until arms are extended forward and straight. While keeping arms straight and shoulders back, step forward so body reclines back behind suspension handle(s). Position body and legs straight at desired angle, hanging from handles with arms straight. Feet can be either shoulder width or as wide as desired.','While keeping arms straight and shoulders fixed, rotate torso up to one side. Twist until upright or slight stretch is felt in waist, whichever comes soonest. Rotate back to starting position and repeat. Continue on opposite side.','upload/exercise-picture/STTwist.gif'),(846,'Side Crunch (on stability ball)','Sit on exercise ball. Walk forward on ball and lie back on ball with shoulders and head hanging off. Switch position of feet by positioning bent leg under extended leg so waist is twisted with hip positioned sideways. Gently hyperextend back to contour of ball. Place hands behind neck or cross arms across chest.','Flex waist to raise upper torso. Return to original position and repeat. Position legs in opposite position and continue.','upload/exercise-picture/BWSideCrunchOnBall.gif'),(847,'Suspended Twisting Jack-knife','Sit on floor facing suspension trainer loops in low position. Place right foot in left lower loop. Cross left leg over right leg placed in right lower loop. Turn body to right and place hands on floor, shoulder width apart. Turn body to kneel on hands and knees. Reposition hands (shoulder width or slightly wider) at desired distance from suspension trainer so that body is square with suspension trainer straps. With arms straight, raise knees from ground so body is supported by arms and suspension trainer.','Pull knees toward one elbow by bending hips a nd knees to one side. Twist legs to one side, until hips and knees are completely flexed. Return by extending hips and knees to original straight position. Perform movement to opposite side. Continue by alternating each side.','upload/exercise-picture/STTwistingJackknife.gif'),(848,'Twisting Crunch (arms crossed)','Lie supine on mat with lower legs on bench. Cross arms on chest.','Flex and twist waist to raise upper torso from mat to one side. Return until back of shoulders contact mat. Repeat to opposite side alternating twists.','upload/exercise-picture/BWTwistingCrunchChest.gif'),(849,'Lying Crossover Stretch','On floor or mat, lie supine with arms extended to sides. Lift one leg straight up.','Lower leg to opposite side toward hand. Hold stretch. Repeat with opposite side.','upload/exercise-picture/f606be3198fbe65c3c1136f9a1c73c4e.jpg'),(850,'Pretzel Stretch','Sit on floor or mat with knees straight. Place one foot on floor to outside of other knee. Turn torso toward side of bent knee supporting body with extended arm behind. Place elbow of opposite arm to outside of bent knee.','Turn torso further around by pushing side of knee with elbow. Hold stretch. Repeat with opposite side.','upload/exercise-picture/dad74d1575d3cc3c6a0ba8f858c3a909.jpg'),(851,'Seated Bent Leg Oblique Stretch','Sit on floor or mat. Lean back slightly and place arms behind body with hands on floor for support. Bend knees and hips and place feet flat on floor.','Bring both knees and hip to one side. Hold stretch. Repeat with opposite side.','upload/exercise-picture/0431eaab87f7ddf8f7f0806f3a80d345.jpg'),(852,'Lying Bent Leg Oblique Stretch','Lie supine on floor or mat. Bend knees and place feet flat on floor.','Bring both knees and hip to one side. Hold stretch. Repeat with opposite side.','upload/exercise-picture/190c5905bcd45a2c9a98a05429b1c8d6.jpg'),(853,'Side Plank','Lie on side on mat. Place forearm on mat under shoulder perpendicular to body. Place upper leg directly on top of lower leg and straighten knees and hips.','Raise body upward by straightening waist so body is ridged. Hold position. Repeat with opposite side.','upload/exercise-picture/SidePlankElbow.jpg'),(854,'Bent Knee Side Plank','Lie on side on mat. Place forearm on mat under shoulder perpendicular to body. Bend knees at a right angle. Place upper leg directly on top of lower leg and straighten hips.','Raise body upward by straightening waist so hips and waist are ridged. Hold position. Repeat with opposite side.','upload/exercise-picture/SidePlankElbowKnee.jpg'),(855,'Barbell Back Extension (on hyperextension apparatus)','Position thighs prone on large pad and lower legs under padded bar. Place barbell on back of shoulders and grasp bar to sides.','Lower body by bending waist until fully flexed. Raise or extend waist until torso is parallel to legs. Repeat.','upload/exercise-picture/BBBackExtention.gif'),(856,'Barbell Bent Knee Good-morning','Position barbell on back of shoulders and grasp bar to sides.','Bend hips to lower torso forward until parallel to floor. Bend knees slightly during descent. Raise torso until hips are extended. Repeat.','upload/exercise-picture/BBBentKneeGoodMorning.gif'),(857,'Barbell Deadlift','With feet flat beneath bar, squat down and grasp bar with shoulder width or slightly wider overhand or mixed grip.','Lift bar by extending hips and knees to full extension. Pull shoulders back at top of lift if rounded. Return and repeat.','upload/exercise-picture/BBDeadlift.gif'),(858,'Barbell Hyperextension','Position thighs prone on large pad and lower legs under padded brace. Place barbell on back of shoulders and grasp bar to sides.','Raise upper body until hips and waist are fully extended. Lower body by bending hips and waist until fully flexed. Repeat.','upload/exercise-picture/BBHyperExtention.gif'),(859,'Barbell Sumo Deadlift','Position feet under bar with very wide stance. Squat down and grasp bar between legs with shoulder width mixed grip. Face forward while positioning shoulders upward with arms straight, chest high, hips low, and back straight.','Pull bar up by driving feet outward while pulling chest up. Extend knees when bar passes knees. At top of lift, when torso is upright, drive shoulders back and chest up. Return weight to floor by bending hips back and knees pointed outward, while keeping chest high and back straight. Repeat.','upload/exercise-picture/BBSumoDeadlift.gif'),(860,'Barbell 45° Hyperextension','Position thighs prone on padding. Hook heels on platform lip or under padded brace. Place barbell on back of shoulders and grasp bar to sides.','Raise upper body until hips and waist are fully extended. Lower body by bending hips and waist until fully flexed. Repeat.','upload/exercise-picture/BBHyperextension.gif'),(861,'Barbell 45° Back Extension (on hyperextension apparatus)','Position thighs prone on padding. Hook heels on platform lip or under padded brace. Place barbell on back of shoulders and grasp bar to sides.','Lower body by bending waist until fully flexed. Raise, or extend waist until torso is parallel to legs. Repeat.','upload/exercise-picture/BBBackExtension.gif'),(862,'Barbell Block Pull','With barbell on blocks, position feet shoulder width or slightly narrower beneath bar. Squat down and grasp bar with shoulder width or slightly wider overhand or mixed grip.','Lift bar by extending hips and knees to full extension. Pull shoulders back at top of lift if rounded. Return and repeat.','upload/exercise-picture/BBBlockPull.gif'),(863,'Barbell Sumo Block Pull','With barbell on blocks, position feet under bar with very wide stance. Squat down and grasp bar between legs with shoulder width mixed grip. Face forward while positioning shoulders upward with arms straight, chest high, hips low, and back straight.','Pull bar up by driving feet outward while pulling chest up. Extend knees when bar passes knees. At top of lift, when torso is upright, drive shoulders back and chest up. Return weight to blocks by bending hips back and knees pointed outward, while keeping chest high and back straight. Repeat.','upload/exercise-picture/BBBlockSumoPull.gif'),(864,'Barbell Deficit Deadlift','Stand on weight plate, bumper plate, or shallow elevated platform with loaded bar above feet. Squat down and grasp bar with shoulder width or slightly wider overhand or mixed grip.','Lift bar by extending hips and knees to full extension. Pull shoulders back at top of lift if rounded. Return weights to floor by bending hips back while allowing knees to bend forward, keeping back straight and knees pointed same direction as feet. Repeat.','upload/exercise-picture/BBDeficitDeadlift.gif'),(865,'Barbell Rack Pull','In power rack, with barbell on safety bar in low position, place feet shoulder width or slightly narrower beneath bar. Squat down and grasp bar with shoulder width or slightly wider overhand or mixed grip.','Lift bar by extending hips and knees to full extension. Pull shoulders back at top of lift if rounded. Return and repeat.','upload/exercise-picture/BBRackPullLow.gif'),(866,'Cable Stiff Leg Deadlift','Stand between two very low pulleys with shoulder width or narrower stance. Squat down and grasp stirrup attachments to each side. Stand upright with arms straight down to sides.','Bow forward by bending hips. Bend knees slightly during descent and keep waist straight, flexing low back at bottom. With knees slightly bent, raise torso by extending at waist, then hips, gradually extending knees until standing upright. Pull shoulders back slightly if rounded. Repeat.','upload/exercise-picture/CBStiffLegDeadlift.gif'),(867,'Barbell Stiff Leg Deadlift','Stand with shoulder width or narrower stance on shallow platform with feet flat beneath bar. Bend knees and bend over with lower back straight. Grasp barbell with shoulder width overhand or mixed grip, shoulder width or slightly wider. Lift weight to standing position.','Lower bar to top of feet by bending hips. Bend knees slightly during descent and keep waist straight, flexing only slightly at bottom. With knees bent, lift bar by extending at hips until standing upright. Pull shoulders back slightly if rounded. Extend knees at top if desired. Repeat.','upload/exercise-picture/BBStiffLegDeadlift.gif'),(868,'Trap Bar Deadlift','Stand with feet shoulder width or narrower in trap bar, weight to each side. Squat down with feet flat, low back taut. Grasp handles to sides.','Lift bar by extending hips and knees to full extension. Pull shoulders back at top of lift if rounded. Return and repeat.','upload/exercise-picture/TBDeadlift.gif'),(869,'Trap Bar Stiff Leg Deadlift','Stand on platform under loaded trap bar. Squat down and grasp handles to sides. Squat / Deadlift bar up to standing position.','Lower bar by bending hips. Bend knees slightly during descent and keep waist straight, flexing only slightly at bottom. With knees bent, lift bar by extending at hips until standing upright. Pull shoulders back slightly if rounded. Extend knees at top if desired. Repeat.','upload/exercise-picture/TBStiffLegDeadlift.gif'),(870,'Barbell Straight Leg Deadlift','Stand with shoulder width or narrower stance on shallow platform with feet flat beneath bar. Bend knees and bend over with lower back straight. Grasp barbell with shoulder width overhand or mixed grip, shoulder width or slightly wider. Lift weight to standing position.','With knees straight, lower bar toward top of feet by bending hips and waist. Lift bar by extending waist and hip until standing upright. Pull shoulders back slightly if rounded. Repeat.','upload/exercise-picture/BBStraightLegDeadlift.gif'),(871,'Trap Bar Straight Leg Deadlift','Stand on platform under loaded trap bar. Squat down and grasp handles to sides. Squat / Deadlift bar up to standing position.','With knees straight, lower bar down by bending hips. After hips can no longer flex, bend waist as weights approach floor. Hands should be lowered near sides of ankles. Set weight on floor. Lift bar by extending waist and hip until standing upright. Pull shoulders back slightly if rounded. Repeat.','upload/exercise-picture/TBStraightLegDeadlift.gif'),(872,'Dumbbell Straight Leg Deadlift','Stand with shoulder width or narrower stance. Grasp dumbbells to sides.','With knees straight, lower dumbbells to top or sides of feet by bending hips. Allow hips to fall back and bend waist as dumbbell approaches feet. Lift dumbbells by extending hips and waist until standing upright. Pull shoulders back if rounded. Repeat.','upload/exercise-picture/DBStraightLegDeadlift.gif'),(873,'Lever Deadlift (plate loaded)','Stand in between lever handles. Squat down with feet flat and grasp handles to sides.','Lift lever by extending hips and knees to full extension. Pull shoulders back at top of lift if rounded. Return and repeat.','upload/exercise-picture/LVDeadliftA.gif'),(874,'Cable Straight Leg Deadlift','Stand between two very low pulleys with shoulder width or narrower stance. Squat down and grasp stirrup attachments to each side. Stand upright with arms straight down to sides.','With knees straight, bow forward by bending hips. Bend waist as stirrups approach lowest position. Lift dumbbells by extending hips and waist until standing upright. Pull shoulders back slightly if rounded. Repeat.','upload/exercise-picture/CBStraightLegDeadlift.gif'),(876,'Lever Kneeling Back Extension','Slide back under lever pad and kneel on lower pad. Grasp handles and position feet on foot bars. Make sure knees are against knee pad and hips are against upper thigh pad.','Extend spine until hyperextended. Return and repeat.','upload/exercise-picture/LVKneelingBackExtension.gif'),(877,'Lever Back Extension','Sit on machine with back against padded lever. Push hips back against back of seat by pushing feet against platform. Arch back in \"C\" shape.','Extend spine until hyperextended. Return and repeat.','upload/exercise-picture/LVBackExtensionN.gif'),(878,'Lever Stiff Leg Deadlift (plate loaded)','Stand between lever handles with shoulder width or narrower stance. Squat down and grasp handles to each side. Stand upright with arms straight down to sides.','Bow forward by bending hips. Bend knees slightly during descent and keep waist straight, flexing low back at bottom. With knees slightly bent, raise torso by extending at waist, then hips, gradually extending knees until standing upright. Pull shoulders back slightly if rounded. Repeat.','upload/exercise-picture/LVStiffLegDeadlift.gif'),(879,'Lever Straight Leg Deadlift (plate loaded)','Stand between lever handles with shoulder width or narrower stance. Squat down and grasp handles to each side. Stand upright with arms straight down to sides.','With knees straight, bow forward by bending hips. Bend waist as stirrups approach lowest position. Lift lever by extending hips and waist until standing upright. Pull shoulders back slightly if rounded. Repeat.','upload/exercise-picture/LVStraightLegDeadlift.gif'),(880,'Smith Deadlift','Stand with shoulder width or narrower stance with feet flat beneath bar. Grasp bar with shoulder width or slightly wider mixed grip or slightly wider. Disengage bar by rotating bar back.','Squat down to lower bar by bending hips and knees. Lift bar by extending hips and knees to full extension. Pull shoulders back at top of lift if rounded. Return and repeat.','upload/exercise-picture/SMDeadlift.gif'),(881,'Smith Stiff Leg Deadlift','Stand with shoulder width or narrower stance on elevated platform with thigh against bar. Grasp bar with shoulder width or slightly wider overhand grip. Disengage bar by rotating bar back.','With knees slightly bent, Lower bar toward top of feet by bending hips. Keep waist straight, flexing only slightly at bottom. Lift bar by extending at hips until standing upright. Pull shoulders back slightly if rounded. Extend knees at top if desired. Repeat.','upload/exercise-picture/SMStiffLegDeadlift.gif'),(884,'Smith Bent Knee Good-morning','Position bar on back of shoulders. Grasp bar to sides. Disengage bar by rotating bar back.','Bend hips to lower torso forward until parallel to floor. Bend knees slightly during descent. Raise torso until hips are extended. Repeat.','upload/exercise-picture/SMBentkneeGoodmorning.gif'),(885,'Smith Straight Leg Deadlift','Stand with shoulder width or narrower stance on elevated platform with thigh against bar. Grasp bar with shoulder width or slightly wider overhand grip. Disengage bar by rotating bar back.','With knees straight, lower bar toward top of feet by bending hips. After hips can no longer flex, bend waist as bar approaches top of feet. Lift bar by extending waist and hip until standing upright. Pull shoulders back slightly if rounded. Repeat.','upload/exercise-picture/SMStraightLegDeadlift.gif'),(886,'Weighted Hyperextension','Position thighs prone on large pad and lower legs under padded brace. Hold weight to chest or behind neck.','Raise upper body until hips and waist are fully extended. Lower body by bending hips and waist until fully flexed. Repeat.','upload/exercise-picture/WTHyperExtension3.gif'),(888,'Weighted Back Extension (on hyperextension apparatus)','Position thighs prone on large pad and lower legs under padded brace. Hold weight to chest or behind neck.','Lower body by bending waist until fully flexed. Raise, or extend waist until torso is parallel to legs. Repeat.','upload/exercise-picture/WTBackExtension2.gif'),(889,'Weighted 45° Hyperextension','Position thighs prone on padding. Hook heels on platform lip or under padded brace. Hold weight to chest or behind neck.','Raise upper body until hips and waist are fully extended. Lower body by bending hips and waist until fully flexed. Repeat.','upload/exercise-picture/WtHyperExtension.gif'),(890,'Weighted Back Extension (on stability ball)','Lie prone on ball. Position toes out wide on floor for balance. Hold weight under chin or behind neck.','Raise torso off of ball by hyperextending spine. Return torso to ball and repeat.','upload/exercise-picture/SBHyperextention.gif'),(891,'Weighted 45° Back Extension (on hyperextension apparatus)','Position thighs prone on padding. Hook heels on platform lip or under padded brace. Hold weight to chest or behind neck.','Lower body by bending waist until fully flexed. Raise, or extend waist until torso is parallel to legs. Repeat.','upload/exercise-picture/WTBackExtension.gif'),(892,'Back Extension (on stability ball, arms crossed)','Lie prone on ball, with front of feet apart on floor or with feet against base of wall. Cross arms, hands in front of shoulders.','Raise torso off of ball by hyperextending spine. Return torso to ball and repeat.','upload/exercise-picture/BWHyperextensionBallArmsCrossed.gif'),(893,'Back Extension (on stability ball, arms up)','Lie prone on ball with feet against base of wall. Place arms parallel out over floor beyond head.','Raise torso off of ball and hands over head by hyperextending spine. Return torso to ball and hands toward floor. Repeat.','upload/exercise-picture/BWHyperextensionBallArmsUp.gif'),(895,'Back Extension (on stability ball, arms down)','Lie prone on ball with feet against base of wall. Place arms to sides or clasp hands behind hips.','Raise torso off of ball by hyperextending spine. Return torso to ball and repeat.','upload/exercise-picture/BWHyperextensionBall.gif'),(896,'Bird Dog','Kneel on mat on all fours with legs and hands slightly apart.','Raise arm out straight beside head while raising and extending leg on opposite side up out behind body. Lower arm and leg to floor to original position and repeat. Perform movement with opposite arm and leg.','upload/exercise-picture/BWBirdDog.gif'),(897,'Alternating Bird Dog','Kneel on mat on all fours with legs and hands slightly apart.','Raise left arm out straight beside head while raising and extending right leg up out behind body. Lower arm and leg to floor to original position. Repeat by raising and lowering right arm and left leg in same manner. Repeat by alternating between opposite sides.','upload/exercise-picture/BWAlternatingBirdDog.gif'),(898,'Hanging Hyperextension','Stand behind bar facing elevated platform positioned slightly away on other side of bar. Grasp bar with slightly wider than shoulder width grip. Walk body under bar and position back of heels on elevated platform. With legs extended forward, hang under bar with arms straight and hips bent just above floor.','Raise hips up as high as possible by extending hips and spine. Lower hips to original position just above floor. Repeat.','upload/exercise-picture/BWHangingHyperextension.gif'),(899,'Alternating Bird Dog (on exercise ball)','Lay on top of exercise ball with legs and hands slightly apart. Place chest down so torso is wrapped over ball.','Raise left arm and torso upward beside head while raising right leg up behind body. Lower arm, torso, and leg to original position and repeat. Repeat by raising and lowering right arm and left leg in same manner. Repeat by alternating between opposite sides.','upload/exercise-picture/BWAlternBirdDogHyperExBall.gif'),(900,'Hyperextension (arms crossed)','Position thighs prone on large pad and lower legs under padded brace. Cross arms on chest.','Raise upper body until hips and waist are fully extended. Lower body by bending hips and waist until fully flexed. Repeat.','upload/exercise-picture/BWHyperExtensionX.gif'),(901,'Bird Dog (on stability ball)','Lay on top of exercise ball with legs and hands slightly apart. Place chest down so torso is wrapped over ball.','Raise arm and torso upward beside head while raising leg on opposite side up out behind body. Lower arm, torso, and leg to original position and repeat. Perform movement with opposite arm and leg.','upload/exercise-picture/BWBirdDogHyperExBall.gif'),(902,'Superman','Lie prone on mat with legs together and arms extended out on floor approximately parallel.','Slowly raise upper body and legs off floor. Return upper body and legs to floor and repeat.','upload/exercise-picture/Superman.gif'),(903,'Contralateral Superman','Lie prone on mat with legs together and arms extended out on floor approximately parallel.','Raise left arm and shoulder and right leg up off floor. Lower arm and shoulder and leg to floor. Repeat by raising and lowering right arm and shoulder and left leg. Repeat by alternating between opposite sides.','upload/exercise-picture/ContraLateralSuperman.gif'),(904,'Hyperextension','Position thighs prone on large pad and lower legs under padded brace. Place hands behind neck or to sides of head.','Raise upper body until hips and waist are fully extended. Lower body by bending hips and waist until fully flexed. Repeat.','upload/exercise-picture/BWHyperExtensionHead.gif'),(905,'Hyperextension (hands behind hips)','Position thighs prone on large pad and lower legs under padded brace. Clasp hands behind hips.','Raise upper body until hips and waist are fully extended. Lower body by bending hips and waist until fully flexed. Repeat.','upload/exercise-picture/BWHyperExtensionHips.gif'),(906,'Cat Stretch','Kneel on mat or floor. Place hands shoulder width apart.','Flex spine by hunching back up. Hold stretch.','upload/exercise-picture/85a341a1a24012749fe473a1106c6984.jpg'),(907,'Rear Incline Bridge','Sit on mat with legs together. Place hands back to sides on floor or mat so torso is reclined back slightly.','Raise hips up off floor until hips are straight. Hold position.','upload/exercise-picture/RearInclineBridge.jpg'),(908,'Bent-over Cat Stretch','Bend over with hands just above bent knees.','Flex spine by hunching back up. Hold stretch.','upload/exercise-picture/b5749d48d4c58dbce20b4c492af82004.jpg'),(909,'Cat Movement','Kneel on mat or floor. Place hands shoulder width apart.','Flex spine by hunching back up. Extend spine by arching back. Repeat.','upload/exercise-picture/CatMovement.gif'),(910,'Lying Lower Back Stretch','Lie supine on floor or mat. Raise both knees and grasp back of thighs behind knees.','Pull knees toward shoulders allowing hips to be raised further off floor. Hold stretch.','upload/exercise-picture/ef0e66c71170773cedd6aaa015f334af.jpg'),(911,'Seated Lower Back Stretch','Sit on floor or mat with feet apart and knees bent approximately 90 degrees.','Reach forward between feet. Hold stretch.','upload/exercise-picture/d852814763a527dc7329c405e0155655.jpg'),(912,'Lever Lower Back Stretch','Sit on seat in forward position with lower legs on shin pad, feet on foot rest. Place hands through wrist straps. Hold upper bar with overhand grip.','Push and lower seat back. Hold stretch.','upload/exercise-picture/PCLowBack8.gif'),(913,'Suspended Hyperextension','Grasp suspension handles and momentarily step back until arms are extended forward and straight. While keeping arms straight and shoulders back, step forward so body reclines back behind suspension handles. Fold at hips onto heels, allowing rear end to fall far back with arms and shoulders stretched forward.','Drive hips forward until hips are straight, while keeping arms and shoulders straight. Near top of motion, reach back with arms over head and hyperextend spine. While keeping arms over head, lower body with hips falling back down to starting position and repeat.','upload/exercise-picture/STHyperextension.gif'),(915,'Rear Decline Bridge','Lie supine on mat with arms to sides. Place feet flat on floor or mat with knees bent.','Raise hips up off floor until hips are straight. Hold position.','upload/exercise-picture/RearDeclineBridge.jpg'),(916,'Seated Bent-over Lower Back Stretch','Sit on chair or bench with feet wide apart. Bend over and position shoulders between knees.','Reach to floor under back of chair. Hold stretch.','upload/exercise-picture/764b4335143f6a5842325004e906a3f8.jpg'),(917,'Squatting Lower Back Stretch','Stand facing hip height fixed bar approximately arm length away. Grasp fixed bar.','Keeping feet flat on floor, squat down as low as possible and bend down with arms straight. Lean back slightly and allow shoulders to stretch forward. Hold stretch.','upload/exercise-picture/a1bb91259e95d163254658e3d2d1d6a2.jpg'),(918,'Plow Stretch','Lie on back and lift legs and hip overhead.','Allow knees to drop toward floor to sides of head. Hold stretch.','upload/exercise-picture/81ec4b57c0839751142053459f41f27c.jpg'),(919,'Barbell Seated Good-morning','Position barbell on back of shoulders and grasp bar to sides. Sit on end of bench or corner of box secured to floor. Position feet apart on floor with knees slightly bent.','Keeping back straight, bend torso forward as low as possible by bending hips. Raise torso until torso is upright. Repeat.','upload/exercise-picture/BBSeatedGoodMorning.gif'),(926,'Barbell Single Leg Stiff-leg Deadlift','Hold barbell down in front, arms straight with shoulder width or slightly wider overhand grip. Stand with feet together. Lift leg slightly so foot is just off floor.','Lower bar to floor while raising lifted leg back behind. Keep back straight and knee of supporting leg slightly bent. Keep hip and knee of lifted leg extended throughout movement. Once stretch is felt or barbell contacts floor, return to original position by raising torso while lowering lifted leg. Straighten knee of supporting leg as torso becomes upright. Repeat.','upload/exercise-picture/BBSingleLegStiffLegDeadlift_.gif'),(929,'Barbell Straight-back Stiff-leg Deadlift','Grasp barbell from rack or deadlift from floor with shoulder width or slightly wider overhand or mixed grip. Stand with shoulder width or narrower stance.','With back straight, lower bar to top of feet by bending hips. Bend knees slightly during descent and keep waist straight. Place weight onto floor. With knees still bent, lift bar by straightening hips until standing upright. Pull shoulders back if rounded. Extend knees at top if desired. Repeat.','upload/exercise-picture/BBStraightBackStiffLegDeadlift.gif'),(930,'Barbell Hip Thrust','Sit on floor with long side of bench behind back. Roll barbell back and center over hips. Position upper back on corner of bench. Place feet on floor approximately shoulder width with knees bent. Grasp bar to each side.','Raise bar upward by extending hips until straight. Lower and repeat.','upload/exercise-picture/BBHipThrust.gif'),(931,'Barbell Single Leg Split Squat','Stand facing away from bench. Position bar on back of shoulders and grasp barbell to sides. Extend leg back and place top of foot on bench.','Squat down by flexing knee and hip of front leg until knee of rear leg is almost in contact with floor. Return to original standing position by extending hip and knee of forward leg. Repeat. Continue with opposite leg.','upload/exercise-picture/BBSingleLegSplitSquat.gif'),(932,'Barbell Lunge','Clean bar from floor or dismount bar from rack. From rack with barbell upper chest height, position bar on back of shoulders and grasp barbell to sides.','Lunge forward with first leg. Land on heel, then forefoot. Lower body by flexing knee and hip of front leg until knee of rear leg is almost in contact with floor. Return to original standing position by forcibly extending hip and knee of forward leg. Repeat by alternating lunge with opposite leg.','upload/exercise-picture/BBLungeGlute.gif'),(933,'Barbell Rear Lunge','From rack with barbell upper chest height, position bar on back of shoulders and grasp barbell to sides. Dismount bar from rack.','Step back with one leg while bending supporting leg. Plant forefoot far back on floor. Lower body by flexing knee and hip of supporting leg until knee of rear leg is almost in contact with floor. Return to original standing position by extending hip and knee of forward supporting leg and return rear leg next to supporting leg. Repeat movement with opposite legs alternating between sides.','upload/exercise-picture/BBRearLunge.gif'),(934,'Barbell Single Leg Squat','Stand with arms extended out in front holding barbell. Balance on one leg with opposite leg extended straight leg forward as high as possible.','Squat down as far as possible while keeping leg elevated off of floor. Keep\n\n\nsupporting knee pointed same direction as foot supporting. Raise body back up to original position until knee and hip of supporting leg is straight. Return and repeat. Continue with opposite leg.','upload/exercise-picture/BBSingleLegSquat.gif'),(935,'Barbell Side Lunge','Clean bar from floor or dismount bar from rack. From rack with barbell upper chest height, position bar on back of shoulders and grasp barbell to sides.','Lunge to one side with first leg. Land on heel, then on forefoot. Lower body by flexing knee and hip of lead leg, keeping knee pointed same direction of foot. Return to original standing position by forcibly extending hip and knee of lead leg. Repeat by alternating lunge with opposite leg.','upload/exercise-picture/BBSideLunge.gif'),(936,'Barbell Squat (low bar)','From rack with barbell at upper chest height, position bar low on back of shoulders. Grasp barbell to sides. Dismount bar from rack and stand with wide stance.','Squat down by bending hips back while allowing knees to bend forward slightly, keeping back straight and knees pointed same direction as feet. Descend until thighs are just past parallel to floor. Extend hips and knees until legs are straight. Return and repeat.','upload/exercise-picture/BBSquatPowerlift.gif'),(937,'Barbell Walking Lunge','Position barbell on back of shoulders and grasp bar to sides.','Step forward with first leg. Land on heel, then forefoot. Lower body by flexing knee and hip of front leg until knee of rear leg is almost in contact with floor. Stand on forward leg with assistance of rear leg. Lunge forward with opposite leg. Repeat by alternating lunge with opposite legs.','upload/exercise-picture/BBWalkingLunge.gif'),(938,'Barbell Split Squat','Position barbell on back of shoulders and grasp barbell to sides. Stand with feet far apart; one foot forward and other foot behind.','Squat down by flexing knee and hip of front leg. Allow heel of rear foot to rise up while knee of rear leg bends slightly until it almost makes contact with floor. Return to original standing position by extending hip and knee of forward leg. Repeat. Continue with opposite leg.','upload/exercise-picture/BBSplitSquat.gif'),(939,'Safety Barbell Squat','Standing facing safety barbell on rack upper chest height. Position head in yoke with padded bar around shoulders. Hands can be placed on ends of yoke (as shown) or on safety bar out to sides. Dismount bar from rack and step back.','Squat down by bending hips back while allowing knees to bend slightly forward, keeping back straight and knees pointed same direction as feet. Descend until thighs are just past parallel to floor. Stand by extending hips and knees until legs are straight. Repeat.','upload/exercise-picture/SBSquatC.gif'),(940,'Barbell Full Squat','From rack with barbell upper chest height, position barbell on back of shoulders and grasp bar to sides. Dismount bar from rack.','Squat down by bending hips back while allowing knees to bend forward, keeping back straight and knees pointed same direction as feet. Descend until knees and hips are fully bent. Extend knees and hips until legs are straight. Return and repeat.','upload/exercise-picture/BBFullSquat.gif'),(941,'Safety Barbell Squat (long handles)','Standing facing safety barbell on rack upper chest height. Position head in yoke with padded bar around shoulders. Grasp ends of handles. Dismount bar from rack and step back.','Squat down by bending hips back while allowing knees to bend slightly forward, keeping back straight and knees pointed same direction as feet. Descend until thighs are just past parallel to floor. Stand with or without assistance of arms, extending knees and hips until legs are straight. Repeat.','upload/exercise-picture/SBSquatHandles.gif'),(942,'Barbell Hack Squat','Position barbell just behind legs. With feet flat on floor, squat down and grasp barbell from behind with overhand grip.','Lift bar by extending hips and knees to full extension. Squat down by bending knees forward while allowing hips to bend back behind, keeping back straight and knees pointed same direction as feet. Descend until thighs are close to parallel to floor and bar is behind lower leg. Repeat.','upload/exercise-picture/BBHackSquat.gif'),(943,'Barbell Box Squat','From rack with barbell at upper chest height, position bar on back of shoulders. Grasp barbell to sides. Dismount bar from rack and back up until contact is made with box immediately behind. Stand with wide stance with feet flared out slightly.','Sit back onto box by bending hips back while bending knees, keeping shins nearly perpendicular or knees slightly behind ankles. Lower rear end back onto box in controlled manner. Rock torso back slightly. Once torso rocks forward, immediately stand back up rapidly by driving hips upward, keeping knees above ankles and chest high until legs are straight. Return and repeat.','upload/exercise-picture/BBBoxSquat.gif'),(944,'Barbell Zercher Squat','From rack with barbell upper waist height position, forearms under bar and in front of bar with elbows shoulder width apart. Cross wrists and pull bar in, close against body. Lift barbell from rack. Step back with wide stance, feet pointing out 20-30°.','Squat down by bending hips back while allowing knees to bend forward, keeping back straight, hands close to body, and knees pointed same direction as feet. Descend until thighs are near parallel. Extend knees and hips until legs are straight. Return and repeat.','upload/exercise-picture/BBZercherSquat.gif'),(945,'Safety Barbell Squat (self-spotting)','Stand facing safety barbell on rack upper chest height. Place hands vertical rack supports. Position head in yoke with padded bar around shoulders. Dismount bar from rack and step back so body is upright at arms length from supports.','Squat down by bending hips back while allowing knees to bend forward slightly, keeping back straight and knees pointed same direction as feet. Descend until thighs are just past parallel to floor. Stand with or without assistance of arms, extending hips and knees until legs are straight. Repeat.','upload/exercise-picture/SBSquat.gif'),(946,'Trap Bar Squat','Stand on platform under loaded trap bar. Squat down until thighs are just past parallel to floor with knees pointed same direction as feet and feet flat on platform. Grasp handles to sides. Posture chest up with back arched tightly.','Lift weight upward by extending knees and hips until straight. Pull shoulders back at top of lift if rounded. Return weight to floor by bending hips back, while allowing knees to bend forward slightly, keeping back straight and knees pointed same direction as feet. Repeat.','upload/exercise-picture/TBSquat.gif'),(947,'Barbell Squat (with chains)','Stand facing barbell, racked upper chest height, with thick chains hanging to floor on each side. Position bar low on back of shoulders. Grasp barbell to sides and position elbows back. Dismount bar from rack and stand with wide stance.','Squat down by bending hips back while allowing knees to bend forward slightly, keeping back straight and knees pointed same direction as feet.\n\n\nDescend until thighs are just past parallel to floor. Extend hips and knees until legs are straight. Return and repeat.','upload/exercise-picture/BBSquatChains.gif'),(948,'Barbell Front Squat','From rack with barbell upper chest height, position bar in front of shoulders. Cross arms and place hands on top of barbell with upper arms parallel to floor. Dismount bar from rack.','Squat down by bending hips back while allowing knees to bend forward, keeping back straight and knees pointed same direction as feet. Descend until thighs are just past parallel. Extend knees and hips until legs are straight. Return and repeat.','upload/exercise-picture/BBFrontSquat.gif'),(949,'Barbell Lateral Step-up','Stand between two benches, one to each side. Position bar on back of shoulders and grasp barbell to sides.','Lift leg and place foot on bench to side and forward of straight knee. Stand on bench by straightening leg and pushing body upward. Step down returning feet to original position. Repeat with opposite leg, alternating between legs.','upload/exercise-picture/BBLateralStepUp.gif'),(950,'Cable Rear Lunge','Stand between two very low pulleys with shoulder width or narrower stance. Squat down and grasp stirrup attachments to each side. Stand upright with arms straight down to sides.','Step back with one leg while bending supporting leg. Plant forefoot far back on floor. Lower body by flexing knee and hip of supporting leg until knee of rear leg is almost in contact with floor. Return to original standing position by extending hip and knee of forward supporting leg and return rear leg next to supporting leg. Repeat movement with opposite legs alternating between sides.','upload/exercise-picture/CBRearLunge.gif'),(952,'Barbell Step-up','Stand facing side of bench. Position bar on back of shoulders and grasp barbell to sides.','Place foot of first leg on bench. Stand on bench by extending hip and knee of first leg and place foot of second leg on bench. Step down with second leg by flexing hip and knee of first leg. Return to original standing position by placing foot of first leg to floor. Repeat first step with opposite leg alternating first steps between legs.','upload/exercise-picture/BBStepUp.gif'),(954,'Trap Bar Straight-back Stiff-leg Deadlift','Stand with feet shoulder width or narrower in trap bar, weight to each side. Squat down with feet flat and grasp handles to sides. Deadlift from floor.','With back straight, lower bar toward floor by bending at hips. Bend knees slightly during descent and keep waist straight. Place weight onto floor. With knees still bent, lift bar by extending at hips until standing upright. Pull shoulders back if rounded. Extend knees at top if desired. Repeat.','upload/exercise-picture/TBStraightBackStiffLegDeadlift.gif'),(955,'Cable One Arm Single Leg Split Squat','Stand between bench and low pulley cable. Grasp cable stirrup with one hand. Facing low pulley, extend leg back and place top of foot or forefoot on bench. Place other hand on hip or support to side.','Squat down by flexing knee and hip of front leg until knee of rear leg is almost in contact with floor. Return to original standing position by extending hip and knee of forward leg. Repeat. Continue with opposite leg.','upload/exercise-picture/CBSingleLegSplitSquatOneArm.gif'),(956,'Cable Split Squat (belt)','Facing low pulley, kneel to attach cable belt or dip belt around waist. Place hand(s) on ballet bar or machine (not on guide rod!) for balance. Stand away from pulley with one leg forward and opposite leg to rear.','Squat down by flexing knee and hip of front leg. Allow heel of rear foot to rise up while knee of rear leg bends slightly until it almost makes contact with floor. Return to original straddle position by extending hip and knee of forward leg. Repeat. Continue with legs in opposite position.','upload/exercise-picture/CBLungeFar.gif'),(957,'Cable Rear Step-down Lunge','Stand on upper platform with stirrups grasped to sides.','Extend one leg back on forefoot. Lower body on other leg by flexing knee and hip of front leg until knee of rear leg is almost in contact with lower platform. Return to original standing position by extending hip and knee of forward leg. Repeat by alternating rear lunge with opposite leg.','upload/exercise-picture/CBRearLunge.gif'),(958,'Cable Single Leg Split Squat','Facing away from bench, stand between two very low pulleys with shoulder width or narrower stance. Squat down and grasp stirrup attachments to each side. Stand upright with arms straight down to sides. Extend leg back and place top of foot on bench.','Squat down by flexing knee and hip of front leg until knee of rear leg is almost in contact with floor. Return to original standing position by extending hip and knee of forward leg. Repeat. Continue with opposite leg.','upload/exercise-picture/CBSingleLegSplitSquat.gif'),(959,'Cable Bar Squat','Adjust cable pulleys to medium low positions. Kneel under attached cable bar while supporting it with both hands. Position body in lower squat position with cable bar on top of shoulders, both feet flat on floor with mid feet in line with both pulleys, knees positioned same direction as feet, back straight and angled forward, and hands grasping bar to each side.','Stand up by extending hips and knees until legs are straight. Squat back down by bending hips back while allowing knees to bend slightly forward, keeping back straight and knees pointed same direction as feet. Descend until thighs are just past parallel to floor. Return and repeat.','upload/exercise-picture/CBBarSquat.gif'),(960,'Cable One Arm Split Squat','Face low pulley and grasp stirrup attachment with one hand. Stand away from pulley with one leg forward and opposite leg to rear. Place other hand on hip or on support to side.','Squat down by flexing knee and hip of front leg. Allow heel of rear foot to rise up while knee of rear leg bends slightly until it almost makes contact with floor. Return to original straddle position by extending hip and knee of forward leg. Repeat. Continue with legs in opposite position.','upload/exercise-picture/CBLungeOneArm.gif'),(961,'Cable Standing Hip Extension','Attach ankle cuff to low pulley. With cuff on one ankle, grasp ballet bar with both hands and step back with other foot. Elbows remain straight. Attached leg is straight and foot is slightly off floor.','Pull cable attachment back by extending hip. Return leg to original position. Repeat. Continue with opposite leg.','upload/exercise-picture/CBStandingHipExtentionFM.gif'),(962,'Cable Squat','Stand with feet shoulder width or slightly wider on platform between very low and close pulley cables. Squat down with knees slightly beyond foot and shoulder above feet. Grasp stirrups to each side with arms straight.','Keeping chest high and back straight, raise stirrups by extending knees and hips until legs are straight. Squat down by bending hips back while allowing knees to bend forward slightly, keeping back straight and knees pointed same direction as feet. Squat down until thighs are just past parallel to floor. Return and repeat.','upload/exercise-picture/CBSquat.gif'),(963,'Cable Split Squat','Stand between two very low cable pulleys. Grasp stirrup attachments with each hand. Place one leg far forward and opposite leg far back to rear.','Squat down by flexing knee and hip of front leg. Allow heel of rear foot to rise up while knee of rear leg bends slightly until it almost makes contact with floor. Return to original straddle position by extending hip and knee of forward leg. Repeat. Continue with legs in opposite position.','upload/exercise-picture/CBLungeGlute.gif'),(965,'Cable Belt Squat','Place pin on lightest weight. Place belt around waist. Pull cable from pulley and attach to front of belt. Step onto platform and grasp pole. Squat or sit on platform and select desired weight. Stand with feet shoulder width or wider to each side of cable. Place both hands on pole at waist height.','Squat down by bending hips back while allowing knees to bend forward slightly, keeping back straight and knees pointed same direction as feet.\n\n\nDescend until thighs are just past parallel to floor. Squat up by extending knees and hips until legs are straight. Return and repeat.','upload/exercise-picture/CBSquatBeltGlute.gif'),(966,'Cable Bent-over Hip Extension','Attach ankle cuff to low pulley. With cuff on one ankle, grasp ballet bar with both hands and step far back with other foot. Elbows remain straight to support body leaning forward. Attached leg is straight and foot is stretched off floor.','Pull cable attachment back by extending hip. Return leg to original position. Repeat. Continue with opposite leg.','upload/exercise-picture/CBStandingHipExtension.gif'),(967,'Cable Straight-back Stiff-leg Deadlift','Stand between two very low pulleys with shoulder width or narrower stance. Squat down and grasp stirrup attachments to each side. Stand upright with arms straight down to sides.','With back straight, bow forward by bending hips and bend knees slightly during descent. Raise torso by extending hips while gradually extending knees until standing upright. Pull shoulders back slightly if rounded. Repeat.','upload/exercise-picture/CBStraightBackStifLegDeadlift.gif'),(968,'Cable Step-up','Stand behind elevated platform and low and close pulley cables to sides. Grasp stirrups at each side of platform. Stand upright with arms straight down at sides.','Place foot of first leg on elevated platform. Stand on elevated platform by extending hip and knee of first leg and place foot of second leg on bench. Step down with second leg by flexing hip and knee of first leg. Return to original standing position by placing foot of first leg to lower position. Repeat first step with opposite leg alternating first steps between legs.','upload/exercise-picture/CBStepUp.gif'),(969,'Dumbbell Squat','Stand with dumbbells grasped to sides.','Squat down by bending hips back while allowing knees to bend forward slightly, keeping back straight and knees pointed same direction as feet.\n\n\nDescend until thighs are just past parallel to floor. Extend knees and hips until legs are straight. Return and repeat.','upload/exercise-picture/DBSquat.gif'),(970,'Dumbell Single Leg Stiff-leg Deadlift','Hold dumbbell in each hand. Position dumbbells down in front of upper thighs with arms straight. Stand with feet together. Lift leg slightly so foot is just off floor.','Lower dumbells to floor while raising lifted leg back behind. Keep back straight and knee of supporting leg slightly bend. Keep hip and knee of lifted leg extended throughout movement. Once stretch is felt or dumbells contacts floor, return to original position by raising torso while lowering lifted leg. Straighten knee of supporting leg as torso becomes upright. Repeat.','upload/exercise-picture/DBSingleLegStiffLegDeadlift.gif'),(971,'Dumbbell Single Leg Split Squat','Stand with dumbbells grasped to sides facing away from bench. Extend leg back and place top of foot on bench.','Squat down by flexing knee and hip of front leg until knee of rear leg is almost in contact with floor. Return to original standing position by extending hip and knee of forward leg. Repeat. Continue with opposite leg.','upload/exercise-picture/DBSingleLegSplitSquat.gif'),(972,'Dumbbell Rear Lunge','Stand with dumbbells grasped to sides.','Step back with one leg while bending supporting leg. Plant forefoot far back on floor. Lower body by flexing knee and hip of supporting leg until knee of rear leg is almost in contact with floor. Return to original standing position by extending hip and knee of forward supporting leg and return rear leg next to supporting leg. Repeat movement with opposite legs alternating between sides.','upload/exercise-picture/DBRearLunge.gif'),(973,'Dumbbell Lunge','Stand with dumbbells grasped to sides.','Lunge forward with first leg. Land on heel then forefoot. Lower body by flexing knee and hip of front leg until knee of rear leg is almost in contact with floor. Return to original standing position by forcibly extending hip and knee of forward leg. Repeat by alternating lunge with opposite leg.','upload/exercise-picture/DBLungeGlute.gif'),(974,'Dumbbell Side Lunge','Stand with dumbbells grasped to sides.','Lunge to one side with first leg. Position closest dumbbell behind thigh and opposite dumbbell to front. Land on heel then forefoot. Lower body by flexing knee and hip of lead leg, keeping knee pointed same direction of foot. Return to original standing position by forcibly extending hip and knee of lead leg. Repeat by alternating lunge with opposite leg.','upload/exercise-picture/DBSideLunge.gif'),(975,'Dumbbell Split Squat','Stand with dumbbells grasped to sides. Stand with feet far apart; one foot forward and other foot behind.','Squat down by flexing knee and hip of front leg. Allow heel of rear foot to rise up while knee of rear leg bends slightly until it almost makes contact with floor. Return to original standing position by extending hip and knee of forward leg. Repeat. Continue with opposite leg.','upload/exercise-picture/DBSplitSquat.gif'),(976,'Dumbbell Front Squat','Stand with dumbbells grasped to sides. Clean dumbbells up to shoulders so side of each dumbbell rests on top of each shoulder. Balance dumbbells on shoulder by holding on to dumbbells with elbows flaring outward. Position feet shoulder width or slightly narrower apart.','Squat down by bending hips back while allowing knees to bend forward slightly, keeping back straight and knees pointed same direction as feet. Descend until thighs are just past parallel to floor. Extend knees and hips until legs are straight. Return and repeat.','upload/exercise-picture/DBFrontSquat.gif'),(977,'Dumbbell Walking Lunge','Stand with dumbbells grasped to sides.','Step forward with first leg. Land on heel then forefoot. Lower body by flexing knee and hip of front leg until knee of rear leg is almost in contact with floor. Stand on forward leg with assistance of rear leg. Lunge forward with opposite leg. Repeat by alternating lunge with opposite legs.','upload/exercise-picture/DBWalkingLunge.gif'),(978,'Dumbbell Single Leg Squat','Stand with dumbbells grasped to sides. Balance on one leg with opposite leg extended straight leg forward as high as possible.','Squat down as far as possible while keeping leg elevated off of floor. Keep\n\n\nsupporting knee pointed same direction as foot supporting. Raise body back up to original position until knee and hip of supporting leg is straight. Return and repeat. Continue with opposite leg.','upload/exercise-picture/DBSingleLegSquat.gif'),(979,'Lever Bent-over Rear Kick (plate loaded)','Lean over wide padded area, place forearms on padded arm rest, and grip handles. Bend knee and position foot against lever platform.','Push platform back by extending leg back. Return leg to original position. Repeat. Continue with opposite leg.','upload/exercise-picture/LVBentOverRearKickPL.gif'),(981,'Dumbbell Lateral Step-up','Stand between two benches, one to each side. Hold dumbbells in each hand down to sides','Lift leg and place foot on bench to side and forward of straight knee. Stand on bench by straightening leg and pushing body upward. Step down returning feet to original position. Repeat with opposite leg alternating between legs.','upload/exercise-picture/DBLateralStepUp.gif'),(982,'Dumbbell Step Down','Hold dumbbells in each hand down to sides and stand with one foot on bench. Position foot on bench to side, forward of straight knee.','Stand on bench by straightening leg and pushing body upward. Step down returning foot off of bench to floor and repeat. Continue with opposite position.','upload/exercise-picture/DBStepDown.gif'),(984,'Dumbbell Step-up','Stand with dumbbells grasped to sides facing side of bench.','Place foot of first leg on bench. Stand on bench by extending hip and knee of first leg and place foot of second leg on bench. Step down with second leg by flexing hip and knee of first leg. Return to original standing position by placing foot of first leg to floor. Repeat first step with opposite leg, alternating first steps between legs.','upload/exercise-picture/DBStepUp.gif'),(985,'Lever Hack Press (plate loaded)','Sit on seat with back of hips against back pad. Place feet on platform shoulder width or slightly wider. Extend hips and knees. Disengage dock lever if it does not automatically disengage.','Lower seat by flex hips and knees until either is near complete flexion. Raise seat by extending knees and hips. Repeat.','upload/exercise-picture/LVHackPressWide.gif'),(986,'Lever 45° Leg Press (plate loaded)','Sit on machine with back on padded support. Place feet slightly high on platform. Extend hips and knees. Release dock lever and grasp handles to sides.','Flex hips and knees to lower lever until hips are completely flexed. Push platform by extending knees and hips. Repeat.','upload/exercise-picture/LV45DegLegPressWide.gif'),(987,'Lever Straight-back Stiff-leg Deadlift (plate loaded)','Stand between lever handles with shoulder width or narrower stance. Squat down and grasp handles to each side. Stand upright with arms straight down to sides.','With back straight, bow forward by bending hips and bend knees slightly during descent. Raise torso by extending hips while gradually extending knees until standing upright. Pull shoulders back slightly if rounded. Repeat.','upload/exercise-picture/LVStraightBackStiffLegDeadlift.gif'),(988,'Lever Single Leg 45° Leg Press','Sit on machine with back on padded support. Place one foot mid height to high up on platform. Place outside of resting foot on lower surface with knee positioned out for greater clearance. Push platform up by extending hip and knee. Release dock lever and grasp handles to sides.','Lower platform by bending leg until knee is just short of complete flexion. Return by extending knee and hip. Repeat. Continue with opposite leg.','upload/exercise-picture/LVSingleLeg45DegLegPressGluteL.gif'),(989,'Lever Single Leg Lying Leg Press (custom - plate loaded)','Lie supine on padded platform. Place hands on bars above head or to sides. Place one foot on platform and other foot on floor below platform.','Push platform away by extending hip and knee. Return by bending leg until knee or hip is just short of complete flexion. Repeat. Continue with opposite leg.','upload/exercise-picture/LVSingleLegLyingLegPress.gif'),(990,'Lever Lying Leg Press (plate loaded)','Climb up steps to top of machine. Lie supine on horizontal padded platform with shoulders against pad. Place feet equally spaced and slightly high on platform. Grip handles above shoulder pads.','Push lever platform away by extending hips and knees until knees are straight. Return lever platform by flexing hips and knees until knees are just short of complete flexion or until hips are completely flexed. Repeat.','upload/exercise-picture/LVLyingLegPressH.gif'),(991,'Lever Alternating Seated Leg Press (plate loaded)','Sit on machine with back on padded support. Place feet on slightly high on platform. Grasp handles to sides.','Push one platform away by extending knee and hip. Return to original position. Repeat with opposite leg. Continue by alternating between sides.','upload/exercise-picture/LVAlternatingLegPress.gif'),(992,'Lever Single Leg Seated Leg Press (plate loaded)','Sit on machine with back on padded support. Place one foot slightly high on platform and other foot near floor below platform or off to side.','Push platform away by extending hip and knee. Return by bending leg until knee or hip is just short of complete flexion. Repeat. Continue with opposite leg.','upload/exercise-picture/LVSingleLegSeatedLegPress2.gif'),(993,'Lever Seated Leg Press (plate loaded)','Sit on machine with back on padded support. Place feet slightly high on platform. Grasp handles to sides.','Push platform(s) away by extending knees and hips until knees are fully extended. Return until hips are completely flexed. Repeat.','upload/exercise-picture/LVSeatedLegPresWideH.gif'),(994,'Lever Lying Hip Extension (plate loaded)','Lie on bench with knees legs over pads. Align hip joints with lever fulcrum. Strap hips down with belt. Grasp handles at each side.','Extend hips and knees until legs are straight. Return to original position by flexing hips and knees. Repeat.','upload/exercise-picture/LVLyingHipExtentionH.gif'),(995,'Lever Power Runner (plate loaded)','Place forefeet into pedals. Squat down and position shoulders forward in padded yoke. Grasp handles to sides. Push one pedal back by extending knee and hip so one leg is straight while the other remains forward.','Push forward pedal back by extending leg while allowing other pedal to come forward by bending opposite leg. Continue pedalling by alternating between sides.','upload/exercise-picture/LVPowerRunnerPL.gif'),(996,'Lever Lying Leg Press (custom - plate loaded)','Lie supine on padded platform. Place hands on bars above head or to sides. Place feet flat on lever platform with hips and knees bent.','Push lever platform by extending hips and knees until knees are straight. Lower lever platform by flexing hips and knees until knees are just short of complete flexion. Repeat.','upload/exercise-picture/LVLyingLegPress.gif'),(997,'Lever Barbell Rear Lunge (plate loaded)','With bar upper chest height, position bar on back of shoulders and grasp bar to sides. Place feet under bar or slightly forward. Straighten legs so weight is lifted. Disengage bar by rotating bar back. Place feet slightly forward.','Step back with one leg while bending supporting leg. Plant forefoot far back on floor. Lower body by flexing knee and hip of supporting leg until knee of rear leg is almost in contact with floor. Return to original standing position by extending hip and knee of forward supporting leg and return rear leg next to supporting leg. Repeat movement with opposite legs alternating between sides.','upload/exercise-picture/LVSMReverseLunge.gif'),(998,'Lever Rear Lunge (plate loaded)','Stand between lever handles to sides. Squat down with feet flat on floor and grasp lower handles to sides. Lift lever by extending hips and knees to full extension. Position both feet slightly forward.','Step back with one leg while bending supporting leg. Plant forefoot far back on floor. Lower body by flexing knee and hip of supporting leg\n\n\nuntil knee of rear leg is almost in contact with floor. Return to original standing position by extending hip and knee of forward supporting leg and return rear leg next to supporting leg. Repeat movement with opposite legs alternating between sides.','upload/exercise-picture/LVRearLunge.gif'),(999,'Lever Single Leg Split Squat (plate loaded)','Stand between lever handles to sides. Extend leg back and place top of foot on cross bar. Squat down and grasp handles to sides.','With chest high, lift lever by extending hips and knees to full extension. Return until knee of rear leg is almost in contact with floor. Repeat. Continue with opposite leg.','upload/exercise-picture/LVSingleLegSplitSquat.gif'),(1000,'Lever Barbell Split Squat (plate loaded)','With bar upper chest height, position bar on back of shoulders and grasp bar to sides. Place one foot forward and forefoot of other leg further back. Disengage bar by rotating bar back.','Lower body on other leg by flexing knees and hips of of both legs until knee of rear leg is almost in contact with floor. Return to original straddled position by extending hips and knees of both legs. Repeat. Continue with opposite leg.','upload/exercise-picture/LVSMSingleLegSplitSquat.gif'),(1001,'Lever Split Squat (plate loaded)','Stand between lever handles to sides. Place forefoot of one foot on floor to rear and other foot slightly forward. Squat down and grasp handles to sides.','With chest high, lift lever by extending hips and knees to full extension. Return until knee of rear leg is almost in contact with floor and repeat. Continue with opposite leg.','upload/exercise-picture/LVSplitSquat.gif'),(1002,'Lever Barbell Single Leg Split Squat (plate loaded)','Place bench behind smith bar. With bar upper chest height, position bar on back of shoulders and grasp bar to sides. Place foot slightly forward under bar. Extend other leg back and place top of foot on bench. Disengage bar by rotating bar back.','Lower body by flexing knee and hip of front leg until knee of rear leg is almost in contact with floor. Return to original standing position by extending hip and knee of forward leg. Repeat. Continue with opposite leg.','upload/exercise-picture/LVSMReverseLunge.gif'),(1003,'Lever Reverse Hyper-extension (plate loaded)','Place one leg in strap so it is positioned above ankle. Step up onto step built on side of apparatus with other foot. Lay torso and waist on bench and grasp handles. Place stepping foot inside of strap, just in front of leg already in strap. Position legs side by side. Feet should be above floor with legs hanging straight down.','Raise lever by extending hips as high as possible with legs nearly straight. Lower legs to original position. Repeat.','upload/exercise-picture/LVReverseHyperExtension.gif'),(1004,'Lever Squat (plate loaded)','Squat down to place shoulders under padded lever. Place feet shoulder width or marginally wider apart, slightly in front of shoulders. Extend knees and hips until legs are straight. Release support lever.','Squat down by bending hips back while allowing knees to bend forward slightly, keeping back straight and knees pointed same direction as feet. Descend by bending knees and hip until thighs are just past parallel to floor. Lift lever up by extending knees and hips until legs are straight. Repeat.','upload/exercise-picture/LVSquatGlutePL2.gif'),(1005,'Lever Single Leg Squat (plate loaded)','Stand between handles facing away from fulcrum. Grasp both handles to sides and stand upright. Cross lower leg above knee of supporting leg.','Bend knee forward slightly while allowing hips to bend back behind, keeping back straight and knee pointed same direction of foot. Squat down as low as possible. Extend knee and hip until leg is straight. Return and repeat. Continue with opposite leg.','upload/exercise-picture/LVSingleLegSquat.gif'),(1007,'Lever Sliding Split Squat (plate loaded)','Stand with one foot on stationary platform under foot pad and other foot back on sliding platform. Squat down and grasp handles to sides. Stand upright with arms straight to sides.','Lower lever downward by sliding platform back and squatting down on forward leg. Keep chest high as hips descend to knee height. Lift sliding forward and extending hips and knee to full extension. Repeat and continue with opposite leg.','upload/exercise-picture/LVSlidingSplitSquatPL.gif'),(1008,'Lever Barbell Squat (plate loaded)','With bar upper chest height, position bar on back of shoulders and grasp bar to sides. Place feet slightly forward. Disengage bar by rotating bar back.','Squat down by bending hips back while allowing knees to bend forward slightly, keeping back straight and knees pointed same direction as feet.\n\n\nDescend until thighs are just past parallel to floor. Extend knees and hips until legs are straight. Return and repeat.','upload/exercise-picture/LVSMSplitSquat.gif'),(1009,'Lever Bent-over Hip Extension','Step up onto platform. Position belly on wide pad, forearms on padded arm rest, and grip handles. Position bottom of foot on foot lever with lower leg under pad.','Push foot lever back by extending hip. Return leg to original position. Repeat. Reposition and continue with opposite leg.','upload/exercise-picture/LVBentOverHipExtention.gif'),(1010,'Lever Hack Squat (plate loaded)','Position shoulders under shoulder pad and back on back pad. Place feet slightly high on platform. Extend hips and knees and release dock lever if available.','Lower lever by bending hips and knees, until knees are just short of complete flexion. Raise sled by extending knees and hips. Repeat.','upload/exercise-picture/LVHackSquatGlute.gif'),(1011,'Lever Kneeling Hip Extension','Kneel on lowest (shin) pad with roller pad behind lower thighs. Position midsection on middle pad. Place forearms on padded arm rest and grip handles.','Keeping one leg on shin pad, extend hip of other leg and push roller pad back. Raise roller pad up until hip is completely extended. Return leg to original position and repeat. Continue with opposite leg.','upload/exercise-picture/LVKneelingHipExtensionRoller.gif'),(1012,'Lever Full Squat (plate loaded)','Squat down to place shoulders under padded lever. Place feet shoulder width apart slightly in front of shoulders. Extend knees and hips until legs are straight. Release support lever.','Squat down by bending hips back while allowing knees to bend forward slightly, keeping back straight and knees pointed same direction as feet. Descend until knees and hips are fully bent. Lift lever up by extending knees and hips until legs are straight. Repeat.','upload/exercise-picture/LVFullSquat.gif'),(1013,'Lever Front Squat','Step onto platform facing padded levers. Squat down to place shoulders under padded lever. Place feet shoulder width apart on platform. Extend knees and hips until legs are straight. Release support lever if it does not disengage by itself.','Lower lever by bending hips back while allowing knees to bend forward slightly, keeping back straight and knees pointed same direction as feet. Descend until thighs are just past parallel to floor. Lift lever up by extending knees and hips until legs are straight. Repeat.','upload/exercise-picture/LVFrontSquat.gif'),(1014,'Lever Standing Hip Extension','Stand on platform facing to one side and grasp bar for support. Place leg nearest machine on padded roller while standing on other leg.','Lower lever by extending hip. Return until knee is higher than hip. Repeat. Continue with opposite leg.','upload/exercise-picture/LVStandingHipExtension.gif'),(1015,'Lever Lying Hip Extension','With leg lever positioned in the lower position, lie supine on machine with legs over padded bar. Align hip joints with lever fulcrum. Strap hips down with belt if available. Release leg lever and adjust until leg lever is in upper position. Grasp handles to sides of head.','Push padded leg bar down until hips are extended. Return and repeat.','upload/exercise-picture/LVLyingHipExtension.gif'),(1016,'Lever Alternating Lying Hip Extension','Lie on bench with knees legs over pads. Align hip joints with lever fulcrum. Strap hips down with belt. Extend both hips with feet toward floor.','Raise one knee by flexing hip. Return to original position by extending hip. Repeat with opposite leg, alternating between sides.','upload/exercise-picture/LVLyingHipExtensionN.gif'),(1017,'Lever V-Squat (plate loaded)','Position shoulders under shoulder pads with back against back pad. Place feet on platform, shoulder or hip width apart. Extend hips and knees and release lever if available.','Bend knees forward slightly while allowing hips to bend back behind, keeping back straight and knees pointed same direction as feet. Descend until hips are just short of complete flexion. Raise sled by extending knees and hips. Repeat.','upload/exercise-picture/LVVSquatGluteH.gif'),(1018,'Lever Alternating Kneeling Hip Extension','Kneel on lowest (shin) pad with roller pad behind lower thighs. Position midsection on middle pad. Place forearms on padded arm rest and grip handles.','Keeping one leg on shin pad, extending hip of other leg and push roller pad back. Raise roller pad up until hip is completely extended. Return leg to original position. Repeat with opposite leg. Continue alternating between each side.','upload/exercise-picture/LVAlternatingKneelingHipExtRoller.gif'),(1019,'Lever Standing Hip Extension (with abdominal pad)','Stand on platform so front of hips are against edge of abdominal pad. Position flexed leg over padded roller while standing on other leg. Grasp handles with both hands.','Extend lever back by extending hip and straightening leg. Return by flexing hip and knee. Repeat. Continue with opposite leg.','upload/exercise-picture/LVStandingHipExtension2.gif'),(1020,'Lever Kneeling Rear Kick','Kneel on machine by placing one knee on lower pad. Rest torso on middle pad, place forearms on padded arm rest, and grip handles. Position other foot of other leg up to lever platform.','Push platform back by extending leg back. Return leg to original position and repeat. Continue with opposite leg.','upload/exercise-picture/LVKneelingHipExtension.gif'),(1021,'Lever Single Leg Seated Leg Press','Sit on machine with back on padded support. Place one foot slightly high on platform and other foot on floor below platform.','Push platform away by extending hip and knee. Return by bending leg until knee or hip is just short of complete flexion. Repeat. Continue with opposite leg.','upload/exercise-picture/LVSingleLegPress.gif'),(1022,'Lever Seated Leg Press','Sit on machine with back on padded support. Place feet slightly high on platform. Grasp handles to sides.','Extend knees and hips until knees are fully extended. Return until hips are completely flexed. Repeat.','upload/exercise-picture/LVSeatedLegPressGlute.gif'),(1023,'Lever Squat','Squat down to place shoulders under padded lever. Place feet shoulder width apart slightly in front of shoulders.','Raise lever up by extending knees and hips until legs are straight. Squat down by bending hips back while allowing knees to bend forward slightly, keeping back straight and knees pointed same direction as feet. Descend until thighs are just past parallel to floor. Return and repeat.','upload/exercise-picture/LVSquatGlute.gif'),(1024,'Lever Standing Rear Kick','Step on left platform with left foot. Grasp handle bars to each side. Place right foot on highest lever platform.','Push platform down by extending leg until straight. Return leg to original position. Repeat. Continue with opposite leg positions.','upload/exercise-picture/LVStandingSingleLegPress.gif'),(1025,'Lever Bent-over Rear Kick','Lean over padded surface and grasp handles. Bend knee and position foot against lever platform or pedal.','Push platform or pedal back by extending leg. Return leg to original position. Repeat. Continue with opposite leg.','upload/exercise-picture/LVBentOverRearKick.gif'),(1026,'Lever Alternating Seated Leg Press','Lie on machine with shoulder under pads. Place feet slightly high on individual lever platforms. Grasp handles to sides. Push both lever platforms away by extending knees and hips so knees are straight.','Lower one lever platform toward body by bending knee and hip until weight taps or nearly taps unused portion of weight stack. Push lever platform away by extending knee and hip. Repeat with opposite leg. Continue by alternating between sides.','upload/exercise-picture/LVAlternatingLyingLegPressN.gif'),(1027,'Lever V-Squat','Position shoulders under shoulder pads with back against back pad. Place feet on platform, shoulder or hip width apart. Squeeze hand lever. Keeping hand lever squeezed, squat down by bending hips and knees until knees or hips are just short of complete flexion. Release hand lever and raise up on sled just slightly until weight stack is engaged (click is heard).','Raise lever by extending knees and hips until legs are straight. Squat down with knees pointed same direction as feet. Descend until knees or hips are near complete flexion. Repeat.','upload/exercise-picture/LVVSquatGluteFM.gif'),(1028,'Lever Split V-Squat','Position shoulders under shoulder pads with back against back pad. Place feet on platform, shoulder or hip width apart, slightly forward. Squeeze hand lever. Keeping hand lever squeezed, squat down by bending hips and knees until knees or hips are just short of complete flexion. Release hand lever and raise up on sled just slightly until weight stack is engaged (click is heard). Raise sled by extending knees and hips until legs are straight. Place one leg back behind platform with toes pointed downward over floor.','Squat down with knee pointed same direction as foot. Allow leg to bend behind with forefoot on floor. Descend until forward hip is near complete flexion. Raise sled by extending knee and hip until leg is straight. Repeat. Continue with other leg.','upload/exercise-picture/LVSingleLegVSquatGlute.gif'),(1029,'Sled Single Leg 45° Leg Press','Sit on machine with back on padded support. Place one foot high up on platform and other foot on floor below platform. Extend hip and knee. Release dock lever and grasp handles to sides.','Lower sled by bending leg until knee is just short of complete flexion. Return by extending knee and hip. Repeat. Continue with opposite leg.','upload/exercise-picture/SLSingleLeg45DegreeLegPress.gif'),(1030,'Lever Single Leg Split V-Squat','Position shoulders under shoulder pads with back against back pad. Place one foot forward on platform. Place other foot against rear vertical platform. Squeeze hand lever. Keeping hand lever squeezed, squat down by bending hips and knees until hip or knee is short of complete flexion. Release hand lever and raise up on sled just slightly until weight stack is engaged (click is heard).','Raise lever by extending knees and hips. Lower lever by flexing hips and knees until knee of rear leg is almost in contact with floor. Repeat. Continue with opposite leg positions.','upload/exercise-picture/LVSingleLegSplitVSquatGlute.gif'),(1031,'Sled 45° Leg Press','Sit on machine with back on padded support. Place feet slightly high on platform. Extend hips and knees. Release dock lever and grasp handles to sides.','Lower sled by flexing hips and knees until knees are just short of complete flexion or until hips are completely flexed. Return by extending knees and hips. Repeat.','upload/exercise-picture/SL45DegLegPressWide.gif'),(1032,'Lever Alternating Single Leg Split V-Squat','Position shoulders under shoulder pads with back against back pad. Place feet slightly forward on platform. Squeeze hand lever. Keeping hand lever squeezed, squat down by bending hips and knees until hip or knee is short of complete flexion. Release hand lever and raise up on sled just slightly until weight stack is engaged (click is heard). Raise lever by extending knees and hips.','Transfer right foot back to inside of rear vertical platform. Lower lever by flexing hips and knees until knee of rear leg is almost in contact with floor. Raise lever by extending knees and hips until knee is straight. Return right foot to original position by other foot. Repeat with opposite leg movement and continue alternating between sides.','upload/exercise-picture/LVAlternatingSingleLegSplitVSquat.gif'),(1033,'Sled Alternating 45° Leg Press','Sit on machine with back on padded support. Place feet slightly high on individual platforms. Grasp handles to sides. Push both platforms away by extending knees and hips so knees are straight. Release dock lever and grasp handles to sides.','Lower one platform toward body by bending knee and hip until knees are just short of complete flexion or until hips are completely flexed. Push platform away by extending knee and hip. Repeat with opposite leg. Continue by alternating between sides.','upload/exercise-picture/SLAlternating45LegPressGlute.gif'),(1034,'Sled Hack Press','Sit on sled with back of hips against back pad. Place feet on platform shoulder width or slightly wider. Extend hips and knees. Release dock lever(s).','Lower sled by flexing hips and knees until either is near complete flexion. Raise sled by extending knees and hips. Repeat.','upload/exercise-picture/SLSeatedHackPress.gif'),(1035,'Sled Lying Leg Press (plate loaded)','Lie supine on platform with shoulders against pad. Place feet slightly high on platform. Extend hips and knees. Release dock lever and grasp handles to sides.','Bring sled toward platform by flexing hips and knees until knees are just short of complete flexion or until hips are completely flexed. Return by extending knees and hips. Repeat.','upload/exercise-picture/SLLyingLegPressPLGlute.gif'),(1036,'Sled Single Leg Lying Leg Press (plate loaded)','Lie supine on platform with shoulders against pad. Place feet slightly high on platform. Prop one leg up, on support if available. Extend hip and knee of leg positioned on platform. Release dock lever and grasp handles to sides if available.','Bring sled toward platform by flexing hip and knee of supporting leg until knee is just short of complete flexion or until hip is completely flexed. Return by extending knee and hip. Repeat. Continue with opposite leg.','upload/exercise-picture/SLLyingSingleLegPressPL.gif'),(1037,'Sled Lying Leg Press','Lie supine on platform with shoulders against pad. Place feet slightly high on platform.','Extend hips and knees. Return until hips are completely flexed. Repeat.','upload/exercise-picture/SLLyingLegPressGlute.gif'),(1038,'Sled Single Leg Lying Leg Press','Lie supine on platform with shoulders against pad. Place\nfoot slightly high on platform. Position other leg with lower\nleg parallel to platform.','Push platform by extending knee and hip until knee is straight.\nReturn by bending hip and knee of supporting leg until knee is\njust short of complete flexion or until hip is completely flexed.\nRepeat. Continue with opposite leg.','upload/exercise-picture/SLSingleLegLyingLegPressGlute.gif'),(1039,'Sled Standing Rear Kick','Straddle sled and place foot on pedal. Place chest on pad and grasp handles.','Push platform back by extending leg\n\n\nback until straight. Return leg to original position. Repeat. Continue with opposite leg.','upload/exercise-picture/SLStandingHipExtension.gif'),(1040,'Sled Seated Leg Press','Sit on machine with back on padded support. Place feet slightly high on platform. Grasp handles to sides.','Extend knees and hips until knees are fully extended. Return until hips are completely flexed. Repeat.','upload/exercise-picture/SLSeatedLegPress.gif'),(1041,'Sled Vertical Leg Press','Lie on declined back pad with hips under weighted sled. Place feet on platform. Raise weight by extending hips and knees. Release dock levers and grasp handles to sides.','Lower sled by flexing hips and knees until knees are just short of complete flexion or just before hips raise up from pad. Return by extending knees and hips. Repeat.','upload/exercise-picture/SLVerticalLegPress.gif'),(1042,'Sled Single Leg Vertical Leg Press','Lie on declined back pad with hips under weighted sled. Place both feet on platform. Raise weight by extending hips and knees. Place foot down off of foot platform. Release dock levers and grasp handles to sides.','Lower sled by flexing leg until knees are just short of complete flexion or just before hips raise up from pad. Push weight up by extending knee and hip. Repeat and continue with opposite leg.','upload/exercise-picture/SLVerticalSingleLegPress.gif'),(1043,'Sled Single Leg Hack Squat','Lie supine on platform with shoulders against pad. Place feet high up on platform. Extend hips and knees. Cross lower leg above knee of supporting leg. Release dock lever(s).','Lower sled by flexing hips and knee of supporting leg until knees are just short of complete flexion. Raise sled by extending knee and hips. Repeat. Continue with opposite leg.','upload/exercise-picture/SLSingleLegHackSquat.gif'),(1044,'Sled Hack Squat','Lie supine on platform with shoulders against pad. Place feet high up on platform. Extend hips and knees. Release dock levers.','Lower sled by flexing hips and knees until hips are completely flexed. Raise sled by extending knees and hips. Repeat.','upload/exercise-picture/SLHackSquatGlute.gif'),(1045,'Sled Rear Lunge','Position shoulders under padded bars handles. Place feet under bar or just slightly forward. Straighten legs so weight is lifted. Disengage dock lever(s) if available. Place feet slightly forward.','Step back with one leg while bending supporting leg. Plant forefoot far back on floor. Lower body by flexing knee and hip of supporting leg until knee of rear leg is almost in contact with floor. Return to original standing position by extending hip and knee of forward supporting leg and return rear leg next to supporting leg. Repeat movement with opposite legs, alternating between sides.','upload/exercise-picture/SLRearLunge.gif'),(1046,'Sled Squat','Squat down to place shoulders under padded bars. Lean back against back pad if available. Place feet shoulder width apart, slightly in front of shoulders.','If hand or lever lock is available, disengage weight, squat to lowest position and re-engage lock. Lift sled by extending knees and hips until legs are straight. Lower sled by bending knees forward slightly while allowing hips to bend back behind, keeping back straight and knees pointed same direction as feet. Descend until thighs are just past parallel to floor. Return and repeat.','upload/exercise-picture/SLSquatGlute.gif'),(1048,'Sled Kneeling Rear Kick','Kneel on machine by placing knees on lower pad and feet against bars to rear, if available. Place forearms on padded arm rest, and grip handles. Position one foot up so middle of sole is positioned under foot bar.','Push foot bar up by extending leg back as far as possible. Return leg to original position and repeat. Continue with opposite leg.','upload/exercise-picture/SLKneelingHipExtension.gif'),(1050,'Smith Single Leg Split Squat','Place bench behind smith bar. With bar upper chest height, position bar on back of shoulders and grasp bar to sides. Place foot slightly forward under bar. Extend other leg back and place top of foot on bench. Disengage bar by rotating bar back.','Lower body by flexing knee and hip of front leg until knee of rear leg is almost in contact with floor. Return to original standing position by extending hip and knee of forward leg. Repeat. Continue with opposite leg.','upload/exercise-picture/SMSingleLegSplitSquat.gif'),(1051,'Smith Straight-back Stiff-leg Deadlift','Stand with shoulder width or narrower stance with thigh against bar. Grasp bar with shoulder width or slightly wider overhand grip. Disengage bar by rotating bar back.','With knees bent, lower bar toward top feet by bending hips and keeping waist straight. Lift bar by extending at hips until standing upright. Pull shoulders back slightly if rounded. Extend knees at top if desired. Repeat.','upload/exercise-picture/SMStrBackStiffLegDeadlift.gif'),(1053,'Smith Split Squat','With bar upper chest height, position bar on back of shoulders and grasp bar to sides. Place one foot forward and forefoot of other leg further back. Disengage bar by rotating bar back.','Lower body on other leg by flexing knees and hips of both legs until knee of rear leg is almost in contact with floor. Return to original straddled position by extending hips and knees of both legs. Repeat. Continue with opposite leg.','upload/exercise-picture/SMSplitSquat.gif'),(1054,'Smith Single Leg Squat','With bar upper chest height, position bar on back of shoulders and grasp bar to sides. Place feet slightly forward and cross lower leg above knee of supporting leg. Disengage bar by rotating bar back.','Bend knee slightly forward while allowing hips to bend, keeping back straight and knee pointed same direction of foot. Descend until thigh of supporting leg is just past parallel to floor. Extend knee and hip until leg is straight. Return and repeat.','upload/exercise-picture/SMSingleLegSquat.gif'),(1055,'Smith Rear Lunge','With bar upper chest height, position bar on back of shoulders and grasp bar to sides. Place feet under bar or slightly forward. Straighten legs so weight is lifted. Disengage bar by rotating bar back. Place feet slightly forward.','Step back with one leg while bending supporting leg. Plant forefoot far back on floor. Lower body by flexing knee and hip of supporting leg until knee of rear leg is almost in contact with floor. Return to original standing position by extending hip and knee of forward supporting leg and return rear leg next to supporting leg. Repeat movement with opposite legs, alternating between sides.','upload/exercise-picture/SMRearLunge.gif'),(1056,'Smith Hack Squat','Stand with back of thighs or gluteus against bar. Grasp bar from behind with overhand grip. Disengage bar by rotating bar back.','Squat down by bending knees forward while allowing hips to bend back behind, keeping back straight and knees pointed same direction as feet. Descend until thighs are too close to parallel to floor and bar is behind lower leg. Lift bar by extending hips and knees to full extension. Repeat.','upload/exercise-picture/SMHackSquat.gif'),(1057,'Smith Squat','With bar upper chest height, position bar on back of shoulders and grasp bar to sides. Place feet slightly forward. Disengage bar by rotating bar back.','Squat down by bending hips back while allowing knees to bend forward slightly, keeping back straight and knees pointed same direction as feet.\n\n\nDescend until thighs are just past parallel to floor. Extend knees and hips until legs are straight. Return and repeat.','upload/exercise-picture/SMSquatGlutes.gif'),(1058,'Smith Front Squat','With bar upper chest height, grasp bar with overhand shoulder width grip. Position bar on front of shoulders with elbows forward and wrists hyperextended. Place feet slightly forward. Disengage bar by rotating bar back.','Squat down by bending hips back while allowing knees to bend forward\n\n\n, keeping back straight and knees pointed same direction as feet. Descend until thighs are just past parallel to floor. Extend knees and hips until legs are straight. Return and repeat.','upload/exercise-picture/SMFrontSquatGlute.gif'),(1059,'Weighted Front Squat','Stand with feet shoulder width or slightly narrower apart. Holding weight plate upper chest height with both hands.','Squat down by bending hips back while allowing knees to bend forward, keeping back straight and knees pointed same direction as feet. Descend until thighs are just past parallel to floor. Extend knees and hips until legs are straight. Return and repeat.','upload/exercise-picture/WTFrontSquat.gif'),(1060,'Weighted Single Leg Squat','Stand with arms extended out in front, holding medicine ball or weight plate. Balance on one leg with opposite leg extended straight leg forward as high as possible.','Squat down as far as possible while keeping leg elevated off of floor. Keep supporting knee pointed same direction as foot supporting. Raise body back up to original position until knee and hip of supporting leg is straight. Return and repeat. Continue with opposite leg.','upload/exercise-picture/WTPistolSquatFarLeg.gif'),(1061,'Weighted Belt Squat','Place weight on dip belt around waist. Step up onto boxes or benches spaced apart; foot on each bench. Arms can be extended forward throughout exercise.','Squat down by bending hips back while allowing knees to bend forward slightly, keeping back straight and knees pointed same direction as feet.\n\n\nDescend until thighs are just past parallel to floor. Squat up by extending knees and hips until legs are straight. Return and repeat.','upload/exercise-picture/WTSquat.gif'),(1062,'Weighted Reverse Hyper-extension','Place sandbag or medicine ball between ankles. Lay torso and waist on bench and grasp handles. Feet should be above floor with legs straight.','Raise weight by extending hips as high as possible until legs are nearly straight. Lower legs to original position. Repeat.','upload/exercise-picture/WtReverseHyperExtension.gif'),(1063,'Smith Wide Squat','With bar upper chest height, position bar on back of shoulders and grasp bar to sides. Place feet wide, pointing outward 45° to 30°. Disengage bar by rotating bar back.','Squat down by bending hips back while allowing knees to bend forward slightly, keeping back straight and knees pointed same direction as feet. Descend until thighs are just past parallel to floor. Extend knees and hips until legs are straight. Return and repeat.','upload/exercise-picture/SMSquatWide.gif'),(1064,'Reverse Hyper-extension','Lay torso and waist on bench and grasp handles. Feet should be above floor with legs straight.','Raise legs by extending hips as high as possible until legs are nearly straight. Lower legs to original position. Repeat.','upload/exercise-picture/BWReverseHyperExtension.gif'),(1065,'Lunge','Stand with hands on hips or clasped behind neck.','Lunge forward with first leg. Land on heel, then forefoot. Lower body by flexing knee and hip of front leg until knee of rear leg is almost in contact with floor. Return to original standing position by forcibly extending hip and knee of forward leg. Repeat by alternating lunge with opposite leg.','upload/exercise-picture/BWLunge.gif'),(1066,'Single Leg Hip Bridge','Lie on floor or mat. Place one leg straight and bend the other leg with foot flat on floor or mat. Place arms down on mat to each side of hips.','Raise body by extending hip of bent leg, keeping extended leg and hip straight. Return to original position by lowering body with extended leg and hip straight. Repeat and continue with opposite sides.','upload/exercise-picture/BWSupineSingleLegHipBridge.gif'),(1067,'Single Leg Box Squat','Stand in front of adjustable height bench or box. Extend arms out in front of body. Balance on one leg with opposite leg extended straight leg forward as high as possible.','Squat down while keeping leg elevated off of floor. Keep back straight and supporting knee pointed same direction as foot supporting. Once bottocks makes contact with bench or box, raise body back up to original position until knee and hip of supporting leg is straight. Repeat and continue with opposite leg.','upload/exercise-picture/BWSingleLegBenchSquat.gif'),(1068,'Single Leg Reclining Squat (bar)','Stand behind horizontal bar, lower chest to upper waist height. Grasp bar with both hands. Place feet slightly forward and lean back with arms straight. Balance on one leg with opposite leg extended straight leg forward as high as possible.','While reclining back, squat down as far as possible while keeping leg elevated off of floor. Keep back straight and supporting knee pointed same direction as suppor ting foot. Raise body back up to original position until knee and hip of supporting leg is straight. Repeat and continue with opposite leg.','upload/exercise-picture/BWRecliningSingleLegPistolSquat.gif'),(1069,'Reverse Hyper-extension (on stability ball)','Lay prone with waist on stability ball. Grasp secure anchor or bar near floor. Feet should be above floor with legs straight.','Holding firmly on anchor, extend legs upward by lifting and straightening leg as high as possible. Lower legs to original position with thighs close to stability ball. Repeat.','upload/exercise-picture/BWReverseHyperExtensionBall.gif'),(1070,'Single Leg Squat (with leg back)','Stand with arms extended out in front.','Squat down as far as possible while keeping raised leg from contacting floor as far down as possible. Keep back straight and supporting knee pointed same direction as foot supporting. In lowest position, gently place elevated lower leg on floor. Raise body back up with minimal assistance from raised leg on floor. Stand to original position until knee and hip of supporting leg are straight. Return and repeat. Continue with opposite leg.','upload/exercise-picture/BWSingleLegSquatLegBack.gif'),(1071,'Single Leg Squat (pistol)','Stand with arms extended out in front. Balance on one leg with opposite leg extended straight leg forward as high as possible.','Squat down as far as possible while keeping leg elevated off of floor. Keep back as straight as possible and supporting knee pointed same direction as foot supporting. Raise body back up to original position until knee and hip of supporting leg is straight. Repeat and continue with opposite leg.','upload/exercise-picture/BWSingleLegSquatPistol_.gif'),(1072,'Single Leg Stiff-leg Deadlift','Stand with feet together and hands just in front of thighs. Lift leg slightly so foot is just off floor.','Lower torso forward and downward while raising lifted leg back behind. Keep back straight and knee of supporting leg slightly bend. Keep hip and knee of lifted leg extended throughout movement. Once stretch is felt or hands contact floor, return to original position by raising torso while lowering lifted leg. Straighten knee of supporting leg as torso becomes upright. Repeat.','upload/exercise-picture/BWSingleLegStiffLegDeadlift_.gif'),(1073,'Split Squat','Stand with hands on hips. Position feet far apart; one foot forward and other foot behind.','Squat down by flexing knee and hip of front leg. Allow heel of rear foot to rise up while knee of rear leg bends slightly until it almost makes contact with floor. Return to original standing position by extending hip and knee of forward leg. Repeat. Continue with opposite leg.','upload/exercise-picture/BWSplitSquat.gif'),(1074,'Single Leg Split Squat','Stand facing away from bench. Extend leg back and place top of foot on bench.','Squat down by flexing knee and hip of front leg until knee of rear leg is almost in contact with floor. Return to original standing position by extending hip and knee of forward leg and repeat. Continue with opposite leg.','upload/exercise-picture/BWSingleLegSplitSquat.gif'),(1075,'Squat','Stand with arms extended forward.','Squat down by bending hips back while allowing knees to bend forward slightly, keeping back straight and knees pointed same direction as feet. Descend until thighs are just past parallel to floor. Squat up by extending knees and hips until legs are straight. Return and repeat.','upload/exercise-picture/BWSquat.gif'),(1076,'Step-down','Stand with one foot on bench or elevated surface. Position foot on elevated surface to side, forward of straight knee.','Stand on bench by straightening leg and pushing body upward. Step down returning foot off of bench to floor and repeat. Continue with opposite position.','upload/exercise-picture/BWStepDown.gif'),(1077,'Step-up','Stand facing side of bench, step or platform.','Place foot of first leg on bench. Stand on bench by extending hip and knee of first leg and place foot of second leg on bench. Step down with second leg by flexing hip and knee of first leg. Return to original standing position by placing foot of first leg to floor. Repeat first step with opposite leg, alternating first steps between legs.','upload/exercise-picture/BWStepUp.gif'),(1078,'Self-assisted Single Leg Squat (bar)','Stand behind horizontal bar, lower chest to waist height. Place finger tips or inside base of thumbs on bar, hold with just enough contact for balance and self-assistance. Balance on one leg with opposite leg extended straight leg forward as high as possible.','Squat down as far as possible while keeping leg elevated off of floor. Keep back straight and supporting knee pointed same direction as supporting foot. Raise body back up to original position until knee and hip of supporting leg is straight. Repeat and continue with opposite leg.','upload/exercise-picture/ASSingleLegSquatPistolSelf.gif'),(1079,'Self-assisted Single Leg Squat (leg wrapped)','Stand with hand on hip height elevated surface or other tall, sturdy structure for support. Stand on one leg by wrapping leg around back of supporting leg so top of lifted foot is on outside of supporting leg\'s ankle.','Squat down by bending knee forward and hip back behind. Keep back straight and supporting knee pointed same direction as foot supporting. Descend until thigh is just past parallel to floor. Return to standing position with minimal assistance from wrapped leg. Stand to original position until knee and hip of supporting leg are straight. Return and repeat. Continue with opposite leg.','upload/exercise-picture/BWSingleLegSquatSelfAssistLeg.gif'),(1080,'Lateral Step-up','Stand between two benches, one to each side.','Lift leg and place foot on bench to side and forward of straight knee. Stand on bench by straightening leg and pushing body upward. Step down returning feet to original position. Repeat with opposite leg, alternating between legs.','upload/exercise-picture/BWLateralStepUp.gif'),(1081,'Self-assisted Step-down','Stand with one foot on bench or elevated surface. Position foot on elevated surface to side and forward of straight knee.','Stand on bench by straightening leg and pushing body upward. Step down returning foot off of bench to floor and repeat. Continue with opposite position.','upload/exercise-picture/ASStepDownSelf.gif'),(1082,'Self-assisted Single Leg Reclining Squat (pole)','Stand with feet behind vertical pole. Grasp pole with both hands, waist to hip height. Balance on one leg with opposite leg raised up off of floor to side of pole.','Squat down while keeping leg elevated off of floor. With arms slightly flexed, lean back slightly while only allowing knee to travel slightly forward. Keep back straight and supporting knee pointed same direction as supporting foot. Descend to lowest position. Raise body back up to original position while keeping knee behind bar and arms slightly flexed until knee and hip of supporting leg is straight. Repeat and continue with opposite leg.','upload/exercise-picture/ASVerticalPoleRecliningPistolSquats.gif'),(1083,'Suspended Hip Bridge','Sit on floor facing suspension trainer loops in low position. Grasp bottom of loops, then lay supine. Raise legs and place heels in loops with soles contacting handles. Lie down supine on mat so knees and hips are bent with suspension straps hanging vertical. Place arms off to sides.','Raise hips up by extending hips until fully extended. Lower hips until hips and back make contact with mat. Repeat.','upload/exercise-picture/STHipBridge.gif'),(1084,'Alternating Step-down','Stand on bench or narrow platform, with feet side by side.','Step down with first foot to side of elevated surface onto floor. Stand back up on elevated surface by straightening upper leg and pushing body upward. Place foot to original position next to opposite foot. Step down and back up with opposite leg in same manner. Repeat by alternating between sides.','upload/exercise-picture/BWAlternatingStepDown.gif'),(1085,'Lying Glute Stretch','Lie on floor or mat. Bend knees with feet on floor. Cross lower leg over thigh of other leg. Grasp foot and knee with both hands.','Pull leg toward torso. Hold stretch. Repeat with opposite leg.','upload/exercise-picture/30ef1c4275fd2c4cfaeeeb0d8dd02dc8.jpg'),(1087,'Suspended Single Leg Split Squat (self-assisted)','Grasp one or both suspension trainer handle(s) in lower position hanging. Stand facing nearby fixed support and hold with one hand for balance. With other hand, secure foot in loop(s) from behind while balancing on one leg. With both hands, hold lightly on fixed support for balance and minimal assistance if needed.','Squat down by flexing knee and hip of front leg until knee of rear leg is almost in contact with floor. Return to original standing position by extending hip and knee of supporting leg. Repeat and continue with opposite leg.','upload/exercise-picture/STSingleLegSplitSquat.gif'),(1088,'Suspended Single Leg Squat','Grasp suspension handles and momentarily step back until arms are extended forward and straight. While keeping arms straight and shoulders back, step forward so body reclines back behind suspension handles. Position body and legs straight at desired angle hanging from handles with arms straight. Balance on one leg with opposite leg extended straight forward as high as possible.','Squat down as far as possible while keeping leg elevated off of floor. Keep supporting knee pointed same direction as foot supporting. Raise body back, up to original position until knee and hip of supporting leg is straight. Repeat and continue with opposite leg.','upload/exercise-picture/STPistolSquat.gif'),(1089,'PNF Lying Glute Stretch','Instruct participant to lie on floor or mat. Kneel beside participant. Bend participant\'s knee and hip and rotate leg cross wise. Position outside of participant\'s knee on nearest shoulder with participants lower leg extended under arm. Position near ankle on participant\'s opposite lower leg.','Extend or place hands on mat to each side of participant. Push participant\'s leg by leaning toward participant. Repeat with opposite leg.','upload/exercise-picture/601b4db67e8babb5ca963871f631d7d4.jpg'),(1090,'Lever Glute Stretch','Sit on seat in forward position with lower leg on shin pad, feet on foot rest. Place hands through wrist straps. Hold lower bar with overhand grip. Position ankle on thigh or knee.','Push and lower seat back. Hold stretch. Repeat with opposite leg.','upload/exercise-picture/PCGlute8.gif'),(1091,'Lying Wall Glute Stretch','Sit on floor with hip and thigh against wall. Lift back of legs up against wall by pivoting on hips and lying on back. Cross lower leg over thigh of straight leg.','Bend knee of straight leg while lowering heel on wall. Hold stretch. Repeat with opposite leg.','upload/exercise-picture/596a1075c3ba2b462bf9673be6694ae9.jpg'),(1092,'Prone Glute Stretch','Sit on floor or mat with outside of lower leg bent in front so it is approximately perpendicular to body. Place hands on floor in front and extend opposite leg back on floor so knee is toward floor.','Allow body to ease down toward floor with support of arms. Hold stretch and repeat with opposite leg.','upload/exercise-picture/432530b69b09c56a29da7a22cc0e8d08.jpg'),(1093,'Towel Lying Glute Stretch','Lasso lower thigh with towel and lie on floor or mat. Bend knees with feet on floor. Cross lower leg over thigh of lassoed leg. Holding each side of towel position towel under knee.','Pull both ends of towel so leg travels toward torso. Hold stretch. Repeat with opposite leg.','upload/exercise-picture/777cefd67a1e210b525426dcbbb4e67d.jpg'),(1094,'Suspended Single Leg Split Squat','Grasp one or both suspension trainer handle(s) in lower position. Step and face away from suspension trainers. Balance on one leg while raising foot from behind and slipping single foot in loop(s). Release handle with hand and position leg back so it is supported behind body by suspension trainer. Place hands on hips and maintain balance throughout exercise.','Squat down by flexing knee and hip of front leg until knee of rear leg is almost in contact with floor. Return to original standing position by extending hip and knee of forward leg and repeat. Continue with opposite leg.','upload/exercise-picture/STSplitSquat.gif'),(1095,'Standing Glute Stretch','Stand facing close to elevated platform. Place outside of foot on bench with knee bent out to side.','Lean down, lowering torso toward thighs. Hold stretch. Repeat with opposite leg.','upload/exercise-picture/9272e1aa7795cd6d69eeec84008ae2bc.jpg'),(1096,'Seated Glute Stretch','Sit on floor or mat reclining back with support of both arms behind body. Bend knees approximately 90 degrees with feet on floor. Cross lower leg (just above ankle) over thigh of opposite leg.\nSit on floor or mat and cross lower leg over thigh of straight leg. Lean back slightly and bend knee of lower leg with heel on floor. Grasp foot and knee.','Bring torso upright by walking hands closer to hips, keeping arms straight. Lean forward and hold stretch. Repeat with opposite leg.\nLean forward by pulling torso toward legs. Hold stretch. Repeat with opposite leg.','upload/exercise-picture/054db6718469ffb535af273b9a17cc98.jpg'),(1097,'Seated Glute Stretch (chair)','Sit on chair or bench with ankles positioned below knees. Cross lower leg over thigh of opposite leg.','Lean down, lowering torso toward thighs. Hold stretch. Repeat with opposite leg.','upload/exercise-picture/136d4f4b1a6032c4ea14eea7427436c6.jpg'),(1098,'Seated Glute Stretch (bench)','Straddle bench and sit. With one foot on floor, place outside of other foot on bench close to pelvis.','Lean down, lowering torso toward thighs. Hold stretch. Repeat with opposite leg.','upload/exercise-picture/58ce4a640c1833fb4a7f4e526d24f68e.jpg'),(1099,'PNF Seated Glute Stretch','Instruct participant to sit on floor or mat, reclining back with support of both arms behind body, and feet on floor and knees bent. Have them cross their lower leg (just above ankle) over thigh of opposite leg. Position chest on participant\'s back and grasp participant\'s lower knee and upper ankle.','Push participant\'s torso toward legs. Hold stretch. Repeat with legs in opposite position','upload/exercise-picture/accfd2eb6746dc16fab0a4b4236c178f.jpg'),(1100,'Seated Bent-over Glute Stretch','Sit on floor or mat with outside of lower leg bent in front and inside of opposite lower leg bent to side. Position bottom of forward foot against knee of opposite leg. Place hands on floor in front of forward leg.','Reach or slide forward with support of arms and hold stretch. Repeat with opposite leg.','upload/exercise-picture/66e6dd21450b69f03bbc492bafd6961d.jpg'),(1101,'Squatting Glute Stretch','Stand toward fixed bar, approximately waist height. Grasp bar with both hands, arms extended. Bend knees and hips slightly. Cross lower leg over lower thigh of opposite leg.','Squat lower and lean forward toward crossed leg. Hold stretch . Repeat with opposite leg.','upload/exercise-picture/9571fa8af0d75d538ce0eaa398a67954.jpg'),(1102,'Knee Hug','Stand on one leg. Raise knee high and grasp shin below knee with both hands.','Pull knee toward body until stretch is felt in hip. Release and step forward with stretched leg. Repeat with opposite leg. Continue by alternating stretch and step between each leg until specific distance is covered or desired number of repetitions have been completed.','upload/exercise-picture/KneeHug.gif'),(1103,'Walking Ankle Grab','Stand on one foot. Grasp foot with both hands by raising inside of foot upward with knee pointing outward; opposite hand grasps heal and near hand grasps shin, just above ankle.','Pull foot and lower leg upward until stretch is felt in hip. Release and step forward with stretched leg. Repeat with opposite leg. Continue by alternating stretch and step between each leg until specific distance is covered or desired number of repetitions have been completed.','upload/exercise-picture/WalkingAnkleGrab.gif'),(1104,'Lever Lying Hip Abduction','Sit in machine with heels on bars or legs inside of side pads. Lie back on back pad. Pull in on lever to position legs together. Release lever into position and grasp bars to sides.','Move legs away from one another by abduction hip. Return and repeat.','upload/exercise-picture/LVLyingAbduction.gif'),(1105,'Cable Seated Hip Internal Rotation','Sit on bench or chair with low pulley to side. Attach cable ankle cuff to ankle furthest pulley. Place foot of stationary leg just forward of foot attached to cable. Grasp bench and handle bar on cable column if available. Position thighs of both legs side by side, perpendicular to cable. Raise foot attached to cable slightly off of floor.','Keeping knee of attached leg bent approximately 90°, pull cable attachment away from pulley by rotating hip as far as possible. Return foot behind stationary foot and toward pulley. Repeat. Place ankle cuff on opposite leg and continue facing opposite direction.','upload/exercise-picture/CBSeatedHipInternalRotation.gif'),(1106,'Dumbbell Lying Hip Abduction','Lie on side on floor or mat. Extend top leg down straight and position lower leg back underneath. Grasping dumbbell with hand of arm furthest from floor, position dumbbell as low as possible on top side of thigh.','Raise weighted leg up off ground as high as possible, keeping dumbbell positioned on side of upper thigh. Return to leg to floor and repeat. Repeat and continue with opposite leg.','upload/exercise-picture/DBLyingHipAbduction.gif'),(1107,'Lever Standing Hip Abduction','Adjust platform so lever fulcrum is same height as hip articulation. Adjust roller in low position. Face machine and grasp bars to sides. Place outside of thigh against roller pad and shift body weight to opposite leg.','Raise leg against roller pad to side by abduction hip. Return and repeat. Reposition roller pad lever and continue with opposite leg.','upload/exercise-picture/LVStandingHipAbduction.gif'),(1108,'Cable Lying Hip Internal Rotation','Attach cable ankle cuff to ankle, furthest low pulley. Step near foot over cable and lie prone perpendicular to cable. Bend knee 90° so attached ankle crosses over resting straight leg nearest pulley. Adjust positioning of legs slightly away from cable pulley so slight stretch is felt in hip.','Keeping knee of attached leg bent approximately 90°, pull cable attachment away from pulley by rotating hip as far as possible. Return leg to original position toward pulley and repeat. Place ankle cuff on opposite leg and continue lying opposite direction.','upload/exercise-picture/CBLyingInternalHipRotation.gif'),(1109,'Cable Hip Abduction','Stand in front of low pulley facing to one side. Attach cable cuff to far ankle. Step out away from stack and grasp ballet bar. Stand on near foot and allow far leg to cross in front.','Move leg to opposite side of low pulley by abduction hip. Return and repeat. Turn around and continue with opposite leg.','upload/exercise-picture/CBHipAbduction.gif'),(1110,'Lever Seated Hip Abduction (plate loaded)','Stand near side of apparatus. Place one leg onto far padded lever and sit on seat. Lift other leg onto other padded lever. Lean back onto back pad. Grasp handles to sides.','Move legs away from one another as far as possible. Return and repeat.','upload/exercise-picture/LVSeatedHipAbductionH.gif'),(1111,'Lever Seated Hip Abduction','Sit on machine with legs inside of side pads. If available, place heels on foot bars. Release and pull lever brace to position legs together. Engage lever into locked position. Lie back and grasp bars to sides.','Move legs apart as far as possible. Return and repeat.','upload/exercise-picture/LVSeatedHipAbduction.gif'),(1113,'Weighted Lying Hip Abduction','Sit on floor or mat with bar, plates loaded on one side. Sit on hip with knees bent and place bar on outside of shoe with weight plate(s) positioned beyond foot. Holding on to opposite end of bar, lie on side with weighted leg extended out straight and lower leg bent underneath.','Raise weighted leg up off ground as high as possible. Balance bar on side of foot while holding onto closest side of bar. Return to floor and repeat. Continue with opposite leg.','upload/exercise-picture/WtLyingHipAbductionRear.gif'),(1114,'Bent Knee Side Bridge Hip Abduction','Lie on side with legs bent back 90 degrees, one leg on top of the other. Place forearm under shoulder perpendicular to body.','Keeping shank of lower leg on mat or floor, raise hips up off ground while raising upper leg upward away from lower leg. Return to original position and repeat. Continue with opposite leg.','upload/exercise-picture/BWBentKneeSideBridgeHipAbduction.gif'),(1115,'Suspended Hip Abduction','Sit on floor facing suspension trainer loops in low position. Grasp bottom of loops, then lay supine. Raise legs and place heels in loops with soles contacting handles. Extend legs out and place arms on floor off to sides. Straighten low back, knees, and hips, raising back and hips off of floor.','Pull legs apart as far as possible. Return by placing legs together and repeat.','upload/exercise-picture/STHipAbduction.gif'),(1117,'Angled Side Bridge Hip Abduction','Grasp vertical bar with one hand and turn to side. Position feet out away from vertical bar with arm supporting body extended out to side. Legs should be straight and positioned side by side. Supporting arm should be approximately vertical to body and other arm can be placed on hips. Lower hips downward to floor until slight stretch is felt.','Keeping foot closest to bar on ground, raise hips upward and away from bar while raising leg furthest from bar upward away from lower leg. Return to original position with hips sagging downward and repeat. Continue with opposite leg.','upload/exercise-picture/BWAngledSideBridgeHipAbduction.gif'),(1123,'Side Bridge Hip Abduction','Lie on side with legs straight, one leg on top of the other. Place forearm under shoulder perpendicular to body.','Keeping side of bottom foot on ground, raise hips up off ground while raising upper leg upward away from lower leg. Return to original position and repeat. Continue with opposite leg.','upload/exercise-picture/BWSideBridgeHipAbduction.gif'),(1124,'Seated Hip Internal Rotator Stretch (chair or bench)','Sit on chair or end of bench and cross legs with outside of ankle on lower thigh.','Push knee toward downward. Hold stretch. Repeat with opposite side.','upload/exercise-picture/44b37e1aab348eb93bafb89080cea192.jpg'),(1125,'Lying Pretzel Stretch','On floor or mat, lie supine with arms extended to sides. Cross thighs and position foot behind slightly bent leg.','Lower knee to opposite side, twisting waist so hip rolls to side. Hold stretch. Repeat with opposite side.','upload/exercise-picture/dab35e72da31b59d94623a0640b1926c.jpg'),(1126,'Seated Hip Internal Rotator Stretch','Sit on floor or mat and cross lower leg over thigh of straight leg.','Push knee toward floor. Hold stretch. Repeat with opposite side.','upload/exercise-picture/9b05f865c78abdf92295a759ccbceacd.jpg'),(1127,'PNF Lying Crossover Stretch','Instruct participant to lie on floor or mat. Kneel beside participant. Bend participant\'s near knee and hip. Place hand on outside of participant\'s near knee and opposite hand on participant\'s shoulder.','Push participant\'s knee to opposite side while backing participant\'s shoulder down. Hold stretch. Repeat with opposite side.','upload/exercise-picture/7a5b64ba949b42e3a72e160f92c2f955.jpg'),(1128,'Seated Hip Internal Rotator Stretch (bent leg under)','Sit on floor or mat and place extended leg on top of inside of bent lower leg positioned perpendicular.','Straighten extended knee pushing bent knee toward floor. Hold stretch. Repeat with opposite side.','upload/exercise-picture/f66b7fdbd9075369b00d1c2e07a25a7e.jpg'),(1130,'Lying Iliotibial Stretch','Lie on one side. Position ankle of lower leg over outside of upper thigh. Grasp top ankle or forefoot behind. Reposition side of upper body on floor.','Pull knee of rear leg back by straightening hip. Hold stretch. Repeat with opposite side.','upload/exercise-picture/4d256a130280ed534e17716ef102c5fd.jpg'),(1131,'Squatting Iliotibial Stretch','Stand with feet together and side toward wall, arm\'s length away. Place hand on wall and opposite hand on hip.','Squat with supporting leg while placing leg nearest wall behind and across supporting leg so foot is positioned away from wall. Hold stretch. Repeat with opposite side.','upload/exercise-picture/9d854b4a82b260b4f3808518acb59a7b.jpg'),(1132,'Seated Pretzel Stretch','Sit on floor or mat with knees straight. Place one foot on floor to outside of other knee. Turn torso toward side of bent knee supporting body with extended arm behind. Place elbow of opposite arm to outside of bent knee.','Push side of knee with elbow so bent leg further crosses thigh of straight leg. Hold stretch. Repeat with opposite side.','upload/exercise-picture/d82859f560a16796c812d0a3e19e610e.jpg'),(1133,'Side Pretzel Stretch','Sit on side of thigh on floor or mat with knees bent. Position bent knee of upper leg behind foot of lower leg. Position chest facing floor with both hands on floor; arms somewhat extended and torso nearly inline with upper thigh.','Turn chest and front of pelvis further toward floor. Hold stretch. Repeat with opposite side.','upload/exercise-picture/b579aa254b37411388e062c381fe3de2.jpg'),(1134,'Wall Iliotibial Stretch','Stand with feet together and side toward wall, slightly greater than arm\'s length away. Place closest hand on wall and opposite hand on hip.','With legs and hip straight, lower hip toward wall. Hold stretch . Repeat with opposite side.','upload/exercise-picture/c16a7f0b42ff96059d3f4ef4fec6107b.jpg'),(1135,'Standing Iliotibial Stretch','Stand erect with legs crossed, outsides of feet together.','Maintaining complete extension of hip, shift body weight to rear leg allowing hip of leg in front to drop. Hold stretch. Repeat with opposite side.','upload/exercise-picture/8afc9098cde1ca0a010ebc1a6d9df8b8.jpg'),(1136,'Cable Lying Leg Raise','Attach cable ankle straps to both ankles, then attach ankle straps to cable. Lie supine on floor or mat, back far enough so cable is taut. Grasp support behind head.','Raise legs by flexing hips and knees until thighs are just past perpendicular to torso or before hips raise off of bench. Return until hips and knees are extended. Repeat.','upload/exercise-picture/CBLyingLegRaise.gif'),(1137,'Cable Lying Leg Raise (on bench)','Attach cable ankle straps to both ankles. Sit on end of bench facing pulley at bench height. Attach cable to both ankle straps. Lie supine on bench until cable is taut. Grasp sides of bench behind head.','Raise legs by flexing hips and knees until thighs are past perpendicular to torso or before hips raise off of bench. Return until hips and knees are extended. Repeat.','upload/exercise-picture/CBLyingLegRaiseBench.gif'),(1138,'Cable Standing Leg Raise','Attach cable ankle cuff to one ankle. Stand facing away from low pulley. Step\n\nforward\n\nwith opposite leg so leg with cuff is pulled back. Grasp lateral bars or other prop for support.','Raise knee by flexing hip while allowing lower leg to bend back under resistance. When thigh is just beyond horizontal, lower leg until hip and knee is extended. Repeat. Continue with opposite leg.','upload/exercise-picture/CBLegRaise.gif'),(1139,'Cable Lying Straight Leg Raise','Attach cable ankle straps to both ankles, then attach ankle straps to cable. Lie supine on floor, mat, or bench back far enough so cable is taut. Grasp support behind head.','With knees straight, raise legs by flexing hips until thighs are just past perpendicular to torso or before hips raise off of mat. Return until hips are extended. Repeat.','upload/exercise-picture/CBStraightLegRaise.gif'),(1140,'Cable Assisted Wheel Rollout','With ab wheel attached to cable via double looped strap attachment, straddle cable facing away from low pulley. Kneel with both knees on mat. Grasp handles on wheel to each side with overhand grip. Position wheel near front of knees and lean over wheel with arms extended downward, supporting upper body.','With arms straight, roll wheel out as far as possible. Lower body gently to floor extending arms forward. Raise body back up by flexing hips and pulling arms back to original position. Return until hips are extended. Repeat.','upload/exercise-picture/ASKneelingWheelRollout.gif'),(1141,'Lever Hip Flexion','Stand on platform facing to one side and grasp bar for support. Position front of leg nearest to machine against padded roller while standing on other leg.','Raise lever by flexing hip until knee is higher than hip. Return until hip is extended. Repeat. Continue with opposite leg.','upload/exercise-picture/LVHipFlexion.gif'),(1142,'Cable Standing Straight Leg Raise','Stand facing away from low pulley. Place foot in cable boot or foot harness. Grasp lateral bars or other prop for support. Stand forward on free leg, allowing leg attached to cable to be pulled back.','Raise leg upward by flexing hip while keeping knee straight. Raise leg as high as possible. Lower leg to original starting position. Repeat. Continue with opposite leg.','upload/exercise-picture/CBStandingStraightLegRaise.gif'),(1143,'Lever Vertical Leg Raise','Grasp handles slightly to front and stand on foot bar with knees slightly bent and hips against pad.','With back straight, raise legs as high as possible by flexing hips. Return and repeat.','upload/exercise-picture/LVVerticalLegRaise.gif'),(1144,'Weighted Decline Sit-up','Sit on apparatus with lower leg secured under padded bar. Hold weight in front of chest (as shown) or behind neck or use no weight.','Lower body back until hips are almost extended. Raise body by flexing hips until torso is upright. Repeat.','upload/exercise-picture/WtDeclineSitUp.gif'),(1145,'Weighted Hanging Leg Raise','Place weight between ankles or use no weight. Grasp and hang from high bar.','Raise legs by flexing hips and knees until hips are completely flexed or knees are well above hips. Return until hips and knees are extended. Repeat.','upload/exercise-picture/WTHangingLegRaise.gif'),(1146,'Lever Lying Leg Raise','Sit on end of bench with both legs over padded lever and hips aligned with fulcrum. Strap legs onto padded lever. Lie supine on bench. Grasp handles near head.','Raise legs by flexing hips until they are completely flexed. Lower legs until hips are extended. Repeat.','upload/exercise-picture/LVLyingLegRaiseN.gif'),(1147,'Weighted Incline Straight Leg Raise','Sit on incline board. Place weight between ankles. Lie supine on incline board with torso elevated. Grasp feet hooks or sides of board for support.','With knees straight, raise legs by flexing hips until thighs are just past perpendicular to torso. Return until hips and knees are extended. Repeat.','upload/exercise-picture/WtInclineStraightLegRaise.gif'),(1148,'Weighted Incline Leg Raise','Sit on incline board. Place weight between feet or use no weight. Lie supine on incline board with torso elevated. Grasp feet hooks or sides of board for support.','Raise legs by flexing hips and knees until hips are completely flexed. Return until hips and knees are extended. Repeat.','upload/exercise-picture/WtInclineLegRaise.gif'),(1149,'Weighted Incline Straight Leg Raise (arms on pads)','Sit on bottom edge of incline board and place weight between feet. Lie back on incline board. Grasp handles and place forearms on arm pads to each side.','With knees straight, raise legs by flexing hips until hips are flexed. Return until hips and knees are extended. Repeat.','upload/exercise-picture/WTInclineStraightLegRaiseArmPads.gif'),(1150,'Weighted Lying Leg Raise','Sit on end of bench. Place weight between feet. Lie supine on bench. Grasp bench on each side behind head for support.','Raise legs by flexing hips and knees until hips are completely flexed. Return until hips and knees are extended. Repeat.','upload/exercise-picture/WtLyingLegRaise.gif'),(1151,'Weighted Hanging Straight Leg Raise','Place weight between ankles or use no weight. Grasp and hang from high bar.','With knees straight, raise legs by flexing hips until thighs are just past parallel to floor. Return until hips are extended downward. Repeat.','upload/exercise-picture/WtHangingStraightLegRaise.gif'),(1152,'Weighted Seated Leg Raise','Sit on edge of bench with legs extended to floor. Place weight between ankles. Grasp edge of bench. Lean torso back and balance bodyweight on edge of bench.','Raise legs by flexing hips and knees while pulling torso slightly forward to maintain balance. Return by extending hips and knees and lean torso back to counter balance. Repeat.','upload/exercise-picture/WtSeatedLegRaise.gif'),(1153,'Weighted Incline Leg Raise (arms on pads)','Sit on bottom edge of incline board and place weight between feet. Lie back on incline board. Grasp handles and place forearms on arm pads to each side.','Raise legs by flexing hips and knees until hips are completely flexed. Return until hips and knees are extended. Repeat.','upload/exercise-picture/WtLegRaiseArmsPads.gif'),(1154,'Weighted Vertical Leg Raise (on parallel bars)','Place weight between ankles. Stand between parallel bars and grip bar on each side with overhand grip. Lift body off floor and balance body upright with arms straight.','Raise legs by flexing hips and knees until thighs are just past parallel to floor. Return until hips and knees are extended. Repeat.','upload/exercise-picture/WTVerticalLegRaisePB.gif'),(1155,'Weighted Vertical Leg Raise','Place weight between ankles or use no weight. Position forearms on padded parallel bars with hands on handles, and back on vertical pad.','Raise legs by flexing hips and knees until hips are completely flexed or knees are well above hips. Return until hips and knees are extended. Repeat.','upload/exercise-picture/WtVerticalLegRaise.gif'),(1156,'Weighted Roman Chair Sit-up','Sit on apparatus with lower leg secured under padded bar. Hold weight to front of chest or behind neck or use no weight.','Lower body back until hips are almost extended. Raise body by flexing hips until torso is upright. Repeat.','upload/exercise-picture/WTRomanChairSitup.gif'),(1157,'Hanging Leg Raise','Grasp and hang from high bar with slightly wider than shoulder width overhand grip.','Raise legs by flexing hips and knees until hips are completely flexed or knees are well above hips. Return until hips and knees are extended downward. Repeat.','upload/exercise-picture/BWHangingLegRaise.gif'),(1158,'Hanging Straight Leg Raise','Grasp and hang from high bar with slightly wider than shoulder width overhand grip.','With knees straight, raise legs by flexing hips until hips are completely flexed or knees are well above hips. Return until hips are extended downward. Repeat.','upload/exercise-picture/BWHangingStraightLegRaise.gif'),(1159,'Hanging Leg Raise (with ab straps)','Stand below ab straps hanging from high bar. Place upper arms in straps and grasp straps above.','Raise legs by flexing hips and knees until hips are completely flexed or knees are well above hips. Return until hips and knees are extended downward. Repeat.','upload/exercise-picture/BWHangingLegRaiseAbStraps.gif'),(1160,'Incline Leg Raise','Lie supine on incline board with torso elevated. Grasp feet hooks or sides of board for support.','Raise legs by flexing hips and knees until hips are completely flexed. Return until hips and knees are extended. Repeat.','upload/exercise-picture/BWInclineLegRaise.gif'),(1161,'Incline Straight Leg Raise (arms on pads)','Lie back on incline board. Grasp handles and place forearms on arm pads to each side.','With knees straight, raise legs by flexing hips until hips are flexed. Return until hips and knees are extended. Repeat.','upload/exercise-picture/BWInclineStraightLegRaiseArmPads.gif'),(1162,'Weighted Vertical Straight Leg Raise','Place weight between ankles or use no weight. Position forearms on padded parallel bars with hands on handles, and back on vertical pad.','With knees straight, raise legs by flexing hips until thighs are just past parallel to floor. Return until hips are extended. Repeat.','upload/exercise-picture/WtVerticalStraightLegRaise.gif'),(1163,'Incline Leg Raise (arms on pads)','Lie back on incline board. Grasp handles and place forearms on arm pads to each side.','Raise legs by flexing hips and knees until hips are flexed. Return until hips and knees are extended. Repeat.','upload/exercise-picture/BWLegRaiseArmsPads.gif'),(1164,'Lying Leg Raise (on bench)','Lie supine on bench. Place hands under lower buttock on each side to support pelvis.','Raise legs by flexing hips and knees until thighs are completely flexed. Return until hips and knees are extended. Repeat.','upload/exercise-picture/BWLyingLegRaise.gif'),(1165,'Incline Straight Leg Raise','Sit on incline board. Lie supine on incline board with torso elevated. Grasp feet rollers or sides of board for support.','With knees straight, raise legs by flexing hips until hips are completely flexed. Return until hips and knees are extended. Repeat.','upload/exercise-picture/BWInclineStraightLegRaise.gif'),(1166,'Lying Simultaneous Alternating Leg Raise','Lie supine on bench or mat. Place hands under lower buttock on each side to support pelvis. Raise bent leg up so lower leg is approximately horizonal above hip. If lying on floor, raise other leg slightly off of floor.','Simultaneously change positions of legs, lowering and straightening raised leg down just above floor while raising and bending lower leg to opposite position. Continue alternating leg positions.','upload/exercise-picture/BWSimultaneousAlternatingLegRaises.gif'),(1167,'Vertical Leg Raise (on parallel bars)','Stand between parallel bars and grip bar on each side with overhand grip. Lift body off floor and balance body upright with arms straight.','Raise legs by flexing hips and knees until hips are completely flexed. Return until hips and knees are extended. Repeat.','upload/exercise-picture/BWVerticalLegRaisePB.gif'),(1168,'Vertical Leg Raise','Position forearms on padded parallel bars with hands on handles, and back on vertical pad.','Raise legs by flexing hips and knees until hips are completely flexed or knees are well above hips. Return until hips and knees are extended. Repeat.','upload/exercise-picture/BWVerticalLegRaise.gif'),(1169,'Lying Straight Leg Raise','Lie supine on bench or mat. Place hands under lower buttock on each side to support pelvis.','Keeping knees straight, raise legs by flexing hips until hips are completely flexed. Return until hips and knees are extended. Repeat.','upload/exercise-picture/BWLyingStraightLegRaise.gif'),(1170,'Seated Leg Raise','Sit on edge of bench with legs extended to floor. Place weight between ankles or use no weight. Grasp edge of bench. Lean torso back and balance body weight on edge of bench.','Raise legs by flexing hips and knees while pulling torso slightly forward to maintain balance. Return by extending hips and knees and lean torso back to counter balance. Repeat.','upload/exercise-picture/BWSeatedLegRaise.gif'),(1171,'Lying Scissor Kick','Lie supine on bench or mat. Place hands under lower buttock on each side to support pelvis. Raise one leg up vertical with knee nearly straight. If lying on floor, raise other leg slightly off of floor.','Keeping knees nearly straight, simultaneously change positions of legs so vertical leg is lowered while lower leg is raised vertically. Continue alternating leg positions.','upload/exercise-picture/BWScissorsKicks.gif'),(1172,'Lying Simultaneous Alternating Straight Leg Raise','Lie supine on bench or mat. Place hands under lower buttock on each side to support pelvis. Raise one leg up vertically with knee nearly straight. If lying on floor, raise other leg slightly off of floor.','Keeping knees nearly straight, simultaneously change positions of legs so vertical leg is lowered while lower leg is raised vertically. Continue alternating leg positions.','upload/exercise-picture/BWSimultaneousAltStraightLegRaise.gif'),(1173,'Lying Leg Raise (on floor)','Lie supine on mat or floor. Place hands under lower buttock on each side to support pelvis.','Raise legs by flexing hips and knees until thighs are completely flexed. Return until hips and knees are extended. Repeat.','upload/exercise-picture/BWLyingBentLegRaiseFloor.gif'),(1174,'Roman Chair Sit-up','Sit on chair or bench with lower leg secured under low over hang or heavy bar. Place hands on waist, chest, neck, or head depending upon desired difficulty.','Lower body back until hips are almost extended. Raise body by flexing hips until torso is upright. Repeat.','upload/exercise-picture/BWRomanChairBench.gif'),(1175,'Vertical Straight Leg Raise','Position forearms on padded parallel bars with hands on handles, and back on vertical pad.','With knees straight, raise legs by flexing hips until thighs are just pass parallel to floor. Return until hips are extended. Repeat.','upload/exercise-picture/BWVerticalStraightLegRaise.gif'),(1176,'Jack-knife on Ball','Kneel with chest or waist on exercise ball. Dive over top and place hands on floor with arms extended down supporting upper body. While keeping body horizontal, walk hands further away from ball until shins are positioned on top of ball. With arms vertical and straight, support body off of floor with body straight. See suggested mount onto exercise ball.','Bend hips and knees, allowing shins to roll over top of ball. Pull knees toward chest until heels are under or near glutes. Return by extending hips and knees to original position. Repeat.','upload/exercise-picture/BWJackKnifeBall.gif'),(1177,'Pike on Power Wheel','With feet strapped to power wheel, kneel on floor. Place hands shoulder width apart on floor. With arms vertical and straight, support body off of floor while rolling power wheel back until body is straight.','From plank position, raise rear end up as high as possible by bending hips. Pull power wheel toward hands while keeping knees straight. Return by extending hips to original position.\n\n\nRepeat.','upload/exercise-picture/BWWheelPike.gif'),(1178,'Pike on Discs','Kneel on floor with forefeet on gliding discs. Place hands shoulder width apart on floor. With arms vertical and straight, support body off of floor while sliding gliding discs back until body is straight.','From plank position, raise rear end up as high as possible by bending hips. Pull gliding discs toward hands while keeping knees straight. Return by extending hips to original position. Repeat.','upload/exercise-picture/BWDiscPike.gif'),(1179,'Jack-knife on Power Wheel','With feet strapped to power wheel, kneel on floor. Place hands shoulder width apart on floor. With arms vertical and straight, support body off of floor while rolling power wheel back until body is straight.','Bend hips and knees, pulling legs under body. Pull bent knees toward chest, allowing rear end to raise upward. Return by extending hips and knees to original position. Repeat.','upload/exercise-picture/BWWheelJackknife.gif'),(1181,'Kneeling Hip Flexor Stretch','Lunge forward with knee on padded mat. Position foot beyond forward knee. Place hands on knee.','Straighten hip of rear leg by pushing hips forward. Hold stretch. Repeat with opposite side.','upload/exercise-picture/5dec96831a3cb85fb04c2c192e699f8c.jpg'),(1182,'Lunging Hip Flexor Stretch','Lunge with one foot far behind other foot.','Squat down with chest high, straightening hip of rear leg by pushing hips down and forward. Hold stretch. Repeat with opposite side.','upload/exercise-picture/7e0821bc06976b844c669e3e4c5a5b8f.jpg'),(1183,'Bent-over Lunging Hip Flexor Stretch','Kneel down and position one leg extended behind. Balancing with hands positioned on floor to sides. Rear knee is extended off floor. Body weight is supported on both forefeet.','Straighten hip of rear leg by pushing hips down and forward. Hold stretch. Repeat with opposite side.','upload/exercise-picture/96a7d17ea46181c828f7be181175434e.jpg'),(1184,'Suspended Mountain Climber','Sit on floor facing suspension trainer loops in low position. Place right foot in left lower loop. Cross left leg over right leg placed in right lower loop. Turn body to right and place hands on floor, shoulder width apart. Turn body to kneel on hands and knees. Reposition hands (shoulder width or slightly wider) at desired distance from suspension trainer so that body is square with suspension trainer straps. With arms straight, raise knees from ground so body is supported by arms and suspension trainer. Bend one leg so knee is pointing down while keeping other leg extended out straight.','Simultaneously alternate leg positions by straightening bent leg behind, while bending straight leg forward. Repeat.','upload/exercise-picture/STMountainClimber.gif'),(1185,'Lever Hip Flexor Stretch','Flip seat all way back. Stand facing bar with supporting foot slightly forward under, or near apparatus. Grasp handle bars for support. Place top of other foot back on top edge of shin pad.','Squat down with back straight while straightening hip of rear leg by pushing hips forward. Hold stretch. Repeat with opposite side.','upload/exercise-picture/PCHipFlexors8.gif'),(1186,'Suspended Pike','Sit on floor facing suspension trainer loops in low position. Place right foot in left lower loop. Cross left leg over right leg placed in right lower loop. Turn body to right and place hands on floor shoulder width apart. Turn body to kneel on hands and knees. Reposition hands (shoulder width or slightly wider) at desired distance from suspension trainer so that body is square with suspension trainer straps. With arms straight, raise knees from ground, so body is supported by arms and suspension trainer.','Raise rear end up as high as possible by bending hips. Pull feet toward hands, while keeping knees straight. Return by extending hips to original straight body position. Repeat.','upload/exercise-picture/STPike.gif'),(1190,'Standing Hip Flexor Stretch','Stand facing bench or elevated platform, approximately legs length away. Place one foot on bench or platform.','Slowly lunge forward by bending forward leg. With chest high, straighten hip of rear leg by pushing hips forward. Hold stretch. Repeat with opposite side.','upload/exercise-picture/99a9392130283de0ac595065ad21a3f0.jpg'),(1191,'Sled Kneeling Hip Flexor Stretch','Straddle machine and grasp handles for support. Place foot on lower platform under podium and other lower leg on padded support behind.','Squeeze release grips and slide padded leg support back until mild stretch is felt. Hold stretch. Repeat with opposite side.','upload/exercise-picture/1acff9d0c5a6577673d144f23b4eb36e.jpg'),(1192,'Lying Hip Flexor Stretch','Lie on tall bench with thigh hanging down off end or side of bench. Raise opposite thigh toward side of torso. Hook hand around inside of upper thigh. Grasp elbow with opposite hand and keep arms close to body.','Allow lower thigh to drop toward floor. Hold stretch. Repeat with opposite side.','upload/exercise-picture/80b72e66f678fe1c106d3f51c422d3f3.jpg'),(1194,'Cable Seated Hip External Rotation','Sit on bench or chair with low pulley to side. Attach cable ankle cuff to ankle, nearest pulley. Place far stationary foot slightly forward. Grasp lower thigh of leg with attached cuff, position it along side thigh of stationary leg while keeping foot slightly above floo\n\n\nr.','Keeping knee of attached leg bent approximately 90°, pull cable attachment under thigh of stationary leg by rotating hip. Return until slight stretch is felt in hip, then repeat. Place ankle cuff on opposite leg and continue facing opposite direction.','upload/exercise-picture/CBSeatedHipExternalRotation.gif'),(1195,'Lying Hip External Rotator Stretch','Lie on floor or mat and with one leg straight and other leg bent approximately 90 degrees out to side.','Lower bent knee beside straight leg. Hold stretch. Repeat with opposite side.','upload/exercise-picture/6814ad0e04c771d1ee315fbce56de8fa.jpg'),(1197,'PNF Lying Piriformis Stretch','Instruct participant to lie on floor or mat with legs bent. Stand near their feet facing them. Assist them crossing their thighs, placing outside of one knee close to top of their other knee. Bend over participant\'s hips, position their foot of closest bent leg on your chest or shoulder while grasping their lower leg, in addition to knee of opposite leg with other hand.','Push your bodyweight down on foot while pushing down on side of participant\'s knee. Hold stretch. Repeat with legs in opposite position.','upload/exercise-picture/c4ab7a481b05c4dc34fc5daa95e2f72d.jpg'),(1199,'Lever Piriformis Stretch','Sit on seat in forward position with lower leg on shin pad, feet on foot rest. Place hands through wrist straps. Hold upper bar with overhand grip, both hands left of center. Position left leg extended toward right center.','Push and lower seat back. Repeat with opposite leg.','upload/exercise-picture/PCPeriformis8.gif'),(1200,'Seated Piriformis Stretch','Sit on floor or mat, reclining back with support of both arms behind body, and feet on floor and knees bent approximately 90 degrees. Cross thighs by placing back of knee on thigh of other leg. Grasp lower leg.','Reposition hands forward with arms straight to place torso closer to legs. Hold stretch. Repeat with opposite leg.','upload/exercise-picture/c49b018ec1b80983d7d0e8c378f751d1.jpg'),(1201,'Cable Lying Hip External Rotation','Attach cable ankle cuff to ankle, nearest low pulley. Lie prone with legs slightly apart and knee of attached leg bent 90°. Adjust position of legs slightly away from cable pulley so slight stretch is felt in hip.','Keeping knee of attached leg bent approximately 90°, pull cable attachment toward opposite knee by rotating hip. Return until slight stretch is felt in hip, then repeat. Place ankle cuff on opposite leg and continue lying opposite direction.','upload/exercise-picture/CBLyingExternalHipRotation.gif'),(1202,'Seated Hip External Rotator Stretch','Sit on floor or mat and with one leg straight and other leg bent approximately 90 degrees out to side.','Lower bent knee beside straight leg. Hold stretch. Repeat with opposite side.','upload/exercise-picture/3bc2bfb10ed4b6ecdd493e2dacf3dcc4.jpg'),(1203,'Lying Piriformis Stretch','Lie on floor or mat with feet on floor and knees bent approximately 90 degrees. Cross thighs by lacing back of knee on thigh of other leg. Lift legs and hug both thighs locking both hands together behind knee of lower leg.','Pull leg toward torso. Hold stretch. Repeat with opposite leg.','upload/exercise-picture/eb19a49ba33c584eb6e916e0faf87d3b.jpg'),(1204,'Lying Piriformis Stretch (single leg)','Lie on floor or mat. Lift one leg and grasp ankle and knee with both hands.','Pull thigh toward torso while keeping knee over torso. Hold stretch. Repeat with opposite leg.','upload/exercise-picture/ff6c6e39d18091125b4ce72a9c98d2e9.jpg'),(1205,'Seated Piriformis Stretch (chair or bench)','Sit on chair of bench with feet on floor and knees bent approximately 90 degrees. Cross thighs by placing back of knee on thigh of other leg. Grasp lower leg.','Lean forward pulling body toward legs. Hold stretch. Repeat with opposite leg.','upload/exercise-picture/b1562667bd54d0e5b91470e22135b530.jpg'),(1206,'PNF Seated Piriformis Stretch','Instruct participant to sit on floor or mat, reclining back with support of both arms behind body, and feet on floor and knees bent. Have them cross their thighs by placing back of knee on thigh of other leg. Ask them position foot on floor closer to hip. Place your hands on back of participants shoulders or position your chest on participant\'s upper back and your hands under participant\'s lower thighs.','Push participant\'s torso toward legs. Hold stretch. Repeat with legs in opposite position.','upload/exercise-picture/cd0fa842e5cae16357d90b063855ba67.jpg'),(1211,'Barbell Side Split Squat','Place barbell on back of shoulders and grasp bar on each side. Stand with feet wide apart; foot of lead leg angled out to side.','Lower body toward side of angled foot by bending knee and hip of lead leg while keeping opposite leg only slightly bent. Return to original standing position by extending hip and knee of lead leg. Repeat.','upload/exercise-picture/BBSideSplitSquat.gif'),(1217,'Barbell Squat','From rack with barbell at upper chest height, position bar high on back of shoulders and grasp barbell to sides. Dismount bar from rack and stand with shoulder width stance.','Squat down by bending hips back while allowing knees to bend forward, keeping back straight and knees pointed same direction as feet. Descend until thighs are just past parallel to floor. Extend knees and hips until legs are straight. Return and repeat.','upload/exercise-picture/BBSquatHigh.gif'),(1237,'Cable Belt Half Squat','Place cable belt or dip belt around waist. Kneel before low pulley and attach it to cable. Stand on elevated platform with feet shoulder width or slightly wider on platform between very low and close pulley cables. Place hand(s) on ballet bar or machine (not on guide rod!) for balance.','Squat down by bending hips back while allowing knees to bend forward, keeping back straight and knees pointed same direction as feet. Descend until weight stack taps or comes very close from making contact. Keeping chest high and back straight, raise back up by extending knees and hips until legs are straight. Repeat.','upload/exercise-picture/CBThreeQuarterSquat.gif'),(1239,'Cable Standing Leg Extension','Stand facing away from low pulley. Place foot in cable boot attachment (as shown) or foot harness. Grasp lateral bars or other prop for support. Stand forward on free leg. Raise knee up positioning thigh approximately 45° forward. Allow lower leg attached to cable to be pulled back.','Keeping thigh stationary, extend lower leg forward until leg is straight. Return by lowering lower leg down and back to original position. Repeat.','upload/exercise-picture/CBStandingLegExtension.gif'),(1243,'Cable Step Down','Grasp cable stirrup(s) with both hands. Place one foot on elevated platform positioned near or between low pulleys.','Raise body by extending knee and hip on platform until leg is straight. Return until foot of lower leg makes contact with lower platform or floor and repeat. Continue with opposite leg.','upload/exercise-picture/CBStepDown.gif'),(1249,'Lever Leg Extension (plate loaded)','Sit on apparatus with back against padded back support. Place front of lower legs under padded lever. Position knee articulation at same axis as lever fulcrum. Grasp handles to sides for support.','Move lever forward and upward by extending knees until legs are straight. Return lever to original position by bending knees. Repeat.','upload/exercise-picture/LVLegExtensionH.gif'),(1254,'Lever Alternating Leg Extension (plate loaded)','Sit on apparatus with back against padded back support. Place front of lower legs under padded lever. Position knee articulation at same axis as lever fulcrum. Grasp handles to sides for support.','Move one lever forward and upward by extending one knee until leg is straight. Lower to original position. Repeat with opposite side. Continue to alternate between sides.','upload/exercise-picture/LVAlternatingLegExtensionPL.gif'),(1262,'Lever Single Leg Standing Leg Press (plate loaded)','Step on left platform with left foot. Grasp handle bars to each side. Place right foot on highest lever platform.','Push platform down by extending hip and knee until straight. Return leg to original position. Repeat. Continue with opposite leg positions.','upload/exercise-picture/LVStandingSingleLegPress.gif'),(1271,'Lever Front Squat (plate loaded)','Step onto platform facing padded levers. Squat down to place shoulders under padded lever. Place feet shoulder width apart on platform. Extend knees and hips until legs are straight. Release support lever if it does not disengage by itself.','Lower lever by bending hips back while allowing knees to bend forward, keeping back straight and knees pointed same direction as feet. Descend until thighs are just past parallel to floor. Lift lever up by extending knees and hips until legs are straight. Repeat.','upload/exercise-picture/LVFrontSquat.gif'),(1279,'Lever Alternating Leg Extension','Sit on apparatus with back against padded back support. Place front of lower legs under padded lever. Position knee articulation at same axis as lever fulcrum. Grasp handles to sides for support.','Move lever forward and upward by extending one knee until leg is straight. Lower to original position. Repeat with opposite leg. Continue to alternate between sides.','upload/exercise-picture/LVAlternatingLegExtension.gif'),(1281,'Lever Alternating Leg Extension (unilateral machine)','Sit on apparatus with back against padded back support. Place front of lower legs under padded levers. Position knee articulation at same axis as lever fulcrum. Grasp handles to sides for support.','Move one lever forward and upward by extending one knee until leg is straight. Lower to original position. Repeat with opposite side. Continue to alternate between sides.','upload/exercise-picture/LVAlternatingLegExtensionUnilateral.gif'),(1285,'Lever Leg Extension','Sit on apparatus with back against padded back support. Place front of lower legs under padded lever. Position knee articulation at same axis as lever fulcrum. Grasp handles to sides for support.','Move lever forward and upward by extending knees until legs are straight. Return lever to original position by bending knees. Repeat.','upload/exercise-picture/LVLegExtension.gif'),(1286,'Lever Alternating Lying Leg Press','Lie on machine with shoulder under pads. Place feet on individual lever platforms. Grasp handles to sides. Push both lever platforms away by extending knees and hips so knees are straight.','Lower one lever platform toward body by bending knee and hip until weight taps or nearly taps unused portion of weight stack. Push lever platform away by extending knee and hip. Repeat with opposite leg. Continue by alternating between sides.','upload/exercise-picture/LVAlternatingLyingLegPressN.gif'),(1289,'Sled Hack Press (plate loaded)','Sit on sled with back of hips against back pad. Place feet on platform shoulder width or slightly wider. Extend hips and knees. Release dock lever(s).','Lower sled by flexing hips and knees until either is near complete flexion. Raise sled by extending knees and hips. Repeat.','upload/exercise-picture/SLSeatedHackPress.gif'),(1309,'Smith Step Down','Position smith bar upper chest height with platform under\nbar off to one side. Positioned shoulders under bar and one foot\non platform with other leg extended slightly forward on floor.','Raise bar upward by straightening leg and pushing body upward.\nLower body downward by returning foot off of bench to floor and\nrepeat. Continue with opposite position.','upload/exercise-picture/SMStepDownQuad.gif'),(1317,'Weighted Sissy Squat','With shoulder width stance, grasp fixed bar or support at hip level with one arm and secure plate across chest with other arm.','With hips and waist straight, bend knees to allow body to fall backwards as knees come forward. Allow heels to raise from floor. Lower body until knees are almost fully flexed or near floor. Return to original position by extending knees as heels return to floor.','upload/exercise-picture/WTSissySquat.gif'),(1323,'Weighted Sissy Squat (on apparatus)','Place feet under lower padded bar with calves against upper pads. Secure weight plate high on chest with both arms.','Allow body to fall backwards by bending knees. During descent, gradually bend hips, yet keep chest high and don\'t allow torso to angle forward. Lower body until back of thigh is against upper pad. Rise to original position by extending knees and hips while keeping shoulders behind hips. Repeat.','upload/exercise-picture/WTSissySquatAp.gif'),(1324,'Sissy Squat','With shoulder width stance, grasp fixed bar or support at hip level with one arm.','With hips and waist straight, bend knees to allow body to fall backwards as knees come forward. Allow heels to raise from floor. Lower body until knees are almost fully flexed or near floor. Return to original position by extending knees as heels return to floor.','upload/exercise-picture/BWSissySquat.gif'),(1329,'Sissy Squat (on apparatus)','Place feet under lower padded bar with calves against upper pads. Cross arms and touch shoulders or place arms out straight in front of shoulders.','Allow body to fall backwards by bending knees. During descent, gradually bend hips, yet keep chest high and don\'t allow torso to angle forward. Lower body until back of thigh is against upper pad. Rise to original position by extending knees and hips while keeping shoulders behind hips. Repeat.','upload/exercise-picture/SissySquatAp.gif'),(1332,'Alternating Step Down','Stand on bench or narrow platform, with feet side by side.','Step down with first foot to side of elevated surface onto floor. Stand back up on elevated surface by straightening upper leg and pushing body upward. Place foot to original position, next to opposite foot. Step down and back up with opposite leg in same manner. Repeat by alternating between sides.','upload/exercise-picture/BWAlternatingStepDown.gif'),(1466,'Kneeling Quadriceps Stretch','Kneel with knee on padded mat and other foot positioned forward. Place hands on knee. Grasp other hand under top of foot.','Drive hip forward and pull foot toward rear end. Hold stretch. Repeat with opposite side.','upload/exercise-picture/59c68250d668fa021bf4756f0d834455.jpg'),(1467,'PNF Lying (prone) Quadriceps Stretch','Instruct participant to lie prone on mat or floor. Straddle participant facing toward feet. Knee beside participant with leg extended over or just above participant\'s hips. Bend participant\'s near knee and place hand under participant\'s upper leg and opposite hand on ankle.','Lift knee and push ankle down toward hip. Hold stretch. Repeat with opposite side.','upload/exercise-picture/f5d0adea1ef2e6f57ffb075662e5b805.jpg'),(1468,'Lying (prone) Quadriceps Stretch','Lie prone on mat or floor. Grasp top ankle or forefoot behind.','Pull ankle or forefoot to rear end. Hold stretch. Repeat with opposite side.','upload/exercise-picture/8650332bac4a78ee12233f7f381967a7.jpg'),(1469,'Lever Quadriceps Stretch','Flip seat all way back. Stand facing bar with supporting foot slightly forward under, or near apparatus. Grasp handle bars for support. Place top of other foot back on top edge of shin pad.','Squat down with back straight and chest up while positioning hip straight close to back of heel. Hold stretch. Repeat with opposite side.','upload/exercise-picture/PCQuadriceps8.gif'),(1470,'Standing Quadriceps Stretch (towel)','With foot on bench or floor place towel around ankle. Grasp both ends of towel behind ankle with closest hand. Stand on opposite leg and touch wall or stationary object with other arm for balance. Pull foot to rear end with towel.','Straighten hip by moving knee backward. Hold stretch. Repeat with opposite side.','upload/exercise-picture/2bfdf923775985d2c43a391f4974ac29.jpg'),(1471,'Standing Quadriceps Stretch','Stand and touch wall or stationary object for balance. Grasp top ankle or forefoot behind. Pull ankle or forefoot to rear end.','Straighten hip by moving knee backward. Hold stretch. Repeat with opposite side.','upload/exercise-picture/9e704875a65e1a3cec886b2d49e7212b.jpg'),(1472,'Lying (side) Quadriceps Stretch','Lie on one side. Grasp top ankle or forefoot behind. Pull ankle or forefoot to rear end.','Straighten hip by moving knee backward. Hold stretch. Repeat with opposite side.','upload/exercise-picture/98c53b178d92d5e8dd7f7f0de119bc49.jpg'),(1473,'Standing Quadriceps Stretch (on apparatus)','Stand facing away from adjustable shelf, hip to upper thigh height. Grasp support for balance. With assistance from other hand, bend over slightly and place foot on shelf behind hip. Grasp supports with both hands and stand upright.','Bend supporting knee slightly while driving hip back closer to heel. Hold stretch. Repeat with opposite side.','upload/exercise-picture/ad26b1a7a309d91749d8a2a408dc3bf0.jpg'),(1474,'Walking Quadriceps Stretch','Stand and step forward with left foot.','Standing on left foot, position right foot behind and grasp it with right hand. Pull right heel toward right glute while pulling right knee down and back. Release right foot, step forward with right foot, and repeat on left side while standing on right foot. Continue by alternating between each side until specific distance is covered or desired number of repetitions have been completed.','upload/exercise-picture/WalkingQuadStretch.gif'),(1476,'Barbell Good-morning','Position barbell on back of shoulders and grasp bar to sides.','Keeping back straight, bend hips to lower torso forward until parallel to floor. Raise torso until hips are extended. Repeat.','upload/exercise-picture/BBGoodMorning.gif'),(1478,'Barbell Back Raise (on hyperextension apparatus)','Stand in hyper-extension apparatus. Position thighs prone on large pad and lower leg under padded bar. Place barbell on back of shoulders and grasp bar to sides.','Lower body by bending hips until fully flexed. Raise, or extend hips until torso is parallel to legs. Repeat.','upload/exercise-picture/BBHipExtention.gif'),(1479,'Barbell Straight-back Straight-leg Deadlift','Grasp barbell from rack or deadlift from floor with shoulder width or slightly wider overhand or mixed grip. Stand with shoulder width or narrower stance.','With knees and back straight, lower bar by bending hips until hamstrings are tight, or just before lower back bends. Lift bar by extending hips until upright. Pull shoulders slightly back at top of lift if rounded. Repeat.','upload/exercise-picture/BBStraightBackStraightLegDeadlift.gif'),(1480,'Trap Bar Straight-back Straight-leg Deadlift','Stand with feet shoulder width or narrower in trap bar, weight to each side. Squat down with feet flat and grasp handles to sides. Deadlift from floor.','With knees and back straight, lower bar by bending hips until hamstrings are tight, or just before lower back bends. Lift bar by extending hips until upright. Pull shoulders slightly back at top of lift if rounded. Repeat.','upload/exercise-picture/TBStrtBackStrtLegDeadlift.gif'),(1481,'Barbell Glute-Ham Raise','Place ankles between ankle roller pads with feet on vertical platform and position knees on pad with lower thighs against large padded hump. If barbell can safely be placed on horizontal handles, grasp barbell in upright position and place behind shoulders. If barbell is placed on floor, lower torso by extending knees and flexing hips, then position barbell on back of shoulders. Grasp bar to sides.','From lower position, raise torso by extending hips until fully extended. Continue to raise body by flexing knees until body is upright. Lower body by straightening knees until body is horizontal. Continue to lower torso by bending hips until body is upside down. Repeat.','upload/exercise-picture/BBGluteHamRaise.gif'),(1483,'Barbell Inverse Leg Curl','Adjust padded supports and kneel upright in apparatus. Position knees against large roller pad or near-upper side of padded hump, ankles between padded supports, and feet on platform. Place barbell on back of shoulders and grasp bar to sides.','Lower body until horizontal by straightening knees. Raise body by flexing knees only allowing hips to bend slightly. Repeat.','upload/exercise-picture/BBHamRaise.gif'),(1485,'Barbell 45° Back Raise (on hyperextension apparatus)','Position thighs prone on upper padding of 45-degree hyper-extension apparatus. Hook heels on platform lip or under padded brace. Place barbell on back of shoulders and grasp bar to sides.','Lower body by bending hips until fully flexed. Raise or extend hips until torso is parallel to legs. Repeat.','upload/exercise-picture/BBHipExtension.gif'),(1486,'Cable Straight-back Straight-leg Deadlift','Stand between two very low pulleys with shoulder width or narrower stance. Squat down and grasp stirrup attachments to each side. Stand upright with arms straight down to sides.','With knees and back straight, bow forward by bending hips until hamstrings are tight, or just before lower back bends. Raise body upright by extending hips until standing. Pull shoulders back slightly at top of lift if rounded. Repeat.','upload/exercise-picture/CBStraightBackStraightLegDeadlift.gif'),(1487,'Cable Lying Leg Curl','Attach two ankle cuffs to low pulley attachment. With cuffs on both ankles lie prone on flat bench with knees just beyond edge of bench. Grip under side or base of bench for support.','Raise ankles to glutes by flexing knees. Lower ankles until knees are straight. Repeat.','upload/exercise-picture/CBLyingLegCurl.gif'),(1489,'Cable Bent-over Leg Curl','Attach ankle cuff to low pulley. With cuff on one ankle, grasp ballet bar with both hands and step far back with other foot. Elbows remain straight to support body leaning forward. Attached foot is stretched off floor.','Pull cable attachment back and up slightly by flexing knee. Raise knee slightly by flexing hip until knee is fully flexed. Return by straightening knee and lowering knee slightly to original position. Repeat. Continue with opposite leg.','upload/exercise-picture/CBBentOverLegCurl.gif'),(1491,'Lever Kneeling Leg Curl (plate loaded)','Mount machine by placing supporting knee on horizontal pad and other leg under roller pad with knee against vertical pad. Grip handles and place forearm on padded arm rest.','Raise ankle to back of thigh by flexing knee. Lower ankle until knee is straight. Repeat. Continue with opposite leg.','upload/exercise-picture/LVKneelingLegCurlH.gif'),(1492,'Cable Standing Leg Curl','Attach foot harness to low pulley. With foot harness on one ankle, grasp support bar with both hands and step back with other foot. Elbows remain straight to support body. Attached foot is slightly off floor.','Pull cable attachment back by flexing knee until knee is fully flexed. Return by straightening knee to original position and repeat. Continue with opposite leg.','upload/exercise-picture/CBStandingLegCurl.gif'),(1493,'Dumbbell Straight-back Straight-leg Deadlift','Stand with shoulder width or narrower stance. Grasp dumbbells to each side.','With knees straight, lower dumbbells by bending hips until hamstrings are tight, or just before lower back bends. Lift dumbbells by extending hips until straight. Pull shoulders back slightly at top of lift if rounded. Repeat.','upload/exercise-picture/DBStraightBackStraightLegDeadlift.gif'),(1494,'Lever Lying Leg Curl (plate loaded)','Facing bench, stand between bench and lever pads. Lie prone on bench with knees just beyond edge of bench and lower legs under lever pads. Grasp handles.','Raise lever pad to back of thighs by flexing knees. Lower lever pads until knees are straight. Repeat.','upload/exercise-picture/LVLyingLegCurlH.gif'),(1495,'Lever Alternating Lying Leg Curl (plate loaded)','Facing bench, stand between bench and lever pads. Lie prone on bench with knees just beyond edge of bench and lower legs under lever pads. Grasp handles.','Raise one lever pad to back of thigh by flexing knee. Lower lever pad until knee is straight. Raise and lower other leg pad. Continue by alternating legs.','upload/exercise-picture/LVAlternatingLyingLegCurlH.gif'),(1496,'Lever Bent-over Leg Curl','Stand in machine with lower pads behind lower legs, upper pads in front of thighs, and lever fulcrum between knees. Bend over, placing forearms on pads, and grasp handles. Stand with body weight shifted on foot of resting leg and raise foot of exercising leg slightly off of floor or platform.','Raise lever up by bending knee as high as possible. Return lever until knee is straight. Repeat. Continue with opposite leg.','upload/exercise-picture/LVBentOverLegCurl.gif'),(1497,'Lever Lying Leg Curl (on reverse hyper-extension machine, plate loaded)','Place lower legs between pads with feet on bar. Lay torso and waist on bench and grasp handles.','Raise lever back and up by flexing knees. Lower lever until knees are straight. Repeat.','upload/exercise-picture/LVLyingLegCurlRevHyperMachPL.gif'),(1499,'Lever Straight-back Straight-leg Deadlift (plate loaded)','Stand between lever handles with shoulder width or narrower stance. Squat down and grasp handles to each side. Stand upright with arms straight down to sides.','With knees and back straight, bow forward by bending hips until hamstrings are tight, or just before lower back bends. Raise body upright by extending hips until standing. Pull shoulders back slightly at top of lift if rounded. Repeat.','upload/exercise-picture/LVStraightBackStraightLegDeadlift.gif'),(1500,'Lever Seated Leg Curl (plate loaded)','Sit on apparatus with back against padded back support. Push hand lever to lower leg pads. Place legs in between pads. Release hand lever gradually. Grasp handles to sides with each hand.','Pull lever to back of thighs by flexing knees. Return lever until knees are straight. Repeat.','upload/exercise-picture/LVSeatedLegCurlH.gif'),(1501,'Lever Single Leg Seated Leg Curl (plate loaded)','Sit on seat with back against padded back support. Push hand lever to lower leg pads. Place one leg in between pads. Place other leg on top of upper most pad bar. Release hand lever gradually. Grasp handles to sides with each hand.','Pull padded lever to back of thighs as far as possible by flexing knee. Return padded lever until knee is straight. Change legs and repeat for opposite leg.','upload/exercise-picture/LVSingleLegSeatedLegCurlH.gif'),(1502,'Lever Alternating Bent-over Leg Curl','Stand in machine with lower pads behind lower legs, upper pads in front of thighs, and lever fulcrum between knees. Bend over, placing forearms on pads, and grasp handles.','Raise left foot slightly off of floor or platform. Raise lever up with left leg, bending knee as high as possible. Return lever until knee is straight. Shift body weight to left foot and raise right foot slightly off of floor or platform. Raise lever up with right leg, bending knee as high as possible. Continue alternating movement between legs.','upload/exercise-picture/LVAlternatingBentoverLegCurl.gif'),(1503,'Lever Kneeling Leg Curl','Mount machine by placing supporting knee on horizontal pad and other leg under roller pad with knee against vertical pad. Grip handles and place forearm on padded arm rest.','Raise ankle to back of thigh by flexing knee. Lower ankle until knee is straight. Repeat. Continue with opposite leg.','upload/exercise-picture/LVKneelingLegCurl.gif'),(1504,'Lever Lying Leg Curl','Facing bench, stand between bench and lever pads. Lie prone on bench with knees just beyond edge of bench and lower legs under lever pads. Grasp handles.','Raise lever pad to back of thighs by flexing knees. Lower lever pads until knees are straight. Repeat.','upload/exercise-picture/LVLyingLegCurl.gif'),(1505,'Lever Alternating Lying Leg Curl','Facing bench, stand between bench and lever pads. Lie prone on bench with knees just beyond edge of bench and lower legs under lever pads. Grasp handles.','Raise lever pad to back of thighs by flexing one knee. Lower lever pads until knee is straight and repeat with opposite leg. Continue to alternate between sides.','upload/exercise-picture/LVAlternatingLegCurl.gif'),(1506,'Lever Alternating Standing Leg Curl','Stand in machine with lower pads behind lower legs, upper pads in front of thighs, and lever fulcrum between knees. Bend over and grasp handles for support if available.','Raise left foot slightly off of floor or platform. Raise lever up with left leg, bending knee as high as possible. Return lever until knee is straight. Shift body weight to left foot and raise right foot slightly off of floor or platform. Raise lever up with right leg, bending knee as high as possible. Continue alternating movement between legs.','upload/exercise-picture/LVAlternatingStandingLegCurl.gif'),(1507,'Lever Standing Leg Curl (on leg extension)','Place platform to one side of padded lever. Have additional padded board in hand. Facing machine, stand to one side of padded roller. Place far leg on elevated platform. Position closest leg into apparatus by placing back of lower leg against lever roller. Place extra padded board between knee and edge of seat. Position knee forward securely against padded board and edge of seat. Bend over seat by bending hips and support torso with arms.','Pull lever to back of thigh by flexing knee. Return lever until knee is straight. Repeat. Continue with opposite leg.','upload/exercise-picture/LVStandingLegCurlonExt.gif'),(1508,'Lever Standing Leg Curl (on multi-hip machine)','Adjust platform to highest position or lever fulcrum to lowest position so fulcrum is at height of knee. If necessary, place extra elevation near end of platform to stand on, so knee is aligned with fulcrum. Adjust padded roller approximately 45° downward. Step on extra elevation facing padded roller. Place leg closest to lever over roller. Bend over at hips and grasp bar. Slightly extend hip to lower roller so knee maintains alignment with fulcrum.','Pull padded roller to glutes by flexing knee. Lower padded roller until knee is straight. Repeat. Reposition roller pad lever and continue with opposite leg.','upload/exercise-picture/LVStandingLegCurlHipMach.gif'),(1509,'Lever Seated Leg Curl','Sit on apparatus with back against padded back support. Place back of lower leg on top of padded lever. Secure lap pad against thigh just above knees. Grasp handles on lap support.','Pull lever to back of thighs by flexing knees. Return lever until knees are straight. Repeat.','upload/exercise-picture/LVSeatedLegCurl.gif'),(1510,'Lever Standing Leg Curl','Stand in machine with one or both legs between pads depending upon machine\'s design. Position exercising leg with lever pad behind lower leg and upper pad in front of lower thigh. Bend over and grasp handles for support if available. Stand with body weight shifted on foot of resting leg and raise foot of exercising leg slightly off of floor or platform.','Pull lever up to back of thigh by flexing knee. Return lever until knee is straight. Repeat. Continue with opposite leg.','upload/exercise-picture/LVStandingLegCurl.gif'),(1511,'Smith Straight-back Straight-leg Deadlift','Stand with shoulder width or narrower stance with thigh against bar. Grasp bar with shoulder width or slightly wider overhand grip. Disengage bar by rotating bar back.','With knees and back straight, lower bar by bending hips until hamstrings are tight, or just before lower back bends. Lift bar by extending hips until straight. Pull shoulders back slightly if rounded. Repeat.','upload/exercise-picture/SMStrtBackStrtLegDeadlift.gif'),(1512,'Smith Good-morning','Position bar on back of shoulders. Grasp bar to sides. Disengage bar by rotating bar back.','Bend hips to lower torso forward until parallel to floor. Raise torso until hips are extended. Repeat.','upload/exercise-picture/SMGoodmorning.gif'),(1514,'Lever Straight-leg Lying Hip Extension','Lie on bench and place back of lower legs against leg pad. Position hips in line with fulcrum. Grasp bottom sides of bench to keep body from moving under resistance.','With knees straight, extend lever downward until hips are extended. Return lever to upright position without allowing back of hips to raise up off of bench. Repeat.','upload/exercise-picture/LVStraightLegLyingHipExtension.gif'),(1516,'Weighted 45° Back Raise (on hyperextension apparatus)','Position thighs prone on padding of 45-degree hyper-extension apparatus. Hook heels on platform lip or under padded brace. Hold weight to chest or behind neck.','Lower body by bending hips until fully flexed. Raise or extend hips until torso is parallel to legs. Repeat.','upload/exercise-picture/WTHipExtension.gif'),(1518,'Weighted Back Raise (on hyperextension apparatus)','Stand in hyper-extension apparatus. Position thighs prone on large pad and lower leg under padded bar. Hold weight to chest or behind neck.','Lower body by bending hips until fully flexed. Raise or extend hips until torso is parallel to legs. Repeat.','upload/exercise-picture/WTHipExtension2.gif'),(1519,'Weighted Inverse Leg Curl','Adjust padded supports and kneel upright in apparatus. Position knees against large roller pad or near-upper side of padded hump, ankles between padded supports, and feet on platform. Hold weight to chest or behind neck.','Lower body until horizontal by straightening knees. Raise body by flexing knees, only allowing hips to bend slightly. Repeat.','upload/exercise-picture/WTHamRaise.gif'),(1520,'Single Leg Hanging Hamstring Bridge','Stand behind bar facing elevated platform positioned slightly away on other side of bar. Grasp bar with slightly wider than shoulder width grip. Walk body under bar. Position back of heel on elevated platform. Place other foot on or just over floor so leg is bent. Hang under bar with arms straight and hips bent just above floor.','Raise hips up as high as possible by extending hip and spine. Maintain bent position of lower leg allowing it to rise with hips. Lower hips along with bent lower leg to original position and repeat. Continue with legs in opposite position.','upload/exercise-picture/BWSingleLegHangingHamstringBridge.gif'),(1521,'Hanging Hamstring Bridge','Stand behind bar facing elevated platform positioned slightly away on other side of bar. Grasp bar with slightly wider than shoulder width grip. Walk body under bar and position back of heels on elevated platform. With legs extended forward, hang under bar with arms straight and hips bent just above floor.','Raise hips up as high as possible by extending hips. Lower hips to original position just above floor. Repeat.','upload/exercise-picture/BWHangingHamstringBridge.gif'),(1522,'Hanging Straight Hip Leg Curl','Lay supine under fixed horizontal bar. Grasp bar with wide overhand grip. Straighten and raise body off of floor keeping heels on floor.','Pull body toward feet by bending knees while keeping hips straight. Roll onto feet until knees are fully flexed. Return body to original position by extending knees. Repeat.','upload/exercise-picture/BWHangingStraightHipLegCurl.gif'),(1523,'Leg Curl (on stability ball)','Lie supine on floor with lower legs on exercise ball. Extended arms out to sides. Straighten low back, knees, and hips, raising back and hips off of floor.','Keeping hips and low back straight, bend knees, pulling heels toward rear end. Allow feet to rollup on to ball. Lower to original position by straightening knees. Repeat.','upload/exercise-picture/BWBallLegCurl.gif'),(1524,'Leg Curl (on power wheel)','Lie supine on floor with feet strapped onto power wheel. Extended arms out to sides. Straighten knees and hips.','Keeping hips and low back straight, bend knees, pulling heels toward rear end. Raise up until lower legs are vertical. Lower to original position by straightening knees. Repeat.','upload/exercise-picture/BWWheelLegCurl.gif'),(1525,'Inverse Leg Curl','Adjust padded supports and kneel upright in apparatus. Position knees on near-upper side of padded hump, ankles between padded supports, and feet on platform. Place arms behind back, across chest, or bent beside head depending on desired intensity.','Lower body until horizontal by straightening knees. Raise body by flexing knees only allowing hips to bend slightly. Repeat.','upload/exercise-picture/BWHamRaise.gif'),(1526,'Hanging Leg Curl','Lay supine under fixed horizontal bar. Grasp bar with wide overhand grip. Straighten and raise body off of floor keeping heels on floor.','Pull body toward feet by bending knees and hips. Roll onto feet until knees are fully flexed. Return body to original position by extending knees and hips. Repeat.','upload/exercise-picture/BWHangingLegCurl.gif'),(1527,'Self-assisted Inverse Leg Curl (on floor)','Kneel on floor. Position ankles under fixed bar or pad and knees on thick dense pad. Kneel upright with hips straight. Extend arms out to sides with elbow pointing back and slightly bent. Position hands slightly forward with palms facing forward or slightly toward floor.','Lower body with hips straight by slowly straightening knees. Control descent only with hamstrings as low as possible. Only when body begins to fall, touch down with tensed finger tips out to each side. Once fingers make contact with floor, control remaining descent with assistance of arms. Allowing chest to come very close to floor, rapidly push off against floor, again just enough to assist hamstrings in raising body upward. Return to upright kneeling position and repeat.','upload/exercise-picture/AsHamstringRaise.gif'),(1528,'Self-assisted Inverse Leg Curl','Place elevated platform in front of glute-hamstring apparatus. Adjust padded supports and kneel upright in apparatus. Position knees against large roller pad or near-upper side of padded hump (depending on model), ankles between padded supports, and feet on platform.','Lower body with hips straight by slowly straightening knees. Position hands forward, ready to push body weight back up off of surface. Control descent only with hamstrings as low as possible before catching body by quickly placing hands on elevated platform and rapidly pushing off against platform, just enough to assist hamstrings in raising body upward. Return to upright kneeling position and repeat.','upload/exercise-picture/ASHamstringRaiseSelf.gif'),(1530,'Suspended Hanging Leg Curl','Lay supine under suspension trainer and grasp handles. Straighten and raise body off of floor keeping heels on floor.','Pull body toward feet by bending knees and hips. Roll onto feet until knees are fully flexed. Return body to original position by extending knees and hips. Repeat.','upload/exercise-picture/STHangingLegCurl.gif'),(1531,'Suspended Hanging Straight Hip Leg Curl','Lay supine under suspension trainer and grasp handles. Straighten and raise body off of floor keeping heels on floor.','Pull body toward feet by bending knees while keeping hips and back straight. Roll onto feet until knees are fully flexed. Return body to original position by extending knees maintaining straight hip position. Repeat.','upload/exercise-picture/STHangingStraightHipLegCurl.gif'),(1532,'Suspended Straight Hip Leg Curl','Sit on floor facing suspension trainer loops in low position. Grasp bottom of loops, then lay supine. Raise legs and place heels in loops with soles contacting handles. Extend legs out and place arms on floor off to sides. Straighten low back, knees, and hips, raising back and hips off of floor.','Bend knees, pulling heels toward rear end while keeping hips and low back straight. Raise up until lower legs are vertical or fully flexed. Lower body to original position by straightening knees, maintaining straight hip position. Repeat.','upload/exercise-picture/STLegCurl.gif'),(1533,'Lying Hamstring Stretch','Lie on back and lift knee up. Grasp behind thigh near knee with both hands. Pull knee close to chest.','Extend knee while maintaining knee close to chest. Hold stretch. Repeat with opposite leg.','upload/exercise-picture/d343918f30680d3ba702ed5afa8e8f06.jpg'),(1534,'Lever Lying Hamstring Stretch','Lie on bench with leg on padded lever and foot against horizontal bar.','Pull release lever. Keeping knee straight, pull rail so leg rises upward until mild stretch is felt. Hold stretch. Repeat with opposite leg.','upload/exercise-picture/f2666aa2a800fc2fe6dc36dee892faf1.jpg'),(1535,'PNF Lying Hamstring Stretch','Instruct participant to lie on floor or mat. Kneel beside participant and extend participant\'s leg upward. Position back of participant\'s lower leg on nearest shoulder. Position near ankle on participant\'s opposite lower leg.','Push participant\'s leg close to participants chest. Place hands on floor with arms extended to control resistance. Repeat with opposite leg.','upload/exercise-picture/ad3b598f490e6b8b995cb1340055bfb4.jpg'),(1536,'Suspended Hamstring Runner','Sit on floor facing suspension trainer loops in low position. Grasp bottom of loops, then lay supine. Raise legs and place heels in loops with soles contacting handles. Extend one leg out straight, keep other leg bent so knee is pointing up. Place arms on floor off to sides. Lift low back and hips off of floor so one leg is straight with back and other leg bent, so foot of bent leg is close to knee of straight leg.','Simultaneously alternate leg positions by straightening bent leg while bending straight knee. Repeat.','upload/exercise-picture/STHamstringRunner2.gif'),(1537,'Suspended Leg Curl','Sit on floor facing suspension trainer loops in low position. Grasp bottom of loops, then lay supine. Raise legs and place heels in loops with soles contacting handles. Extend legs out and place arms on floor off to sides. Straighten low back, knees, and hips, raising back and hips off of floor.','Pull heels toward rear end by bending knees and hips simultaneously. Lower body to original position by straightening knees and hips. Repeat.','upload/exercise-picture/STHamstringCurl.gif'),(1538,'Lever Seated Hamstring Stretch','Sit on seat in forward position with lower leg on shin pad, feet on foot rest. Place hands through wrist straps. Hold lower bar with overhand grip.','Push and lower seat back. Hold stretch. Repeat with opposite leg.','upload/exercise-picture/PCHamstring8.gif'),(1539,'Seated Hamstring Stretch','Sit on floor or mat with knees straight.','Reach toward or beyond toes or bring torso toward legs. Hold stretch.','upload/exercise-picture/a422b3586f6873533c458303bf5eb3e4.jpg'),(1540,'Seated Hamstring Stretch (Chair)','Sit on edge of chair or exercise ball. Position heels on floor with knees straight.','Reach toward toes or bring torso toward legs. Hold stretch.','upload/exercise-picture/57dc517f31121e83c57b6105b4a2ed96.jpg'),(1541,'Seated Single Leg Hamstring Stretch','Sit on floor or mat with legs apart and knees straight.','Reach toward one foot or bring torso toward one leg. Hold stretch for 20 seconds. Repeat with opposite leg.','upload/exercise-picture/5b56995e644b0d712ba1b67b2f8db277.jpg'),(1542,'Lying Hamstring Stretch (towel)','Sit on mat or floor with knees bent. Position towel under middle of foot with hands grasping towel on both ends. Lie back and raise leg straight above maintaining grip on towel with both hands.','Pull leg back while keeping knee straight. Hold stretch. Repeat with opposite leg.','upload/exercise-picture/7dc8003e4a2f4d121769db944044da4e.jpg'),(1543,'PNF Seated Hamstring Stretch','Instruct participant to sit with knees straight on floor or mat. Kneel behind participant and position chest on participant\'s back. Place hands just above knees from each side.','Push participant\'s torso toward legs with chest while holding down knees. Hold stretch.','upload/exercise-picture/98bd050fcb0ea0c6998fb6de92b4d2e2.jpg'),(1544,'Lying Vertical Hamstring Stretch','Lie on floor with one leg extending up onto side of wall or column and other leg bent with foot on floor. One way this can be position can be achieved in a single motion is by sitting on floor with back of one shoulder against end of wall or column. Rotate body 90° onto back while swinging one leg up onto side of wall or column, ending up with back on floor and head positioned away from wall.','Straighten elevated knee until slight stretch is felt in back of thigh. If no stretch is felt, slowly straighten bent leg until slight stretch is felt in back of thigh. Hold stretch. Repeat with opposite leg on opposite side of wall or column.','upload/exercise-picture/LyingVerticalHamstringStretch.gif'),(1545,'Standing Hamstring Stretch','Stand and bend over with knees straight.','Reach toward toes or floor or bring torso toward legs. Hold stretch.','upload/exercise-picture/91a7ef2697a2704d3c1a7d86d33aa879.jpg'),(1546,'Seated Single Leg Hamstring Stretch (Bench)','Sit on bench. Place one leg on bench with knee straight.','Reach toward foot or bring torso toward leg on bench. Hold stretch. Repeat with opposite leg.','upload/exercise-picture/a2bc88ca82564c16bdc1bc7f5d1c5ec0.jpg'),(1547,'Seated Single Leg Hamstring Stretch (Chair)','Sit on edge of chair or exercise ball. Position heel on floor with knee straight.','Reach toward toe or bring torso toward leg. Hold stretch. Repeat with opposite leg.','upload/exercise-picture/ec248e61d0b6bbd886eeecbf4ef669b5.jpg'),(1548,'Standing Cross Leg Hamstring Stretch','Stand erect with legs crossed, outsides of feet together. Bend over with rear knee straight.','Reach toward feet or bring torso toward legs. Hold stretch. Repeat with opposite leg.','upload/exercise-picture/983c5c33d55888967b68cf2cb93db26c.jpg'),(1549,'Standing Single Leg Hamstring Stretch','Sand with on foot forward and rear foot pointing out. Bend over and brace torso by placing hand just above bent rear knee.','Lean down and bend rear knee further. Hold stretch. Repeat with opposite leg.','upload/exercise-picture/2165e6dfac69ea56cf98ac8a23b1ccd7.jpg'),(1550,'Standing Single Leg Hamstring Stretch (Bench)','Place foot on bench or elevation.','Reach toward foot on bench or bring torso toward leg. Hold stretch. Repeat with opposite leg.','upload/exercise-picture/f3a004d8d78c90f707422c91c7fefcf9.jpg'),(1551,'Soldier Kick','Stand and step forward with left foot.','Next step, extend left arm forward while swinging right leg up so foot touches or comes close to hand. Lower right leg. Repeat with same sequence on opposite side. Continue by alternating between each side until specific distance is covered or desired number of repetitions have been completed.','upload/exercise-picture/SoldierKick.gif'),(1552,'Soldier Kick (intermittent)','Stand and step forward with left foot.','Next step, extend left arm forward while swinging right leg up so foot touches or comes close to hand. Lower right leg, then take two steps, with left and right legs. Repeat with same sequence on opposite side. Continue by alternating between each side followed by double steps until specific distance is covered or desired number of repetitions have been completed.','upload/exercise-picture/SoldierKickIntermittent.gif'),(1553,'Lever Standing Hip Adduction','Adjust platform so lever fulcrum is same height as hip articulation. Adjust roller pad to side position. Face machine and grasp bars to sides. Place inside of thigh on roller pad and remain standing on supporting leg.','Move leg toward and across supporting leg Return and repeat. Reposition roller pad lever and continue with opposite leg.','upload/exercise-picture/LVStandingHipAdduction.gif'),(1554,'Lever Seated Hip Adduction','Sit in machine with legs outside of vertical center pads. If available, place heels on foot bars. Disengage and pull lever brace to position legs apart until slight stretch is felt. Engage lever into locked position. Lie back and grasp bars to sides.','Move legs together. Return and repeat.','upload/exercise-picture/LVSeatedHipAdduction.gif'),(1556,'Cable Lying Hip Adduction','Stand or sit in front of low pulley and attach cable cuff to ankle. Step away from pulley toward opposite pull, pulling weight plates up just far enough get next to opposite cable pulley. Attach other cable cuff to opposite ankle. Sit so hips are between both low pulley cables to each side. Lie down on back and lift legs up vertically.','Lower legs apart out to each side until stretch is felt in inner thigh. Raise legs together. Return and repeat.','upload/exercise-picture/CBLyingHipAdduction.gif'),(1557,'Lever Lying Hip Adduction','Sit in machine with legs outside of vertical center pads. If available, place heels on foot bars. Lie back on back pad. Disengage and pull lever brace to position legs apart until slight stretch is felt. Engage lever into locked position. Lie back and grasp bars to sides.','Move legs together. Return and repeat.','upload/exercise-picture/LVLyingAdduction.gif'),(1558,'Weighted Lying Hip Adduction','Sit on floor or mat with bar, weight plates loaded on one side. Sit on hip with knees bent and place bar on inside of shoe with weight plate beyond foot. Holding on to opposite end of bar, lie on side with weighted leg extended out straight and upper leg extended behind.','Raise weighted leg up off floor as high as possible while balanciong bar inside of foot and holding onto nearest side of bar. Return to floor and repeat. Repeat and continue with opposite leg.','upload/exercise-picture/WtLyingHipAdduction.gif'),(1559,'Lever Seated Hip Adduction (plate loaded)','Sit on seat and lift one leg onto padded lever. Lean back onto back pad. Grasp handles attatched to leg levers. Push handles together and raise other leg onto other padded lever. Release leg lever handles and grasp other handles to each side.','Move legs together until leg levers make contact. Allow legs to seperate far apart until slight stretch and repeat.','upload/exercise-picture/LVHipAdductionH.gif'),(1560,'Cable Hip Adduction','Stand in front of low pulley facing to one side. Attach cable cuff to near ankle. Step out away from stack with wide stance and grasp ballet bar. Stand on far foot and allow near leg to be Pulled toward low pulley.','Move near leg just in front of far leg by abduction hip. Return and repeat. Turn around and continue with opposite leg.','upload/exercise-picture/CBHipAdduction.gif'),(1564,'Lying Groin Stretch','Lie on floor or mat. Place soles of feet together on floor close to body with knees far apart.','Lower knees toward floor. Hold stretch.','upload/exercise-picture/e9193c7fc71f76f33a62c8b12d86ffa6.jpg'),(1565,'PNF Bent Leg Groin Stretch','Instruct participant to lie on floor or mat. Ask them to place soles of feet together on floor close to body with knees apart. Kneel close to participant and place hands on insides of participant\'s knees.','Spread participant\'s legs down to sides and hold stretch.','upload/exercise-picture/47cbe592bfdf56a5990239826ca76ad7.jpg'),(1566,'Kneeling Side Lunge Stretch','Kneel on floor or mat. Place one foot pointing out and somewhat perpendicular to opposite kneeling leg.','Shift upright body toward supporting foot. Hold stretch. Repeat on opposite leg.','upload/exercise-picture/d183ca3634ed1a15ce4e86750dc12769.jpg'),(1567,'Kneeling Groin Stretch','Kneel with feet pointed out to sides. Place forearms and hands on floor.','Spread knees apart and gently lower hips. Hold stretch for 20 seconds.','upload/exercise-picture/c048a0741ded61fa0dda2a92ef77b95c.jpg'),(1569,'Lying Wall Groin Stretch','Sit on floor with hip and thigh against wall. Lift back of legs up against wall by pivoting on hips and lying on back. Place back of legs against wall.','Spread legs. Hold stretch.','upload/exercise-picture/495b5c75dd3cd406a20b460c59d9554b.jpg'),(1570,'Seated Groin Stretch','Sit on floor or mat with soles of feet together on floor and close to body. Grasp feet with both hands and position elbows on inside of lower legs.','Press knees toward floor with elbows. Hold stretch.','upload/exercise-picture/2e5747087dc8bafff113bf6b80a668eb.jpg'),(1571,'Lever Groin Stretch','Sit on seat in forward position. Place hands through wrist straps. Hold lower bar with overhand grip. Position soles of feet together on top edge of shin pad.','Push and lower seat back. Hold stretch.','upload/exercise-picture/PCGroin8.gif'),(1572,'Seated Groin Stretch (on apparatus)','Sit on platform facing adjustable handles. Spread legs apart and place inside of legs on outer surface of padded stumps. Straighten knees, grasp handles, and sit upright.','Straighten back and pull legs further apart by pulling on handles. Hold stretch.','upload/exercise-picture/a27b9cca96504dabff67b776873d74e1.jpg'),(1573,'PNF Straight Leg Groin Stretch','Instruct participant to lie on floor or mat with legs positioned straight up, slightly apart. Grasp participant\'s ankle from inside.','Spread legs down to sides and hold stretch.','upload/exercise-picture/4a953ad380e1760b3e40028a0fdca304.jpg'),(1574,'Squatting Groin Stretch','Stand with feet pointed approximately 45° outward. Squat down completely with knees pointed outward over toes. Place palms of hands on floor with inside of upper arm positioned against inner thigh.','Pull thighs apart with upper arms. Hold stretch.','upload/exercise-picture/34c9835255b7324f033509782d62fa19.jpg'),(1575,'Side Lunge Stretch','Stand with feet far apart, toes pointed 45° outward.','Lunge toward one side. Allow foot of straight leg to point upward with heel on floor. Hold stretch. Repeat on opposite leg.','upload/exercise-picture/517f3409f5a115f38d544800a5a1ffad.jpg'),(1576,'Standing Groin Stretch','Stand next to upper thigh height surface off to side. Hold onto elevated surface or other stable structure for balance and place inner side of nearest bent lower leg on elevated surface.','Lower body slightly by bending knee of base leg until stretch if felt. Repeat on opposite leg.','upload/exercise-picture/e6c0cc8d037dc5ec14ae367e397bf998.jpg'),(1577,'Seated Groin Stretch (chair or bench)','Sit on end of chair or bench. Place legs as far apart as possible with knees bent approximately 90 degrees and feet flat on floor pointing same direction as knees. Lean over and position upper forearms inside lower thighs near knees.','Lean forward more while pushing thighs apart. Hold stretch.','upload/exercise-picture/079df26ca2d76ff727a699a7a908aeb7.jpg'),(1578,'Lever Seated Groin Stretch','Sit on apparatus with each leg on adjacent platforms.','Separate legs apart by turning knob. Lean forward slightly and grasp forward bar if available. Hold stretch.','upload/exercise-picture/62c0cef1a94cf836a047d8c587d39a21.jpg'),(1579,'Seated Adductor Magnus Stretch','Sit on floor or mat with feet far apart and knees bent approximately 90 degrees. Reach forward grasp bottom of feet.','Pull torso forward and hold stretch.','upload/exercise-picture/079df26ca2d76ff727a699a7a908aeb7.jpg'),(1580,'Kneeling Adductor Magnus Stretch','Kneel with one foot on floor or mat. Position torso to inside of upper thigh with hands on floor.','Lower torso downward. Hold stretch.','upload/exercise-picture/2fb387607233825c08f29be65f8612b2.jpg'),(1581,'Seated Adductor Magnus Stretch (chair or bench)','Straddle and sit on chair or bench with feet far apart and feet on floor.','Lean forward placing finger tips or hands on floor if possible. Allow torso to be lowered downward and hold stretch.','upload/exercise-picture/95f43547ca7605ef764baea16ba1b9cc.jpg'),(1582,'Bent-over Adductor Magnus Stretch','Stand with one foot on chair or bench. Bend over.','Reach toward floor. Hold stretch.','upload/exercise-picture/81c5dc1f1d715c1f451f378fe03b9427.jpg'),(1583,'Lying Adductor Magnus Stretch','Lie supine on floor or mat. Raise knees and grasp back of thighs behind knees.','Pull knee toward shoulders or to side of torso while keeping opposite leg on floor. Hold stretch.','upload/exercise-picture/606b95ba87532c1a4ce991be5c7a6f0a.jpg'),(1584,'Seated Single Leg Adductor Magnus Stretch','Sit on floor or mat and place outside of flexed leg on floor. Over that leg, position opposite leg with foot flat on floor and back of heel against shin.','Bent torso forward. Hold stretch.','upload/exercise-picture/3e224ee57a9ee6e20edcd66d60ab1f14.jpg'),(1585,'Safety Barbell Standing Leg Calf Raise','Stand facing safety barbell on rack upper chest height and calf block on floor just below. Position toes and balls of feet on calf block with arches and heels extending off. Place hands on bar to each sides or on vertical rack bars. Position head in yoke with padded bar around shoulders. Dismount bar from rack by standing erect with safety bar, away yet close to rack.','Raise heels by extending ankles as high as possible. Lower heels by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/SFStandingCalfRaise.gif'),(1586,'Barbell Standing Leg Calf Raise','Set barbell on power rack upper chest height with calf block under barbell. Position back of shoulders under barbell with both hands to sides. Position toes and balls of feet on calf block with arches and heels extending off. Lean barbell against rack and raise from supports by extending knees and hips. Support barbell against verticals with both hands to sides.','Raise heels by extending ankles as high as possible. Lower heels by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/BBStandingCalfRaise.gif'),(1587,'Cable Standing Calf Raise','Place cable belt or dip belt around waist. Kneel before low pulley and attach belt to cable. Stand on calf block and grasp support bar for balance. Position toes and balls of feet on calf block with arches and heels extending off.','Raise heels by extending ankles as high as possible. Lower heels by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/CBStandingCalfRaise.gif'),(1588,'Cable One Arm Single Leg Calf Raise','Stand facing low pulley with platform on floor. Bend over and grasp stirrup attachment with one hand. Stand on edge of platform and grasp support bar for balance. Position toes and balls of feet on platform with arches and heels extending off. Lift one leg up off of floor.','Raise heel by extending ankle as high as possible. Lower heel by bending ankle until calf is stretched. Repeat.','upload/exercise-picture/CBSingleLegCalfRaiseStirrup.gif'),(1589,'Cable Single Leg Calf Raise','Kneel before low pulley and attach cable belt or dip belt to cable. Stand on edge of platform and grasp support bar for balance. Position toes and balls of feet on platform with arches and heels extending off. Lift one leg up off of floor.','Raise heel by extending ankle as high as possible. Lower heel by bending ankle until calf is stretched. Repeat.','upload/exercise-picture/CBSingleLegCalfRaise.gif'),(1590,'Dumbbell Single Leg Calf Raise','Grasp dumbbell in one hand to side. Position toes and balls of feet on calf block with arches and heels extending off. Place hand on support for balance. Lift other leg to rear by bending knee.','Raise heel by extending ankle as high as possible. Lower heel by bending ankle until calf is stretched. Repeat. Continue with opposite leg.','upload/exercise-picture/DBSingleLegCalfRaise.gif'),(1591,'Dumbbell Standing Calf Raise','Grasp dumbbell in one hand to side. Position toes and balls of feet on calf block with arches and heels extending off. Place hand on support for balance.','Raise heels by extending ankles as high as possible. Lower heels by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/DBCalfRaise.gif'),(1592,'Lever 45° Calf Press (plate loaded)','Sit on seat with back on padded support. Place feet on platform. Grasp handles to sides and extend hips and knees. Place toes and balls of feet on lower portion of platform with heels and arches extending off.','Push platform by extending ankles as far as possible. Return by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/LV45DegCalfPress.gif'),(1593,'Lever Calf Extension (plate loaded)','Sit on seat and position forefeet on lever platform. Grasp handles to sides and straighten knees.','Push lever by extending ankle as far as possible. Return by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/LVSeatedCalfExtensionH.gif'),(1594,'Lever Donkey Calf Raise (plate loaded)','Position lower back and hips under padded lever. Place forearms on supports. Position toes and balls of feet on calf block with arches and heels extending off. Straighten knees.','Raise heels by extending ankles as high as possible. Lower heels by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/LVDonkeyCalfRaisePL.gif'),(1595,'Lever 45° Calf Raise (plate loaded)','Sit on machine with low back against padding and grasp handles to sides. Place feet high on platform and straighten knees. Position toes and balls of feet on lower portion of platform with arches and heels extending off.','Raise heels by extending ankles as high as possible. Lower heels by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/LVCalfRaiseHackPress.gif'),(1596,'Lever Calf Raise (on v-squat machine, plate loaded)','Position shoulders under shoulder pads with back against back pad. Place feet on platform shoulder width apart. Extend hips and knees. Position toes and balls of feet on nearest edge of platform with arches and heels extending off.','Raise heels by extending ankles as high as possible. Lower heels by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/LVVCalfRaisePL.gif'),(1597,'Lever Seated Calf Press (plate loaded)','Place seat away from platform. Sit on seat with lower back against back of seat. Place toes and balls of feet on lower portion of platform(s) with heels and arches extending off. Grasp handles to sides and straighten knees.','Push lever platform(s) by extending ankles as far as possible. Return by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/LVSeatedCalfPressH.gif'),(1598,'Lever Calf Extension','Sit on seat and position forefeet on horizontal foot bar. Grasp handles to sides and straighten knees.','Push lever by extending ankles as far as possible. Return by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/LVSeatedCalfExtension.gif'),(1599,'Lever Standing Calf Raise (plate loaded)','Place shoulders under padded lever. Position toes and balls of feet on calf block with arches and heels extending off. Grasp handles or sides of padded lever. Stand erect by extending hips and knees.','Raise heels by extending ankles as high as possible. Lower heels by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/LVStandingCalfRaisePL.gif'),(1600,'Lever 45° Calf Raise','Sit on machine with low back against padding and grasp handles to sides. Position toes and balls of feet on lower portion of platform or foot bar with arches and heels extending off. Straighten knees.','Raise heels by extending ankles as high as possible. Lower heels by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/LV45DegreeCalfRaise.gif'),(1601,'Lever Donkey Calf Raise','Position lower back and hips under padded lever. Place forearms on supports. Position toes and balls of feet on calf block with arches and heels extending off. Straighten knees.','Raise heels by extending ankles as high as possible. Lower heels by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/LVDonkeyCalfRaise.gif'),(1602,'Lever Alternating Calf Extension','Sit on seat and position forefeet on pedals. Grasp handles to sides and straighten knees.','Push left pedal by extending ankle as far as possible while allowing right pedal to return back until calf is stretched. Reverse motion by pushing right pedal and allowing left pedal to return back. Continue to alternate motion.','upload/exercise-picture/LVAlterSeatedCalfExtStrLeg.gif'),(1603,'Lever Seated Calf Press','Place seat away from platform. Sit on seat with lower back against back of seat. Place toes and balls of feet on lower portion of platform with heels and arches extending off. Grasp handles to sides and straighten knees.','Push lever by extending ankles as far as possible. Return by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/LVSeatedCalfPress.gif'),(1604,'Lever Calf Extension (bilateral)','Sit on seat and position forefeet on lever platform or foot pedals. Grasp handles to sides and straighten knees.','Push lever by extending ankles as far as possible. Return by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/LVSeatedCalfExtensionBentKnees.gif'),(1605,'Lever Standing Calf Raise','Place shoulders under padded lever. Position toes and balls of feet on calf block with arches and heels extending off. Grasp handles or sides of padded lever. Stand erect by extending hips and knees.','Raise heels by extending ankles as high as possible. Lower heels by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/LVStandingCalfRaise.gif'),(1606,'Lever Standing Calf Raise (belt loaded)','Place lever belt or dip belt around waist. Kneel before lever and attach belt. Stand on calf block and grasp support bar for balance. Position toes and balls of feet on calf block with arches and heels extending off.','Raise heels by extending ankles as high as possible. Lower heels by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/LVStandingCalfRaiseBelt.gif'),(1607,'Sled 45° Alternating Calf Press','Sit on seat with back on padded support. Grasp handles to sides. Place toes and balls of feet on lower portion of platform with heels and arches extending off.','Push sled by extending ankles as far as possible. Return by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/SL45DegAlternCalfPress.gif'),(1608,'Sled 45° Calf Raise','Sit on machine with lower back against padding and grasp handles to sides. Position toes and balls of feet on foot platform with arches and heels extending off. Straighten knees.','Raise heels by extending ankles as high as possible. Lower heels by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/SL45DegreeCalfRaise.gif'),(1609,'Sled 45° Calf Raise (plate loaded)','Sit on machine with lower back against padding and grasp handles to sides. Position toes and balls of feet on foot of platform with arches and heels extending off. Straighten knees.','Raise heels by extending ankles as high as possible. Lower heels by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/SL45DegCalfRaise.gif'),(1610,'Lever Forward Angled Calf Raise','Place shoulders under padded lever. Position toes and balls of feet on top of calf block with arches and heels extending off. Grasp handles or sides of padded lever. Stand erect by extending hips and knees.','Raise heels by extending ankles as high as possible. Lower heels by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/LVForwardAngledCalfRaise.gif'),(1611,'Sled Donkey Calf Raise','Position lower back and hips under upper pad. Place forearms on supports. Position toes and balls of feet on calf block with arches and heels extending off. Straighten knees.','Raise heels by extending ankles as high as possible. Lower heels by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/SLDonkeyCalfRaise.gif'),(1612,'Sled Hack Calf Press','Lie supine on sled with shoulders against pad and place feet on platform. Grasp handles to sides and straighten knees. Place toes and balls of feet on lower portion of platform with heels and arches extending off.','Push sled up away from platform by extending ankles as far as possible. Return by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/HackCalfRaise.gif'),(1613,'Sled Lying Calf Press','Position sled away from platform. Lie supine on sled with shoulders against pad and place feet on platform. Grasp handles to sides and straighten knees. Place toes and balls of feet on lower portion of platform with heels and arches extending off.','Push sled away from platform by extending ankles as far as possible. Return by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/SLLyingCalfPress.gif'),(1614,'Sled Lying Calf Press (plate loaded)','Position sled away from platform. Lie supine on sled with shoulders against pad and place feet on platform. Grasp handles to sides and straighten knees. Place toes and balls of feet on lower portion of platform with heels and arches extending off.','Push sled away from platform by extending ankles as far as possible. Return by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/SLLyingCalfPressPL.gif'),(1615,'Sled 45° Calf Press','Sit on seat with back on padded support. Place feet on platform. Grasp handles to sides and extend hips and knees. Place toes and balls of feet on lower portion of platform with heels and arches extending off.','Push sled by extending ankles as far as possible. Return by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/SL45DegCalfPress.gif'),(1616,'Sled Seated Calf Press','Place seat away from platform. Sit on seat and place feet on platform. Grasp handles to sides and extend hips and knees. Place toes and balls of feet on lower portion of platform with heels and arches extending off.','Push sled by extending ankles as far as possible. Return by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/SLSeatedCalfPress.gif'),(1617,'Sled Vertical Calf Press','Lie on back pad. Place feet on platform. Grasp handles to sides and extend hips and knees. Place toes and balls of feet on platform with heels and arches extending off.','Push sled by extending ankles as far as possible. Return by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/SLVerticalCalfPress.gif'),(1618,'Smith Standing Leg Calf Raise','Position bar on upper chest height and place calf block under bar. Position back of shoulders under bar and grasp bar to sides. Position toes and balls of feet on calf block with arches and heels extending off. Disengage bar by rotating bar back. Stand erect by extending knees and hips.','Raise heels by extending ankles as high as possible. Lower heels by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/SMStandCalfRaise.gif'),(1619,'Smith Donkey Calf Raise','Engage both safety stops mid height so bar will be just above in lowest range of motion. Place calf block under bar. Position padded surface of tall bench or Roman Chair in front of smith machine for arm rest. Place stiffly padded board within arms reach. Step on calf block while standing between smith bar and arm rest. Situate padded board on back of hips while bending under smith bar. Arrange smith bar above upper hips or lower waist with padded board in between. Place forearms on supports. Lift bar off of safety stops by straighten knees. Position toes and balls of feet on calf block with arches and heels extending off.','Raise heels by extending ankles as high as possible. Lower heels by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/SMDonkeyCalfRaise.gif'),(1620,'Sled Standing Calf Raise','Place shoulders under padded bars. Position toes and balls of feet on calf block with arches and heels extending off. Grasp handles or sides of padded bars. Stand erect by extending hips and knees.','Raise heels by extending ankles as high as possible. Lower heels by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/SLStandingCalfRaise.gif'),(1621,'Weighted Single Leg Calf Raise','Hang weight from dip belt around waist. Position toes and ball of foot on calf block end of platform with heel and arch extending off. Place hand or hands on support for balance. Lift other leg to rear by bending knee.','Raise heel by extending ankle as high as possible. Lower heel by bending ankle until calf is stretched. Repeat. Continue with opposite leg.','upload/exercise-picture/WTSingleLegCalfRaise.gif'),(1622,'Sled Forward Angled Calf Raise','Lie forward so chest is on pad and shoulders are under padded bars. Position toes and balls of feet on calf block with arches and heels extending off. Grasp handles or sides of padded bars. Stand erect by extending hips and knees. Release lever if available.','Raise heels by extending ankles as high as possible. Lower heels by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/SLFrontCalfRaise.gif'),(1623,'Weighted Donkey Calf Raise','Stand on edge of platform, toes and balls of feet on calf block with arches and heels extending off. Bend over and grasp knee high bar (as shown) or place forearms on thigh high surface (see example). Allow training partner to mount hips or lower back from bench.','Raise heels by extending ankles as high as possible. Lower heels by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/WtDonkeyCalfRaise.gif'),(1624,'Standing Calf Raise','Position toes and balls of feet on calf block with arches and heels extending off. Place hand on support for balance.','Raise heels by extending ankles as high as possible. Lower heels by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/BWCalfRaise.gif'),(1625,'Single Leg Calf Raise','Position toes and balls of feet on calf block or elevation with heels and arches extending off. Place hand or hands on support for balance. Lift one leg to rear by bending knee.','Raise heel by extending ankle as high as possible. Lower heel by bending ankle until calf is stretched. Repeat. Continue with opposite leg.','upload/exercise-picture/BWSingleLegCalfRaise.gif'),(1626,'Pike Straight Leg Calf Stretch','There are number of ways to enter into this stretch:','There are number of ways to enter into this stretch:','upload/exercise-picture/2148f0312430e4335a53af5b850a45d7.jpg'),(1627,'Floor Board Straight Leg Calf Stretch','Face wall with both knees slightly bent. Position fore foot on wall with heel on floor.','Straighten knees and lean body toward wall. Hold stretch . Repeat with opposite leg.','upload/exercise-picture/a0e542a3b6a5a73791a91a9581d07a03.jpg'),(1628,'Self-assisted Leg Calf Raise','Position toes and balls of feet on calf block with heels and arches extending off. Place hands on support for assistance. Lift one leg to rear by bending knee.','Raise heel by extending ankle as high as possible, assisting with upper body as little as possible. Lower heel by bending ankle until calf is stretched. Repeat. Continue with opposite leg.','upload/exercise-picture/ASSingleLegCalfRaiseSelfPull.gif'),(1629,'Self-assisted Single Leg Calf Raise (with opposite leg)','Position toes and ball of foot on calf block with heels and arches extending off. Place hand or hands on support for balance. Raise one ankle by bending knee forward, keeping forefoot on platform.','Raise body upward as high as possible by extending lower ankle while straightening knee of assisting leg. Lower heel by bending ankle while bending knee of assisting leg forward. Repeat. Continue with opposite leg positioning.','upload/exercise-picture/ASSingleLegCalfRaiseSelfFoot.gif'),(1630,'Lunging Straight Leg Calf Stretch','Stand with one leg far forward and other leg extended back with knees straight. Both feet are positioned directly forward.','Lower body forward by bending forward knee only. Hold stretch. Repeat with opposite leg.','upload/exercise-picture/72e16e3fd573bcad77e28416da6e9be4.jpg'),(1631,'Single Leg Forward Angled Calf Raise','Stand facing mid-thigh to hip high vertical bar. Grasp bar with wide overhand grip. Step back so body is angled forward with body straight and arms extended approximately perpendicular to body. Feet should be pointed forward. Lift one leg to rear by bending knee.','Raise heel by extending ankle as high as possible. Allow body to travel forward and upward in same direction as body is orientated. Lower heel allowing foot to come back down flat on floor. Repeat. Continue with opposite leg.','upload/exercise-picture/BWSingleLegForwardAngledCalfRaise.gif'),(1632,'Single Leg Pike Straight Leg Calf Stretch','Step forward with one front forward. Bend over and place hands on floor well in front of forward foot with arms straight.','Position rear foot flat on floor while keeping rear knee straight and hold stretch. Repeat with opposite leg position.','upload/exercise-picture/ad4308a843d634d40a8009930853b52c.jpg'),(1633,'Wall Straight Leg Calf Stretch','Place both hands on wall with arms extended. Lean against wall with one leg bent forward and other leg extended back with knee straight and foot positioned directly forward.','Push rear heal to floor and move hips slightly forward. Hold stretch. Repeat with opposite leg.','upload/exercise-picture/4ce1dd65b26d1b568fad686821e5f401.jpg'),(1634,'Step Straight Leg Calf Stretch','Position toes and balls of feet on stair step or calf block with arches and heels extending off. Use railing or wall for balance.','With knees straight, shift body weight to one foot. Hold stretch. Repeat with opposite leg.','upload/exercise-picture/c9a754ea29b499f34e3b68b97a279195.jpg'),(1635,'Towel Straight Leg Calf Stretch','Sit of floor or mat and place towel or band under foot. With both ends of towel or band in each hand, straighten leg with towel under foot.','Pull towel and hold stretch. Repeat with opposite leg.','upload/exercise-picture/0ab540f8815536fe46c029b18f1aee83.jpg'),(1636,'Lever Seated Calf Extension','With leg pads in upper position, sit on seat and place feet on lever platform with legs under pads. Lower leg pads on legs so they are snuggly adjusted just behind knees. Place hands on top of thigh pads.','Push lever platform down by extending ankles as far as possible. Return by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/LVSeatedCalfRaiseExtension.gif'),(1637,'Safety Bar Seated Calf Raise','Place safety bar on rack approximately lower leg height with calf block slightly rear of safety bar. Sit on bench facing safety bar and place toes on lower portion of platform with heels extending off. Scoot forward to edge of bench and position lower thighs under safety bar. Grasp bar to sides and lift bar from rack by pushing heels up. Slide back to center of bench.','Lower heels by bending ankles until calves are stretched. Raise heels by extending ankles as high as possible. Repeat.','upload/exercise-picture/SBSeatedCalfRaise.gif'),(1638,'Lever Bent Knee Calf Extension','With seat close to lever platform or foot pedals, sit on seat. Position forefeet on lever platform or foot pedals. Grasp handles to sides. Push feet into lever platform or foot pedals to prevent knees from coming back during lift.','Push lever by extending ankles as far as possible. Return by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/LVBentKneeSeatedCalfExtension.gif'),(1639,'Lunging Bent Knee Calf Stretch','Stand with one leg far forward and other leg extended back with knees straight. Both feet are positioned directly forward.','Squat down by flexing both knees just before rear heel raises off floor. Hold stretch. Repeat with opposite leg.','upload/exercise-picture/d2e7c4e33d630b74700bd7539f474b55.jpg'),(1640,'Floor Board Bent Knee Calf Stretch','Face wall with both knees slightly bent. Position fore foot on wall with heel on floor.','Straighten knee of rear leg and lean body toward wall. Hold stretch. Repeat with opposite leg.','upload/exercise-picture/10fd5c6c923c1b4f5aa350ab1ae994ff.jpg'),(1641,'Lever Alternating Bent-knee Seated Calf Extension','Sit on seat and position forefeet on pedals. Grasp handles to sides and extend knees but maintain small bend in knees.','Push left pedal by extending ankle knee Simultaneously allow right pedal to return back by relaxing ankle and bending knee more. Reverse motion by pushing right pedal and allowing left pedal to return back by same means. Continue to alternate motion.','upload/exercise-picture/LVAltBentKneeSeatedCalfExt.gif'),(1642,'Lever Seated Calf Raise (plate loaded)','Sit on seat facing lever. Place forefeet on platform with heels extending off. Position lower thighs under lever pads. Grasp handles if available or place hands on lever pad. Lift lever slightly by pushing heels up. Release support lever.','Lower heels by bending ankles until calves are stretched. Raise heels by extending ankles as high as possible. Repeat.','upload/exercise-picture/LVSeatedCalfRaiseH.gif'),(1643,'Smith Seated Calf Raise','Position bar slightly higher than lower leg height. Wrap bar pad around center of bar. Place calf block under bar and bench near bar. Sit on bench facing bar and place toes on lower portion of platform with heels extending off. Grasp bar to sides and extend ankles to raise knees so lower thighs are under padded bar. Push heels further up. Disengage bar by rotating bar back.','Lower heels by bending ankles until calves are stretched. Raise heels by extending ankles as high as possible. Repeat.','upload/exercise-picture/SMSeatedCalfRaise.gif'),(1644,'Single Leg Pike Bent Leg Calf Stretch','Step forward with one front forward. Bend over and place hands on floor well in front of forward foot with arms straight. Bend rear leg and place rear foot flat on floor.','Straighten rear knee slightly or lean forward slightly. Hold stretch. Repeat with opposite leg position.','upload/exercise-picture/824cb4509c44d51beaef7d84c2bdd8dc.jpg'),(1645,'Pike Bent Leg Calf Stretch','There are number of ways to enter into this stretch:','There are number of ways to enter into this stretch:','upload/exercise-picture/9ec26b4ff7c9ddfd683bc06970ad16e7.jpg'),(1646,'Lever Seated Calf Raise','Sit on seat facing lever. Reach forward and pull hand lever toward body. Place forefeet on platform with heels extending off. Position lower thighs under lever pads. Release hand lever by pushing away from body. Place hands on top of thigh pads.','Raise heels by extending ankles as high as possible. Lower heels by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/LVSeatedCalfRaise.gif'),(1647,'Wall Bent Knee Calf Stretch','Place both hands on wall with arms extended. Lean against wall with one leg bent forward and other leg extended back. Bend rear knee slightly, positioned foot directly forward, and place heal to floor.','Lower knee until just before heel raises. Hold stretch for 20 seconds. Repeat with opposite leg.','upload/exercise-picture/a76413823656f25915cf5e643ee9ee78.jpg'),(1648,'Kneeling Calf Stretch','Kneel on lower leg. Place foot of opposite leg flat on floor.','Lean forward so knee travels beyond toes. Hold stretch . Repeat with opposite leg.','upload/exercise-picture/8102281e325bb7441e79e5f13d306c10.jpg'),(1649,'Step Bent Knee Calf Stretch','Position toes and balls of feet on stair step or calf block with arches and heels extending off. Place support leg up to higher steps. Use railing or wall for balance. Bend rear knee.','Allow rear heel to lower below step. Hold stretch for 20 seconds. Repeat with opposite leg.','upload/exercise-picture/c779d0bfc0ebedf9c3a06e0392788c32.jpg'),(1650,'Seated Bent Leg Calf Stretch','Sit of floor or mat. Place heel on floor or mat with bent knee upright. Grasp top of forefoot.','Pull forefoot toward shin. Repeat with opposite leg.','upload/exercise-picture/6735c80e66fbedcb5332915a053127b5.jpg'),(1651,'Towel Bent Leg Calf Stretch','Sit of floor or mat. With both ends of towel or band in each hand, place towel or band under foot.','With knee bent, pull towel and hold stretch. Repeat with opposite leg.','upload/exercise-picture/9fccaf897f02ea7677d2fd16d72d5716.jpg'),(1652,'Cable Single Leg Reverse Calf Raise','Place cable belt or dip belt around waist. Kneel before low pulley and attach it to cable. Stand and position heel on forward edge of platform. Raise other leg off block. Grasp support bar for balance.','Pull forefoot up toward body as far as possible. Return by extending feet until toes are pointed downward. Repeat.','upload/exercise-picture/CBSingleLegReverseCalfRaise1.gif'),(1653,'Barbell Reverse Calf Raise','Place barbell on power rack upper chest height and calf block under barbell. Position back of shoulders under barbell with both hands to sides. Position heels on forward edge of calf block. Lean barbell against rack and raise from supports by extending knees and hips. Support barbell against verticals with both hands to sides.','Pull forefoot of both feet up toward body as far as possible. Return by extending feet until toes are pointed downward. Repeat.','upload/exercise-picture/BBReverseCalfRaise.gif'),(1654,'Dumbbell Single Leg Reverse Calf Raise','Grasp dumbbell in one hand to side. Position one heel on forward edge of platform. Grasp support with other hand for balance. Lift other leg to rear by bending knee.','Pull forefoot up toward body as far as possible. Return by extending foot until toes are pointed downward. Repeat. Continue with opposite leg.','upload/exercise-picture/DBSingleLegReverseCalfRaise.gif'),(1655,'Lever Reverse Calf Extension (plate loaded)','Sit on seat and position heels on lever platform with fore feet extended off top. Grasp handles to sides and straighten knees.','Pull forefoot back toward body as far as possible while pushing platform with heels. Return feet down to platform and repeat.','upload/exercise-picture/LVSeatedReverseCalfExtensionH.gif'),(1656,'Lever 45° Reverse Calf Raise (plate loaded)','Sit on machine with lower back against padding. Grasp handles to sides and place feet on top portion of platform. Straighten knees and position heels on top edge of platform.','Pull forefoot of both feet up and back toward body as far as possible. Return by extending feet return to platform. Repeat.','upload/exercise-picture/LV45ReverseCalfRaise.gif'),(1657,'Safety Bar Reverse Calf Raise','Standing facing safety barbell on rack upper chest height and calf block on floor just below. Position heels on forward edge of calf block. Place hands on bar to each sides or on vertical rack bars. Position head in yoke with padded bar around shoulders. Dismount bar from rack by standing erect with safety bar, away yet close to rack.','Pull forefeet up toward body as far as possible. Return by extending feet until toes are pointed downward. Repeat.','upload/exercise-picture/SBReverseCalfRaise.gif'),(1658,'Cable Reverse Calf Raise','Place cable belt or dip belt around waist. Kneel before low pulley and attach it to cable. Stand and position heels on forward edge of platform. Grasp support bar for balance.','Pull forefeet up toward body as far as possible. Return by extending feet until toes are pointed downward. Repeat.','upload/exercise-picture/CBReverseCalfRaise.gif'),(1659,'Dumbbell Reverse Calf Raise','Grasp dumbbell in one hand to side. Position heels on forward edge of platform. Grasp support with other hand for balance.','Pull forefoot of both feet up toward body as far as possible. Return by extending feet until toes are pointed downward. Repeat.','upload/exercise-picture/DBReverseCalfRaise.gif'),(1660,'Lever 45° Reverse Calf Press (plate loaded)','Sit on seat with back on padded support. Place feet very high on platform, grasp handles to sides, and extend knees.','Pull forefoot back toward body as far as possible while pushing platform with heels. Return feet down to platform and repeat.','upload/exercise-picture/LV45DegReverseCalfPress.gif'),(1661,'Lever Reverse Calf Raise (on v-squat machine, plate loaded)','Position shoulders under shoulder pads with back against back pad. Position feet far forward on platform. Grasp handles or sides of padded lever.','Pull forefeet up toward body as far as possible. Return by extending feet until toes are pointed downward. Repeat.','upload/exercise-picture/LVReverseVCalfRaise.gif'),(1662,'Lever Reverse Calf Raise (plate loaded)','Place shoulders under padded lever. Stand erect by extending hips and knees. Position heels on forward edge of platform placed under padded lever. Grasp handles or sides of padded lever.','Pull forefoot of both feet up toward body as far as possible. Return by extending feet until toes are pointed downward. Repeat.','upload/exercise-picture/LVReverseCalfRaisePL.gif'),(1663,'Lever Reverse Calf Extension','Sit on seat and position heels on lever platform with fore feet extended off top. Grasp handles to sides and straighten knees.','Pull forefoot back toward body as far as possible while pushing platform with heels. Return feet down to platform and repeat.','upload/exercise-picture/LVReverseCalfExtension.gif'),(1664,'Lever Donkey Reverse Calf Raise','Position lower back and hips under upper lever pad. Place forearms on supports. Position heels on forward edge of platform.','Pull forefoot up and toward body as far as possible. Return by extending feet until toes are pointed away from body. Repeat.','upload/exercise-picture/LVDonkeyReverseCalfRaise.gif'),(1665,'Lever Seated Tibia Raise (plate loaded)','Sit on bench or stool. Place both feet under padded lever with heels on pedal.','Lift forefeet upward as far as possible. Return by extending feet until toes are pointed downward. Repeat.','upload/exercise-picture/LVSSeatedTibiaRaise.gif'),(1666,'Lever Reverse Calf Raise','Place shoulders under padded lever. Stand erect by extending hips and knees. Position heels on forward edge of platform placed under padded lever. Grasp handles or sides of padded lever.','Pull forefoot of both feet up toward body as far as possible. Return by extending feet until toes are pointed downward. Repeat.','upload/exercise-picture/LVReverseCalfRaise.gif'),(1667,'Lever Single Leg Seated Tibia Raise (plate loaded)','Sit on bench or stool. Place foot under padded lever with heel on pedal and other foot off to side.','Lift forefoot upward as far as possible. Return by extending foot until toes are pointed downward. Repeat.','upload/exercise-picture/LVSingleLegSeatedTibiaRaise.gif'),(1668,'Sled 45° Reverse Calf Raise','Sit on machine with lower back against padding. Grasp handles to sides and place feet on platform. Straighten knees and position heels on top edge of platform.','Pull forefoot of both feet up and back toward body as far as possible. Return by extending feet until toes are pointed away from body. Repeat.','upload/exercise-picture/SL45ReverseCalfRaise.gif'),(1669,'Lever Standing Tibia Raise (plate loaded)','Standing behind machine hold on to support for balance. Place foot under padded lever with heel on pedal.','Lift forefoot upward as far as possible. Return by extending foot until toes are pointed downward. Repeat.','upload/exercise-picture/LVStandingTibiaRaise.gif'),(1670,'Sled 45° Reverse Calf Raise (plate loaded)','Sit on machine with lower back against padding. Grasp handles to sides and place feet on platform. Straighten knees and position heels on top edge of platform.','Pull forefoot of both feet up and back toward body as far as possible. Return by extending feet until toes are pointed away from body. Repeat.','upload/exercise-picture/SL45DegReverseCalfRaise.gif'),(1671,'Sled 45° Reverse Calf Press','Sit on seat with back on padded support. Place feet very high on platform, grasp handles to sides, and extend knees.','Pull forefoot back toward body as far as possible while pushing platform with heels. Return feet down to platform and repeat.','upload/exercise-picture/SL45DegReverseCalfPress.gif'),(1672,'Lever Seated Reverse Calf Press','Place seat away from platform. Sit on seat with lower back against padding and place feet very high on platform. Grasp handles to sides and straighten knees.','Pull forefoot back toward body as far as possible while pushing platform with heels. Return feet down to platform and repeat.','upload/exercise-picture/LVSeatedReverseCalfPress.gif'),(1673,'Sled Reverse Donkey Calf Raise (plate loaded)','Position lower back and hips under upper pad. Place forearms on supports. Position heels on forward edge of platform.','Pull forefoot up and toward body as far as possible. Return by extending feet until toes are pointed away from body. Repeat.','upload/exercise-picture/SLDonkeyReverseCalfRaise.gif'),(1674,'Sled Lying Reverse Calf Press','Position sled away from platform. Lie supine on sled with shoulders against pad and place feet very high on platform. Grasp handles to sides and straighten knees.','Pull forefoot back toward body as far as possible while pushing platform with heels. Return feet down to platform and repeat.','upload/exercise-picture/SLLyingReverseCalfPress.gif'),(1675,'Sled 45° Reverse Calf Raise (on hack press)','Sit on machine with lower back against padding. Grasp handles to sides and place feet on top portion of platform. Straighten knees and position heels on top edge of platform.','Pull forefoot of both feet up and back toward body as far as possible. Return by extending feet return to platform. Repeat.','upload/exercise-picture/SL45ReverseCalfRaiseHackPressPL.gif'),(1676,'Sled Hack Reverse Calf Raise','Lie supine on back pad with shoulders against pads. Place feet very high on platform. Extend hips and knees. Release dock levers.','Pull forefoot of both feet up toward body as far as possible. Return by extending feet until toes are pointed away from body. Repeat.','upload/exercise-picture/SLHackReverseCalfRaise.gif'),(1677,'Sled Reverse Calf Raise (plate loaded)','Place shoulders under padded bars. Stand erect by extending hips and knees. Position heels on forward edge of platform positioned under padded bars. Grasp handles or sides of padded bars.','Pull forefoot of both feet up toward body as far as possible. Return by extending feet until toes are pointed downward. Repeat.','upload/exercise-picture/SLStandingReverseCalfRaisePL.gif'),(1678,'Sled Lying Reverse Calf Press (plate loaded)','Position sled away from platform. Lie supine on sled with shoulders against pad and place feet very high on platform. Grasp handles to sides and straighten knees.','Pull forefoot back toward body as far as possible while pushing platform with heels. Return feet down to platform and repeat.','upload/exercise-picture/SLLyingReverseCalfPressPL.gif'),(1679,'Sled Standing Reverse Calf Raise','Place shoulders under padded bars. Stand erect by extending hips and knees. Position heels on forward edge of platform positioned under padded bars. Grasp ends or sides of padded bars.','Pull forefoot of both feet up toward body as far as possible. Return by extending feet until toes are pointed downward. Repeat.','upload/exercise-picture/SLStandingReverseCalfRaise.gif'),(1680,'Smith Reverse Calf Raise','Position bar upper chest height and place calf block under bar. Position back of shoulders under bar and grasp bar to sides. Position heels on forward edge of calf block. Disengage bar by rotating bar back. Stand erect with knees and hips straight.','Pull forefoot of both feet up toward body as far as possible. Return by extending feet until toes are pointed downward. Repeat.','upload/exercise-picture/SMReverseCalfRaise.gif'),(1681,'Reverse Calf Raise','Position heels on forward edge of calf block or platform. Grasp support with other hand for balance.','Pull forefoot of both feet up toward body as far as possible. Return by extending feet until toes are pointed downward. Repeat.','upload/exercise-picture/DBReverseCalfRaise.gif'),(1682,'Sled Seated Reverse Calf Press','Sit on seat and place feet very high on platform. Grasp handles to sides and extend knees.','Pull forefoot back toward body as far as possible while pushing platform with heels. Return feet down to platform and repeat.','upload/exercise-picture/SLSeatedReverseCalfPress.gif'),(1683,'Standing Shin Stretch','Stand and touch wall or stationary object for balance. Grasp forefoot behind.','Pull forefoot to lower back. Hold stretch. Repeat with opposite side.','upload/exercise-picture/6f8914a8ffb2d11f8beb1556ceaeeffb.jpg'),(1684,'Seated Shin Stretch','Sit on chair or bench and cross lower leg over thigh of opposite leg. Place one hand above ankle and other hand on top of your foot.','Pull forefoot to extend ankle. Hold stretch. Repeat with opposite side.','upload/exercise-picture/5cdf2831c84a57c531f5f6fbd084bcdf.jpg'),(1685,'Kneeling Shin Stretch','Kneel on both knees with buttocks over both heels and feet extend back.','Sit down on or toward heels. Hold stretch.','upload/exercise-picture/54b780357143690c4f905794962e7e29.jpg'),(1686,'Lying Shin Stretch','Lie on one side. Grasp top forefoot behind.','Pull forefoot to lower back. Hold stretch. Repeat with opposite foot.','upload/exercise-picture/db4e77e1aa267a1a61f9d75ad4d27030.jpg'),(1687,'Single Leg Reverse Calf Raise','Position one heel on forward edge of platform. Grasp support with other hand for balance. Lift other leg to rear by bending knee.','Pull forefoot up toward body as far as possible. Return by extending foot until toes are pointed downward. Repeat. Continue with opposite leg.','upload/exercise-picture/BWSingleLegReverseCalfRaise.gif'); -/*!40000 ALTER TABLE `exercise` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `exercise_classification` --- - -DROP TABLE IF EXISTS `exercise_classification`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `exercise_classification` ( - `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'The ID of exercise classification.', - `name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'The name of exercise classification.', - `description` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'The description of exercise classification.', - PRIMARY KEY (`id`), - UNIQUE KEY `exercise_classification_name_uindex` (`name`) -) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Exercise Classification.\n\nhttps://exrx.net/WeightTraining/Glossary'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `exercise_classification` --- - -LOCK TABLES `exercise_classification` WRITE; -/*!40000 ALTER TABLE `exercise_classification` DISABLE KEYS */; -INSERT INTO `exercise_classification` VALUES (1,'Basic','A principal exercise that can place greater absolute intensity on muscles exercised relative to auxiliary exercises. Basic exercises tend to have more of the following characteristics:\n\ngravity dependent\ninclusion or shift of resistance through multiple muscle group throughout the range of motion\n\ne.g. bench press: front deltoid to pectoralis major to triceps\n\nnatural transfer of torsion force to compression force (e.g., lockout on squat, bench press, etc.) or tension force (e.g. extension of arm curl) to the bone(s) and joint(s) during full range of motion\n\nAlso see angle of pull\n\ngravity dependent'),(2,'Auxiliary','An optional exercise that may supplement a basic exercise. Auxiliary exercises may place greater relative intensity on a specific muscle or a head of a muscle.Compound'),(3,'Compound','An exercise that involves two or more joint movements.'),(4,'Isolated','An exercise that involves just one discernible joint movement.\nPull'),(5,'Closed Chain','An exercise or movement in which the end segment of the exercised limb is fixed, or the end is supporting the weight. Most compound exercises are closed-chainmovements.'),(6,'Open Chain','An exercise or movement in which the end segment of the exercised limb is not fixed, or the end is not supporting the weight. Many isolated exercises are open-chain movements.'),(7,'Functional','An exercise which allows one to gain motor development or strength in a manner in which it is used in the execution of a particular task (eg: specific sport skill, occupational task, or daily activity).'),(8,'Push','Movement away from center of body during the concentric contraction of the target muscle. Isolated movements are classified by their compound counterparts.'),(9,'Pull','Movement toward center of body during the concentric contraction of the target muscle. Isolated movements are classified by their compound counterparts.'); -/*!40000 ALTER TABLE `exercise_classification` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `exercise_comment` --- - -DROP TABLE IF EXISTS `exercise_comment`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `exercise_comment` ( - `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'The ID of exercise comment.', - `exercise_id` bigint unsigned NOT NULL COMMENT 'The ID of exercise.', - `comment` varchar(2500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'The comment.', - PRIMARY KEY (`id`), - UNIQUE KEY `exercise_comment_exercise_id_uindex` (`exercise_id`) -) ENGINE=InnoDB AUTO_INCREMENT=1347 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Exercise Comment.\n\nRelationship:\nOne exercise to one comment.\n\nIf the exercise doen''t have comment,\nthen this table will still store the comment record for it,\nlike { id: 1, exercise_id: 1, comment: ''NONE'' }.'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `exercise_comment` --- - -LOCK TABLES `exercise_comment` WRITE; -/*!40000 ALTER TABLE `exercise_comment` DISABLE KEYS */; -INSERT INTO `exercise_comment` VALUES (1,1,'Use neck to pull belt rather than allowing hand to assist. Keep clinched grip on belt against back of mid-head throughout movement. Clamping belt higher up further from base of skull will permit torque throughout fuller range of motion, particularly range of motion nearer full flexion.'),(2,4,'Sit at distance away from pulley so weight does not bottom out at lowest range of motion. Keep clinched grip on belt against side of head throughout movement. Use heads friction on belt to pull belt rather than pushing with the hand used to keep belt tight around head. Keep back against back pad to minimize torso movement, reducing rotation below cervical spine.'),(3,3,'None'),(4,2,'Positioning pulley higher will alter tension curve by decreasing effort required near initiation of concentric contraction while increasing effort required near end of concentric contraction. Positioning pulley slightly higher than what is shown will allow greater effort in middle of movement.'),(5,5,'See all muscle used in Lateral Flexion:'),(6,6,'Sit at distance away from pulley so weight does not bottom out at lowest range of motion. Keep clinched grip on belt against side of head throughout movement. Woven cotton or cloth belts tend to slip less, particularly on bald heads. If belt slips from head, place small towel between belt and head.'),(7,7,'See all muscle used in Lateral Flexion:'),(8,8,'None'),(9,9,'Balance weight on back of head with both hands throughout movement. Weight plate(s) can be tilted slightly to higher point on head to keep resistance slightly more consistent throughout movement. Tilt weight forward slightly at bottom and back slightly at top. Also see Weighted Neck Flexion positioning body perpendicular on bench.'),(10,10,'Balance weight on back of head with both hands throughout movement.Weight plate(s) can be tilted slightly to higher point on head to keep resistance slightly more consistent throughout movement. Tilt wei\n\n\nght forward slightly at bottom and back slightly at top. Also see Weighted Lying Neck Flexion lying on bench longwise.'),(11,11,'See all muscle used in Lateral Flexion:'),(12,12,'Head can be pulled toward back.'),(13,13,'Keep body somewhat straight allowing waist to bend outward away from mat slightly at end of lift. See all muscle used in Lateral Flexion:'),(14,14,'Neck retraction primarily consists of Cervical Flexion (spine) accompanied by subtle Thoracic Flexion (spine) and Neck Flexion (atlanto-occipital joint). Cervical spine has natural lordotic curvature (see diagram of spine). Much of the retraction motion is actually flattening or slight reversing the normal lordosis. The deep neck flexors perform majority of this movement. Slight neck Flexion at the atlanto-occipital joint also occurs to maintain forward head positioning.'),(15,15,'This exercise can be performed with belt looped on TRXⓇ style suspension trainer or adjustable length gymnastics rings. Throughout movement, keep body straight and maintain tight grip on belt against back of mid-head throughout movement. Use neck to pull belt rather than allowing hand to assist. Clamping belt higher up further from base of skull will permit torque throughout fuller range of motion, particularly range of motion nearer full flexion.'),(16,16,'Exercise involves neck flexors as well as neck extensors. See controversial exercises.'),(17,17,'Keep body somewhat straight bending spine and hips slightly as head rolls down. Exercise involves neck flexors as well as neck extensors. See controversial exercises.'),(18,18,'This exercise can be performed with belt looped on TRXⓇ style suspension trainer or adjustable length gymnastics rings. Throughout movement, keep body straight and maintain tight grip on belt against side of head throughout movement. Use neck to pull belt rather than allowing hand to assist.'),(19,19,'No comment.'),(20,20,'None'),(21,21,'None'),(22,22,'Balance weight on back of head with both hands throughout movement. Weight plate(s) can be tilted slightly to\n\n\nhigher point on head to keep resistance slightly more consistent throughout movement. Tilt weight forward slightly at top and back slightly at bottom. Also see same movement with body lying perpendicular to bench.'),(23,26,'Balance weight on back of head with both hands throughout movement. Weight plate(s) can be tilted slightly to\n\n\nhigher point on head to keep resistance slightly more consistent throughout movement. Tilt weight forward slightly at top and back slightly at bottom.'),(24,25,'Exercise can also be performed by bending over with hands on bent knees.'),(25,23,'Balance weight on back of head with both hands throughout movement. Weight plate(s) can be tilted slightly to higher point on head to keep resistance slightly more consistent throughout movement. Tilt weight slightly forward at top and back slightly at bottom. Also same see movement with body lying on bench.'),(26,24,'Use neck to pull belt rather than allowing hand to assist. Keep clinched grip on belt against forehead throughout movement. Woven cotton or cloth belts tend to slip less, particularly on bald head. If belt slips from head, place small towel between belt and head.'),(27,28,'See controversial exercises.'),(28,27,'This exercise may be prescribed for functional forward head posture since it strengthens Splenius without neck flexion. Neck retraction primarily consists of Cervical Flexion (spine) accompanied by subtle Thoracic Flexion (spine) and Neck Flexion (atlanto-occipital joint). Cervical spine has natural lordotic curvature (see diagram of spine). Much of the retraction motion is actually flattening or slight reversing the normal lordosis. The deep neck flexors perform majority of movement. Slight neck Flexion at the atlanto-occipital joint also occurs to maintain forward head positioning.'),(29,29,'Also known as wrestler\'s bridge. See controversial exercises.'),(30,30,'None.'),(31,31,'This exercise can be performed with belt looped on TRXⓇ style suspension trainer or adjustable length gymnastics rings. Throughout movement, keep body straight and maintain tight grip on belt against forehead. Use neck to pull belt rather than allowing hand to assist.'),(32,32,'This exercise may be prescribed for functional forward head posture since it strengthens Splenius without neck flexion. The stretch that occurs during complete neck flexion, may exacerbate forward head posture, particularly if neck flexion is held under load. Neck flexion normally occurs at end of eccentric portion of dynamic Splenius exercises.'),(33,33,'Exercise may be performed on shoulder press apparatus with rack or off of power rack with seat or without back support. Also see mount and dismount off of special articulating rack.'),(34,34,'Movement can also be performed on old fashioned incline bench without seat.'),(35,35,'See unrack and rack technique. Feet may be positioned shoulder width apart or one foot in front of other with forward leg slightly bent (as shown). Upper chest assists (instead of side delts) since grip is slightly narrower and chest is high with low back arched back slightly. Also known as Overhead Press.\n\n\nAlso see Push Press and Press Strength Standards.'),(36,36,'Absolute height of movement may depend on range of motion. Raise should be limited to height achieved just before tightness is felt in shoulder capsule. Alternatively, height just above horizontal may be considered adequate. Elbows may be kept straight or slightly bent throughout movement.'),(37,37,'Set barbell on forward rack slightly below shoulder height so bar may be more easily mounted and racked. Position seat so bar does not hit uprights but close enough to easily mount and rack. Range of motion will be compromised if grip is too wide.'),(38,38,'Exercise may also be performed seated, straddling bench or on weight chair with back support.'),(39,40,'Exercise may also be performed seated, straddling bench or on weight chair with back support. Range of motion will be compromised if grip is too wide.'),(40,39,'Feet may be positioned shoulder width apart or one foot in front of other with forward leg slightly bent (as shown). Upper chest assists (instead of side delts) since grip is slightly narrower and chest is high with low back arched back slightly.'),(41,42,'Absolute height of movement may depend on range of motion or when stirrup or cable makes contact with underside of forearm. Raise should be limited to height achieved just before tightness is felt in shoulder capsule. Alternatively, height just above horizontal may be considered adequate. Elbows may be kept straight or slightly bent throughout movement.'),(42,41,'Set barbell on forward rack slightly below shoulder height so bar may be more easily unracked and racked. Position seat so bar does not hit uprights but close enough to easily mount and rack. Range of motion will be compromised if grip is too wide. Grip is slightly narrower than shoulder press. Torso is postured more upright than traditional Military Press.'),(43,43,'Absolute height of movement may depend on range of motion or when stirrup or cable makes contact with underside of forearm. Raise should be limited to height achieved just before tightness is felt in shoulder capsule. Alternatively, height just above horizontal may be considered adequate. Elbows may be kept straight or slightly bent throughout movement.'),(44,44,'Absolute height of movement may depend on range of motion or when stirrup or cable makes contact with underside of forearm. Raise should be limited to height achieved just before tightness is felt in shoulder capsule. Alternatively, height just above horizontal may be considered adequate. Elbows may be kept straight or slightly bent throughout movement.'),(45,45,'Absolute height of movement may depend on range of motion or when cable makes contact with underside of forearm. Raise should be limited to height achieved just before tightness is felt in shoulder capsule. Alternatively, height just above horizontal may be considered adequate.'),(46,47,'Absolute height of movement may depend on range of motion or when stirrup or cable makes contact with underside of forearm. Raise should be limited to height achieved just before tightness is felt in shoulder capsule. Alternatively, height just above horizontal may be considered adequate. Elbows may be kept straight or slightly bent throughout movement.'),(47,46,'Wrists maintain their approximate position above each elbow throughout movement.'),(48,48,'Movement can also be performed on old fashion incline bench without seat.'),(49,49,'Internal rotation of far hip (opposite side with resistance) is much greater than spinal rotation.'),(50,51,'Absolute height of movement may depend on range of motion. Raise should be limited to height achieved just before tightness is felt in shoulder capsule. Alternatively, height just above horizontal may be considered adequate. Elbows may be kept straight or slightly bent throughout movement. Also see Dumbbell Alternating Front Raise.'),(51,50,'Wrists maintain their approximate position above each elbow throughout movement. Feet may be positioned apart to each side or one foot back as shown. Cable pulleys should be much closer together than what is typically found on standard cable cross over setup.'),(52,52,'Absolute height of movement may depend on range of motion. Raise should be limited to height achieved just before tightness is felt in shoulder capsule. Alternatively, height just above horizontal may be considered adequate. Elbows may be kept straight or slightly bent throughout movement. Also see Dumbbell Front Raise.'),(53,53,'Movement should emphasize shoulder abduction while minimizing forearm pronation as this exercise attempts to combine lateral raise like motion with shoulder press. Lean forward slightly when lifting Dumbbells.'),(54,54,'See suggested mount and dismount when using heavy dumbbells.'),(55,55,'Range of motion will be compromised if grip is too wide.'),(56,56,'Exercise can also be performed on certain lever shoulder presses by facing away from machine. Range of motion will be compromised if grip is too wide.'),(57,57,'Range of motion will be compromised if grip is too wide.'),(58,59,'Torso can lean away for balance as shown or torso can maintain upright posture. Also see Kettlebell Press.'),(59,58,'Range of motion will be compromised if grip is too wide. Movement angle is arguably similar to lever incline press, for upper chest. Seat should be set so only slight stretch is felt in shoulder at bottom of movement.'),(60,60,'Absolute height of movement may depend on individual range of motion. Raise should be limited to height achieved just before tightness is felt in shoulder capsule. Alternatively, height just above horizontal may be considered adequate. Elbows may be kept straight or slightly bent throughout movement. Exercise is performed on Lever Extended Arm Lateral Raise Machine featuring long lever arms and handles attached to secondary levers as shown.'),(61,61,'Range of motion will be compromised if grip is too wide.'),(62,62,'Pull head back slightly so bar does not head. Range of motion will be compromised if grip is too wide.'),(63,63,'Keep back straight when lifting end of barbell from floor. Also see Lever One Arm Press for power.'),(64,64,'Range of motion will be compromised if grip is too wide.'),(65,65,'Range of motion will be compromised if grip is too wide.'),(66,66,'Range of motion will be compromised if grip is too wide.'),(67,67,'Range of motion will be compromised if grip is too wide.'),(68,68,'Parallel grip can be used for variety or when flexibility does not permit standard overhand grip further back.'),(69,69,'Range of motion will be compromised if grip is too wide.'),(70,70,'Parallel grip can be used for variety or when flexibility does not permit standard overhand grip further back.'),(71,71,'Pull head back slightly so bar does not head. Range of motion will be compromised if grip is too wide.'),(72,72,'Range of motion will be compromised if grip is too wide.'),(73,73,'Benches must be secured to prevent sliding on floor. Also, each benches\' base of support should be under edge of bench where hand is placed to prevent bench toppling under body weight. Falling from an inverted position may result in very serious injury. Also known as Elevated Handstand Push-up.'),(74,74,'Instead of scooting hips forward, hands can be eased backwards.'),(75,75,'See PNF stretch techniques. Also see Seated Front Deltoid Stretch for similar static stretch.'),(76,76,'A stationary bar can also be used instead of wall.'),(77,77,'Pike Press (for front delts) differs from Pike Push-up (for upper chest) in that, feet are at closer distance to hands so body is more inverted in lowest position. Keep knees and back straight. A slight curve (spinal flexion) is acceptable if hamstrings are tight.'),(78,78,'Keep knees and back straight. A slight curve (spinal flexion) is acceptable if hamstrings are tight.'),(79,79,'At higher angles, feet can be placed flat on floor. When angled further back, only heels may contact floor with forefeet raising upward. Dismounting can be achieved by walking backward until body is upright. This exercise can be performed on TRXⓇ style suspension trainer or adjustable length gymnastics rings'),(80,80,'A stationary bar can also be used instead of wall.'),(81,81,'Maintain fixed slightly bent elbow position throughout exercise. Stirrup is raised by shoulder abduction, not external rotation. Also see Cable Lateral Raise performed with pulleys very close together.'),(82,82,'Bar can be received from barbell rack, standing behind bar\nmid-thigh height. See\nUpright\nRow Safety.'),(83,84,'Bar can be recieved from barbell rack, standing behind bar mid-thigh height. See Upright Row Safety.'),(84,86,'See Upright Row Safety.'),(85,83,'Maintain fixed elbow position (10° to 30° angle) throughout exercise. Stirrup is raised by shoulder abduction, not external rotation.'),(86,85,'Maintain fixed slightly bent elbow position throughout exercise. At top of movement, elbows (not necessarily dumbbells) should be directly lateral to shoulders since elbows are slightly bent forward. Stirrup is raised by shoulder abduction, not external rotation. If elbows drop lower than wrists, front deltoids become primary mover instead of lateral deltoids.'),(87,87,'See Upright Row Safety.'),(88,88,'To prevent cable parts from catching, stand with body turned very subtly to side of cable behind other. Positioning one cable slightly in front of other cable may result in slight asymmetrical movement. Therefore, alternate opposite arm positions every other workout or set. See Upright Row Safety. Also see Cable Upright Row with two stirrup attachments attached to single pulley cable.'),(89,89,'See Upright Row Safety.'),(90,90,'See\nUpright Row Safety.'),(91,91,'Maintain fixed slightly bent elbow position throughout exercise. Stirrup is raised by shoulder abduction, not external rotation.'),(92,92,'Keep torso upright while maintaining fixed slightly bent elbow position throughout exercise. Stirrup is raised by combining shoulder abduction and flexion with slight external rotation. Also see Cable Seated Y Raise on dual pulley machine with stirrup attachments.'),(93,93,'Maintain fixed slightly bent elbow position throughout exercise. Stirrup is raised by combining shoulder abduction and flexion. Slight shoulder external rotation may occur with elbows bent. Front Deltoid assists shoulder flexion if upper arm angle is slightly\n\n\nhigh. Rear Deltoid assists shoulder horizontal abduction if upper arm angle is slightly low. Also see Cable Seated Y Raise on dual pulley Cable Row machine.'),(94,95,'See Upright\nRow Safety. Also see side view.'),(95,94,'Maintain fixed elbow position (10° to 30° angle) throughout exercise. At top of movement, elbow (not necessarily dumbbell) should be directly lateral to shoulder since elbow is slightly bent forward. Dumbbell is raised by shoulder abduction, not external rotation. As elbow drops lower than wrist, front deltoid become primary mover instead of lateral deltoid. See Lateral Raise Errors.'),(96,96,'In order for lateral deltoid to be exercised, dumbbell must be raised by shoulder abduction, not external rotation. Also see exercise Dumbbell Incline Lateral Raise performed on preacher bench.'),(97,97,'Keep torso upright throughout exercise. Stirrup is raised by combining shoulder abduction and flexion. Slight shoulder external rotation may occur with elbows bent. Front Deltoid assists shoulder flexion if upper arm angle is slightly high. Rear Deltoid assists shoulder horizontal abduction if upper arm angle is slightly low. Also see Cable Seated Y Raise on single pulley machine with rope attachment.'),(98,98,'Setup requires attaching two stirrup attachments to single pulley cable. Also see Cable Upright Row with dual pulley. See Upright Row Safety.'),(99,99,'Keep elbows pointed high while maintaining slight bend through elbows (10° to 30° angle) throughout movement. At top of movement, elbows (not necessarily dumbbells) should be directly lateral to shoulders since elbows are slightly bent forward. Dumbbells are raised by shoulder abduction, not external rotation. If elbows drop lower than wrists, front deltoids become primary mover instead of lateral deltoids. To keep resistance targeted to side delt, torso is bent over slightly. See other view and Lateral Raise Errors.'),(100,100,'Dumbbell is raised by shoulder abduction, not external rotation.'),(101,101,'Maintain fixed elbow position (10° to 30° angle) throughout exercise. At top of movement, elbow (not necessarily dumbbell) should be directly lateral to shoulder since elbow is slightly bent forward. Dumbbell is raised by shoulder abduction, not external rotation. As elbow drops lower than wrist, front deltoid becomes primary mover instead of lateral deltoid. See Lateral Raise Errors.'),(102,102,'See Upright Row Safety.'),(103,103,'When dumbbells are raised, wrist can be flexed, extended, or keep neutral.'),(104,104,'When dumbbells are raised, wrists should be in front or just below of shoulders; elbows should be to sides, not pointing\n\n\nforward. See Upright Row Safety.'),(105,105,'See Upright Row Safety. Also see Seated Upright Row.'),(106,107,'None.'),(107,108,'When dumbbell is raised, wrist should be in front or just below of shoulder; elbow should be to side, not too pointing forward. See Upright Row Safety. Also see Dumbbell One Arm Upright Row in standing position.'),(108,106,'If necessary, lean forward slightly to keep elbows directly lateral to body. Also see alternative machine.'),(109,109,'If elbows drop much lower than wrists, front deltoids become primary mover instead of lateral deltoids. Torso can also lean forward slightly to keep resistance targeted to side delt.'),(110,110,'If elbows drop much lower than wrists, front deltoids become primary mover instead of lateral deltoids.'),(111,112,'Positioning arm on upper chest stretches rear deltoid. See Rear Delt Stretch.'),(112,113,'None'),(113,114,'At higher angles, feet can be placed flat on floor. When angled further back, only heels may contact forefeet floor with forefeet raising upward. Dismounting can be achieved by walking backward until body is upright. This exercise can be performed on TRXⓇ style suspension trainer or adjustable length gymnastics rings.'),(114,115,'See Upright\nRow Safety.'),(115,116,'See Upright Row Safety.'),(116,117,'If upper arm travels closer than perpendicular to trunk, latissimus dorsi becomes involved. Elbows should be raised directly lateral to shoulders. Bench should be just high enough to prevent barbell from hitting floor and close to horizontal. Lying at 45° is not sufficient angle to target rear deltoids. Much lighter resistance is required as Cambered Bar Lying Row.'),(117,118,'Upper arms should travel in horizontal path at shoulder height (not downward) to minimize Latissimus Dorsi involvement.'),(118,119,'The relatively powerful Latissimus\nDorsi\n becomes involved:'),(119,120,'Upper arm should travel perpendicular to torso to minimize latissimus dorsi involvement. Elbows may bend slightly at top of movement (as shown) or they may be kept fixed.'),(120,121,'Flexion of wrist can allow for slightly greater range of movement near top, but this movement optional.'),(121,122,'Upper arms should travel in horizontal path at shoulder height (not downward) to minimize Latissimus Dorsi involvement.'),(122,123,'Elbow width is determined when elbows are raised at height of shoulders out to sides. The relatively powerful Latissimus Dorsi becomes involved:'),(123,124,'If upper arm travels closer than perpendicular to trunk, latissimus dorsi becomes involved. Elbows should be raised directly lateral to shoulders. Positioning torso at 45° is not sufficient angle to target rear deltoids. Keep torso bent over approximately horizontal. Knees are bent in effort to keep low back straight (See Hamstring Inflexibility). If low back becomes rounded due to tight hamstrings, either knees should be bent more or torso may not be positioned as low. If low back is rounded due to poor form, deadlift weight to standing position and lower torso into horizontal position with knees bent and back straight. Much lighter resistance is required as Barbell Bent-over Row.'),(124,125,'Upper arm should travel in horizontal path at shoulder height (not downward) to minimize Latissimus Dorsi involvement.'),(125,126,'Dual pulley cables should be positioned approximately shoulder height or not much lower.\n\n\nThe relatively powerful Latissimus Dorsi becomes involved:'),(126,127,'The relatively powerful Latissimus Dorsi becomes involved:'),(127,128,'The relatively powerful Latissimus Dorsi becomes involved:'),(128,129,'Upper arm should travel in perpendicular path to torso to minimize Latissimus Dorsi involvement. If stirrups are not within reach, training partner can hand exercises cable attachments.'),(129,130,'Upper arm should travel in perpendicular path to torso to minimize Latissimus Dorsi involvement.'),(130,131,'The relatively powerful Latissimus Dorsi becomes involved:'),(131,132,'Dumbbells are raised by shoulder transverse abduction, not external rotation, nor extension. Upper arm should travel in perpendicular path to torso to minimize latissimus dorsi involvement. Upper arm should travel in perpendicular path to torso to minimize latissimus dorsi involvement. Bench should be high enough to prevent dumbbells from hitting floor and close to horizontal. Also see exercise performed on Lying Rear Delt Apparatus. Lying at 45° is not sufficient angle to target rear deltoids. Also see Rear Lateral Raise Errors.'),(132,133,'If upper arm travels closer than perpendicular to trunk, latissimus dorsi becomes involved. Elbows should be raised directly lateral to shoulders. Bench should be just high enough to prevent dumbbells from hitting floor and close to horizontal. Also see exercise performed on Lying Rear Delt Apparatus. Lying at 45° is not sufficient angle to target rear deltoids. Much lighter resistance is required as Dumbbell Lying Row.'),(133,134,'Upper arm should travel perpendicular to torso to minimize latissimus dorsi involvement. Elbows may bend slightly at bottom of movement (as shown) or they may be kept fixed. If low back cannot be kept straight due to inflexibility of hamstrings, try keeping knees bent more.'),(134,135,'Latissimus Dorsi becomes involved if elbows drop below shoulders.'),(135,136,'The relatively powerful Latissimus Dorsi becomes involved:'),(136,137,'Maintain fixed elbow position straight or slightly bent and keep upper arm perpendicular to trunk throughout exercise.'),(137,138,'Dumbbells are raised by shoulder transverse abduction, not external rotation, nor extension. Upper arm should travel in perpendicular path to torso to minimize relatively powerful latissimus dorsi involvement. In other words, at top of movement, elbows (not necessarily dumbbells) should be directly lateral to shoulders since elbows are slightly bent forward. To exercise posterior deltoid and not lateral deltoid, keep torso close to horizontal. Positioning torso at 45° is not sufficient angle to target rear deltoids. Knees are bent in effort to keep low back straight (See Hamstring Inflexibility). If low back becomes rounded due to tight hamstrings, either knees should be bent more or torso may not be positioned as low. If low back is rounded due to poor form, slowly lower torso into horizontal position with knees bent and back straight. Also see Rear Lateral Raise Errors.'),(138,139,'Bench should be horizontal and be high enough to prevent dumbbell from touching floor. Upper arm should travel in perpendicular path to torso to minimize latissimus dorsi involvement. Bench should be high enough to prevent dumbbells from hitting floor and close to horizontal. Lying at 45° is not sufficient angle to target rear deltoids. This exercise AKA \"prone full can\" has been suggested to exercise supraspinatus muscle in rehabilitation settings (Blackburn TA, et al. 1990; Reinold MM, et al. 2007).'),(139,140,'If upper arm travels closer than perpendicular to trunk, latissimus dorsi becomes involved. Elbow should be raised dire\n\n\nctly lateral to shoulder. Positioning torso at 45° is not sufficient angle to target rear deltoids. Keep torso bent over approximately horizontal. See side view of Dumbbell Rear Delt Row. Much lighter resistance is required as Dumbbell Bent-over Row.'),(140,141,'If upper arm travels closer than perpendicular to trunk, latissimus dorsi becomes involved. Elbows should be kept on same movement plane as shoulders. Much lighter resistance is required as Lever Incline Row.'),(141,142,'Upper arm should travel in perpendicular path to torso. At lower portion of exercise, keep elbows pointed outward below shoulders. At upper portion of exercise, keep elbows pointed outward to sides of shoulders. Legs may be kept together, extending off end (as shown), or bent straddling.'),(142,145,'None.'),(143,143,'If upper arm travels closer than perpendicular to trunk, latissimus dorsi becomes involved. Elbows should be kept same height as shoulders. Much lighter resistance is required as Lever Seated Row or even Wide Grip Lever Seated Row.'),(144,144,'Dumbbells are raised by shoulder transverse abduction, not external rotation, nor extension. Upper arm should travel in perpendicular path to torso to minimize relatively powerful latissimus dorsi involvement. This mean at top of movement, elbows (not necessarily dumbbells) should be directly lateral to shoulders since elbows are slightly bent forward. To exercise posterior deltoid and not lateral deltoid, keep upper torso close to horizontal. Positioning upper torso at 45° is not sufficient angle to target rear deltoids. The spine can be flexed to achieve this positioning if thighs can provide sufficient support for torso. Some individuals may not be able to bend sufficiently at hip due to flexibility or girth constraints. Also see Rear Lateral Raise Errors and Low Back Alignment Exceptions.'),(145,147,'Upper arm should travel in perpendicular path to torso to minimize Latissimus Dorsi involvement.'),(146,148,'Platform height should allow pivot point of shoulders to be aligned with lever fulcrum. Upper arm should travel in perpendicular path to torso to minimize relatively powerful latissimus dorsi involvement. At top of movement, elbows (not necessarily dumbbells) should be directly lateral to shoulders since elbows are slightly bent forward. To exercise posterior deltoid and not lateral deltoid, keep torso close to horizontal. Positioning torso at 45° is not sufficient angle to target rear deltoids. Knees are bent in effort to keep low back straight (See Hamstring Inflexibility). Apparatus was originally designed to be used for Extended Arm Kneeling Lateral Raise. Also see Rear View Angle.'),(147,149,'If upper arm travels closer than perpendicular to trunk, latissimus dorsi becomes involved. Elbows should be kept same height as shoulders. Also see exercise performed on alternative lever row machine. Much lighter resistance is required as compared to Lever Seated Row.'),(148,150,'Keep elbows raised at same height of shoulders to minimize Latissimus Dorsi involvement. Thumbs down grip may be used so shoulders more naturally assume height of shoulders. Some machines allow for a more neutral overhand grip.'),(149,151,'Platform height should allow pivot point of shoulders to be aligned with lever fulcrum. Upper arm should travel in perpendicular path to torso. At lower portion of exercise, keep elbows pointed outward below shoulders. At upper portion of exercise, keep elbows pointed outward to sides of shoulders. Knees are bent in effort to keep low back straight (See Hamstring Inflexibility).'),(150,152,'If upper arm travels closer than perpendicular to trunk, latissimus dorsi becomes involved. Elbows should be raised directly lateral to shoulders. Keep torso bent over as far as possible allowing just enough height to fully extend arms. Knees are bent in effort to keep low back straight (See Hamstring Inflexibility). If low back becomes rounded due to tight hamstrings, either knees should be bent more or torso may not be positioned as low. If low back is rounded due to poor form, slowly lower torso into horizontal position with knees bent and back straight. Much lighter resistance is required as Lever T-Bar Row.'),(151,155,'Keep elbows raised at same height of shoulders to minimize Latissimus Dorsi involvement. Exercise can also be performed with parallel grip, either with thumbs up or thumbs down positioning.'),(152,153,'Upper arm should travel in perpendicular path to torso. At lower portion of exercise, keep elbows pointed outward below shoulders. At upper portion of exercise, keep elbows pointed outward to sides of shoulders. Legs may be kept together, extending off end, or bent straddling bench as demonstrated.'),(153,157,'To maintain hips and back against pad during lift, legs must push into foot bar while keeping spine ridged. If apparatus is unavailable, a similar movement can be performed on certain pec deck machines with adequate ranges of motion.'),(154,156,'Pronated grip will internally rotate shoulders so elbows are kept at height of shoulders. Preventing elbows from dropping below shoulders will minimize Latissimus Dorsi involvement. With thumbs down grip, shoulder must be deliberately internally rotated to keep elbow at proper height. Some machines allow for a more neutral overhand grip.'),(155,154,'Can be performed on certain pec deck machines as shown if their range of motion and design are adequate, although Gripless Lever Seated Reverse Fly machine is typically better suited for this exercise.'),(156,158,'If elbows fall so upper arms no longer travels perpendicular to trunk, Latissimus Dorsi becomes involved. Elbows should be positioned directly lateral to shoulders at highest position. Pulling bar to lower chest is not sufficient angle to target rear deltoids. A higher bar (ie: lighter resistance) is required than what is required on Inverted Row. Bar height can be adjusted to vary resistance. See Gravity Vectors for greater understanding of how body angle influences resistance. Also known as Body Row or Supine Row.'),(157,159,'If elbows fall so upper arms no longer travels perpendicular to trunk, Latissimus Dorsi becomes involved. Elbows should be positioned directly lateral to shoulders at highest position. Pulling bar to lower chest is not sufficient angle to target rear deltoids. A higher bar (ie: lighter resistance) is required than what is required on Inverted Row. Bar height can be adjusted to vary resistance. See Gravity Vectors for greater understanding of how body angle influences resistance. Also known as Body Row or Supine Row.'),(158,160,'If upper arm travels closer than perpendicular to trunk, latissimus dorsi becomes involved. Elbows should be raised directly lateral to shoulders. Positioning torso at 45° is not sufficient angle to target rear deltoids. Keep torso bent over approximately horizontal. Knees are bent in effort to keep low back straight (See Hamstring Inflexibility). If low back becomes rounded due to tight hamstrings, either knees should be bent more or torso may not be positioned as low. If low back is rounded due to poor form, slowly lower torso into horizontal position with knees bent and back straight. Much lighter resistance is required as Smith Bent-over Row. Also see front angled view.'),(159,162,'Upper arms should travel in transverse path at shoulder level without allowing elbows to drop to minimize Latissimus Dorsi involvement. A very upright position (ie: very light resistance) with one foot positioned slightly back (see \'Easier\') is typically required for proper execution. Take care to maintain tension on suspension trainer near top of movement. Dismounting can be achieved by walking backward until body is upright or stepping out at top of movement. This exercise can be performed on TRXⓇ style suspension trainer or adjustable length gymnastics rings.'),(160,163,'If elbows fall so upper arms no longer travels perpendicular to trunk, Latissimus Dorsi becomes involved. Elbows should be positioned directly lateral to shoulders at highest position throughout movement. Executing exercise with elbows dropping lower than shoulders is not sufficient position to target rear deltoids. A more upright position (ie: lighter resistance) is required than what is used on Suspended Row for General B ack. Dismounting can be achieved by walking backward until body is upright.'),(161,164,'Positioning arm on lower chest stretches side deltoid. See Side Delt Stretch.'),(162,165,'None'),(163,167,'Raise toward 10 o\'clock with left arm and toward 2 o\'clock with right arm. Maintain straight elbow position with elbow pointing outward throughout exercise.'),(164,168,'Raise toward 10 o\'clock with left arm and toward 2 o\'clock with right arm. Maintain straight elbow position with elbow pointing outward throughout exercise.'),(165,169,'Maintain straight elbow position throughout exercise. Exercise may also be performed with shoulder traveling up to 30º forward, more inline with plane of scapular.'),(166,170,'Maintain straight or nearly straight elbow position with elbows pointing outward throughout exercise. If low pulley is fixed, turn slightly away from low pulley.'),(167,171,'Maintain straight or nearly straight elbow position with elbows pointing outward throughout exercise.'),(168,172,'Grip can be slightly narrower than shoulder width but not too close. Too close of grip can decrease range of motion, may tend to hyper-adduct wrist joint, and unnecessarily decrease stability of bar.\n\n\nAlso see Bench Press Analysis.'),(169,173,'See mount and dismount. Some assisted machines require you to kneel on pad. Also see Assisted Chest Dip.'),(170,174,'Movement is hybrid between Bench Press and Triceps Extension. A false grip or standard thumb opposing grip can be taken, approximately 16\" (40 cm) apart for men. Bar is brought downward anywhere between chin and upper chest. As to minimize shoulder involvement, keep elbows up, allowing elbow to fold upon itself. Range of motion is determined by muscle mass of forearm and biceps. After mastering form and gradually progressing in resistance, push barbell upward more rapidly for greater power development.'),(171,175,'See mount and dismount. Some assisted machines require you to stand on bar. Also see Assisted Chest Dip.'),(172,177,'Grip can be slightly narrower than shoulder width but not too close. Also see Bench Press Analysis.'),(173,176,'With arms fully extended, bar can be brought back over upper chest. Shoulders can be internally rotated between repetitions as needed to allow for relative release of tension in muscles. Barbell can be received from the floor or from rack either situated over abdomen or from behind head. Exercise can also be performed with straight barbell. Movement with cambared bar as shown above is also known as EZ Barbell or EZ Bar Lying Triceps Extension.'),(174,179,'With arms fully extended, bar can be brought back over shoulders. Shoulders can be internally rotated between repetitions as needed to allow for relative release of tension in muscles. Either straight barbell or EZ barbell can be used.'),(175,178,'Slow barbell\'s descent as it approaches forehead. Exercise can also be performed with elbow traveling slightly back during extension. With this altered form, barbell essentially moves in straight line, up and down, over forehead. Either straight barbell or EZ barbell can be used. See Lying Triceps Extension Bench with rack.'),(176,181,'With arms fully extended, bar can be brought back over shoulders. Shoulders can be internally rotated between repetitions as needed to allow for relative release of tension in muscles. Either straight barbell or EZ barbell can be used.'),(177,180,'Let barbell pull arm back to maintain full shoulder flexion. Exercise may be performed standing or on seat with or without back support. Either straight barbell or EZ barbell can be used.'),(178,182,'Let cable resistance pull arm back to maintain degree of shoulder flexion, dependent upon flexibility.'),(179,183,'Keep elbow approximately same position throughout movement.'),(180,184,'Avoid using shoulders by attempting to press bar over head. If incline is designed to pivot back, lean seat back for mount & dismount.'),(181,185,'Let cable resistance pull arm back to maintain degree of shoulder flexion, dependent upon flexibility.'),(182,186,'With arms fully extended, shoulders can be internally rotated between repetitions as needed to allow for relative release of tension in muscles.'),(183,187,'Let cable attachment pull arm back to maintain full shoulder flexion.'),(184,188,'A very low pulley and/or high decline is needed to achieve full range of motion at bottom position. With arms fully extended, shoulders can be internally rotated between repetitions as needed to allow for relative release of tension in muscles.'),(185,189,'Position face close to cable to provide resistance at top of motion. Elbows is brought close to body so arms are vertical at bottom of motion, either at or near the end of full extension, or in one movement as bar is pushed downward.'),(186,190,'The elbow can travel up slightly at top of motion. Stay close to cable to provide resistance at top of motion.'),(187,191,'The elbow can travel up slightly at top of motion. Stay close to cable to provide resistance at top of motion.'),(188,192,'If seat is positioned back behind pulleys as shown, bending forward can provide resistance at top of motion. See Angle of Pull.'),(189,193,'Wrist can be flexed slightly at top of movement to compensate for hyperextension required at bottom of movement. The elbow can travel up slightly at top of motion. Stay close to cable to provide resistance at top of motion.'),(190,194,'Stand far enough away from pulley to keep cable taut in lowered position. Keep elbow approximately same position throughout movement.'),(191,195,'The elbow can travel up slightly at top of motion. Stay close to cable to provide resistance at top of motion.'),(192,197,'The elbow can travel up few inches at top of motion. Step close to cable to provide resistance at top of motion.'),(193,196,'Keep back against back pad throughout exercise.'),(194,198,'If high pulley is adjustable, lower pulley slightly to provide resistance at top of motion. If high pulley is fixed, position bench distance away from cable column. If incline is positioned too high, range of motion at lower position may be compromised.'),(195,200,'If cable dip machine is not available, A dip bar placed in front of low pully cable. Also see rear view and Cable Chest Dip.'),(196,199,'Let cable pull arm back to maintain full shoulder flexion. Exercise can also be performed on traditional low pulley setup. Also see exercise with Pronated Grip.'),(197,201,'Let cable attachment pull arm back to maintain full shoulder flexion.'),(198,202,'Let cable pull arm back to maintain full shoulder flexion. Also see exercise with Supinated Grip.'),(199,203,'Let dumbbell pull back arm slightly to maintain full shoulder flexion. Keep elbow in so movement does not turn into overhead press. Back support sho\n\n\nuld not be so high that it interferes with dumbbell being completely lowered (i.e. full range of motion). See rear view. Exercise may be performed on bench without back support.'),(200,204,'With arms fully extended, dumbbells can be brought to upper chest between repetitions as needed to allow for relative release of tension in muscles.'),(201,205,'For greater range of motion, upper arm can be positioned with elbow slightly higher than shoulder. Also see Triceps Kickback Errors.'),(202,206,'Keep elbows pointed up or just slightly back throughout movement.'),(203,207,'Let cable attachment pull arm back to maintain full shoulder\nflexion.\n\n\nExercise can also\nbe performed seated on bench or seat with back support just below\nshoulders.'),(204,208,'Movement can also be performed on old fashioned incline bench without seat.'),(205,209,'Position wrists closer together to keep elbows from pointing out too much. Let dumbbell pull back arm to maintain full shoulder flexion. Consider using seat with back support as illustrated. Back support should not be so high that it interferes with dumbbell being completely lowered (i.e. full range of motion). If shoulder flexion flexibility is not adequate, position hips slightly forward (as illustrated) so elbows are positioned upward. Position body more upright if shoulder flexion flexibility is adequate. See suggested mount & dismount.'),(206,210,'Let dumbbell pull back arm to maintain full shoulder flexion. Consider using seat with back support.'),(207,211,'Hands will be closer together at top of movement as compared to Barbell Close Grip Bench Press since lever arms travel inward at top of motion. Also see Bench Press Analysis.'),(208,212,'Grip can be slightly narrower than shoulder width but not too close. Also see Bench Press Analysis.'),(209,213,'When finished, push foot lever down, release handles, then release foot lever.'),(210,214,'When finished, push foot lever down, release handles, then release foot lever.'),(211,215,'Also see movement performed on alternative machine.'),(212,216,'In effort to achieve fuller range of motion, head can be positioned down so handles can clear over head. With heavy resistance, back pad will need to be adjusted to keep torso close to arm pad. Position armpit to rest near top of pad. Back of upper arm should remain on pad throughout movement.'),(213,217,'Also see Lever Chest Dip.'),(214,218,'With heavy resistance, back pad will need to be adjusted to keep torso close to arm pad. Adjust seat height so back of upper arms rest on padding. If seat is too high, shoulder will need to rise near end of extension to complete final range of motion since forearms will make contact with pad before lockout. If seat is too low, range of motion will be compromised because elbows will not be completely flexed at beginning of movement. Also see Lever Triceps Extension on alternative apparatus.'),(215,219,'See exercise on alternative machine. Also see Lever Chest Dip on machine facing away from fulcrum and Lever Chest Dip.'),(216,220,'If lever arms freely move together or apart, keep moderately close grip throughout movement. Triceps will not be as involved in movement if grip is lower than chest. Seat height should be adjusted so bar is at least lower chest height. Also Lever Parallel Grip Bench Press for chest.'),(217,222,'Also Lever Parallel Grip Incline Bench Press for upper chest.'),(218,223,'If machine has secondary lever (as shown), elbows do not have to be exactly aligned with primary fulcrum.'),(219,224,'With heavy resistance, back pad will need to be adjusted to keep torso close to arm pad. Adjust seat height, so back of upper arms rest on padding. If seat is too high, shoulder will need to rise near end of extension to complete final range of motion since forearms will make contact with pad before lockout. If seat is too low, range of motion will be compromised because elbows will not be completely flexed at beginning of movement. If machine has secondary lever (as shown), elbows do not have to be exactly aligned with primary fulcrum. Also see Lever Triceps Extension on alternative apparatus.'),(220,225,'This particular machine design is rare. See typical dip machines:​​​​'),(221,226,'Grip can be slightly narrower than shoulder width but not too close. Also see Bench Press Analysis.'),(222,228,'Also see parallel grip Lever Triceps Dip and Lever Chest Dip.'),(223,229,'Grip can be slightly narrower than shoulder width but not too close. Also see Bench Press Analysis.'),(224,230,'Bench height should allow for full range of motion. If assistant is not available, place weight on lap sitting on floor or edge of bench.'),(225,231,'Also see Weighted Chest Dips.'),(226,232,'Both upper and lower body must be kept straight throughout movement. Exercise can be performed without additional weight (See Close Grip Pushup without weight). If additional weight is used, partner will need to add and remove weight, and keep weight from sliding off back. See wider grip push-up.'),(227,233,'Both upper and lower body must be kept straight throughout movement. Forefeet can remain on floor as long as body is pivoting on knees. Also see close grip variation and wider grip push-ups on knees.'),(228,234,'Bench height should allow for full range of motion.'),(229,235,'Both upper and lower body must be kept straight throughout movement. See wider grip push-up.'),(230,236,'Bench height should allow for full range of motion.'),(231,237,'Also see Band-assisted Chest Dips.'),(232,238,'Bench height should allow for full range of motion.'),(233,240,'Also see Chest Dips.'),(234,241,'Instead of 1 Triceps Rope (as shown), 2 ab slings or 2 nylon/cloth Stirrups with long straps can also be used (see how to loop cable stirrup onto bar) with overhand grip. Both upper and lower body must be kept straight throughout movement. Height of bar affects difficulty of movement. See Gravity Vectors for greater understanding of how body angle influences resistance. Also see Suspended Triceps Extension with Suspension Trainer.'),(235,242,'Both upper and lower body must be kept straight throughout movement. Height of bar affects difficulty of movement. See Gravity Vectors for greater understanding of how body angle influences resistance. Also see wider grip push-up.'),(236,243,'In above clip, hands are positioned at ends of main segments of benches with fingers between gaps. On standard benches, hands should be placed near ends of benches. Perform on higher benches if slight stretch is not felt. Also see Bench Dip and Chest Dip (between benches).'),(237,244,'If lower body is used for assistance, Quadriceps are utilized. Hips are kept straighter and body more upright, as compared to Assisted Chest Dip. This exercise can be performed on adjustable length gymnastics rings or a dual anchored suspension trainer.'),(238,245,'In above clip, hands are positioned at ends of main segments of benches with fingers between gaps. On standard benches, hands should be placed near ends of benches. Perform on higher benches if slight stretch is not felt. Also see Bench Dip (bent knee) and Chest Dip (bent knees between benches).'),(239,247,'This exercise can be performed on adjustable length gymnastics rings or a dual anchored suspension trainer. To emphasize triceps, position body more upright than demonstrated by positioning hips straighter. Also see Chest Dips.'),(240,246,'Both upper and lower body should be kept straight throughout movement. Angle of body affects difficulty of movement. See Gravity Vectors for greater understanding of how body angle influences resistance. Also see Suspended Triceps Extension with Triceps Rope. This exercise can be performed on TRXⓇ style suspension trainer or adjustable length gymnastics rings.'),(241,249,'None.'),(242,250,'See Overhead Lat Stretch for similar exercise which can be performed with this stretch.'),(243,251,'See PNF Overhead Lat Stretch for similar exercise which can be performed with this stretch. Also see Overhead Triceps Stretch for similar static stretch.'),(244,252,'If lower body is used for assistance, Quadriceps are utilized. Hips are kept straighter and body more upright, as compared to Assisted Chest Dip.'),(245,253,'When elbow is fully flexed, it can travel forward slightly, allowing forearm to be no more than vertical. This additional movement allows for relative release of tension in muscles between repetitions. Pulleys should not be too far apart. Cables can be positioned under shoulders with ad hoc or customized set up. See Cable Seated Curl and movement performed on apparatus facing double low pulleys.\nAlso see mechanical analysis of arm curl and question regarding elbow position.'),(246,254,'When elbow is fully flexed, it can travel forward slightly, allowing forearm to be no more than vertical. This additional movement allows for relative release of tension in muscles between repetitions. Pulleys should not be too far apart.\nAlso see mechanical analysis of arm curl and question regarding elbow position.'),(247,255,'Bringing ebows back forward, allowing forearms to be no more than vertical, permits a relative release of tension in muscles between repetitions. Exercise can also be performed with EZ barbell, in which case, making it also known as EZ Barbell or EZ Bar Drag Curl. Also see standard Barbell Curl.'),(248,256,'When elbows are fully flexed, they can travel forward slightly allowing forearms to be no more than vertical. This additional movement allows for relative release of tension in muscles between repetitions. Exercise can also be performed with straight barbell. Movement with cambered bar as shown above is also known as EZ Barbell Curl or EZ Bar Curl. Also see mechanical analysis of arm curl and question regarding elbow position.'),(249,257,'When elbows are fully flexed, they can travel forward slightly, allowing forearms to be no more than vertical. This additional movement allows for relative release of tension in muscles between repetitions.'),(250,259,'When elbows are fully flexed, they can travel slightly forward, allowing forearms to be no more than vertical. This additional movement allows for relative release of tension in muscles between repetitions.'),(251,258,'When elbows are fully flexed, they can travel forward slightly, allowing forearms to be no more than vertical. This additional movement allows for relative release of tension in muscles between repetitions. Pulleys should not be too far apart. Cables can be positioned under shoulders with ad hoc or customized set up. Also see Cable Alternating Seated Curl.'),(252,260,'An alternative method is to stand facing with side of exercise arm toward low pulley. When elbow is fully flexed, it can travel forward slightly allowing forearms to be no more than vertical. This additional movement allows for relative release of tension in muscles between repetitions.\nAlso see mechanical analysis of arm curl and question regarding elbow position.'),(253,261,'When elbow is fully flexed, it can travel forward slightly, allowing forearm to be no more than vertical. This additional movement allows for relative release of tension in muscles between repetitions. Pulleys should not be too far apart.'),(254,262,'When elbows are fully flexed, they can travel upward, slightly allowing forearms to be no more than horizontal in this lying posture. This additional movement allows for relative release of tension in muscles between repetitions.\nAlso see mechanical analysis of arm curl and question regarding elbow position.'),(255,263,'Biceps may be exercised alternating (as described), simultaneous, or in simultaneous-alternating fashion. When elbow is fully flexed, it can travel forward slightly, allowing forearms to be no more than vertical. This additional movement allows for relative release of tension in muscles between repetitions. Also see mechanical analysis of arm curl and question regarding elbow position.'),(256,264,'Bar height can be adjusted to vary resistance. See Gravity Vectors for greater understanding of body angle influences resistance. Also known as Underhand Body Row or Underhand Supine Row.'),(257,265,'The biceps may be exercised simultaneous. If machine does not provide support for back of arm, keep elbows from traveling back, particularly during initial flexion. Some machines do not offer adequate resistance at initial range of motion. Consider positioning wrists with slight flexion to compensate.'),(258,267,'A stationary bar can also be used instead of wall.'),(259,268,'Instead of scooting hips forward, hands can be eased backwards.'),(260,266,'The biceps may be exercised alternating or simultaneous. If machine does not provide support for back of arm, keep elbows from traveling back, particularly during initial flexion. Some machines do not offer adequate resistance at initial range of motion. Consider positioning wrists with slight flexion to compensate.'),(261,269,'This exercise may be performed by alternating (as described), simultaneous, or in simultaneous-alternating fashion. When elbow is fully flexed, it can travel forward slightly, allowing forearms to be no more than vertical. This additional movement allows for relative release of tension in muscles between repetitions. Also see mechanical analysis of arm curl and question regarding elbow position.'),(262,271,'Fixed bar should be just high enough to allow arm to fully extend. See Gravity Vectors for greater understanding of how body angle influences resistance. Also known as Underhand Body Row or Underhand Supine Row.'),(263,270,'Easier'),(264,272,'None.'),(265,273,'Participant\'s wrists must continue to face downward. See PNF stretch techniques. Also see Seated Biceps Stretch for similar static stretch.'),(266,274,'A stationary bar can also be used instead of wall.'),(267,275,'Seat should be adjusted to allow arm pit to rest near top of pad. Back of upper arm should remain on pad throughout movement. The long head (lateral head) of biceps brachii is activated significantly more than short head (medial head) of biceps brachii since short head enters into active insufficiency as it continues to contract. At bottom position, weight stack in use should not make contact with remaining weight stack. Also see movement on horizontal pad.'),(268,276,'Seat should be adjusted to allow arm pit to rest near top of pad. Back of upper arms should remain on pad throughout movement. The long head (lateral head) of biceps brachii is activated significantly more than short head (medial head) of biceps brachii since short head enters into active insufficiency as it continues to contract. At bottom position, weight stack in use should not make contact with remaining weight stack.'),(269,277,'The long head (lateral head) of biceps brachii is activated significantly more than short head (medial head) of biceps brachii since short head enters into active insufficiency as it continues to contract.'),(270,281,'Feet can be staggered and bent slightly (if needed) to allow\narm pit to rest near top of pad.\n\n\nBack\nof upper arm should remain on pad throughout movement. The long\nhead (lateral head) of biceps brachii is activated significantly\nmore than short head (medial head) of biceps brachii since short\nhead enters into\nactive\ninsufficiency\n as it continues to contract. At bottom position,\nweight stack in use should not make contact with remaining weight\nstack. Also see movement on\nhorizontal pad.'),(271,280,'Also known as Barbell Spider Curl. The long head (lateral head) of biceps brachii is activated significantly more than short head (medial head) of biceps brachii since short head enters into active insufficiency as it continues to contract.'),(272,278,'Seat should be adjusted to allow arm pit to rest near top of pad. Back of upper arms should remain on pad throughout movement. The long head (lateral head) of biceps brachii is activated significantly more than short head (medial head) of biceps brachii since short head enters into active insufficiency as it continues to contract. At bottom position, weight stack in use should not make contact with remaining weight stack.'),(273,279,'Stirrup can be hung from one side of rack for easier access.\nFeet can be staggered and bent slightly (if needed) to allow\narm pit to rest near top of pad. Back of upper arm should remain\non pad throughout movement. The long head (lateral head) of biceps\nbrachii is activated significantly more than short head (medial\nhead) of biceps brachii since short head enters into\nactive\ninsufficiency\n as it continues to contract. At bottom position,\nweight stack in use should not make contact with remaining weight\nstack.'),(274,282,'Body should be positioned to allow arm pit to rest near top of pad. Back of upper arm should remain on pad throughout movement. The long head (lateral head) of biceps brachii is activated significantly more than short head (medial head) of biceps brachii since short head enters into active insufficiency as it continues to contract.'),(275,283,'Seat should be adjusted to allow arm pit to rest near top of pad. Back of upper arm should remain on pad throughout movement. The long head (lateral head) of biceps brachii is activated significantly more than short head (medial head) of biceps brachii since short head enters into active insufficiency as it continues to contract.'),(276,284,'Also known as Cable Spider Curl. The long head (lateral head) of biceps brachii is activated significantly more than short head (medial head) of biceps brachii since short head enters into active insufficiency as it continues to contract.'),(277,285,'Seat should be adjusted to allow arm pit to rest near top of pad. Back of upper arm should remain on pad throughout movement. The long head (lateral head) of biceps brachii is activated significantly more than short head (medial head) of biceps brachii since short head enters into active insufficiency as it continues to contract. At bottom position, weight stack in use should not make contact with remaining weight stack.'),(278,286,'Seat should be adjusted to allow arm pit to rest near top of pad. Back of upper arm should remain on pad throughout movement. Long head (lateral head) of biceps brachii is activated significantly more than short head (medial head) of biceps brachii since short head enters into active insufficiency as it continues to contract.'),(279,287,'The long head (lateral head) of biceps brachii is activated significantly more than short head (medial head) of biceps brachii since short head enters into active insufficiency as it continues to contract.'),(280,288,'Seat should be adjusted to allow arm pit to rest near top of pad. Back of upper arm should remain on pad throughout movement. If no resistance is experienced during initial range of motion, make sure seat is adjusted to allow for back of arm to be positioned flush against arm pad. If resistance is still not experienced, consider keeping wrists in a slight flexed position to compensate. If machine has secondary lever (as shown), it is not as essential to position elbows in-line with the primary fulcrum, as would otherwise be required.'),(281,289,'Back of upper arms should remain on pad throughout movement. If machine has secondary lever (as shown), it is not as essential to position elbows in-line with the primary fulcrum, as would otherwise be required.'),(282,290,'Also known as Dumbbell Spider Curl. The long head (lateral head) of biceps brachii is activated significantly more than short head (medial head) of biceps brachii since short head enters into active insufficiency as it continues to contract.'),(283,291,'Body should be positioned to allow arm pit to rest near top of pad. Back of upper arm should remain on pad throughout movement. Long head (lateral head) of biceps brachii is activated significantly more than short head (medial head) of biceps brachii since short head enters into active insufficiency as it continues to contract.'),(284,292,'Back of upper arms should remain on pad throughout movement. If machine has secondary lever (as shown), elbows can be positioned further away from primary fulcrum. Long head (lateral head) of biceps brachii is activated significantly more than short head (medial head) of biceps brachii since short head enters into active insufficiency as it continues to contract. Long head of Triceps Brachii is only significantly activated as antagonist stabilizer when it approaches passive insufficiency as elbow nears full flexion. See exercise performed with both arms simultaneously.'),(285,293,'Position armpit to rest near top of pad. Back of upper arm should remain on pad throughout movement. Notice that this machine has secondary lever so elbows are not aligned with primary fulcrum. Also see movement performed with narrow grip. The particular machine shown doubles as Triceps Extension Machine by placing weight on opposite side of fulcrum.'),(286,294,'Back of upper arms should remain on pad throughout movement. If machine has secondary lever (as shown), it is not as essential to position elbows in-line with the primary fulcrum, as would otherwise be required.'),(287,295,'Seat should be adjusted to allow arm pit to rest near top of pad. Back of upper arm should remain on pad throughout movement. If machine has secondary lever (as shown), it is not as essential to position elbows in-line with the primary fulcrum, as would otherwise be required. Long head (lateral head) of biceps brachii is activated significantly more than short head (medial head) of biceps brachii since short head enters into active insufficiency as it continues to contract.'),(288,296,'Back of upper arms should remain on pad throughout movement. If machine has secondary lever (as shown), elbows can be positioned further away from primary fulcrum. Long head (lateral head) of biceps brachii is activated significantly more than short head (medial head) of biceps brachii since short head enters into active insufficiency as it continues to contract. Long head of Triceps Brachii is only significantly activated as antagonist stabilizer when it approaches passive insufficiency as elbow nears full flexion. See exercise performed with both arms simultaneously.'),(289,297,'Dismounting can be achieved by walking backward until body is upright. Also known as Suspended Biceps Curl, arguably somewhat of a misnomer. The positioning of arms, with elbows high, places short head (medial head) of Bicep Brachii in active insufficiency as arm continues to flex. The long head of Biceps Brachii (lateral head) and in particular, Brachialis are primary movers in this position.'),(290,298,'Position armpit to rest near top of pad. Back of upper arm should remain on pad throughout movement. Notice that this machine has secondary lever so elbows are not aligned with primary fulcrum. This particular machine also features a weight pack that can be positioned closer or further away from fulcrum thereby making resistance easier or harder.'),(291,299,'Body should be positioned to allow arm pit to rest near top of pad. Back of upper arm should remain on pad.'),(292,300,'When elbows are fully flexed, they can travel forward slightly, allowing forearms to be no more than vertical. This additional movement allows for relative release of tension in muscles between repetitions.'),(293,301,'When elbows are fully flexed, they can travel forward slightly, allowing forearms to be no more than vertical. This additional movement allows for relative release of tension in muscles between repetitions.'),(294,302,'When elbows are fully flexed, they can travel forward, slightly allowing forearms to be no more than vertical. This additional movement allows for relative release of tension in muscles between repetitions.'),(295,303,'When elbows are fully flexed, they can travel slightly forward, allowing forearms to be no more than vertical. This additional movement allows for relative release of tension in muscles between repetitions.'),(296,304,'The biceps may be exercised alternating (as described), simultaneous, or in simultaneous-alternating fashion. When elbows are fully flexed, they can travel forward slightly allowing forearms to be no more than vertical. This additional movement allows for relative release of tension in muscles between repetitions.'),(297,306,'Seat should be adjusted to allow arm pit to rest near top of pad. Back of upper arm should remain on pad. If machine has secondary lever, elbows can be positioned further away from primary fulcrum.'),(298,305,'The biceps may be exercised alternating or simultaneous. If machine does not provide support for back of arm, keep elbows from traveling back, particularly during initial flexion.'),(299,307,'Feet can be staggered and bent slightly (if needed) to allow\narm pit to rest near top of pad. Back of upper arm should remain\non pad. At bottom position, weight stack in use should not make\ncontact with remaining weight stack.'),(300,308,'Seat should be adjusted to allow arm pit to rest near top of pad. Back of upper arm should remain on pad.'),(301,309,'Seat should be adjusted to allow arm pit to rest near top of pad. Back of upper arm should remain on pad. At bottom position, weight stack in use should not make contact with remaining weight stack.'),(302,310,'Wrist Extensors can also be stretched in this position by flexing forward wrist so hands bend toward side of forward arm. The arm can be crossed to stretch opposite wrist.'),(303,311,'Seat should be adjusted to allow arm pit to rest near top of pad. Back of upper arm should remain on pad. If machine has secondary lever, elbows can be positioned further away from primary fulcrum.'),(304,312,'None.'),(305,313,'Some units, as one illustrated above, may be placed on sturdy table top or on floor. Keep forearm flat on padded platform throughout exercise.'),(306,314,'Hand may be placed under wrist (as demonstrated) to offer stability and to maintain horizontal orientation of forearm.'),(307,315,'Keep elbows approximately wrist height to maintain resistance through full range of motion.'),(308,316,'If half loaded dumbbell is not available, one of two substitutes can be used.'),(309,317,'None.'),(310,319,'Also see muscles for finger articulations and thumb articulations.'),(311,318,'Keep elbow approximately wrist height to maintain resistance through full range of motion. Hand may be placed under wrist to offer stability and to maintain horizontal orientation of forearm.'),(312,320,'Also see muscles for finger articulations and thumb articulations. See lever grip up close.'),(313,321,'Keep forearms horizontal, flat on arm pads throughout exercise. See wrist curl up close.'),(314,322,'None.'),(315,323,'See sled grip up close. Also see muscles for finger articulations and thumb articulations.'),(316,324,'Also see muscles for finger articulations and thumb articulations.'),(317,325,'Also see muscles for finger articulations and thumb articulations.'),(318,326,'Also see Lever Roller Wrist Extension.'),(319,327,'None'),(320,329,'Keep arms straight.'),(321,330,'None'),(322,331,'Keep elbows straight.'),(323,332,'Exercise is performed on specialized piece of equipment which includes knobs at each end of wrist roller.'),(324,328,'See exercise on alternative machine. Also see muscles for finger articulations and thumb articulations.'),(325,333,'If half loaded dumbbell is not available, one of two substitutes can be used.'),(326,334,'Do not allow elbows to rise.'),(327,335,'Keep elbow approximately wrist height to maintain resistance through full range of motion. Hand may be placed under wrist to offer stability and to maintain horizontal orientation of forearm.'),(328,336,'None.'),(329,337,'Do not allow elbow to rise. Hand may be placed under wrist (as demonstrated) to offer stability and to maintain horizontal orientation of forearm.'),(330,338,'Keep elbows approximately wrist height to maintain resistance through full range of motion.'),(331,340,'None.'),(332,339,'Some units, as one illustrated above, may be placed on sturdy table top or on floor. Keep forearm flat on padded platform throughout exercise.'),(333,341,'Keep forearms horizontal, flat on arm pads throughout exercise. See reverse wrist curl up close.'),(334,342,'Exercise is performed on specialized piece of equipment which includes knobs at each end of wrist roller.'),(335,343,'Elbow may be extended first, followed by pulling palm toward forearm. Brachioradialis can also be stretched by positioining downward or back (ie: external rotation of shoulder)'),(336,344,'Keep elbows straight.'),(337,346,'If unilaterally loaded dumbbell, or \"half dumbbell\" is not available, grasp conventional dumbbell to one side of handle with thumb against inside surface.'),(338,347,'Depending on participant\'s range of motion and machine\'s design, handles may need to be prerotated so resistance is present throughout movement, particularly initial phase of rotation. See forearm pronation up close.'),(339,345,'Pad or firm pillow (ball pictured) may be placed between hip and arm. Elevation of elbow allows resistance during initial range of motion. This exercise can also be performed seated by corner of table higher than shoulder height (See Dumbbell Seated Pronation. If unilaterally loaded dumbbell, or \"half dumbbell\" is not available, grasp conventional dumbbell to one side of handle with thumb against inside surface. Also see Dumbbell Lying Pronation with arm down.'),(340,348,'Depending on participant\'s range of motion and machine\'s design, handle may need to be prerotated so resistance is present throughout movement, particularly initial phase of rotation.'),(341,349,'Bench can be flat or slightly incline (0-30 degrees) so resistance occurs during initial range of motion. If unilaterally loaded dumbbell, or \"half dumbbell\" is not available, grasp conventional dumbbell to one side of handle with pinkie against inside surface. Also see conventiontal Dumbbell Lying Pronation.'),(342,350,'Depending on participant\'s range of motion and machine\'s design, handle may need to be prerotated so resistance is present throughout movement, particularly initial phase of rotation.'),(343,351,'Bench can be flat or slightly incline (0-30 degrees) so resistance occurs during final range of motion. If unilaterally loaded dumbbell, or \"half dumbbell\" is not available, grasp conventional dumbbell to one side of handle with thumb against inside surface. Also see conventional Dumbbell Lying Supination.'),(344,352,'Pad or firm pillow may be placed between hip and arm. Elevation of elbow allows resistance during final range of motion. If unilaterally loaded dumbbell, or \"half dumbbell\" is not available, grasp conventional dumbbell to one side of handle with pinkie against inside surface. Also see Dumbbell Lying Supination with arm down. This exercise can also be performed seated by corner of table higher than shoulder height (See Seated Supination).'),(345,353,'If unilaterally loaded dumbbell, or \"half dumbbell\" is not available, grasp conventional dumbbell to one side of handle with pinkie against inside surface.'),(346,354,'Depending on participant\'s range of motion and machine\'s design, handles may need to be prerotated so resistance is present throughout movement, particularly initial phase of rotation. See forearm supination up close.'),(347,355,'Torso may be kept horizontal for strict execution. Knees are bent in effort to keep low back straight (See Hamstring Inflexibility). If low back becomes rounded due to tight hamstrings, either try bending knees more or don\'t position torso as low. Either fix may compromise involvement of Latissimus Dorsi since it forces more shoulder transverse extension and less shoulder extension range of motion. If low back is rounded due to poor form, deadlift weight to standing position and lower torso into horizontal position with knees bent and back straight. A shoulder width or underhand grip can increase lat involvement by emphasizing shoulder extension over transverse extension.'),(348,356,'Begin with light weight and add additional weight gradually to allow lower back adequate adaptation. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch. Full range of motion through lower back will vary from person to person. See Cable Seated Row Question. Also see Cable Straight Back Incline Row and Dangerous Exercise Essay.'),(349,357,'Bench should be high enough to allow shoulders to stretch forward without barbell hitting floor.'),(350,358,'Also see Cable Incline Row.'),(351,359,'Torso may be kept horizontal for strict execution. Knees are bent in effort to keep low back straight (See Hamstring Inflexibility). If low back becomes rounded due to tight hamstrings, either try bending knees more or don\'t position torso as low. Either fix may compromise involvement of Latissimus Dorsi since it forces more shoulder transverse extension and less shoulder extension range of motion. If low back is rounded due to poor form, deadlift weight to standing position and lower torso into horizontal position with knees bent and back straight. A shoulder width or underhand grip can increase lat involvement by emphasizing shoulder extension over transverse extension. A wide overhand grip involves overall back musculature while slightly emphasizing Rear Delt, Infraspinatus and Teres Minor involvement. Also known as Pendlay Row.'),(352,362,'Pulleys should not be too far apart, as they are on standard cable crossover machines. Stirrups on pulleys should be high enough to allow shoulders to stretch forward when arms extend. Pull shoulder blades together when completing pull. Other rowing exercises should be considered if resistance required begins to exceed upper body weight since back will begin to raise up off of bench.'),(353,360,'Torso may be kept horizontal for strict execution. Knees are bent in effort to keep low back straight (See Hamstring Inflexibility). If low back becomes rounded due to tight hamstrings, either try bending knees more or don\'t position torso as low. Either fix may compromise involvement of Latissimus Dorsi since it forces more shoulder transverse extension and less shoulder extension range of motion. If low back is rounded due to poor form, deadlift weight to standing position and lower torso into horizontal position with knees bent and back straight. A shoulder width or underhand grip can increase lat involvement by emphasizing shoulder extension over transverse extension.'),(354,361,'Allow scapula to articulate, but do not rotate torso.'),(355,363,'Supporting hand can also be placed on nearby bar, available on some pulley machines. Hamstrings and Gluteus Maximus stabilize near top of movement on forward leg.'),(356,364,'It is optional to bend lower back forward during stretch and pull it upright during contraction. If low back is kept still, Erector Spinae acts as synergist muscle. Also see Cable One Arm Twisting Seated Row.'),(357,365,'Also see Cable One Arm Seated Row.'),(358,366,'It is optional to bend lower back forward during stretch and pull it upright during contraction. If torso does not bend forward, Erector Spinae acts as stabilizer muscle. See straight back form. Quadratus Lumborum and Obliques are involved in spinal rotation if waist is rotated more than demonstrated. Hamstrings and Gluteus Maximus are no longer stabilizers if seated on bench with upper leg support.'),(359,367,'It is optional to bend lower back forward during stretch and pull it upright during contraction. If low back is kept still, Erector Spinae acts as synergist muscle. Also see exercise on bench and adjustable height pulley.'),(360,368,'If two high pulleys are available use opposite pulley as exercised arm. If pulley is far enough away, it is optional to bend lower back forward during stretch and pull it upright during contraction. See Cable One Arm Seated High Row. Hamstrings and Gluteus Maximus become stabilizers if seated on bench with feet propped forward with no upper leg support.'),(361,369,'Rotation of torso as shown is optional. Quadratus Lumborum and Obliques act as stabilizers if waist is not rotated as demonstrated. Hamstrings and Gluteus Maximus act as stabilizers if seat is not available and legs are propped forward.'),(362,370,'Begin with light weight and add additional weight gradually to allow lower back adequate adaptation. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch. Full range of motion through lower back will vary from person to person. See Cable Seated Row Question. Also see Cable Straight Back Seated Row and Dangerous Exercise Essay.'),(363,371,'If two high pulleys are available, consider using opposite pulley as arm exercised. If pulley is far away enough, it is optional to bend lower back forward during stretch and pull it upright during contraction. See Cable One Arm Seated High Row. Quadratus Lumborum and Obliques are involved in spinal rotation if waist rotates. Hamstrings and Gluteus Maximus become stabilizers, if seated on bench with feet propped forward with no upper leg support.'),(364,372,'Begin with light weight and additional weight gradually to allow lower back adequate adaptation. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch. Full range of motion through lower back will vary from person to person. See Cable Seated Row Question. Also see Cable Wide Grip Straight Back Seated Row and Dangerous Exercise Essay.'),(365,373,'Also see Cable Seated Row.'),(366,374,'Also see Cable Wide Grip Seated Row.'),(367,375,'Stirrup handle should be behind supporting bar. Few pulley units have vertical support bar (for supporting hand) far enough back from pulley to allow full range of motion and adequate pulley rotation to allow it to be aligned with line of pull. If pulley unit does not allow for this configuration, consider placing sturdy prop (for supporting hand) in front of pulley, far back enough to allow full range of motion. Also see Cable Standing Low Row.'),(368,376,'Allow scapula to articulate but do not rotate torso in effort to throw weight up. Torso should be close to horizontal. Positioning supporting knee and/or arm slightly forward or back will allow for proper levelling of torso. Torso may be positioned lower to allow for heavier dumbbell to make contact with floor, if desired.'),(369,377,'Also see Cable Standing Row with medium height pulley.'),(370,378,'Bench should be high enough to allow shoulders to stretch forward without dumbbells hitting floor.'),(371,379,'In standing position, both spinal rotation and hip rotation contribute to body\'s rotation. Because rear leg is only supported by forefoot, hip of forward leg is utilized (hip internal rotation / transverse adduction) much greater than hip of rear leg since forward leg offers more secured base of support.'),(372,380,'Torso should be kept horizontal if flexibility allows. Knees are bent in effort to keep low back straight (See Hamstring Inflexibility). If low back becomes rounded due to tight hamstrings, try bending knees more. Placing weight plates on higher bar lightens resistance at top where strength lessens, without compromising range of motion. See Gravity Vectors to understand how this positioning, altering direction of load, affects exercise resistance (resistance curve). Also see wide grip form.'),(373,381,'Torso should be kept as close to horizontal while allowing for full arm extension. Knees are bent in effort to keep low back straight (See Hamstring Inflexibility). If low back becomes rounded due to tight hamstrings, try bending knees more. Placing weight plates on higher bar lightens resistance at top where strength lessens, without compromising range of motion. See Gravity Vectors to understand how this positioning, altering direction of load, affects exercise resistance throughout movement (resistance curve). Also see Lever Bent-over Row.'),(374,382,'Exact stance from bar will depend upon height of fulcrum and length of lever. Torso may be kept horizontal for strict execution. Knees are bent in effort to keep low back straight (See Hamstring Inflexibility). If low back becomes rounded due to tight hamstrings, either try bending knees more or don\'t position torso as low. Either fix may compromise involvement of Latissimus Dorsi, since it forces more shoulder transverse extension and less shoulder extension range of motion. If low back is rounded due to poor form, grasp bar in standing position and lower torso into horizontal position with knees bent and back straight. A shoulder width or underhand grip can increase lat involvement by emphasizing shoulder extension over transverse extension. A wide overhand grip involves overall back musculature while slightly emphasizing Rear Delt, Infraspinatus and Teres Minor involvement.'),(375,383,'Near top arch upper back and pull shoulders back as shown. To maximize back involvement, position body on pad or grip so wrists follow elbows. Some Incline Row apparatuses allow feet to be placed on floor, particularly if foot platform cannot be adjusted to accommodate height.'),(376,385,'Near top arch upper back and pull shoulders back as shown. To maximize back involvement, position body on pad or grip so wrists follow elbows.'),(377,384,'Allow scapula to articulate but do not rotate torso in effort to throw weight up. Lever base shown attaches to standard Olympic barbell. Improvising by placing barbell in corner may cause excessive wear on floor and floor board, or wall.'),(378,386,'Unique apparatus designed and built by Tracey Cheuvront.'),(379,387,'Seat or grip should be adjusted to allow wrists to follow elbows. When completing pull, chest slightly and pull shoulder blades together while keeping lower chest on pad. Let shoulders roll forward when arms extend.'),(380,389,'None.'),(381,388,'None.'),(382,390,'When completing pull, lift chest slightly and pull shoulder blades together while keeping lower chest on pad. Let shoulders roll forward when arms extend.'),(383,391,'Seat or grip should be adjusted to allow wrists to follow elbows. When completing pull, lift chest slightly and pull shoulder blades together while keeping lower chest on pad. Let shoulders roll forward when arms extend.'),(384,392,'Chest pad should be adjusted to allow shoulders to stretch forward. The seat or grip should be adjusted to allow wrists to follow elbows. Also see Cybex High Row.'),(385,393,'Exercise is performed on apparatus with no chest pad, in contrast to standard lever seated row machine. This exercise is more similar to Cable Straight Back Seated Row. Exercise may also be performed with greater low back involvement; see Lever Seated Row (no chest pad).'),(386,394,'Seat or grip should be adjusted to allow wrists to follow elbows. When completing pull, lift chest slightly and pull shoulder blades together while keeping lower chest on pad. Let shoulders roll forward when arms extend. See exercise on alternative machine.'),(387,395,'Exercise is performed on apparatus with no chest pad, in contrast to standard lever seated row machine. This exercise is more similar to Cable Seated Row. Begin with light weight and add additional weight gradually to allow lower back adequate adaptation. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch. Full range of motion through lower back will vary from person to person. For even greater hip and low back articulation, hips may be slid back further with knees straighter. See Cable Seated Row Question and Dangerous Exercise Essay. Also see Lever Straight Back Seated Row (no chest pad).'),(388,396,'Closer grip increases lat involvement by emphasizing shoulder extension over transverse extension. Keep low back straight. Lighten load if torso raises beyond 45 degrees in order to complete repetition. See Gravity Vectors to understand how load would be decreased by positioning torso too high. Also see Lever T-Bar Row.'),(389,398,'Position torso as low as possible, allowing for full arm extension. Keep low back straight. Lighten load if torso raises beyond 45 degrees in order to complete repetition. See Gravity Vectors to understand how load would be decreased by positioning torso too high. Also see close grip form.'),(390,399,'Seat or grip should be adjusted to allow wrists to follow elbows.'),(391,401,'Seat should be adjusted to allow for full range of motion. Also see Lever Seated Hammer High Row.'),(392,402,'Chest pad should be adjusted to allow shoulders to stretch forward. The seat or grip should be adjusted to allow wrists to follow elbows. When completing pull, lift chest slightly and pull shoulder blades together while keeping lower chest on pad. Let shoulders roll forward when arms extend.'),(393,403,'Chest pad should be adjusted to allow shoulders to stretch forward. The seat or grip should be adjusted to allow wrists to follow elbows.'),(394,405,'Seat or grip should be adjusted to allow wrists to follow elbows. When completing pull, lift chest slightly and pull shoulder blades together while keeping lower chest on pad. Let shoulders roll forward when arms extend. Also see front view.'),(395,406,'Chest pad should be adjusted to allow shoulders to stretch forward. The seat or grip should be adjusted to allow wrists to follow elbows. When completing pull, lift chest slightly and pull shoulder blades together while keeping lower chest on pad. Let shoulders roll forward when arms extend.'),(396,407,'Seat or grip should be adjusted to allow wrists to follow elbows.'),(397,408,'Seat or grip should be adjusted to allow wrists to follow elbows.'),(398,411,'Exercise is performed on apparatus with no chest pad, in contrast to standard lever seated row machine. This exercise is more similar to Cable Straight Back Seated Row. Exercise may also be performed with greater low back involvement; see Lever Seated Row (no chest pad).'),(399,410,'Exercise is performed on apparatus with no chest pad, in contrast to standard lever seated row machine. This exercise is more similar to Cable Seated Row. Begin with light weight and add additional weight gradually to allow lower back adequate adaptation. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch. Full range of motion through lower back will vary from person to person. For even greater hip and low back articulation, hips may be slid back further with knees straighter. See Cable Seated Row Question and Dangerous Exercise Essay. Also see Lever Straight Back Seated Row (no chest pad).'),(400,413,'Torso may be kept horizontal for strict execution. Platform (as shown) is only needed if smith machine does not allow bar to be lowered to lowest position. Knees are bent in effort to keep low back straight (See Hamstring Inflexibility ). If low back becomes rounded due to tight hamstrings, either knees should be bent more or torso may not be positioned as low. Either fix may compromise involvement of Latissimus Dorsi since it forces more shoulder transverse extension and less shoulder extension range of motion. If low back is rounded due to poor form, deadlift weight to standing position and lower torso into horizontal position with knees bent and back straight. A shoulder width or underhand grip can increase lat involvement by emphasizing shoulder extension over transverse extension.'),(401,412,'Fixed bar should be just high enough to allow arm to fully extend. Placing back of heels on elevated surface is optional. This exercise is typically performed without added resistance, although additional weight can be placed on belly or pelvis. Partner can add and remove weight, and keep weight from sliding off belly. Resistance can be reduced by raising bar and positioning heels on floor. See Gravity Vectors for greater understanding of body angle influences resistance. Also known as Body Row or Supine Row.'),(402,414,'Fixed bar should be just high enough to allow arm to fully extend. See Gravity Vectors for greater understanding of body angle influences resistance. Also known as Body Row or Supine Row.'),(403,415,'Fixed bar should be just high enough to allow arm to fully extend. Placing back of heels on elevated surface is optional. This exercise is typically performed without added resistance, although a weight vest can be worn or additional weight can be placed on belly or pelvis. Partner can add and remove weight, and keep weight from sliding off belly. Resistance can be further reduced by performing movement from higher bar and/or positioning heels on floor (see Inverted Row on high bar). See Gravity Vectors for greater understanding of how body angle influences resistance. Also known as Weighted Body Row or Weighted Supine Row.'),(404,417,'Fixed bar should be just high enough to allow arm to fully extend. See Gravity Vectors for greater understanding of how body angle influences resistance. Also known as Body Row on Hips or Supine Row on Hips.'),(405,419,'Bar height can be adjusted to vary resistance. See Gravity Vectors for greater understanding of how body angle influences resistance. Also known as Body Row or Supine Row.'),(406,420,'At higher angles, feet can be placed flat on floor. When angled further back, only heels may contact floor with forefeet raising upward. Dismounting can be achieved by walking backward until body is upright.'),(407,421,'None'),(408,422,'Fixed bar should be just high enough to allow arm to fully extend. See Gravity Vectors for greater understanding of body angle influences resistance.'),(409,424,'To intensify stretch, look up or to one side.'),(410,423,'Handles should be positioned to allow for full arm extension, no lower. Instead of mounting from a seated or lying position, position can be assumed by stepping back with handles grasped in each hand until arms are straight forward. While keeping arms straight and shoulders back, step forward so body reclines back and under suspension handles. Dismounting can be achieved by walking backward until body is upright, minimizing contact with ground. See Gravity Vector for greater understanding of how body angle influences resistance.'),(411,425,'This exercise can be performed on TRXⓇ style suspension trainer or adjustable length gymnastics rings. Some suspension trainer brands allow independent use of only one handle, whereas, more popular brands require either anchoring unused handle within stirrup of gripped handle or grasping both handles with one hand.'),(412,426,'Lower body extending off of bench acts as counter balance to resistance and keeps upper back fixed on bench. Avoid hips from raising up significantly. Actual range of motion is dependent upon individual shoulder flexibility. Keep elbows fixed at small bend throughout exercise. Either straight barbell or EZ barbell can be used. Also see Barbell Bent Arm Pullover.'),(413,427,'See suggested mount and dismount. Some assisted machines require you to stand on bar. If no assisted machine is used, assist as needed by allowing training partner to pull feet up behind legs or push self up with legs on elevation. Range of motion will decrease if grip is too wide.'),(414,428,'See suggested mount and dismount. Some assisted machines require you to kneel on platform instead of standing on bar. If no assisted machine is used, assist as needed by allowing training partner to pull feet up behind legs or push self up with legs on elevation.'),(415,429,'See suggested mount and dismount. Some assisted machines require you to stand on bar. If no assisted machine is used, assist as needed by allowing training partner to pull feet up behind legs or push self up with legs on elevation. Range of motion will decrease if grip is too wide.'),(416,430,'Some assisted machines require you to kneel on platform instead of standing on bar. If no assisted machine is used, assist as needed by allowing training partner to pull feet up behind legs or push self up with legs on elevation. Range of motion will decrease if grip is too wide.'),(417,431,'See suggested mount and dismount. Some assisted machines require you to stand on platform or bar. If no assisted machine is used, assist as needed by allowing training partner to pull feet up behind legs or push self up with legs on elevation. Also see self-assisted technique without machine.'),(418,432,'Muscles listed as Stabilizers become Synergists if spinal lateral flexion occurs during exercise.'),(419,433,'Keep elbows bent approximately 90° throughout exercise. Keep hips from raising up significantly. Either straight barbell or EZ barbell can be used. Also see Barbell Pullover.'),(420,434,'Exercise can be performed with V-Bar or Multi-exercise Bar.'),(421,435,'See suggested mount and dismount. Some assisted machines require standing on bar. If no assisted machine is used, assist as needed by allowing training partner to pull feet up behind legs or push self up with legs on elevation.'),(422,436,'Stirrups are attached to split pulley.'),(423,437,'Muscles listed as Stabilizers become Synergists if spinal lateral flexion occurs during exercise.'),(424,438,'Range of motion will be compromised if grip is too wide.'),(425,440,'Keep hips and torso in same position throughout movement.'),(426,439,'Stirrups are attached to split pulley.'),(427,441,'Parallel Grip Cable Attachment is shorter than Pro Lat Bar, yet longer than Close Grip Cable Attachments.'),(428,442,'Stirrups are attached to split pulley.'),(429,443,'Lower body extending off of bench acts as counter balance to resistance and keeps upper back fixed on bench. Avoid hips from raising up significantly. Actual range of motion is dependent upon individual shoulder flexibility. Keep elbows fixed at small bend throughout exercise.'),(430,444,'Range of motion will be compromised if grip is too wide.'),(431,445,'Stirrups are attached to split pulley.'),(432,446,'Fix elbows approximately 30° throughout exercise. Also known as Straight Arm Pulldown.'),(433,447,'If weight bottoms out at bottom of movement, attach cable on chain links nearer ends of dip belt.'),(434,448,'If weight bottoms out at bottom, attach cable on chain links nearer ends of dip belt.'),(435,450,'If cable attachment is too high, grasp attachment first, then sit down. Fix elbows approximately 30° throughout exercise. Also known as Cable Seated Straight Arm Pulldown.'),(436,449,'This particular apparatus could arguably be referred to as lever machine since dip belt attaches to lever arm, although relatively free movement between lever and dip belt offers qualities similar to cable machine. If weight bottoms out at bottom of movement, attach cable on chain links nearer ends of dip belt.'),(437,451,'If weight bottoms out at bottom of motion, attach cable on chain links nearer ends of dip belt. Range of motion will be compromised if grip is too wide.'),(438,452,'If weight bottoms out at bottom of movement, attach cable on chain links nearer ends of dip belt. Range of motion will be compromised if grip is too wide.'),(439,453,'Range of motion will be compromised if grip is too wide.'),(440,454,'Erector Spinae can become slightly engaged when torso arches back.'),(441,455,'In standing position, both spinal rotation and hip rotation contribute to body\'s rotation. Because rear leg is only supported by forefoot, hip of forward leg is utilized (hip internal rotation / transverse adduction) much greater than hip of rear leg since forward leg offers more secured base of support.'),(442,456,'None'),(443,457,'Range of motion will be compromised if grip is too wide.'),(444,458,'None'),(445,459,'See pad kick down on Hammer Machine. Also see movement on alternative machine.'),(446,460,'Range of motion will be compromised if grip is too wide.'),(447,462,'Actual range of motion is dependent upon individual shoulder flexibility.'),(448,463,'Erector Spinae can become slightly engaged when torso arches back.'),(449,464,'None'),(450,465,'Platform should be adjusted so shoulder joint and girdle are approximate height as lever fulcrum. Also See Bent-over Fly on Iron Cross\n\n\nMachine.'),(451,467,'See pad kick down on Hammer Machine. Also see exercise on alternative machine.'),(452,468,'When finished, push foot lever before releasing arm from lever. Release foot lever after releasing arm from lever. Actual range of motion is dependent upon individual shoulder flexibility.'),(453,470,'Range of motion will be compromised if grip is too wide. See Lever Pulldown performed on alternative apparatus. Also see exercise with parallel grip.'),(454,471,'Also see Lever Pulldown.'),(455,473,'Added weight can be placed on dip belt or dumbbell can be placed between ankles.'),(456,474,'Added weight can be placed on dip belt or dumbbell can be placed between ankles.'),(457,476,'Added weight can be placed on dip belt or dumbbell can be placed between ankles as shown. Range of motion will be compromised if grip is too wide.'),(458,475,'See pad kick down on Hammer Machine.'),(459,477,'Free foot can be placed on top of foot in band for safety in case band slips from foot. Range of motion will be compromised if grip is too wide.'),(460,478,'Added weight can be placed on dip belt or dumbbell can be placed between ankles. Also see Pull-up without added weight. Range of motion will be compromised if grip is too wide.'),(461,479,'Free foot can be placed inside of band (as shown) or on top of foot in band for safety in case band slips from foot. At conclusion of set, step down with free foot at bottom of exercises. Dismount band by grasping each side of exercise band, stretch exercise band down, and step out. Continuing to hold on to each side of band while allowing band to contract to normal length.'),(462,480,'Added weight can be placed on dip belt (as shown) or dumbbell can be placed between ankles. Range of motion will be compromised if grip is too wide.'),(463,481,'Free foot can be placed inside of band (as shown) or on top of foot in band for safety in case band slips from foot. At conclusion of set, step down with free foot at bottom of exercises. Dismount band by grasping each side of exercise band, stretch exercise band down, and step out. Continuing to hold on to each side of band while allowing band to contract to normal length.'),(464,483,'Added weight can be placed on dip belt or dumbbell can be placed between ankles. Special angled pull-up bar assembly is shown. Also see Wide Grip Pull-up and Underhand Chin-up.'),(465,484,'Special angled pull-up bar assembly is shown. Free foot can be placed on top of foot in band for safety in case band slips from foot.'),(466,485,'Easier'),(467,486,'Range of motion will be compromised if grip is too wide. At conclusion of set, step one foot out of band at bottom of exercises. Grasping each side of exercise band from behind and pull down. Transfer body weight onto free leg, bend knee of banded leg, release band from under foot, and step out. Transfer both sides of taut band to one hand behind body. Turn body to side of hand holding band while permitting band to contract to normal length.'),(468,487,'Range of motion will be compromised if grip is too wide.'),(469,489,'Range of motion will be compromised if grip is too wide.'),(470,488,'Partner can assist as needed by pulling ankles or top feet up from behind. Range of motion will be compromised if grip is too wide.'),(471,490,'Special angled pull-up bar assembly is shown.'),(472,491,'Range of motion will be compromised if grip is too wide.'),(473,492,'Partner can assist as needed by pulling ankles or top feet up from behind. Also see self-assisted technique.'),(474,493,'Partner can assist as needed by pulling ankles or top feet up from behind. Exercise can be used until Pull-ups can be performed. Range of motion will be compromised if grip is too wide .'),(475,494,'If bar is too low, knees may need to spread apart at bottom of motion (as shown) to achieve full range of motion. Range of motion will be compromised if grip is too wide. If lower body is used for assistance, Quadriceps are utilized.'),(476,495,'If lower body is used for assistance, Hip and Knee Extensors muscles are utilized. Back extensors may be activated minimally as stabilizer through spine. Range of motion will be compromised if grip is too wide.'),(477,496,'If lower body is used for assistance, Hip and Knee Extensors muscles are utilized. Back extensors may be activated minimally as stabilizer through spine.'),(478,497,'Keep elbows straight or nearly straight throughout exercise. Also known as Wheel Kneeling Rollout. Rectus Abdominis and Obliques practically contract isometrically since little waist flexion occurs under resistance. With no waist flexion, Rectus Abdominis and External Oblique act to stabilize pelvis and waist during hip flexion. See target muscle of rollout question. Also see Spot Reduction Myth and Lower Ab Myth.'),(479,498,'Try to keep elbows nearly straight throughout exercise. Target muscle, Rectus Abdominis practically contracts isometrically since only a small degree of waist flexion occurs under resistance and, with the assistance of the External Oblique, act to stabilize spine. See target muscle of rollout question. Also see Spot Reduction Myth and Lower Ab Myth.'),(480,500,'Triceps become more involved if shoulders are keep close to wrists.'),(481,499,'If lower body is used for assistance, Hip and Knee Extensors muscles are utilized. Back extensors may be activated minimally as stabilizer through spine. Range of motion will be compromised if handles are too wide apart.'),(482,501,'This exercise can be performed on adjustable length gymnastics rings or a dual anchored suspension trainer where the handles can be placed a short distance apart. Performing this exercise on a TRXⓇ style suspension trainer would require a narrower grip, with the hands closer together.'),(483,502,'None.'),(484,504,'To intensify stretch, look up or to one side.'),(485,503,'Try to keep elbows nearly straight throughout exercise. Also known as Stability Ball Kneeling Rollout.'),(486,505,'None.'),(487,506,'Avoid overstressing neck anteriorly. See Overhead Triceps Stretch for similar exercise which can be performed with this stretch.'),(488,507,'Allow shoulder to raise toward side of head for greater stretch.'),(489,509,'Alternatively, forearms can be placed on wall, parallel with elbows pointed downward.'),(490,508,'Allow shoulder to raise toward side of head for greater stretch.'),(491,510,'Participant can be asked to lean torso away from side with arm behind head. See PNF Overhead Triceps Stretch for similar exercise which can be performed with this stretch. Also see Overhead Lat Stretch for similar static stretch. Long head of triceps is only stretched if elbow nears complete flexion.'),(492,511,'Since this movement becomes more difficult as full shoulder elevation is achieved, height criteria for shoulder elevation may be needed. For example, raising shoulders until slope of shoulders becomes horizontal may be considered adequate depending upon individual body structure and range of motion with lighter weight. Also see ROM Criteria and Shoulder Shrug Errors.'),(493,513,'Since this movement becomes more difficult as full shoulder elevation is achieved, height criteria for shoulder elevation may be needed. For example, raising shoulders until slope of shoulders becomes horizontal may be considered adequate, depending upon individual body structure and range of motion with lighter weight. Also see ROM Criteria and Shoulder Shrug Errors.'),(494,512,'Since this movement becomes more difficult as full shoulder elevation is achieved, height criteria for shoulder elevation may be needed. For example, raising shoulders until slope of shoulders becomes horizontal may be considered adequate depending upon individual body structure and range of motion with lighter weight. Also see ROM Criteria and Shoulder Shrug Errors.'),(495,514,'Since this movement becomes more difficult as full shoulder elevation is achieved, height criteria for shoulder elevation may be needed. For example, raising shoulders until slope of shoulders becomes horizontal may be considered adequate depending upon individual body structure and range of motion with lighter weight. Also see ROM Criteria and Shoulder Shrug Errors.'),(496,517,'Since this movement becomes more difficult as full shoulder elevation is achieved, height criteria for shoulder elevation may be needed. For example, raising shoulders until slope of shoulders becomes horizontal may be considered adequate depending upon individual body structure and range of motion with lighter weight. Also see ROM Criteria and Shoulder Shrug Errors.'),(497,515,'Since this movement becomes more difficult as full shoulder elevation is achieved, height criteria for shoulder elevation may be needed. For example, raising shoulders until slope of shoulders becomes horizontal may be considered adequate, depending upon individual body structure and range of motion with lighter weight. Also see ROM Criteria and Shoulder Shrug Errors.'),(498,518,'Since this movement becomes more difficult as full shoulder elevation is achieved, height criteria for shoulder elevation may be needed. For example, raising shoulders until slope of shoulders becomes horizontal may be considered adequate depending upon individual body structure and range of motion with lighter weight. Also see ROM Criteria and Shoulder Shrug Errors.'),(499,516,'Since this movement becomes more difficult as full shoulder elevation is achieved, height criteria for shoulder elevation may be needed. For example, raising shoulders until slope of shoulders becomes horizontal may be considered adequate depending upon individual body structure and range of motion with lighter weight. Also see ROM Criteria and Shoulder Shrug Errors.'),(500,519,'Exercise may be performed standing perfectly upright or very slightly bent over. Since this movement becomes more difficult as full shoulder elevation is achieved, height criteria for shoulder elevation may be needed. For example, raising shoulders until slope of shoulders becomes horizontal may be considered adequate depending upon individual body structure and range of motion with lighter weight. Also see ROM Criteria and Shoulder Shrug Errors.'),(501,520,'Since this movement becomes more difficult as full shoulder elevation is achieved, height criteria for shoulder elevation may be needed. For example, raising shoulders until slope of shoulders becomes horizontal may be considered adequate depending upon individual body structure and range of motion with lighter weight. Also see ROM Criteria and Shoulder Shrug Errors.'),(502,521,'If possible, position lever height high enough so weight will not need to be squat up that high, but not so high that weight stack bottoms out during exercise. Since this movement becomes more difficult as full shoulder elevation is achieved, height criteria for shoulder elevation may be needed. For example, raising shoulders until slope of shoulders becomes horizontal may be considered adequate depending upon individual body structure and range of motion with lighter weight. Also see ROM Criteria.'),(503,522,'Since this movement becomes more difficult as full shoulder elevation is achieved, height criteria for shoulder elevation may be needed. For example, raising shoulders until slope of shoulders becomes horizontal may be considered adequate depending upon individual body structure and range of motion with lighter weight. Also see ROM Criteria.'),(504,523,'Since this movement becomes more difficult as full shoulder elevation is achieved, height criteria for shoulder elevation may be needed. For example, raising shoulders until slope of shoulders becomes horizontal may be considered adequate depending upon individual body structure and range of motion with lighter weight. Also see ROM Criteria and Shoulder Shrug Errors.'),(505,524,'Since this movement becomes more difficult as full shoulder elevation is achieved, height criteria for shoulder elevation may be needed. For example, raising shoulders until slope of shoulders becomes horizontal may be considered adequate depending upon individual body structure and range of motion with lighter weight. Also see ROM Criteria.'),(506,527,'Since this movement becomes more difficult as full shoulder elevation is achieved, height criteria for shoulder elevation may be needed. For example, raising shoulders until slope of shoulders becomes horizontal may be considered adequate depending upon individual body structure and range of motion with lighter weight. Also see ROM Criteria and Shoulder Shrug Errors.'),(507,526,'Since this movement becomes more difficult as full shoulder elevation is achieved, height criteria for shoulder elevation may be needed. For example, raising shoulders until slope of shoulders becomes horizontal may be considered adequate depending upon individual body structure and range of motion with lighter weight. Also see ROM Criteria and Shoulder Shrug Errors.'),(508,528,'Since this movement becomes more difficult as full shoulder elevation is achieved, height criteria for shoulder elevation may be needed. For example, raising shoulders until slope of shoulders becomes horizontal may be considered adequate depending upon individual body structure and range of motion with lighter weight. Also see ROM Criteria.'),(509,525,'Since this movement becomes more difficult as full shoulder elevation is achieved, height criteria for shoulder elevation may be needed. For example, raising shoulders until slope of shoulders becomes horizontal may be considered adequate depending upon individual body structure and range of motion with lighter weight. Also see ROM Criteria and Shoulder Shrug Errors.'),(510,529,'Falling from an inverted position or hitting head on structural bar when flipping body may result in very serious injury. Adequate clearance must be allowed for head to clear any obstruction during both inversion and dismount. Exercise can also be performed on gymnastic rings. A safer position would be hanging centimeters above well padded flooring. Since this movement becomes more difficult as full shoulder elevation is achieved, height criteria for shoulder elevation may be needed. For example, raising shoulders until slope of shoulders becomes horizontal may be considered adequate depending upon individual body structure and range of motion with lighter weight. Also see ROM Criteria.'),(511,530,'If possible, position lever height high enough so weight will not need to be squat up that high, but not so high that weight stack bottoms out during exercise. Since this movement becomes more difficult as full shoulder elevation is achieved, height criteria for shoulder elevation may be needed. For example, raising shoulders until slope of shoulders becomes horizontal may be considered adequate depending upon individual body structure and range of motion with lighter weight. Also see ROM Criteria.'),(512,531,'If possible, position lever height high enough so weight will not need to be squat up that high, but not so high that weight stack bottoms out during exercise. Since this movement becomes more difficult as full shoulder elevation is achieved, height criteria for shoulder elevation may be needed. For example, raising shoulders until slope of shoulders becomes horizontal may be considered adequate depending upon individual body structure and range of motion with lighter weight. Also see ROM Criteria.'),(513,532,'None.'),(514,533,'Falling from an inverted position may result in very serious injury. To decrease potential of injury, position gymnastic rings over well padded surface, only high enough to allow full range of motion. Since this movement becomes more difficult as full shoulder elevation is achieved, height criteria for shoulder elevation may be needed. For example, raising shoulders until slope of shoulders becomes horizontal may be considered adequate, depending upon individual body structure and range of motion with lighter weight. Also see ROM Criteria. This exercise can be performed on adjustable length gymnastics rings or a dual anchored suspension trainer.'),(515,534,'None'),(516,535,'None'),(517,536,'Throughout movement, keep bent elbow (approximately 90°) in front of body, chest or shoulder height.'),(518,538,'Maintain elbow against side and fixed elbow position (90° angle) throughout exercise. Placing towel roll under arm increase infraspinatus and teres minor EMG signal activity compared to no towel roll (Wilk KE 2002), although subsequent study found no significant difference (Reinold MM 2004). Also see Dumbbell Shoulder External Rotation Errors.'),(519,537,'Maintain elbow against side and fixed elbow position (90° angle) throughout exercise. Exercise may be performed standing with medium high pulley.'),(520,539,'Maintain elbow against side and fixed elbow position (90° angle) throughout exercise. Position incline as low as possible so dumbbell can still be aligned against gravity.'),(521,541,'Throughout movement, keep bent elbow (approximately 90°) out to side, shoulder height.'),(522,540,'Wrist may be kept straighter throughout movement than what is shown. Also, keep elbow at shoulder height and bent at right angle. Height of cable pulley is dependent upon:'),(523,542,'Maintain elbow against side and fixed elbow position (90° angle) throughout exercise. Exercise may be performed seated on chair with pulley lowered to elbow height or seated on floor with low pulley.'),(524,543,'Adjust lever and body orientation to achieve full range of motion.'),(525,544,'Throughout movement, keep bent elbow (approximately 90°) out to side, shoulder height.'),(526,545,'Exercise can also be performed with seat facing inward at 45° but this may limit internal rotation ROM of shoulder and supraspinatus will not assist.'),(527,546,'Those with shorter forearms whose wrists do not make contact with pad would utilize Wrist Extensors as stabilizer to keep wrists ridged while back of the hands move pads.'),(528,547,'Lean torso toward positioned arm if stretch is not yet felt.'),(529,548,'None.'),(530,549,'Keep back straight.'),(531,550,'None.'),(532,551,'None.'),(533,552,'A very upright position (ie: very light resistance) with one foot positioned back slightly (see \'Easier\') is typically required for proper execution. Take care to maintain tension on suspension trainer near top of movement. Dismounting can be achieved by walking backward until body is upright or stepping out at top of movement. This exercise can be performed on TRXⓇ style suspension trainer or adjustable length gymnastics rings.'),(534,553,'Torso can lean back slightly allowing for fuller range of motion at the bottom of movement. In which case, forearm does not need to travel any closer than vertical toward body. Elbow can be held with opposite hand for additional support.'),(535,554,'Maintain elbow against side and fixed elbow position throughout exercise. Exercise may be performed seated if medium high / adjustable pulley is not availble.'),(536,555,'Maintain elbow\'s bend and position at edge of bench against side of body throughout exercise. Elbow can be held with opposite hand for additional support.'),(537,556,'Adjust lever and body orientation to achieve full range of motion.'),(538,559,'Bent knees slightly so stretch is not limited by hamstring flexibility and to keep shoulder from being pushed forward.'),(539,558,'Those with shorter forearms whose wrists do not make contact with pad would utilize Wrist Flexors as stabilizer to keep wrists ridged while hands move pads.'),(540,557,'Maintain elbow against side and fixed elbow position throughout exercise. Exercise may be performed standing with medium high / adjustable pulley'),(541,560,'None.'),(542,561,'Turn seat facing inward at 45° if external rotation ROM of shoulder is limited. Consequently placing the upper arm in this plane limits internal rotation ROM of shoulder and Supraspinatus will assist slightly in interal rotation.'),(543,562,'See mount and dismount. Some assisted machines require you to kneel on platform instead of standing on bar. Also see Assisted Triceps Dip.'),(544,563,'See mount and dismount. Some assisted machines require you to standing on bar. Also see Assisted Triceps Dip.'),(545,564,'Instead of assistant holding bench board, it can be strapped to torso, as shown. Boards of varying thicknesses (1, 2, or 3) can be used. Board Press develops strength in middle range of motion for Bench Press. Gluteus Maximus, Erector Spinae, Quadriceps, and other muscles may be considered significant stabilizers during actual powerlift.'),(546,565,'Upper arm travels in perpendicular path to torso to minimize anterior deltoid involvement and mimics upper arm positioning of Chest Flies. The oblique grip (hand positioned with palm diagonal on bar) allows elbows to be more easily turned outward to each side. Also see Bench Press Analysis.'),(547,566,'Competitive lifting requires bar to make contact with chest above bottom of the sternum with momentary pause. Gluteus Maximus, Erector Spinae, Quadriceps, and other muscles may be considered significant stabilizers during actual powerlift.'),(548,567,'Range of motion will be compromised if grip is too wide.'),(549,568,'Floor Presses are also said to build explosive strength by breaking eccentric/concentric chain (AKA: stretch-shortening cycle) normally activated at bottom of standard Bench Press.'),(550,569,'Range of motion will be compromised if grip is too wide. Latissimus Dorsi involvement is l\n\n\now on Decline Bench Press (Barnett 1995). Also see Bench Press Analysis.'),(551,570,'The animation depicts dip bar placed in front of low pull cable. If cable dip machine is available, attach hip harness and step up to dip bar. Also see Cable Triceps Dip.'),(552,571,'Since incline of bench does not actually affect angle of pull as with dumbbells, similar effect can be achieved on flat bench if cable stirrups are brought together above upper abdomen instead of chest.\n\n\nKeep shoulders internally rotated so elbows point downward at bottom position and outward at top position. Keep elbows at fixed angle, only slightly bent. Anterior Deltoid will no longer act as synergist in steep decline bench position.'),(553,572,'Chains provide increasing resistance as barbell moves away from floor. Chains can be used during either Powerlift-style Bench Press or Standard-style Bench Press. Also see Bench Press Analysis.'),(554,573,'Shoulders are kept internally rotated so elbows are pointing back\n\n\nand out to sides.'),(555,574,'Keep shoulders internally rotated so elbows point downward at bottom position and outward at top position. Keep elbows at fixed angle, only slightly bent.'),(556,575,'Stirrup should follow slight arch pattern, above upper arm between elbow and chest at bottom, traveling inward over each shoulder at t\n\n\nop. Also see Bench Press Analysis.'),(557,576,'Under greater resistance, positioning torso at lower angle downward (by bending over at hips), will allow upper body weight to counterbalance upward pull of cables, as opposed to stepping forward and struggling with\n\n\nbackward pull of cables.'),(558,577,'Also see exercise performed with twisting movement. Pectoralis Minor and Serratus Anterior act as stabilizers if torso is not against back support as shown.'),(559,578,'Cable pulleys should be relatively close together, narrower than width of arms extended out to sides (but not too close), closer than what is typically found on standard cable cross over setup. Range of motion will be compromised if grip is too wide.'),(560,579,'The effective range of motion of Pectoralis Major is only about half of what it is in non-twisting movement.'),(561,580,'Range of motion will be compromised if grip is too wide. Also see Bench Press Analysis and Cable Bar Standing Bench Press.'),(562,582,'Stirrup should follow slight arch pattern as hands travel closer together toward extension. Cable pulleys should be relatively close together, narrower than width of arms extended out to sides (but not too close), closer than what is typically found on standard cable cross over setup.'),(563,581,'Stirrup should follow slight arch pattern, in front of upper arm between elbow and chest in stretched position, traveling inward in front of each shoulder at extended position.'),(564,583,'Dumbbells should follow slight arch pattern, above upper arm between elbow and chest at bottom, traveling inward over each shoulder at top. No need to drop weights - see suggested mount and dismount techniques: standard or advanced. Also see mount & dismount from special machine rack and\n\n\nBench Press Analysis.'),(565,584,'Stirrup should follow slight arch pattern, in front of upper arm between elbow and chest in stretched position, traveling inward and slightly downward just below each shoulder at ex\n\n\ntended position. Latissimus Dorsi involvement is low on Decline Bench Press (Barnett 1995).'),(566,585,'Stirrup should follow slight arch pattern, in front of upper arm between elbow and chest in stretched position, traveling inward in front shoulder at contracted position.'),(567,586,'Stirrup should follow slight arch pattern as hands travel closer together toward extension. Cable pulleys should be relatively close together, narrower than width of arms extended out to sides (but not too close), closer than what is typically found on standard cable cross over setup.'),(568,587,'Cable pulleys should be relatively close together, narrower than width of arms extended out to sides (but not too close), closer than what is typically found on standard cable cross over setup.'),(569,588,'Stirrup should follow slight arch pattern, above upper arm between elbow and chest at bottom, traveling inward over each shoulder at top. No need to drop weights - see suggested mount and dismount technique. Latissimus Dorsi involv\n\n\nement is low on Decline Bench Press (Barnett 1995). Also see mount & dismount from special machine rack and Bench Press Analysis.'),(570,589,'Keep elbows at fixed angle, only slightly bent, and pointing outward, opposite direction of upward motion. Anterior Deltoid will no longer act as synergist in steep decline bench position.'),(571,590,'Avoid hips from raising up significantly. Actual range of motion is dependent upon individual shoulder flexibility. Keep elbows fixed at small bend throughout exercise. See suggested mount & dismount.'),(572,591,'Keep shoulders internally rotated so elbows point downward at bottom position and outward at top position. Keep elbows at fixed angle, only slightly bent.'),(573,592,'Lower body extending off of bench acts as counter balance to resistance and keeps upper back fixed on bench. Avoid hips from raising up significantly. Actual range of motion is dependent upon individual shoulder flexibility. Keep elbows fixed at small bend throughout exercise. See suggested mount & dismount.'),(574,593,'Orientation relative to lever will depend upon height of fulcrum relative to bench. Position body so bar is over shoulders during extension, yet lower on chest in lowest position. Range of motion will be compromised if grip is too wide. Also see Bench Press Analysis.'),(575,594,'Range of motion will be compromised if grip is too wide. Latissimus Dorsi involvem\n\n\nent is low on Decline Bench Press (Barnett 1995). Also see exercises performed on alternative machine. Also see Bench Press Analysis.'),(576,595,'Range of motion will be compromised if grip is too wide. Also see Bench Press Analysis.'),(577,596,'Actual range of motion is dependent upon individual shoulder flexibility. Keep elbows fixed at small bend throughout exercise. See suggested mount & dismount.'),(578,597,'Range of motion will be compromised if grip is too wide. Also see Bench Press Analysis.'),(579,598,'Also see Lever Triceps Dip.'),(580,599,'See Lever Chest Dip on machine facing fulcrum. Also see Lever Triceps Dip.'),(581,602,'Range of motion will be compromised if grip is too wide. Also see Bench Press Analysis.'),(582,603,'None.'),(583,604,'None'),(584,605,'Height of platform should allow shoulders to be near the same height of fulcrums. Secondary levers compensate somewhat for variations if alignment between points of rotation (lever fulcrum and shoulder girdle articulation). Under greater resistance, height of platform can be increased so torso can be positioned at lower angle downward (by bending over at hips). This will allow upper body weight to counterbalance upward pull of levers. See Lever Seated Iron Cross Fly and Lever Iron Cross for Lats.'),(585,606,'Shoulders should be internally rotated so elbows are pointing back at beginning of motion and outward at end of motion.'),(586,608,'Shoulders should be internally rotated so elbows are pointing backwards at beginning of motion and forward at completion of motion.'),(587,609,'Shoulders are kept internally rotated so elbows are pointing out to sides. Adjust lever arms on machine so slight stretch is felt when weight is lowered. Also see exercises on alternative machine.'),(588,607,'Under greater resistance, positioning torso at lower angle downward (by bending over at hips), will allow upper body weight to counterbalance upward pull of cables, as opposed to stepping forward and struggling with the backward pull of cables. Also see Bent-over Fly on Standing Iron Cross Machine.'),(589,611,'Shoulders should be internally rotated so elbows are pointing downward at bottom of motion and outward at top of motion.'),(590,612,'Range of motion will be compromised if grip is too wide. Also see Bench Press Analysis.'),(591,613,'Range of motion will be compromised if grip is too wide.'),(592,615,'Some machines have foot levers to position handles in a more comfortable starting and ending position. If foot lever is available, engage it before grasping handles, release it before performing exercise, and engage it again just before releasing grips.'),(593,614,'Range of motion will be compromised if grip is too wide. Latissimus Dorsi involvement is low on Decline Bench Press (Barnett 1995). Also see Bench Press Analysis.'),(594,618,'Some machines have foot levers to position handles in a more comfortable starting and ending position. If foot lever is available, engage it before grasping handles, release it before performing exercise, and engage it again just before releasing grips.'),(595,619,'Both the machine design and handle orientation are rare. See typical dip machines:'),(596,617,'Range of motion will be compromised if grip is too wide.'),(597,621,'Range of motion will be compromised if grip is too wide. Also see Bench Press Analysis.'),(598,620,'This particular machine design is rare. See typical dip machines:'),(599,622,'Range of motion will be compromised if grip is too wide. Latissimus Dorsi involvement is low on Decline Bench Press (Barnett 1995). Also see Bench Press Analysis.'),(600,624,'Also see Triceps Dip.'),(601,623,'Both upper and lower body must be kept straight throughout movement. Exercise can be performed without additional weight. If additional weight is used, partner will need to add and remove weight, and keep weight from sliding off back. See narrower grip push-up.'),(602,625,'Also see Band-assisted Triceps Dip.'),(603,628,'Both upper and lower body must be kept straight throughout movement. See close grip push-up. Also see push-up test calculator.'),(604,626,'Range of motion will be compromised if grip is too wide. Latissimus Dorsi involvement is low on Decline Bench Press (Barnett 1995). Also see Bench Press Analysis.'),(605,627,'Both upper and lower body must be kept straight throughout movement. Exercise can be performed without additional weight, without handles, or without platform. Platform compensates for height of handles. If platform is too high, upper chest will be emphasized (see Decline Push-up). If additional weight is used, partner will need to add and remove weight, and keep weight from sliding off back.'),(606,629,'Added weight can be placed on dip belt or dumbbell can be placed between ankles. Also see Weighted Triceps Dip.'),(607,630,'In above clip, hands are positioned at ends of main segments of benches with fingers between gaps. On standard benches, hands should be placed near ends of benches. Perform on higher benches if slight stretch is not felt. Also see Triceps Dip (between benches).'),(608,631,'In above clip, hands are positioned at ends of main segments of benches with fingers between gaps. On standard benches, hands should be placed near ends of benches. Perform on higher benches if slight stretch is not felt. Also see Triceps Dip (between benches).'),(609,632,'Both upper and lower body must be kept straight throughout movement. Height of bench or platform affects difficulty of movement. See Gravity Vectors for greater understanding how of body angle influences resistance. Also see movement performed on horizontal bar and close grip push-up.'),(610,633,'To emphasize chest, position body bent over by bending hips. Also see Triceps Dips. This exercise can be performed on adjustable length gymnastics rings or a dual anchored suspension trainer.'),(611,634,'Both upper and lower body must be kept straight throughout movement. Height of bar affects difficulty of movement. See Gravity Vectors for greater understanding of how body angle influences resistance. Also see movement performed on edge of box or bench and close grip push-up.'),(612,635,'If lower body is used for assistance, Quadriceps are utilized. Hips are kept straighter and body more upright, as compared to Assisted Triceps Dip. This exercise can be performed on adjustable length gymnastics rings or a dual anchored suspension trainer.'),(613,636,'See Suspended Chest Press Mount/Dismount . Arms and suspension straps should be perpendicular to body. Both upper and lower body must be kept straight throughout movement. Elbows largely remain behind hands\' line of force. See side view. Angle of body affects difficulty of movement. See Gravity Vectors for greater understanding of body angle influences resistance. This exercise can be performed on TRXⓇ style suspension trainer or adjustable length gymnastics rings.'),(614,637,'Hands may be clasped. Keep head upright.'),(615,638,'If lower body is used for assistance, Hip and Knee Extensors muscles are utilized. Hips are bent more and body leans forward more, as compared to Self-assisted Triceps Dip.'),(616,639,'See Suspended Prone Mount/Dismount. Throughout movement, keep elbows in fixed, slightly bent position and shoulders internally rotated, so elbows are kept pointed outward and high. Arms and suspension straps plane of motion should be perpendicular to body. Both upper and lower body must be kept straight throughout movement. Angle of body affects difficulty of movement. See Gravity Vectors for greater understanding of how body angle influences resistance.'),(617,640,'Both upper and lower body must be kept straight throughout movement. Forefeet can remain on floor as long as body is pivoting on knees. See close grip push-up. Also see push-up test calculator.'),(618,641,'Upper chest becomes more stretched with elbow lower. Lower chest and pectoralis minor become more stretched with elbow higher.'),(619,642,'None'),(620,643,'Participants hands can be clasped. See PNF stretch techniques. Also see Behind Head Chest Stretch for similar static stretch.'),(621,644,'Upper chest becomes more stretched with elbow lower. Lower chest and pectoralis minor become more stretched with elbow higher.'),(622,645,'Stirrup should follow slight arch pattern, in front/above of upper arm between elbow and chest in stretched position, travelling inward in front/above each shoulder at contracted position.'),(623,646,'Range of motion will be compromised if grip is too wide.\n\n\nAlso see Bench Press Analysis.'),(624,647,'Stirrup should follow slight arch pattern, in front/above of upper arm between elbow and chest in stretched position, travelling inward in front/above each shoulder at contracted position. Cable pulleys should be closer together than what is typically found on standard cable cross over setup.'),(625,650,'Cable pulleys should be closer together than what is typically found on standard cable cross over setup. Range of motion will be compromised if grip is too wide.'),(626,649,'Stirrup should follow slight arch pattern, above upper arm between elbow and chest at bottom, traveling inward over each shoulder at top.'),(627,648,'Range of motion will be compromised if grip is too wide. Also see Bench Press Analysis.'),(628,651,'Keep shoulders internally rotated so elbows point downward at bottom position and outward at top position. Shoulder will likely have less range of motion in lower position as compared to Fly on flat bench.'),(629,652,'Dumbbell should follow slight arch pattern, above upper arm between elbow and chest at bottom, traveling inward over each shoulder at top. See suggested mount & dismount and mount & dismount from special machine rack. Also see elevated foot leg positioning to decrease arch in back and\n\n\nBench Press Analysis.'),(630,654,'Stirrup should follow slight arch pattern, in front/above of upper arm between elbow and chest in stretched position, travelling inward in front/above shoulder at contracted position.'),(631,653,'None'),(632,655,'Keep shoulders internally rotated so elbows point downward at bottom position and outward at top position. Shoulder will likely have less range of motion in lower position as compared to Fly on flat bench.'),(633,657,'Range of motion will be compromised if grip is too wide.'),(634,656,'This exercise is typically performed on Lever Incline Chest Press Machine. Seat alterations and precautions during mounting and dismounting of weight will need to be taken since this apperatus is designed for Lever Military Press. Seat should be positioned so base of handles are approximately arm pit height, higher than what is required for military press. Before initiation of movement, lift lever into lower starting position with elbows positioned slightly low. Once first rep is performed, position elbows slightly further out to sides. At bottom position of each rep, lower levers only as far back to allow slight stretch to be felt in chest or shoulders. Once last rep is performed, lower shoulders slightly before lowering levers to resting position.'),(635,658,'Orientation relative to lever will depend upon height of fulcrum relative to bench. Position body so bar is over shoulders during extension, yet lower on chest in lowest position. Feet can be placed on bench as shown for more comfortable low back positioning. Range of motion will be compromised if grip is too wide.\n\n\nAlso see Bench Press Analysis.'),(636,659,'Range of motion will be compromised if grip is too wide. See Lever Incline Bench Press improvised on older equipment and\n\n\nexercise performed with parallel grip. Also see Bench Press Analysis.'),(637,660,'Seat should be adjusted, so handles are to sides of lower chest. Parallel grip tends to place shoulders in a more stable position, with arms closer to sides, which may be more ideal for those with certain shoulder issues. See exercise on alternative machine. Also see exercise performed with standard grip providing greater emphasis on chest development.\n\n\nAlso see Bench Press Analysis.'),(638,661,'Range of motion will be compromised if grip is too wide. Also see exercise performed with parallel grip and exercise performed on alternative machine.\n\n\nAlso see Bench Press Analysis.'),(639,662,'Seat should be adjusted so handles are to sides of lower chest. Parallel grip tends to place shoulders in a more stable position, with arms closer to sides, which may be more ideal for those with certain shoulder issues. Also see exercise performed with standard grip providing greater emphasis on chest development.\n\n\nAlso see Bench Press Analysis.'),(640,663,'Some machines have foot levers to position handles in a more comfortable starting position. If available, push lever with foot, grasp bar, and release foot lever.'),(641,665,'Some machines have foot levers to position handles in a more comfortable starting and ending position. If foot lever is available, engage it before releasing grips.'),(642,664,'Range of motion will be compromised if grip is too wide.'),(643,668,'Elbows should be pointing downward at bottom of motion and outward on top of motion.'),(644,666,'Range of motion will be compromised if grip is too wide.\n\n\nAlso see Bench Press Analysis.'),(645,667,'Range of motion will be compromised if grip is too wide or necked is protracted. Very high elevations may not involve sternal head of pectoralis major. Lower elevations will target sternal head of pectoralis major but still involve clavicular head of pectoralis major as synergist.'),(646,669,'Pike Push-up (for upper chest) differs from Pike Press (for front delts) in that, feet are further away from hands so body is less inverted in lowest position.'),(647,670,'Range of motion will be compromised if grip is too wide or necked is protracted. Very high elevations may not involve sternal head of pectoralis major. Lower elevations will target sternal head of pectoralis major, but still involve clavicular head of pectoralis major as synergist.'),(648,671,'This dynamic shoulder girdle stretch exercises rhomboids and trapezius isometrically while stretching pectoralis minor and major. It can be prescribed for protracted shoulder girdle. Continuously push shoulders and back of arms into floor or mat throughout stretch. Although arms move slowly throughout stretch, shoulder blades, elbows, and wrists are continuously pushing back against floor or mat. Position pelvis back so low back remains on floor or mat. See movement in Wall Shoulder Girdle Stretch.'),(649,677,'None.'),(650,678,'This dynamic shoulder girdle stretch exercises rhomboids and trapezius isometrically while stretching pectoralis minor and major. It can be prescribed for protracted shoulder girdle. Keep lower and upper back against wall. Continuously push shoulders blades and arms into wall throughout stretch. Although arms move slowly throughout stretch, shoulders, elbows, and wrists are continuously pushing back against wall.'),(651,679,'Keep arms straight throughout execution. For convenience, exercise can be performed immediately after warm up on Lever Incline Chest Press.'),(652,680,'Keep arms straight throughout execution. For convenience, exercise can be performed immediately after warm up on Barbell Incline Chest Press.'),(653,681,'Keep arms straight throughout execution. For convenience, exercise can be performed immediately after warm up on Dumbbell Incline Chest Press.'),(654,685,'None'),(655,682,'Keep arms straight throughout execution. For convenience, exercise can be performed immediately after warm up on Cable Incline Chest Press.'),(656,683,'Keep arms straight throughout execution. For convenience, exercise can be performed immediately after warm up on Lever Incline Chest Press. See movment performed on Hammer Front Military Press Machine, which incidentally has favorable position for this movement as compared to Hammer Incline Press.'),(657,686,'Keep arms straight throughout execution. For convenience, exercise can be performed immediately after warm up on Smith Incline Chest Press.'),(658,687,'Both upper and lower body must be kept straight throughout movement. See similar Push-up exercises targeting Pectoralis Major.'),(659,689,'Keep weight above shoulders throughout movement. A standard incline crunch without additional weight should be performed until greater resistance is required. Incline bench shown is designed for chest exercises, not abdominal exercise. Flexible hip flexors are required if bench does not provide for fixed hip flexion. A relatively steep incline is required to adequately position abdominal against load throughout fuller range of motion. See Spot Reduction Myth.'),(660,690,'See Spot Reduction Myth. Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. Some individuals may experience low back discomfort if hips are not bent so they must use smaller ball size or lower their hip position on ball.'),(661,691,'Training partner or trainer may need to assist attaching ankle cuffs to cable. Ankle cuffs may also be attached to cable pulley in lowest position when feet are on floor, but assistance may be needed to raise pulley to bench height. Cable Lying Leg Raise on floor is easier to set up.'),(662,692,'Keep weight above shoulders throughout movement. Incline can also be elevated to increase resistance. If upper back does not come completely down at end of movement, abdominal muscles may only be isometrically involved in exercise. Pectineus, Adductor Longus, and Brevis do not assist in hip flexion since hips are already initially bent. Knee flexors may be involved as stabilizers if incline is steep and no calf support is used. Incline bench should allow for significant bend in hip as shown. Decline benches designed for chest exercises generally do not offer this positioning. Flexible hip flexors are required if bench does not provide for fixed hip flexion. See Spot Reduction Myth. Also see Dangerous Exercise Essay.'),(663,693,'See Spot Reduction Myth. Also see movement performed on selectorized apparatus.'),(664,694,'Movement can also be performed on bench. Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible. See Spot Reduction Myth and Lower Ab Myth. Also see Cable Lying Leg Raise.'),(665,695,'Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. Waist flexion will occur earlier in lift if legs are straighter or Hamstrings are not that flexible. See Spot Reduction Myth and Lower Ab Myth. Also see Cable Lying Straight Leg Raise.'),(666,696,'See Spot Reduction Myth. Also see movement performed on dedicated apparatus or plate loaded apparatus.'),(667,697,'Note movement occurs in waist, not hips. See Spot Reduction Myth. Hyperextension of spine at top of motion is achieved by anterior rotation of pelvis with flexed hips. Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. If two soft stirrups are used instead of rope attachment, grasp stirrups at side of head. Also see alternative technique. Movement can also be performed standing up, see Cable Standing Overhead Crunch.'),(668,698,'Keep arms fixed in position keeping them close to body throughout movement. See Spot Reduction Myth.'),(669,699,'Padded hump should be adjusted to height of low back. See Spot Reduction Myth. Also see Cable Standing Twisting Crunch and Cable Standing Overhead Crunch.'),(670,700,'Keep weight above shoulders throughout movement. A standard incline crunch without additional weight should be performed until greater resistance is required. Incline bench shown is designed for chest exercises, not abdominal exercise. Flexible hip flexors are required if bench does not provide for fixed hip flexion. A relatively steep incline is required to adequately position abdominal against load throughout fuller range of motion. See Spot Reduction Myth.'),(671,701,'Lever fulcrum should be aligned with waist, not hips. See Spot Reduction Myth.'),(672,702,'Note movement occurs in waist, not hips. Hyperextension of spine at top of motion is achieved by anterior rotation of pelvis with flexed hips. See Spot Reduction Myth. Two soft stirrups or triceps rope can also be substituted for multi-purpose bar. Also see similar exercises:'),(673,703,'Note movement occurs in waist, not hips. Hyperextension of spine at top of motion is achieved by anterior rotation of pelvis with flexed hips. See Spot Reduction Myth. Two soft stirrups or multi-exercise bar can be substituted for rope. If two soft stirrups are used, grasp stirrups at side of head. Also see similar exercises:'),(674,704,'Keep weight above shoulders throughout movement. Incline can also be elevated to increase resistance. If upper back does not come completely down at end of movement, abdominal muscles may only be isometrically involved in exercise. Pectineus, Adductor Longus, and Brevis do not assist in hip flexion since hips are already initially bent. Knee flexors may be involved as stabilizers if incline is steep and no calf support is used. Incline bench should allow for significant bend in hip as shown. Decline benches designed for chest exercises generally do not offer this positioning. Flexible hip flexors are required if bench does not provide for fixed hip flexion. See Spot Reduction Myth. Also see Dangerous Exercise Essay.'),(675,707,'See Spot Reduction Myth.'),(676,705,'Lever fulcrum should be aligned with waist, not hips. Some lever lying crunch machines have handles to sides. See Spot Reduction Myth.'),(677,708,'Exercise is typically performed without added resistance. Rectus Abdominis and Obliques only dynamically contract only if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only isometrically contract to stabilize pelvis and waist during hip flexion; see Lever Vertical Leg Raise. Waist flexion will occur earlier in lift if legs are straighter or Hamstrings are not that flexible. See Spot Reduction Myth and Lower Ab Myth.'),(678,706,'Rectus Abdominis and Obliques dynamically contract only if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only isometrically contract to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible. See Spot Reduction Myth and Lower Ab Myth.'),(679,709,'Weight plates added to upper segment adds resistance, whereas weight plates added to lower segment decreases resistance. Seat can also be turned to either side to emphasize obliques. See Spot Reduction Myth.'),(680,710,'See Spot Reduction Myth.'),(681,711,'On some models, feet can be positioned behind pad under seat. See Spot Reduction Myth.'),(682,712,'Foot bar should be adjusted to allow for slight bend in knees as hips are forcefully being pushed against hip pad. Throughout exercise, keep arms straight and hips securely pushed back against hip pad. See Spot Reduction Myth.'),(683,713,'Maintain shoulders fixed at 90º or greater so upper arm and upper back are close to perpendicular. Men should keep chest close to padded lever. Women may choose to position chest as close as possible without making contact with inside of lever. See Spot Reduction Myth.'),(684,714,'If low back does flex near top of motion, abdominal muscles may only be isometrically involved in exercise. Pectineus, Adductor Longus, and Brevis do not assist in hip flexion since hips are already initially bent. Sled pad can be turned to either side to emphasize Obliques. See Spot Reduction Myth.'),(685,716,'Taller individuals will place feet on floor, whereas shorter individuals will place feet on feet bars. See Spot Reduction Myth.'),(686,715,'See Spot Reduction Myth.'),(687,717,'See Spot Reduction Myth.'),(688,718,'Exercise can be performed without added weight until more resistance is needed. Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. See Arm Position During Waist Exercises and Spot Reduction Myth.'),(689,719,'Exercise can be performed without added weight until more resistance is needed. Leg elevation keeps pelvis tilted back keeping low back on mat. See Arm Position During Waist Exercises and Spot Reduction Myth.'),(690,720,'Exercise can be performed without added weight until more resistance is needed. Elevate incline to increase resistance. See Arm Position During Waist Exercises. If no knee support is built in to incline board, ball can be placed under legs as illustrated. Hip and knee flexors may be involved as stabilizers if incline is steep and no calf support is used. See advanced technique and Spot Reduction Myth.'),(691,721,'Exercise can be performed without added weight until more resistance is needed. Elevate incline to increase resistance. Elbows can also raise up over knees during each Sit-up to increase range of motion. Also see Arm Position During Waist Exercises. If no knee support is built in to incline board, ball can be placed under legs as illustrated. If upper back does not come completely down at end of movement, abdominal muscles may only be isometrically involved in exercise. Pectineus, Adductor Longus, and Brevis do not assist in hip flexion since hips are already initially bent. Knee flexors may be involved as stabilizers if incline is steep and no calf support is used. See Spot Reduction Myth. Also see Dangerous Exercise Essay.'),(692,722,'Exercise can be performed without added weight until more resistance is needed. Incline can also be elevated to increase resistance. See Arm Position During Waist Exercises. Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. If upper back does not come completely down at end of movement, abdominal muscles may only be isometrically involved in exercise. Pectineus, Adductor Longus, and Brevis do not assist in hip flexion since hips are already initially bent. Knee flexors may be involved as stabilizers if incline is steep and no calf support is used. See Spot Reduction Myth. Also see Dangerous Exercise Essay.'),(693,723,'If ball is positioned lower than upper chest (eg: over waist), effective resistance dramatically diminishes. See how length of lever arm affects resistance. Movement can be made easier by positioning hips low on ball. In contrast, exercise can be made more challenging by using positioning ball lower on back and hips higher. Some individuals may experience low back discomfort if hips are not bent so they must use smaller ball size or lower their hip position on ball. See Arm Position During Waist Exercises and Spot Reduction Myth.'),(694,724,'Exercise can be performed without added weight until more resistance is needed. Elevate incline to increase resistance. See Arm Position During Waist Exercises. Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. Hip and knee flexors may be involved as stabilizers if incline is steep and no calf support is used. Also see intermediate technique. See Spot Reduction Myth.'),(695,726,'Intensity can be increased by using heavier medicine ball,\nby performing movement faster, using\noverhead throwing motion. If upper back does not come completely down\nat end of movement, abdominal muscles may only be\nisometrically\ninvolved in exercise. See similar plyometric movement: Medicine Ball Situp (with partner). See Spot Reduction Myth and Dangerous Exercise Essay.'),(696,725,'Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. Exercise can be performed without added weight until more resistance is needed. Movement can be made easier by positioning hips low on ball. In contrast, exercise can be made more challenging by using positioning ball lower on back and hips higher. Some individuals may experience low back discomfort if hips are not bent so they must use smaller ball size or lower their hip position on ball. See Arm Position During Waist Exercises and Spot Reduction Myth.'),(697,727,'Feet can be held down by partner instead of foot bar. Exercise can be performed without added weight until more resistance is needed. Exercise can be performed on incline board to increase resistance or decline board to decrease resistance. See Arm Position During Waist Exercises. Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. If upper back does not come completely down at end of movement, abdominal muscles may only be isometrically involved in exercise. Pectineus, Adductor Longus, and Brevis do not assist in hip flexion since hips are already initially bent. See Spot Reduction Myth. Also see Dangerous Exercise Essay.'),(698,728,'If feet are close to hips, bent arms can be lifted above knees, allowing for complete range of motion resulting in a more bell shaped resistance curve (ie: lessened resistance at top of movement) due to more varying force vectors against gravity. The same can be accomplished by placing feet slightly further away from hips, requiring no need to lift arms above knees (as shown).'),(699,729,'Intensity can be increased by using heavier medicine ball or by performing movement faster. Movement can be made easier by using chest throw motion. If upper back does not come completely down at end of movement, abdominal muscles may only be isometrically involved in exercise. See similar plyometric movement: Medicine Ball Situp (with partner). See Spot Reduction Myth and Dangerous Exercise Essay.'),(700,730,'Exercise can be performed without added weight until more resistance is needed. Rectus Abdominis and Obliques dynamically contract only if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only isometrically contract to stabilize pelvis and waist during hip flexion; see Weighted Vertical Leg Raise. It may be necessary to completely flex hips before waist flexion is possible. See Spot Reduction Myth and Lower Ab Myth.'),(701,731,'Exercise can be performed without added weight until more resistance is needed. Rectus Abdominis and Obliques dynamically contract only if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only isometrically contract to stabilize pelvis and waist during hip flexion; see Weighted Vertical Leg Raise. It may be necessary to completely flex hips before waist flexion is possible. See Spot Reduction Myth and Lower Ab Myth.'),(702,732,'This exercise is alternative to Vertical Leg-hip Raise when apparatus is not available, or Hanging Leg-hip Raise when high bar is not available or too low to allow for adequate leg clearance. Exercise can be performed without added weight until more resistance is needed. Rectus Abdominis and Obliques dynamically contract only if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only isometrically contract to stabilize pelvis and waist during hip flexion; see Weighted Vertical Leg Raise on parallel bars. It may be necessary to completely flex hips before waist flexion is possible. See Spot Reduction Myth and Lower Ab Myth.'),(703,733,'Exercise can be performed without added weight until more resistance is needed. When raising hips, keep knees fully flexed, so as not to throw weight of lower legs over head. Rectus Abdominis and Obliques dynamically contract only if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only isometrically contract to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible. See Spot Reduction Myth and Lower Ab Myth. Also see Weighted Incline Leg Raise.'),(704,734,'Exercise can be performed without added weight until more resistance is needed. Also see Hanging Leg Hip Raise with Ab Straps. Rectus Abdominis and Obliques dynamically contract only if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only isometrically contract to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible. See Spot Reduction Myth and Lower Ab Myth. Also Weighted Hanging Leg Raise.'),(705,735,'Exercise can be performed without added weight until more resistance is needed. Certain individuals ma\n\n\ny need to keep their neck in neutral position with space between their chin and sternum. See Spot Reduction Myth and Arm Position During Waist Exercises.'),(706,736,'Exercise can be performed without added weight until more resistance is needed. See Arm Position During Waist Exercises. Elevate incline to increase resistance. If no knee support is built in to incline board, ball can be placed under legs as illustrated.'),(707,737,'To allow for full range of motion, grip height on strap should not allow weight to bottom out (weights touching stack) when shoulders are back. Padded hump should be adjusted to height of low back. See Spot Reduction Myth.'),(708,738,'Seat can also be locked straight or to one side. See Spot Reduction Myth.'),(709,739,'Exercise can be performed without added weight until more resistance is needed. Elevate incline to increase resistance. When raising hips, keep knees fully flexed, so as not to throw weight of lower legs over head.'),(710,740,'Exercise can be performed without added weight until more resistance is needed. Elevate incline to increase resistance. See Arm Position During Waist Exercises. Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. If upper back does not come completely down at end of movement, abdominal muscles may only be isometrically involved in exercise. Pectineus, Adductor Longus, and Brevis do not assist in hip flexion since hips are already initially bent. Knee flexors may be involved as stabilizers if incline is steep and no calf support is used. See Spot Reduction Myth.'),(711,741,'If weight is held behind head, position head hanging off bench. See Spot Reduction Myth. Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. See Arm Position During Waist Exercises.'),(712,742,'Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. Exercise can be performed without added weight until more resistance is needed. Movement can also be made easier by po\n\n\nsitioning hip low on ball or by using no added weight. In contrast, exercise can be made more challenging by positioning hip higher on ball. In which case, feet may be placed against base of wall for stability. Also see Spot Reduction Myth and Arm Position During Waist Exercises.'),(713,743,'Crossed arms can also be brought up above knees at top to increase range of motion. Exercise can be performed without added weight until more resistance is needed. Elevate incline to increase resistance. See Arm Position During Waist Exercises. If no knee support is built in to incline board, ball can be placed under legs as illustrated. Elbows can be raised over opposing knees for fuller range of motion. If upper back does not come completely down at end of movement, abdominal muscles may only be isometrically involved in exercise. Pectineus, Adductor Longus, and Brevis do not assist in hip flexion since hips are already initially bent. Knee flexors may be involved as stabilizers if incline is steep and no calf support is used. See Spot Reduction Myth.'),(714,744,'Certain individuals may need to keep their neck in neutral position with space between their chin and sternum, particularly if hands are placed behind head. See Spot Reduction Myth. Also see Curl-up / Half Sit-up Test.'),(715,746,'Feet can be held down by partner instead of foot bar. Exercise can be performed without added weight until more resistance is needed. Add more weight or perform on incline board to increase resistance. Also see Arm Position During Waist Exercises. Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. Also see exercise with weight placed on chest. If upper back does not come completely down at end of movement, abdominal muscles may only be isometrically involved in exercise. Pectineus, Adductor Longus, and Brevis do not assist in hip flexion since hips are already initially bent. See Spot Reduction Myth.'),(716,745,'Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. See Spot Reduction Myth.'),(717,747,'Leg elevation keeps pelvis tilted back, keeping low back on mat. See Spot Reduction Myth.'),(718,748,'Weight can be held behind neck. Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. Exercise can be performed without added weight until more resistance is needed. Movement can be made easier by positioning hips low on ball. In contrast, exercise can be made more challenging by positioning ball lower on back and hips higher. Some individuals may experience low back discomfort if hips are not bent, so they must use smaller ball size or lower their hip position on ball. See Arm Position During Waist Exercises and Spot Reduction Myth.'),(719,749,'Exercise can be performed without added weight until more resistance is needed. Add more weight or perform on incline board to increase resistance. Also see Arm Position During Waist Exercises and movement with weight placed behind head. If upper back does not come completely down at end of movement, abdominal muscles may only be isometrically involved in exercise. Pectineus, Adductor Longus, and Brevis do not assist in hip flexion since hips are already initially bent. See Spot Reduction Myth.'),(720,750,'Hip may move slightly during exercise. Exercise can be performed with added resistance if needed, by holding weight above. Quadriceps were not listed under stabilizers since they are not under significant resistance. Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. See Arm Position During Waist Exercises and Spot Reduction Myth.'),(721,751,'Begin each repetition with upper back on floor to allow abdominal muscles to work dynamically. The Rectus Abdominis and Obliques dynamically contract only when actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only isometrically contract to stabilize pelvis and waist during hip flexion. See Spot Reduction Myth and Lower Ab Myth.'),(722,752,'If no knee support is built in to incline board, ball can be placed under legs. Hip and knee flexors may be involved as stabilizers if incline is steep and no calf support is used. Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. See Spot Reduction Myth.'),(723,753,'Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. Some individuals may experience low back discomfort if hips are not bent so they must use smaller ball size or lower their hip position on ball. See Spot Reduction Myth.'),(724,755,'If no knee support is built in to incline board, ball can be placed under legs. Hip and knee flexors may be involved as stabilizers if incline is steep and no calf support is used. See Spot Reduction Myth .'),(725,757,'Attempt to decrease shoulder flexion during movement. Rectus Abdominis and Obliques only dynamically contract if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only isometrically contract to stabilize pelvis and waist during hip flexion. Waist flexion will occur earlier in lift if legs are straighter or Hamstrings are not that flexible. Also known as \'Toes-to-Bar\' or \'\n\n\nStrict Toes-to-Bar\'. See Spot Reduction Myth and Lower Ab Myth. Also Weighted Hanging Straight Leg Raise.'),(726,759,'When raising hips, keep knees fully flexed, so as not to throw weight of lower legs over head. Rectus Abdominis and Obliques dynamically contract only if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only isometrically contract to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible. See Spot Reduction Myth and Lower Ab Myth.'),(727,756,'Exercise can be performed without ab straps just by hanging from bar. Rectus Abdominis and Obliques only dynamically contract if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only isometrically contract to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible. See Spot Reduction Myth and Lower Ab Myth.'),(728,758,'When raising hips, keep knees fully flexed, so as not to throw weight of lower legs over head. Rectus Abdominis and Obliques dynamically contract only if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only isometrically contract to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible. See Spot Reduction Myth and Lower Ab Myth. Also see Incline Leg Raise.'),(729,754,'Some individuals may experience low back discomfort if hips are not bent so they must use smaller ball size or lower their hip position on ball. See Spot Reduction Myth.'),(730,760,'This exercise is alternative to Vertical Leg-hip Raise when apparatus is not available, or Hanging Leg-hip Raise when high bar is not available or too low to allow for adequate leg clearance. Rectus Abdominis and Obliques dynamically contract only if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only isometrically contract to stabilize pelvis and waist during hip flexion; see Weighted Vertical Leg Raise on parallel bars. It may be necessary to completely flex hips before waist flexion is possible. See Spot Reduction Myth and Lower Ab Myth.'),(731,761,'When raising hips, keep knees fully flexed, so as not to throw weight of lower legs over head. Rectus Abdominis and Obliques dynamically contract only if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only isometrically contract to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible. See Spot Reduction Myth and Lower Ab Myth. Also Incline Leg-Hip Raise on incline board.'),(732,763,'This exercise is alternative to Hanging Straight Leg-Hip Raise when high bar is not available or too low to allow for adequate leg clearance. Rectus Abdominis and Obliques dynamically contract only if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only isometrically contract to stabilize pelvis and waist during hip flexion; see Weighted Vertical Leg Raise on parallel bars. It may be necessary to completely flex hips before waist flexion is possible. Waist flexion will occur earlier in lift if legs are straighter or Hamstrings are not that flexible. See Spot Reduction Myth and Lower Ab Myth.'),(733,765,'Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. If no knee support is built in to incline board, ball can be placed under legs. If upper back does not come completely down at end of movement, abdominal muscles may only be isometrically involved in exercise. Pectineus, Adductor Longus, and Brevis do not assist in hip flexion since hips are already initially bent. Knee flexors may be involved as stabilizers if incline is steep and no calf support is used. See Spot Reduction Myth. Also see Dangerous Exercise Essay.'),(734,762,'Rectus Abdominis and Obliques dynamically contract only if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only isometrically contract to stabilize pelvis and waist during hip flexion; see Weighted Vertical Leg Raise. It may be necessary to completely flex hips before waist flexion is possible. See Spot Reduction Myth and Lower Ab Myth.'),(735,764,'Rectus Abdominis and Obliques dynamically contract only if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only isometrically contract to stabilize pelvis and waist during hip flexion; see Weighted Vertical Leg Raise. It may be necessary to completely flex hips before waist flexion is possible. See Spot Reduction Myth and Lower Ab Myth.'),(736,766,'If no knee support is built in to incline board, ball can be placed under legs. If upper back does not come completely down at end of movement, abdominal muscles may only be isometrically involved in exercise. Pectineus, Adductor Longus, and Brevis do not assist in hip flexion since hips are already initially bent. Knee flexors may be involved as stabilizers if incline is steep and no calf support is used. See Spot Reduction Myth. Also see Dangerous Exercise Essay.'),(737,767,'See Arm Position During Waist Exercises.'),(738,768,'Feet can be held down by partner instead of foot bar. Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. If upper back does not come completely down at end of movement, abdominal muscles may only be isometrically involved in exercise. Pectineus, Adductor Longus, and Brevis do not assist in hip flexion since hips are already initially bent. See Spot Reduction Myth. Also see Dangerous Exercise Essay.'),(739,769,'If upper back does not come completely down at end of movement, abdominal muscles may only be isometrically involved in exercise. Pectineus, Adductor Longus, and Brevis do not assist in hip flexion since hips are already initially bent. See Spot Reduction Myth. Also see Dangerous Exercise Essay.'),(740,771,'See Suspended Prone Feet Mount/Dismount. Keep shins close to horizontal and arms straight with shoulders positioned above hands. Dismount by removing straps while kneeling or after sitting on one side of hip before rotating body to seated position. This exercise can be performed on TRXⓇ style suspension trainer.'),(741,772,'If upper back does not come completely down at end of movement, abdominal muscles may only be isometrically involved in exercise. Pectineus, Adductor Longus, and Brevis do not assist in hip flexion since hips are already initially bent. See Spot Reduction Myth. Also see Dangerous Exercise Essay.'),(742,775,'None.'),(743,773,'See Suspended Supine Feet Mount/Dismount. Abdominals are exercised during spinal flexion , whereas, Erector Spinae is exercised during spinal extension. See Spot Reduction Myth and Lower Ab Myth. This exercise can be performed on TRXⓇ style suspension trainer.'),(744,774,'Keep knees straight throughout movement. Begin each repetition with upper back on floor to allow abdominal muscles to work dynamically. The Rectus Abdominis and Obliques dynamically contract only when actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only isometrically contract to stabilize pelvis and waist during hip flexion. See Spot Reduction Myth and Lower Ab Myth.'),(745,776,'See Suspended Prone Feet Mount/Dismount . Keep shins close to horizontal and arms straight with shoulders positioned above hands. Dismount by removing straps, while kneeling or after sitting on one side of hip before rotating body to seated position. This exercise can be performed on TRXⓇ style suspension trainer.'),(746,778,'Muscles are exercised isometrically. Exercise can also be performed with straight supporting arms in pushup stance. Also see Spot Reduction Myth.'),(747,779,'For beginners or those with less flexibility, position forearms on floor. Arms can also be positioned somewhat bent as an intermediate version of this stretch. Also known as Cobra pose in yoga.'),(748,780,'The lying (supine) stretch may be more appropriate for certain populations than other more advanced abdominal stretches .'),(749,781,'Pelvis may anteriorly rotate slightly.'),(750,782,'Exercise is typically performed isometrically but can also be performed dynamically. Exercise can be performed in most any posture, eg: seated, standing, etc.\n\n\nSee Spot Reduction Myth.'),(751,783,'See Spot Reduction Myth.'),(752,784,'Place feet wide for support, or if straddling bench, slightly squeeze legs on sides of bench to prevent shifting. Upper body stabilizing occurs primarily on far side through isometric shoulder abduction and isometric scapular upward rotation. Upper body stabilization also occurs somewhat on near side through shoulder protraction. See Spot Reduction Myth.'),(753,785,'Slightly squeeze legs on sides of bench to prevent shifting. Bench should be far enough away from cable pulley so cable is taut when stirrup is turned back toward cable pulley. See side view and Spot Reduction Myth.'),(754,787,'Note movement occurs in waist, not hips. See Spot Reduction Myth. Hyperextension of spine at top of motion is achieved by anterior rotation of pelvis with flexed hips. Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. If two soft stirrups are used instead of rope attachment, grasp stirrups at side of head.'),(755,788,'Keep stirrup attachment near side of shoulder with elbow down to side. See Spot Reduction Myth.'),(756,789,'To allow for full range of motion, grip height on strap should not allow weight to bottom out (weights touching stack) when shoulders are back. Padded hump should be adjusted to height of low back. See Spot Reduction Myth.'),(757,790,'Both arms should be kept straight and perpendicular to torso. Hips should also be kept nearly straight, only slightly bent. Also see other view.'),(758,791,'Both arms should be horizontal and straight. This movement arguably involves more hip internal rotation and transverse adduction than spinal rotation. Although it is considered oblique movement, remarkably little rotation actually occurs through spine, although rotators of spine act largely as stabilizers except at very beginning and end of motion where resistance from cable is minimal. A large part of rotational force actually occurs through rotation/transverse adduction of forward hip. Because rear leg is only supported by forefoot, hip of forward leg is utilized much greater than hip of rear leg since forward leg offers more secured base of support. Continued rotation would occur through spine except when cable makes contact with body precluding further movement and resistance would no longer be provided through cable since line of force is no longer perpendicular line of pull. Seated oblique exercises or those exercises where hips are stabilized allow for greater range of movement through spine. See Spot Reduction Myth.'),(759,792,'Both arms should be straight following diagonal path upward. Both arms should be horizontal and straight. This movement arguably involves more hip internal rotation and transverse adduction than spinal rotation. Although it is considered oblique movement, remarkably little rotation actually occurs through spine, although rotators of spine act largely as stabilizers except at very beginning and end of motion where resistance from cable is minimal. A large part of rotational force actually occurs through rotation/transverse adduction of forward hip. Because rear leg is only supported by forefoot, hip of forward leg is utilized much greater than hip of rear leg since forward leg offers more secured base of support. Continued rotation would occur through spine except cable when makes contact with body, precluding further movement and resistance would no longer be provided through cable since line of force is no longer perpendicular to line of pull. Seated oblique exercises or those exercises where hips are stabilized allow for greater range of movement through spine. See Spot Reduction Myth.'),(760,793,'Both arms should be straight following diagonal path downward. This movement arguably involves more hip internal rotation and transverse adduction than spinal rotation. Although it is considered oblique movement, remarkably little rotation actually occurs through spine, although rotators of spine act largely as stabilizers except at very beginning and end of motion where resistance from cable is minimal. A large part of rotational force actually occurs through rotation/transverse adduction of forward hip. Because rear leg is only supported by forefoot, hip of forward leg is utilized much greater than hip of rear leg since forward leg offers more secured base of support. Continued rotation would occur through spine except when cable would make contact with body precluding further movement and resistance would no longer be provided through cable since line of force is no longer perpendicular line of pull. Seated oblique exercises or those exercises where hips are stabilized allow for greater range of movement through spine. See Spot Reduction Myth.'),(761,794,'See Spot Reduction Myth.'),(762,795,'Both arms should be kept straight and perpendicular to torso. Hips should also be kept nearly straight, only slightly bent. See Spot Reduction Myth.'),(763,796,'Maintain shoulder fixed at approximately 90º so upper arm and upper back are perpendicular. See Spot Reduction Myth.'),(764,797,'Weight plates added to upper segment adds resistance, whereas, weight plates added to lower segment decreases resistance. Seat can also be oriented straight. See Spot Reduction Myth.'),(765,800,'See Spot Reduction Myth.'),(766,799,'See Spot Reduction Myth.'),(767,801,'Keep arm holding dumbbell approximately vertical (below shoulder) throughout movement. See Spot Reduction Myth and Arm Position During Waist Exercises.'),(768,802,'See Spot Reduction Myth.'),(769,803,'Greater surface area of torso resting padded lever supports significantly reduces involvement of upper body stablizing muscles as compared to Lever Seated Twist. See Spot Reduction Myth.'),(770,805,'See Spot Reduction Myth.'),(771,806,'If low back does flex near top of motion, abdominal muscles may only be isometrically involved in exercise. Pectineus, Adductor Longus, and Brevis do not assist in hip flexion since hips are already initially bent. See Leg Hip Raise with sled pad can also be positioned straight. See Spot Reduction Myth.'),(772,809,'Stand on platform if lever is too high to allow for full range of movement. See Spot Reduction Myth.'),(773,808,'Maintain shoulders fixed at approximately 90º so upper arm and upper back are perpendicular. Men should keep chest close to padded lever. Women may choose to position chest as close as possible without making contact with inside of padded bar. See Spot Reduction Myth.'),(774,810,'Maintain knee position throughout movement. For less resistance, do not use additional weight (See Bent-knee lying Twist without ball). See Spot Reduction Myth. Also see Lying Twist with exercise ball.'),(775,812,'See Spot Reduction Myth and Arm Position During Waist Exercises.'),(776,811,'Maintain knee position throughout movement. For less resistance, bend knees more and/or do not use additional weight. See Spot Reduction Myth. Also see Bent-knee Lying Twist.'),(777,813,'Both arms should be kept straight and perpendicular to torso. Hips should also be kept nearly straight, only slightly bent. See Spot Reduction Myth.'),(778,817,'Exercise can be performed without added weight until more resistance is needed. Movement can also be made easier by positioning hip low on ball. In contrast, exercise can be made more challenging by positioning hip higher on ball. In which case, feet may be placed against base of wall for stability. See alternative form. Also see Spot Reduction Myth and Arm Position During Waist Exercises.'),(779,828,'One of very few body weight exercises that directly exercises side deltoid in relatively full range of motion. In addition to lateral flexion of spine, lower hip abducts and upper hip adducts. See Spot Reduction Myth.'),(780,826,'Begin with very light weight and add additional weight gradually to allow lower back adequate adaptation. Throughout lift, keep weighted arm and knees straight. Do not pause or bounce at bottom of lift or jerk weight from floor. Lower back may bend slightly during full hip flexion or it can be kept straight. Do not lower weight beyond mild stretch throughout hamstrings and low back. Full rang\n\n\ne of motion will vary from person to person depending on flexibility. See Dangerous Exercise Essay and Kettlebell Straight-leg Deadlift.'),(781,827,'Maintain knee position throughout movement. See Spot Reduction Myth.'),(782,829,'Maintain knee position throughout movement. See Spot Reduction Myth.'),(783,830,'In addition to lateral flexion of spine, lower hip abducts and upper hip adducts. Exercise can also be performed isometrically, see Side Plank. Also see Spot Reduction Myth.'),(784,831,'In addition to lateral flexion of spine, lower hip abducts and upper hip adducts. Exercise can also be performed isometrically, see Bent Knee Side Plank. Gracilis of upper leg enters into active insufficiency with hip extended and knee flexed. Also see Spot Reduction Myth.'),(785,832,'See alternative form. Also see Spot Reduction Myth and Arm Position During Waist Exercises.'),(786,833,'See Spot Reduction Myth.'),(787,835,'If upper back does not come completely down at end of movement, abdominal muscles may only be isometrically involved in exercise. Pectineus, Adductor Longus, and Brevis do not assist in hip flexion since hips are already initially bent. See Spot Reduction Myth.'),(788,834,'Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. If no knee support is built in to incline board, ball can be placed under legs. Hip and knee flexors may be involved as stabilizers if incline is steep and no calf support is used. See Spot Reduction Myth.'),(789,836,'Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. If no knee support is built in to incline board, ball can be placed under legs. If upper back does not come completely down at end of movement, abdominal muscles may only be isometrically involved in exercise. Pectineus, Adductor Longus, and Brevis do not assist in hip flexion since hips are already initially bent. Knee flexors may be involved as stabilizers if incline is steep and no calf support is used. See Spot Reduction Myth.'),(790,837,'Feet can be held down by partner instead of foot bar. Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. If upper back does not come completely down at end of movement, abdominal muscles may only be isometrically involved in exercise. Pectineus, Adductor Longus, and Brevis do not assist in hip flexion since hips are already initially bent. See Spot Reduction Myth.'),(791,838,'If no knee support is built in to incline board, ball can be placed under legs. Hip and knee flexors may be involved as stabilizers if incline is steep and no calf support is used. See Spot Reduction Myth.'),(792,839,'Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. If no knee support is built in to incline board, ball can be placed under legs. If upper back does not come completely down at end of movement, abdominal muscles may only be isometrically involved in exercise. Pectineus, Adductor Longus, and Brevis do not assist in hip flexion since hips are already initially bent. Knee flexors may be involved as stabilizers if incline is steep and no calf support is used. See Spot Reduction Myth.'),(793,841,'Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. See Spot Reduction Myth.'),(794,840,'Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. Some individuals may experience low back discomfort if hips are not bent, so they must use smaller ball size or lower their hip position on ball. Also Spot Reduction Myth.'),(795,842,'Suspension handle(s) can also be gripped with both hands together with either one hand over other hand or with interlaced fingers. In addition to lateral flexion of spine, lower hip abducts and upper hip adducts. Also see Spot Reduction Myth. This exercise can be performed on TRXⓇ style suspension trainer or adjustable length gymnastics rings.'),(796,843,'Leg elevation keeps pelvis tilted back keeping low back on mat. Certain individuals may need to keep their neck in neutral position with space between their chin and sternum, particularly with their hands are behind their heads. See Spot Reduction Myth.'),(797,844,'In addition to lateral flexion of spine, lower hip abducts and upper hip adducts. This exercise can be performed on TRXⓇ style suspension trainer. More popular suspension trainers allow limited slippage, so loop around lower leg can be positioned below loop of upper leg once on side (as shown). Other models can be adjusted, so strap on lower leg is slightly longer than strap on upper leg. Also see Spot Reduction Myth.'),(798,845,'The exercise can also be mounted from top position in fully rotated position facing perpendicular to suspension straps while positioning feet parallel to straps. Exercise can also be executed by alternating sides, rotating from one side to the other. Dismounting can be achieved either at top of movement when body is fully rotated or hanging at bottom position by walking backward until body is upright. This exercise can be performed on TRXⓇ style suspension trainer or adjustable length gymnastics rings.'),(799,847,'See Suspended Prone Feet Mount/Dismount. Keep arms straight with shoulders positioned above hands. Dismount by removing straps while kneeling or after sitting on one side of hip, before rotating body to seated position. This exercise can be performed on TRXⓇ style suspension trainer.'),(800,846,'Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. Some individuals may experience low back discomfort if hips are not bent, so they must use smaller ball size or lower their hip position on ball. Also see Spot Reduction Myth and Arm Position During Waist Exercises.'),(801,848,'Leg elevation keeps pelvis tilted back keeping low back on mat. See Spot Reduction Myth.'),(802,849,'Maintain 90° flexion in hip with both shoulders flat on floor.'),(803,850,'Also see Pretzel Stretch for Hip Abductors for similar exercise which can be performed with this stretch.'),(804,851,'Allow foot of top leg to rest on foot of lower leg. Shoulders can turn away from direction of knees for greater stretch if needed.'),(805,852,'Keep both shoulders on floor or mat. Allow foot of top leg to rest on foot of lower leg. Arms can be extended to sides.'),(806,853,'Muscles are exercised isometrically. Movement can also be performed dynamically, moving hip up and down, see Side Bridge. Exercise can also be performed with straight supporting arm. Also see Spot Reduction Myth.'),(807,854,'Muscles are exercised isometrically. Movement can also be performed dynamically, moving hip up and down, see Bent Knee Side Bridge. Gracilis of upper leg is in active insufficiency with hip extended and knee flexed. Also see Spot Reduction Myth.'),(808,855,'Adjust lower leg brace so pressure is evenly distributed on thigh pad. Begin with body weight and add additional weight gradually to allow lower back adequate adaptation. Maintain barbell\'s position on back of shoulders when upper body is lowered. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch throughout hamstrings and low back. Full range of motion will vary from person to person. Although articulation of waist is emphasized, some hip extension may accommodate movement. Also see Barbell Hyper-extension and Barbell Back Raise.'),(809,856,'Target muscle is exercised \n\nisometrically\n\n. Begin with very light weight and add additional weight gradually to allow adequate adaptation. Throughout lift, keep back straight. Knees will have to bend more in those with less hamstring flexibility. Knees can be kept bent throughout movement. Also see straight leg Goodmorning, emphasizing Hamstrings.'),(810,857,'Target muscle is exercised isometrically. Throughout lift, keep hips low, shoulders high, arms and back straight. Knees should point same direction as feet throughout movement. Keep bar close to body to improve mechanical lev erage. Grip strength and strength endurance often limit ability to perform multiple reps at heavy resistances. Gym chalk, wrist straps, grip work, and mixed grip can be used to enhance grip. Mixed grip indicates one hand holding with overhand grip and other hand holding with underhand grip. Lever barbell jack can be used to lift barbell from floor for easier loading and unload of weight plates.'),(811,858,'Adjust lower leg brace so pressure is evenly distributed on thigh pad. Begin with body weight and add additional weight gradually to allow lower back adequate adaptation. Maintain barbell\'s position on back of shoulders when upper body is lowered. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch throughout hamstrings and low back. Full range of motion will vary from person to person. Also see Barbell Back Extension and Barbell Hip Extension.'),(812,860,'Position pad high enough to evenly distribute body weight on thigh but not so high that range of motion is limited; abdomen should not press on top side of pad when upper body is lowered. Begin with body weight and add additional weight gradually to allow lower back adequate adaptation. Maintain barbell\'s position on back of shoulders when upper body is lowered. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch throughout hamstrings and low back. Full range of motion will vary from person to person. Also see Barbell Back Extension and Barbell Hip Extension.'),(813,859,'Target muscle is exercised isometrically. Heavy barbell deadlifts significantly engages Latissmus Dorsi.'),(814,861,'Position pad high enough to evenly distribute body weight on thigh but not so high that range of motion is limited; abdomen should not press on top side of pad when upper body is lowered. Begin with body weight and add additional weight gradually to allow lower back adequate adaptation. Maintain barbell\'s position on back of shoulders when upper body is lowered. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch throughout hamstrings and low back. Full range of motion will vary from person to person. Although articulation of waist is emphasized, some hip extension may accommodate movement. Also see Barbell Hyperextension and Barbell Back Raise.'),(815,862,'Throughout lift, keep hips low, shoulders high, arms and back straight. Knees should point same direction as feet throughout movement. Keep bar close to body to improve mechanical leverage. Grip strength and strength endurance often limit ability to perform multiple reps at heavy resistances. Gym chalk, wrist straps, grip work, and mixed grip can be used to enhance grip. Mixed grip indicates one hand holding with overhand grip and other hand holding with underhand grip.'),(816,864,'Throughout lift, keep hips low, shoulders high, arms and back straight. Knees should point same direction as feet throughout movement. Keep bar close to body to improve mechanical leverage. Grip strength and strength endurance often limit ability to perform multiple reps at heavy resistances. Gym chalk, wrist straps, grip work, and mixed grip can be used to enhance grip. Mixed grip indicates one hand holding with overhand grip and other hand holding with underhand grip. Lever barbell jack can be used to lift barbell from floor for easier loading and unloading of weight plates.'),(817,863,'Use shoulder width grip since narrower than shoulder width grip will make it more difficult to lockout at top. Throughout lift, keep hips low, shoulders high, arms and back straight, and knees pointed out same direction as feet. Also, keep bar close to body to improve mechanical leverage. With wide stance, push feet out to sides and not down to prevent knees from buckling inward. Pushing knees out will allow hips to travel toward bar more quickly while improving leverage.'),(818,865,'Throughout lift, keep hips low, shoulders high, arms and back straight. Knees should point same direction as feet throughout movement. Keep bar close to body to improve mechanical leverage. Grip strength and strength endurance often limit ability to perform multiple reps at heavy resistances. Gym chalk, wrist straps, grip work, and mixed grip can be used to enhance grip. Mixed grip indicates one hand holding with overhand grip and other hand holding with underhand grip.'),(819,866,'Lower back may bend slightly during hip flexion phase. Erector Spinae is exercised isometrically if low back does articulate as with Straight Back Stiff Leg Deadlift (targeting Glutes). Begin with light weight and add additional weight gradually to allow adequate adaptation. Throughout lift, keep arms straight. Knee can be kept bent throughout movement. Do not stand behind pulleys. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch throughout hamstrings and back When finished with set, dismount by lowering weight with knees bent and low back straight. Full range of motion will vary from person to person. Those with less flexibility may have to bend knees more or they may not even need to stand on platform. See Dangerous Exercise Essay. Also see Straight Leg Deadlift.'),(820,867,'Lower back may bend slightly during full hip flexion. Erector Spinae is exercised isometrically if low back does articulate as with Straight Back Stiff Leg Deadlift (targeting Glutes). Begin with light weight and add additional weight gradually to allow adequate adaptation. Throughout lift keep arms straight. Knee can be kept bent throughout movement. Keep bar over top of feet, close to legs. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch throughout hamstrings. When finished with set, dismount by lowering weight with knees bent and low back straight. Full range of motion will vary from person to person. Those with less flexibility may have to bend knees more or they may not even need to stand on platform. See Dangerous Exercise Essay. Also see Straight Leg Deadlift.'),(821,868,'Target muscle is exercised isometrically\n\n\n. Throughout lift, keep hips low, shoulders high, arms and back straight.'),(822,869,'Lower back may bend slightly during full hip flexion. Erector Spinae is exercised isometrically\n\n\nif low back does articulate as with Straight Back Stiff Leg Deadlift (targeting Glutes). Begin with light weight and add additional weight gradually to allow adequate adaptation. Throughout lift, keep arms straight. Knee can be kept bent throughout movement. Keep bar over top of feet, close to legs. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch throughout hamstrings. When finished with set, dismount by lowering weight with knees bent and low back straight. Full range of motion will vary from person to person. Those with less flexibility may have to bend knees more or they may not even need to stand on platform. See Dangerous Exercise Essay. Also see Straight Leg Deadlift.'),(823,872,'Begin with very light weight and add additional weight gradually to allow lower back adequate adaptation. Throughout lift keep arms and knees straight. Keep dumbbells close to legs. Do not pause or bounce at bottom of lift. Lower back may bend slightly during full hip flexion phase. Do not lower weight beyond mild stretch throughout hamstrings and low back. Full range of motion will vary from person to person depending on flexibility. See Dangerous Exercise Essay.'),(824,870,'Begin with very light weight and add additional weight gradually to allow lower back adequate adaptation. Throughout lift keep arms and knees straight. Keep bar over top of feet, close to legs. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch throughout hamstrings and low back. Full range of motion will vary from person to person. Choose platform height that allows contact with floor w\n\n \nith slight stretch or set to height that allows bar to be lowered only millimeters from floor during warm up. This small reserve allows additional room to accommodate the hips loosen up and the grip to give slightly but not so much that would increase risk of descending too far down, beyond a slight stretch. Those with less flexibility may not even need to stand on platform. When finished with set, dismount by lowering weight with knees bent and low back straight. See Dangerous Exercise Essay. Also see Straight Back Straight Leg Deadlift.'),(825,871,'Not all trap bar designs may allow for this movement. A squared open-ended trap bar is used in this demonstration. Begin with very light weight and add additional weight gradually to allow lower back adequate adaptation. Throughout lift, keep arms and knees straight. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch throughout hamstrings and low back. When finished with set, dismount by lowering weight with knees bent and low back straight. Full range of motion will vary from person to person. Those with less flexibility may need lower platform or may not even need to stand on elevated surface. See Dangerous Exercise Essay. Also see Straight Back Straight Leg Deadlift.'),(826,874,'Begin with very light weight and add additional weight gradually to allow lower back adequate adaptation. Throughout lift, keep arms and knees straight. Do not stand behind pulleys. Do not pause or bounce at bottom of lift. Lower back may bend slightly during full hip flexion phase. Do not lower weight beyond mild stretch throughout hamstrings and low back. Full range of motion will vary from person to person depending on flexibility. See Dangerous Exercise Essay. Also see Straight Back Straight Leg Deadlift.'),(827,873,'Target muscle is exercised isometrically\n\n\n. Throughout lift, keep hips low, shoulders high, arms and back straight. Exercise can also be performed facing opposite direction toward fulcrum.'),(828,876,'Apparatus shown does not allow for full spinal flexion, only allowing for last half of spinal extension.'),(829,877,'To avoid hip movement, push hips back into seat by pushing feet into platform throughout exercise. Position foot platform, so small space remains between edge of seat and back of lower thigh. Use seat belt if it becomes difficult to stabilize hips. See Low Back Debate. Also see exercises on old Nautilus Machine and MedEx Low Back Machine.'),(830,878,'Lower back may bend slightly during hip flexion phase. Erector Spinae is exercised isometrically if low back does articulate as with Straight Back Stiff Leg Deadlift (targeting Glutes). Begin with light weight and add additional weight gradually to allow adequate adaptation. Throughout lift, keep arms straight. Knee can be kept bent throughout movement. Do not stand behind lever handles. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch throughout hamstrings and back When finished with set, dismount by lowering weight with knees bent and low back straight. Full range of motion will vary from person to person. Those with less flexibility may have to bend knees more or they may not even need to stand on platform. See Dangerous Exercise Essay.'),(831,879,'Begin with very light weight and add additional weight gradually to allow lower back adequate adaptation. Throughout lift, keep arms and knees straight. Do not stand behind pulleys. Do not pause or bounce at bottom of lift. Lower back may bend slightly during full hip flexion phase. Do not lower weight beyond mild stretch throughout hamstrings and low back. Full range of motion will vary from person to person depending on flexibility. See Dangerous Exercise Essay. Also see Straight Back Straight Leg Deadlift.'),(832,880,'Throughout lift, keep hips low, shoulders high, arms and back straight. Keep bar close to body to improve mechanical leverage. See Smith Deadlift under Gluteus Maximus. Also see Deadlift Analysis.'),(833,881,'Lower back may bend slightly during full hip flexion. Erector Spinae is exercised isometrically\n\n\nif low back does articulate as with Straight Back Stiff Leg Deadlift (targeting Glutes). Begin with light weight and add additional weight gradually to allow adequate adaptation. Throughout lift, keep arms straight. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch throughout hamstrings. Full range of motion will vary from person to person. Those with less flexibility may have to bend their knees more or they may not even need to stand on platform. Knee can be kept bent throughout movement. See Dangerous Exercise Essay. Also see Straight Leg Deadlift.'),(834,884,'Target muscle is exercised isometrically\n\n\n. Begin with light weight and add additional weight gradually to allow adequate adaptation. Throughout lift, keep back straight. Knees will have to bend more with those with less hamstring flexibility. Knees can be kept bent throughout movement. Also see straight leg Goodmorning emphasizing Hamstrings.'),(835,885,'Begin with very light weight and add additional weight gradually to allow lower back adequate adaptation. Throughout lift, keep arms and knees straight. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch throughout hamstrings and low back. Full range of motion will vary from person to person. Those with less flexibility may not even need to stand on platform. See Dangerous Exercise Essay. Also see Stiff Leg Deadlift.'),(836,886,'If weight is positioned behind head, neck extensors act as stabilizers:'),(837,888,'Adjust lower leg brace so pressure is evenly distributed on thigh pad. Begin with body weight and add additional weight gradually to allow lower back adequate adaptation. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch throughout hamstrings and low back. Full range of motion will vary from person to person. Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. See Arm Position During Waist Exercises. Although articulation of waist is emphasized, some hip extension may accommodate movement. If weight is positioned behind head, neck extensors act as stabilizers.'),(838,889,'If weight is positioned behind head, neck extensors act as stabilizers:'),(839,890,'Movement can be made easier by using no additional weight or by positioning hips low on ball. In contrast, exercise can be made more challenging by positioning ball lower toward hip. In which case, feet may be placed against base of wall for stability. See Arm Position During Waist Exercises. If weight is positioned behind head, neck extensors act as stabilizers.'),(840,891,'Position pad high enough to evenly distribute body weight on thigh but not so high that range of motion is limited; abdomen should not press on top side of pad when upper body is lowered. Begin with body weight and add additional weight gradually to allow lower back adequate adaptation. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch throughout hamstrings and low back. Full range of motion will vary from person to person. Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. See Arm Position During Waist Exercises. Although articulation of waist is emphasized, some hip extension may accommodate movement. If weight is positioned behind head, neck extensors act as stabilizers.'),(841,893,'If no wall is available, hips can be positioned lower on ball and toes can be positioned out wide on floor for balance.'),(842,892,'If no wall is available, hips can be positioned lower on ball and toes can be positioned out wide on floor for balance.'),(843,895,'If no wall is available, hips can be positioned lower on ball and toes can be positioned out wide on floor for balance.'),(844,896,'Lift leg and arm deliberately with no jerking. Also see Alternating Bird Dog.'),(845,897,'Lift legs and arms deliberately with no jerking. Also see Bird Dog.'),(846,898,'Platform should be high enough to allow hips to flex without buttocks contacting floor. Full range of motion will vary from person to person. Adductor Magnus may only assist at initial phase hip extension depending on degree of hip flexion at bottom of movement. Also see Hanging Hamstring Bridge for Hamstrings.'),(847,899,'Lift leg and arm deliberately with no jerking. Also see Bird Dog (on exercise ball).'),(848,900,'Adjust lower leg brace so pressure is evenly distributed on thigh pad. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch throughout hamstrings and low back. Full range of motion will vary from person to person.'),(849,901,'Lift leg and arm deliberately with no jerking. Also see Alternating Bird Dog (one exercise ball).'),(850,902,'Lift legs and upper body slowly with no jerking or fast movements. Also see Contralateral Superman.'),(851,903,'Lift legs and arms deliberately with no jerking. Also see bilateral movement: Superman.'),(852,904,'Adjust lower leg brace so pressure is evenly distributed on thigh pad. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch throughout hamstrings and low back. Full range of motion will vary from person to person. Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. If hands are positioned behind head, neck extensors act as stabilizers:'),(853,905,'Adjust lower leg brace so pressure is evenly distributed on thigh pad. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch throughout hamstrings and low back. Full range of motion will vary from person to person.'),(854,906,'Also see Cat Movement.'),(855,907,'Muscles are exercised isometrically.'),(856,908,'None'),(857,909,'Also see Cat Stretch.'),(858,910,'Upper back can also be lifted off of floor to stretch Splenius and cervical portion of Erector Spinae.'),(859,911,'Elbows can be lowered to floor.'),(860,912,'None'),(861,913,'An alternative mount involves stepping back with suspension handles in hands until arms are pulled forward about 45° (give or take) from resting position. At this point, recline body back, then fold at hips, allowing rear end to fall far back with arms and shoulders stretched forward. Dismounting can be achieved by walking backward until body is upright. This exercise can be performed on TRXⓇ style suspension trainer or adjustable length gymnastics rings.'),(862,915,'Muscles are exercised isometrically.'),(863,916,'None'),(864,917,'Keep knees pointed same direction as toes. The Soleus may be slightly stretched before leaning back.'),(865,918,'Avoid overstressing neck anteriorly.'),(866,919,'Begin with very light weight and add additional weight gradually to allow adequate adaptation. Throughout lift, keep back straight. Hamstrings will be emphasized if knees are straight.'),(867,926,'Throughout lift, keep arms and back straight. Do not lower weight beyond mild stretch throughout hamstrings. Full range of motion will vary from person to person. Those with less flexibility may need to bend knee of supporting leg more so barbell can contact floor. At top of movement, lifted foot can make contact with floor to maintain balance between repetitions.'),(868,929,'Throughout lift, keep arms and back straight. Do not lower weight beyond mild stretch throughout hamstrings. Full range of motion will vary from person to person. Stand on shallow platform if weight reaches floor before stretch. Those with less flexibility may have to bend knees more. Knees can be kept bent throughout movement. Also see Stiff Leg Deadlift and Romanian Deadlift.'),(869,930,'Use bench of lower height 16\" to 18\" (40 to 46 cm) allowing torso to be angled approximately 45º. Bench may need to be secured so it does not slide on floor.'),(870,931,'Keep torso upright during squat; flexible hip flexors are important. Forward knee should point same direction as foot throughout movement. Also known as Bulgarian Squat.'),(871,933,'Keep torso upright during lunge; flexible hip flexors are important. Forward knee should point same direction as foot throughout lunge. A long lunge emphasizes Gluteus Maximus; short lunge emphasizes Quadriceps.'),(872,932,'Keep torso upright during lunge; flexible hip flexors are important. Lead knee should point same direction as foot throughout lunge. A long lunge emphasizes Gluteus Maximus; short lunge emphasizes Quadriceps.'),(873,935,'Keep torso upright during lunge. Flexible hip adductors will allow fuller range of motion. Lead knee should point same direction as foot throughout lunge. A long lunge emphasizes Gluteus Maximus; short lunge emphasizes Quadriceps.'),(874,934,'Supporting knee should point same direction as foot throughout movement. Range of motion will be improved with greater leg strength and glute flexibility. Significant spinal flexion occurs at bottom of deep single leg squat to maintain center of gravity over foot. Erector Spinae becomes a stabilizer if spine is kept straight.'),(875,936,'Keep head facing forward, back straight and feet flat on floor; equal distribution of weight through forefoot and heel. Knees should point same direction as feet throughout movement. At bottom of squat, crease at hips must be lower than top of knee cap. Also see:'),(876,937,'Keep torso upright during lunge; flexible hip flexors are important. Lead knee should point same direction as foot throughout lunge. A long lunge emphasizes Gluteus Maximus; short lunge emphasizes Quadriceps. Tibialis Anterior is exercised eccentrically during landing on heel.'),(877,938,'Knees should point same direction as feet throughout movement. Heel of rear foot can be kept elevated off floor throughout movement. Keep torso upright during squat; flexible hip flexors are important. With feet further apart: Gluteus Maximus is emphasized, Quadriceps are less emphasized.'),(878,939,'Keep head facing forward, back straight and feet flat on floor; equal distribution of weight through forefoot and heel. Knees should point same direction as feet throughout movement. Exercise can also be performed holding onto supports or with long handled safety bar. Also see Squat Analysis.'),(879,940,'Keep head facing forward, back straight and feet flat on floor; equal distribution of weight through forefoot and heel. Knees should point same direction as feet throughout movement. Hip and ankle flexibility is important for both execution and safety in this movement. See Full Squat Flexibility. Certain knee and low back problems may be aggravated by this exercise. See Full Squat Analysis and Deep Squat Test. See spotting technique and spotting assistance.'),(880,941,'Keep head facing forward, back straight and feet flat on floor; equal distribution of weight through forefoot and heel. Knees should point same direction as feet throughout movement. Exercise can also be performed holding onto supports or with safety bar without bar handles. Also see Squat Analysis.'),(881,942,'Throughout lift, keep hips low, shoulders high, arms and back straight. Knees should point same direction as feet throughout movement. See flawed demonstration showing depth of hack squat that is NOT sufficient and knees are NOT pointed same angle as feet. Individuals with short arm to torso ratio or protracted shoulder posture, may find this exercise very difficult to perform. See Squat Analysis.'),(882,943,'Try to keep knees from traveling forward while reaching rear end back onto squat box. Ideally, knees could be behind ankles. In this position, greater stretch reflex can be created through hips (via hamstrings) once torso rocks forward just before squat. However, other hip extensors can engage in stretch-shortening cycle (although to lesser extend in this position) in lieu of hamstrings\' optimized involvement.'),(883,944,'Turning knuckles up places bar more on Brachioradialis rather than more sensitive crook of elbow. Keep head facing forward, back straight and feet flat on floor; equal distribution of weight through forefoot and heel. Knees should point same direction as feet throughout movement. Also see rear side view.'),(884,945,'Keep head facing forward, back straight and feet flat on floor; equal distribution of weight through forefoot and heel. Knees should point same direction as feet throughout movement. If handles are not available, horizontal bars on rack can be used for assistance if needed. Exercise can also be performed without holding onto supports. Also see Squat Analysis.'),(885,946,'An inverted squared open-ended trap bar is used in this demonstration. Keep head facing forward, back straight and feet flat on floor; equal distribution of weight through forefoot and heel. Knees should point same direction as feet throughout movement. See Squat Analysis. Also see Trap Bar Deadlift.'),(886,947,'Chains provide increasing resistance as barbell moves away from floor. Keep head facing forward, back straight and feet flat on floor; equal distribution of weight through forefoot and heel. Knees should point same direction as feet throughout movement. See spotting technique and spotting assistance. See Squat for targeting Quadriceps and Squat Analysis. Also see Squat Strength Standards.'),(887,948,'Keep head facing forward, back straight and feet flat on floor; equal distribution of weight through forefoot and heel. Knees should point same direction as feet throughout movement. See Squat Analysis. Also see weightlifting style Front Squat.'),(888,949,'Keep torso upright during exercise. Stepping knee should point same direction as foot. A modest degree of knee rotation occurs during this movement. See Controversial Exercises and Rotary Force in Squat Analysis.'),(889,950,'Keep torso upright during lunge; flexible hip flexors are important. Forward knee should point same direction as foot throughout movement. A long lunge emphasizes Gluteus Maximus; short lunge emphasizes Quadriceps. See Cable Rear Step-down Lunge for similar exercise.'),(890,952,'Keep torso upright during exercise. Forward knee should point same direction as foot throughout movement. Stepping distance from bench emphasizes Gluteus Maximus; stepping close to bench emphasizes Quadriceps.'),(891,954,'Not all trap bar designs may allow for this movement. A squared open-ended trap bar is used in this demonstration. Throughout lift, keep arms and back straight. Do not lower weight beyond mild stretch throughout hamstrings. Full range of motion will vary from person to person. Those with less flexibility may have to bend knees more. Knees can be kept bent throughout movement.'),(892,956,'Knees should point same direction as feet throughout movement. Heel of rear foot can be kept elevated off floor throughout movement as shown. Keep torso upright during squat; flexible hip flexors are important. With feet further apart: Gluteus Maximus is emphasized, Quadriceps are less emphasized. Also know as Cable Lunge.'),(893,957,'Keep torso upright during lunge; flexible hip flexors are important. Forward knee should point same direction as foot throughout lunge. A long lunge emphasizes Gluteus Maximus; short lunge emphasizes Quadriceps.'),(894,955,'Keep torso upright during squat; flexible hip flexors are important. Forward knee should point same direction as foot throughout movement. May also be referred to as Cable One Arm Bulgarian Squat.'),(895,958,'Keep torso upright during squat; flexible hip flexors are important. Forward knee should point same direction as foot throughout movement. May also be referred to as Cable Bulgarian Squat.'),(896,959,'Position height of cable bar so moving weight plates make contact with unused weight stack at bottom of squat when hips are slightly lower or same height as knees. Keep head facing forward, back straight and feet flat on floor; equal distribution of weight through forefoot and heel. Knees should point same direction as feet throughout movement. See Squat Analysis. Also see Cable Squat.'),(897,960,'Knees should point same direction as feet throughout movement. Heel of rear foot can be kept elevated off floor throughout movement as shown. Keep torso upright during squat; flexible hip flexors are important. With feet further apart: Gluteus Maximus is emphasized, Quadriceps are less emphasized. Also known as One Arm Split Squat.'),(898,961,'Also see Cable Bent-over Hip Extension for more bent over posture.'),(899,962,'Keep head facing forward, back straight, chest high, arms straight to sides, and feet flat on platform; equal distribution of weight through forefoot and heel. Knees should point same direction as feet throughout movement. See Squat Analysis.'),(900,963,'Knees should point same direction as feet throughout movement. Heel of rear foot can be kept elevated off floor throughout movement as shown. Keep torso upright during squat; flexible hip flexors are important. With feet further apart: Gluteus Maximus is emphasized, Quadriceps are less emphasized. Also known as Cable Lunge.'),(901,965,'Keep head facing forward, back straight, chest high, and feet flat on surface; equal distribution of weight through forefoot and heel. Knees should point same direction as feet throughout movement. When finished, squat or sit and place pin into lightest weight setting. Step off of platform and unclip cable from belt. Also known as Pole Squat. Instead of holding onto pole for balance (as shown), arms can be extended forward without contact with pole. See Squat Analysis. Also see similar exercise: Weighted Belt Squat.'),(902,966,'Also see Cable Standing Hip Extension for more upright posture.'),(903,967,'Do not stand behind pulleys. Throughout lift, keep arms and back straight. Do not lower weight beyond mild stretch throughout hamstrings. When finished with set, dismount by lowering weight with knees bent and low back straight. Full range of motion will vary from person to person. Those with less flexibility may have to bend knees more. Knees can be kept bent throughout movement. Also see Stiff Leg Deadlift .'),(904,968,'Keep torso upright during exercise. Forward knee should point same direction as foot throughout movement. Stepping distance from bench emphasizes Gluteus Maximus; stepping close to bench emphasizes Quadriceps.'),(905,969,'Keep head facing forward, back straight and feet flat on floor; equal distribution of weight through forefoot and heel. Knees should point same direction as feet throughout movement. See Squat Analysis.'),(906,970,'Throughout lift, keep arms and back straight. Do not lower weight beyond mild stretch throughout hamstrings. Full range of motion will vary from person to person. Those with less flexibility may need to bend knee of supporting leg more so dumbells can come closer to floor. At top of movement, lifted foot can make contact with floor to maintain balance between repetitions.'),(907,971,'Keep torso upright during squat; flexible hip flexors are important. Forward knee should point same direction as foot throughout movement. May also be referred to as Dumbbell Bulgarian Squat.'),(908,972,'Keep torso upright during lunge; flexible hip flexors are important. Forward knee should point same direction as foot throughout lunge. A long lunge emphasizes Gluteus Maximus; short lunge emphasizes Quadriceps.'),(909,975,'Knees should point same direction as feet throughout movement. Heel of rear foot can be kept elevated off floor throughout movement as shown. Keep torso upright during squat; flexible hip flexors are important. With feet further apart: Gluteus Maximus is emphasized, Quadriceps are less emphasized.'),(910,974,'Keep torso upright during lunge. Flexible hip adductors will allow fuller range of motion. Lead knee should point same direction as foot throughout lunge. A long lunge emphasizes Gluteus Maximus; short lunge emphasizes Quadriceps. Dumbbells may be positioned - one to front and other to back.'),(911,973,'Keep torso upright during lunge; flexible hip flexors are important. Lead knee should point same direction as foot throughout lunge. A long lunge emphasizes Gluteus Maximus; short lunge emphasizes Quadriceps.'),(912,976,'Keep head facing forward, back straight, chest high, and feet flat on floor; equal distribution of weight through forefoot and heel. Knees should point same direction as feet throughout movement. See Squat Analysis. Also see Kettlebell Front Squat.'),(913,977,'Keep torso upright during lunge; flexible hip flexors are important. Lead knee should point same direction as foot throughout lunge. A long lunge emphasizes Gluteus Maximus; short lunge emphasizes Quadriceps. Tibilalis Anterior is exercised eccentrically during landing on heel.'),(914,978,'Supporting knee should point same direction as foot throughout movement. Range of motion will be improved with greater leg strength and glute flexibility. Significant spinal flexion occurs at bottom of deep single leg squat to maintain center of gravity over foot. Erector Spinae becomes a stabilizer if spine is kept straight.'),(915,979,'None'),(916,981,'Keep torso upright during exercise. Stepping knee should point same direction as foot. A modest degree of knee rotation occurs during this movement. See Controversial Exercises and Rotary Force in Squat Analysis.'),(917,982,'Keep torso upright during exercise. Knee of exercised leg should point same direction as foot. Exercise can also be performed by placing traveling foot onto and off of bench next to foot of exercised leg. See alternative form.'),(918,985,'When finished, engage dock lever, and lower seat to starting position. If insufficient hip flexibility forces pelvis to pull away from back pad at lower portions of movement, only lower sled just short of spinal articulation. Keep knees pointed same directions as feet. Do not allow heels to raise off of platform, pushing with both heel and forefoot. Placing feet slightly high on platform emphasize Gluteus Maximus. Placing feet slightly lower on platform emphasize Quadriceps. Also see Sled Hack Press.'),(919,984,'Keep torso upright during exercise. Forward knee should point same direction as foot throughout movement. Stepping distance from bench emphasizes Gluteus Maximus; stepping close to bench emphasizes Quadriceps.'),(920,986,'Adjust safety brace and back support to accommodate near full range of motion without forcing hips to bend at waist. Keep knees pointed same directions as feet. Do not allow heels to raise off of platform, pushing with both heel and forefoot. Knees should point same direction as feet throughout movement. Placing feet slightly high on platform emphasize Gluteus Maximus. Placing feet slightly lower on platform emphasize Quadriceps. Also see Locking Out Knees on Leg Press.'),(921,987,'Do not stand behind handles. Throughout lift, keep arms and back straight. Do not lower weight beyond mild stretch throughout hamstrings. When finished with set, dismount by lowering weight with knees bent and low back straight. Full range of motion will vary from person to person. Those with less flexibility may have to bend knees more. Knees can be kept bent throughout movement.'),(922,988,'Lower platform enough to achieve full range of motion without forcing pelvis to bend at waist. On exercised leg, keep pointed same direction as foot . Also, do not allow heel to raise off of platform, pushing with both heel and forefoot. For alternative view, see Lever Single Leg 45° Leg Press performed with opposite leg.'),(923,989,'Adjust machine to accommodate near full range of motion without forcing pelvis to bend at waist. Keep knee pointed same direction as foot. Do not allow heel to raise off of platform, pushing with both heel and forefoot. Unique apparatus is designed and built by Tracey Cheuvront.'),(924,990,'Adjust shoulder pads to allow full range of motion without forcing hips to rise at waist. Keep knees pointed same directions as feet. Push with both heel and forefoot and do not allow heels to raise off of platform. Placing feet slightly high on platform emphasize Gluteus Maximus. Placing feet slightly lower on platform emphasize Quadriceps.'),(925,991,'Adjust seat and back support to accommodate near full range of motion without forcing hips to bend at waist. Keep knees pointed same directions as feet. Do not allow heels to raise off of platform, pushing with both heel and forefoot. This exercise may be performed by alternating (as described), simultaneous, or in simultaneous-alternating fashion.'),(926,993,'Adjust seat and back support to accommodate near full range of motion without forcing hips to bend at waist. Keep knees pointed same directions as feet. Do not allow heels to raise off of platform, pushing with both heel and forefoot. Placing feet slightly high on platform emphasize Gluteus Maximus. Placing feet slightly lower on platform emphasize Quadriceps.'),(927,992,'Adjust back support back to accommodate near full range of motion without forcing pelvis to bend at waist. Keep knee pointed same direction as foot. Push with both heel and forefoot and do not allow heel to raise off of platform.'),(928,995,'Adjust yoke position to accommodate near full range of motion without forcing hips to bend at waist. Also see Lever Sprint Machine.'),(929,996,'Adjust machine to accommodate near full range of motion without forcing hips to rise at waist. Keep knees pointed same directions as feet. Do not allow heels to raise off of platform, pushing with both heel and forefoot. Placing feet slightly high on platform emphasize Gluteus Maximus. Placing feet slightly lower on platform emphasize Quadriceps. Unique apparatus is designed and built by Tracey Cheuvront.'),(930,994,'Also see Lever Lying Hip Extension on selectorized machine.'),(931,997,'Keep torso upright during lunge; flexible hip flexors are important. Forward knee should point same direction as foot throughout lunge. A long lunge with feet slightly forward emphasizes Gluteus Maximus; short lunge with feet under the bar emphasizes Quadriceps.'),(932,998,'Keep torso upright during lunge; flexible hip flexors are important. Forward knee should point same direction as foot throughout lunge. A long lunge emphasizes Gluteus Maximus; short lunge emphasizes Quadriceps. Also see Lever Rear Lunge on apparatus without platform.'),(933,999,'Keep torso upright during squat; flexible hip flexors are important. Forward knee should point same direction as foot throughout movement. Keep foot flat on floor. Position foot slightly forward to distribute force on hip extensors. May also be referred to as Lever Bulgarian Squat.'),(934,1000,'Keep torso upright during movement; flexible hip flexors are important. Knees should point same direction as feet throughout movement. A forward foot further forward will emphasizes Gluteus Maximus; forward foot more closer under bar will emphasizes Quadriceps.'),(935,1001,'Keep torso upright during squat; flexible hip flexors are important. Knees should point same direction as feet throughout movement. Keep foot flat on floor. Position foot slightly forward to distribute force on hip extensors. Also known as Lever Lunge.'),(936,1002,'Keep torso upright during squat; flexible hip flexors are important. Forward knee should point same direction as foot throughout movement. Keep foot flat on floor. Position foot slightly forward to distribute force on hip extensors. May also be referred to as Lever Barbell Bulgarian Squat.'),(937,1005,'Range of motion will be improved with greater leg strength and glute flexibility. Base knee should point same direction as foot throughout movement.'),(938,1003,'Taller individuals may be able to place both legs into strap and position torso on bench without using steps. Some individuals may be able to articulate both through the hips and through the lower back (i.e. lumbar spine), in which case, Erector Spinae also becomes synergist. Movement can be performed without resistance. Lever Reverse Hyper-extension was invented by Louie Simmons of Westside Barbell.'),(939,1004,'If available, re-engage support lever in extended position before dismounting. Keep head facing forward, back straight and feet flat on floor; equal distribution of weight through forefoot and heel. Knees should point same direction as feet throughout movement. See Squat Analysis.  Also see exercise performed on classic Lever Squat machine.'),(940,1007,'Keep torso upright during movement; flexible hip flexors are important. Knees should point same direction as feet throughout movement. Keep forward foot flat on stationary platform.'),(941,1008,'Keep head facing forward, back straight and feet flat on floor; equal distribution of weight through forefoot and heel. Knees should point same direction as feet throughout movement. See Squat Analysis.'),(942,1009,'Despite apparatus\' similarity to rear kick exercise, it is actually hip extension exercise due to the isolated hip movement which is apparent with lack of knee articulation.'),(943,1010,'If insufficient hip flexibility forces pelvis to pull away from back pad at lower portions of movement, only lower sled just short of spinal articulation. Keep knees pointed same directions as feet. Do not allow heels to raise off of platform. Push with both heel and forefoot. If available, re-engage dock lever in extended position before dismounting. Placing feet slightly high on platform emphasize Gluteus Maximus. Placing feet slightly lower on platform emphasize Quadriceps. Also see similar exercise Lever V-Squat.'),(944,1011,'Exercise can be performed alternating between sides.'),(945,1012,'If available, re-engage support lever in extended position before dismounting. Keep head facing forward, back straight and feet flat on floor; equal distribution of weight through forefoot and heel. Knees should point same direction as feet throughout movement. See Squat Analysis.'),(946,1014,'None'),(947,1013,'If available, re-engage support lever in extended position before dismounting. Model shown uses foot pedal near base of platform to reengage support lever. Keep head facing forward, back straight and feet flat on platform; equal distribution of weight through forefoot and heel. Knees should point same direction as feet throughout movement. See Squat Analysis.'),(948,1015,'Also Lever Lying Hip Extension on plate loaded machine and Lever Alternating Lying Hip Extension on another selectorized machine.'),(949,1016,'Hamstring remains in active insufficiency through movement since knee is significantly flexed and hip does not flex beyond 90 degrees. Also see Lever Lying Hip Extension on plate loaded machine.'),(950,1017,'If available, re-engage support lever in extended position before dismounting. If insufficient hip flexibility forces pelvis to pull away from back pad at lower portions of movement, only lower sled just short of spinal articulation. Keep knees pointed same directions as feet. Do not allow heels to raise off of platform. Push with both heel and forefoot. Also see selectorized machine. Placing feet slightly forward on platform emphasize Gluteus Maximus. Placing feet slightly back on platform emphasize Quadriceps.'),(951,1018,'Exercise can be performed with one leg, then other leg. See Lever Kneeling Hip Extension (roller pad).'),(952,1019,'Shorter individuals should stand on higher platform and may be bent over more.'),(953,1020,'None'),(954,1021,'Adjust back support back to accommodate near full range of motion without forcing pelvis to bend at waist. Keep knee pointed same direction as foot. Do not allow heel to raise off of platform, pushing with both heel and forefoot.'),(955,1022,'Adjust seat and back support to accommodate near full range of motion without forcing hips to bend at waist. Keep knees pointed same directions as feet. Do not allow heels to raise off of platform, pushing with both heel and forefoot. Placing feet slightly high on platform emphasize Gluteus Maximus. Placing feet slightly lower on platform emphasize Quadriceps.'),(956,1024,'With greater resistances, more effort is required to pull on handle bars to keep body from rising upward.'),(957,1027,'Squeeze hand lever at bottom of movement to disengage weight stack. Keep hand lever squeezed until sled is raised and legs are straight. If insufficient hip flexibility forces pelvis to pull away from back pad at lower portions of movement, only lower sled just short of spinal articulation. Keep knees pointed same directions as feet. Do not allow heels to raise off of platform, pushing with both heel and forefoot. Placing feet slightly forward on platform emphasize Gluteus Maximus. Placing feet slightly back on platform emphasize Quadriceps.'),(958,1025,'None'),(959,1023,'Lever height should be adjusted to accommodate full range, allowing hips to descend same height or slightly lower than knees. Keep head facing forward, back straight and feet flat on floor; equal distribution of weight through forefoot and heel. Knees should point same direction as feet throughout movement. See Squat Analysis.'),(960,1026,'Adjust bench to accommodate near full range of motion without forcing hips to bend at waist. Keep knees pointed same directions as feet. Do not allow heels to raise off of platform, pushing with both heel and forefoot. This exercise may be performed by alternating (as described), simultaneous, or in simultaneous-alternating fashion.'),(961,1028,'Squeeze hand lever at bottom of movement to disengage weight stack. Keep hand lever squeezed until sled is raised and leg is straight. If insufficient hip flexibility forces pelvis to pull away from back pad at lower portions of movement, only lower sled just short of spinal articulation. Keep knee pointed same directions as foot. Do not allow heel to raise off of platform, pushing with both heel and forefoot. Placing feet slightly forward on platform emphasize Gluteus Maximus. Placing feet slightly back on platform emphasize Quadriceps. See manufacturer\'s suggested foot placement for Lever Split V-Squat.'),(962,1029,'Adjust safety brace and back support to accommodate near full range of motion without forcing pelvis to bend at waist. Keep knee pointed same direction as foot. Do not allow heel to raise off of platform, pushing with both heel and forefoot.'),(963,1030,'Squeeze hand lever at bottom of movement to disengage weight stack. Keep hand lever squeezed until sled is raised and legs are straight. Keep knees pointed same directions as feet. Do not allow\n\nforward\n\nheel to raise off of platform, pushing with both heel and forefoot.'),(964,1031,'Adjust safety brace and back support to accommodate near full range of motion without forcing hips to bend at waist. A wide stance may allow for deeper range of motion as shown. Keep knees pointed same directions as feet. Do not allow heels to raise off of platform, pushing with both heel and forefoot. Placing feet slightly high on platform emphasize Gluteus Maximus. Placing feet slightly lower on platform emphasize Quadriceps. See exercise performed on Bilateral Leg Press. Also see Locking Out Knees on Leg Press.'),(965,1032,'When finished, keep both feet forward and descend lever downward. Squeeze hand lever at bottom of movement to disengage weight stack. Keep hand lever squeezed until sled is raised and legs are straight. Keep knees pointed same directions as feet. Push with both heel and forefoot. Do not allow forward heel to raise off of platform.'),(966,1033,'Adjust safety brace and back support to accommodate near full range of motion without forcing hips to bend at waist. Wide stance may allow for deeper range of motion. Keep knees pointed same directions as feet. Do not allow heels to raise off of platform, pushing with both heel and forefoot. Placing feet slightly high on platform emphasize Gluteus Maximus. Placing feet slightly lower on platform emphasize Quadriceps. See exercise performed Bilaterally.'),(967,1035,'If available, re-engage support lever in extended position before dismounting. Allow for full range of motion without forcing hips to rise at waist. Keep knees pointed same directions as feet. Do not allow heels to raise off of platform, pushing with both heel and forefoot. Placing feet slightly high on platform emphasize Gluteus Maximus. Placing feet slightly lower on platform emphasize Quadriceps.'),(968,1036,'If available, re-engage support lever in extended position before dismounting. Allow for full range of motion without forcing hips to rise at waist. Keep knee pointed same directions as foot. Do not allow heel to raise off of platform, pushing with both heel and forefoot. Placing foot slightly high on platform emphasizes Gluteus Maximus. Placing foot slightly lower on platform emphasizes Quadriceps.'),(969,1034,'If available, re-engage support lever in extended position before dismounting. If insufficient hip flexibility forces pelvis to pull away from back pad at lower portions of movement, only lower sled just short of spinal articulation. Keep knees pointed same directions as feet. Do not allow heels to raise off of platform, pushing with both heel and forefoot. Placing feet slightly high on platform emphasize Gluteus Maximus. Placing feet slightly lower on platform emphasize Quadriceps.'),(970,1038,'Allow for full range of motion without forcing hips to bend\nat waist. Keep knee pointed same directions as foot. Do not allow\nheel to raise off of platform, pushing with both heel and forefoot.\nPlacing foot slightly high on platform emphasizes Gluteus Maximus.\nPlacing foot slightly lower on platform emphasizes Quadriceps.'),(971,1037,'Adjust machine to accommodate near full range of motion without forcing hips to rise at waist. Keep knees pointed same directions as feet. Do not allow heels to raise off of platform, pushing with both heel and forefoot.'),(972,1039,'None'),(973,1040,'Adjust seat and back support to accommodate near full range of motion without forcing hips to bend at waist. Keep knees pointed same directions as feet. Do not allow heels to raise off of platform, pushing with both heel and forefoot. Placing feet slightly high on platform emphasize Gluteus Maximus. Placing feet slightly lower on platform emphasize Quadriceps.'),(974,1041,'Flexible hip flexion is required for fuller range of motion through knee. Lower weight just short of hips, leaving back support. Keep knees pointed same directions as feet. Do not allow heels to raise off of platform, pushing with both heel and forefoot, or center of feet if platform is shorter than length of feet.'),(975,1042,'Re-engage support lever in extended position before dismounting. Flexible hip flexion is required for fuller range of motion through knee. Lower weight just short of hips, leaving back support. Keep knees pointed same directions as feet. Do not allow heel to raise off of platform, pushing with both heel and forefoot, or center of foot if platform is shorter than length of feet.'),(976,1043,'If available, re-engage dock lever(s) in extended position before dismounting. Adjust machine to accommodate near full range of motion without forcing pelvis to rise at waist. Keep knee pointed same direction as feet. Do not allow heel to raise off of platform, pushing with both heel and forefoot.'),(977,1045,'If available, re-engage dock lever(s) in extended position before dismounting. Keep torso upright during lunge; flexible hip flexors are important. Forward knee should point same direction as foot throughout lunge. A long lunge with feet slightly forward emphasizes Gluteus Maximus; short lunge with feet under the bar emphasizes Quadriceps.'),(978,1046,'On apparatuses with hand or lever lock, return sled to very bottom, disengage weight, return sled to mid-upper position, and re-engage weight before stepping out. Some Sled Squat apparatuses have back pads like the one shown, whereas, Sled Squat apparatuses have no back pad requiring additional recruitment of stabilizer muscles. Keep head facing forward, back straight and feet flat on floor; equal distribution of weight through forefoot and heel. Knees should point same direction as feet throughout movement.'),(979,1044,'If available, re-engage support lever in extended position before dismounting. If insufficient hip flexibility forces pelvis to pull away from back pad at lower portions of movement, only lower sled just short of spinal articulation. Keep knees pointed same directions as feet. Do not allow heels to raise off of platform, pushing with both heel and forefoot. Placing feet slightly high on platform emphasize Gluteus Maximus. Placing feet slightly lower on platform emphasize Quadriceps.'),(980,1048,'None'),(981,1050,'Keep torso upright during squat; flexible hip flexors are important. Forward knee should point same direction as foot throughout movement. Keep foot flat on floor. Position foot slightly forward to distribute force on hip extensors. May also be referred to as Smith Bulgarian Squat.'),(982,1051,'Throughout lift, keep arms and back straight. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch. Full range of motion will vary from person to person depending on flexibility. Stand on elevated platform if smith machine does not allow full range of motion. Those with less flexibility may have to bend their knees more. Knees can be kept bent throughout movement. Also see Stiff Leg Deadlift.'),(983,1053,'Keep torso upright during movement; flexible hip flexors are important. Knees should point same direction as feet throughout movement. A forward foot further forward will emphasize Gluteus Maximus; forward foot more closer under bar will emphasize Quadriceps.'),(984,1055,'Keep torso upright during lunge; flexible hip flexors are important. Forward knee should point same direction as foot throughout lunge. A long lunge with feet slightly forward emphasizes Gluteus Maximus; short lunge with feet under the bar emphasizes Quadriceps.'),(985,1054,'Keep head facing forward, back straight and foot flat on floor; equal distribution of weight through forefoot and heel. Forward knee should point same direction as foot throughout movement.'),(986,1056,'Throughout lift, keep hips low, shoulders high, arms and back straight. Knees should point same direction as feet throughout movement. See Smith Squat Analysis.'),(987,1057,'Keep head facing forward, back straight and feet flat on floor; equal distribution of weight through forefoot and heel. Knees should point same direction as feet throughout movement. See Smith Squat Analysis.'),(988,1058,'Keep head facing forward, back straight and feet flat on floor; equal distribution of weight through forefeet and heel. Knees should point same direction as feet throughout movement. Also see bodybuilding-style Smith Squat and Smith Squat Analysis.'),(989,1059,'Keep head facing forward, back straight, chest high, and feet flat on floor; equal distribution of weight through forefoot and heel. Knees should point same direction as feet throughout movement. See Squat Analysis. Also see Kettlebell Goblet Squat.'),(990,1060,'Supporting knee should point same direction as foot throughout movement. Range of motion will be improved with greater leg strength and glute flexibility. Significant spinal flexion occurs at bottom of deep single leg squat to maintain center of gravity over foot. Erector Spinae becomes a stabilizer if spine is kept straight.'),(991,1061,'Keep head facing forward, back straight, chest high, and feet flat on surface; equal distribution of weight through forefoot and heel. Knees should point same direction as feet throughout movement. See Squat Analysis. Also see similar exercise Cable Belt Squat.'),(992,1063,'Keep head facing forward, back straight and feet flat on floor; equal distribution of weight through forefoot and heel. Knees should point same direction as feet throughout movement. See Smith Squat Analysis.'),(993,1062,'Exercise can be performed without added weight. Some individuals may be able to articulate both through the hips and through the lower back (i.e. lumbar spine), in which case, Erector Spinae also becomes synergist.'),(994,1064,'Also see Reverse Hyper-extension performed with exercise ball on bench.'),(995,1065,'Keep torso upright during lunge; flexible hip flexors are important. Lead knee should point same direction as foot throughout lunge. A long lunge emphasizes Gluteus Maximus; short lunge emphasizes Quadriceps.'),(996,1066,'Hamstring remains in active insufficiency throughout movement since knee is significantly flexed and hip does not flex beyond 90 degrees. Adductor Magnus does not assist since hip extension does not occur in fully flexed position.'),(997,1067,'Allow torso to angle forward more than shown, particularly as greater depth is achieved with lower bench or box. Range of motion will be improved with greater leg strength. Supporting knee should point same direction as foot throughout movement.'),(998,1068,'Supporting knee should point same direction as foot throughout movement. Range of motion will be improved with greater leg strength and glute flexibility. Spine can be kept straighter than standard full range single leg squat. Also known as Reclining Pistol Squats.'),(999,1069,'Since knee is initially bent significantly, hamstrings are not significantly involved. Also see Reverse Hyper-extension performed with exercise ball on bench.'),(1000,1071,'Supporting knee should point same direction as foot throughout movement. Range of motion will be improved with greater leg strength and glute flexibility. Also known as Pistol Squat.'),(1001,1070,'Supporting knee should point same direction as foot throughout movement. Range of motion will be improved with greater leg strength and glute flexibility. Quadriceps on raised leg becomes and Synergist if self assistance is provided at bottom of movement.'),(1002,1072,'Throughout lift, keep arms and back straight. Do not lower weight beyond mild stretch throughout hamstrings. Full range of motion will vary from person to person. Those with less flexibility may need to bend knee of supporting leg more so hands can come closer to floor. At top of movement, lifted foot can make contact with floor to maintain balance between repetitions.'),(1003,1073,'Knees should point same direction as feet throughout movement. Heel of rear foot can be kept elevated off floor throughout movement as shown. Keep torso upright during squat; flexible hip flexors are important. With feet further apart: Gluteus Maximus is emphasized, Quadriceps are less emphasized.'),(1004,1074,'Keep torso upright during squat; flexible hip flexors are important. Forward knee should point same direction as foot throughout movement. May also be referred to as Bodyweight Bulgarian Squat.'),(1005,1075,'Keep head facing forward, back straight, chest high, and feet flat on surface; equal distribution of weight through forefoot and heel. Knees should point same direction as feet throughout movement. Arms positioned forward allows torso to be positioned more upright. See Squat Analysis.'),(1006,1076,'Keep torso upright during exercise. Knee of exercised leg should point same direction as foot. See front view.'),(1007,1077,'Keep torso upright during exercise. Lead knee should point same direction as foot throughout movement. Stepping distance from bench emphasizes Gluteus Maximus; stepping close to bench emphasizes Quadriceps.'),(1008,1078,'Supporting knee should point same direction as foot throughout movement. Range of motion will be improved with greater leg strength and glute flexibility. Significant spinal flexion is acceptable form in full range single leg squat. Erector Spinae becomes a stabilizer if spine is kept straight. Also known as Self-assisted Pistol Squats.'),(1009,1079,'Supporting knee should point same direction as foot throughout movement.'),(1010,1080,'Keep torso upright during exercise. Stepping knee should point same direction as foot. A modest degree of knee rotation occurs during this movement. See Controversial Exercises and Rotary Force in Squat Analysis.'),(1011,1081,'Keep torso upright during exercise. Knee of exercised leg should point same direction as foot. Exercise can also be performed by placing travelling foot onto and off of bench next to foot of exercised leg (See demo). Park bench, picnic table and other elevated surfaces can also be used instead of a bench. Weighted versions of this exercise would normally be considered auxiliary in context of other basic exercises (ie: Barbell Squat, Sled Leg Press). However, in the context of \'body weight\' only program, this exercise can be considered basic.'),(1012,1082,'Supporting knee should point same direction as foot throughout movement, yet only extend forward slightly. Range of motion will be improved with greater leg strength and glute flexibility. Spinal flexion near bottom of motion is acceptable form in full range single leg squat. Erector Spinae becomes a stabilizer if spine is kept straight. See Side Rear View. Weighted versions of this exercise would normally be considered auxiliary in context of other basic exercises (ie: Barbell Squat, Sled Leg Press). However, in the context of \'body weight\' only program, this exercise can be considered basic. Also known as Self-assisted Reclining Pistol Squats or Self-assisted Reclining Single Leg Squats. The degree of self-assistance required affects the significance of upper body muscles utilized.'),(1013,1083,'This exercise can be performed on TRXⓇ style suspension trainer. See Suspended Supine Feet Mount/Dismount. Hamstring enters active insufficiency as hip is raised since knee is flexed and hip does not flex beyond 90 degrees. However, it is used more to stabilize knees in fixed flexed position. Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius, allowing it to assist Hamstrings in maintaining fixed knee flexion. See Knee flexion abduction force vector diagram. Adductor Magnus does not assist since hip extension does not occur in fully flexed position.'),(1014,1084,'Keep torso upright during exercise. Stepping knee should point same direction as foot. A modest degree of knee rotation occurs during this movement. See Controversial Exercises and Rotary Force in Squat Analysis.'),(1015,1085,'Notice knee extends out to side more than Lying Piriformis Stretch. Also see Lying Glute Stretch for alternative form.'),(1016,1087,'Keep torso upright during squat; flexible hip flexors are important particularly in lower position. Forward knee should point same direction as foot throughout movement.'),(1017,1088,'Supporting knee should point same direction as foot throughout movement. Dismounting can be achieved by placing elevated leg down and walking backward until body is upright. This exercise can be performed on TRXⓇ style suspension trainer or adjustable length gymnastics rings. Also known as Suspended Pistol Squat.'),(1018,1090,'Ankle can be placed on top edge of shin pad if it can not be positioned above knee.'),(1019,1089,'See PNF stretch techniques. Also see Modified Lying Glute Stretch for similar static stretch.'),(1020,1091,'None.'),(1021,1092,'Allow hip to straighten toward floor for additional hip flexor stretch.'),(1022,1093,'This exercise can be performed if thigh can not be reached or held on to during Lying Glute Stretch.'),(1023,1094,'Keep torso upright during squat; flexible hip flexors are important. Forward knee should point same direction as foot throughout movement. Exercise can be dismounted by lifting suspended rear foot from loop, allowing it to fall back while placing foot on floor. A training partner can assist with positioning of loop around rear foot.'),(1024,1095,'Hands may be placed on elevated platform to maintain balance. Spine may be kept straight. Pelvis may be tilted forward to intensify stretch.'),(1025,1096,'Spine may be kept straight. Pelvis may be tilted forward to intensify stretch.'),(1026,1097,'Spine may be kept straight. Pelvis may be tilted forward to intensify stretch.'),(1027,1098,'Spine may be kept straight. Pelvis may be tilted forward to intensify stretch.'),(1028,1099,'See PNF stretch techniques. The Seated Glute Stretch can also be performed as static stretch.'),(1029,1100,'Spine may be kept straight. Pelvis may be tilted forward to intensify stretch.'),(1030,1101,'Spine may be kept straight. Pelvis may be tilted forward to intensify stretch.'),(1031,1102,'This Dynamic Stretch can performed before athletic event or sports training session.'),(1032,1103,'This Dynamic Stretch can performed before athletic event or sports training session. Also stretches muscles involved in Foot Eversion.'),(1033,1104,'See ROM Criteria and Spot Reduction Myth.'),(1034,1105,'Height of knee on exercising leg may require subtle adjustment during movement to permit clearance of traveling foot above floor. Gluteus Maximus will be activated as stabilizer on heavier loads when participant pushes stationary foot onto floor, thereby anchoring lower body as hip abductors keep thighs in place.'),(1035,1106,'Do not allow upper hip to fall behind upper hip throughout movement. See ROM Criteria and Spot Reduction Myth.'),(1036,1107,'See ROM Criteria and Spot Reduction Myth.'),(1037,1108,'Exercise name is somewhat counter-intuitive since direction of rotation is relative to movement of hip, or thigh, not bent leg. For example, in this exercises, internal rotation of hip causes front of thigh to turn inward despite bent leg moving outward. Incidentally, if knee were straight during internal rotation of thigh, foot would move inward.'),(1038,1110,'See ROM Criteria and Spot Reduction Myth.'),(1039,1109,'See ROM Criteria and Spot Reduction Myth.'),(1040,1111,'Mount machine with leg levers apart. Use lever to position legs together. See ROM Criteria and Spot Reduction Myth.'),(1041,1113,'Do not allow upper hip to fall behind upper hip throughout movement. See ROM Criteria and Spot Reduction Myth.'),(1042,1114,'Keep knees bent throughout exercise. Exercise can be performed on mat or towel or cushioning can be placed under forearm. See ROM Criteria and Spot Reduction Myth.'),(1043,1115,'See Suspended Supine Feet Mount/Dismount. Keep low back straight, maintaining approximate height from floor throughout movement. This exercise can be performed on TRXⓇ style suspension trainer. See ROM Criteria and Spot Reduction Myth.'),(1044,1117,'Keep feet pointed forward. See ROM Criteria and Spot Reduction Myth.'),(1045,1123,'Keep feet pointed forward. Exercise can be performed on mat or towel or cushioning can be placed under forearm. See ROM Criteria and Spot Reduction Myth.'),(1046,1124,'None.'),(1047,1125,'None.'),(1048,1126,'Hand nearest foot can be placed be behind on floor so torso can be reclined back slightly.'),(1049,1127,'Maintain 90° flexion in participant\'s hip while maintaining participant\'s shoulders flat on floor. See PNF stretch techniques. Also see Lying Crossover Stretch for similar static stretch.'),(1050,1128,'Hand nearest foot can be placed be behind on floor so torso can be reclined back slightly.'),(1051,1130,'None'),(1052,1131,'Keep hip of straight leg extended by leaning pelvis slightly forward.'),(1053,1132,'Also see Pretzel Stretch for Obliques for similar exercise which can be performed with this stretch.'),(1054,1133,'Alternatively, upper leg maybe extended straight inline with torso.'),(1055,1134,'Keep hip extended by leaning pelvis slightly forward and contracting Gluteus Maximus.'),(1056,1135,'None'),(1057,1136,'Exercise can be performed on bench. Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible; see Cable Lying Leg-Hip Raise. Knees may be kept extended throughout leg raise to increase intensity; see Cable Lying Straight Leg Raise. Also see Spot Reduction Myth and Lower Ab Myth.'),(1058,1137,'Training partner or trainer may need to assist attaching ankle cuffs to cable. Ankle cuffs may also be attached to cable pulley in lowest position when feet are on floor, but assistance may be needed to raise pulley to bench height. Cable Lying Leg Raise on floor is easier to set up.'),(1059,1138,'See Spot Reduction Myth and Lower Ab Myth.'),(1060,1139,'Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible; see Cable Lying Leg-Hip Raise. Knees can flex along with hips to decrease intensity; see Cable Lying Leg Raise. Also see Spot Reduction Myth and Lower Ab Myth.'),(1061,1140,'Keep elbows straight or nearly straight throughout exercise. Exercise can be performed without assistance. Rectus Abdominis and Obliques practically contract isometrically since little waist flexion occurs under resistance. With no waist flexion, Rectus Abdominis and External Oblique act to stabilize pelvis and waist during hip flexion. See target muscle of rollout question. Also see Spot Reduction Myth and Lower Ab Myth.'),(1062,1141,'Machine must be adjusted to align hip with lever fulcrum. Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. Conversely, it may be necessary to completely flex hips before waist flexion is possible, which is not practical with the opposite leg supporting body. See Spot Reduction Myth and Lower Ab Myth.'),(1063,1143,'Exercise is typically performed without added resistance. Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. It is necessary to raise legs higher than what is shown before waist flexion occurs; see Lever Vertical Leg-Hip Raise. Also see Spot Reduction Myth and Lower Ab Myth.'),(1064,1142,'Since knee of moving leg is straight and waist flexion is impeded by standing leg, range of motion will be limit to hamstring flexibility. See Spot Reduction Myth and Lower Ab Myth.'),(1065,1144,'Exercise can be performed without added weight until more resistance is needed. Lower decline to increase resistance. Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. See Arm Position During Waist Exercises and Spot Reduction Myth and Lower Ab Myth. Also see Dangerous Exercise Essay.'),(1066,1145,'Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. Exercise may be performed with ab straps. It may be necessary to completely flex hips before waist flexion is possible; see Weighted Hanging Leg-Hip Raise. Exercise can be performed without added weight until more resistance is needed. Knees may be kept extended throughout leg raise to increase intensity; see Weighted Hanging Straight Leg Raise. Also see Spot Reduction Myth and Lower Ab Myth.'),(1067,1146,'Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. Also see Spot Reduction Myth and Lower Ab Myth.'),(1068,1147,'Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible; see Weighted Incline Leg-Hip Raise. Care should be taken not to have weight falling over or thrown onto sensive bodily areas. For this reason increasing incline to increase intensity may be wiser than adding additional weight. Exercise can be performed without added weight on greater incline. Knees can flex along with hips to decrease intensity; see Weighted Incline Leg Raise. Also see Spot Reduction Myth and Lower Ab Myth.'),(1069,1148,'Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible; see Weighted Incline Leg-Hip Raise. Exercise can be performed without added weight until more resistance is needed. Elevate incline to increase resistance. Knees may be kept extended throughout leg raise to increase intensity; see Weighted Incline Straight Leg Raise. Also see Spot Reduction Myth and Lower Ab Myth.'),(1070,1149,'Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible; see Weighted Incline Leg-Hip Raise. Care should be taken not to have weight falling over or thrown onto sensitive bodily areas. For this reason, increasing incline to increase intensity may be wiser than adding additional weight. Exercise can be performed without added weight on greater incline. Knees can flex along with hips to decrease intensity; see Weighted Incline Leg Raise. Also see Spot Reduction Myth and Lower Ab Myth.'),(1071,1151,'Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible; see Weighted Hanging Leg-Hip Raise. Exercise can be performed without added weight until more resistance is needed; see Hanging Straight Leg Raise. Knees can flex along with hips to decrease intensity; see Weighted Hanging Leg Raise. Also see Spot Reduction Myth and Lower Ab Myth.'),(1072,1150,'Exercise can be performed without added weight until more resistance is needed (see Lying Leg Raise). Knees may be kept extended throughout leg raise to increase intensity.'),(1073,1152,'Heels may make contact with floor to maintain balance at bottom of movement. Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible. Exercise can be performed without added weight until more resistance is needed (See Seated Leg Raise without weight). Also see Spot Reduction Myth and Lower Ab Myth.'),(1074,1153,'Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible; see Weighted Incline Leg-Hip Raise. Exercise can also be performed on incline board or without added weight until more resistance is needed. Also see Spot Reduction Myth and Lower Ab Myth.'),(1075,1154,'This exercise is alternative to Vertical Leg Raise when apparatus is not available, or Hanging Leg Raise when high bar is not available or too low to allow for adequate leg clearance. Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible; see Weighted Vertical Leg-Hip Raise on parallel bars. Exercise can be performed without added weight until more resistance is needed (See Vertical Leg Raise on dip bar). Knees may be kept extended throughout leg raise to increase intensity. Also see Spot Reduction Myth and Lower Ab Myth.'),(1076,1155,'Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible; see Weighted Vertical Leg-Hip Raise. Exercise can be performed without added weight until more resistance is needed (See Vertical Leg Raise without weight). Knees may be kept extended throughout leg raise to increase intensity; see Weighted Vertical Straight Leg Raise. Also see Spot Reduction Myth and Lower Ab Myth.'),(1077,1156,'Exercise can be performed on standard bench or without added weight. Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. See Arm Position During Waist Exercises and Spot Reduction Myth and Lower Ab Myth. Also see Dangerous Exercise Essay.'),(1078,1157,'Exercise can be performed with ab straps. Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible, as in leg-hip raise. Also see Spot Reduction Myth and Lower Ab Myth.'),(1079,1158,'Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible as in hip leg raise. Also see Spot Reduction Myth and Lower Ab Myth.'),(1080,1160,'Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible, as in leg-hip raise. Also see Spot Reduction Myth and Lower Ab Myth.'),(1081,1159,'Exercise can be performed without ab straps, by hanging from high bar. Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible, as in leg-hip raise. Also see Spot Reduction Myth and Lower Ab Myth.'),(1082,1161,'Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible, as in leg-hip raise. Attempting to perform Incline Straight Leg-Hip Raise at a low incline would not load waist and hip flexors after they travel beyond vertical so that sort of movement would need to be performed on steep incline or vertical position, requiring much greater strength. Also see Spot Reduction Myth and Lower Ab Myth.'),(1083,1162,'Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible; see Weighted Vertical Leg-Hip Raise. Exercise can be performed without added weight until more resistance is needed (see Vertical Straight Leg Raise). Knees can flex along with hips to decrease intensity; see Weighted Vertical Leg Raise. Also see Spot Reduction Myth and Lower Ab Myth.'),(1084,1163,'Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible; see Weighted Incline Leg-Hip Raise. Exercise can also be performed on incline board. Also see Spot Reduction Myth and Lower Ab Myth.'),(1085,1164,'Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible, as in leg-hip raise. Also see Spot Reduction Myth and Lower Ab Myth.'),(1086,1165,'Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible, as in leg-hip raise. Attempting to perform Incline Straight Leg-Hip Raise at a low incline would not load waist and hip flexors after they travel beyond vertical so that sort of movement would need to be performed on steep incline or vertical position, requiring much greater strength. Also see Spot Reduction Myth and Lower Ab Myth.'),(1087,1166,'Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. Conversely, it may be necessary to completely flex hips before waist flexion is possible, which is not practical with alternating leg movements. Also see Spot Reduction Myth and Lower Ab Myth.'),(1088,1167,'This exercise is alternative to Vertical Leg Raise when apparatus is not available, or Hanging Leg Raise when high bar is not available or too low to allow for adequate leg clearance. Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible; see Weighted Vertical Leg-Hip Raise on parallel bars. Also see Spot Reduction Myth and Lower Ab Myth.'),(1089,1168,'Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible, as in leg-hip raise. Also see Spot Reduction Myth and Lower Ab Myth.'),(1090,1169,'Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible, as in leg-hip raise. Attempting to perform Lying Straight Leg Hip Raise would not load waist and hip flexors after they travel beyond vertical so that sort of movement would need to be performed on steep incline or vertical position, requiring much greater strength. Also see Spot Reduction Myth and Lower Ab Myth.'),(1091,1170,'Heels may make contact with floor to maintain balance at bottom of movement. Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible. Typically, the spine is not extended enough in this movement to constitute significant spinal flexion, so it remains classified as a hip flexor movement. Also see Spot Reduction Myth and Lower Ab Myth.'),(1092,1171,'Also known as Scissors Kick. Movement involves very short range of motion so greater isometric-like endurance is required. Also see over/under variation.'),(1093,1172,'Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible. Conversely, it may be necessary to completely flex hips before waist flexion is possible, which is not practical with alternating leg movements. Also see Spot Reduction Myth and Lower Ab Myth.'),(1094,1173,'Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible, as in leg-hip raise. Also see Spot Reduction Myth and Lower Ab Myth.'),(1095,1174,'Feet must be propped securely to prevent injury. Exercise can also be performed on Roman Chair Sit-up apparatus. Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. See Spot Reduction Myth and Lower Ab Myth. Also see Dangerous Exercise Essay.'),(1096,1175,'Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible, as in leg-hip raise. Also see Spot Reduction Myth and Lower Ab Myth.'),(1097,1176,'Keep arms straight with shoulders positioned above hands. Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique act only to stabilize pelvis and waist during hip flexion. If waist flexion were to occur after complete hip flexion, resistive forces are no longer working against abdominal muscles in this final position when knees and hips are flexed. However, abdominal muscles are activated isometrically to keep spine straight when knees are not under body. Also see Spot Reduction Myth and Lower Ab Myth.'),(1098,1177,'Keep arms straight with shoulders positioned above hands. Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique act only to stabilize pelvis and waist during hip flexion. If waist flexion were to occur after complete hip flexion, resistive forces are no longer working against abdominal muscles in this final position when knees and hips are flexed. However, abdominal muscles are activated isometrically to keep spine straight when knees are not under body. Also see Spot Reduction Myth and Lower Ab Myth.'),(1099,1178,'Keep arms straight with shoulders positioned above hands. Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique act only to stabilize pelvis and waist during hip flexion. If waist flexion were to occur after complete hip flexion, resistive forces are no longer working against abdominal muscles in this final position when knees and hips are flexed. However, abdominal muscles are activated isometrically to keep spine straight when knees are not under body. Also see Spot Reduction Myth and Lower Ab Myth.'),(1100,1179,'Keep arms straight with shoulders positioned above hands. Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique act only to stabilize pelvis and waist during hip flexion. In this movement, even if waist flexion were to occur after complete hip flexion, the abs have endured much more stabilizing forces in their extended position than dynamic forces they could possibly encounter in the flexed position. Also see Spot Reduction Myth and Lower Ab Myth.'),(1101,1181,'Position foot further beyond knee if stretch is felt in Adductor Magnus of forward thigh.'),(1102,1182,'Feet should be far enough apart to keep knee from traveling too far beyond forward foot. Keep torso upright, close to vertical. Keep forward foot flat on floor and rear foot pointed forward. Soleus of opposite leg may be stretched if ankle is fully dorsal flexed.'),(1103,1183,'Gluteus Maximus and Adductor Magnus may be mildly stretched if hip of forward leg is fully flexed. Soleus of opposite leg may be stretched if ankle is fully dorsal flexed.'),(1104,1184,'Attempt to straighten hip each stroke, while maintaining approximate height of hips from floor throughout movement. Dismount by removing straps, while kneeling or after sitting on one side of hip before rotating body to seated position. See Suspended Prone Feet Mount/Dismount. This exercise can be performed on TRXⓇ style suspension trainer.'),(1105,1185,'Keep foot away from fully extended hip to keep emphasis on Iliopsoas. See Lever Quadriceps Stretch for similar movement.'),(1106,1186,'Keep arms straight with shoulders positioned above hands. Dismount by removing straps while kneeling or after sitting on one side of hip before rotating body to seated position. See Suspended Prone Feet Mount/Dismount. This exercise can be performed on TRXⓇ style suspension trainer.'),(1107,1190,'Keep torso upright, close to vertical. Soleus of opposite leg may be stretched if foot is positioned forward and ankle is fully dorsal flexed.'),(1108,1192,'Alternatively, both hands can anchor upper thigh, on hand inside and other on out side of thigh. The leg may also hang from side of bench if body is positioned slightly diagonal. If stretch is not felt, pull upper thigh closer to side of torso with both hands or use taller bench if heal touches floor.'),(1109,1191,'Torso can be bent slightly forward with forearms on padded podium. If padded lower leg support is angled up, Rectus Femoris may also be stretched.'),(1110,1194,'Height of knee on exercising leg may require subtle adjustment during movement to permit clearance of traveling foot above floor. Gluteus Maximus will be activated as stabilizer on heavier loads when participant pushes stationary foot onto floor thereby anchoring lower body as hip adductors keep thighs together. Upper body muscles can also assist in keeping thigh of exercising leg along side stationary leg. Exercise name is somewhat counter-intuitive since direction of rotation is relative to movement of hip, or thigh, not bent leg. For example, in this exercises, external rotation of hip causes front of thigh to turn outward despite bent leg moving inward. Incidentally if knee were straight during external rotation of thigh, foot would move outward.'),(1111,1195,'Body may be reclined with support of arms as demonstrated (lower right). Also see Seated External Rotator Stretch.'),(1112,1197,'Low back may be stretched if hips raise off of floor significantly. If spinal flexion is not desired, care should be given to keep back of hips on floor by monitoring hips position and pushing downward instead of toward participant\'s chest. See PNF stretch techniques. Also see Lying Piriformis Stretch for similar static stretch.'),(1113,1199,'Low back may be stretched if hips and low back muscles are tight.'),(1114,1200,'Low back may be stretched if spine flexes significantly during stretch. Arms can hug and pull upper legs toward torso as shown in lower photo.'),(1115,1201,'Exercise name is somewhat counter-intuitive since direction of rotation is relative to movement of hip, or thigh, not bent leg. For example, in this exercises, external rotation of hip causes front of thigh to turn outward despite bent leg moving inward. Incidentally if knee were straight during external rotation of thigh, foot would move outward.'),(1116,1202,'Also see Lying External Rotator Stretch.'),(1117,1203,'An alternative preparation: set on floor or mat reclining back with support of both arms behind body. Bend knees with feet on floor. Place back of knee on thigh of other leg. Hug both thighs locking both hands together behind knee of lower leg. Lie down supine by rolling to back.'),(1118,1204,'Notice knee is keep over torso in contrast to Lying Glute Stretch. Also see Lying Piriformis Stretch for alternative form.'),(1119,1205,'Low back may be stretched if hips and low back muscles are tight.'),(1120,1206,'See PNF stretch techniques. A static Seated Piriformis Stretch can also be performed without assistance.'),(1121,1211,'Keep torso upright and knee of lead leg pointed same direction of foot. Flexible hip adductors and stronger legs will allow fuller range of motion. A wider stance emphasizes Gluteus Maximus; slightly narrower straddled stance emphasizes Quadriceps. Do not position feet too close nor too wide.'),(1122,1217,'Keep head facing forward, back straight and feet flat on floor; equal distribution of weight throughout forefoot and heel. Knees should point same direction as feet throughout movement. See:'),(1123,1237,'More or less 3/4 squat depth can be achieved depending upon exerciser\'s height, chain length on dip belt, and height of elevated platform. If greater depth can be achieved, descend as low as thighs being parallel to floor. Keep head facing forward, back straight, chest high, arms straight to sides, and feet flat on platform; equal distribution of weight through forefoot and heel. Knees should point same direction as feet throughout movement. See Squat Analysis.'),(1124,1239,'Those with hamstring inflexibility may have difficulty fully extending knee if knee is too high. In which case, knee can be raised forward less than 45°. Pectineus, Adductor Longus, Adductor Brevis do not contribute to hip stabilization since they are only involved in initial range of hip flexion.'),(1125,1243,'Keep lower leg straight throughout movement. Forward knee should point same direction as foot throughout movement. Instead of grasping cable stirrups, dip belt attached to low pulley cable can be placed around waist.'),(1126,1249,'Stabilizers may be used during heavy resistances to prevent body rising off of seat.'),(1127,1254,'Stabilizers may be used during heavy resistances to prevent body rising off of seat. Also see exercise perfomed on bilateral machine.'),(1128,1262,'With greater resistances, more effort is required to pull on handle bars to keep body from rising upward.'),(1129,1271,'Re-engage support lever before dismounting. Model shown uses foot pedal near base of platform to re-engage support lever. Keep head facing forward, back straight and feet flat on platform; equal distribution of weight through forefoot and heel. Knees should point same direction as feet throughout movement. See Squat Analysis.'),(1130,1279,'Stabilizers may be used during heavy resistances to prevent body rising off of seat.'),(1131,1281,'Stabilizers may be used during heavy resistances to prevent body from rising off of seat. Also see exercises performed on bilateral machine.'),(1132,1285,'Stabilizers may be used during heavy resistances to prevent body rising off of seat.'),(1133,1286,'Adjust bench to accommodate near full range of motion without forcing hips to bend at waist. Keep knees pointed same directions as feet. Do not allow heels to raise off of platform, pushing with both heel and forefoot. This exercise may be performed by alternating (as described), simultaneous, or in simultaneous-alternating fashion.'),(1134,1289,'Re-engage support lever in extended position before dismounting. If insufficient hip flexibility forces pelvis to pull away from back pad at lower portions of movement, only lower sled just short of spinal articulation. Keep knees pointed same directions as feet. Do not allow heels to raise off of platform, pushing with both heel and forefoot. Placing feet slightly high on platform emphasizes Gluteus Maximus. Placing feet slightly lower on platform emphasizes Quadriceps.'),(1135,1309,'Keep torso upright and foot flat on platform during exercise.\nKnee of exercised leg should point same direction as foot. Extended\nleg can be positioned slight forward.'),(1136,1317,'Keep waist and hips straight throughout exercise. Knees should point same direction as feet throughout movement. Sissy Squat can be performed without additional weight until additional resistance is required. Also see Weighted Sissy Squat on apparatus.'),(1137,1323,'Keep chest high and shoulder behind hips, preventing torso to angle forward. If upper pad is too high, it can obstruct range of motion, and possibly create abrupt forward dislocating forces on knee particularly if descent is not controlled. In contrast, inadequate support will be provided if upper pad is too low.'),(1138,1324,'Keep waist and hips straight throughout exercise. Knees should point same direction as feet throughout movement. Also see Sissy Squat on apparatus.'),(1139,1329,'Keep chest high and shoulder behind hips, preventing torso to angle forward. If upper pad is too high, it can obstruct range of motion, and possibly create abrupt forward dislocating forces on knee, particularly if descent is not controlled. In contrast, inadequate support will be provided if upper pad is too low.'),(1140,1332,'Keep torso upright during exercise. Stepping knee should point same direction as foot. A modest degree of knee rotation occurs during this movement. See Controversial Exercises and Rotary Force in Squat Analysis.'),(1141,1466,'None.'),(1142,1467,'The opposite leg or thick towel can be placed under participant\'s near knee (and above participant\'s far knee) to further stretch Rectus Femoris. Tibialis Anterior can be stretched if ankle is completely plantar flexed. See PNF stretch techniques. Also see Prone Quadriceps Stretch for similar static stretch.'),(1143,1468,'A thickly folded towel can be placed under upper hip if lumbar spine hyperextension would otherwise be uncomfortable. A thickly folded towel can be placed under knee to further stretch Rectus Femoris.'),(1144,1469,'Rear knee should be completely flexed to keep emphasis on Quadriceps, particularly Rectus Femoris. See Lever Hip Flexor Stretch for similar movement.'),(1145,1470,'Alternatively, hip may be initially extended, then ankle can be slowly pulled towards rear end. With either technique, do not allow knee to flare outward to side. If low back is sensitive to hyperextension, hip should be postured in more neutral position than demonstrated. If knee is not completely flexed Iliopsoas may be stretched; Quadriceps will not be stretched significantly. If range of motion permits try Standing Quadriceps Stretch with out towel.'),(1146,1471,'Alternatively, hip may be initially extended, then ankle can be slowly pulled towards rear end. With either technique, do not allow knee to flare outward to side. If low back is sensitive to hyperextension, hip should be postured in more neutral position than demonstrated. If knee is not completely flexed, Iliopsoas may be stretched; Quadriceps will not be stretched significantly. See Standing Tibialis Anterior Stretch for similar exercise which can be combined with this stretch and performed simultaneously. If range of motion prohibits grasping of ankle or foot try Standing Quadriceps Stretch with towel.'),(1147,1472,'During stretch, do not allow knee to flare upward away from floor. If knee is not completely flexed, Iliopsoas wil be stretched more than Quadriceps. Bottom hip and knee can be bent 90° thereby decreasing anterior pelvic tilt so upper leg will not need to be pulled back as far during hip extension. See Lying Tibialis Anterior Stretch for similar exercise which can be combined with this stretch and performed simultaneously.'),(1148,1473,'Do not allow knee to flare outward to side. If low back is sensitive to hyperextension, hip should be postured in more neutral position than demonstrated by positioning shelf lower and bending supporting knee more. If knee is not completely flexed, Iliopsoas may be stretched; Quadriceps will not be stretched significantly. Tibialis Anterior may also be stretched if only top of forefoot is on shelf, as opposed to top of entire foot.'),(1149,1474,'Pull knee in if it initially flares outward to side. This Dynamic Stretch can performed before athletic event or sports training session.'),(1150,1476,'Begin with very light weight and add additional weight gradually to allow adequate adaptation. Throughout lift, keep back and knees straight. Do not lower weight beyond mild stretch through hamstrings. Full range of motion will vary from person to person depending on flexibility. Also see Bent Knee Goodmorning emphasizing Glutes.'),(1151,1478,'Adjust lower leg brace so pressure is evenly distributed on thigh pad. Maintain barbell\'s position on back of shoulders when upper body is lowered. Do not lower weight beyond mild stretch. Full range of motion will vary from person to person. Also known as Barbell Hip Extension. Also see Barbell Hyper-extension and Barbell Back Extension.'),(1152,1479,'Throughout lift, keep arms, knees, and back straight. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch. Full range of motion will vary from person to person depending on flexibility. Re-rack or deadlift weight back to floor. Also see Straight Leg Deadlift.'),(1153,1480,'Not all trap bar designs may allow for this movement. A squared, open-ended trap bar is used in this demonstration. Throughout lift, keep arms, knees, and back straight. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch. Full range of motion will vary from person to person depending on flexibility. Deadlift weight back to floor.'),(1154,1481,'Exercise can be performed without added weight until more resistance is needed.'),(1155,1483,'This is an advanced exercise performed on Glute Ham Raise Apparatus. This movement is also known as Barbell Hamstring Raise. Exercise can be performed without added weight until more resistance is needed. Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius allowing it to assist in knee flexion. Also see Inverse Leg Curl\n\n\ncomments.'),(1156,1485,'Position pad high enough to evenly distribute body weight on thigh but not so high that range of motion is limited; abdomen should not press on top side of pad when upper body is lowered. Maintain barbell\'s position on back of shoulders when upper body is lowered. Do not lower weight beyond mild stretch. Full range of motion will vary from person to person. Also known as Barbell 45-degree Hip Extension. Also see Barbell Hyperextension and Barbell Back Extension.'),(1157,1486,'Throughout lift, keep arms, knees, and back straight. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch. Full range of motion will vary from person to person depending on flexibility. Also see Straight Leg Deadlift.'),(1158,1487,'Keep torso on bench to reduce hyperextension of lower back. Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius allowing it to assist in knee flexion.'),(1159,1489,'Raise knee very slightly as knee is flexing and return as weight is lowered. Keep hip from sagging or from being pulled forward. Heavier resistances can tear apart standard leather ankle cuffs.'),(1160,1491,'Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius allowing it to assist in knee flexion.'),(1161,1492,'Keep hip from sagging or from being pulled forward. Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius allowing it to assist in knee flexion. Also see Cable Bent-over Leg Curl.'),(1162,1493,'Throughout lift, keep arms, knees, and back straight. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch. Full range of motion will vary from person to person depending on flexibility. Also see Straight Leg Deadlift.'),(1163,1494,'Keep torso on bench to reduce hyperextension of lower back. Most machines are angled at user\'s hip to position hamstring in more favorable mechanical position. If angle is at much greater angle than one illustrated, Rectus Femoris will less likely be involved as Antagonist Stabilizer. Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius allowing it to assist in knee flexion. See Knee flexion abduction force vector diagram.'),(1164,1495,'Keep torso on bench to reduce hyperextension of lower back. Most machines are angled at user\'s hip to position hamstring in more favorable mechanical position. If angle at hip is significantly bent, Rectus Femoris will less likely be involved as Antagonist Stabilizer. Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius allowing it to assist in knee flexion. See Knee flexion abduction force vector diagram.'),(1165,1496,'The bent-over posture decreases active insufficiency of three of four heads of hamstring at completion of knee flexion. Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius allowing it to assist in knee flexion. This exercise is variation of Standing Leg Curl but is similar biomechanically to Kneeling Leg Curl.'),(1166,1497,'Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius, allowing it to assist in knee flexion. See Knee flexion abduction force vector diagram.'),(1167,1499,'Throughout lift, keep arms, knees, and back straight. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch. Full range of motion will vary from person to person depending on flexibility. Also see Straight Leg Deadlift.'),(1168,1502,'The bent-over posture decreases active insufficiency of three of four heads of hamstring at completion of knee flexion. Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius allowing it to assist in knee flexion.'),(1169,1503,'Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius allowing it to assist in knee flexion.'),(1170,1500,'Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius allowing it to assist in knee flexion.'),(1171,1504,'Keep torso on bench to reduce hyperextension of lower back. Most machines are angled at user\'s hip to position hamstring in more favorable mechanical position. If this angle is sharp (as shown), Rectus Femoris is less likely involved as Antagonist Stabilizer. Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius allowing it to assist in knee flexion. See Knee flexion abduction force vector diagram.'),(1172,1505,'Keep torso on bench to reduce hyperextension of lower back. Most machines are angled at user\'s hip to position hamstring in more favorable mechanical position. If angle is at much greater angle than one illustrated, Rectus Femoris will less likely be involved as Antagonist Stabilizer. Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius allowing it to assist in knee flexion. See Knee flexion abduction force vector diagram.'),(1173,1501,'Allow resting leg on top to ride bar down and up throughout exercise. Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius allowing it to assist in knee flexion.'),(1174,1506,'Some apparatuses allow for a bent over posture potentially further decreasing active insufficiency of three of four heads of hamstring at completion of knee flexion. If hips are not significantly bent (ie: body upright), Rectus Femoris becomes antagonist stabilizers. Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius allowing it to assist in knee flexion.'),(1175,1507,'A leg extension with padded rollers with access to both sides is required. If needed, raise body slightly by raising heel so lever fulcrum closer to knee articulation. Disregard calf as stabilizer if this is not necessary. Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius allowing it to assist in knee flexion.'),(1176,1508,'Taller individuals may only be able to perform this exercise on standard multi-hip machine if adjustments are not sufficient to position knee at same height of fulcrum. If needed, raise body slightly by raising heel for proper knee alignment. Disregard calf as stabilizer if this is not necessary. Maintain knee position to lever throughout exercise. Shorter individuals may find it difficult to position body high enough even with elevation. Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius allowing it to assist in knee flexion.'),(1177,1509,'Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius allowing it to assist in knee flexion. Also see Lever Seated Leg Curl machine with pad below knee.'),(1178,1510,'Some apparatuses allow for a bent over posture potentially further decreasing active insufficiency of three of four heads of hamstring at completion of knee flexion. If hips are not significantly bent (ie: body upright), Rectus Femoris becomes antagonist stabilizers. Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius allowing it to assist in knee flexion. Similar exercise can also be performed on some multi-hip machines and certain leg extension machines. Also see Bent-over Leg Curl.'),(1179,1511,'Throughout lift, keep arms, knees, and back straight. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch. Full range of motion will vary from person to person depending on flexibility. Stand on elevated platform if smith machine does not allow full range of motion. Also see Straight Leg Deadlift.'),(1180,1512,'Begin with very light weight and add additional weight gradually to allow adequate adaptation. Throughout lift, keep back and knees straight. At lower position, forefoot may raise off floor slightly. Do not lower weight beyond mild stretch. Full range of motion will vary from person to person depending on flexibility. Also see Bent Knee Goodmorning emphasizing Glutes.'),(1181,1514,'Throughout lift, knees straight and back of hips on bench. Hip may tend to raise up when legs are pulled up. Full range of motion will vary from person to person depending on flexibility.'),(1182,1516,'Exercise can be performed without added weight until more resistance is needed. If weight is positioned behind head, neck extensors act as stabilizers.'),(1183,1518,'Exercise can be performed without added weight until more resistance is needed. If weight is positioned behind head, neck extensors act as stabilizers'),(1184,1519,'This is an advanced exercise performed on Glute Ham Raise Apparatus. This movement is also known as Weighted Hamstring Raise. Exercise can be performed without added weight until more resistance is needed. If weight is positioned behind head, neck extensors act as stabilizers.'),(1185,1520,'Platform should be high enough to allow hip to flex without buttocks contacting floor. Full range of motion will vary from person to person. Adductor Magnus may only assist at initial phase hip extension depending on degree of hip flexion at bottom of movement.'),(1186,1521,'Platform should be high enough to allow hips to flex without buttocks contacting floor. Full range of motion will vary from person to person. Adductor Magnus may only assist at initial phase hip extension depending on degree of hip flexion at bottom of movement. Also see Hanging Hyperextension for Erector Spinae performed with fuller range of movement.'),(1187,1522,'Positioned bar so back is slightly above floor once grip is established. Keep low back and hips straight throughout movement. With hips fully extended, Hamstrings enter active insufficiency near complete knee flexion.  Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius, allowing it to assist in knee flexion.'),(1188,1523,'Keep hips straight throughout movement. Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius allowing it to assist in knee flexion.'),(1189,1524,'Keep hips straight throughout movement. With hips fully extended, Hamstrings enter active insufficiency near complete knee flexion. Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius, allowing it to assist in knee flexion.'),(1190,1525,'This is an advanced exercise performed on Glute Ham Raise Apparatus. This movement is also known as Hamstring Raise. Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius allowing it to assist in knee flexion. Also see Inverse Leg Curl comments.'),(1191,1527,'This movement is also known as Self-assisted Hamstring Raise on Floor. Bar or pad height should be only just high enough to position ankles underneath, allowing room for vertical orientation of feet with toes on floor. To keep exercise challenging, push off only hard enough to minimally assist raising of body with hamstrings. Attempt to keep hips as straight as possible throughout movement.'),(1192,1528,'This movement is also known as Self-assisted Hamstring Raise. To keep exercise challenging, push off only hard enough to minimally assist raising of body with hamstrings only. Place hands on top of platform when controlled descent can no longer be maintained with hamstring strength alone. Also attempt to keep hips as straight as possible throughout movement'),(1193,1526,'Positioned bar so back is slightly above floor once grip is established. Keep low back straight, maintaining approximate height from floor throughout movement. Hamstrings seemingly acts as a dynamic stabilizer, since it shortens through knee, while it lengthens through hip. However, net contraction actually appears to occur, since hip flexes only slightly, while knee flexes nearly 100%, allowing hamstrings to remain in a mechanically strong position throughout movement. Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius, allowing it to assist in knee flexion.'),(1194,1530,'This exercise can be performed on TRXⓇ style suspension trainer or adjustable length gymnastics rings. Positioned handles so back is slightly above floor once grip is established. Keep low back straight, maintaining approximate height from floor throughout movement. Hamstrings seemingly acts as a dynamic stabilizer, since it shortens through knee, while it lengthens through hip. However, net contraction actually appears to occur, since hip flexes only about 50%, while knee flexes nearly 100%, allowing hamstrings to remain in a mechanically strong position throughout movement. Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius, allowing it to assist in knee flexion.'),(1195,1531,'This exercise can be performed on TRXⓇ style suspension trainer or adjustable length gymnastics rings. Positioned handles so back is slightly above floor once grip is established. Keep low back and hips straight throughout movement. With hips fully extended, Hamstrings enter active insufficiency near complete knee flexion. Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius, allowing it to assist in knee flexion.'),(1196,1532,'This exercise can be performed on TRXⓇ style suspension trainer. See Suspended Supine Feet Mount/Dismount. Keep hips straight throughout movement. With hips fully extended, Hamstrings enter active insufficiency near complete knee flexion. Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius, allowing it to assist in knee flexion.'),(1197,1533,'Far leg can be bent at knee and hip particularly if hip flexors are tight and greater spinal flexion will not irritate existing lower back injury. Alternative method (pictured low right) involves pulling leg toward chest with knee nearly straight. Also see Lying Hamstring Stretch with towel.'),(1198,1534,'Keep knee straight throughout stretch. If horizontal foot bar is set so foot is more dorsal flexed, leg angle may not need to be set as high.'),(1199,1535,'See PNF stretch techniques. Also see Lying Hamstring Stretch for similar static stretch.'),(1200,1538,'To intensify stretch, hold upper bar. Those with longer upper thigh may need to deliberately keep extended leg straight, position hips further back on seat, or perform alternative stretch.'),(1201,1536,'This exercise can be performed on TRXⓇ style suspension trainer. See Suspended Supine Feet Mount/Dismount. Keep low back straight, maintaining approximate height from floor throughout movement. On most popular suspension trainers, keep lower body weight equally distributed on each side to prevent slippage. Some makes of suspension trainers do not have this slack in their design, so one leg can relax momentarily in straight position, while bent side bears most of resistance, allowing for a more dynamic contraction in this specific movement.'),(1202,1537,'This exercise can be performed on TRXⓇ style suspension trainer. See Suspended Supine Feet Mount/Dismount. Keep low back straight, maintaining approximate height from floor throughout movement. Hamstrings seemingly acts as a dynamic stabilizer, since it shortens through knee, while it lengthens through hip. However, net contraction actually appears to occur, since hip flexes only about 50%, while knee flexes nearly 100%, allowing hamstrings to remain in a mechanically strong position throughout movement. Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius, allowing it to assist in knee flexion.'),(1203,1539,'Keep knees straight by tensing Quadriceps. Knees may inadvertently bend if feet are extended off of thick mat. Spine may be kept straight. Pelvis may be tilted forward to intensify stretch.'),(1204,1540,'Precautions must be taken to prevent sliping off chair. This stretch may be appropriate for those restricted to chair. Keep knees straight by tensing Quadriceps. Spine may be kept straight. Pelvis may be tilted forward to intensify stretch.'),(1205,1541,'Alternatively, leg not being stretched can be bent so sole of foot is next to stretched thigh. Keep knee of stretched leg straight by tensing Quadriceps. Knees may inadvertently bend if feet are extended off of thick mat or bench. Spine may be kept straight. Pelvis may be tilted forward to intensify stretch.'),(1206,1542,'Far leg can be straightened keep hip from rolling up or bent for comfort. Also see Lying Hamstring Stretch without towel.'),(1207,1543,'See PNF stretch techniques. Also see Seated Hamstring Stretch for similar static stretch.'),(1208,1545,'Keep knees straight by tensing Quadriceps. Spine may be kept straight. Pelvis may be tilted forward to intensify stretch.'),(1209,1544,'Those with greater than average hamstring flexibility may not find this stretch to be effective. In which case, an alternative stretch would be more suitable.'),(1210,1546,'Keep knees straight by tensing Quadriceps. The knee may inadvertently bend if foot is extended off edge of bench. Spine may be kept straight. Pelvis may be tilted forward to intensify stretch.'),(1211,1548,'Keep rear knee straight. If necessary, tense Quadriceps. Spine may be kept straight. Pelvis may be tilted forward to intensify stretch.'),(1212,1547,'Precautions must be taken to prevent sliping off chair. This stretch may be appropriate for those restricted to chair. Keep knee straight by tensing Quadriceps. Spine may be kept straight. Pelvis may be tilted forward to intensify stretch.'),(1213,1549,'Rear knee should remain pointed same direction of rear foot. Both hands may be braced just above both knees. Forward knee may also be keep straight by tensing Quadriceps. Spine may be kept straight. Pelvis may be tilted forward to intensify stretch.'),(1214,1550,'Avoid throwing leg up onto high elevation. Keep forward knee straight by tensing Quadriceps. Spine may be kept straight. Pelvis may be tilted forward to intensify stretch.'),(1215,1551,'This Dynamic Stretch can performed before athletic event or sports training session. Although this dynamic stretch targets the Hamstrings in the raised leg, Iliopsoas is typically stretched in supporting leg due to posterior rotation of hips as leg is raised.'),(1216,1552,'This Dynamic Stretch can performed before athletic event or sports training session. Although this dynamic stretch targets the Hamstrings in the raised leg, Iliopsoas is typically stretched in supporting leg due to posterior rotation of hips as leg is raised.'),(1217,1553,'See Spot Reduction Myth.'),(1218,1554,'Mount machine with leg levers together. Use lever to extend legs apart. See Spot Reduction Myth.'),(1219,1558,'See Spot Reduction Myth and ROM Criteria.'),(1220,1556,'See Spot Reduction Myth.'),(1221,1560,'Notice cable pulley in use is out of view to left. Exerciser is holding on to ballet bar above opposite cable pulley, not in use. See Spot Reduction Myth.'),(1222,1559,'See Spot Reduction Myth.'),(1223,1557,'Mount machine with leg levers together. Use lever to extend legs apart. See Spot Reduction Myth.'),(1224,1564,'Arms can push legs down if preferred.'),(1225,1565,'See PNF stretch techniques. Also see Lying Wall Groin Stretch for similar static stretch.'),(1226,1566,'Push elbow into side of knee for added stretch.'),(1227,1567,'None.'),(1228,1569,'Keep back of legs against wall.'),(1229,1570,'Erector Spinae may be stretched if spine is flexed during stretch. Gluteus Maximus may be stretched if hip is flexed enough.'),(1230,1571,'emphasizes Adductor Magnus, ischial fibers by flexing hip.'),(1231,1572,'Keep legs and back straight.'),(1232,1573,'Administrator may need to kneel down closer to partipants who are more flexible. See PNF stretch techniques. Also see Lying Wall Groin Stretch for similar static stretch.'),(1233,1574,'Keep feet flat on floor and knees pointed same direction as toes. emphasizes Adductor Magnus, ischial fibers by flexing hip.'),(1234,1575,'Keep back straight during stretch. Gracilis is stretched on straight leg.'),(1235,1578,'Abduction stretch is adjusted by turning knob at side. Handles can be adjusted up and down. There is also adjustment that allows knees to bend.'),(1236,1577,'Adductor Magnus is stretched more as torso is lowered as in Seated Adductor Magnus Stretch.'),(1237,1576,'Place hands on hips or keep hand on elevated surface or other stable structure for balance.'),(1238,1579,'Back may be keep straight. Other heads of Hip Adductors can be stretched if legs are positioned out as far as possible.'),(1239,1580,'Other heads of hip adductors may be stretched if knee of upper leg travels out to side during stretch.'),(1240,1581,'Back may be keep straight. Other heads of Hip Adductors can be stretched if legs are positioned out as far as possible as in the Seated Groin Stretch.'),(1241,1582,'None.'),(1242,1583,'Keeping lower leg straight keeps pelvis from tilting so upper knee does not have to come back as far. Gluteus Maximus is stretched if hips are slightly external rotated. Piriformis and Quadratus Femoris become stretched if hip is slightly transversely adducted (knee toward opposite side of chest).'),(1243,1584,'Other heads of hip adductors can be stretched if knee of upper leg travels out to side during stretch.'),(1244,1585,'Position rack just below lowest range of motion. Calf block should be positioned so safety bar is close to but does not make contact with rack. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch. See Calf Exercise Analyses.'),(1245,1586,'Notice barbell makes contact with only non-painted surface (plastic or metal surface). Exercise step that will not overturn can be used as calf block. Position rack just below lowest range of motion. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch. See Calf Exercise Analyses.'),(1246,1587,'Chain may be used to add length to cable so belt can be more easily attached to cable as long as it is short enough to allow full range of motion. Exercise step that will not overturn can be used as calf block. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch.\n\n\nSee Calf Exercise Analyses. Also see same movement performed on slightly different apparatus, Lever Standing Calf Raise (belt loaded).'),(1247,1588,'Calf block or exercise step that will not overturn can be used as platform. Keep knee straight throughout exercise or bend knee slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch. See Calf Exercise Analyses.'),(1248,1589,'A short chain may be used to add length to cable so belt can be more easily attached to cable as long as it is short enough to allow full range of motion. Calf block or exercise step that will not overturn can be used as platform. A short chain may be used, so belt can be more easily attached to cable as long as it is short enough to allow full range of motion. Keep knee straight throughout exercise or bend knee slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch. See Calf Exercise Analyses.'),(1249,1590,'Exercise step that will not overturn can be used as calf block. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knee is bent slightly during stretch. Use lighter load if you need to assist with hands used for support or use both feet. See Calf Exercise Analyses.'),(1250,1591,'Exercise step that will not overturn can be used as calf block. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch. If holding heavy dumbbell becomes too difficult, try single leg calf raise. See Calf Exercise Analyses.'),(1251,1592,'Reposition stance if feet slip. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch. See Calf Exercise Analyses.'),(1252,1593,'Position seat to allow full range of motion. Reposition stance if feet slip. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch. Also known as Rotary Calf Extension. See Calf Exercise Analyses.'),(1253,1594,'Position lever just below lowest range of motion. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch. See Calf Exercise Analyses.'),(1254,1595,'When finished, place feet back on platform, engage dock lever (if it automatically disengaged), and lower seat to original position. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch.\n\n\nSee Calf Exercise Analyses.'),(1255,1596,'Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch. See Calf Exercise Analyses.'),(1256,1597,'Position seat back yet not so far that lever bottoms out during stretch. Reposition stance if feet slip. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch. See Calf Exercise Analyses.'),(1257,1598,'Position seat to allow full range of motion. Reposition stance if feet slip. Keep knees straight throughout exercise or bend knees slightly only during stretch (as shown). Quadriceps serve as synergists muscle if knees are bent slightly during stretch. See Calf Exercise Analyses.'),(1258,1599,'If available, position lever or chain just below lowest range of motion. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch. See Calf Exercise Analyses.'),(1259,1600,'When finished, place feet back on platform, engage dock lever (if it automatically disengaged), and lower seat to original position. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch. See Calf Exercise Analyses.'),(1260,1601,'Position lever just below lowest range of motion. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch. See Calf Exercise Analyses.'),(1261,1603,'Position seat back yet not so far that weight bottoms out (weight stack hits bottom) during stretch. Reposition stance if feet slip. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch. See Calf Exercise Analyses.'),(1262,1602,'Position seat to allow full range of motion. Reposition stance if feet slip. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch. See Calf Exercise Analyses. Also see Lever Alternating Bent Knee Calf Extension.'),(1263,1604,'Position seat to allow full range of motion. Reposition stance if feet slip. Keep knees straight throughout exercise or bend knees slightly only during stretch (as shown). Quadriceps serve as synergists muscle if knees are bent slightly during stretch. See Calf Exercise Analyses.'),(1264,1605,'If possible, position lever just below lowest range of motion. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch. See Calf Exercise Analyses.'),(1265,1606,'Chain with attachment can be preattached to lever so belt can be more easily attached as long as it is short enough to allow full range of motion. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch.\n\n\nSee Calf Exercise Analyses. Also see same movement performed on slightly different apparatus, Cable Standing Calf Raise.'),(1266,1607,'Lower weight back into starting position if feet slip. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch. Exercise can also be performed with Simultaneous Extension. See Calf Exercise Analyses.'),(1267,1608,'Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch. Also known as Sled Donkey Calf Raise. See Calf Exercise Analyses.'),(1268,1609,'Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch. Also known as Sled Donkey Calf Raise. See Calf Exercise Analyses.'),(1269,1610,'If possible, position lever just below lowest range of motion. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch. See Calf Exercise Analyses.'),(1270,1611,'Position upper pad just below lowest range of motion. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch. See Calf Exercise Analyses.'),(1271,1612,'Not all Hack Squat machines have platform with opened lower end allowing for this movement, but some platforms may accommodate calf block, see example. Disengage docking lever if it impedes movements. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergist muscle if knees are bent slightly during stretch. See Calf Exercise Analyses.'),(1272,1613,'Position sled back yet not so far that weight bottoms out during stretch. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergist muscle if knees are bent slightly during stretch. See Calf Exercise Analyses.'),(1273,1614,'If sled bottoms out on dock lever, disengage it to allow full range of motion. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergist muscle if knees are bent slightly during stretch. See Calf Exercise Analyses.'),(1274,1615,'Reposition stance if feet slip. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch. Movement can also be performed on Bilateral 45° Leg Press apparatus. See Calf Exercise Analyses.'),(1275,1616,'Position seat back yet not so far that weight bottoms out during stretch. Reposition stance if feet slip. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch. See Calf Exercise Analyses.'),(1276,1617,'Reposition stance if feet slip. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch. See Calf Exercise Analyses.'),(1277,1618,'Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch. Also see alternative form: Standing Calf Pop-ups involving Quadriceps. See Calf Exercise Analyses.'),(1278,1619,'Position smith bar just below lowest range of motion. Weight can be loaded with or without bar catch engaged. In event bar catch obstructs movement mid-set, reach back with one hand and rotate bar to move bar catch out of way. If this is not possible, lower weight, adjust catch, and start again. When set has been completed lower bar to safety catch by bending knees. Make certain both safety catches are secure before each set.'),(1279,1620,'Position sled just below lowest range of motion. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch. Also see exercise on alternative apparatus with back pad. See Calf Exercise Analyses.'),(1280,1621,'Keep knee straight throughout exercise or bend knee slightly only during stretch. Quadriceps serve as synergists muscle if knee is bent slightly during stretch. Use lighter load if you need to assist with hands used for support. See Calf Exercise Analyses.'),(1281,1623,'Torso should be approximately parallel to floor. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as Synergists muscle if knees are bent slightly during stretch. Exercise is more challenging with training partner toward hips sitting upright. Also, training partner can hold additional weight in arms. See Calf Exercise Analyses.'),(1282,1622,'Sled can be positioned just below lowest range of motion. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch. See Calf Exercise Analyses.'),(1283,1624,'Exercise step that will not overturn can be used as calf block. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch. See Calf Exercise Analyses.'),(1284,1625,'Keep knee straight throughout exercise or bend knee slightly only during stretch. Quadriceps serve as synergists muscle if knee is bent slightly during stretch. See Calf Exercise Analyses.'),(1285,1626,'Although angle of ankles increase as hands travel closer to feet (requiring less ankle/Gastrocnemius flexibility), angle of hips decreases (requiring more hip/Hamstrings flexibility). As hamstrings are stretched through hip, they pull on gastrocnemius due to intertwining contact hamstrings have on gastrocnemius behind knee.'),(1286,1627,'None.'),(1287,1628,'Keep knee straight throughout exercise or bend knee slightly only during stretch. Quadriceps serve as synergists muscle if knee is bent slightly during stretch. Clip shows use of pulling assistance from high support. If support is lower, assist by pushing on support.\n\n\nSee Calf Exercise Analyses. Also see technique with assistance from opposite leg.'),(1288,1629,'Keep knee of exercised leg straight throughout exercise. On assisting leg, keep ankle high and only assist minimal, just enough to raise body in a steady motion. See Calf Exercise Analyses.\n\n\nAlso see technique with assistance from upper body.'),(1289,1630,'Keep knee of rear leg straight and both feet flat on floor. Keep upper body upright. Experiment with positioning feet further apart so minimum bending of forward knee is required.'),(1290,1631,'Keep knee straight throughout exercise or bend knee slightly only during stretch. Quadriceps serve as synergists muscle if knee is bent slightly during stretch.'),(1291,1632,'Soleus may also be stretched in forward bent leg if it is placed far enough back to be sufficiently stretched.'),(1292,1633,'None.'),(1293,1634,'None'),(1294,1635,'Opposite leg may be keep bent or straight off to side.'),(1295,1636,'This machine design is very rare in comparison to Lever Seated Calf Raise machine. This particular machine was missing its adjustable leg pad so fists were placed between legs and cross bar. Movement is predominately Soleus. Gastrocnemius are in active insufficiency since knees are significantly bent. See Calf Exercise Analyses.'),(1296,1637,'Slide forward to edge of bench and rack safety bar when finished. See suggested mount & dismount. Movement is predominately Soleus. Gastrocnemius are in active insufficiency since knees are significantly bent. See Calf Exercise Analyses.'),(1297,1638,'Movement is predominately Soleus. Gastrocnemius are in active insufficiency since knees are significantly bent. See Calf Exercise Analyses.'),(1298,1639,'Keep both feet flat on floor. Upper body may be keep upright. Experiment with positioning feet further apart so minimum bending of knees are required.'),(1299,1640,'Keep knee of stretched leg bent.'),(1300,1642,'Movement is predominately Soleus. Gastrocnemius are in active insufficiency since knees are significantly bent. See Calf Exercise Analyses.'),(1301,1641,'Position seat to allow full range of motion. Gastrocnemius act as dynamic stabilizers because when they \'contract\' at ankle they are simultaneously \'stretched\' at knee. It could be argued they also act as synergist since bend at knee could be considered relatively smaller range of motion as compared to ankle articulation resulting in net contraction of Gastrocnemius. See Calf Exercise Analyses. Also see Lever Alternating Seated Calf Extension with straight knee.'),(1302,1643,'Safety stops can be used to support bar at lowest position, particularly if it is difficult to rack bar to original height. If possible, adjust height of bench or calf block so thigh is close to horizontal. Movement is predominately Soleus. Gastrocnemius are in active insufficiency since knees are significantly bent. See Calf Exercise Analyses.'),(1303,1644,'Soleus may also be stretched in forward bent leg if it is placed far enough back to be sufficiently stretched.'),(1304,1645,'None.'),(1305,1646,'Movement is predominately Soleus. Gastrocnemius are in active insufficiency since knees are significantly bent. See mount and dismount and\n\n\nCalf Exercise Analyses.'),(1306,1647,'None.'),(1307,1648,'Keep foot flat on floor.'),(1308,1649,'None.'),(1309,1650,'Opposite leg may be keep bent or straight off to side. Also see similar exercise Seated Plantar Fascia Stretch.'),(1310,1651,'Opposite leg may be keep bent or straight off to side.'),(1311,1652,'A short chain may be used to add length to cable so belt can be more easily attached to cable as long as it is short enough to allow full range of motion. Calf block or exercise step that will not overturn can be used as platform. Keep knees and hips straight throughout exercise. The exercise can be made more difficult by positioning heels closer to edge of platform. See Dorsal Flexor Calf Exercise Analyses.'),(1312,1653,'Throughout exercise, keep knees and hips straight and support barbell against verticals with both hands to sides. The exercise can be made more difficult by positionin\n\n\ng heels closer to edge of platform. Notice barbell makes contact with only non-painted surface (plastic or metal surface). See Dorsal Flexor Calf Exercise Analyses.'),(1313,1654,'Keep knee and hip straight throughout exercise. Exercise can be made more difficult by positioning heels closer to edge of platform. If you need to assist with hands used for support, use lighter load (or no weight), or both feet, or position heels more on platform. See Dorsal Flexor Calf Exercise Analyses.'),(1314,1656,'When finished, engage dock lever (if it automatically disengaged), and lower seat to original position. Feet should be place highest position that still allows forefeet to make contact with platform. Keep knees straight throughout exercise. Exercise is performed on apparatus design to perform Hack Press. Also see similar movement performed on Sled Donkey Calf Machine. See Dorsal Flexor Calf Exercise Analyses.'),(1315,1655,'Care must be taken to avoid heels from slipping off platform. Begin with very light weight to insure shoes have adequate traction. Keep knees straight throughout exercise. See Dorsal Flexor Calf Exercise Analyses.'),(1316,1658,'A short chain may be used to add length to cable so belt can be more easily attached to cable as long as it is short enough to allow full range of motion. Calf block or exercise step that will not overturn can be used as platform. Keep knees and hips straight throughout exercise. The exercise can be made more difficult by positioning heels closer to edge of platform. See Dorsal Flexor Calf Exercise Analyses.'),(1317,1657,'Position rack just below lowest range of motion. Calf block should be positioned so safety bar is close to but does not make contact with rack. Keep knees and hips straight throughout exercise. See Dorsal Flexor Calf Exercise Analyses.'),(1318,1659,'Keep knees and hips straight throughout exercise. The exercise can be made more difficult by using only one leg or positioning heels closer to edge of platform. If you need to assist with hands used for support, use lighter load (or no weight), or position heels more on platform. See Dorsal Flexor Calf Exercise Analyses.'),(1319,1660,'Feet may be moved up higher on platform if bottom of forefoot can still remain on platform with knees straight and back of hips can remain on back pad. The angle of back pad may be lowered back to keep back of hips on lower portion of back pad. Keep knees straight throughout exercise. See Dorsal Flexor Calf Exercise Analyses.'),(1320,1661,'Feet may be moved up higher on platform if bottom of forefoot can still contact platform with knees straight. Bring feet no further forward than back half of feet remaining on platform. Keep knees and hips straight throughout exercise. See Dorsal Flexor Calf Exercise Analyses.'),(1321,1662,'Keep knees and hips straight throughout exercise. The exercise can be made more difficult by positioning heels closer to edge of platform as well as adding weight. See Dorsal Flexor Calf Exercise Analyses.'),(1322,1663,'Care must be taken to avoid heels from slipping off platform. Begin with very light weight to insure shoes have adequate traction. Keep knees straight throughout exercise. See Dorsal Flexor Calf Exercise Analyses.'),(1323,1664,'Often bending significantly at hips as shown in Sled Reverse Donkey Calf Raise typically reduces range of motion at ankle during dorsal flexion. Position torso more upright as shown, effectively reduces bend at hip. See Dorsal Flexor Calf Exercise Analyses.'),(1324,1665,'Avoid using other muscles to push pedal down with heels as lever is lifted. Insure full range of motion is practiced. In starting lower position, scoot back on bench just slightly until full planter flexion is felt. Establish range of motion criteria for highest position. See Dorsal Flexor Calf Exercise Analyses.'),(1325,1667,'Avoid using other muscles to push pedal down with heel as lever is lifted. Insure full range of motion is practiced. In starting lower position, scoot back on bench just slightly until full planter flexion is felt. Establish range of motion criteria for highest position. See Dorsal Flexor Calf Exercise Analyses.'),(1326,1666,'Keep knees and hips straight throughout exercise. The exercise can be made more difficult by positioning heels closer to edge of platform. See Dorsal Flexor Calf Exercise Analyses.'),(1327,1668,'Keep knees straight throughout exercise. Also known as Sled Donkey Reverse Calf Raise. Also see movement performed on Sled Hack Press. See Dorsal Flexor Calf Exercise Analyses.'),(1328,1669,'Avoid pushing pedal down with heel as lever is lifted. Insure full range of motion is practiced. In starting lower position, lean back slightly until full planter flexion is felt. Establish range of motion criteria for highest position. Also see close up view. See Dorsal Flexor Calf Exercise Analyses.'),(1329,1671,'Feet may be moved up higher on platform if bottom of forefoot can still remain on platform with knees straight and back of hips can remain on back pad. The angle of back pad may be lowered back to keep back of hips on lower portion of back pad. Keep knees straight throughout exercise. See Dorsal Flexor Calf Exercise Analyses.'),(1330,1672,'Feet may be moved up higher on platform if bottom of forefoot can still contact platform with knees straight and back of hips can remain on back pad. The angle of back pad may be lowered back to keep back of hips on lower portion of back pad. Keep knees straight throughout exercise. Also see on alternative machine. See Dorsal Flexor Calf Exercise Analyses.'),(1331,1670,'Keep knees straight throughout exercise. Also known as Sled Donkey Reverse Calf Raise. Also see movement performed on Sled Hack Press. See Dorsal Flexor Calf Exercise Analyses.'),(1332,1674,'Feet may be moved up higher on platform if bottom of forefoot can still remain on platform with knees straight. Keep knees straight throughout exercise. See Dorsal Flexor Calf Exercise Analyses.'),(1333,1673,'Often bending at the hip typically reduces range of motion at ankle during dorsal flexion. Two remedies include: (1) end knees slightly, (2) position torso more upright supported by extended arms, effectively reducing bend at hip as shown with Lever Reverse Donkey Calf Raise. In this last case, Triceps Brachii would act as stabilizer. See Dorsal Flexor Calf Exercise Analyses.'),(1334,1675,'Feet should be place highest position that still allows forefeet to make contact with platform. Keep knees straight throughout exercise. Exercise is performed on apparatus design to perform Hack Press. Also see similar movement performed on Sled Donkey Calf Machine. See Dorsal Flexor Calf Exercise Analyses.'),(1335,1676,'Feet may be moved up higher on platform if bottom of forefoot can still remain on platform with knees straight. Keep knees straight throughout exercise. Dock levers may not need to be released depending on machine model and body height. See Dorsal Flexor Calf Exercise Analyses.'),(1336,1677,'Keep knees and hips straight throughout exercise. The exercise can be made more difficult by positioning heels closer to edge of platform. See Dorsal Flexor Calf Exercise Analyses.'),(1337,1680,'Throughout exercise, keep knees and hips straight. The exercise can be made more difficult by positioning heels closer to edge of platform. See Dorsal Flexor Calf Exercise Analyses.'),(1338,1678,'If sled bottoms out on dock lever, disengage it to allow full range of motion. Feet may be moved up higher on platform if bottom of forefoot can still remain on platform with knees straight. Keep knees straight throughout exercise. See Dorsal Flexor Calf Exercise Analyses.'),(1339,1679,'Keep knees and hips straight throughout exercise. The exercise can be made more difficult by positioning heels closer to edge of platform. See Dorsal Flexor Calf Exercise Analyses.'),(1340,1681,'Keep knees and hips straight throughout exercise. See Dorsal Flexor Calf Exercise Analyses.'),(1341,1682,'Feet may be moved up higher on platform if bottom of forefoot can still remain on platform with knees straight and back of hips can remain on back pad. The angle of back pad may be lowered back to keep back of hips on lower portion of back pad. See Dorsal Flexor Calf Exercise Analyses.'),(1342,1684,'None.'),(1343,1683,'See Standing Quadriceps Stretch for similar exercise which can be combined with this stretch and performed simultaneously.'),(1344,1685,'Do not allow feet to wing out and do not sit between ankles. Certain knee problems maybe aggravated by this stretch.'),(1345,1686,'See Lying (side) Quadriceps Stretch for similar exercise which can be combined with this stretch and performed simultaneously.'),(1346,1687,'Keep knee and hip straight throughout exercise. Exercise can be made more difficult by positioning heels closer to edge of platform. See Dorsal Flexor Calf Exercise Analyses.'); -/*!40000 ALTER TABLE `exercise_comment` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `exercise_related_classification` --- - -DROP TABLE IF EXISTS `exercise_related_classification`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `exercise_related_classification` ( - `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'The ID of exercise related classification.', - `exercise_id` bigint unsigned NOT NULL COMMENT 'The ID of exercise.', - `exercise_classification_id` bigint unsigned NOT NULL COMMENT 'The exercise classification ID.', - `related_classification_type` tinyint NOT NULL COMMENT '1 - Utility, 2 - Mechanics, 3 - Force', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=3809 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Exercise Related Classification.\n\nRelationship:\nOne exercise usually mapping to 3 types of exercise classification.\nAnd one exercise can have more than one specific type of classification.\n\nFor example:\nOne exercise can have 2 records whose types are both Utility.'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `exercise_related_classification` --- - -LOCK TABLES `exercise_related_classification` WRITE; -/*!40000 ALTER TABLE `exercise_related_classification` DISABLE KEYS */; -INSERT INTO `exercise_related_classification` VALUES (1,4,2,1),(2,4,4,2),(3,4,9,3),(4,1,1,1),(5,1,2,1),(6,1,4,2),(7,1,9,3),(8,3,1,1),(9,3,2,1),(10,3,4,2),(11,3,9,3),(12,2,1,1),(13,2,2,1),(14,2,4,2),(15,2,9,3),(16,5,2,1),(17,5,4,2),(18,5,9,3),(19,6,2,1),(20,6,4,2),(21,6,9,3),(22,7,2,1),(23,7,4,2),(24,7,9,3),(25,8,1,1),(26,8,2,1),(27,8,4,2),(28,8,9,3),(29,9,1,1),(30,9,2,1),(31,9,4,2),(32,9,9,3),(33,10,1,1),(34,10,2,1),(35,10,4,2),(36,10,9,3),(37,11,2,1),(38,11,4,2),(39,11,9,3),(40,13,2,1),(41,13,4,2),(42,13,9,3),(43,15,1,1),(44,15,2,1),(45,15,4,2),(46,15,9,3),(47,16,1,1),(48,16,2,1),(49,16,4,2),(50,16,8,3),(51,16,9,3),(52,17,1,1),(53,17,2,1),(54,17,4,2),(55,17,8,3),(56,17,9,3),(57,18,2,1),(58,18,4,2),(59,18,9,3),(60,19,1,1),(61,19,2,1),(62,19,4,2),(63,19,9,3),(64,20,1,1),(65,20,2,1),(66,20,4,2),(67,20,9,3),(68,21,1,1),(69,21,2,1),(70,21,4,2),(71,21,9,3),(72,22,1,1),(73,22,2,1),(74,22,4,2),(75,22,9,3),(76,23,1,1),(77,23,2,1),(78,23,4,2),(79,23,9,3),(80,26,1,1),(81,26,2,1),(82,26,4,2),(83,26,9,3),(84,25,1,1),(85,25,2,1),(86,25,4,2),(87,25,9,3),(88,24,1,1),(89,24,2,1),(90,24,4,2),(91,24,9,3),(92,27,2,1),(93,27,4,2),(94,27,9,3),(95,29,1,1),(96,29,2,1),(97,29,4,2),(98,29,9,3),(99,32,2,1),(100,32,4,2),(101,32,9,3),(102,33,1,1),(103,33,3,2),(104,33,8,3),(105,34,2,1),(106,34,4,2),(107,34,8,3),(108,35,1,1),(109,35,3,2),(110,35,8,3),(111,36,2,1),(112,36,4,2),(113,36,8,3),(114,37,1,1),(115,37,3,2),(116,37,8,3),(117,38,1,1),(118,38,3,2),(119,38,8,3),(120,40,1,1),(121,40,3,2),(122,40,8,3),(123,39,1,1),(124,39,3,2),(125,39,8,3),(126,42,2,1),(127,42,4,2),(128,42,8,3),(129,41,1,1),(130,41,3,2),(131,41,8,3),(132,43,2,1),(133,43,4,2),(134,43,8,3),(135,44,2,1),(136,44,4,2),(137,44,8,3),(138,45,2,1),(139,45,4,2),(140,45,8,3),(141,47,2,1),(142,47,4,2),(143,47,8,3),(144,46,1,1),(145,46,2,1),(146,46,3,2),(147,46,8,3),(148,48,2,1),(149,48,4,2),(150,48,8,3),(151,49,1,1),(152,49,2,1),(153,49,3,2),(154,49,8,3),(155,50,1,1),(156,50,2,1),(157,50,3,2),(158,50,8,3),(159,51,2,1),(160,51,4,2),(161,51,8,3),(162,52,2,1),(163,52,4,2),(164,52,8,3),(165,53,1,1),(166,53,2,1),(167,53,3,2),(168,53,8,3),(169,54,1,1),(170,54,3,2),(171,54,8,3),(172,55,1,1),(173,55,3,2),(174,55,8,3),(175,56,1,1),(176,56,3,2),(177,56,8,3),(178,57,1,1),(179,57,3,2),(180,57,8,3),(181,59,1,1),(182,59,2,1),(183,59,3,2),(184,59,8,3),(185,58,1,1),(186,58,3,2),(187,58,8,3),(188,60,2,1),(189,60,4,2),(190,60,8,3),(191,61,1,1),(192,61,3,2),(193,61,8,3),(194,62,1,1),(195,62,3,2),(196,62,8,3),(197,63,1,1),(198,63,2,1),(199,63,3,2),(200,63,8,3),(201,64,1,1),(202,64,3,2),(203,64,8,3),(204,65,1,1),(205,65,3,2),(206,65,8,3),(207,66,1,1),(208,66,3,2),(209,66,8,3),(210,67,1,1),(211,67,3,2),(212,67,8,3),(213,68,1,1),(214,68,3,2),(215,68,8,3),(216,69,1,1),(217,69,3,2),(218,69,8,3),(219,70,1,1),(220,70,3,2),(221,70,8,3),(222,71,1,1),(223,71,3,2),(224,71,8,3),(225,72,1,1),(226,72,3,2),(227,72,8,3),(228,73,1,1),(229,73,3,2),(230,73,8,3),(231,77,1,1),(232,77,3,2),(233,77,8,3),(234,78,1,1),(235,78,3,2),(236,78,8,3),(237,79,2,1),(238,79,4,2),(239,79,8,3),(240,81,1,1),(241,81,2,1),(242,81,4,2),(243,81,9,3),(244,82,1,1),(245,82,3,2),(246,82,9,3),(247,83,1,1),(248,83,2,1),(249,83,4,2),(250,83,9,3),(251,84,1,1),(252,84,3,2),(253,84,9,3),(254,86,1,1),(255,86,3,2),(256,86,9,3),(257,87,1,1),(258,87,3,2),(259,87,9,3),(260,85,1,1),(261,85,2,1),(262,85,4,2),(263,85,9,3),(264,88,1,1),(265,88,3,2),(266,88,9,3),(267,89,1,1),(268,89,2,1),(269,89,3,2),(270,89,9,3),(271,90,1,1),(272,90,3,2),(273,90,9,3),(274,91,1,1),(275,91,2,1),(276,91,4,2),(277,91,9,3),(278,92,2,1),(279,92,4,2),(280,92,9,3),(281,93,2,1),(282,93,4,2),(283,93,9,3),(284,95,1,1),(285,95,3,2),(286,95,9,3),(287,94,2,1),(288,94,4,2),(289,94,9,3),(290,96,2,1),(291,96,4,2),(292,96,9,3),(293,97,2,1),(294,97,4,2),(295,97,9,3),(296,98,1,1),(297,98,3,2),(298,98,9,3),(299,99,1,1),(300,99,2,1),(301,99,4,2),(302,99,9,3),(303,100,2,1),(304,100,4,2),(305,100,9,3),(306,101,2,1),(307,101,4,2),(308,101,9,3),(309,102,1,1),(310,102,3,2),(311,102,9,3),(312,103,1,1),(313,103,3,2),(314,103,9,3),(315,104,1,1),(316,104,3,2),(317,104,9,3),(318,105,1,1),(319,105,3,2),(320,105,9,3),(321,106,1,1),(322,106,2,1),(323,106,4,2),(324,106,9,3),(325,107,1,1),(326,107,2,1),(327,107,4,2),(328,107,9,3),(329,108,1,1),(330,108,3,2),(331,108,9,3),(332,109,1,1),(333,109,2,1),(334,109,4,2),(335,109,9,3),(336,110,1,1),(337,110,2,1),(338,110,4,2),(339,110,9,3),(340,114,2,1),(341,114,4,2),(342,114,9,3),(343,115,1,1),(344,115,3,2),(345,115,9,3),(346,116,1,1),(347,116,3,2),(348,116,9,3),(349,117,1,1),(350,117,2,1),(351,117,3,2),(352,117,9,3),(353,118,2,1),(354,118,4,2),(355,118,9,3),(356,119,1,1),(357,119,2,1),(358,119,3,2),(359,119,9,3),(360,120,2,1),(361,120,4,2),(362,120,9,3),(363,121,2,1),(364,121,4,2),(365,121,9,3),(366,122,2,1),(367,122,4,2),(368,122,9,3),(369,123,1,1),(370,123,2,1),(371,123,3,2),(372,123,9,3),(373,124,1,1),(374,124,2,1),(375,124,3,2),(376,124,9,3),(377,125,2,1),(378,125,4,2),(379,125,9,3),(380,126,1,1),(381,126,2,1),(382,126,3,2),(383,126,9,3),(384,127,2,1),(385,127,3,2),(386,127,9,3),(387,128,1,1),(388,128,2,1),(389,128,3,2),(390,128,9,3),(391,129,2,1),(392,129,4,2),(393,129,9,3),(394,130,2,1),(395,130,4,2),(396,130,9,3),(397,131,1,1),(398,131,2,1),(399,131,3,2),(400,131,9,3),(401,132,2,1),(402,132,4,2),(403,132,9,3),(404,133,1,1),(405,133,2,1),(406,133,3,2),(407,133,9,3),(408,134,2,1),(409,134,4,2),(410,134,9,3),(411,135,2,1),(412,135,3,2),(413,135,9,3),(414,136,2,1),(415,136,3,2),(416,136,9,3),(417,137,2,1),(418,137,3,2),(419,137,9,3),(420,138,2,1),(421,138,4,2),(422,138,9,3),(423,139,2,1),(424,139,4,2),(425,139,9,3),(426,140,1,1),(427,140,2,1),(428,140,3,2),(429,140,9,3),(430,141,1,1),(431,141,2,1),(432,141,3,2),(433,141,9,3),(434,142,2,1),(435,142,4,2),(436,142,9,3),(437,144,2,1),(438,144,4,2),(439,144,9,3),(440,145,2,1),(441,145,4,2),(442,145,9,3),(443,143,1,1),(444,143,2,1),(445,143,3,2),(446,143,9,3),(447,147,2,1),(448,147,4,2),(449,147,9,3),(450,148,2,1),(451,148,4,2),(452,148,9,3),(453,149,1,1),(454,149,2,1),(455,149,3,2),(456,149,9,3),(457,151,2,1),(458,151,4,2),(459,151,9,3),(460,150,2,1),(461,150,4,2),(462,150,9,3),(463,152,1,1),(464,152,2,1),(465,152,3,2),(466,152,9,3),(467,155,2,1),(468,155,4,2),(469,155,9,3),(470,153,2,1),(471,153,4,2),(472,153,9,3),(473,154,2,1),(474,154,4,2),(475,154,9,3),(476,156,2,1),(477,156,4,2),(478,156,9,3),(479,157,2,1),(480,157,4,2),(481,157,9,3),(482,158,1,1),(483,158,2,1),(484,158,3,2),(485,158,9,3),(486,159,1,1),(487,159,2,1),(488,159,3,2),(489,159,9,3),(490,160,1,1),(491,160,2,1),(492,160,3,2),(493,160,9,3),(494,162,2,1),(495,162,3,2),(496,162,9,3),(497,163,1,1),(498,163,2,1),(499,163,3,2),(500,163,9,3),(501,167,2,1),(502,167,4,2),(503,167,9,3),(504,168,2,1),(505,168,4,2),(506,168,9,3),(507,169,2,1),(508,169,4,2),(509,169,9,3),(510,170,2,1),(511,170,4,2),(512,170,9,3),(513,171,2,1),(514,171,4,2),(515,171,9,3),(516,172,1,1),(517,172,3,2),(518,172,8,3),(519,173,1,1),(520,173,3,2),(521,173,8,3),(522,174,1,1),(523,174,3,2),(524,174,8,3),(525,175,1,1),(526,175,3,2),(527,175,8,3),(528,176,1,1),(529,176,4,2),(530,176,8,3),(531,177,1,1),(532,177,2,1),(533,177,3,2),(534,177,8,3),(535,179,1,1),(536,179,4,2),(537,179,8,3),(538,178,1,1),(539,178,4,2),(540,178,8,3),(541,180,1,1),(542,180,2,1),(543,180,4,2),(544,180,8,3),(545,181,1,1),(546,181,4,2),(547,181,8,3),(548,182,1,1),(549,182,2,1),(550,182,4,2),(551,182,8,3),(552,183,2,1),(553,183,4,2),(554,183,8,3),(555,184,1,1),(556,184,4,2),(557,184,8,3),(558,185,1,1),(559,185,2,1),(560,185,4,2),(561,185,8,3),(562,186,1,1),(563,186,4,2),(564,186,8,3),(565,187,1,1),(566,187,2,1),(567,187,4,2),(568,187,8,3),(569,188,1,1),(570,188,4,2),(571,188,8,3),(572,189,1,1),(573,189,2,1),(574,189,4,2),(575,189,8,3),(576,190,1,1),(577,190,2,1),(578,190,4,2),(579,190,8,3),(580,191,1,1),(581,191,2,1),(582,191,4,2),(583,191,8,3),(584,192,2,1),(585,192,4,2),(586,192,8,3),(587,193,2,1),(588,193,4,2),(589,193,8,3),(590,194,2,1),(591,194,4,2),(592,194,8,3),(593,195,2,1),(594,195,4,2),(595,195,8,3),(596,196,1,1),(597,196,2,1),(598,196,4,2),(599,196,8,3),(600,197,2,1),(601,197,4,2),(602,197,8,3),(603,198,2,1),(604,198,4,2),(605,198,8,3),(606,200,1,1),(607,200,3,2),(608,200,8,3),(609,199,2,1),(610,199,4,2),(611,199,8,3),(612,201,1,1),(613,201,2,1),(614,201,4,2),(615,201,8,3),(616,202,2,1),(617,202,4,2),(618,202,8,3),(619,203,1,1),(620,203,2,1),(621,203,4,2),(622,203,8,3),(623,204,1,1),(624,204,2,1),(625,204,4,2),(626,204,8,3),(627,205,2,1),(628,205,4,2),(629,205,8,3),(630,206,2,1),(631,206,4,2),(632,206,8,3),(633,207,1,1),(634,207,2,1),(635,207,4,2),(636,207,8,3),(637,208,2,1),(638,208,4,2),(639,208,8,3),(640,209,1,1),(641,209,2,1),(642,209,4,2),(643,209,8,3),(644,210,1,1),(645,210,2,1),(646,210,4,2),(647,210,8,3),(648,211,1,1),(649,211,3,2),(650,211,8,3),(651,212,1,1),(652,212,3,2),(653,212,8,3),(654,213,1,1),(655,213,2,1),(656,213,4,2),(657,213,8,3),(658,214,1,1),(659,214,2,1),(660,214,4,2),(661,214,8,3),(662,215,1,1),(663,215,2,1),(664,215,4,2),(665,215,8,3),(666,216,1,1),(667,216,2,1),(668,216,4,2),(669,216,8,3),(670,217,1,1),(671,217,3,2),(672,217,8,3),(673,218,1,1),(674,218,2,1),(675,218,4,2),(676,218,8,3),(677,219,1,1),(678,219,3,2),(679,219,8,3),(680,220,1,1),(681,220,3,2),(682,220,8,3),(683,222,1,1),(684,222,2,1),(685,222,3,2),(686,222,8,3),(687,223,1,1),(688,223,2,1),(689,223,4,2),(690,223,8,3),(691,224,1,1),(692,224,2,1),(693,224,4,2),(694,224,8,3),(695,225,1,1),(696,225,3,2),(697,225,8,3),(698,226,1,1),(699,226,3,2),(700,226,8,3),(701,228,1,1),(702,228,3,2),(703,228,8,3),(704,229,1,1),(705,229,2,1),(706,229,3,2),(707,229,8,3),(708,230,1,1),(709,230,3,2),(710,230,8,3),(711,231,1,1),(712,231,3,2),(713,231,8,3),(714,232,1,1),(715,232,3,2),(716,232,8,3),(717,233,1,1),(718,233,3,2),(719,233,8,3),(720,234,1,1),(721,234,3,2),(722,234,8,3),(723,235,1,1),(724,235,3,2),(725,235,8,3),(726,236,1,1),(727,236,3,2),(728,236,8,3),(729,237,1,1),(730,237,3,2),(731,237,8,3),(732,238,1,1),(733,238,3,2),(734,238,8,3),(735,240,1,1),(736,240,3,2),(737,240,8,3),(738,241,1,1),(739,241,2,1),(740,241,4,2),(741,241,8,3),(742,242,1,1),(743,242,3,2),(744,242,8,3),(745,243,1,1),(746,243,3,2),(747,243,8,3),(748,244,1,1),(749,244,3,2),(750,244,8,3),(751,245,1,1),(752,245,3,2),(753,245,8,3),(754,247,1,1),(755,247,3,2),(756,247,8,3),(757,246,1,1),(758,246,2,1),(759,246,4,2),(760,246,8,3),(761,252,1,1),(762,252,3,2),(763,252,8,3),(764,253,1,1),(765,253,2,1),(766,253,4,2),(767,253,9,3),(768,254,1,1),(769,254,2,1),(770,254,4,2),(771,254,9,3),(772,255,2,1),(773,255,4,2),(774,255,9,3),(775,256,1,1),(776,256,4,2),(777,256,9,3),(778,257,1,1),(779,257,4,2),(780,257,9,3),(781,259,1,1),(782,259,4,2),(783,259,9,3),(784,258,1,1),(785,258,2,1),(786,258,4,2),(787,258,9,3),(788,260,2,1),(789,260,4,2),(790,260,9,3),(791,261,1,1),(792,261,2,1),(793,261,4,2),(794,261,9,3),(795,262,2,1),(796,262,4,2),(797,262,9,3),(798,263,1,1),(799,263,4,2),(800,263,9,3),(801,264,1,1),(802,264,2,1),(803,264,3,2),(804,264,9,3),(805,265,1,1),(806,265,2,1),(807,265,4,2),(808,265,9,3),(809,266,1,1),(810,266,2,1),(811,266,4,2),(812,266,9,3),(813,269,1,1),(814,269,2,1),(815,269,4,2),(816,269,9,3),(817,270,1,1),(818,270,3,2),(819,270,9,3),(820,271,1,1),(821,271,2,1),(822,271,3,2),(823,271,9,3),(824,275,2,1),(825,275,4,2),(826,275,9,3),(827,276,2,1),(828,276,4,2),(829,276,9,3),(830,277,2,1),(831,277,4,2),(832,277,9,3),(833,281,2,1),(834,281,4,2),(835,281,9,3),(836,280,2,1),(837,280,4,2),(838,280,9,3),(839,278,2,1),(840,278,4,2),(841,278,9,3),(842,279,2,1),(843,279,4,2),(844,279,9,3),(845,283,2,1),(846,283,4,2),(847,283,9,3),(848,282,2,1),(849,282,4,2),(850,282,9,3),(851,284,2,1),(852,284,4,2),(853,284,9,3),(854,285,2,1),(855,285,4,2),(856,285,9,3),(857,286,2,1),(858,286,4,2),(859,286,9,3),(860,287,2,1),(861,287,4,2),(862,287,9,3),(863,288,2,1),(864,288,4,2),(865,288,9,3),(866,289,2,1),(867,289,4,2),(868,289,9,3),(869,290,2,1),(870,290,4,2),(871,290,9,3),(872,291,2,1),(873,291,4,2),(874,291,9,3),(875,292,2,1),(876,292,4,2),(877,292,9,3),(878,293,2,1),(879,293,4,2),(880,293,9,3),(881,294,2,1),(882,294,4,2),(883,294,9,3),(884,295,2,1),(885,295,4,2),(886,295,9,3),(887,296,2,1),(888,296,4,2),(889,296,9,3),(890,297,2,1),(891,297,4,2),(892,297,9,3),(893,298,2,1),(894,298,4,2),(895,298,9,3),(896,299,2,1),(897,299,4,2),(898,299,9,3),(899,300,2,1),(900,300,4,2),(901,300,9,3),(902,301,2,1),(903,301,4,2),(904,301,9,3),(905,302,2,1),(906,302,4,2),(907,302,9,3),(908,303,2,1),(909,303,4,2),(910,303,9,3),(911,304,2,1),(912,304,4,2),(913,304,9,3),(914,306,2,1),(915,306,4,2),(916,306,9,3),(917,305,1,1),(918,305,2,1),(919,305,4,2),(920,305,9,3),(921,307,2,1),(922,307,4,2),(923,307,9,3),(924,309,2,1),(925,309,4,2),(926,309,9,3),(927,308,2,1),(928,308,4,2),(929,308,9,3),(930,311,2,1),(931,311,4,2),(932,311,9,3),(933,312,2,1),(934,312,4,2),(935,312,9,3),(936,313,1,1),(937,313,2,1),(938,313,4,2),(939,313,9,3),(940,314,1,1),(941,314,2,1),(942,314,4,2),(943,314,9,3),(944,315,1,1),(945,315,2,1),(946,315,4,2),(947,315,9,3),(948,316,2,1),(949,316,4,2),(950,316,9,3),(951,317,1,1),(952,317,2,1),(953,317,4,2),(954,317,9,3),(955,319,1,1),(956,319,2,1),(957,319,4,2),(958,319,9,3),(959,318,1,1),(960,318,2,1),(961,318,4,2),(962,318,9,3),(963,320,1,1),(964,320,2,1),(965,320,4,2),(966,320,9,3),(967,321,1,1),(968,321,2,1),(969,321,4,2),(970,321,9,3),(971,322,2,1),(972,322,4,2),(973,322,9,3),(974,323,1,1),(975,323,2,1),(976,323,4,2),(977,323,9,3),(978,324,1,1),(979,324,2,1),(980,324,4,2),(981,324,9,3),(982,325,1,1),(983,325,2,1),(984,325,4,2),(985,325,9,3),(986,326,2,1),(987,326,4,2),(988,326,8,3),(989,332,2,1),(990,332,4,2),(991,332,9,3),(992,328,1,1),(993,328,2,1),(994,328,4,2),(995,328,9,3),(996,333,2,1),(997,333,4,2),(998,333,9,3),(999,334,1,1),(1000,334,2,1),(1001,334,4,2),(1002,334,9,3),(1003,335,1,1),(1004,335,2,1),(1005,335,4,2),(1006,335,9,3),(1007,336,2,1),(1008,336,4,2),(1009,336,9,3),(1010,337,1,1),(1011,337,2,1),(1012,337,4,2),(1013,337,9,3),(1014,338,1,1),(1015,338,2,1),(1016,338,4,2),(1017,338,9,3),(1018,339,1,1),(1019,339,2,1),(1020,339,4,2),(1021,339,9,3),(1022,340,2,1),(1023,340,4,2),(1024,340,9,3),(1025,341,1,1),(1026,341,2,1),(1027,341,4,2),(1028,341,9,3),(1029,342,2,1),(1030,342,4,2),(1031,342,9,3),(1032,346,2,1),(1033,346,4,2),(1034,346,8,3),(1035,345,2,1),(1036,345,4,2),(1037,345,8,3),(1038,347,2,1),(1039,347,4,2),(1040,347,8,3),(1041,348,2,1),(1042,348,4,2),(1043,348,8,3),(1044,349,2,1),(1045,349,4,2),(1046,349,8,3),(1047,350,2,1),(1048,350,4,2),(1049,350,9,3),(1050,351,2,1),(1051,351,4,2),(1052,351,9,3),(1053,352,2,1),(1054,352,4,2),(1055,352,9,3),(1056,353,2,1),(1057,353,4,2),(1058,353,9,3),(1059,354,2,1),(1060,354,4,2),(1061,354,9,3),(1062,355,1,1),(1063,355,2,1),(1064,355,3,2),(1065,355,9,3),(1066,356,1,1),(1067,356,2,1),(1068,356,3,2),(1069,356,9,3),(1070,357,1,1),(1071,357,3,2),(1072,357,9,3),(1073,358,1,1),(1074,358,2,1),(1075,358,3,2),(1076,358,9,3),(1077,359,1,1),(1078,359,3,2),(1079,359,9,3),(1080,360,1,1),(1081,360,2,1),(1082,360,3,2),(1083,360,9,3),(1084,362,1,1),(1085,362,2,1),(1086,362,3,2),(1087,362,9,3),(1088,361,1,1),(1089,361,2,1),(1090,361,3,2),(1091,361,9,3),(1092,363,2,1),(1093,363,3,2),(1094,363,9,3),(1095,364,1,1),(1096,364,2,1),(1097,364,3,2),(1098,364,9,3),(1099,365,1,1),(1100,365,2,1),(1101,365,3,2),(1102,365,9,3),(1103,366,1,1),(1104,366,2,1),(1105,366,3,2),(1106,366,9,3),(1107,367,1,1),(1108,367,3,2),(1109,367,9,3),(1110,368,1,1),(1111,368,2,1),(1112,368,3,2),(1113,368,9,3),(1114,369,1,1),(1115,369,2,1),(1116,369,3,2),(1117,369,9,3),(1118,370,1,1),(1119,370,3,2),(1120,370,9,3),(1121,371,1,1),(1122,371,2,1),(1123,371,3,2),(1124,371,9,3),(1125,372,1,1),(1126,372,2,1),(1127,372,3,2),(1128,372,9,3),(1129,373,1,1),(1130,373,3,2),(1131,373,9,3),(1132,374,1,1),(1133,374,2,1),(1134,374,3,2),(1135,374,9,3),(1136,375,1,1),(1137,375,2,1),(1138,375,3,2),(1139,375,9,3),(1140,376,1,1),(1141,376,3,2),(1142,376,9,3),(1143,377,1,1),(1144,377,2,1),(1145,377,3,2),(1146,377,9,3),(1147,378,1,1),(1148,378,3,2),(1149,378,9,3),(1150,379,2,1),(1151,379,3,2),(1152,379,9,3),(1153,380,1,1),(1154,380,3,2),(1155,380,9,3),(1156,381,1,1),(1157,381,3,2),(1158,381,9,3),(1159,382,1,1),(1160,382,2,1),(1161,382,3,2),(1162,382,9,3),(1163,383,1,1),(1164,383,3,2),(1165,383,9,3),(1166,385,1,1),(1167,385,3,2),(1168,385,9,3),(1169,384,1,1),(1170,384,2,1),(1171,384,3,2),(1172,384,9,3),(1173,386,1,1),(1174,386,2,1),(1175,386,3,2),(1176,386,9,3),(1177,387,1,1),(1178,387,3,2),(1179,387,9,3),(1180,389,1,1),(1181,389,2,1),(1182,389,3,2),(1183,389,9,3),(1184,388,1,1),(1185,388,2,1),(1186,388,3,2),(1187,388,9,3),(1188,391,1,1),(1189,391,3,2),(1190,391,9,3),(1191,390,1,1),(1192,390,3,2),(1193,390,9,3),(1194,392,1,1),(1195,392,3,2),(1196,392,9,3),(1197,393,1,1),(1198,393,3,2),(1199,393,9,3),(1200,394,2,1),(1201,394,3,2),(1202,394,9,3),(1203,395,1,1),(1204,395,3,2),(1205,395,9,3),(1206,396,1,1),(1207,396,3,2),(1208,396,9,3),(1209,398,1,1),(1210,398,3,2),(1211,398,9,3),(1212,399,1,1),(1213,399,2,1),(1214,399,3,2),(1215,399,9,3),(1216,401,1,1),(1217,401,3,2),(1218,401,9,3),(1219,403,1,1),(1220,403,2,1),(1221,403,3,2),(1222,403,9,3),(1223,402,1,1),(1224,402,3,2),(1225,402,9,3),(1226,405,1,1),(1227,405,3,2),(1228,405,9,3),(1229,406,1,1),(1230,406,3,2),(1231,406,9,3),(1232,407,1,1),(1233,407,2,1),(1234,407,3,2),(1235,407,9,3),(1236,408,1,1),(1237,408,3,2),(1238,408,9,3),(1239,410,1,1),(1240,410,3,2),(1241,410,9,3),(1242,411,1,1),(1243,411,3,2),(1244,411,9,3),(1245,413,1,1),(1246,413,3,2),(1247,413,9,3),(1248,414,1,1),(1249,414,2,1),(1250,414,3,2),(1251,414,9,3),(1252,412,1,1),(1253,412,2,1),(1254,412,3,2),(1255,412,9,3),(1256,415,1,1),(1257,415,2,1),(1258,415,3,2),(1259,415,9,3),(1260,417,1,1),(1261,417,2,1),(1262,417,3,2),(1263,417,9,3),(1264,419,1,1),(1265,419,2,1),(1266,419,3,2),(1267,419,9,3),(1268,420,1,1),(1269,420,2,1),(1270,420,3,2),(1271,420,9,3),(1272,422,1,1),(1273,422,2,1),(1274,422,3,2),(1275,422,9,3),(1276,423,1,1),(1277,423,2,1),(1278,423,3,2),(1279,423,9,3),(1280,425,2,1),(1281,425,3,2),(1282,425,9,3),(1283,426,2,1),(1284,426,4,2),(1285,426,9,3),(1286,427,1,1),(1287,427,3,2),(1288,427,9,3),(1289,428,1,1),(1290,428,3,2),(1291,428,9,3),(1292,429,1,1),(1293,429,3,2),(1294,429,9,3),(1295,430,1,1),(1296,430,3,2),(1297,430,9,3),(1298,431,1,1),(1299,431,3,2),(1300,431,9,3),(1301,432,1,1),(1302,432,2,1),(1303,432,3,2),(1304,432,9,3),(1305,433,2,1),(1306,433,4,2),(1307,433,9,3),(1308,434,1,1),(1309,434,3,2),(1310,434,9,3),(1311,435,1,1),(1312,435,3,2),(1313,435,9,3),(1314,436,1,1),(1315,436,2,1),(1316,436,3,2),(1317,436,9,3),(1318,437,1,1),(1319,437,2,1),(1320,437,3,2),(1321,437,9,3),(1322,438,1,1),(1323,438,3,2),(1324,438,9,3),(1325,440,2,1),(1326,440,3,2),(1327,440,9,3),(1328,439,1,1),(1329,439,3,2),(1330,439,9,3),(1331,441,1,1),(1332,441,3,2),(1333,441,9,3),(1334,442,1,1),(1335,442,2,1),(1336,442,3,2),(1337,442,9,3),(1338,443,2,1),(1339,443,4,2),(1340,443,9,3),(1341,444,1,1),(1342,444,3,2),(1343,444,9,3),(1344,445,1,1),(1345,445,3,2),(1346,445,9,3),(1347,446,2,1),(1348,446,4,2),(1349,446,9,3),(1350,447,1,1),(1351,447,3,2),(1352,447,9,3),(1353,448,1,1),(1354,448,3,2),(1355,448,9,3),(1356,449,1,1),(1357,449,3,2),(1358,449,9,3),(1359,450,2,1),(1360,450,4,2),(1361,450,9,3),(1362,451,1,1),(1363,451,3,2),(1364,451,9,3),(1365,452,1,1),(1366,452,3,2),(1367,452,9,3),(1368,453,1,1),(1369,453,3,2),(1370,453,9,3),(1371,454,1,1),(1372,454,3,2),(1373,454,9,3),(1374,455,2,1),(1375,455,3,2),(1376,455,9,3),(1377,456,1,1),(1378,456,3,2),(1379,456,9,3),(1380,457,1,1),(1381,457,3,2),(1382,457,9,3),(1383,458,1,1),(1384,458,3,2),(1385,458,9,3),(1386,459,1,1),(1387,459,3,2),(1388,459,9,3),(1389,460,1,1),(1390,460,3,2),(1391,460,9,3),(1392,463,1,1),(1393,463,3,2),(1394,463,9,3),(1395,462,2,1),(1396,462,4,2),(1397,462,9,3),(1398,464,1,1),(1399,464,3,2),(1400,464,9,3),(1401,465,1,1),(1402,465,3,2),(1403,465,9,3),(1404,467,1,1),(1405,467,3,2),(1406,467,9,3),(1407,468,2,1),(1408,468,4,2),(1409,468,9,3),(1410,470,1,1),(1411,470,3,2),(1412,470,9,3),(1413,471,1,1),(1414,471,3,2),(1415,471,9,3),(1416,473,1,1),(1417,473,3,2),(1418,473,9,3),(1419,474,1,1),(1420,474,3,2),(1421,474,9,3),(1422,476,1,1),(1423,476,3,2),(1424,476,9,3),(1425,475,1,1),(1426,475,3,2),(1427,475,9,3),(1428,477,1,1),(1429,477,3,2),(1430,477,9,3),(1431,478,1,1),(1432,478,3,2),(1433,478,9,3),(1434,479,1,1),(1435,479,3,2),(1436,479,9,3),(1437,480,1,1),(1438,480,3,2),(1439,480,9,3),(1440,481,1,1),(1441,481,3,2),(1442,481,9,3),(1443,483,1,1),(1444,483,3,2),(1445,483,9,3),(1446,484,1,1),(1447,484,3,2),(1448,484,9,3),(1449,485,1,1),(1450,485,3,2),(1451,485,9,3),(1452,486,1,1),(1453,486,3,2),(1454,486,9,3),(1455,487,1,1),(1456,487,3,2),(1457,487,9,3),(1458,488,1,1),(1459,488,3,2),(1460,488,9,3),(1461,489,1,1),(1462,489,3,2),(1463,489,9,3),(1464,490,1,1),(1465,490,3,2),(1466,490,9,3),(1467,491,1,1),(1468,491,3,2),(1469,491,9,3),(1470,492,1,1),(1471,492,3,2),(1472,492,9,3),(1473,493,1,1),(1474,493,3,2),(1475,493,9,3),(1476,494,1,1),(1477,494,3,2),(1478,494,9,3),(1479,495,1,1),(1480,495,3,2),(1481,495,9,3),(1482,496,1,1),(1483,496,3,2),(1484,496,9,3),(1485,497,2,1),(1486,497,4,2),(1487,497,9,3),(1488,498,2,1),(1489,498,4,2),(1490,498,8,3),(1491,499,1,1),(1492,499,3,2),(1493,499,9,3),(1494,501,1,1),(1495,501,3,2),(1496,501,9,3),(1497,503,2,1),(1498,503,4,2),(1499,503,8,3),(1500,511,1,1),(1501,511,2,1),(1502,511,4,2),(1503,511,9,3),(1504,513,1,1),(1505,513,4,2),(1506,513,9,3),(1507,512,1,1),(1508,512,4,2),(1509,512,9,3),(1510,514,1,1),(1511,514,4,2),(1512,514,9,3),(1513,515,1,1),(1514,515,4,2),(1515,515,9,3),(1516,517,1,1),(1517,517,2,1),(1518,517,4,2),(1519,517,9,3),(1520,516,1,1),(1521,516,2,1),(1522,516,4,2),(1523,516,9,3),(1524,518,2,1),(1525,518,4,2),(1526,518,9,3),(1527,519,1,1),(1528,519,4,2),(1529,519,9,3),(1530,520,1,1),(1531,520,2,1),(1532,520,4,2),(1533,520,9,3),(1534,521,2,1),(1535,521,4,2),(1536,521,9,3),(1537,522,1,1),(1538,522,4,2),(1539,522,9,3),(1540,523,1,1),(1541,523,4,2),(1542,523,9,3),(1543,527,1,1),(1544,527,4,2),(1545,527,9,3),(1546,524,2,1),(1547,524,4,2),(1548,524,9,3),(1549,526,1,1),(1550,526,4,2),(1551,526,9,3),(1552,525,1,1),(1553,525,4,2),(1554,525,9,3),(1555,528,1,1),(1556,528,2,1),(1557,528,4,2),(1558,528,9,3),(1559,529,1,1),(1560,529,2,1),(1561,529,4,2),(1562,529,9,3),(1563,530,2,1),(1564,530,4,2),(1565,530,9,3),(1566,531,2,1),(1567,531,4,2),(1568,531,9,3),(1569,533,1,1),(1570,533,2,1),(1571,533,4,2),(1572,533,9,3),(1573,536,2,1),(1574,536,4,2),(1575,536,9,3),(1576,537,2,1),(1577,537,4,2),(1578,537,9,3),(1579,538,2,1),(1580,538,4,2),(1581,538,9,3),(1582,539,2,1),(1583,539,4,2),(1584,539,9,3),(1585,541,2,1),(1586,541,4,2),(1587,541,9,3),(1588,540,2,1),(1589,540,4,2),(1590,540,9,3),(1591,542,2,1),(1592,542,4,2),(1593,542,9,3),(1594,543,2,1),(1595,543,4,2),(1596,543,9,3),(1597,544,2,1),(1598,544,4,2),(1599,544,9,3),(1600,546,2,1),(1601,546,4,2),(1602,546,9,3),(1603,552,2,1),(1604,552,4,2),(1605,552,9,3),(1606,553,2,1),(1607,553,4,2),(1608,553,9,3),(1609,554,2,1),(1610,554,4,2),(1611,554,9,3),(1612,555,2,1),(1613,555,4,2),(1614,555,9,3),(1615,556,2,1),(1616,556,4,2),(1617,556,9,3),(1618,558,2,1),(1619,558,4,2),(1620,558,9,3),(1621,557,2,1),(1622,557,4,2),(1623,557,9,3),(1624,561,2,1),(1625,561,4,2),(1626,561,9,3),(1627,562,1,1),(1628,562,3,2),(1629,562,8,3),(1630,563,1,1),(1631,563,3,2),(1632,563,8,3),(1633,564,2,1),(1634,564,3,2),(1635,564,8,3),(1636,565,2,1),(1637,565,3,2),(1638,565,8,3),(1639,566,1,1),(1640,566,3,2),(1641,566,8,3),(1642,567,1,1),(1643,567,3,2),(1644,567,8,3),(1645,568,2,1),(1646,568,3,2),(1647,568,8,3),(1648,569,1,1),(1649,569,2,1),(1650,569,3,2),(1651,569,8,3),(1652,570,1,1),(1653,570,3,2),(1654,570,8,3),(1655,571,2,1),(1656,571,4,2),(1657,571,8,3),(1658,572,1,1),(1659,572,2,1),(1660,572,3,2),(1661,572,8,3),(1662,573,2,1),(1663,573,4,2),(1664,573,8,3),(1665,574,2,1),(1666,574,4,2),(1667,574,8,3),(1668,575,1,1),(1669,575,2,1),(1670,575,3,2),(1671,575,8,3),(1672,576,2,1),(1673,576,4,2),(1674,576,8,3),(1675,577,2,1),(1676,577,3,2),(1677,577,8,3),(1678,578,2,1),(1679,578,3,2),(1680,578,8,3),(1681,579,2,1),(1682,579,3,2),(1683,579,8,3),(1684,580,1,1),(1685,580,3,2),(1686,580,8,3),(1687,582,2,1),(1688,582,3,2),(1689,582,8,3),(1690,581,1,1),(1691,581,2,1),(1692,581,3,2),(1693,581,8,3),(1694,583,1,1),(1695,583,3,2),(1696,583,8,3),(1697,584,1,1),(1698,584,2,1),(1699,584,3,2),(1700,584,8,3),(1701,585,2,1),(1702,585,3,2),(1703,585,8,3),(1704,586,2,1),(1705,586,3,2),(1706,586,8,3),(1707,587,2,1),(1708,587,3,2),(1709,587,8,3),(1710,588,1,1),(1711,588,2,1),(1712,588,3,2),(1713,588,8,3),(1714,589,2,1),(1715,589,4,2),(1716,589,8,3),(1717,590,2,1),(1718,590,4,2),(1719,590,8,3),(1720,591,2,1),(1721,591,4,2),(1722,591,8,3),(1723,592,2,1),(1724,592,4,2),(1725,592,8,3),(1726,593,1,1),(1727,593,3,2),(1728,593,8,3),(1729,594,1,1),(1730,594,2,1),(1731,594,3,2),(1732,594,8,3),(1733,595,1,1),(1734,595,3,2),(1735,595,8,3),(1736,596,2,1),(1737,596,4,2),(1738,596,8,3),(1739,597,1,1),(1740,597,3,2),(1741,597,8,3),(1742,598,1,1),(1743,598,3,2),(1744,598,8,3),(1745,599,1,1),(1746,599,3,2),(1747,599,8,3),(1748,602,1,1),(1749,602,3,2),(1750,602,8,3),(1751,603,2,1),(1752,603,4,2),(1753,603,8,3),(1754,604,2,1),(1755,604,4,2),(1756,604,8,3),(1757,605,2,1),(1758,605,4,2),(1759,605,8,3),(1760,606,2,1),(1761,606,4,2),(1762,606,8,3),(1763,608,2,1),(1764,608,4,2),(1765,608,8,3),(1766,609,2,1),(1767,609,4,2),(1768,609,8,3),(1769,607,2,1),(1770,607,4,2),(1771,607,8,3),(1772,611,2,1),(1773,611,4,2),(1774,611,8,3),(1775,612,1,1),(1776,612,3,2),(1777,612,8,3),(1778,613,1,1),(1779,613,2,1),(1780,613,3,2),(1781,613,8,3),(1782,615,1,1),(1783,615,3,2),(1784,615,8,3),(1785,614,1,1),(1786,614,2,1),(1787,614,3,2),(1788,614,8,3),(1789,619,1,1),(1790,619,3,2),(1791,619,8,3),(1792,618,1,1),(1793,618,3,2),(1794,618,8,3),(1795,617,1,1),(1796,617,2,1),(1797,617,3,2),(1798,617,8,3),(1799,621,1,1),(1800,621,3,2),(1801,621,8,3),(1802,620,1,1),(1803,620,3,2),(1804,620,8,3),(1805,622,1,1),(1806,622,2,1),(1807,622,3,2),(1808,622,8,3),(1809,624,1,1),(1810,624,3,2),(1811,624,8,3),(1812,623,1,1),(1813,623,2,1),(1814,623,3,2),(1815,623,8,3),(1816,625,1,1),(1817,625,3,2),(1818,625,8,3),(1819,628,1,1),(1820,628,2,1),(1821,628,3,2),(1822,628,8,3),(1823,626,1,1),(1824,626,2,1),(1825,626,3,2),(1826,626,8,3),(1827,627,1,1),(1828,627,2,1),(1829,627,3,2),(1830,627,8,3),(1831,629,1,1),(1832,629,3,2),(1833,629,8,3),(1834,630,1,1),(1835,630,3,2),(1836,630,8,3),(1837,631,1,1),(1838,631,3,2),(1839,631,8,3),(1840,632,1,1),(1841,632,2,1),(1842,632,3,2),(1843,632,8,3),(1844,633,1,1),(1845,633,3,2),(1846,633,8,3),(1847,634,1,1),(1848,634,2,1),(1849,634,3,2),(1850,634,8,3),(1851,635,1,1),(1852,635,3,2),(1853,635,8,3),(1854,636,1,1),(1855,636,2,1),(1856,636,3,2),(1857,636,8,3),(1858,638,1,1),(1859,638,3,2),(1860,638,8,3),(1861,639,2,1),(1862,639,4,2),(1863,639,8,3),(1864,640,1,1),(1865,640,2,1),(1866,640,3,2),(1867,640,8,3),(1868,645,1,1),(1869,645,2,1),(1870,645,3,2),(1871,645,8,3),(1872,646,1,1),(1873,646,2,1),(1874,646,3,2),(1875,646,8,3),(1876,647,2,1),(1877,647,3,2),(1878,647,8,3),(1879,649,1,1),(1880,649,2,1),(1881,649,3,2),(1882,649,8,3),(1883,650,2,1),(1884,650,3,2),(1885,650,8,3),(1886,648,1,1),(1887,648,2,1),(1888,648,3,2),(1889,648,8,3),(1890,651,2,1),(1891,651,4,2),(1892,651,8,3),(1893,652,1,1),(1894,652,2,1),(1895,652,3,2),(1896,652,8,3),(1897,653,2,1),(1898,653,4,2),(1899,653,8,3),(1900,654,2,1),(1901,654,3,2),(1902,654,8,3),(1903,655,2,1),(1904,655,4,2),(1905,655,8,3),(1906,656,1,1),(1907,656,2,1),(1908,656,3,2),(1909,656,8,3),(1910,657,1,1),(1911,657,2,1),(1912,657,3,2),(1913,657,8,3),(1914,658,1,1),(1915,658,2,1),(1916,658,3,2),(1917,658,8,3),(1918,659,1,1),(1919,659,2,1),(1920,659,3,2),(1921,659,8,3),(1922,660,1,1),(1923,660,2,1),(1924,660,3,2),(1925,660,8,3),(1926,661,1,1),(1927,661,2,1),(1928,661,3,2),(1929,661,8,3),(1930,662,1,1),(1931,662,2,1),(1932,662,3,2),(1933,662,8,3),(1934,663,1,1),(1935,663,2,1),(1936,663,3,2),(1937,663,8,3),(1938,665,1,1),(1939,665,2,1),(1940,665,3,2),(1941,665,8,3),(1942,664,1,1),(1943,664,2,1),(1944,664,3,2),(1945,664,8,3),(1946,668,2,1),(1947,668,3,2),(1948,668,8,3),(1949,666,1,1),(1950,666,2,1),(1951,666,3,2),(1952,666,8,3),(1953,667,1,1),(1954,667,2,1),(1955,667,3,2),(1956,667,8,3),(1957,670,1,1),(1958,670,2,1),(1959,670,3,2),(1960,670,8,3),(1961,669,1,1),(1962,669,2,1),(1963,669,3,2),(1964,669,8,3),(1965,679,2,1),(1966,679,4,2),(1967,679,8,3),(1968,680,2,1),(1969,680,4,2),(1970,680,8,3),(1971,681,2,1),(1972,681,4,2),(1973,681,8,3),(1974,682,2,1),(1975,682,4,2),(1976,682,8,3),(1977,685,2,1),(1978,685,3,2),(1979,685,8,3),(1980,683,2,1),(1981,683,4,2),(1982,683,8,3),(1983,686,2,1),(1984,686,4,2),(1985,686,8,3),(1986,687,2,1),(1987,687,3,2),(1988,687,8,3),(1989,689,2,1),(1990,689,4,2),(1991,689,8,3),(1992,690,2,1),(1993,690,4,2),(1994,690,9,3),(1995,691,1,1),(1996,691,3,2),(1997,691,9,3),(1998,692,1,1),(1999,692,3,2),(2000,692,8,3),(2001,693,2,1),(2002,693,4,2),(2003,693,9,3),(2004,694,1,1),(2005,694,3,2),(2006,694,9,3),(2007,695,1,1),(2008,695,3,2),(2009,695,9,3),(2010,696,2,1),(2011,696,4,2),(2012,696,9,3),(2013,697,2,1),(2014,697,4,2),(2015,697,9,3),(2016,698,2,1),(2017,698,4,2),(2018,698,9,3),(2019,699,2,1),(2020,699,4,2),(2021,699,9,3),(2022,700,2,1),(2023,700,4,2),(2024,700,8,3),(2025,701,2,1),(2026,701,4,2),(2027,701,9,3),(2028,702,2,1),(2029,702,4,2),(2030,702,9,3),(2031,703,2,1),(2032,703,4,2),(2033,703,9,3),(2034,704,1,1),(2035,704,3,2),(2036,704,8,3),(2037,705,2,1),(2038,705,4,2),(2039,705,9,3),(2040,707,2,1),(2041,707,4,2),(2042,707,9,3),(2043,708,1,1),(2044,708,3,2),(2045,708,9,3),(2046,706,1,1),(2047,706,3,2),(2048,706,9,3),(2049,709,2,1),(2050,709,4,2),(2051,709,9,3),(2052,710,2,1),(2053,710,4,2),(2054,710,9,3),(2055,711,2,1),(2056,711,4,2),(2057,711,9,3),(2058,711,8,3),(2059,712,2,1),(2060,712,4,2),(2061,712,8,3),(2062,713,2,1),(2063,713,4,2),(2064,713,9,3),(2065,713,8,3),(2066,714,2,1),(2067,714,4,2),(2068,714,9,3),(2069,716,2,1),(2070,716,4,2),(2071,716,9,3),(2072,715,2,1),(2073,715,4,2),(2074,715,9,3),(2075,717,2,1),(2076,717,1,1),(2077,717,4,2),(2078,717,9,3),(2079,718,2,1),(2080,718,4,2),(2081,718,9,3),(2082,719,2,1),(2083,719,4,2),(2084,719,9,3),(2085,720,2,1),(2086,720,4,2),(2087,720,9,3),(2088,721,1,1),(2089,721,3,2),(2090,721,9,3),(2091,722,1,1),(2092,722,3,2),(2093,722,9,3),(2094,723,2,1),(2095,723,4,2),(2096,723,9,3),(2097,724,2,1),(2098,724,4,2),(2099,724,9,3),(2100,726,1,1),(2101,726,3,2),(2102,726,9,3),(2103,725,2,1),(2104,725,4,2),(2105,725,9,3),(2106,727,1,1),(2107,727,3,2),(2108,727,9,3),(2109,728,1,1),(2110,728,3,2),(2111,728,9,3),(2112,729,1,1),(2113,729,3,2),(2114,729,9,3),(2115,730,1,1),(2116,730,3,2),(2117,730,9,3),(2118,731,1,1),(2119,731,3,2),(2120,731,9,3),(2121,732,1,1),(2122,732,3,2),(2123,732,9,3),(2124,733,1,1),(2125,733,3,2),(2126,733,9,3),(2127,734,1,1),(2128,734,3,2),(2129,734,9,3),(2130,735,2,1),(2131,735,4,2),(2132,735,9,3),(2133,736,2,1),(2134,736,4,2),(2135,736,9,3),(2136,737,2,1),(2137,737,4,2),(2138,737,9,3),(2139,738,2,1),(2140,738,4,2),(2141,738,9,3),(2142,739,1,1),(2143,739,3,2),(2144,739,9,3),(2145,741,2,1),(2146,741,4,2),(2147,741,9,3),(2148,740,1,1),(2149,740,3,2),(2150,740,9,3),(2151,742,2,1),(2152,742,4,2),(2153,742,9,3),(2154,743,1,1),(2155,743,3,2),(2156,743,9,3),(2157,744,2,1),(2158,744,4,2),(2159,744,9,3),(2160,745,2,1),(2161,745,4,2),(2162,745,9,3),(2163,746,1,1),(2164,746,3,2),(2165,746,9,3),(2166,747,2,1),(2167,747,4,2),(2168,747,9,3),(2169,748,2,1),(2170,748,4,2),(2171,748,9,3),(2172,749,1,1),(2173,749,3,2),(2174,749,9,3),(2175,750,2,1),(2176,750,4,2),(2177,750,9,3),(2178,751,1,1),(2179,751,3,2),(2180,751,9,3),(2181,752,2,1),(2182,752,4,2),(2183,752,9,3),(2184,754,2,1),(2185,754,4,2),(2186,754,9,3),(2187,753,2,1),(2188,753,4,2),(2189,753,9,3),(2190,755,2,1),(2191,755,4,2),(2192,755,9,3),(2193,757,1,1),(2194,757,3,2),(2195,757,9,3),(2196,759,1,1),(2197,759,3,2),(2198,759,9,3),(2199,756,1,1),(2200,756,3,2),(2201,756,9,3),(2202,758,1,1),(2203,758,3,2),(2204,758,9,3),(2205,760,1,1),(2206,760,3,2),(2207,760,9,3),(2208,761,1,1),(2209,761,3,2),(2210,761,9,3),(2211,763,1,1),(2212,763,3,2),(2213,763,9,3),(2214,765,1,1),(2215,765,3,2),(2216,765,9,3),(2217,762,1,1),(2218,762,3,2),(2219,762,9,3),(2220,764,1,1),(2221,764,3,2),(2222,764,9,3),(2223,766,1,1),(2224,766,3,2),(2225,766,9,3),(2226,767,1,1),(2227,767,3,2),(2228,767,9,3),(2229,768,1,1),(2230,768,3,2),(2231,768,9,3),(2232,769,1,1),(2233,769,3,2),(2234,769,9,3),(2235,771,1,1),(2236,771,2,1),(2237,771,3,2),(2238,771,9,3),(2239,772,1,1),(2240,772,3,2),(2241,772,9,3),(2242,773,2,1),(2243,773,3,2),(2244,773,9,3),(2245,774,1,1),(2246,774,3,2),(2247,774,9,3),(2248,776,1,1),(2249,776,2,1),(2250,776,3,2),(2251,776,9,3),(2252,778,2,1),(2253,778,4,2),(2254,778,8,3),(2255,782,2,1),(2256,782,4,2),(2257,782,9,3),(2258,783,2,1),(2259,783,4,2),(2260,783,9,3),(2261,784,2,1),(2262,784,4,2),(2263,784,9,3),(2264,785,2,1),(2265,785,4,2),(2266,785,9,3),(2267,787,2,1),(2268,787,4,2),(2269,787,9,3),(2270,788,2,1),(2271,788,4,2),(2272,788,9,3),(2273,789,2,1),(2274,789,4,2),(2275,789,9,3),(2276,790,2,1),(2277,790,4,2),(2278,790,9,3),(2279,791,2,1),(2280,791,4,2),(2281,791,9,3),(2282,792,2,1),(2283,792,4,2),(2284,792,9,3),(2285,793,2,1),(2286,793,4,2),(2287,793,9,3),(2288,794,2,1),(2289,794,4,2),(2290,794,9,3),(2291,795,2,1),(2292,795,4,2),(2293,795,9,3),(2294,796,2,1),(2295,796,4,2),(2296,796,9,3),(2297,797,2,1),(2298,797,4,2),(2299,797,9,3),(2300,800,2,1),(2301,800,4,2),(2302,800,9,3),(2303,799,2,1),(2304,799,4,2),(2305,799,9,3),(2306,801,2,1),(2307,801,4,2),(2308,801,9,3),(2309,802,2,1),(2310,802,4,2),(2311,802,9,3),(2312,803,2,1),(2313,803,4,2),(2314,803,9,3),(2315,805,2,1),(2316,805,4,2),(2317,805,9,3),(2318,806,2,1),(2319,806,4,2),(2320,806,9,3),(2321,809,2,1),(2322,809,4,2),(2323,809,9,3),(2324,808,2,1),(2325,808,4,2),(2326,808,9,3),(2327,810,2,1),(2328,810,4,2),(2329,810,9,3),(2330,812,2,1),(2331,812,4,2),(2332,812,9,3),(2333,811,2,1),(2334,811,4,2),(2335,811,9,3),(2336,813,2,1),(2337,813,4,2),(2338,813,9,3),(2339,817,2,1),(2340,817,4,2),(2341,817,9,3),(2342,826,1,1),(2343,826,2,1),(2344,826,3,2),(2345,826,9,3),(2346,828,2,1),(2347,828,4,2),(2348,828,8,3),(2349,827,2,1),(2350,827,4,2),(2351,827,9,3),(2352,829,2,1),(2353,829,4,2),(2354,829,9,3),(2355,830,2,1),(2356,830,4,2),(2357,830,8,3),(2358,831,2,1),(2359,831,4,2),(2360,831,8,3),(2361,832,2,1),(2362,832,4,2),(2363,832,9,3),(2364,833,2,1),(2365,833,4,2),(2366,833,9,3),(2367,834,2,1),(2368,834,4,2),(2369,834,9,3),(2370,835,1,1),(2371,835,3,2),(2372,835,9,3),(2373,836,1,1),(2374,836,3,2),(2375,836,9,3),(2376,837,1,1),(2377,837,3,2),(2378,837,9,3),(2379,838,2,1),(2380,838,4,2),(2381,838,9,3),(2382,839,1,1),(2383,839,3,2),(2384,839,9,3),(2385,841,2,1),(2386,841,4,2),(2387,841,9,3),(2388,840,2,1),(2389,840,4,2),(2390,840,9,3),(2391,842,2,1),(2392,842,4,2),(2393,842,9,3),(2394,843,2,1),(2395,843,4,2),(2396,843,9,3),(2397,844,2,1),(2398,844,4,2),(2399,844,8,3),(2400,845,2,1),(2401,845,4,2),(2402,845,9,3),(2403,847,1,1),(2404,847,2,1),(2405,847,3,2),(2406,847,9,3),(2407,846,2,1),(2408,846,4,2),(2409,846,9,3),(2410,848,2,1),(2411,848,4,2),(2412,848,9,3),(2413,853,2,1),(2414,853,4,2),(2415,853,8,3),(2416,854,2,1),(2417,854,4,2),(2418,854,8,3),(2419,855,2,1),(2420,855,4,2),(2421,855,9,3),(2422,856,1,1),(2423,856,2,1),(2424,856,4,2),(2425,856,9,3),(2426,857,1,1),(2427,857,3,2),(2428,857,9,3),(2429,858,1,1),(2430,858,2,1),(2431,858,3,2),(2432,858,9,3),(2433,859,1,1),(2434,859,3,2),(2435,859,9,3),(2436,860,1,1),(2437,860,2,1),(2438,860,3,2),(2439,860,9,3),(2440,861,2,1),(2441,861,4,2),(2442,861,9,3),(2443,862,1,1),(2444,862,2,1),(2445,862,3,2),(2446,862,9,3),(2447,864,1,1),(2448,864,2,1),(2449,864,3,2),(2450,864,9,3),(2451,863,1,1),(2452,863,2,1),(2453,863,3,2),(2454,863,9,3),(2455,865,1,1),(2456,865,2,1),(2457,865,3,2),(2458,865,9,3),(2459,866,1,1),(2460,866,2,1),(2461,866,3,2),(2462,866,9,3),(2463,867,1,1),(2464,867,2,1),(2465,867,3,2),(2466,867,9,3),(2467,868,1,1),(2468,868,3,2),(2469,868,9,3),(2470,869,1,1),(2471,869,2,1),(2472,869,3,2),(2473,869,9,3),(2474,872,1,1),(2475,872,3,2),(2476,872,9,3),(2477,870,1,1),(2478,870,3,2),(2479,870,9,3),(2480,871,1,1),(2481,871,3,2),(2482,871,9,3),(2483,874,1,1),(2484,874,3,2),(2485,874,9,3),(2486,873,1,1),(2487,873,3,2),(2488,873,9,3),(2489,876,2,1),(2490,876,4,2),(2491,876,9,3),(2492,877,2,1),(2493,877,4,2),(2494,877,9,3),(2495,878,1,1),(2496,878,2,1),(2497,878,3,2),(2498,878,9,3),(2499,879,1,1),(2500,879,3,2),(2501,879,9,3),(2502,880,1,1),(2503,880,3,2),(2504,880,9,3),(2505,881,1,1),(2506,881,2,1),(2507,881,3,2),(2508,881,9,3),(2509,884,1,1),(2510,884,2,1),(2511,884,4,2),(2512,884,9,3),(2513,885,1,1),(2514,885,3,2),(2515,885,9,3),(2516,886,1,1),(2517,886,2,1),(2518,886,3,2),(2519,886,9,3),(2520,888,2,1),(2521,888,4,2),(2522,888,9,3),(2523,889,1,1),(2524,889,2,1),(2525,889,3,2),(2526,889,9,3),(2527,890,2,1),(2528,890,4,2),(2529,890,9,3),(2530,891,2,1),(2531,891,4,2),(2532,891,9,3),(2533,892,2,1),(2534,892,4,2),(2535,892,9,3),(2536,893,2,1),(2537,893,4,2),(2538,893,9,3),(2539,895,2,1),(2540,895,4,2),(2541,895,9,3),(2542,896,2,1),(2543,896,4,2),(2544,896,9,3),(2545,897,2,1),(2546,897,4,2),(2547,897,9,3),(2548,898,1,1),(2549,898,2,1),(2550,898,3,2),(2551,898,9,3),(2552,899,2,1),(2553,899,4,2),(2554,899,9,3),(2555,900,1,1),(2556,900,2,1),(2557,900,3,2),(2558,900,9,3),(2559,901,2,1),(2560,901,4,2),(2561,901,9,3),(2562,902,2,1),(2563,902,4,2),(2564,902,9,3),(2565,903,2,1),(2566,903,4,2),(2567,903,9,3),(2568,904,1,1),(2569,904,2,1),(2570,904,3,2),(2571,904,9,3),(2572,905,1,1),(2573,905,2,1),(2574,905,3,2),(2575,905,9,3),(2576,907,2,1),(2577,907,4,2),(2578,907,8,3),(2579,913,1,1),(2580,913,2,1),(2581,913,3,2),(2582,913,9,3),(2583,915,2,1),(2584,915,4,2),(2585,915,8,3),(2586,919,2,1),(2587,919,4,2),(2588,919,9,3),(2589,926,2,1),(2590,926,4,2),(2591,926,9,3),(2592,929,2,1),(2593,929,4,2),(2594,929,9,3),(2595,930,2,1),(2596,930,4,2),(2597,930,8,3),(2598,931,2,1),(2599,931,3,2),(2600,931,8,3),(2601,932,2,1),(2602,932,3,2),(2603,932,8,3),(2604,933,2,1),(2605,933,3,2),(2606,933,8,3),(2607,935,2,1),(2608,935,3,2),(2609,935,8,3),(2610,934,2,1),(2611,934,3,2),(2612,934,8,3),(2613,936,1,1),(2614,936,3,2),(2615,936,8,3),(2616,937,2,1),(2617,937,3,2),(2618,937,8,3),(2619,938,2,1),(2620,938,3,2),(2621,938,8,3),(2622,939,1,1),(2623,939,3,2),(2624,939,8,3),(2625,940,1,1),(2626,940,3,2),(2627,940,8,3),(2628,941,1,1),(2629,941,3,2),(2630,941,8,3),(2631,942,2,1),(2632,942,3,2),(2633,942,8,3),(2634,943,1,1),(2635,943,2,1),(2636,943,3,2),(2637,943,8,3),(2638,944,1,1),(2639,944,2,1),(2640,944,3,2),(2641,944,8,3),(2642,945,1,1),(2643,945,3,2),(2644,945,8,3),(2645,946,1,1),(2646,946,2,1),(2647,946,3,2),(2648,946,8,3),(2649,947,1,1),(2650,947,2,1),(2651,947,3,2),(2652,947,8,3),(2653,948,2,1),(2654,948,3,2),(2655,948,8,3),(2656,949,2,1),(2657,949,3,2),(2658,949,8,3),(2659,950,2,1),(2660,950,3,2),(2661,950,8,3),(2662,952,1,1),(2663,952,2,1),(2664,952,3,2),(2665,952,8,3),(2666,954,2,1),(2667,954,4,2),(2668,954,9,3),(2669,956,2,1),(2670,956,3,2),(2671,956,8,3),(2672,957,2,1),(2673,957,3,2),(2674,957,8,3),(2675,955,2,1),(2676,955,3,2),(2677,955,8,3),(2678,958,2,1),(2679,958,3,2),(2680,958,8,3),(2681,959,1,1),(2682,959,3,2),(2683,959,8,3),(2684,960,2,1),(2685,960,3,2),(2686,960,8,3),(2687,961,2,1),(2688,961,4,2),(2689,961,8,3),(2690,962,1,1),(2691,962,2,1),(2692,962,3,2),(2693,962,8,3),(2694,963,2,1),(2695,963,3,2),(2696,963,8,3),(2697,965,1,1),(2698,965,2,1),(2699,965,3,2),(2700,965,8,3),(2701,966,2,1),(2702,966,4,2),(2703,966,8,3),(2704,967,2,1),(2705,967,4,2),(2706,967,9,3),(2707,968,1,1),(2708,968,2,1),(2709,968,3,2),(2710,968,8,3),(2711,969,1,1),(2712,969,2,1),(2713,969,3,2),(2714,969,8,3),(2715,970,2,1),(2716,970,4,2),(2717,970,9,3),(2718,971,2,1),(2719,971,3,2),(2720,971,8,3),(2721,972,2,1),(2722,972,3,2),(2723,972,8,3),(2724,975,2,1),(2725,975,3,2),(2726,975,8,3),(2727,974,2,1),(2728,974,3,2),(2729,974,8,3),(2730,973,2,1),(2731,973,3,2),(2732,973,8,3),(2733,976,1,1),(2734,976,2,1),(2735,976,3,2),(2736,976,8,3),(2737,977,2,1),(2738,977,3,2),(2739,977,8,3),(2740,978,2,1),(2741,978,3,2),(2742,978,8,3),(2743,979,2,1),(2744,979,3,2),(2745,979,8,3),(2746,981,2,1),(2747,981,3,2),(2748,981,8,3),(2749,982,2,1),(2750,982,3,2),(2751,982,8,3),(2752,985,1,1),(2753,985,2,1),(2754,985,3,2),(2755,985,8,3),(2756,984,1,1),(2757,984,2,1),(2758,984,3,2),(2759,984,8,3),(2760,987,2,1),(2761,987,4,2),(2762,987,9,3),(2763,986,1,1),(2764,986,3,2),(2765,986,8,3),(2766,988,2,1),(2767,988,3,2),(2768,988,8,3),(2769,989,2,1),(2770,989,3,2),(2771,989,8,3),(2772,990,1,1),(2773,990,3,2),(2774,990,8,3),(2775,991,1,1),(2776,991,2,1),(2777,991,3,2),(2778,991,8,3),(2779,993,1,1),(2780,993,3,2),(2781,993,8,3),(2782,992,2,1),(2783,992,3,2),(2784,992,8,3),(2785,995,2,1),(2786,995,3,2),(2787,995,8,3),(2788,996,1,1),(2789,996,3,2),(2790,996,8,3),(2791,994,2,1),(2792,994,4,2),(2793,994,8,3),(2794,997,2,1),(2795,997,3,2),(2796,997,8,3),(2797,998,2,1),(2798,998,3,2),(2799,998,8,3),(2800,999,2,1),(2801,999,3,2),(2802,999,8,3),(2803,1000,2,1),(2804,1000,3,2),(2805,1000,8,3),(2806,1001,2,1),(2807,1001,3,2),(2808,1001,8,3),(2809,1002,2,1),(2810,1002,3,2),(2811,1002,8,3),(2812,1003,2,1),(2813,1003,4,2),(2814,1003,8,3),(2815,1005,2,1),(2816,1005,3,2),(2817,1005,8,3),(2818,1004,1,1),(2819,1004,3,2),(2820,1004,8,3),(2821,1007,2,1),(2822,1007,3,2),(2823,1007,8,3),(2824,1008,1,1),(2825,1008,3,2),(2826,1008,8,3),(2827,1009,2,1),(2828,1009,4,2),(2829,1009,8,3),(2830,1010,1,1),(2831,1010,2,1),(2832,1010,3,2),(2833,1010,8,3),(2834,1011,2,1),(2835,1011,4,2),(2836,1011,8,3),(2837,1012,1,1),(2838,1012,3,2),(2839,1012,8,3),(2840,1014,2,1),(2841,1014,4,2),(2842,1014,8,3),(2843,1015,2,1),(2844,1015,4,2),(2845,1015,8,3),(2846,1013,1,1),(2847,1013,3,2),(2848,1013,8,3),(2849,1016,2,1),(2850,1016,4,2),(2851,1016,8,3),(2852,1017,1,1),(2853,1017,2,1),(2854,1017,3,2),(2855,1017,8,3),(2856,1018,2,1),(2857,1018,4,2),(2858,1018,8,3),(2859,1019,2,1),(2860,1019,4,2),(2861,1019,8,3),(2862,1020,2,1),(2863,1020,3,2),(2864,1020,8,3),(2865,1021,2,1),(2866,1021,3,2),(2867,1021,8,3),(2868,1022,1,1),(2869,1022,3,2),(2870,1022,8,3),(2871,1024,2,1),(2872,1024,3,2),(2873,1024,8,3),(2874,1023,1,1),(2875,1023,3,2),(2876,1023,8,3),(2877,1027,1,1),(2878,1027,2,1),(2879,1027,3,2),(2880,1027,8,3),(2881,1025,2,1),(2882,1025,3,2),(2883,1025,8,3),(2884,1026,1,1),(2885,1026,2,1),(2886,1026,3,2),(2887,1026,8,3),(2888,1028,2,1),(2889,1028,3,2),(2890,1028,8,3),(2891,1029,2,1),(2892,1029,3,2),(2893,1029,8,3),(2894,1030,2,1),(2895,1030,3,2),(2896,1030,8,3),(2897,1031,1,1),(2898,1031,3,2),(2899,1031,8,3),(2900,1032,2,1),(2901,1032,3,2),(2902,1032,8,3),(2903,1033,1,1),(2904,1033,2,1),(2905,1033,3,2),(2906,1033,8,3),(2907,1035,1,1),(2908,1035,3,2),(2909,1035,8,3),(2910,1036,2,1),(2911,1036,3,2),(2912,1036,8,3),(2913,1034,1,1),(2914,1034,2,1),(2915,1034,3,2),(2916,1034,8,3),(2917,1038,2,1),(2918,1038,3,2),(2919,1038,8,3),(2920,1037,1,1),(2921,1037,3,2),(2922,1037,8,3),(2923,1039,2,1),(2924,1039,3,2),(2925,1039,8,3),(2926,1040,1,1),(2927,1040,3,2),(2928,1040,8,3),(2929,1041,1,1),(2930,1041,3,2),(2931,1041,8,3),(2932,1042,2,1),(2933,1042,3,2),(2934,1042,8,3),(2935,1043,2,1),(2936,1043,3,2),(2937,1043,8,3),(2938,1045,2,1),(2939,1045,3,2),(2940,1045,8,3),(2941,1044,1,1),(2942,1044,2,1),(2943,1044,3,2),(2944,1044,8,3),(2945,1046,1,1),(2946,1046,3,2),(2947,1046,8,3),(2948,1048,2,1),(2949,1048,3,2),(2950,1048,8,3),(2951,1050,2,1),(2952,1050,3,2),(2953,1050,8,3),(2954,1051,2,1),(2955,1051,4,2),(2956,1051,9,3),(2957,1053,2,1),(2958,1053,3,2),(2959,1053,8,3),(2960,1055,2,1),(2961,1055,3,2),(2962,1055,8,3),(2963,1054,2,1),(2964,1054,3,2),(2965,1054,8,3),(2966,1056,2,1),(2967,1056,3,2),(2968,1056,8,3),(2969,1057,1,1),(2970,1057,3,2),(2971,1057,8,3),(2972,1058,2,1),(2973,1058,3,2),(2974,1058,8,3),(2975,1059,2,1),(2976,1059,3,2),(2977,1059,8,3),(2978,1060,2,1),(2979,1060,3,2),(2980,1060,8,3),(2981,1061,1,1),(2982,1061,2,1),(2983,1061,3,2),(2984,1061,8,3),(2985,1063,1,1),(2986,1063,3,2),(2987,1063,8,3),(2988,1064,2,1),(2989,1064,4,2),(2990,1064,8,3),(2991,1062,2,1),(2992,1062,4,2),(2993,1062,8,3),(2994,1065,1,1),(2995,1065,2,1),(2996,1065,3,2),(2997,1065,8,3),(2998,1066,2,1),(2999,1066,4,2),(3000,1066,8,3),(3001,1067,1,1),(3002,1067,2,1),(3003,1067,3,2),(3004,1067,8,3),(3005,1068,1,1),(3006,1068,2,1),(3007,1068,3,2),(3008,1068,8,3),(3009,1069,2,1),(3010,1069,4,2),(3011,1069,8,3),(3012,1071,1,1),(3013,1071,2,1),(3014,1071,3,2),(3015,1071,8,3),(3016,1070,1,1),(3017,1070,2,1),(3018,1070,3,2),(3019,1070,8,3),(3020,1072,2,1),(3021,1072,4,2),(3022,1072,9,3),(3023,1073,1,1),(3024,1073,2,1),(3025,1073,3,2),(3026,1073,8,3),(3027,1074,1,1),(3028,1074,2,1),(3029,1074,3,2),(3030,1074,8,3),(3031,1075,1,1),(3032,1075,3,2),(3033,1075,8,3),(3034,1076,1,1),(3035,1076,2,1),(3036,1076,3,2),(3037,1076,8,3),(3038,1077,1,1),(3039,1077,2,1),(3040,1077,3,2),(3041,1077,8,3),(3042,1078,1,1),(3043,1078,2,1),(3044,1078,3,2),(3045,1078,8,3),(3046,1079,1,1),(3047,1079,2,1),(3048,1079,3,2),(3049,1079,8,3),(3050,1080,2,1),(3051,1080,3,2),(3052,1080,8,3),(3053,1081,1,1),(3054,1081,2,1),(3055,1081,3,2),(3056,1081,8,3),(3057,1082,1,1),(3058,1082,2,1),(3059,1082,3,2),(3060,1082,8,3),(3061,1083,2,1),(3062,1083,4,2),(3063,1083,8,3),(3064,1084,2,1),(3065,1084,3,2),(3066,1084,8,3),(3067,1087,1,1),(3068,1087,2,1),(3069,1087,3,2),(3070,1087,8,3),(3071,1088,1,1),(3072,1088,2,1),(3073,1088,3,2),(3074,1088,8,3),(3075,1094,1,1),(3076,1094,2,1),(3077,1094,3,2),(3078,1094,8,3),(3079,1104,2,1),(3080,1104,4,2),(3081,1104,8,3),(3082,1105,2,1),(3083,1105,4,2),(3084,1105,9,3),(3085,1106,2,1),(3086,1106,4,2),(3087,1106,8,3),(3088,1107,2,1),(3089,1107,4,2),(3090,1107,8,3),(3091,1108,2,1),(3092,1108,4,2),(3093,1108,9,3),(3094,1109,2,1),(3095,1109,4,2),(3096,1109,8,3),(3097,1110,2,1),(3098,1110,4,2),(3099,1110,8,3),(3100,1111,2,1),(3101,1111,4,2),(3102,1111,8,3),(3103,1113,2,1),(3104,1113,4,2),(3105,1113,8,3),(3106,1114,2,1),(3107,1114,4,2),(3108,1114,8,3),(3109,1115,2,1),(3110,1115,4,2),(3111,1115,8,3),(3112,1117,2,1),(3113,1117,4,2),(3114,1117,8,3),(3115,1123,2,1),(3116,1123,4,2),(3117,1123,8,3),(3118,1136,2,1),(3119,1136,4,2),(3120,1136,9,3),(3121,1137,2,1),(3122,1137,4,2),(3123,1137,9,3),(3124,1138,2,1),(3125,1138,4,2),(3126,1138,9,3),(3127,1139,2,1),(3128,1139,4,2),(3129,1139,9,3),(3130,1140,2,1),(3131,1140,4,2),(3132,1140,9,3),(3133,1141,2,1),(3134,1141,4,2),(3135,1141,9,3),(3136,1142,2,1),(3137,1142,4,2),(3138,1142,9,3),(3139,1143,2,1),(3140,1143,4,2),(3141,1143,9,3),(3142,1144,1,1),(3143,1144,2,1),(3144,1144,4,2),(3145,1144,9,3),(3146,1145,2,1),(3147,1145,4,2),(3148,1145,9,3),(3149,1146,2,1),(3150,1146,4,2),(3151,1146,9,3),(3152,1147,2,1),(3153,1147,4,2),(3154,1147,9,3),(3155,1148,2,1),(3156,1148,4,2),(3157,1148,9,3),(3158,1149,2,1),(3159,1149,4,2),(3160,1149,9,3),(3161,1151,2,1),(3162,1151,4,2),(3163,1151,9,3),(3164,1150,2,1),(3165,1150,4,2),(3166,1150,9,3),(3167,1152,2,1),(3168,1152,4,2),(3169,1152,9,3),(3170,1153,2,1),(3171,1153,4,2),(3172,1153,9,3),(3173,1154,2,1),(3174,1154,4,2),(3175,1154,9,3),(3176,1155,2,1),(3177,1155,4,2),(3178,1155,9,3),(3179,1156,1,1),(3180,1156,2,1),(3181,1156,4,2),(3182,1156,9,3),(3183,1157,2,1),(3184,1157,4,2),(3185,1157,9,3),(3186,1158,2,1),(3187,1158,4,2),(3188,1158,9,3),(3189,1160,2,1),(3190,1160,4,2),(3191,1160,9,3),(3192,1159,2,1),(3193,1159,4,2),(3194,1159,9,3),(3195,1161,2,1),(3196,1161,4,2),(3197,1161,9,3),(3198,1162,2,1),(3199,1162,4,2),(3200,1162,9,3),(3201,1163,2,1),(3202,1163,4,2),(3203,1163,9,3),(3204,1164,2,1),(3205,1164,4,2),(3206,1164,9,3),(3207,1165,2,1),(3208,1165,4,2),(3209,1165,9,3),(3210,1166,2,1),(3211,1166,4,2),(3212,1166,9,3),(3213,1167,2,1),(3214,1167,4,2),(3215,1167,9,3),(3216,1168,2,1),(3217,1168,4,2),(3218,1168,9,3),(3219,1169,2,1),(3220,1169,4,2),(3221,1169,9,3),(3222,1170,2,1),(3223,1170,4,2),(3224,1170,9,3),(3225,1171,2,1),(3226,1171,4,2),(3227,1171,9,3),(3228,1172,2,1),(3229,1172,4,2),(3230,1172,9,3),(3231,1173,2,1),(3232,1173,4,2),(3233,1173,9,3),(3234,1174,2,1),(3235,1174,4,2),(3236,1174,9,3),(3237,1175,2,1),(3238,1175,4,2),(3239,1175,9,3),(3240,1176,2,1),(3241,1176,4,2),(3242,1176,9,3),(3243,1177,2,1),(3244,1177,4,2),(3245,1177,9,3),(3246,1178,2,1),(3247,1178,4,2),(3248,1178,9,3),(3249,1179,2,1),(3250,1179,4,2),(3251,1179,9,3),(3252,1184,2,1),(3253,1184,3,2),(3254,1184,9,3),(3255,1186,2,1),(3256,1186,4,2),(3257,1186,9,3),(3258,1194,2,1),(3259,1194,4,2),(3260,1194,9,3),(3261,1201,2,1),(3262,1201,4,2),(3263,1201,9,3),(3264,1211,2,1),(3265,1211,3,2),(3266,1211,8,3),(3267,1217,1,1),(3268,1217,3,2),(3269,1217,8,3),(3270,1237,1,1),(3271,1237,2,1),(3272,1237,3,2),(3273,1237,8,3),(3274,1239,2,1),(3275,1239,4,2),(3276,1239,8,3),(3277,1243,2,1),(3278,1243,3,2),(3279,1243,8,3),(3280,1249,2,1),(3281,1249,4,2),(3282,1249,8,3),(3283,1254,2,1),(3284,1254,4,2),(3285,1254,8,3),(3286,1262,2,1),(3287,1262,3,2),(3288,1262,8,3),(3289,1271,1,1),(3290,1271,3,2),(3291,1271,8,3),(3292,1279,2,1),(3293,1279,4,2),(3294,1279,8,3),(3295,1281,2,1),(3296,1281,4,2),(3297,1281,8,3),(3298,1285,2,1),(3299,1285,4,2),(3300,1285,8,3),(3301,1286,1,1),(3302,1286,2,1),(3303,1286,3,2),(3304,1286,8,3),(3305,1289,1,1),(3306,1289,2,1),(3307,1289,3,2),(3308,1289,8,3),(3309,1309,2,1),(3310,1309,3,2),(3311,1309,8,3),(3312,1317,2,1),(3313,1317,4,2),(3314,1317,8,3),(3315,1323,2,1),(3316,1323,4,2),(3317,1323,8,3),(3318,1324,2,1),(3319,1324,4,2),(3320,1324,8,3),(3321,1329,2,1),(3322,1329,4,2),(3323,1329,8,3),(3324,1332,2,1),(3325,1332,3,2),(3326,1332,8,3),(3327,1476,1,1),(3328,1476,2,1),(3329,1476,4,2),(3330,1476,9,3),(3331,1478,2,1),(3332,1478,4,2),(3333,1478,9,3),(3334,1479,1,1),(3335,1479,2,1),(3336,1479,4,2),(3337,1479,9,3),(3338,1480,1,1),(3339,1480,2,1),(3340,1480,4,2),(3341,1480,9,3),(3342,1481,1,1),(3343,1481,2,1),(3344,1481,4,2),(3345,1481,9,3),(3346,1483,1,1),(3347,1483,4,2),(3348,1483,9,3),(3349,1485,2,1),(3350,1485,4,2),(3351,1485,9,3),(3352,1486,1,1),(3353,1486,2,1),(3354,1486,4,2),(3355,1486,9,3),(3356,1487,1,1),(3357,1487,4,2),(3358,1487,9,3),(3359,1489,1,1),(3360,1489,2,1),(3361,1489,3,2),(3362,1489,9,3),(3363,1491,1,1),(3364,1491,4,2),(3365,1491,9,3),(3366,1492,1,1),(3367,1492,2,1),(3368,1492,3,2),(3369,1492,9,3),(3370,1493,1,1),(3371,1493,2,1),(3372,1493,4,2),(3373,1493,9,3),(3374,1494,1,1),(3375,1494,4,2),(3376,1494,9,3),(3377,1495,2,1),(3378,1495,4,2),(3379,1495,9,3),(3380,1496,1,1),(3381,1496,4,2),(3382,1496,9,3),(3383,1497,1,1),(3384,1497,4,2),(3385,1497,9,3),(3386,1499,1,1),(3387,1499,2,1),(3388,1499,4,2),(3389,1499,9,3),(3390,1502,1,1),(3391,1502,2,1),(3392,1502,4,2),(3393,1502,9,3),(3394,1503,1,1),(3395,1503,4,2),(3396,1503,9,3),(3397,1500,1,1),(3398,1500,4,2),(3399,1500,9,3),(3400,1504,1,1),(3401,1504,4,2),(3402,1504,9,3),(3403,1505,1,1),(3404,1505,2,1),(3405,1505,4,2),(3406,1505,9,3),(3407,1501,1,1),(3408,1501,2,1),(3409,1501,4,2),(3410,1501,9,3),(3411,1506,1,1),(3412,1506,2,1),(3413,1506,4,2),(3414,1506,9,3),(3415,1507,1,1),(3416,1507,2,1),(3417,1507,4,2),(3418,1507,9,3),(3419,1508,1,1),(3420,1508,2,1),(3421,1508,4,2),(3422,1508,9,3),(3423,1509,1,1),(3424,1509,4,2),(3425,1509,9,3),(3426,1511,1,1),(3427,1511,2,1),(3428,1511,4,2),(3429,1511,9,3),(3430,1510,1,1),(3431,1510,2,1),(3432,1510,4,2),(3433,1510,9,3),(3434,1512,1,1),(3435,1512,2,1),(3436,1512,4,2),(3437,1512,9,3),(3438,1514,2,1),(3439,1514,4,2),(3440,1514,9,3),(3441,1516,2,1),(3442,1516,4,2),(3443,1516,9,3),(3444,1518,2,1),(3445,1518,4,2),(3446,1518,9,3),(3447,1519,1,1),(3448,1519,4,2),(3449,1519,9,3),(3450,1520,1,1),(3451,1520,2,1),(3452,1520,3,2),(3453,1520,9,3),(3454,1521,1,1),(3455,1521,2,1),(3456,1521,4,2),(3457,1521,9,3),(3458,1522,1,1),(3459,1522,2,1),(3460,1522,4,2),(3461,1522,9,3),(3462,1523,1,1),(3463,1523,2,1),(3464,1523,4,2),(3465,1523,9,3),(3466,1524,1,1),(3467,1524,2,1),(3468,1524,4,2),(3469,1524,9,3),(3470,1525,1,1),(3471,1525,4,2),(3472,1525,9,3),(3473,1528,1,1),(3474,1528,4,2),(3475,1528,9,3),(3476,1527,1,1),(3477,1527,4,2),(3478,1527,9,3),(3479,1526,1,1),(3480,1526,2,1),(3481,1526,4,2),(3482,1526,9,3),(3483,1530,1,1),(3484,1530,2,1),(3485,1530,4,2),(3486,1530,9,3),(3487,1531,1,1),(3488,1531,2,1),(3489,1531,4,2),(3490,1531,9,3),(3491,1532,1,1),(3492,1532,2,1),(3493,1532,4,2),(3494,1532,9,3),(3495,1536,1,1),(3496,1536,2,1),(3497,1536,4,2),(3498,1536,9,3),(3499,1537,1,1),(3500,1537,2,1),(3501,1537,4,2),(3502,1537,9,3),(3503,1553,2,1),(3504,1553,4,2),(3505,1553,9,3),(3506,1554,2,1),(3507,1554,4,2),(3508,1554,9,3),(3509,1558,2,1),(3510,1558,4,2),(3511,1558,9,3),(3512,1556,2,1),(3513,1556,4,2),(3514,1556,9,3),(3515,1560,2,1),(3516,1560,4,2),(3517,1560,9,3),(3518,1559,2,1),(3519,1559,4,2),(3520,1559,9,3),(3521,1557,2,1),(3522,1557,4,2),(3523,1557,9,3),(3524,1585,1,1),(3525,1585,4,2),(3526,1585,8,3),(3527,1586,1,1),(3528,1586,4,2),(3529,1586,8,3),(3530,1587,1,1),(3531,1587,4,2),(3532,1587,8,3),(3533,1588,1,1),(3534,1588,2,1),(3535,1588,4,2),(3536,1588,8,3),(3537,1589,1,1),(3538,1589,2,1),(3539,1589,4,2),(3540,1589,8,3),(3541,1590,1,1),(3542,1590,2,1),(3543,1590,4,2),(3544,1590,8,3),(3545,1591,1,1),(3546,1591,4,2),(3547,1591,8,3),(3548,1592,1,1),(3549,1592,4,2),(3550,1592,8,3),(3551,1593,1,1),(3552,1593,4,2),(3553,1593,8,3),(3554,1594,1,1),(3555,1594,4,2),(3556,1594,8,3),(3557,1595,1,1),(3558,1595,4,2),(3559,1595,8,3),(3560,1596,1,1),(3561,1596,4,2),(3562,1596,8,3),(3563,1597,1,1),(3564,1597,4,2),(3565,1597,8,3),(3566,1598,1,1),(3567,1598,4,2),(3568,1598,8,3),(3569,1599,1,1),(3570,1599,4,2),(3571,1599,8,3),(3572,1600,1,1),(3573,1600,4,2),(3574,1600,8,3),(3575,1601,1,1),(3576,1601,4,2),(3577,1601,8,3),(3578,1603,1,1),(3579,1603,4,2),(3580,1603,8,3),(3581,1602,1,1),(3582,1602,2,1),(3583,1602,4,2),(3584,1602,8,3),(3585,1604,1,1),(3586,1604,4,2),(3587,1604,8,3),(3588,1605,1,1),(3589,1605,4,2),(3590,1605,8,3),(3591,1606,1,1),(3592,1606,4,2),(3593,1606,8,3),(3594,1607,1,1),(3595,1607,2,1),(3596,1607,4,2),(3597,1607,8,3),(3598,1608,1,1),(3599,1608,4,2),(3600,1608,8,3),(3601,1609,1,1),(3602,1609,4,2),(3603,1609,8,3),(3604,1610,1,1),(3605,1610,4,2),(3606,1610,8,3),(3607,1611,1,1),(3608,1611,4,2),(3609,1611,8,3),(3610,1612,1,1),(3611,1612,4,2),(3612,1612,8,3),(3613,1613,1,1),(3614,1613,4,2),(3615,1613,8,3),(3616,1614,1,1),(3617,1614,4,2),(3618,1614,8,3),(3619,1615,1,1),(3620,1615,4,2),(3621,1615,8,3),(3622,1616,1,1),(3623,1616,4,2),(3624,1616,8,3),(3625,1617,1,1),(3626,1617,4,2),(3627,1617,8,3),(3628,1618,1,1),(3629,1618,4,2),(3630,1618,8,3),(3631,1619,1,1),(3632,1619,4,2),(3633,1619,8,3),(3634,1620,1,1),(3635,1620,4,2),(3636,1620,8,3),(3637,1621,1,1),(3638,1621,2,1),(3639,1621,4,2),(3640,1621,8,3),(3641,1623,1,1),(3642,1623,4,2),(3643,1623,8,3),(3644,1622,1,1),(3645,1622,4,2),(3646,1622,8,3),(3647,1624,1,1),(3648,1624,4,2),(3649,1624,8,3),(3650,1625,1,1),(3651,1625,2,1),(3652,1625,4,2),(3653,1625,8,3),(3654,1628,1,1),(3655,1628,2,1),(3656,1628,4,2),(3657,1628,8,3),(3658,1629,1,1),(3659,1629,2,1),(3660,1629,4,2),(3661,1629,8,3),(3662,1631,1,1),(3663,1631,2,1),(3664,1631,4,2),(3665,1631,8,3),(3666,1636,2,1),(3667,1636,4,2),(3668,1636,8,3),(3669,1637,2,1),(3670,1637,4,2),(3671,1637,8,3),(3672,1638,2,1),(3673,1638,4,2),(3674,1638,8,3),(3675,1641,2,1),(3676,1641,4,2),(3677,1641,8,3),(3678,1642,2,1),(3679,1642,4,2),(3680,1642,8,3),(3681,1643,2,1),(3682,1643,4,2),(3683,1643,8,3),(3684,1646,2,1),(3685,1646,4,2),(3686,1646,8,3),(3687,1652,2,1),(3688,1652,4,2),(3689,1652,9,3),(3690,1653,1,1),(3691,1653,2,1),(3692,1653,4,2),(3693,1653,9,3),(3694,1654,2,1),(3695,1654,4,2),(3696,1654,9,3),(3697,1656,1,1),(3698,1656,2,1),(3699,1656,4,2),(3700,1656,9,3),(3701,1655,1,1),(3702,1655,2,1),(3703,1655,4,2),(3704,1655,9,3),(3705,1657,1,1),(3706,1657,2,1),(3707,1657,4,2),(3708,1657,9,3),(3709,1658,1,1),(3710,1658,2,1),(3711,1658,4,2),(3712,1658,9,3),(3713,1659,1,1),(3714,1659,2,1),(3715,1659,4,2),(3716,1659,9,3),(3717,1660,1,1),(3718,1660,2,1),(3719,1660,4,2),(3720,1660,9,3),(3721,1661,1,1),(3722,1661,2,1),(3723,1661,4,2),(3724,1661,9,3),(3725,1662,1,1),(3726,1662,2,1),(3727,1662,4,2),(3728,1662,9,3),(3729,1663,1,1),(3730,1663,2,1),(3731,1663,4,2),(3732,1663,9,3),(3733,1664,1,1),(3734,1664,2,1),(3735,1664,4,2),(3736,1664,9,3),(3737,1665,2,1),(3738,1665,4,2),(3739,1665,9,3),(3740,1666,1,1),(3741,1666,2,1),(3742,1666,4,2),(3743,1666,9,3),(3744,1667,2,1),(3745,1667,4,2),(3746,1667,9,3),(3747,1668,1,1),(3748,1668,2,1),(3749,1668,4,2),(3750,1668,9,3),(3751,1669,2,1),(3752,1669,4,2),(3753,1669,9,3),(3754,1671,1,1),(3755,1671,2,1),(3756,1671,4,2),(3757,1671,9,3),(3758,1672,1,1),(3759,1672,2,1),(3760,1672,4,2),(3761,1672,9,3),(3762,1670,1,1),(3763,1670,2,1),(3764,1670,4,2),(3765,1670,9,3),(3766,1673,1,1),(3767,1673,2,1),(3768,1673,4,2),(3769,1673,9,3),(3770,1674,1,1),(3771,1674,2,1),(3772,1674,4,2),(3773,1674,9,3),(3774,1675,1,1),(3775,1675,2,1),(3776,1675,4,2),(3777,1675,9,3),(3778,1676,1,1),(3779,1676,2,1),(3780,1676,4,2),(3781,1676,9,3),(3782,1677,1,1),(3783,1677,2,1),(3784,1677,4,2),(3785,1677,9,3),(3786,1680,1,1),(3787,1680,2,1),(3788,1680,4,2),(3789,1680,9,3),(3790,1678,1,1),(3791,1678,2,1),(3792,1678,4,2),(3793,1678,9,3),(3794,1679,1,1),(3795,1679,2,1),(3796,1679,4,2),(3797,1679,9,3),(3798,1681,1,1),(3799,1681,2,1),(3800,1681,4,2),(3801,1681,9,3),(3802,1682,1,1),(3803,1682,2,1),(3804,1682,4,2),(3805,1682,9,3),(3806,1687,2,1),(3807,1687,4,2),(3808,1687,9,3); -/*!40000 ALTER TABLE `exercise_related_classification` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `exercise_related_muscle` --- - -DROP TABLE IF EXISTS `exercise_related_muscle`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `exercise_related_muscle` ( - `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'The ID of exercise related muscle.', - `exercise_id` bigint unsigned NOT NULL COMMENT 'The ID of exercise.', - `muscle_id` bigint unsigned NOT NULL COMMENT 'The ID of muscle.', - `related_muscle_type` tinyint NOT NULL COMMENT 'Related muscle type. Muscle movement classification.\n\n1 - Agonist\n2 - Antagonist\n3 - Target\n4 - Synergist\n5 - Stabilizer\n6 - Dynamic Stabilizer\n7 - Antagonist Stabilizer\n\nhttps://exrx.net/Kinesiology/Glossary#MuscleMovClass', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=6163 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Exercise Related Muscle.\n\nRelationship:\nOne exercise can have 3 (or more) different types of related muscle.\nAnd one exercise can have more than one specific type of related muscles.'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `exercise_related_muscle` --- - -LOCK TABLES `exercise_related_muscle` WRITE; -/*!40000 ALTER TABLE `exercise_related_muscle` DISABLE KEYS */; -INSERT INTO `exercise_related_muscle` VALUES (1,1,50,3),(2,1,22,5),(3,2,50,3),(4,2,22,5),(5,3,50,3),(6,3,8,5),(7,3,45,5),(8,3,22,5),(9,4,50,3),(10,4,49,4),(11,4,22,4),(12,4,28,4),(13,4,22,5),(14,4,28,5),(15,5,50,3),(16,5,49,4),(17,5,22,4),(18,5,28,4),(19,5,22,5),(20,5,28,5),(21,5,29,5),(22,6,50,3),(23,6,49,4),(24,6,22,4),(25,6,28,4),(26,6,22,5),(27,6,28,5),(28,8,50,3),(29,8,8,5),(30,8,45,5),(31,8,22,5),(32,9,50,3),(33,9,22,5),(34,10,50,3),(35,10,22,5),(36,7,50,3),(37,7,49,4),(38,7,22,4),(39,7,28,4),(40,7,22,5),(41,7,28,5),(42,7,29,5),(43,11,50,3),(44,11,49,4),(45,12,50,3),(46,13,50,3),(47,13,49,4),(48,13,22,4),(49,13,28,4),(50,13,12,5),(51,13,12,5),(52,15,50,3),(53,15,22,5),(54,15,43,5),(55,16,50,3),(56,16,49,4),(57,16,43,5),(58,16,22,5),(59,16,18,5),(60,16,46,5),(61,16,11,5),(62,16,48,5),(63,17,50,3),(64,17,49,4),(65,17,22,5),(66,17,43,5),(67,18,50,3),(68,18,49,4),(69,18,22,4),(70,18,28,4),(71,18,12,4),(72,18,12,4),(73,18,22,5),(74,18,28,5),(75,18,12,5),(76,18,12,5),(77,19,49,3),(78,19,8,4),(79,19,29,5),(80,19,45,5),(81,20,49,3),(82,20,8,4),(83,20,29,5),(84,20,6,5),(85,20,6,5),(86,21,49,3),(87,21,8,4),(88,21,29,5),(89,21,6,5),(90,21,6,5),(91,22,49,3),(92,22,8,4),(93,26,49,3),(94,26,8,4),(95,23,49,3),(96,23,8,4),(97,25,49,3),(98,25,8,4),(99,28,49,3),(100,28,8,4),(101,28,43,4),(102,28,12,5),(103,27,49,3),(104,24,22,2),(105,24,49,3),(106,24,8,4),(107,24,29,5),(108,24,45,5),(109,24,12,5),(110,24,22,5),(111,24,22,7),(112,29,49,3),(113,29,8,4),(114,29,12,4),(115,29,43,4),(116,30,49,3),(117,31,22,2),(118,31,49,3),(119,31,8,4),(120,31,12,5),(121,31,17,5),(122,31,22,5),(123,31,22,7),(124,32,49,3),(125,33,6,3),(126,33,7,4),(127,33,52,4),(128,34,6,3),(129,34,7,4),(130,34,6,5),(131,34,38,5),(132,35,6,3),(133,35,7,4),(134,37,6,3),(135,37,7,4),(136,37,52,4),(137,36,6,3),(138,36,7,4),(139,36,38,5),(140,40,6,3),(141,40,7,4),(142,40,52,4),(143,38,6,3),(144,38,7,4),(145,38,52,4),(146,39,6,3),(147,39,7,4),(148,42,6,3),(149,42,7,4),(150,42,38,5),(151,41,6,3),(152,41,7,4),(153,41,52,4),(154,43,6,3),(155,43,7,4),(156,43,38,5),(157,44,6,3),(158,44,7,4),(159,44,38,5),(160,45,6,3),(161,45,7,4),(162,45,38,5),(163,46,6,3),(164,46,7,4),(165,46,52,4),(166,48,6,3),(167,48,7,4),(168,48,6,5),(169,48,38,5),(170,47,6,3),(171,47,7,4),(172,47,38,5),(173,51,6,3),(174,51,7,4),(175,51,38,5),(176,50,6,3),(177,50,7,4),(178,50,52,4),(179,52,6,3),(180,52,7,4),(181,52,38,5),(182,53,6,3),(183,53,7,4),(184,53,52,4),(185,49,6,3),(186,49,7,4),(187,49,52,4),(188,49,12,4),(189,49,43,4),(190,49,48,4),(191,49,22,4),(192,49,28,4),(193,49,12,4),(194,49,17,5),(195,49,11,5),(196,49,22,5),(197,49,17,6),(198,49,11,6),(199,54,6,3),(200,54,7,4),(201,54,52,4),(202,55,6,3),(203,55,7,4),(204,55,52,4),(205,56,6,3),(206,56,7,4),(207,56,52,4),(208,57,6,3),(209,57,7,4),(210,57,52,4),(211,60,6,3),(212,60,7,4),(213,60,38,5),(214,58,6,3),(215,58,7,4),(216,59,6,3),(217,59,7,4),(218,59,52,4),(219,59,22,4),(220,59,28,4),(221,61,6,3),(222,61,7,4),(223,62,6,3),(224,62,7,4),(225,63,6,3),(226,63,52,4),(227,63,22,5),(228,63,28,5),(229,64,6,3),(230,64,7,4),(231,64,52,4),(232,65,6,3),(233,65,7,4),(234,66,6,3),(235,66,7,4),(236,66,52,4),(237,67,6,3),(238,67,7,4),(239,67,52,4),(240,68,6,3),(241,68,7,4),(242,71,6,3),(243,71,7,4),(244,69,6,3),(245,69,7,4),(246,69,52,4),(247,72,6,3),(248,72,7,4),(249,72,52,4),(250,70,6,3),(251,70,7,4),(252,73,6,3),(253,73,7,4),(254,74,6,3),(255,75,6,3),(256,76,6,3),(257,77,6,3),(258,77,7,4),(259,77,43,5),(260,77,18,5),(261,77,46,5),(262,77,22,5),(263,78,6,3),(264,78,7,4),(265,78,43,5),(266,78,18,5),(267,78,46,5),(268,78,22,5),(269,79,22,2),(270,79,6,3),(271,79,7,4),(272,79,12,5),(273,79,17,5),(274,79,38,5),(275,79,22,5),(276,79,22,7),(277,80,6,3),(278,81,7,3),(279,81,6,4),(280,81,52,4),(281,81,38,5),(282,82,7,3),(283,82,6,4),(284,82,52,4),(285,82,3,4),(286,82,4,4),(287,82,19,4),(288,82,29,4),(289,84,7,3),(290,84,6,4),(291,84,52,4),(292,84,3,4),(293,84,4,4),(294,84,19,4),(295,84,29,4),(296,83,7,3),(297,83,6,4),(298,83,52,4),(299,83,38,5),(300,85,7,3),(301,85,6,4),(302,85,52,4),(303,85,38,5),(304,86,7,3),(305,86,6,4),(306,86,52,4),(307,86,3,4),(308,86,4,4),(309,86,19,4),(310,86,29,4),(311,87,7,3),(312,87,6,4),(313,87,52,4),(314,87,3,4),(315,87,4,4),(316,87,19,4),(317,87,29,4),(318,88,7,3),(319,88,6,4),(320,88,52,4),(321,88,3,4),(322,88,4,4),(323,88,19,4),(324,88,29,4),(325,89,7,3),(326,89,6,4),(327,89,52,4),(328,89,3,4),(329,89,4,4),(330,89,19,4),(331,89,29,4),(332,90,7,3),(333,90,6,4),(334,90,52,4),(335,90,3,4),(336,90,4,4),(337,90,19,4),(338,90,29,4),(339,91,7,3),(340,91,6,4),(341,91,52,4),(342,91,38,5),(343,92,7,3),(344,92,52,4),(345,92,29,4),(346,92,19,4),(347,92,6,4),(348,92,8,4),(349,92,38,5),(350,92,17,5),(351,92,12,5),(352,93,7,3),(353,93,52,4),(354,93,29,4),(355,93,19,4),(356,93,6,4),(357,93,8,4),(358,93,38,5),(359,94,7,3),(360,94,6,4),(361,94,52,4),(362,94,38,5),(363,95,7,3),(364,95,6,4),(365,95,52,4),(366,95,3,4),(367,95,4,4),(368,95,19,4),(369,95,29,4),(370,96,7,3),(371,96,8,4),(372,96,52,4),(373,96,38,5),(374,97,7,3),(375,97,52,4),(376,97,29,4),(377,97,19,4),(378,97,6,4),(379,97,8,4),(380,97,38,5),(381,97,17,5),(382,97,12,5),(383,99,7,3),(384,99,6,4),(385,99,52,4),(386,99,38,5),(387,98,7,3),(388,98,6,4),(389,98,52,4),(390,98,3,4),(391,98,4,4),(392,98,19,4),(393,98,29,4),(394,100,7,3),(395,100,8,4),(396,100,52,4),(397,100,38,5),(398,101,7,3),(399,101,6,4),(400,101,52,4),(401,101,38,5),(402,102,7,3),(403,102,6,4),(404,102,52,4),(405,102,3,4),(406,102,4,4),(407,102,19,4),(408,102,29,4),(409,103,7,3),(410,103,8,4),(411,103,52,4),(412,103,3,4),(413,103,4,4),(414,103,19,4),(415,103,29,4),(416,105,7,3),(417,105,6,4),(418,105,52,4),(419,105,3,4),(420,105,4,4),(421,105,19,4),(422,105,29,4),(423,104,7,3),(424,104,6,4),(425,104,52,4),(426,104,3,4),(427,104,4,4),(428,104,19,4),(429,104,29,4),(430,107,7,3),(431,107,6,4),(432,107,52,4),(433,106,7,3),(434,106,6,4),(435,106,52,4),(436,109,7,3),(437,109,6,4),(438,109,52,4),(439,109,38,5),(440,108,7,3),(441,108,6,4),(442,108,52,4),(443,108,3,4),(444,108,4,4),(445,108,19,4),(446,108,29,4),(447,110,7,3),(448,110,6,4),(449,110,52,4),(450,110,38,5),(451,112,7,3),(452,113,7,3),(453,114,22,2),(454,114,7,3),(455,114,6,4),(456,114,52,4),(457,114,29,4),(458,114,19,4),(459,114,12,5),(460,114,17,5),(461,114,38,5),(462,114,22,5),(463,114,22,7),(464,115,7,3),(465,115,6,4),(466,115,52,4),(467,115,3,4),(468,115,4,4),(469,115,19,4),(470,115,29,4),(471,116,7,3),(472,116,6,4),(473,116,52,4),(474,116,3,4),(475,116,4,4),(476,116,19,4),(477,116,29,4),(478,117,8,3),(479,117,19,4),(480,117,29,4),(481,117,7,4),(482,117,45,4),(483,117,3,4),(484,117,4,4),(485,118,8,3),(486,118,7,4),(487,118,19,4),(488,118,29,4),(489,118,45,4),(490,118,38,5),(491,119,8,3),(492,119,19,4),(493,119,29,4),(494,119,7,4),(495,119,45,4),(496,119,3,4),(497,119,4,4),(498,120,8,3),(499,120,7,4),(500,120,19,4),(501,120,29,4),(502,120,45,4),(503,120,38,5),(504,122,8,3),(505,122,7,4),(506,122,19,4),(507,122,29,4),(508,122,45,4),(509,122,38,5),(510,121,8,3),(511,121,7,4),(512,121,3,4),(513,121,4,4),(514,121,39,4),(515,121,29,5),(516,123,8,3),(517,123,19,4),(518,123,29,4),(519,123,7,4),(520,123,45,4),(521,123,3,4),(522,123,4,4),(523,123,17,5),(524,123,12,5),(525,124,8,3),(526,124,19,4),(527,124,29,4),(528,124,7,4),(529,124,45,4),(530,124,3,4),(531,124,4,4),(532,124,17,5),(533,124,12,5),(534,124,43,5),(535,125,8,3),(536,125,7,4),(537,125,19,4),(538,125,29,4),(539,125,45,4),(540,125,38,5),(541,125,22,5),(542,126,8,3),(543,126,19,4),(544,126,29,4),(545,126,7,4),(546,126,45,4),(547,126,3,4),(548,126,4,4),(549,126,17,5),(550,126,12,5),(551,127,8,3),(552,127,19,4),(553,127,29,4),(554,127,7,4),(555,127,45,4),(556,127,3,4),(557,127,4,4),(558,127,17,5),(559,127,12,5),(560,128,8,3),(561,128,19,4),(562,128,29,4),(563,128,7,4),(564,128,45,4),(565,128,3,4),(566,128,4,4),(567,128,12,5),(568,129,8,3),(569,129,19,4),(570,129,29,4),(571,129,7,4),(572,129,45,4),(573,129,38,5),(574,130,8,3),(575,130,7,4),(576,130,19,4),(577,130,29,4),(578,130,45,4),(579,130,38,5),(580,130,17,5),(581,130,12,5),(582,131,8,3),(583,131,19,4),(584,131,29,4),(585,131,7,4),(586,131,45,4),(587,131,3,4),(588,131,4,4),(589,133,8,3),(590,133,19,4),(591,133,29,4),(592,133,7,4),(593,133,45,4),(594,133,3,4),(595,133,4,4),(596,132,8,3),(597,132,19,4),(598,132,29,4),(599,132,7,4),(600,132,45,4),(601,132,38,5),(602,135,8,3),(603,135,19,4),(604,135,29,4),(605,135,7,4),(606,135,45,4),(607,135,3,4),(608,135,4,4),(609,134,8,3),(610,134,7,4),(611,134,19,4),(612,134,29,4),(613,134,45,4),(614,134,38,5),(615,134,17,5),(616,134,12,5),(617,134,43,5),(618,137,8,3),(619,137,19,4),(620,137,29,4),(621,137,7,4),(622,137,45,4),(623,136,8,3),(624,136,19,4),(625,136,29,4),(626,136,7,4),(627,136,45,4),(628,136,3,4),(629,136,4,4),(630,136,22,5),(631,138,8,3),(632,138,19,4),(633,138,29,4),(634,138,7,4),(635,138,45,4),(636,138,38,5),(637,138,17,5),(638,138,12,5),(639,138,43,5),(640,139,8,3),(641,139,19,4),(642,139,29,4),(643,139,52,4),(644,139,7,4),(645,139,45,4),(646,140,8,3),(647,140,19,4),(648,140,29,4),(649,140,7,4),(650,140,3,4),(651,140,4,4),(652,140,45,4),(653,141,8,3),(654,141,19,4),(655,141,29,4),(656,141,45,4),(657,141,3,4),(658,141,4,4),(659,141,7,5),(660,142,8,3),(661,142,19,4),(662,142,29,4),(663,142,45,4),(664,145,8,3),(665,145,7,4),(666,145,3,4),(667,145,4,4),(668,145,29,5),(669,144,8,3),(670,144,19,4),(671,144,29,4),(672,144,7,4),(673,144,45,4),(674,143,8,3),(675,143,19,4),(676,143,29,4),(677,143,45,4),(678,143,3,4),(679,143,4,4),(680,143,7,5),(681,147,8,3),(682,147,19,4),(683,147,29,4),(684,147,7,4),(685,147,45,4),(686,147,38,5),(687,148,8,3),(688,148,19,4),(689,148,29,4),(690,148,45,4),(691,148,17,5),(692,148,12,5),(693,148,38,5),(694,149,8,3),(695,149,19,4),(696,149,29,4),(697,149,45,4),(698,149,3,4),(699,149,4,4),(700,149,7,5),(701,150,8,3),(702,150,19,4),(703,150,29,4),(704,150,7,4),(705,150,45,4),(706,150,38,5),(707,151,8,3),(708,151,19,4),(709,151,29,4),(710,151,45,4),(711,151,17,5),(712,151,12,5),(713,151,43,5),(714,153,8,3),(715,153,19,4),(716,153,29,4),(717,153,45,4),(718,157,8,3),(719,157,19,4),(720,157,29,4),(721,157,45,4),(722,157,12,5),(723,157,43,5),(724,154,8,3),(725,154,19,4),(726,154,29,4),(727,154,45,4),(728,156,8,3),(729,156,19,4),(730,156,29,4),(731,156,7,4),(732,156,45,4),(733,156,38,5),(734,155,8,3),(735,155,19,4),(736,155,29,4),(737,155,7,4),(738,155,45,4),(739,155,38,5),(740,152,8,3),(741,152,19,4),(742,152,29,4),(743,152,7,4),(744,152,3,4),(745,152,4,4),(746,152,45,4),(747,152,17,5),(748,152,12,5),(749,152,43,5),(750,158,22,2),(751,158,8,3),(752,158,19,4),(753,158,29,4),(754,158,45,4),(755,158,3,4),(756,158,4,4),(757,158,17,5),(758,158,12,5),(759,158,7,5),(760,158,22,5),(761,158,22,7),(762,159,22,2),(763,159,8,3),(764,159,19,4),(765,159,29,4),(766,159,45,4),(767,159,3,4),(768,159,4,4),(769,159,17,5),(770,159,12,5),(771,159,7,5),(772,159,22,5),(773,159,22,7),(774,160,8,3),(775,160,19,4),(776,160,29,4),(777,160,7,4),(778,160,3,4),(779,160,4,4),(780,160,45,4),(781,160,17,5),(782,160,12,5),(783,160,43,5),(784,163,22,2),(785,163,8,3),(786,163,19,4),(787,163,29,4),(788,163,45,4),(789,163,3,4),(790,163,4,4),(791,163,17,5),(792,163,12,5),(793,163,7,5),(794,163,22,5),(795,163,22,7),(796,165,8,3),(797,164,8,3),(798,162,22,2),(799,162,8,3),(800,162,19,4),(801,162,29,4),(802,162,45,4),(803,162,17,5),(804,162,12,5),(805,162,7,5),(806,162,22,5),(807,162,22,7),(808,168,52,3),(809,168,7,4),(810,168,6,4),(811,168,6,4),(812,168,38,5),(813,167,52,3),(814,167,7,4),(815,167,6,4),(816,167,6,4),(817,167,38,5),(818,169,52,3),(819,169,7,4),(820,169,6,4),(821,169,6,4),(822,169,38,5),(823,170,52,3),(824,170,7,4),(825,170,6,4),(826,170,6,4),(827,170,38,5),(828,171,52,3),(829,171,7,4),(830,171,6,4),(831,171,6,4),(832,171,38,5),(833,172,6,4),(834,173,6,4),(835,173,29,4),(836,173,45,4),(837,174,6,4),(838,174,39,5),(839,175,6,4),(840,175,29,4),(841,175,45,4),(842,177,6,4),(843,176,6,5),(844,176,28,5),(845,176,8,5),(846,176,39,5),(847,179,6,5),(848,179,28,5),(849,179,8,5),(850,179,39,5),(851,178,6,5),(852,178,28,5),(853,178,8,5),(854,178,39,5),(855,180,6,5),(856,180,39,5),(857,181,6,5),(858,181,28,5),(859,181,8,5),(860,181,39,5),(861,182,6,5),(862,182,39,5),(863,182,22,5),(864,184,6,5),(865,184,28,5),(866,184,8,5),(867,184,39,5),(868,183,28,5),(869,183,6,5),(870,183,8,5),(871,183,29,5),(872,183,22,5),(873,183,38,5),(874,185,6,5),(875,185,22,5),(876,186,6,5),(877,186,28,5),(878,186,8,5),(879,186,39,5),(880,187,39,5),(881,188,6,5),(882,188,28,5),(883,188,8,5),(884,188,39,5),(885,189,28,4),(886,189,8,4),(887,189,29,4),(888,189,28,5),(889,189,8,5),(890,189,29,5),(891,189,22,5),(892,189,39,5),(893,190,28,5),(894,190,8,5),(895,190,29,5),(896,190,22,5),(897,190,39,5),(898,191,28,5),(899,191,8,5),(900,191,29,5),(901,191,22,5),(902,191,39,5),(903,192,28,5),(904,192,8,5),(905,192,29,5),(906,192,39,5),(907,193,28,5),(908,193,8,5),(909,193,29,5),(910,193,22,5),(911,193,39,5),(912,194,28,5),(913,194,29,5),(914,194,22,5),(915,194,28,5),(916,194,38,5),(917,195,28,5),(918,195,8,5),(919,195,29,5),(920,195,22,5),(921,195,39,5),(922,196,28,5),(923,196,8,5),(924,196,29,5),(925,196,22,5),(926,196,39,5),(927,197,28,5),(928,197,8,5),(929,197,29,5),(930,197,22,5),(931,197,38,5),(932,200,6,4),(933,200,29,4),(934,200,45,4),(935,199,38,5),(936,198,28,5),(937,198,8,5),(938,198,29,5),(939,198,39,5),(940,201,6,5),(941,201,39,5),(942,202,39,5),(943,203,38,5),(944,204,6,5),(945,204,28,5),(946,204,8,5),(947,205,8,5),(948,205,45,5),(949,206,6,5),(950,206,28,5),(951,206,8,5),(952,207,6,5),(953,207,39,5),(954,208,6,5),(955,208,28,5),(956,208,8,5),(957,209,6,5),(958,209,39,5),(959,210,38,5),(960,211,6,4),(961,212,6,4),(962,213,6,5),(963,213,39,5),(964,214,39,5),(965,215,8,5),(966,215,28,5),(967,215,29,5),(968,216,8,5),(969,216,28,5),(970,216,29,5),(971,216,39,5),(972,217,6,4),(973,217,29,4),(974,217,45,4),(975,218,8,5),(976,218,28,5),(977,218,29,5),(978,220,6,4),(979,219,6,4),(980,219,29,4),(981,219,45,4),(982,222,6,4),(983,223,8,5),(984,223,28,5),(985,223,29,5),(986,224,8,5),(987,224,28,5),(988,224,29,5),(989,225,6,4),(990,225,29,4),(991,225,45,4),(992,226,6,4),(993,228,6,4),(994,228,29,4),(995,228,45,4),(996,229,6,4),(997,231,6,4),(998,231,29,4),(999,231,45,4),(1000,230,6,4),(1001,230,29,4),(1002,230,45,4),(1003,232,6,4),(1004,232,22,5),(1005,232,43,5),(1006,233,6,4),(1007,233,22,5),(1008,234,6,4),(1009,234,29,4),(1010,234,45,4),(1011,235,6,4),(1012,235,22,5),(1013,235,43,5),(1014,236,6,4),(1015,236,29,4),(1016,236,45,4),(1017,237,6,4),(1018,237,29,4),(1019,237,45,4),(1020,238,6,4),(1021,238,29,4),(1022,238,45,4),(1023,240,6,4),(1024,240,29,4),(1025,240,45,4),(1026,242,6,4),(1027,242,22,5),(1028,242,43,5),(1029,242,11,5),(1030,242,48,5),(1031,241,29,5),(1032,241,8,5),(1033,241,29,5),(1034,241,6,5),(1035,241,22,5),(1036,241,43,5),(1037,241,11,5),(1038,243,6,4),(1039,243,29,4),(1040,243,45,4),(1041,244,6,4),(1042,244,29,4),(1043,244,45,4),(1044,245,6,4),(1045,245,29,4),(1046,245,45,4),(1047,247,6,4),(1048,247,29,4),(1049,247,45,4),(1050,246,29,5),(1051,246,8,5),(1052,246,29,5),(1053,246,6,5),(1054,246,22,5),(1055,246,43,5),(1056,246,11,5),(1057,246,39,5),(1058,252,6,4),(1059,252,29,4),(1060,252,45,4),(1061,253,3,4),(1062,253,4,4),(1063,253,39,5),(1064,254,3,4),(1065,254,4,4),(1066,254,39,5),(1067,255,3,4),(1068,255,4,4),(1069,255,8,4),(1070,255,6,4),(1071,255,39,5),(1072,256,3,4),(1073,256,4,4),(1074,256,6,5),(1075,256,39,5),(1076,257,3,4),(1077,257,4,4),(1078,257,6,5),(1079,257,39,5),(1080,258,3,4),(1081,258,4,4),(1082,258,39,5),(1083,259,3,4),(1084,259,4,4),(1085,259,6,5),(1086,259,39,5),(1087,260,3,4),(1088,260,4,4),(1089,260,6,5),(1090,260,39,5),(1091,262,3,4),(1092,262,4,4),(1093,262,6,5),(1094,262,39,5),(1095,261,3,4),(1096,261,4,4),(1097,261,39,5),(1098,263,3,4),(1099,263,4,4),(1100,263,6,5),(1101,263,39,5),(1102,264,22,2),(1103,264,45,4),(1104,264,28,4),(1105,264,8,4),(1106,264,19,4),(1107,264,29,4),(1108,264,3,4),(1109,264,4,4),(1110,264,17,5),(1111,264,12,5),(1112,264,22,7),(1113,265,3,4),(1114,265,4,4),(1115,265,39,5),(1116,266,3,4),(1117,266,4,4),(1118,266,39,5),(1119,269,3,4),(1120,269,4,4),(1121,269,6,5),(1122,269,39,5),(1123,270,3,4),(1124,270,4,4),(1125,270,28,4),(1126,270,8,4),(1127,270,45,4),(1128,270,29,4),(1129,271,22,2),(1130,271,45,4),(1131,271,28,4),(1132,271,8,4),(1133,271,19,4),(1134,271,29,4),(1135,271,3,4),(1136,271,4,4),(1137,271,17,5),(1138,271,12,5),(1139,271,22,5),(1140,271,22,7),(1141,275,3,3),(1142,275,4,4),(1143,275,39,5),(1144,276,3,3),(1145,276,4,4),(1146,276,39,5),(1147,277,3,3),(1148,277,4,4),(1149,277,22,5),(1150,277,39,5),(1151,278,3,3),(1152,278,4,4),(1153,278,39,5),(1154,281,3,3),(1155,281,4,4),(1156,281,39,5),(1157,279,3,3),(1158,279,4,4),(1159,279,39,5),(1160,280,3,3),(1161,280,4,4),(1162,280,39,5),(1163,280,45,5),(1164,282,3,3),(1165,282,4,4),(1166,282,39,5),(1167,283,3,3),(1168,283,4,4),(1169,283,39,5),(1170,284,3,3),(1171,284,4,4),(1172,284,39,5),(1173,284,45,5),(1174,285,3,3),(1175,285,4,4),(1176,285,39,5),(1177,286,3,3),(1178,286,4,4),(1179,286,39,5),(1180,287,3,3),(1181,287,4,4),(1182,287,22,5),(1183,287,39,5),(1184,290,3,3),(1185,290,4,4),(1186,290,39,5),(1187,290,45,5),(1188,288,3,3),(1189,288,4,4),(1190,288,39,5),(1191,289,3,3),(1192,289,4,4),(1193,289,39,5),(1194,291,3,3),(1195,291,4,4),(1196,291,39,5),(1197,292,3,3),(1198,292,4,4),(1199,292,39,5),(1200,293,3,3),(1201,293,4,4),(1202,293,39,5),(1203,295,3,3),(1204,295,4,4),(1205,295,39,5),(1206,294,3,3),(1207,294,4,4),(1208,294,39,5),(1209,296,3,3),(1210,296,4,4),(1211,296,39,5),(1212,297,22,2),(1213,297,3,3),(1214,297,4,4),(1215,297,12,5),(1216,297,17,5),(1217,297,39,5),(1218,297,45,5),(1219,297,22,5),(1220,297,22,7),(1221,298,3,3),(1222,298,4,4),(1223,298,39,5),(1224,299,4,3),(1225,299,3,4),(1226,299,38,5),(1227,300,4,3),(1228,300,3,4),(1229,300,6,5),(1230,301,4,3),(1231,301,3,4),(1232,301,6,5),(1233,301,38,5),(1234,302,4,3),(1235,302,3,4),(1236,302,6,5),(1237,302,38,5),(1238,303,4,3),(1239,303,3,4),(1240,303,6,5),(1241,303,38,5),(1242,304,4,3),(1243,304,3,4),(1244,304,6,5),(1245,305,3,4),(1246,305,4,4),(1247,305,6,5),(1248,305,39,5),(1249,307,4,3),(1250,307,3,4),(1251,307,38,5),(1252,306,4,3),(1253,306,3,4),(1254,306,6,5),(1255,309,4,3),(1256,309,3,4),(1257,309,38,5),(1258,308,4,3),(1259,308,3,4),(1260,308,38,5),(1261,310,4,3),(1262,311,4,3),(1263,311,3,4),(1264,311,38,5),(1265,312,39,3),(1266,312,4,5),(1267,312,3,5),(1268,312,6,5),(1269,312,38,5),(1270,313,39,3),(1271,314,39,3),(1272,315,39,3),(1273,317,39,3),(1274,319,39,3),(1275,318,39,3),(1276,320,39,3),(1277,321,39,3),(1278,323,39,3),(1279,324,39,3),(1280,325,39,3),(1281,326,39,3),(1282,327,39,3),(1283,330,39,3),(1284,329,39,3),(1285,331,39,3),(1286,328,39,3),(1287,334,38,3),(1288,335,38,3),(1289,338,38,3),(1290,337,38,3),(1291,339,38,3),(1292,340,38,3),(1293,340,4,5),(1294,340,3,5),(1295,340,6,5),(1296,340,39,5),(1297,341,38,3),(1298,343,38,3),(1299,344,38,3),(1300,355,22,2),(1301,355,28,4),(1302,355,8,4),(1303,355,45,4),(1304,355,19,4),(1305,355,29,4),(1306,355,3,4),(1307,355,4,4),(1308,355,17,5),(1309,355,12,5),(1310,355,43,5),(1311,355,22,5),(1312,355,22,7),(1313,357,45,4),(1314,357,28,4),(1315,357,8,4),(1316,357,19,4),(1317,357,29,4),(1318,357,3,4),(1319,357,4,4),(1320,356,45,4),(1321,356,28,4),(1322,356,8,4),(1323,356,19,4),(1324,356,29,4),(1325,356,3,4),(1326,356,4,4),(1327,356,17,5),(1328,356,12,5),(1329,358,22,2),(1330,358,45,4),(1331,358,28,4),(1332,358,8,4),(1333,358,19,4),(1334,358,29,4),(1335,358,3,4),(1336,358,4,4),(1337,358,17,5),(1338,358,12,5),(1339,358,22,5),(1340,358,22,7),(1341,362,45,4),(1342,362,28,4),(1343,362,8,4),(1344,362,19,4),(1345,362,29,4),(1346,362,3,4),(1347,362,4,4),(1348,359,22,2),(1349,359,45,4),(1350,359,28,4),(1351,359,8,4),(1352,359,19,4),(1353,359,29,4),(1354,359,3,4),(1355,359,4,4),(1356,359,17,5),(1357,359,12,5),(1358,359,43,5),(1359,359,22,5),(1360,359,22,7),(1361,361,45,4),(1362,361,28,4),(1363,361,8,4),(1364,361,19,4),(1365,361,29,4),(1366,361,3,4),(1367,361,4,4),(1368,363,45,4),(1369,363,28,4),(1370,363,8,4),(1371,363,19,4),(1372,363,29,4),(1373,363,3,4),(1374,363,4,4),(1375,363,22,5),(1376,363,17,5),(1377,363,12,5),(1378,360,22,2),(1379,360,28,4),(1380,360,8,4),(1381,360,45,4),(1382,360,19,4),(1383,360,29,4),(1384,360,3,4),(1385,360,4,4),(1386,360,17,5),(1387,360,12,5),(1388,360,43,5),(1389,360,22,7),(1390,364,45,4),(1391,364,28,4),(1392,364,8,4),(1393,364,19,4),(1394,364,29,4),(1395,364,3,4),(1396,364,4,4),(1397,364,22,5),(1398,364,17,5),(1399,364,12,5),(1400,365,45,4),(1401,365,28,4),(1402,365,8,4),(1403,365,19,4),(1404,365,29,4),(1405,365,3,4),(1406,365,4,4),(1407,365,22,4),(1408,365,28,4),(1409,365,17,5),(1410,365,12,5),(1411,366,45,4),(1412,366,28,4),(1413,366,8,4),(1414,366,19,4),(1415,366,29,4),(1416,366,3,4),(1417,366,4,4),(1418,366,17,5),(1419,366,12,5),(1420,366,22,5),(1421,367,45,4),(1422,367,28,4),(1423,367,8,4),(1424,367,19,4),(1425,367,29,4),(1426,367,3,4),(1427,367,4,4),(1428,367,17,5),(1429,367,12,5),(1430,368,45,4),(1431,368,28,4),(1432,368,8,4),(1433,368,19,4),(1434,368,29,4),(1435,368,3,4),(1436,368,4,4),(1437,368,22,4),(1438,368,28,4),(1439,369,22,2),(1440,369,45,4),(1441,369,28,4),(1442,369,8,4),(1443,369,19,4),(1444,369,29,4),(1445,369,3,4),(1446,369,4,4),(1447,369,22,4),(1448,369,22,7),(1449,370,45,4),(1450,370,28,4),(1451,370,8,4),(1452,370,19,4),(1453,370,29,4),(1454,370,3,4),(1455,370,4,4),(1456,370,17,5),(1457,370,12,5),(1458,371,45,4),(1459,371,28,4),(1460,371,8,4),(1461,371,19,4),(1462,371,29,4),(1463,371,3,4),(1464,371,4,4),(1465,371,22,5),(1466,374,22,2),(1467,374,45,4),(1468,374,28,4),(1469,374,8,4),(1470,374,19,4),(1471,374,29,4),(1472,374,3,4),(1473,374,4,4),(1474,374,17,5),(1475,374,12,5),(1476,374,22,5),(1477,374,22,7),(1478,372,45,4),(1479,372,28,4),(1480,372,8,4),(1481,372,19,4),(1482,372,29,4),(1483,372,3,4),(1484,372,4,4),(1485,372,17,5),(1486,372,12,5),(1487,373,22,2),(1488,373,45,4),(1489,373,28,4),(1490,373,8,4),(1491,373,19,4),(1492,373,29,4),(1493,373,3,4),(1494,373,4,4),(1495,373,17,5),(1496,373,12,5),(1497,373,22,5),(1498,373,22,7),(1499,375,45,4),(1500,375,28,4),(1501,375,8,4),(1502,375,19,4),(1503,375,29,4),(1504,375,3,4),(1505,375,4,4),(1506,376,45,4),(1507,376,28,4),(1508,376,8,4),(1509,376,19,4),(1510,376,29,4),(1511,376,3,4),(1512,376,4,4),(1513,377,45,4),(1514,377,28,4),(1515,377,8,4),(1516,377,19,4),(1517,377,29,4),(1518,377,3,4),(1519,377,4,4),(1520,378,45,4),(1521,378,28,4),(1522,378,8,4),(1523,378,19,4),(1524,378,29,4),(1525,378,3,4),(1526,378,4,4),(1527,379,45,4),(1528,379,28,4),(1529,379,8,4),(1530,379,19,4),(1531,379,29,4),(1532,379,3,4),(1533,379,4,4),(1534,379,22,4),(1535,379,28,4),(1536,380,22,2),(1537,380,45,4),(1538,380,28,4),(1539,380,8,4),(1540,380,19,4),(1541,380,29,4),(1542,380,3,4),(1543,380,4,4),(1544,380,17,5),(1545,380,12,5),(1546,380,43,5),(1547,380,22,5),(1548,380,22,7),(1549,383,45,4),(1550,383,28,4),(1551,383,8,4),(1552,383,19,4),(1553,383,29,4),(1554,383,3,4),(1555,383,4,4),(1556,382,22,2),(1557,382,45,4),(1558,382,28,4),(1559,382,8,4),(1560,382,19,4),(1561,382,29,4),(1562,382,3,4),(1563,382,4,4),(1564,382,17,5),(1565,382,12,5),(1566,382,43,5),(1567,382,22,5),(1568,382,22,7),(1569,385,45,4),(1570,385,28,4),(1571,385,8,4),(1572,385,19,4),(1573,385,29,4),(1574,385,3,4),(1575,385,4,4),(1576,384,45,4),(1577,384,28,4),(1578,384,8,4),(1579,384,19,4),(1580,384,29,4),(1581,384,3,4),(1582,384,4,4),(1583,381,22,2),(1584,381,45,4),(1585,381,28,4),(1586,381,8,4),(1587,381,19,4),(1588,381,29,4),(1589,381,3,4),(1590,381,4,4),(1591,381,17,5),(1592,381,12,5),(1593,381,43,5),(1594,381,22,5),(1595,381,22,7),(1596,386,45,4),(1597,386,28,4),(1598,386,8,4),(1599,386,19,4),(1600,386,29,4),(1601,386,3,4),(1602,386,4,4),(1603,386,22,4),(1604,387,45,4),(1605,387,28,4),(1606,387,8,4),(1607,387,19,4),(1608,387,29,4),(1609,387,3,4),(1610,387,4,4),(1611,388,45,4),(1612,388,28,4),(1613,388,8,4),(1614,388,19,4),(1615,388,29,4),(1616,388,3,4),(1617,388,4,4),(1618,389,45,4),(1619,389,28,4),(1620,389,8,4),(1621,389,19,4),(1622,389,29,4),(1623,389,3,4),(1624,389,4,4),(1625,392,45,4),(1626,392,28,4),(1627,392,8,4),(1628,392,19,4),(1629,392,29,4),(1630,392,3,4),(1631,392,4,4),(1632,391,45,4),(1633,391,28,4),(1634,391,8,4),(1635,391,19,4),(1636,391,29,4),(1637,391,3,4),(1638,391,4,4),(1639,390,45,4),(1640,390,28,4),(1641,390,8,4),(1642,390,19,4),(1643,390,29,4),(1644,390,3,4),(1645,390,4,4),(1646,393,22,2),(1647,393,45,4),(1648,393,28,4),(1649,393,8,4),(1650,393,19,4),(1651,393,29,4),(1652,393,3,4),(1653,393,4,4),(1654,393,17,5),(1655,393,12,5),(1656,393,22,5),(1657,393,22,7),(1658,394,45,4),(1659,394,28,4),(1660,394,8,4),(1661,394,19,4),(1662,394,29,4),(1663,394,3,4),(1664,394,4,4),(1665,395,45,4),(1666,395,28,4),(1667,395,8,4),(1668,395,19,4),(1669,395,29,4),(1670,395,3,4),(1671,395,4,4),(1672,395,17,5),(1673,395,12,5),(1674,396,22,2),(1675,396,45,4),(1676,396,28,4),(1677,396,8,4),(1678,396,19,4),(1679,396,29,4),(1680,396,3,4),(1681,396,4,4),(1682,396,17,5),(1683,396,12,5),(1684,396,43,5),(1685,396,22,5),(1686,396,22,7),(1687,398,22,2),(1688,398,45,4),(1689,398,28,4),(1690,398,8,4),(1691,398,19,4),(1692,398,29,4),(1693,398,3,4),(1694,398,4,4),(1695,398,17,5),(1696,398,12,5),(1697,398,43,5),(1698,398,22,5),(1699,398,22,7),(1700,399,45,4),(1701,399,28,4),(1702,399,8,4),(1703,399,19,4),(1704,399,29,4),(1705,399,3,4),(1706,399,4,4),(1707,402,45,4),(1708,402,28,4),(1709,402,8,4),(1710,402,19,4),(1711,402,29,4),(1712,402,3,4),(1713,402,4,4),(1714,401,45,4),(1715,401,28,4),(1716,401,8,4),(1717,401,19,4),(1718,401,29,4),(1719,401,3,4),(1720,401,4,4),(1721,403,45,4),(1722,403,28,4),(1723,403,8,4),(1724,403,19,4),(1725,403,29,4),(1726,403,3,4),(1727,403,4,4),(1728,405,45,4),(1729,405,28,4),(1730,405,8,4),(1731,405,19,4),(1732,405,29,4),(1733,405,3,4),(1734,405,4,4),(1735,406,45,4),(1736,406,28,4),(1737,406,8,4),(1738,406,19,4),(1739,406,29,4),(1740,406,3,4),(1741,406,4,4),(1742,407,45,4),(1743,407,28,4),(1744,407,8,4),(1745,407,19,4),(1746,407,29,4),(1747,407,3,4),(1748,407,4,4),(1749,408,45,4),(1750,408,28,4),(1751,408,8,4),(1752,408,19,4),(1753,408,29,4),(1754,408,3,4),(1755,408,4,4),(1756,410,45,4),(1757,410,28,4),(1758,410,8,4),(1759,410,19,4),(1760,410,29,4),(1761,410,3,4),(1762,410,4,4),(1763,410,17,5),(1764,410,12,5),(1765,411,22,2),(1766,411,45,4),(1767,411,28,4),(1768,411,8,4),(1769,411,19,4),(1770,411,29,4),(1771,411,3,4),(1772,411,4,4),(1773,411,17,5),(1774,411,12,5),(1775,411,22,5),(1776,411,22,7),(1777,414,22,2),(1778,414,45,4),(1779,414,28,4),(1780,414,8,4),(1781,414,19,4),(1782,414,29,4),(1783,414,3,4),(1784,414,4,4),(1785,414,17,5),(1786,414,12,5),(1787,414,22,5),(1788,414,22,7),(1789,412,22,2),(1790,412,45,4),(1791,412,28,4),(1792,412,8,4),(1793,412,19,4),(1794,412,29,4),(1795,412,3,4),(1796,412,4,4),(1797,412,17,5),(1798,412,12,5),(1799,412,22,5),(1800,412,22,7),(1801,413,22,2),(1802,413,45,4),(1803,413,28,4),(1804,413,8,4),(1805,413,19,4),(1806,413,29,4),(1807,413,3,4),(1808,413,4,4),(1809,413,17,5),(1810,413,12,5),(1811,413,43,5),(1812,413,22,5),(1813,413,22,7),(1814,415,22,2),(1815,415,45,4),(1816,415,28,4),(1817,415,8,4),(1818,415,19,4),(1819,415,29,4),(1820,415,3,4),(1821,415,4,4),(1822,415,12,5),(1823,415,17,5),(1824,415,22,5),(1825,415,22,7),(1826,417,22,2),(1827,417,45,4),(1828,417,28,4),(1829,417,8,4),(1830,417,19,4),(1831,417,29,4),(1832,417,3,4),(1833,417,4,4),(1834,417,22,5),(1835,417,22,7),(1836,419,22,2),(1837,419,45,4),(1838,419,28,4),(1839,419,8,4),(1840,419,19,4),(1841,419,29,4),(1842,419,3,4),(1843,419,4,4),(1844,419,17,5),(1845,419,12,5),(1846,419,22,5),(1847,419,22,7),(1848,420,22,2),(1849,420,45,4),(1850,420,28,4),(1851,420,8,4),(1852,420,19,4),(1853,420,29,4),(1854,420,3,4),(1855,420,4,4),(1856,420,12,5),(1857,420,17,5),(1858,420,22,5),(1859,420,22,7),(1860,422,22,2),(1861,422,45,4),(1862,422,28,4),(1863,422,8,4),(1864,422,19,4),(1865,422,29,4),(1866,422,3,4),(1867,422,4,4),(1868,422,12,5),(1869,422,17,5),(1870,422,22,5),(1871,422,22,7),(1872,423,22,2),(1873,423,45,4),(1874,423,28,4),(1875,423,8,4),(1876,423,19,4),(1877,423,29,4),(1878,423,3,4),(1879,423,4,4),(1880,423,12,5),(1881,423,22,5),(1882,423,22,7),(1883,425,45,4),(1884,425,28,4),(1885,425,8,4),(1886,425,19,4),(1887,425,29,4),(1888,425,3,4),(1889,425,4,4),(1890,425,22,4),(1891,425,28,4),(1892,425,12,5),(1893,425,17,5),(1894,426,28,4),(1895,426,8,4),(1896,426,45,4),(1897,426,29,4),(1898,426,6,5),(1899,426,39,5),(1900,427,3,4),(1901,427,4,4),(1902,427,28,4),(1903,427,45,4),(1904,427,29,4),(1905,428,3,4),(1906,428,4,4),(1907,428,28,4),(1908,428,8,4),(1909,428,45,4),(1910,428,29,4),(1911,430,3,4),(1912,430,4,4),(1913,430,28,4),(1914,430,45,4),(1915,430,29,4),(1916,429,3,4),(1917,429,4,4),(1918,429,28,4),(1919,429,8,4),(1920,429,19,4),(1921,429,29,4),(1922,429,45,4),(1923,429,29,4),(1924,431,3,4),(1925,431,4,4),(1926,431,28,4),(1927,431,8,4),(1928,431,45,4),(1929,431,29,4),(1930,432,3,4),(1931,432,4,4),(1932,432,28,4),(1933,432,8,4),(1934,432,45,4),(1935,432,29,4),(1936,433,28,4),(1937,433,8,4),(1938,433,45,4),(1939,433,29,4),(1940,433,6,5),(1941,433,39,5),(1942,434,3,4),(1943,434,4,4),(1944,434,28,4),(1945,434,8,4),(1946,434,45,4),(1947,434,29,4),(1948,435,3,4),(1949,435,4,4),(1950,435,28,4),(1951,435,8,4),(1952,435,45,4),(1953,435,29,4),(1954,436,3,4),(1955,436,4,4),(1956,436,28,4),(1957,436,8,4),(1958,436,45,4),(1959,436,29,4),(1960,437,3,4),(1961,437,4,4),(1962,437,28,4),(1963,437,8,4),(1964,437,45,4),(1965,437,29,4),(1966,438,3,4),(1967,438,4,4),(1968,438,28,4),(1969,438,8,4),(1970,438,19,4),(1971,438,29,4),(1972,438,45,4),(1973,438,29,4),(1974,440,28,4),(1975,440,8,4),(1976,440,45,4),(1977,440,29,4),(1978,440,3,4),(1979,440,4,4),(1980,440,22,5),(1981,439,3,4),(1982,439,4,4),(1983,439,28,4),(1984,439,8,4),(1985,439,45,4),(1986,439,29,4),(1987,441,3,4),(1988,441,4,4),(1989,441,28,4),(1990,441,8,4),(1991,441,45,4),(1992,441,29,4),(1993,442,3,4),(1994,442,4,4),(1995,442,28,4),(1996,442,8,4),(1997,442,19,4),(1998,442,29,4),(1999,442,45,4),(2000,442,29,4),(2001,443,28,4),(2002,443,8,4),(2003,443,45,4),(2004,443,29,4),(2005,443,6,5),(2006,443,39,5),(2007,444,3,4),(2008,444,4,4),(2009,444,28,4),(2010,444,8,4),(2011,444,19,4),(2012,444,29,4),(2013,444,45,4),(2014,444,29,4),(2015,445,3,4),(2016,445,4,4),(2017,445,28,4),(2018,445,8,4),(2019,445,19,4),(2020,445,29,4),(2021,445,45,4),(2022,445,29,4),(2023,446,28,4),(2024,446,8,4),(2025,446,45,4),(2026,446,29,4),(2027,446,22,5),(2028,446,39,5),(2029,447,3,4),(2030,447,4,4),(2031,447,28,4),(2032,447,8,4),(2033,447,45,4),(2034,447,29,4),(2035,448,3,4),(2036,448,4,4),(2037,448,28,4),(2038,448,8,4),(2039,448,45,4),(2040,448,29,4),(2041,450,28,4),(2042,450,8,4),(2043,450,45,4),(2044,450,29,4),(2045,450,39,5),(2046,449,3,4),(2047,449,4,4),(2048,449,28,4),(2049,449,8,4),(2050,449,45,4),(2051,449,29,4),(2052,451,3,4),(2053,451,4,4),(2054,451,28,4),(2055,451,29,4),(2056,451,45,4),(2057,452,3,4),(2058,452,4,4),(2059,452,28,4),(2060,452,8,4),(2061,452,19,4),(2062,452,29,4),(2063,452,45,4),(2064,452,29,4),(2065,453,3,4),(2066,453,4,4),(2067,453,28,4),(2068,453,29,4),(2069,453,45,4),(2070,454,3,4),(2071,454,4,4),(2072,454,28,4),(2073,454,8,4),(2074,454,45,4),(2075,454,29,4),(2076,455,3,4),(2077,455,4,4),(2078,455,28,4),(2079,455,8,4),(2080,455,45,4),(2081,455,29,4),(2082,455,22,4),(2083,455,28,4),(2084,456,3,4),(2085,456,4,4),(2086,456,28,4),(2087,456,8,4),(2088,456,45,4),(2089,456,29,4),(2090,457,3,4),(2091,457,4,4),(2092,457,28,4),(2093,457,29,4),(2094,457,45,4),(2095,458,3,4),(2096,458,4,4),(2097,458,28,4),(2098,458,45,4),(2099,458,29,4),(2100,459,3,4),(2101,459,4,4),(2102,459,28,4),(2103,459,8,4),(2104,459,45,4),(2105,459,29,4),(2106,460,3,4),(2107,460,4,4),(2108,460,28,4),(2109,460,8,4),(2110,460,19,4),(2111,460,29,4),(2112,460,45,4),(2113,460,29,4),(2114,462,29,4),(2115,462,28,4),(2116,462,8,4),(2117,462,45,4),(2118,463,3,4),(2119,463,4,4),(2120,463,28,4),(2121,463,8,4),(2122,463,45,4),(2123,463,29,4),(2124,464,3,4),(2125,464,4,4),(2126,464,28,4),(2127,464,8,4),(2128,464,19,4),(2129,464,29,4),(2130,464,45,4),(2131,464,29,4),(2132,465,28,4),(2133,465,29,4),(2134,465,45,4),(2135,467,3,4),(2136,467,4,4),(2137,467,28,4),(2138,467,8,4),(2139,467,45,4),(2140,467,29,4),(2141,468,29,4),(2142,468,28,4),(2143,468,8,4),(2144,468,45,4),(2145,470,3,4),(2146,470,4,4),(2147,470,28,4),(2148,470,45,4),(2149,470,29,4),(2150,471,3,4),(2151,471,4,4),(2152,471,28,4),(2153,471,45,4),(2154,471,29,4),(2155,473,3,4),(2156,473,4,4),(2157,473,28,4),(2158,473,8,4),(2159,473,45,4),(2160,473,29,4),(2161,474,3,4),(2162,474,4,4),(2163,474,28,4),(2164,474,8,4),(2165,474,45,4),(2166,474,29,4),(2167,475,3,4),(2168,475,4,4),(2169,475,28,4),(2170,475,8,4),(2171,475,45,4),(2172,475,29,4),(2173,476,3,4),(2174,476,4,4),(2175,476,28,4),(2176,476,8,4),(2177,476,19,4),(2178,476,29,4),(2179,476,45,4),(2180,476,29,4),(2181,477,3,4),(2182,477,4,4),(2183,477,28,4),(2184,477,8,4),(2185,477,19,4),(2186,477,29,4),(2187,477,45,4),(2188,477,29,4),(2189,478,3,4),(2190,478,4,4),(2191,478,28,4),(2192,478,45,4),(2193,478,29,4),(2194,479,3,4),(2195,479,4,4),(2196,479,28,4),(2197,479,8,4),(2198,479,45,4),(2199,479,29,4),(2200,481,3,4),(2201,481,4,4),(2202,481,28,4),(2203,481,8,4),(2204,481,45,4),(2205,481,29,4),(2206,483,3,4),(2207,483,4,4),(2208,483,28,4),(2209,483,45,4),(2210,483,29,4),(2211,480,3,4),(2212,480,4,4),(2213,480,28,4),(2214,480,29,4),(2215,480,45,4),(2216,484,3,4),(2217,484,4,4),(2218,484,28,4),(2219,484,45,4),(2220,484,29,4),(2221,485,3,4),(2222,485,4,4),(2223,485,28,4),(2224,485,8,4),(2225,485,45,4),(2226,485,29,4),(2227,486,3,4),(2228,486,4,4),(2229,486,28,4),(2230,486,29,4),(2231,486,45,4),(2232,487,3,4),(2233,487,4,4),(2234,487,28,4),(2235,487,8,4),(2236,487,19,4),(2237,487,29,4),(2238,487,45,4),(2239,487,29,4),(2240,488,3,4),(2241,488,4,4),(2242,488,28,4),(2243,488,29,4),(2244,488,45,4),(2245,489,3,4),(2246,489,4,4),(2247,489,28,4),(2248,489,45,4),(2249,489,29,4),(2250,490,3,4),(2251,490,4,4),(2252,490,28,4),(2253,490,45,4),(2254,490,29,4),(2255,491,3,4),(2256,491,4,4),(2257,491,28,4),(2258,491,29,4),(2259,491,45,4),(2260,492,3,4),(2261,492,4,4),(2262,492,28,4),(2263,492,8,4),(2264,492,45,4),(2265,492,29,4),(2266,494,3,4),(2267,494,4,4),(2268,494,28,4),(2269,494,29,4),(2270,494,45,4),(2271,493,3,4),(2272,493,4,4),(2273,493,28,4),(2274,493,8,4),(2275,493,19,4),(2276,493,29,4),(2277,493,45,4),(2278,493,29,4),(2279,495,3,4),(2280,495,4,4),(2281,495,28,4),(2282,495,8,4),(2283,495,19,4),(2284,495,29,4),(2285,495,45,4),(2286,495,29,4),(2287,496,3,4),(2288,496,4,4),(2289,496,28,4),(2290,496,8,4),(2291,496,45,4),(2292,496,29,4),(2293,497,18,3),(2294,497,46,4),(2295,497,28,4),(2296,497,29,4),(2297,497,8,4),(2298,497,45,4),(2299,497,22,5),(2300,497,39,5),(2301,498,28,4),(2302,498,29,4),(2303,498,8,4),(2304,498,45,4),(2305,498,22,5),(2306,498,18,5),(2307,498,46,5),(2308,498,39,5),(2309,499,3,4),(2310,499,4,4),(2311,499,28,4),(2312,499,8,4),(2313,499,19,4),(2314,499,29,4),(2315,499,45,4),(2316,499,29,4),(2317,501,3,4),(2318,501,4,4),(2319,501,28,4),(2320,501,45,4),(2321,501,29,4),(2322,503,28,4),(2323,503,29,4),(2324,503,8,4),(2325,503,45,4),(2326,503,22,5),(2327,503,18,5),(2328,503,46,5),(2329,503,39,5),(2330,518,22,5),(2331,534,45,3),(2332,535,45,3),(2333,536,29,3),(2334,536,19,4),(2335,536,8,4),(2336,536,38,5),(2337,538,19,3),(2338,538,29,4),(2339,538,8,4),(2340,538,45,5),(2341,538,38,5),(2342,537,19,3),(2343,537,29,4),(2344,537,8,4),(2345,537,45,5),(2346,537,7,5),(2347,537,38,5),(2348,539,19,3),(2349,539,29,4),(2350,539,8,4),(2351,539,45,5),(2352,539,38,5),(2353,542,19,3),(2354,542,29,4),(2355,542,8,4),(2356,542,45,5),(2357,542,7,5),(2358,542,38,5),(2359,541,29,3),(2360,541,19,4),(2361,541,8,4),(2362,541,52,4),(2363,541,7,5),(2364,541,6,5),(2365,541,6,5),(2366,541,38,5),(2367,543,19,3),(2368,543,29,4),(2369,543,8,4),(2370,543,38,5),(2371,544,29,3),(2372,544,19,4),(2373,544,8,4),(2374,544,52,4),(2375,544,6,5),(2376,544,38,5),(2377,540,29,3),(2378,540,19,4),(2379,540,8,4),(2380,540,52,4),(2381,540,45,5),(2382,540,6,5),(2383,540,38,5),(2384,545,29,3),(2385,545,19,4),(2386,545,8,4),(2387,545,52,4),(2388,545,6,5),(2389,545,38,5),(2390,546,29,3),(2391,546,19,4),(2392,546,8,4),(2393,546,52,4),(2394,546,6,5),(2395,547,19,3),(2396,549,19,3),(2397,548,19,3),(2398,550,29,3),(2399,551,29,3),(2400,552,22,2),(2401,552,19,3),(2402,552,29,4),(2403,552,8,4),(2404,552,45,4),(2405,552,12,5),(2406,552,17,5),(2407,552,28,5),(2408,552,45,5),(2409,552,38,5),(2410,552,22,5),(2411,552,22,7),(2412,553,51,3),(2413,553,28,4),(2414,553,6,4),(2415,553,39,5),(2416,554,51,3),(2417,554,28,4),(2418,554,6,4),(2419,554,29,5),(2420,554,45,5),(2421,554,39,5),(2422,555,51,3),(2423,555,28,4),(2424,555,6,4),(2425,555,39,5),(2426,559,51,3),(2427,556,51,3),(2428,556,28,4),(2429,556,6,4),(2430,556,39,5),(2431,558,51,3),(2432,558,28,4),(2433,558,6,5),(2434,557,51,3),(2435,557,28,4),(2436,557,6,4),(2437,557,29,5),(2438,557,45,5),(2439,557,39,5),(2440,560,51,3),(2441,561,51,3),(2442,561,28,4),(2443,561,6,5),(2444,561,39,5),(2445,562,6,4),(2446,562,29,4),(2447,562,45,4),(2448,562,28,4),(2449,563,6,4),(2450,563,29,4),(2451,563,45,4),(2452,563,28,4),(2453,564,6,4),(2454,564,12,5),(2455,565,6,4),(2456,567,6,4),(2457,566,6,4),(2458,566,12,5),(2459,568,6,4),(2460,569,6,4),(2461,570,6,4),(2462,570,29,4),(2463,570,45,4),(2464,570,28,4),(2465,571,6,4),(2466,571,3,5),(2467,571,39,5),(2468,572,6,4),(2469,573,6,4),(2470,573,3,5),(2471,573,39,5),(2472,574,6,4),(2473,574,3,5),(2474,574,39,5),(2475,575,6,4),(2476,576,29,4),(2477,576,45,4),(2478,576,3,5),(2479,576,39,5),(2480,576,22,5),(2481,577,6,4),(2482,578,6,4),(2483,578,29,4),(2484,579,6,4),(2485,579,22,4),(2486,579,6,4),(2487,580,6,4),(2488,582,6,4),(2489,582,29,5),(2490,582,6,5),(2491,581,6,4),(2492,583,6,4),(2493,584,6,4),(2494,585,6,4),(2495,585,6,4),(2496,585,22,4),(2497,585,28,4),(2498,585,12,4),(2499,585,6,4),(2500,586,6,4),(2501,586,29,4),(2502,587,6,4),(2503,587,29,4),(2504,588,6,4),(2505,589,6,4),(2506,589,3,5),(2507,589,39,5),(2508,590,28,4),(2509,590,8,4),(2510,590,29,4),(2511,590,45,4),(2512,590,6,5),(2513,590,39,5),(2514,591,6,4),(2515,591,3,5),(2516,591,39,5),(2517,592,28,4),(2518,592,8,4),(2519,592,29,4),(2520,592,45,4),(2521,592,6,5),(2522,592,39,5),(2523,593,6,4),(2524,594,6,4),(2525,595,6,4),(2526,596,28,4),(2527,596,8,4),(2528,596,29,4),(2529,596,45,4),(2530,596,6,5),(2531,596,39,5),(2532,597,6,4),(2533,599,6,4),(2534,599,29,4),(2535,599,45,4),(2536,599,28,4),(2537,598,6,4),(2538,598,29,4),(2539,598,45,4),(2540,598,28,4),(2541,602,6,4),(2542,603,29,4),(2543,604,29,4),(2544,604,6,4),(2545,606,29,4),(2546,605,29,4),(2547,605,3,5),(2548,605,39,5),(2549,605,22,5),(2550,608,29,4),(2551,608,6,4),(2552,608,6,4),(2553,609,29,4),(2554,609,6,4),(2555,609,6,4),(2556,609,3,5),(2557,607,29,4),(2558,607,45,4),(2559,607,3,5),(2560,607,39,5),(2561,607,22,5),(2562,611,29,4),(2563,611,6,4),(2564,611,6,4),(2565,612,6,4),(2566,613,6,4),(2567,615,6,4),(2568,614,6,4),(2569,618,6,4),(2570,617,6,4),(2571,619,6,4),(2572,619,29,4),(2573,619,45,4),(2574,619,28,4),(2575,621,6,4),(2576,620,6,4),(2577,620,29,4),(2578,620,45,4),(2579,620,28,4),(2580,622,6,4),(2581,624,6,4),(2582,624,29,4),(2583,624,45,4),(2584,624,28,4),(2585,623,6,4),(2586,623,22,5),(2587,623,43,5),(2588,623,29,5),(2589,623,6,5),(2590,628,6,4),(2591,628,22,5),(2592,628,43,5),(2593,626,6,4),(2594,627,6,4),(2595,627,22,5),(2596,627,43,5),(2597,627,29,5),(2598,627,6,5),(2599,625,6,4),(2600,625,29,4),(2601,625,45,4),(2602,625,28,4),(2603,629,6,4),(2604,629,29,4),(2605,629,45,4),(2606,629,28,4),(2607,630,6,4),(2608,630,29,4),(2609,630,45,4),(2610,630,28,4),(2611,631,6,4),(2612,631,29,4),(2613,631,45,4),(2614,631,28,4),(2615,632,6,4),(2616,632,22,5),(2617,632,29,5),(2618,632,6,5),(2619,632,43,5),(2620,632,11,5),(2621,632,48,5),(2622,633,6,4),(2623,633,29,4),(2624,633,45,4),(2625,633,28,4),(2626,634,6,4),(2627,634,22,5),(2628,634,29,5),(2629,634,6,5),(2630,634,43,5),(2631,634,11,5),(2632,634,48,5),(2633,635,6,4),(2634,635,29,4),(2635,635,45,4),(2636,635,28,4),(2637,636,6,4),(2638,636,22,5),(2639,636,29,5),(2640,636,6,5),(2641,636,43,5),(2642,636,11,5),(2643,636,48,5),(2644,638,6,4),(2645,638,29,4),(2646,638,45,4),(2647,638,28,4),(2648,639,6,4),(2649,639,22,5),(2650,639,29,5),(2651,639,6,5),(2652,639,43,5),(2653,639,11,5),(2654,639,48,5),(2655,639,3,5),(2656,639,39,5),(2657,640,6,4),(2658,640,22,5),(2659,642,29,3),(2660,645,6,4),(2661,646,6,4),(2662,649,6,4),(2663,648,6,4),(2664,647,6,4),(2665,647,6,4),(2666,647,22,5),(2667,650,6,4),(2668,650,6,4),(2669,650,22,5),(2670,651,6,4),(2671,651,3,5),(2672,651,39,5),(2673,652,6,4),(2674,655,6,4),(2675,655,3,5),(2676,655,39,5),(2677,653,6,4),(2678,653,3,5),(2679,653,39,5),(2680,653,22,5),(2681,654,6,4),(2682,654,6,4),(2683,654,22,4),(2684,654,28,4),(2685,654,12,4),(2686,654,6,4),(2687,656,6,4),(2688,657,6,4),(2689,658,6,4),(2690,659,6,4),(2691,661,6,4),(2692,662,6,4),(2693,663,6,4),(2694,660,6,4),(2695,665,6,4),(2696,664,6,4),(2697,668,6,4),(2698,666,6,4),(2699,667,6,4),(2700,669,6,4),(2701,670,6,4),(2702,671,29,3),(2703,671,45,3),(2704,677,29,3),(2705,678,29,3),(2706,678,45,3),(2707,679,6,3),(2708,679,6,5),(2709,680,6,3),(2710,680,6,5),(2711,681,6,3),(2712,681,6,5),(2713,685,6,3),(2714,685,6,4),(2715,685,22,4),(2716,682,6,3),(2717,682,6,5),(2718,683,6,3),(2719,683,6,5),(2720,686,6,3),(2721,686,6,5),(2722,687,6,3),(2723,687,29,4),(2724,687,6,4),(2725,687,22,5),(2726,687,43,5),(2727,689,22,4),(2728,689,29,5),(2729,689,6,5),(2730,690,22,4),(2731,690,28,5),(2732,690,8,5),(2733,690,45,5),(2734,690,29,5),(2735,690,6,5),(2736,691,18,4),(2737,691,46,4),(2738,691,22,4),(2739,693,22,4),(2740,692,18,4),(2741,692,46,4),(2742,692,22,4),(2743,692,6,5),(2744,692,6,5),(2745,692,7,5),(2746,692,29,5),(2747,692,6,5),(2748,694,18,4),(2749,694,46,4),(2750,694,22,4),(2751,695,18,4),(2752,695,46,4),(2753,695,22,4),(2754,696,22,4),(2755,698,22,4),(2756,698,8,5),(2757,698,45,5),(2758,698,28,5),(2759,698,29,5),(2760,699,22,4),(2761,697,22,4),(2762,697,18,5),(2763,697,46,5),(2764,697,28,5),(2765,697,8,5),(2766,697,45,5),(2767,697,29,5),(2768,697,6,5),(2769,700,22,4),(2770,700,29,5),(2771,700,6,5),(2772,701,22,4),(2773,701,28,5),(2774,701,8,5),(2775,702,22,4),(2776,702,18,5),(2777,702,46,5),(2778,702,28,5),(2779,702,8,5),(2780,702,45,5),(2781,702,29,5),(2782,702,6,5),(2783,703,22,4),(2784,703,18,5),(2785,703,46,5),(2786,703,28,5),(2787,703,8,5),(2788,703,45,5),(2789,703,29,5),(2790,703,6,5),(2791,704,18,4),(2792,704,46,4),(2793,704,22,4),(2794,704,6,5),(2795,704,6,5),(2796,704,7,5),(2797,704,29,5),(2798,704,6,5),(2799,705,22,4),(2800,705,28,5),(2801,705,8,5),(2802,707,22,4),(2803,707,46,4),(2804,707,28,5),(2805,707,8,5),(2806,708,18,4),(2807,708,46,4),(2808,708,22,4),(2809,708,29,5),(2810,708,6,5),(2811,706,18,4),(2812,706,46,4),(2813,706,22,4),(2814,706,43,5),(2815,706,28,5),(2816,706,8,5),(2817,709,22,4),(2818,709,46,5),(2819,709,28,5),(2820,709,8,5),(2821,711,22,4),(2822,710,22,4),(2823,710,46,5),(2824,710,28,5),(2825,710,8,5),(2826,712,22,4),(2827,712,29,5),(2828,712,6,5),(2829,712,43,5),(2830,712,12,5),(2831,713,22,4),(2832,713,28,5),(2833,713,8,5),(2834,716,22,4),(2835,716,28,5),(2836,716,8,5),(2837,715,22,4),(2838,715,28,5),(2839,715,8,5),(2840,714,18,4),(2841,714,46,4),(2842,714,22,4),(2843,714,28,5),(2844,714,8,5),(2845,717,22,4),(2846,717,46,4),(2847,717,17,5),(2848,717,28,5),(2849,717,8,5),(2850,718,22,4),(2851,719,22,4),(2852,720,22,4),(2853,720,6,5),(2854,721,18,4),(2855,721,46,4),(2856,721,22,4),(2857,721,6,5),(2858,722,18,4),(2859,722,46,4),(2860,722,22,4),(2861,722,6,5),(2862,723,22,4),(2863,724,22,4),(2864,724,6,5),(2865,725,22,4),(2866,727,18,4),(2867,727,46,4),(2868,727,22,4),(2869,727,6,5),(2870,728,18,4),(2871,728,46,4),(2872,728,22,4),(2873,728,6,5),(2874,726,18,4),(2875,726,46,4),(2876,726,22,4),(2877,726,6,4),(2878,726,6,5),(2879,729,18,4),(2880,729,46,4),(2881,729,22,4),(2882,729,28,4),(2883,729,8,4),(2884,729,45,4),(2885,729,29,4),(2886,729,6,5),(2887,730,18,4),(2888,730,46,4),(2889,730,22,4),(2890,730,29,5),(2891,731,18,4),(2892,731,46,4),(2893,731,22,4),(2894,731,29,5),(2895,733,18,4),(2896,733,46,4),(2897,733,22,4),(2898,733,43,5),(2899,733,28,5),(2900,733,8,5),(2901,732,18,4),(2902,732,46,4),(2903,732,22,4),(2904,732,8,5),(2905,732,29,5),(2906,732,6,5),(2907,735,22,3),(2908,736,22,3),(2909,736,28,4),(2910,736,6,5),(2911,734,18,4),(2912,734,46,4),(2913,734,22,4),(2914,737,22,3),(2915,737,28,4),(2916,738,22,3),(2917,738,46,5),(2918,738,28,5),(2919,738,8,5),(2920,739,18,4),(2921,739,46,4),(2922,739,22,4),(2923,739,43,5),(2924,739,28,5),(2925,739,8,5),(2926,741,22,3),(2927,741,28,4),(2928,740,22,3),(2929,740,18,4),(2930,740,46,4),(2931,740,6,5),(2932,742,22,3),(2933,744,22,4),(2934,745,22,4),(2935,743,22,3),(2936,743,18,4),(2937,743,46,4),(2938,743,6,5),(2939,746,22,3),(2940,746,18,4),(2941,746,46,4),(2942,746,6,5),(2943,748,22,3),(2944,747,22,4),(2945,749,22,3),(2946,749,18,4),(2947,749,46,4),(2948,749,6,5),(2949,750,22,4),(2950,750,39,5),(2951,751,18,4),(2952,751,46,4),(2953,751,22,4),(2954,752,22,4),(2955,752,6,5),(2956,753,22,4),(2957,755,22,4),(2958,755,6,5),(2959,757,18,4),(2960,757,46,4),(2961,757,22,4),(2962,757,43,4),(2963,756,18,4),(2964,756,46,4),(2965,756,22,4),(2966,754,22,4),(2967,759,18,4),(2968,759,46,4),(2969,759,22,4),(2970,759,43,5),(2971,759,28,5),(2972,759,8,5),(2973,758,18,4),(2974,758,46,4),(2975,758,22,4),(2976,758,43,5),(2977,758,28,5),(2978,758,8,5),(2979,760,18,4),(2980,760,46,4),(2981,760,22,4),(2982,760,8,5),(2983,760,29,5),(2984,760,6,5),(2985,761,18,4),(2986,761,46,4),(2987,761,22,4),(2988,761,43,5),(2989,761,28,5),(2990,761,8,5),(2991,765,18,4),(2992,765,46,4),(2993,765,22,4),(2994,765,6,5),(2995,762,18,4),(2996,762,46,4),(2997,762,22,4),(2998,762,29,5),(2999,766,18,4),(3000,766,46,4),(3001,766,22,4),(3002,766,6,5),(3003,763,18,4),(3004,763,46,4),(3005,763,22,4),(3006,763,43,4),(3007,763,8,5),(3008,763,29,5),(3009,763,6,5),(3010,764,18,4),(3011,764,46,4),(3012,764,22,4),(3013,764,29,5),(3014,767,18,4),(3015,767,46,4),(3016,767,22,4),(3017,768,18,4),(3018,768,46,4),(3019,768,22,4),(3020,768,6,5),(3021,769,18,4),(3022,769,46,4),(3023,769,22,4),(3024,769,6,5),(3025,771,45,2),(3026,771,22,4),(3027,771,18,4),(3028,771,46,4),(3029,771,28,5),(3030,771,6,5),(3031,771,6,5),(3032,771,43,5),(3033,771,45,5),(3034,771,45,7),(3035,772,18,4),(3036,772,46,4),(3037,772,22,4),(3038,772,6,5),(3039,774,18,4),(3040,774,46,4),(3041,774,22,4),(3042,773,22,2),(3043,773,22,4),(3044,773,18,4),(3045,773,46,4),(3046,773,12,4),(3047,773,17,4),(3048,773,29,5),(3049,773,28,5),(3050,773,6,5),(3051,773,45,5),(3052,773,22,5),(3053,773,22,7),(3054,776,45,2),(3055,776,22,4),(3056,776,18,4),(3057,776,46,4),(3058,776,43,5),(3059,776,28,5),(3060,776,6,5),(3061,776,6,5),(3062,776,45,5),(3063,776,45,7),(3064,778,45,2),(3065,778,22,5),(3066,778,18,5),(3067,778,43,5),(3068,778,46,5),(3069,778,28,5),(3070,778,6,5),(3071,778,45,5),(3072,778,45,7),(3073,783,22,3),(3074,783,28,4),(3075,783,12,5),(3076,783,12,5),(3077,784,22,3),(3078,784,28,4),(3079,784,45,5),(3080,784,6,5),(3081,784,8,5),(3082,784,29,5),(3083,784,28,5),(3084,789,22,3),(3085,789,28,4),(3086,787,22,3),(3087,787,18,5),(3088,787,46,5),(3089,787,28,5),(3090,787,8,5),(3091,787,45,5),(3092,787,29,5),(3093,787,6,5),(3094,785,22,3),(3095,785,28,4),(3096,785,29,5),(3097,785,6,5),(3098,785,45,5),(3099,785,7,5),(3100,785,8,5),(3101,788,22,3),(3102,788,28,4),(3103,788,28,5),(3104,788,29,5),(3105,788,45,5),(3106,788,3,5),(3107,788,4,5),(3108,790,22,3),(3109,790,28,4),(3110,790,12,5),(3111,790,29,5),(3112,790,45,5),(3113,790,7,5),(3114,790,8,5),(3115,791,22,3),(3116,791,12,4),(3117,791,6,4),(3118,791,28,4),(3119,791,29,5),(3120,791,45,5),(3121,791,7,5),(3122,791,8,5),(3123,793,22,3),(3124,793,12,4),(3125,793,6,4),(3126,793,28,4),(3127,793,29,5),(3128,793,45,5),(3129,793,8,5),(3130,793,28,5),(3131,792,22,3),(3132,792,12,4),(3133,792,6,4),(3134,792,28,4),(3135,792,6,5),(3136,792,45,5),(3137,792,8,5),(3138,792,7,5),(3139,792,52,5),(3140,792,43,5),(3141,792,12,5),(3142,792,11,5),(3143,792,48,5),(3144,794,22,3),(3145,794,28,4),(3146,794,12,5),(3147,794,12,5),(3148,795,22,3),(3149,795,28,4),(3150,795,12,5),(3151,795,29,5),(3152,795,45,5),(3153,795,7,5),(3154,795,8,5),(3155,796,22,3),(3156,796,28,4),(3157,796,28,5),(3158,796,45,5),(3159,800,22,3),(3160,800,28,4),(3161,800,12,5),(3162,800,12,5),(3163,797,22,3),(3164,797,46,5),(3165,797,28,5),(3166,797,8,5),(3167,801,22,3),(3168,801,28,4),(3169,801,12,5),(3170,801,12,5),(3171,802,22,3),(3172,802,28,4),(3173,802,29,5),(3174,802,6,5),(3175,802,45,5),(3176,802,8,5),(3177,803,22,3),(3178,803,28,4),(3179,799,22,3),(3180,799,28,4),(3181,799,29,5),(3182,799,6,5),(3183,799,45,5),(3184,799,8,5),(3185,799,12,5),(3186,805,22,3),(3187,805,28,4),(3188,805,29,5),(3189,805,6,5),(3190,806,22,3),(3191,806,18,4),(3192,806,46,4),(3193,806,28,5),(3194,806,8,5),(3195,808,22,3),(3196,808,28,5),(3197,808,8,5),(3198,809,22,3),(3199,809,28,4),(3200,809,12,5),(3201,809,12,5),(3202,812,22,3),(3203,812,28,4),(3204,812,12,5),(3205,812,12,5),(3206,810,22,3),(3207,810,28,4),(3208,810,45,5),(3209,810,8,5),(3210,811,22,3),(3211,811,28,4),(3212,811,45,5),(3213,811,8,5),(3214,813,22,3),(3215,813,28,4),(3216,813,12,5),(3217,813,29,5),(3218,813,45,5),(3219,813,7,5),(3220,813,8,5),(3221,817,22,3),(3222,817,28,4),(3223,826,22,4),(3224,826,17,4),(3225,826,12,4),(3226,826,45,5),(3227,827,22,3),(3228,827,28,4),(3229,827,45,5),(3230,827,8,5),(3231,829,22,3),(3232,829,28,4),(3233,829,45,5),(3234,829,8,5),(3235,828,22,3),(3236,828,12,4),(3237,828,12,4),(3238,828,28,4),(3239,828,16,4),(3240,828,12,4),(3241,828,7,4),(3242,828,52,4),(3243,828,28,5),(3244,828,29,5),(3245,830,22,3),(3246,830,12,4),(3247,830,12,4),(3248,830,28,4),(3249,830,16,4),(3250,830,12,4),(3251,830,7,4),(3252,830,52,4),(3253,830,28,5),(3254,830,29,5),(3255,831,22,3),(3256,831,12,4),(3257,831,12,4),(3258,831,28,4),(3259,831,12,4),(3260,831,7,4),(3261,831,52,4),(3262,831,28,5),(3263,831,29,5),(3264,832,22,3),(3265,832,28,4),(3266,834,22,3),(3267,834,28,4),(3268,834,6,5),(3269,835,22,3),(3270,835,18,4),(3271,835,46,4),(3272,835,6,5),(3273,836,22,3),(3274,836,18,4),(3275,836,46,4),(3276,836,6,5),(3277,833,22,3),(3278,833,28,4),(3279,833,6,5),(3280,833,6,5),(3281,833,43,5),(3282,833,18,5),(3283,833,46,5),(3284,838,22,3),(3285,838,28,4),(3286,838,6,5),(3287,837,22,3),(3288,837,18,4),(3289,837,46,4),(3290,837,6,5),(3291,839,22,3),(3292,839,18,4),(3293,839,46,4),(3294,839,6,5),(3295,841,22,3),(3296,840,22,3),(3297,842,22,3),(3298,842,28,4),(3299,842,12,4),(3300,842,12,4),(3301,842,16,4),(3302,842,12,4),(3303,842,6,5),(3304,842,7,5),(3305,842,52,5),(3306,842,3,5),(3307,842,4,5),(3308,842,39,5),(3309,842,28,5),(3310,842,45,5),(3311,843,22,3),(3312,843,28,4),(3313,844,22,3),(3314,844,12,4),(3315,844,12,4),(3316,844,28,4),(3317,844,16,4),(3318,844,12,4),(3319,844,7,4),(3320,844,52,4),(3321,844,28,5),(3322,844,29,5),(3323,845,22,2),(3324,845,22,3),(3325,845,28,4),(3326,845,12,4),(3327,845,12,4),(3328,845,12,5),(3329,845,17,5),(3330,845,29,5),(3331,845,45,5),(3332,845,7,5),(3333,845,8,5),(3334,845,22,5),(3335,845,22,7),(3336,846,22,3),(3337,847,45,2),(3338,847,22,3),(3339,847,18,4),(3340,847,46,4),(3341,847,28,5),(3342,847,6,5),(3343,847,6,5),(3344,847,43,5),(3345,847,45,5),(3346,847,45,7),(3347,848,22,3),(3348,848,28,4),(3349,849,22,3),(3350,850,22,3),(3351,851,22,3),(3352,852,22,3),(3353,853,22,2),(3354,853,22,3),(3355,853,12,5),(3356,853,12,5),(3357,853,28,5),(3358,853,16,5),(3359,853,12,5),(3360,853,28,5),(3361,853,29,5),(3362,853,22,5),(3363,853,22,7),(3364,854,22,2),(3365,854,22,3),(3366,854,12,5),(3367,854,12,5),(3368,854,28,5),(3369,854,12,5),(3370,854,28,5),(3371,854,29,5),(3372,854,22,5),(3373,854,22,7),(3374,855,12,4),(3375,855,17,4),(3376,855,28,5),(3377,855,8,5),(3378,855,3,5),(3379,855,4,5),(3380,855,29,5),(3381,855,45,5),(3382,856,22,2),(3383,856,12,4),(3384,856,17,4),(3385,856,43,5),(3386,856,22,5),(3387,856,22,7),(3388,857,22,2),(3389,857,12,4),(3390,857,43,4),(3391,857,17,4),(3392,857,48,4),(3393,857,17,5),(3394,857,11,5),(3395,857,45,5),(3396,857,22,5),(3397,857,17,6),(3398,857,11,6),(3399,857,22,7),(3400,860,12,4),(3401,860,17,4),(3402,860,28,5),(3403,860,8,5),(3404,860,3,5),(3405,860,4,5),(3406,860,29,5),(3407,860,45,5),(3408,859,22,2),(3409,859,12,4),(3410,859,43,4),(3411,859,48,4),(3412,859,17,5),(3413,859,11,5),(3414,859,45,5),(3415,859,22,5),(3416,859,17,6),(3417,859,11,6),(3418,859,22,7),(3419,858,12,4),(3420,858,17,4),(3421,858,28,5),(3422,858,8,5),(3423,858,3,5),(3424,858,4,5),(3425,858,29,5),(3426,858,45,5),(3427,861,12,4),(3428,861,17,4),(3429,861,28,5),(3430,861,8,5),(3431,861,3,5),(3432,861,4,5),(3433,861,29,5),(3434,861,45,5),(3435,862,22,2),(3436,862,12,4),(3437,862,43,4),(3438,862,17,4),(3439,862,48,4),(3440,862,17,5),(3441,862,11,5),(3442,862,45,5),(3443,862,22,5),(3444,862,17,6),(3445,862,11,6),(3446,862,22,7),(3447,864,22,2),(3448,864,12,4),(3449,864,43,4),(3450,864,17,4),(3451,864,48,4),(3452,864,17,5),(3453,864,11,5),(3454,864,45,5),(3455,864,22,5),(3456,864,17,6),(3457,864,11,6),(3458,864,22,7),(3459,863,22,2),(3460,863,12,4),(3461,863,43,4),(3462,863,48,4),(3463,863,17,5),(3464,863,11,5),(3465,863,45,5),(3466,863,22,5),(3467,863,17,6),(3468,863,11,6),(3469,863,22,7),(3470,865,22,2),(3471,865,12,4),(3472,865,43,4),(3473,865,17,4),(3474,865,48,4),(3475,865,17,5),(3476,865,11,5),(3477,865,45,5),(3478,865,22,5),(3479,865,17,6),(3480,865,11,6),(3481,865,22,7),(3482,866,22,2),(3483,866,12,4),(3484,866,17,4),(3485,866,43,5),(3486,866,45,5),(3487,866,22,5),(3488,866,22,7),(3489,867,22,2),(3490,867,12,4),(3491,867,17,4),(3492,867,43,5),(3493,867,45,5),(3494,867,22,7),(3495,868,22,2),(3496,868,22,2),(3497,868,12,4),(3498,868,43,4),(3499,868,48,4),(3500,868,17,5),(3501,868,11,5),(3502,868,45,5),(3503,868,22,5),(3504,868,22,5),(3505,868,17,6),(3506,868,11,6),(3507,868,22,7),(3508,868,22,7),(3509,869,22,2),(3510,869,12,4),(3511,869,17,4),(3512,869,43,5),(3513,869,45,5),(3514,869,22,5),(3515,869,22,7),(3516,872,22,2),(3517,872,17,4),(3518,872,12,4),(3519,872,45,5),(3520,872,22,7),(3521,870,22,2),(3522,870,17,4),(3523,870,12,4),(3524,870,45,5),(3525,870,22,5),(3526,870,22,7),(3527,871,22,2),(3528,871,17,4),(3529,871,12,4),(3530,871,45,5),(3531,871,22,5),(3532,871,22,7),(3533,874,22,2),(3534,874,17,4),(3535,874,12,4),(3536,874,45,5),(3537,874,22,5),(3538,874,22,7),(3539,873,22,2),(3540,873,12,4),(3541,873,43,4),(3542,873,48,4),(3543,873,17,5),(3544,873,11,5),(3545,873,45,5),(3546,873,22,5),(3547,873,17,6),(3548,873,11,6),(3549,873,22,7),(3550,876,12,5),(3551,877,43,5),(3552,877,12,5),(3553,877,17,5),(3554,878,22,2),(3555,878,12,4),(3556,878,17,4),(3557,878,43,5),(3558,878,45,5),(3559,878,22,5),(3560,878,22,7),(3561,879,22,2),(3562,879,17,4),(3563,879,12,4),(3564,879,45,5),(3565,879,22,5),(3566,879,22,7),(3567,880,22,2),(3568,880,12,4),(3569,880,43,4),(3570,880,17,4),(3571,880,48,4),(3572,880,17,5),(3573,880,11,5),(3574,880,45,5),(3575,880,22,5),(3576,880,17,6),(3577,880,11,6),(3578,880,22,7),(3579,881,22,2),(3580,881,12,4),(3581,881,17,4),(3582,881,43,5),(3583,881,45,5),(3584,881,22,5),(3585,881,22,7),(3586,884,22,2),(3587,884,12,4),(3588,884,17,4),(3589,884,43,5),(3590,884,22,5),(3591,884,22,7),(3592,885,22,2),(3593,885,17,4),(3594,885,12,4),(3595,885,45,5),(3596,885,22,5),(3597,885,22,7),(3598,886,12,4),(3599,886,17,4),(3600,888,12,4),(3601,888,17,4),(3602,889,12,4),(3603,889,17,4),(3604,891,12,4),(3605,891,17,4),(3606,892,49,5),(3607,893,6,5),(3608,893,7,5),(3609,893,49,5),(3610,895,49,5),(3611,896,22,2),(3612,896,12,4),(3613,896,6,4),(3614,896,7,4),(3615,896,17,5),(3616,896,12,5),(3617,896,12,5),(3618,896,6,5),(3619,896,22,5),(3620,896,17,6),(3621,896,22,7),(3622,897,22,2),(3623,897,12,4),(3624,897,6,4),(3625,897,7,4),(3626,897,12,5),(3627,897,12,5),(3628,897,6,5),(3629,897,22,5),(3630,897,17,6),(3631,897,22,7),(3632,898,17,4),(3633,898,12,4),(3634,898,28,4),(3635,898,8,4),(3636,898,45,4),(3637,898,29,4),(3638,898,45,5),(3639,900,12,4),(3640,900,17,4),(3641,899,22,2),(3642,899,12,4),(3643,899,6,4),(3644,899,7,4),(3645,899,17,4),(3646,899,6,5),(3647,899,22,7),(3648,901,22,2),(3649,901,12,4),(3650,901,6,4),(3651,901,7,4),(3652,901,17,4),(3653,901,6,5),(3654,901,22,7),(3655,904,12,4),(3656,904,17,4),(3657,903,12,4),(3658,903,17,4),(3659,903,6,5),(3660,903,7,5),(3661,903,49,5),(3662,902,12,4),(3663,902,17,4),(3664,902,6,5),(3665,902,7,5),(3666,902,49,5),(3667,905,12,4),(3668,905,17,4),(3669,907,22,2),(3670,907,12,5),(3671,907,17,5),(3672,907,45,5),(3673,907,22,5),(3674,907,22,7),(3675,912,45,3),(3676,915,22,2),(3677,915,12,5),(3678,915,43,5),(3679,915,22,7),(3680,913,22,2),(3681,913,17,4),(3682,913,12,4),(3683,913,6,5),(3684,913,7,5),(3685,913,52,5),(3686,913,6,5),(3687,913,22,5),(3688,913,22,7),(3689,919,22,2),(3690,919,12,3),(3691,919,17,4),(3692,919,22,5),(3693,919,22,7),(3694,926,22,2),(3695,926,12,3),(3696,926,17,4),(3697,926,43,5),(3698,926,45,5),(3699,926,12,5),(3700,926,12,5),(3701,926,22,5),(3702,926,12,5),(3703,926,22,5),(3704,926,22,7),(3705,929,22,2),(3706,929,12,3),(3707,929,17,4),(3708,929,43,5),(3709,929,45,5),(3710,929,22,5),(3711,929,22,7),(3712,930,22,2),(3713,930,12,3),(3714,930,43,4),(3715,930,17,5),(3716,930,22,5),(3717,930,17,6),(3718,930,22,7),(3719,931,12,3),(3720,931,43,4),(3721,931,48,4),(3722,931,17,5),(3723,931,11,5),(3724,931,12,5),(3725,931,12,5),(3726,931,17,6),(3727,931,11,6),(3728,933,12,3),(3729,933,43,4),(3730,933,48,4),(3731,933,12,5),(3732,933,12,5),(3733,933,22,5),(3734,933,17,6),(3735,933,11,6),(3736,932,12,3),(3737,932,43,4),(3738,932,48,4),(3739,932,17,5),(3740,932,11,5),(3741,932,6,5),(3742,932,12,5),(3743,932,12,5),(3744,932,22,5),(3745,932,17,6),(3746,932,11,6),(3747,934,12,3),(3748,934,43,4),(3749,934,48,4),(3750,934,17,5),(3751,934,11,5),(3752,934,12,5),(3753,934,12,5),(3754,934,22,5),(3755,934,17,6),(3756,934,11,6),(3757,936,22,2),(3758,936,12,3),(3759,936,43,4),(3760,936,48,4),(3761,936,17,5),(3762,936,11,5),(3763,936,22,5),(3764,936,17,6),(3765,936,11,6),(3766,936,22,7),(3767,935,12,3),(3768,935,43,4),(3769,935,1,4),(3770,935,48,4),(3771,935,17,5),(3772,935,11,5),(3773,935,6,5),(3774,935,12,5),(3775,935,12,5),(3776,935,22,5),(3777,935,17,6),(3778,935,11,6),(3779,937,12,3),(3780,937,43,4),(3781,937,48,4),(3782,937,17,5),(3783,937,11,5),(3784,937,6,5),(3785,937,12,5),(3786,937,12,5),(3787,937,22,5),(3788,937,17,6),(3789,937,11,6),(3790,938,12,3),(3791,938,43,4),(3792,938,48,4),(3793,938,12,5),(3794,938,12,5),(3795,938,17,6),(3796,938,11,6),(3797,939,22,2),(3798,939,12,3),(3799,939,43,4),(3800,939,48,4),(3801,939,17,5),(3802,939,11,5),(3803,939,22,5),(3804,939,17,6),(3805,939,11,6),(3806,939,22,7),(3807,940,22,2),(3808,940,12,3),(3809,940,43,4),(3810,940,48,4),(3811,940,17,5),(3812,940,11,5),(3813,940,22,5),(3814,940,17,6),(3815,940,11,6),(3816,940,22,7),(3817,941,22,2),(3818,941,12,3),(3819,941,43,4),(3820,941,48,4),(3821,941,17,5),(3822,941,11,5),(3823,941,22,5),(3824,941,17,6),(3825,941,11,6),(3826,941,22,7),(3827,942,22,2),(3828,942,12,3),(3829,942,43,4),(3830,942,48,4),(3831,942,17,5),(3832,942,11,5),(3833,942,22,5),(3834,942,17,6),(3835,942,11,6),(3836,942,22,7),(3837,943,22,2),(3838,943,12,3),(3839,943,43,4),(3840,943,48,4),(3841,943,17,5),(3842,943,11,5),(3843,943,22,5),(3844,943,17,6),(3845,943,11,6),(3846,943,22,7),(3847,945,22,2),(3848,945,12,3),(3849,945,43,4),(3850,945,48,4),(3851,945,17,5),(3852,945,11,5),(3853,945,22,5),(3854,945,17,6),(3855,945,11,6),(3856,945,22,7),(3857,944,22,2),(3858,944,12,3),(3859,944,43,4),(3860,944,48,4),(3861,944,17,5),(3862,944,11,5),(3863,944,6,5),(3864,944,7,5),(3865,944,52,5),(3866,944,6,5),(3867,944,3,5),(3868,944,4,5),(3869,944,22,5),(3870,944,17,6),(3871,944,11,6),(3872,944,22,7),(3873,946,22,2),(3874,946,12,3),(3875,946,43,4),(3876,946,48,4),(3877,946,17,5),(3878,946,11,5),(3879,946,22,5),(3880,946,17,6),(3881,946,11,6),(3882,946,22,7),(3883,947,22,2),(3884,947,12,3),(3885,947,43,4),(3886,947,48,4),(3887,947,17,5),(3888,947,11,5),(3889,947,22,5),(3890,947,17,6),(3891,947,11,6),(3892,947,22,7),(3893,948,22,2),(3894,948,12,3),(3895,948,43,4),(3896,948,48,4),(3897,948,17,5),(3898,948,11,5),(3899,948,6,5),(3900,948,7,5),(3901,948,52,5),(3902,948,6,5),(3903,948,22,5),(3904,948,17,6),(3905,948,11,6),(3906,948,22,7),(3907,949,22,2),(3908,949,12,3),(3909,949,43,4),(3910,949,48,4),(3911,949,11,4),(3912,949,17,5),(3913,949,11,5),(3914,949,12,5),(3915,949,12,5),(3916,949,22,5),(3917,949,22,5),(3918,949,17,6),(3919,949,11,6),(3920,949,22,7),(3921,950,12,3),(3922,950,43,4),(3923,950,48,4),(3924,950,12,5),(3925,950,12,5),(3926,950,22,5),(3927,950,17,6),(3928,950,11,6),(3929,952,22,2),(3930,952,12,3),(3931,952,43,4),(3932,952,48,4),(3933,952,11,4),(3934,952,12,5),(3935,952,12,5),(3936,952,22,5),(3937,952,17,6),(3938,952,11,6),(3939,952,22,7),(3940,956,12,3),(3941,956,43,4),(3942,956,48,4),(3943,956,17,5),(3944,956,11,5),(3945,956,17,6),(3946,956,11,6),(3947,957,12,3),(3948,957,43,4),(3949,957,48,4),(3950,957,12,5),(3951,957,12,5),(3952,957,22,5),(3953,957,17,6),(3954,957,11,6),(3955,955,12,3),(3956,955,43,4),(3957,955,48,4),(3958,955,22,5),(3959,955,12,5),(3960,955,12,5),(3961,955,17,6),(3962,955,11,6),(3963,954,22,2),(3964,954,12,3),(3965,954,17,4),(3966,954,43,5),(3967,954,45,5),(3968,954,22,5),(3969,954,22,7),(3970,958,12,3),(3971,958,43,4),(3972,958,48,4),(3973,958,17,5),(3974,958,11,5),(3975,958,12,5),(3976,958,12,5),(3977,958,17,6),(3978,958,11,6),(3979,959,22,2),(3980,959,12,3),(3981,959,43,4),(3982,959,48,4),(3983,959,17,5),(3984,959,11,5),(3985,959,22,5),(3986,959,17,6),(3987,959,11,6),(3988,959,22,7),(3989,960,12,3),(3990,960,43,4),(3991,960,48,4),(3992,960,22,5),(3993,960,17,6),(3994,960,11,6),(3995,961,12,3),(3996,961,17,4),(3997,961,22,5),(3998,961,12,5),(3999,961,12,5),(4000,962,22,2),(4001,962,12,3),(4002,962,43,4),(4003,962,48,4),(4004,962,17,5),(4005,962,11,5),(4006,962,22,5),(4007,962,17,6),(4008,962,11,6),(4009,962,22,7),(4010,965,12,3),(4011,965,43,4),(4012,965,48,4),(4013,965,17,5),(4014,965,11,5),(4015,965,17,6),(4016,965,11,6),(4017,963,12,3),(4018,963,43,4),(4019,963,48,4),(4020,963,22,5),(4021,963,17,6),(4022,963,11,6),(4023,966,12,3),(4024,966,17,4),(4025,966,22,5),(4026,966,12,5),(4027,966,12,5),(4028,967,22,2),(4029,967,12,3),(4030,967,17,4),(4031,967,43,5),(4032,967,45,5),(4033,967,22,5),(4034,967,22,7),(4035,968,22,2),(4036,968,12,3),(4037,968,43,4),(4038,968,48,4),(4039,968,11,4),(4040,968,17,5),(4041,968,11,5),(4042,968,12,5),(4043,968,12,5),(4044,968,22,5),(4045,968,22,5),(4046,968,17,6),(4047,968,11,6),(4048,968,22,7),(4049,969,22,2),(4050,969,12,3),(4051,969,43,4),(4052,969,48,4),(4053,969,17,5),(4054,969,11,5),(4055,969,22,5),(4056,969,17,6),(4057,969,11,6),(4058,969,22,7),(4059,970,22,2),(4060,970,12,3),(4061,970,17,4),(4062,970,43,5),(4063,970,45,5),(4064,970,12,5),(4065,970,12,5),(4066,970,22,5),(4067,970,12,5),(4068,970,22,5),(4069,970,22,7),(4070,971,12,3),(4071,971,43,4),(4072,971,48,4),(4073,971,12,5),(4074,971,12,5),(4075,971,17,6),(4076,971,11,6),(4077,975,12,3),(4078,975,43,4),(4079,975,48,4),(4080,975,12,5),(4081,975,12,5),(4082,975,17,6),(4083,975,11,6),(4084,972,12,3),(4085,972,43,4),(4086,972,48,4),(4087,972,12,5),(4088,972,12,5),(4089,972,22,5),(4090,972,17,6),(4091,972,11,6),(4092,974,12,3),(4093,974,43,4),(4094,974,1,4),(4095,974,48,4),(4096,974,6,5),(4097,974,12,5),(4098,974,12,5),(4099,974,22,5),(4100,974,17,6),(4101,974,11,6),(4102,976,22,2),(4103,976,12,3),(4104,976,43,4),(4105,976,48,4),(4106,976,17,5),(4107,976,11,5),(4108,976,22,5),(4109,976,17,6),(4110,976,11,6),(4111,976,22,7),(4112,973,12,3),(4113,973,43,4),(4114,973,48,4),(4115,973,6,5),(4116,973,12,5),(4117,973,12,5),(4118,973,22,5),(4119,973,17,6),(4120,973,11,6),(4121,977,12,3),(4122,977,43,4),(4123,977,48,4),(4124,977,6,5),(4125,977,12,5),(4126,977,12,5),(4127,977,22,5),(4128,977,17,6),(4129,977,11,6),(4130,978,12,3),(4131,978,43,4),(4132,978,48,4),(4133,978,17,5),(4134,978,11,5),(4135,978,12,5),(4136,978,12,5),(4137,978,22,5),(4138,978,17,6),(4139,978,11,6),(4140,979,17,2),(4141,979,12,3),(4142,979,22,5),(4143,979,12,5),(4144,979,12,5),(4145,979,17,5),(4146,979,17,7),(4147,981,22,2),(4148,981,12,3),(4149,981,43,4),(4150,981,48,4),(4151,981,11,4),(4152,981,12,5),(4153,981,12,5),(4154,981,22,5),(4155,981,17,6),(4156,981,11,6),(4157,981,22,7),(4158,982,22,2),(4159,982,12,3),(4160,982,43,4),(4161,982,48,4),(4162,982,11,4),(4163,982,17,5),(4164,982,11,5),(4165,982,12,5),(4166,982,12,5),(4167,982,22,5),(4168,982,22,5),(4169,982,17,6),(4170,982,11,6),(4171,982,22,7),(4172,985,12,3),(4173,985,43,4),(4174,985,48,4),(4175,985,17,5),(4176,985,11,5),(4177,985,17,6),(4178,985,11,6),(4179,986,12,3),(4180,986,43,4),(4181,986,48,4),(4182,986,17,5),(4183,986,11,5),(4184,986,17,6),(4185,986,11,6),(4186,984,22,2),(4187,984,12,3),(4188,984,43,4),(4189,984,48,4),(4190,984,11,4),(4191,984,17,5),(4192,984,11,5),(4193,984,12,5),(4194,984,12,5),(4195,984,22,5),(4196,984,22,5),(4197,984,17,6),(4198,984,11,6),(4199,984,22,7),(4200,987,22,2),(4201,987,12,3),(4202,987,17,4),(4203,987,43,5),(4204,987,45,5),(4205,987,22,5),(4206,987,22,7),(4207,988,12,3),(4208,988,43,4),(4209,988,48,4),(4210,988,17,5),(4211,988,11,5),(4212,988,17,6),(4213,988,11,6),(4214,989,12,3),(4215,989,43,4),(4216,989,48,4),(4217,989,17,5),(4218,989,11,5),(4219,989,17,6),(4220,989,11,6),(4221,990,12,3),(4222,990,43,4),(4223,990,48,4),(4224,990,17,5),(4225,990,11,5),(4226,990,17,6),(4227,990,11,6),(4228,991,12,3),(4229,991,43,4),(4230,991,48,4),(4231,991,17,5),(4232,991,11,5),(4233,991,17,6),(4234,991,11,6),(4235,993,12,3),(4236,993,43,4),(4237,993,48,4),(4238,993,17,5),(4239,993,11,5),(4240,993,17,6),(4241,993,11,6),(4242,992,12,3),(4243,992,43,4),(4244,992,48,4),(4245,992,17,5),(4246,992,11,5),(4247,992,17,6),(4248,992,11,6),(4249,994,12,3),(4250,994,17,5),(4251,994,17,6),(4252,996,12,3),(4253,996,43,4),(4254,996,48,4),(4255,996,17,5),(4256,996,11,5),(4257,996,17,6),(4258,996,11,6),(4259,995,12,3),(4260,995,43,4),(4261,995,48,4),(4262,995,17,5),(4263,995,11,5),(4264,995,17,6),(4265,995,11,6),(4266,997,12,3),(4267,997,43,4),(4268,997,48,4),(4269,997,12,5),(4270,997,12,5),(4271,997,22,5),(4272,997,17,6),(4273,997,11,6),(4274,998,12,3),(4275,998,43,4),(4276,998,48,4),(4277,998,17,5),(4278,998,11,5),(4279,998,12,5),(4280,998,12,5),(4281,998,22,5),(4282,998,17,6),(4283,998,11,6),(4284,999,12,3),(4285,999,43,4),(4286,999,48,4),(4287,999,12,5),(4288,999,12,5),(4289,999,17,6),(4290,999,11,6),(4291,1000,12,3),(4292,1000,43,4),(4293,1000,48,4),(4294,1000,17,6),(4295,1000,11,6),(4296,1001,12,3),(4297,1001,43,4),(4298,1001,48,4),(4299,1001,12,5),(4300,1001,12,5),(4301,1001,17,6),(4302,1001,11,6),(4303,1002,12,3),(4304,1002,43,4),(4305,1002,48,4),(4306,1002,12,5),(4307,1002,12,5),(4308,1002,17,6),(4309,1002,11,6),(4310,1003,22,2),(4311,1003,12,3),(4312,1003,17,4),(4313,1003,22,5),(4314,1003,22,7),(4315,1005,12,3),(4316,1005,43,4),(4317,1005,48,4),(4318,1005,12,5),(4319,1005,12,5),(4320,1005,22,5),(4321,1005,17,6),(4322,1005,11,6),(4323,1007,12,3),(4324,1007,43,4),(4325,1007,48,4),(4326,1007,12,5),(4327,1007,12,5),(4328,1007,43,5),(4329,1007,17,6),(4330,1007,11,6),(4331,1008,22,2),(4332,1008,12,3),(4333,1008,43,4),(4334,1008,48,4),(4335,1008,17,5),(4336,1008,11,5),(4337,1008,22,5),(4338,1008,17,6),(4339,1008,11,6),(4340,1008,22,7),(4341,1004,22,2),(4342,1004,12,3),(4343,1004,43,4),(4344,1004,48,4),(4345,1004,17,5),(4346,1004,11,5),(4347,1004,22,5),(4348,1004,17,6),(4349,1004,11,6),(4350,1004,22,7),(4351,1009,17,2),(4352,1009,12,3),(4353,1009,22,5),(4354,1009,12,5),(4355,1009,12,5),(4356,1009,17,5),(4357,1009,17,7),(4358,1010,12,3),(4359,1010,43,4),(4360,1010,48,4),(4361,1010,17,5),(4362,1010,11,5),(4363,1010,17,6),(4364,1010,11,6),(4365,1011,17,2),(4366,1011,12,3),(4367,1011,22,5),(4368,1011,12,5),(4369,1011,12,5),(4370,1011,17,5),(4371,1011,17,7),(4372,1012,22,2),(4373,1012,12,3),(4374,1012,43,4),(4375,1012,48,4),(4376,1012,17,5),(4377,1012,11,5),(4378,1012,22,5),(4379,1012,17,6),(4380,1012,11,6),(4381,1012,22,7),(4382,1016,12,3),(4383,1016,22,5),(4384,1015,12,3),(4385,1014,12,3),(4386,1014,17,4),(4387,1014,22,5),(4388,1014,12,5),(4389,1014,12,5),(4390,1013,22,2),(4391,1013,12,3),(4392,1013,43,4),(4393,1013,48,4),(4394,1013,17,5),(4395,1013,11,5),(4396,1013,22,5),(4397,1013,17,6),(4398,1013,11,6),(4399,1013,22,7),(4400,1017,12,3),(4401,1017,43,4),(4402,1017,48,4),(4403,1017,17,5),(4404,1017,11,5),(4405,1017,17,6),(4406,1017,11,6),(4407,1018,17,2),(4408,1018,12,3),(4409,1018,22,5),(4410,1018,12,5),(4411,1018,12,5),(4412,1018,17,5),(4413,1018,17,7),(4414,1019,12,3),(4415,1019,22,5),(4416,1019,12,5),(4417,1019,12,5),(4418,1019,17,6),(4419,1020,17,2),(4420,1020,12,3),(4421,1020,22,5),(4422,1020,12,5),(4423,1020,12,5),(4424,1020,17,5),(4425,1020,17,7),(4426,1021,12,3),(4427,1021,43,4),(4428,1021,48,4),(4429,1021,17,5),(4430,1021,11,5),(4431,1021,17,6),(4432,1021,11,6),(4433,1022,12,3),(4434,1022,43,4),(4435,1022,48,4),(4436,1022,17,5),(4437,1022,11,5),(4438,1022,17,6),(4439,1022,11,6),(4440,1024,17,2),(4441,1024,12,3),(4442,1024,43,4),(4443,1024,22,5),(4444,1024,12,5),(4445,1024,12,5),(4446,1024,17,5),(4447,1024,17,7),(4448,1027,12,3),(4449,1027,43,4),(4450,1027,48,4),(4451,1027,17,5),(4452,1027,11,5),(4453,1027,17,6),(4454,1027,11,6),(4455,1025,17,2),(4456,1025,12,3),(4457,1025,22,5),(4458,1025,12,5),(4459,1025,12,5),(4460,1025,17,5),(4461,1025,17,7),(4462,1026,12,3),(4463,1026,43,4),(4464,1026,48,4),(4465,1026,17,5),(4466,1026,11,5),(4467,1026,17,6),(4468,1026,11,6),(4469,1023,22,2),(4470,1023,12,3),(4471,1023,43,4),(4472,1023,48,4),(4473,1023,17,5),(4474,1023,11,5),(4475,1023,22,5),(4476,1023,17,6),(4477,1023,11,6),(4478,1023,22,7),(4479,1028,12,3),(4480,1028,43,4),(4481,1028,48,4),(4482,1028,17,5),(4483,1028,11,5),(4484,1028,12,5),(4485,1028,12,5),(4486,1028,22,5),(4487,1028,17,6),(4488,1028,11,6),(4489,1029,12,3),(4490,1029,43,4),(4491,1029,48,4),(4492,1029,17,5),(4493,1029,11,5),(4494,1029,17,6),(4495,1029,11,6),(4496,1030,12,3),(4497,1030,43,4),(4498,1030,48,4),(4499,1030,17,5),(4500,1030,11,5),(4501,1030,12,5),(4502,1030,12,5),(4503,1030,22,5),(4504,1030,17,6),(4505,1030,11,6),(4506,1031,12,3),(4507,1031,43,4),(4508,1031,48,4),(4509,1031,17,5),(4510,1031,11,5),(4511,1031,17,6),(4512,1031,11,6),(4513,1032,12,3),(4514,1032,43,4),(4515,1032,48,4),(4516,1032,17,5),(4517,1032,11,5),(4518,1032,12,5),(4519,1032,12,5),(4520,1032,22,5),(4521,1032,17,6),(4522,1032,11,6),(4523,1035,12,3),(4524,1035,43,4),(4525,1035,48,4),(4526,1035,17,5),(4527,1035,11,5),(4528,1035,17,6),(4529,1035,11,6),(4530,1033,12,3),(4531,1033,43,4),(4532,1033,48,4),(4533,1033,17,5),(4534,1033,11,5),(4535,1033,17,6),(4536,1033,11,6),(4537,1036,12,3),(4538,1036,43,4),(4539,1036,48,4),(4540,1036,17,5),(4541,1036,11,5),(4542,1036,12,5),(4543,1036,12,5),(4544,1036,22,5),(4545,1036,17,6),(4546,1036,11,6),(4547,1034,12,3),(4548,1034,43,4),(4549,1034,48,4),(4550,1034,17,5),(4551,1034,11,5),(4552,1034,17,6),(4553,1034,11,6),(4554,1037,12,3),(4555,1037,43,4),(4556,1037,48,4),(4557,1037,17,5),(4558,1037,11,5),(4559,1037,17,6),(4560,1037,11,6),(4561,1038,12,3),(4562,1038,43,4),(4563,1038,48,4),(4564,1038,17,5),(4565,1038,11,5),(4566,1038,12,5),(4567,1038,12,5),(4568,1038,22,5),(4569,1039,17,2),(4570,1039,12,3),(4571,1039,43,4),(4572,1039,22,5),(4573,1039,12,5),(4574,1039,12,5),(4575,1039,17,5),(4576,1039,17,7),(4577,1040,12,3),(4578,1040,43,4),(4579,1040,48,4),(4580,1040,17,5),(4581,1040,11,5),(4582,1040,17,6),(4583,1040,11,6),(4584,1041,12,3),(4585,1041,43,4),(4586,1041,48,4),(4587,1041,17,5),(4588,1041,11,5),(4589,1041,17,6),(4590,1041,11,6),(4591,1042,12,3),(4592,1042,43,4),(4593,1042,48,4),(4594,1042,17,5),(4595,1042,11,5),(4596,1042,17,6),(4597,1042,11,6),(4598,1043,12,3),(4599,1043,43,4),(4600,1043,48,4),(4601,1043,17,5),(4602,1043,11,5),(4603,1043,12,5),(4604,1043,12,5),(4605,1043,22,5),(4606,1043,17,6),(4607,1043,11,6),(4608,1044,12,3),(4609,1044,43,4),(4610,1044,48,4),(4611,1044,17,5),(4612,1044,11,5),(4613,1044,17,6),(4614,1044,11,6),(4615,1045,12,3),(4616,1045,43,4),(4617,1045,48,4),(4618,1045,17,5),(4619,1045,11,5),(4620,1045,12,5),(4621,1045,12,5),(4622,1045,22,5),(4623,1045,17,6),(4624,1045,11,6),(4625,1046,12,3),(4626,1046,43,4),(4627,1046,48,4),(4628,1046,17,5),(4629,1046,11,5),(4630,1046,17,6),(4631,1046,11,6),(4632,1048,17,2),(4633,1048,12,3),(4634,1048,22,5),(4635,1048,12,5),(4636,1048,12,5),(4637,1048,17,5),(4638,1048,17,7),(4639,1050,12,3),(4640,1050,43,4),(4641,1050,48,4),(4642,1050,12,5),(4643,1050,12,5),(4644,1050,17,6),(4645,1050,11,6),(4646,1051,22,2),(4647,1051,12,3),(4648,1051,17,4),(4649,1051,43,5),(4650,1051,45,5),(4651,1051,22,5),(4652,1051,22,7),(4653,1053,12,3),(4654,1053,43,4),(4655,1053,48,4),(4656,1053,17,5),(4657,1053,11,5),(4658,1053,17,6),(4659,1053,11,6),(4660,1057,22,2),(4661,1057,12,3),(4662,1057,43,4),(4663,1057,48,4),(4664,1057,17,5),(4665,1057,11,5),(4666,1057,22,5),(4667,1057,17,6),(4668,1057,11,6),(4669,1057,22,7),(4670,1055,12,3),(4671,1055,43,4),(4672,1055,48,4),(4673,1055,17,5),(4674,1055,11,5),(4675,1055,12,5),(4676,1055,12,5),(4677,1055,22,5),(4678,1055,17,6),(4679,1055,11,6),(4680,1054,22,2),(4681,1054,12,3),(4682,1054,43,4),(4683,1054,48,4),(4684,1054,17,5),(4685,1054,11,5),(4686,1054,12,5),(4687,1054,12,5),(4688,1054,22,5),(4689,1054,22,5),(4690,1054,17,6),(4691,1054,11,6),(4692,1054,22,7),(4693,1056,22,2),(4694,1056,12,3),(4695,1056,43,4),(4696,1056,48,4),(4697,1056,17,5),(4698,1056,11,5),(4699,1056,22,5),(4700,1056,17,6),(4701,1056,11,6),(4702,1056,22,7),(4703,1058,22,2),(4704,1058,12,3),(4705,1058,43,4),(4706,1058,48,4),(4707,1058,17,5),(4708,1058,11,5),(4709,1058,6,5),(4710,1058,7,5),(4711,1058,6,5),(4712,1058,22,5),(4713,1058,17,6),(4714,1058,11,6),(4715,1058,22,7),(4716,1059,22,2),(4717,1059,12,3),(4718,1059,43,4),(4719,1059,48,4),(4720,1059,17,5),(4721,1059,11,5),(4722,1059,6,5),(4723,1059,7,5),(4724,1059,52,5),(4725,1059,6,5),(4726,1059,4,5),(4727,1059,3,5),(4728,1059,22,5),(4729,1059,17,6),(4730,1059,11,6),(4731,1059,22,7),(4732,1060,12,3),(4733,1060,43,4),(4734,1060,48,4),(4735,1060,17,5),(4736,1060,11,5),(4737,1060,12,5),(4738,1060,12,5),(4739,1060,22,5),(4740,1060,17,6),(4741,1060,11,6),(4742,1061,12,3),(4743,1061,43,4),(4744,1061,48,4),(4745,1061,17,5),(4746,1061,11,5),(4747,1061,17,6),(4748,1061,11,6),(4749,1062,22,2),(4750,1062,12,3),(4751,1062,17,4),(4752,1062,22,5),(4753,1062,22,7),(4754,1063,22,2),(4755,1063,12,3),(4756,1063,43,4),(4757,1063,48,4),(4758,1063,17,5),(4759,1063,11,5),(4760,1063,22,5),(4761,1063,17,6),(4762,1063,11,6),(4763,1063,22,7),(4764,1064,22,2),(4765,1064,12,3),(4766,1064,17,4),(4767,1064,22,5),(4768,1064,22,7),(4769,1065,12,3),(4770,1065,43,4),(4771,1065,48,4),(4772,1065,17,5),(4773,1065,11,5),(4774,1065,6,5),(4775,1065,12,5),(4776,1065,12,5),(4777,1065,22,5),(4778,1065,17,6),(4779,1065,11,6),(4780,1066,12,3),(4781,1066,22,5),(4782,1066,18,5),(4783,1066,46,5),(4784,1066,43,5),(4785,1067,22,2),(4786,1067,12,3),(4787,1067,43,4),(4788,1067,48,4),(4789,1067,17,5),(4790,1067,11,5),(4791,1067,12,5),(4792,1067,12,5),(4793,1067,22,5),(4794,1067,22,5),(4795,1067,17,6),(4796,1067,11,6),(4797,1067,22,7),(4798,1069,22,2),(4799,1069,12,3),(4800,1069,22,5),(4801,1069,22,7),(4802,1068,43,3),(4803,1068,12,4),(4804,1068,48,4),(4805,1068,28,4),(4806,1068,8,4),(4807,1068,17,5),(4808,1068,11,5),(4809,1068,12,5),(4810,1068,12,5),(4811,1068,22,5),(4812,1068,45,5),(4813,1068,17,6),(4814,1068,11,6),(4815,1070,22,2),(4816,1070,12,3),(4817,1070,43,4),(4818,1070,48,4),(4819,1070,17,5),(4820,1070,11,5),(4821,1070,12,5),(4822,1070,12,5),(4823,1070,22,5),(4824,1070,22,5),(4825,1070,17,6),(4826,1070,11,6),(4827,1070,22,7),(4828,1071,22,2),(4829,1071,12,3),(4830,1071,43,4),(4831,1071,48,4),(4832,1071,17,5),(4833,1071,11,5),(4834,1071,12,5),(4835,1071,12,5),(4836,1071,22,5),(4837,1071,22,5),(4838,1071,17,6),(4839,1071,11,6),(4840,1071,22,7),(4841,1073,12,3),(4842,1073,43,4),(4843,1073,48,4),(4844,1073,17,5),(4845,1073,11,5),(4846,1073,12,5),(4847,1073,12,5),(4848,1073,17,6),(4849,1073,11,6),(4850,1072,22,2),(4851,1072,12,3),(4852,1072,17,4),(4853,1072,43,5),(4854,1072,12,5),(4855,1072,12,5),(4856,1072,22,5),(4857,1072,12,5),(4858,1072,22,5),(4859,1072,22,7),(4860,1074,12,3),(4861,1074,43,4),(4862,1074,48,4),(4863,1074,12,5),(4864,1074,12,5),(4865,1074,17,6),(4866,1074,11,6),(4867,1075,12,3),(4868,1075,43,4),(4869,1075,48,4),(4870,1075,17,5),(4871,1075,11,5),(4872,1075,17,6),(4873,1075,11,6),(4874,1076,22,2),(4875,1076,12,3),(4876,1076,43,4),(4877,1076,48,4),(4878,1076,11,4),(4879,1076,17,5),(4880,1076,11,5),(4881,1076,12,5),(4882,1076,12,5),(4883,1076,22,5),(4884,1076,22,5),(4885,1076,17,6),(4886,1076,11,6),(4887,1076,22,7),(4888,1077,22,2),(4889,1077,12,3),(4890,1077,43,4),(4891,1077,48,4),(4892,1077,11,4),(4893,1077,17,5),(4894,1077,11,5),(4895,1077,12,5),(4896,1077,12,5),(4897,1077,22,5),(4898,1077,22,5),(4899,1077,17,6),(4900,1077,11,6),(4901,1077,22,7),(4902,1078,12,3),(4903,1078,43,4),(4904,1078,48,4),(4905,1078,17,5),(4906,1078,11,5),(4907,1078,12,5),(4908,1078,12,5),(4909,1078,22,5),(4910,1078,17,6),(4911,1078,11,6),(4912,1079,12,3),(4913,1079,43,4),(4914,1079,48,4),(4915,1079,17,5),(4916,1079,11,5),(4917,1079,12,5),(4918,1079,12,5),(4919,1079,22,5),(4920,1079,17,6),(4921,1079,11,6),(4922,1081,22,2),(4923,1081,12,3),(4924,1081,43,4),(4925,1081,48,4),(4926,1081,11,4),(4927,1081,17,5),(4928,1081,11,5),(4929,1081,12,5),(4930,1081,12,5),(4931,1081,22,5),(4932,1081,22,5),(4933,1081,17,6),(4934,1081,11,6),(4935,1081,22,7),(4936,1080,22,2),(4937,1080,12,3),(4938,1080,43,4),(4939,1080,48,4),(4940,1080,11,4),(4941,1080,17,5),(4942,1080,11,5),(4943,1080,12,5),(4944,1080,12,5),(4945,1080,22,5),(4946,1080,22,5),(4947,1080,17,6),(4948,1080,11,6),(4949,1080,22,7),(4950,1083,22,2),(4951,1083,6,2),(4952,1083,12,3),(4953,1083,17,5),(4954,1083,46,5),(4955,1083,41,5),(4956,1083,11,5),(4957,1083,22,5),(4958,1083,6,5),(4959,1083,22,7),(4960,1083,6,7),(4961,1082,12,3),(4962,1082,43,4),(4963,1082,48,4),(4964,1082,17,5),(4965,1082,11,5),(4966,1082,12,5),(4967,1082,12,5),(4968,1082,22,5),(4969,1082,17,6),(4970,1082,11,6),(4971,1084,22,2),(4972,1084,12,3),(4973,1084,43,4),(4974,1084,48,4),(4975,1084,11,4),(4976,1084,17,5),(4977,1084,11,5),(4978,1084,12,5),(4979,1084,12,5),(4980,1084,22,5),(4981,1084,22,5),(4982,1084,17,6),(4983,1084,11,6),(4984,1084,22,7),(4985,1085,12,3),(4986,1087,12,3),(4987,1087,43,4),(4988,1087,48,4),(4989,1087,17,5),(4990,1087,11,5),(4991,1087,12,5),(4992,1087,12,5),(4993,1087,17,6),(4994,1087,11,6),(4995,1090,12,3),(4996,1089,12,3),(4997,1091,12,3),(4998,1093,12,3),(4999,1092,12,3),(5000,1092,18,3),(5001,1088,12,3),(5002,1088,43,4),(5003,1088,48,4),(5004,1088,17,5),(5005,1088,11,5),(5006,1088,12,5),(5007,1088,12,5),(5008,1088,22,5),(5009,1088,45,5),(5010,1088,17,6),(5011,1088,11,6),(5012,1094,12,3),(5013,1094,43,4),(5014,1094,48,4),(5015,1094,17,5),(5016,1094,11,5),(5017,1094,12,5),(5018,1094,12,5),(5019,1094,17,6),(5020,1094,11,6),(5021,1095,12,3),(5022,1096,12,3),(5023,1097,12,3),(5024,1098,12,3),(5025,1099,12,3),(5026,1100,12,3),(5027,1101,12,3),(5028,1102,12,3),(5029,1103,12,3),(5030,1104,12,4),(5031,1104,12,4),(5032,1105,12,4),(5033,1105,12,4),(5034,1105,16,5),(5035,1105,12,5),(5036,1106,12,4),(5037,1106,12,4),(5038,1107,12,4),(5039,1107,12,4),(5040,1108,12,4),(5041,1108,12,4),(5042,1108,22,5),(5043,1109,12,4),(5044,1109,12,4),(5045,1110,12,4),(5046,1110,12,4),(5047,1110,12,4),(5048,1111,12,4),(5049,1111,12,4),(5050,1111,12,4),(5051,1113,12,4),(5052,1113,12,4),(5053,1114,12,3),(5054,1114,12,3),(5055,1114,22,4),(5056,1114,28,4),(5057,1114,29,5),(5058,1115,12,4),(5059,1115,12,4),(5060,1115,12,5),(5061,1115,17,5),(5062,1117,12,3),(5063,1117,12,3),(5064,1117,22,4),(5065,1117,28,4),(5066,1117,7,4),(5067,1117,29,5),(5068,1123,12,3),(5069,1123,12,3),(5070,1123,22,4),(5071,1123,28,4),(5072,1123,29,5),(5073,1124,12,3),(5074,1124,6,3),(5075,1125,12,3),(5076,1125,12,3),(5077,1126,12,3),(5078,1126,6,3),(5079,1127,12,3),(5080,1127,12,3),(5081,1128,12,3),(5082,1128,6,3),(5083,1132,12,3),(5084,1132,12,3),(5085,1133,12,3),(5086,1133,12,3),(5087,1136,18,3),(5088,1136,46,4),(5089,1136,22,5),(5090,1137,18,3),(5091,1137,46,4),(5092,1137,22,5),(5093,1138,18,3),(5094,1138,46,4),(5095,1138,22,5),(5096,1138,12,5),(5097,1138,12,5),(5098,1139,18,3),(5099,1139,46,4),(5100,1139,22,5),(5101,1141,18,3),(5102,1141,46,4),(5103,1141,22,5),(5104,1141,12,5),(5105,1141,12,5),(5106,1140,18,3),(5107,1140,46,4),(5108,1140,28,4),(5109,1140,29,4),(5110,1140,8,4),(5111,1140,45,4),(5112,1140,22,5),(5113,1140,39,5),(5114,1144,18,3),(5115,1144,46,4),(5116,1144,22,5),(5117,1142,18,3),(5118,1142,46,4),(5119,1142,22,5),(5120,1142,12,5),(5121,1142,12,5),(5122,1145,18,3),(5123,1145,46,4),(5124,1145,22,5),(5125,1143,18,3),(5126,1143,46,4),(5127,1143,22,5),(5128,1143,29,5),(5129,1143,6,5),(5130,1146,18,3),(5131,1146,46,4),(5132,1146,22,5),(5133,1146,43,5),(5134,1147,18,3),(5135,1147,46,4),(5136,1147,22,5),(5137,1147,43,5),(5138,1147,28,5),(5139,1147,8,5),(5140,1148,18,3),(5141,1148,46,4),(5142,1148,22,5),(5143,1148,43,5),(5144,1148,28,5),(5145,1148,8,5),(5146,1149,18,3),(5147,1149,46,4),(5148,1149,22,5),(5149,1149,43,5),(5150,1149,29,5),(5151,1152,18,3),(5152,1152,46,4),(5153,1152,22,5),(5154,1151,18,3),(5155,1151,46,4),(5156,1151,22,5),(5157,1151,43,5),(5158,1150,18,3),(5159,1150,46,4),(5160,1150,22,5),(5161,1150,43,5),(5162,1153,18,3),(5163,1153,46,4),(5164,1153,22,5),(5165,1153,43,5),(5166,1153,29,5),(5167,1155,18,3),(5168,1155,46,4),(5169,1155,22,5),(5170,1155,29,5),(5171,1154,18,3),(5172,1154,46,4),(5173,1154,22,5),(5174,1154,8,5),(5175,1154,29,5),(5176,1154,6,5),(5177,1156,18,3),(5178,1156,46,4),(5179,1156,22,5),(5180,1157,18,3),(5181,1157,46,4),(5182,1157,22,5),(5183,1158,18,3),(5184,1158,46,4),(5185,1158,22,5),(5186,1158,43,5),(5187,1159,18,3),(5188,1159,46,4),(5189,1159,22,5),(5190,1160,18,3),(5191,1160,46,4),(5192,1160,22,5),(5193,1160,28,5),(5194,1160,8,5),(5195,1162,18,3),(5196,1162,46,4),(5197,1162,22,5),(5198,1162,43,5),(5199,1162,29,5),(5200,1163,18,3),(5201,1163,46,4),(5202,1163,22,5),(5203,1163,43,5),(5204,1163,29,5),(5205,1164,18,3),(5206,1164,46,4),(5207,1164,22,5),(5208,1164,43,5),(5209,1161,18,3),(5210,1161,46,4),(5211,1161,22,5),(5212,1161,43,5),(5213,1161,29,5),(5214,1165,18,3),(5215,1165,46,4),(5216,1165,22,5),(5217,1165,43,5),(5218,1165,28,5),(5219,1165,8,5),(5220,1166,18,3),(5221,1166,46,4),(5222,1166,22,5),(5223,1166,43,5),(5224,1168,18,3),(5225,1168,46,4),(5226,1168,22,5),(5227,1168,29,5),(5228,1167,18,3),(5229,1167,46,4),(5230,1167,22,5),(5231,1167,8,5),(5232,1167,29,5),(5233,1167,6,5),(5234,1169,18,3),(5235,1169,46,4),(5236,1169,22,5),(5237,1169,43,5),(5238,1170,18,3),(5239,1170,46,4),(5240,1170,22,5),(5241,1171,18,3),(5242,1171,46,4),(5243,1171,22,5),(5244,1171,43,5),(5245,1172,18,3),(5246,1172,46,4),(5247,1172,22,5),(5248,1172,43,5),(5249,1173,18,3),(5250,1173,46,4),(5251,1173,22,5),(5252,1173,43,5),(5253,1174,18,3),(5254,1174,46,4),(5255,1174,22,5),(5256,1175,18,3),(5257,1175,46,4),(5258,1175,22,5),(5259,1175,43,5),(5260,1175,29,5),(5261,1176,45,2),(5262,1176,18,3),(5263,1176,46,4),(5264,1176,12,4),(5265,1176,22,5),(5266,1176,6,5),(5267,1176,6,5),(5268,1176,43,5),(5269,1176,17,5),(5270,1176,45,5),(5271,1176,17,6),(5272,1176,45,7),(5273,1177,18,3),(5274,1177,46,4),(5275,1177,22,5),(5276,1177,29,5),(5277,1177,6,5),(5278,1177,6,5),(5279,1177,43,5),(5280,1178,18,3),(5281,1178,46,4),(5282,1178,22,5),(5283,1178,29,5),(5284,1178,6,5),(5285,1178,6,5),(5286,1178,43,5),(5287,1179,18,3),(5288,1179,46,4),(5289,1179,12,4),(5290,1179,22,5),(5291,1179,6,5),(5292,1179,6,5),(5293,1179,43,5),(5294,1179,17,5),(5295,1179,17,6),(5296,1181,18,3),(5297,1182,18,3),(5298,1183,18,3),(5299,1185,18,3),(5300,1184,45,2),(5301,1184,18,3),(5302,1184,46,4),(5303,1184,22,5),(5304,1184,43,5),(5305,1184,28,5),(5306,1184,6,5),(5307,1184,45,5),(5308,1184,45,7),(5309,1186,45,2),(5310,1186,18,3),(5311,1186,46,4),(5312,1186,22,5),(5313,1186,43,5),(5314,1186,28,5),(5315,1186,6,5),(5316,1186,6,5),(5317,1186,45,5),(5318,1186,45,7),(5319,1190,18,3),(5320,1191,18,3),(5321,1192,18,3),(5322,1194,12,5),(5323,1194,12,5),(5324,1194,12,5),(5325,1194,12,5),(5326,1201,22,5),(5327,1211,43,3),(5328,1211,12,4),(5329,1211,1,4),(5330,1211,48,4),(5331,1211,12,5),(5332,1211,12,5),(5333,1211,17,6),(5334,1211,11,6),(5335,1217,22,2),(5336,1217,43,3),(5337,1217,12,4),(5338,1217,48,4),(5339,1217,17,5),(5340,1217,11,5),(5341,1217,22,5),(5342,1217,17,6),(5343,1217,11,6),(5344,1217,22,7),(5345,1237,22,2),(5346,1237,43,3),(5347,1237,12,4),(5348,1237,48,4),(5349,1237,17,5),(5350,1237,11,5),(5351,1237,22,5),(5352,1237,17,6),(5353,1237,11,6),(5354,1237,22,7),(5355,1239,43,3),(5356,1239,18,4),(5357,1239,46,4),(5358,1239,22,5),(5359,1239,12,5),(5360,1239,12,5),(5361,1243,43,3),(5362,1243,12,4),(5363,1243,48,4),(5364,1243,17,5),(5365,1243,11,5),(5366,1243,12,5),(5367,1243,12,5),(5368,1243,22,5),(5369,1243,17,6),(5370,1243,11,6),(5371,1249,43,3),(5372,1254,43,3),(5373,1262,17,2),(5374,1262,43,3),(5375,1262,12,4),(5376,1262,22,5),(5377,1262,12,5),(5378,1262,12,5),(5379,1262,17,7),(5380,1271,22,2),(5381,1271,43,3),(5382,1271,12,4),(5383,1271,48,4),(5384,1271,17,5),(5385,1271,11,5),(5386,1271,22,5),(5387,1271,17,6),(5388,1271,11,6),(5389,1271,22,7),(5390,1279,43,3),(5391,1281,43,3),(5392,1285,43,3),(5393,1285,4,5),(5394,1285,3,5),(5395,1286,43,3),(5396,1286,12,4),(5397,1286,48,4),(5398,1286,17,5),(5399,1286,11,5),(5400,1286,17,6),(5401,1286,11,6),(5402,1289,43,3),(5403,1289,12,4),(5404,1289,48,4),(5405,1289,17,5),(5406,1289,11,5),(5407,1289,17,6),(5408,1289,11,6),(5409,1309,22,2),(5410,1309,43,3),(5411,1309,12,4),(5412,1309,48,4),(5413,1309,17,5),(5414,1309,11,5),(5415,1309,12,5),(5416,1309,12,5),(5417,1309,22,5),(5418,1309,22,5),(5419,1317,43,3),(5420,1317,12,5),(5421,1317,48,5),(5422,1317,11,5),(5423,1317,22,5),(5424,1323,43,3),(5425,1323,12,4),(5426,1323,22,5),(5427,1323,18,5),(5428,1323,46,5),(5429,1323,17,6),(5430,1324,43,3),(5431,1324,12,5),(5432,1324,48,5),(5433,1324,11,5),(5434,1324,22,5),(5435,1329,43,3),(5436,1329,12,4),(5437,1329,22,5),(5438,1329,18,5),(5439,1329,46,5),(5440,1329,17,6),(5441,1332,22,2),(5442,1332,43,3),(5443,1332,12,4),(5444,1332,48,4),(5445,1332,11,4),(5446,1332,17,5),(5447,1332,11,5),(5448,1332,12,5),(5449,1332,12,5),(5450,1332,22,5),(5451,1332,22,5),(5452,1332,17,6),(5453,1332,11,6),(5454,1332,22,7),(5455,1476,22,2),(5456,1476,17,3),(5457,1476,12,4),(5458,1476,22,5),(5459,1476,22,7),(5460,1478,22,2),(5461,1478,17,3),(5462,1478,12,4),(5463,1478,28,5),(5464,1478,8,5),(5465,1478,3,5),(5466,1478,4,5),(5467,1478,45,5),(5468,1478,22,7),(5469,1479,22,2),(5470,1479,17,3),(5471,1479,12,4),(5472,1479,45,5),(5473,1479,22,5),(5474,1479,22,7),(5475,1480,22,2),(5476,1480,17,3),(5477,1480,12,4),(5478,1480,45,5),(5479,1480,22,5),(5480,1480,22,7),(5481,1481,22,2),(5482,1481,6,2),(5483,1481,17,3),(5484,1481,12,4),(5485,1481,11,4),(5486,1481,46,4),(5487,1481,16,4),(5488,1481,41,4),(5489,1481,22,5),(5490,1481,6,5),(5491,1481,22,7),(5492,1481,6,7),(5493,1483,22,2),(5494,1483,6,2),(5495,1483,17,3),(5496,1483,11,4),(5497,1483,16,4),(5498,1483,46,4),(5499,1483,41,4),(5500,1483,12,5),(5501,1483,22,5),(5502,1483,6,5),(5503,1483,22,7),(5504,1483,6,7),(5505,1485,22,2),(5506,1485,17,3),(5507,1485,12,4),(5508,1485,28,5),(5509,1485,8,5),(5510,1485,3,5),(5511,1485,4,5),(5512,1485,45,5),(5513,1485,22,5),(5514,1485,22,7),(5515,1486,22,2),(5516,1486,17,3),(5517,1486,12,4),(5518,1486,45,5),(5519,1486,22,5),(5520,1486,22,7),(5521,1487,6,2),(5522,1487,17,3),(5523,1487,11,4),(5524,1487,46,4),(5525,1487,16,4),(5526,1487,41,4),(5527,1487,6,5),(5528,1487,6,7),(5529,1489,6,2),(5530,1489,17,3),(5531,1489,11,4),(5532,1489,16,4),(5533,1489,46,4),(5534,1489,18,4),(5535,1489,41,4),(5536,1489,12,5),(5537,1489,12,5),(5538,1489,6,5),(5539,1489,6,7),(5540,1491,6,2),(5541,1491,17,3),(5542,1491,11,4),(5543,1491,16,4),(5544,1491,46,4),(5545,1491,41,4),(5546,1491,12,5),(5547,1491,12,5),(5548,1491,6,7),(5549,1492,6,2),(5550,1492,17,3),(5551,1492,11,4),(5552,1492,16,4),(5553,1492,46,4),(5554,1492,41,4),(5555,1492,12,5),(5556,1492,12,5),(5557,1492,22,5),(5558,1492,6,5),(5559,1492,6,7),(5560,1494,6,2),(5561,1494,17,3),(5562,1494,11,4),(5563,1494,46,4),(5564,1494,16,4),(5565,1494,41,4),(5566,1494,6,5),(5567,1494,6,7),(5568,1495,6,2),(5569,1495,17,3),(5570,1495,11,4),(5571,1495,46,4),(5572,1495,16,4),(5573,1495,41,4),(5574,1495,6,5),(5575,1495,6,7),(5576,1493,22,2),(5577,1493,17,3),(5578,1493,12,4),(5579,1493,45,5),(5580,1493,22,5),(5581,1493,22,7),(5582,1497,6,2),(5583,1497,17,3),(5584,1497,11,4),(5585,1497,46,4),(5586,1497,16,4),(5587,1497,41,4),(5588,1497,6,5),(5589,1497,6,7),(5590,1496,6,2),(5591,1496,17,3),(5592,1496,11,4),(5593,1496,46,4),(5594,1496,16,4),(5595,1496,12,5),(5596,1496,12,5),(5597,1496,6,7),(5598,1499,22,2),(5599,1499,17,3),(5600,1499,12,4),(5601,1499,45,5),(5602,1499,22,5),(5603,1499,22,7),(5604,1502,6,2),(5605,1502,17,3),(5606,1502,11,4),(5607,1502,46,4),(5608,1502,16,4),(5609,1502,12,5),(5610,1502,12,5),(5611,1502,6,7),(5612,1503,6,2),(5613,1503,17,3),(5614,1503,11,4),(5615,1503,16,4),(5616,1503,46,4),(5617,1503,41,4),(5618,1503,12,5),(5619,1503,12,5),(5620,1503,6,7),(5621,1504,6,2),(5622,1504,17,3),(5623,1504,11,4),(5624,1504,46,4),(5625,1504,16,4),(5626,1504,41,4),(5627,1504,6,5),(5628,1504,6,7),(5629,1501,6,2),(5630,1501,17,3),(5631,1501,11,4),(5632,1501,16,4),(5633,1501,46,4),(5634,1501,41,4),(5635,1501,6,5),(5636,1501,6,7),(5637,1500,6,2),(5638,1500,17,3),(5639,1500,11,4),(5640,1500,16,4),(5641,1500,46,4),(5642,1500,41,4),(5643,1500,6,5),(5644,1500,6,7),(5645,1505,6,2),(5646,1505,17,3),(5647,1505,11,4),(5648,1505,46,4),(5649,1505,16,4),(5650,1505,41,4),(5651,1505,6,5),(5652,1505,6,7),(5653,1506,6,2),(5654,1506,17,3),(5655,1506,11,4),(5656,1506,46,4),(5657,1506,16,4),(5658,1506,12,5),(5659,1506,12,5),(5660,1506,6,7),(5661,1507,6,2),(5662,1507,17,3),(5663,1507,11,4),(5664,1507,16,4),(5665,1507,46,4),(5666,1507,41,4),(5667,1507,12,5),(5668,1507,12,5),(5669,1507,11,5),(5670,1507,48,5),(5671,1507,6,5),(5672,1507,6,7),(5673,1509,6,2),(5674,1509,17,3),(5675,1509,11,4),(5676,1509,16,4),(5677,1509,46,4),(5678,1509,41,4),(5679,1509,6,5),(5680,1509,6,7),(5681,1508,6,2),(5682,1508,17,3),(5683,1508,11,4),(5684,1508,16,4),(5685,1508,46,4),(5686,1508,41,4),(5687,1508,12,5),(5688,1508,12,5),(5689,1508,12,5),(5690,1508,11,5),(5691,1508,48,5),(5692,1508,6,5),(5693,1508,6,7),(5694,1512,22,2),(5695,1512,17,3),(5696,1512,12,4),(5697,1512,22,5),(5698,1512,22,7),(5699,1510,6,2),(5700,1510,17,3),(5701,1510,11,4),(5702,1510,46,4),(5703,1510,16,4),(5704,1510,12,5),(5705,1510,12,5),(5706,1510,6,7),(5707,1511,22,2),(5708,1511,17,3),(5709,1511,12,4),(5710,1511,45,5),(5711,1511,22,5),(5712,1511,22,7),(5713,1514,22,2),(5714,1514,17,3),(5715,1514,12,4),(5716,1514,45,5),(5717,1514,22,5),(5718,1514,22,7),(5719,1516,22,2),(5720,1516,17,3),(5721,1516,12,4),(5722,1516,28,5),(5723,1516,8,5),(5724,1516,3,5),(5725,1516,4,5),(5726,1516,45,5),(5727,1516,22,5),(5728,1516,22,7),(5729,1519,22,2),(5730,1519,6,2),(5731,1519,17,3),(5732,1519,11,4),(5733,1519,16,4),(5734,1519,46,4),(5735,1519,41,4),(5736,1519,12,5),(5737,1519,22,5),(5738,1519,6,5),(5739,1519,22,7),(5740,1519,6,7),(5741,1518,22,2),(5742,1518,17,3),(5743,1518,12,4),(5744,1518,28,5),(5745,1518,8,5),(5746,1518,3,5),(5747,1518,4,5),(5748,1518,45,5),(5749,1518,22,5),(5750,1518,22,7),(5751,1520,17,4),(5752,1520,12,4),(5753,1520,28,4),(5754,1520,8,4),(5755,1520,45,4),(5756,1520,29,4),(5757,1520,45,5),(5758,1521,22,2),(5759,1521,17,3),(5760,1521,12,4),(5761,1521,28,4),(5762,1521,8,4),(5763,1521,45,4),(5764,1521,29,4),(5765,1521,45,5),(5766,1521,22,5),(5767,1521,22,7),(5768,1522,6,2),(5769,1522,22,2),(5770,1522,17,3),(5771,1522,11,4),(5772,1522,46,4),(5773,1522,16,4),(5774,1522,41,4),(5775,1522,12,5),(5776,1522,45,5),(5777,1522,6,5),(5778,1522,22,5),(5779,1522,6,7),(5780,1522,22,7),(5781,1523,6,2),(5782,1523,22,2),(5783,1523,17,3),(5784,1523,11,4),(5785,1523,46,4),(5786,1523,16,4),(5787,1523,41,4),(5788,1523,12,5),(5789,1523,6,5),(5790,1523,22,5),(5791,1523,6,7),(5792,1523,22,7),(5793,1524,6,2),(5794,1524,22,2),(5795,1524,17,3),(5796,1524,11,4),(5797,1524,46,4),(5798,1524,16,4),(5799,1524,41,4),(5800,1524,12,5),(5801,1524,6,5),(5802,1524,22,5),(5803,1524,6,7),(5804,1524,22,7),(5805,1525,22,2),(5806,1525,6,2),(5807,1525,17,3),(5808,1525,11,4),(5809,1525,16,4),(5810,1525,46,4),(5811,1525,41,4),(5812,1525,12,5),(5813,1525,22,5),(5814,1525,6,5),(5815,1525,22,7),(5816,1525,6,7),(5817,1528,22,2),(5818,1528,6,2),(5819,1528,17,3),(5820,1528,11,4),(5821,1528,16,4),(5822,1528,46,4),(5823,1528,41,4),(5824,1528,6,4),(5825,1528,39,4),(5826,1528,12,5),(5827,1528,22,5),(5828,1528,6,5),(5829,1528,22,7),(5830,1528,6,7),(5831,1526,6,2),(5832,1526,22,2),(5833,1526,17,3),(5834,1526,11,4),(5835,1526,46,4),(5836,1526,16,4),(5837,1526,41,4),(5838,1526,12,5),(5839,1526,45,5),(5840,1526,6,5),(5841,1526,22,5),(5842,1526,6,7),(5843,1526,22,7),(5844,1527,22,2),(5845,1527,6,2),(5846,1527,17,3),(5847,1527,11,4),(5848,1527,16,4),(5849,1527,46,4),(5850,1527,41,4),(5851,1527,6,4),(5852,1527,3,4),(5853,1527,39,4),(5854,1527,12,5),(5855,1527,22,5),(5856,1527,6,5),(5857,1527,22,7),(5858,1527,6,7),(5859,1530,6,2),(5860,1530,22,2),(5861,1530,17,3),(5862,1530,11,4),(5863,1530,46,4),(5864,1530,16,4),(5865,1530,41,4),(5866,1530,12,5),(5867,1530,45,5),(5868,1530,6,5),(5869,1530,22,5),(5870,1530,6,7),(5871,1530,22,7),(5872,1534,17,3),(5873,1533,17,3),(5874,1532,6,2),(5875,1532,22,2),(5876,1532,17,3),(5877,1532,11,4),(5878,1532,46,4),(5879,1532,16,4),(5880,1532,41,4),(5881,1532,12,5),(5882,1532,6,5),(5883,1532,22,5),(5884,1532,6,7),(5885,1532,22,7),(5886,1531,6,2),(5887,1531,22,2),(5888,1531,17,3),(5889,1531,11,4),(5890,1531,46,4),(5891,1531,16,4),(5892,1531,41,4),(5893,1531,12,5),(5894,1531,45,5),(5895,1531,6,5),(5896,1531,22,5),(5897,1531,6,7),(5898,1531,22,7),(5899,1535,17,3),(5900,1538,17,3),(5901,1537,6,2),(5902,1537,22,2),(5903,1537,17,3),(5904,1537,11,4),(5905,1537,46,4),(5906,1537,16,4),(5907,1537,41,4),(5908,1537,12,5),(5909,1537,6,5),(5910,1537,22,5),(5911,1537,6,7),(5912,1537,22,7),(5913,1536,6,2),(5914,1536,22,2),(5915,1536,17,3),(5916,1536,11,4),(5917,1536,46,4),(5918,1536,16,4),(5919,1536,41,4),(5920,1536,12,5),(5921,1536,6,5),(5922,1536,22,5),(5923,1536,6,7),(5924,1536,22,7),(5925,1539,17,3),(5926,1540,17,3),(5927,1541,17,3),(5928,1542,17,3),(5929,1543,17,3),(5930,1545,17,3),(5931,1544,17,3),(5932,1546,17,3),(5933,1548,17,3),(5934,1547,17,3),(5935,1549,17,3),(5936,1550,17,3),(5937,1551,17,3),(5938,1552,17,3),(5939,1553,16,4),(5940,1553,12,4),(5941,1554,16,4),(5942,1558,16,4),(5943,1558,12,4),(5944,1560,16,4),(5945,1560,12,4),(5946,1559,16,4),(5947,1556,16,4),(5948,1556,18,5),(5949,1556,46,5),(5950,1556,22,5),(5951,1557,16,4),(5952,1557,12,4),(5953,1585,11,3),(5954,1585,48,4),(5955,1586,11,3),(5956,1586,48,4),(5957,1587,11,3),(5958,1587,48,4),(5959,1588,11,3),(5960,1588,48,4),(5961,1588,12,5),(5962,1588,12,5),(5963,1588,22,5),(5964,1589,11,3),(5965,1589,48,4),(5966,1589,12,5),(5967,1589,12,5),(5968,1589,22,5),(5969,1590,11,3),(5970,1590,48,4),(5971,1590,12,5),(5972,1590,12,5),(5973,1590,22,5),(5974,1591,11,3),(5975,1591,48,4),(5976,1591,12,5),(5977,1591,12,5),(5978,1592,11,3),(5979,1592,48,4),(5980,1593,11,3),(5981,1593,48,4),(5982,1595,11,3),(5983,1595,48,4),(5984,1594,11,3),(5985,1594,48,4),(5986,1594,6,5),(5987,1594,29,5),(5988,1596,11,3),(5989,1596,48,4),(5990,1597,11,3),(5991,1597,48,4),(5992,1598,11,3),(5993,1598,48,4),(5994,1599,11,3),(5995,1599,48,4),(5996,1600,11,3),(5997,1600,48,4),(5998,1601,11,3),(5999,1601,48,4),(6000,1601,6,5),(6001,1601,29,5),(6002,1603,11,3),(6003,1603,48,4),(6004,1604,11,3),(6005,1604,48,4),(6006,1602,11,3),(6007,1602,48,4),(6008,1605,11,3),(6009,1605,48,4),(6010,1606,11,3),(6011,1606,48,4),(6012,1607,11,3),(6013,1607,48,4),(6014,1608,11,3),(6015,1608,48,4),(6016,1609,11,3),(6017,1609,48,4),(6018,1610,11,3),(6019,1610,48,4),(6020,1611,11,3),(6021,1611,48,4),(6022,1611,6,5),(6023,1611,29,5),(6024,1612,11,3),(6025,1612,48,4),(6026,1613,11,3),(6027,1613,48,4),(6028,1614,11,3),(6029,1614,48,4),(6030,1615,11,3),(6031,1615,48,4),(6032,1616,11,3),(6033,1616,48,4),(6034,1617,11,3),(6035,1617,48,4),(6036,1618,11,3),(6037,1618,48,4),(6038,1619,11,3),(6039,1619,48,4),(6040,1619,6,5),(6041,1619,29,5),(6042,1620,11,3),(6043,1620,48,4),(6044,1621,11,3),(6045,1621,48,4),(6046,1621,12,5),(6047,1621,12,5),(6048,1621,22,5),(6049,1622,11,3),(6050,1622,48,4),(6051,1623,11,3),(6052,1623,48,4),(6053,1623,6,5),(6054,1623,29,5),(6055,1624,11,3),(6056,1624,48,4),(6057,1625,11,3),(6058,1625,48,4),(6059,1625,12,5),(6060,1625,12,5),(6061,1625,22,5),(6062,1626,11,3),(6063,1627,11,3),(6064,1628,11,3),(6065,1628,48,4),(6066,1628,12,5),(6067,1628,12,5),(6068,1628,22,5),(6069,1629,11,3),(6070,1629,48,4),(6071,1629,43,4),(6072,1629,12,4),(6073,1629,12,5),(6074,1629,12,5),(6075,1629,22,5),(6076,1630,11,3),(6077,1632,11,3),(6078,1633,11,3),(6079,1635,11,3),(6080,1634,11,3),(6081,1631,11,3),(6082,1631,48,4),(6083,1631,12,5),(6084,1631,12,5),(6085,1631,22,5),(6086,1631,29,5),(6087,1631,6,5),(6088,1636,48,3),(6089,1636,11,4),(6090,1637,48,3),(6091,1637,11,4),(6092,1638,48,3),(6093,1638,11,4),(6094,1638,43,5),(6095,1638,12,5),(6096,1639,48,3),(6097,1640,48,3),(6098,1643,48,3),(6099,1643,11,4),(6100,1642,48,3),(6101,1642,11,4),(6102,1641,48,3),(6103,1641,43,4),(6104,1641,12,4),(6105,1641,11,5),(6106,1641,17,5),(6107,1641,11,6),(6108,1641,17,6),(6109,1644,48,3),(6110,1645,48,3),(6111,1646,48,3),(6112,1646,11,4),(6113,1647,48,3),(6114,1648,48,3),(6115,1649,48,3),(6116,1650,48,3),(6117,1651,48,3),(6118,1652,6,3),(6119,1653,6,3),(6120,1654,6,3),(6121,1654,12,5),(6122,1654,12,5),(6123,1655,6,3),(6124,1656,6,3),(6125,1658,6,3),(6126,1659,6,3),(6127,1657,6,3),(6128,1660,6,3),(6129,1661,6,3),(6130,1662,6,3),(6131,1663,6,3),(6132,1664,6,3),(6133,1664,6,5),(6134,1664,29,5),(6135,1665,6,3),(6136,1667,6,3),(6137,1666,6,3),(6138,1668,6,3),(6139,1669,6,3),(6140,1671,6,3),(6141,1672,6,3),(6142,1670,6,3),(6143,1674,6,3),(6144,1673,6,3),(6145,1673,6,5),(6146,1673,29,5),(6147,1675,6,3),(6148,1676,6,3),(6149,1677,6,3),(6150,1678,6,3),(6151,1679,6,3),(6152,1680,6,3),(6153,1681,6,3),(6154,1682,6,3),(6155,1684,6,3),(6156,1685,6,3),(6157,1683,6,3),(6158,1686,6,3),(6159,1687,6,3),(6160,1687,12,5),(6161,1687,12,5),(6162,1687,22,5); -/*!40000 ALTER TABLE `exercise_related_muscle` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `kinesiology_glossary` --- - -DROP TABLE IF EXISTS `kinesiology_glossary`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `kinesiology_glossary` ( - `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'The ID of kinesiology glossary.', - `name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'The name kinesiology glossary.', - `description` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'The description of kinesiology glossary.', - `parent_id` bigint unsigned DEFAULT NULL COMMENT 'The parent ID of kinesiology glossary.', - PRIMARY KEY (`id`), - UNIQUE KEY `kinesiology_glossary_name_uindex` (`name`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Kinesiology Glossary.\n\nhttps://exrx.net/Kinesiology/Glossary'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `kinesiology_glossary` --- - -LOCK TABLES `kinesiology_glossary` WRITE; -/*!40000 ALTER TABLE `kinesiology_glossary` DISABLE KEYS */; -/*!40000 ALTER TABLE `kinesiology_glossary` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `muscle` --- - -DROP TABLE IF EXISTS `muscle`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `muscle` ( - `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'The ID of muscle.', - `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'The name of muscle.', - `other_names` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'The muslce''s other names.', - `parent_id` bigint unsigned DEFAULT NULL COMMENT 'The parent ID of muscle.', - `body_part_id` bigint unsigned NOT NULL COMMENT 'Related body part ID.', - PRIMARY KEY (`id`), - UNIQUE KEY `muscle_name_uindex` (`name`) -) ENGINE=InnoDB AUTO_INCREMENT=54 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Muscle.\n\nhttps://exrx.net/Lists/Muscle'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `muscle` --- - -LOCK TABLES `muscle` WRITE; -/*!40000 ALTER TABLE `muscle` DISABLE KEYS */; -INSERT INTO `muscle` VALUES (1,'Adductors','Inner Thigh',NULL,0),(2,'Biceps Brachii','Arm (Front),Biceps,Biceps Cubiti',NULL,0),(3,'Brachialis','Arm (Side),Lower Biceps',NULL,0),(4,'Brachioradialis','Forearm (Upper-outer),Supinator longus (out dated)',NULL,0),(5,'Deltoid',NULL,NULL,0),(6,'Anterior','Shoulder (Front),Front Delts',NULL,0),(7,'Lateral','Shoulder (Side),Side Delts',NULL,0),(8,'Posterior','Shoulder (Rear),Rear Delts',NULL,0),(9,'Deep Hip External Rotators','Six Deep Lateral Rotator Hip Muscles',NULL,0),(10,'Erector Spinae','Lower Back',NULL,0),(11,'Gastrocnemius','Calf',NULL,0),(12,'Gluteus',NULL,NULL,0),(13,'Maximus','Butt,Hips (Rear),Glutes',NULL,0),(14,'Medius','Hip,Hip Abductor',NULL,0),(15,'Minimus','Hip,Hip Abductor',NULL,0),(16,'Gracilis','Inner Thigh,Hip Adductor',NULL,0),(17,'Hamstrings','Thigh (Rear)',NULL,0),(18,'Iliopsoas','Hip,Hip Flexors',NULL,0),(19,'Infraspinatus','Rotatory Cuff,Back',NULL,0),(20,'Latissimus Dorsi','Back (Middle, Outer),Lats',NULL,0),(21,'Levator Scapulae','Shoulder (Upper),Neck (Rear)',NULL,0),(22,'Obliques','Hips (Upper),Waist (Sides),Obliques',NULL,0),(23,'Pectineous','Thigh (upper),Hip Flexors',NULL,0),(24,'Pectoralis Major',NULL,NULL,0),(25,'Clavicular Head','Chest (Upper),Upper Pecs',NULL,0),(26,'Sternal Head','Chest,Lower Pecs',NULL,0),(27,'Teres',NULL,NULL,0),(28,'Major','Back (Outer),Lats little helper',NULL,0),(29,'Minor','Rotatory Cuff,Back',NULL,0),(30,'Tibialis Anterior','Shin,Tibias,Tibialis Anticus',NULL,0),(31,'Transverse Abdominus','Transverse Abs',NULL,0),(32,'Trapezius',NULL,NULL,0),(33,'Lower Fibers','Back (Middle),Lower Traps',NULL,0),(34,'Middle Fibers','Back (Upper),Traps',NULL,0),(35,'Upper Fibers','Shoulder (Upper),Upper Traps',NULL,0),(36,'Triceps Brachii','Arm (Rear),Triceps',NULL,0),(37,'Wrist',NULL,NULL,0),(38,'Extensors','Forearm (outer or back),Hand Extensors',NULL,0),(39,'Flexors','Forearm (Inner),Hand Flexors',NULL,0),(40,'Pectoralis Minor','Chest,Shoulder',NULL,0),(41,'Popliteus','Knee flexor',NULL,0),(42,'Quadratus Lumborum','Deep Low Back Lateral Flexor',NULL,0),(43,'Quadriceps','Thigh (Front),Quads',NULL,0),(44,'Rectus Abdominis','Waist (Belly),Abdominal,Abs',NULL,0),(45,'Rhomboids','Back (Middle)',NULL,0),(46,'Sartorius','Thigh (Inner),Tailor\'s muscle,Longest muscle in body',NULL,0),(47,'Serratus Anterior','Serratus Magnus,Boxer\'s Muscle',NULL,0),(48,'Soleus','Calf,Soleus',NULL,0),(49,'Splenius','Neck (Rear),Neck Extensors',NULL,0),(50,'Sternocleidomastoid','Sterno-mastoid,Neck (Front / Sides),Neck Flexors',NULL,0),(51,'Subscapularis','Rotator Cuff,Back',NULL,0),(52,'Supraspinatus','Rotatory Cuff,Shoulder',NULL,0),(53,'Tensor Fasciae Latae','Hip,Hip Abductor/Flexor,Tensor Fasciae Femoris',NULL,0); -/*!40000 ALTER TABLE `muscle` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `muscle_image` --- - -DROP TABLE IF EXISTS `muscle_image`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `muscle_image` ( - `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'The ID of muscle image.', - `muscle_id` bigint unsigned NOT NULL COMMENT 'The ID of muslce.', - `image_path` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'The image path of muscle image.', - `alternative_text` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'A textual description of the image.', - PRIMARY KEY (`id`), - UNIQUE KEY `muscle_image_image_path_uindex` (`image_path`) -) ENGINE=InnoDB AUTO_INCREMENT=61 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Muscle Image.\n\nThe relationship:\nOne muscle to one or more muscle image.'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `muscle_image` --- - -LOCK TABLES `muscle_image` WRITE; -/*!40000 ALTER TABLE `muscle_image` DISABLE KEYS */; -INSERT INTO `muscle_image` VALUES (1,1,'upload/muscle-picture/adductors/AdductorAnteriorSmall.png','Adductors'),(2,1,'upload/muscle-picture/adductors/AdductorPosteriorSmall.png','Adductors'),(3,2,'upload/muscle-picture/biceps-brachii/BicepsInsideSmall.gif','Biceps Brachii'),(4,3,'upload/muscle-picture/brachialis/BrachialisInsideSmall.gif','Brachialis'),(5,3,'upload/muscle-picture/brachialis/BrachialisUpperArmSegmentSmall.gif','Brachialis'),(6,4,'upload/muscle-picture/brachioradialis/BrachioradialisoutsideSmall.png','Brachioradialis'),(7,6,'upload/muscle-picture/anterior/DeltoidAnteriorFront.gif','Anterior'),(8,7,'upload/muscle-picture/lateral/DeltoidLateralBack.gif','Lateral'),(9,8,'upload/muscle-picture/posterior/DeltoidPosteriorBack.gif','Posterior'),(10,9,'upload/muscle-picture/deep-hip-external-rotators/DeepHipRotators.gif','Deep Hip External Rotators'),(11,10,'upload/muscle-picture/erector-spinae/96a0e9eeb4ad8418eff179a9c59bc713.png','Erector Spinae'),(12,10,'upload/muscle-picture/erector-spinae/ErectorSpinaeCrossSection.gif','Erector Spinae'),(13,11,'upload/muscle-picture/gastrocnemius/GastrocnemiusLateral.gif','Gastrocnemius'),(14,13,'upload/muscle-picture/maximus/80a4754b254e159c4cd5474b063d096e.png','Maximus'),(15,14,'upload/muscle-picture/medius/GluteusMediusPosterior.gif','Medius'),(16,15,'upload/muscle-picture/minimus/bf94c6ef8b7ca1c02323779e1fe3b837.png','Minimus'),(17,15,'upload/muscle-picture/minimus/GluteusMinimusSide.gif','Minimus'),(18,16,'upload/muscle-picture/gracilis/69c90b7fb98b9c863015a90b3ff3173c.png','Gracilis'),(19,17,'upload/muscle-picture/hamstrings/1c94da8f4db345d0343c3db475d2d84d.png','Hamstrings'),(20,18,'upload/muscle-picture/iliopsoas/99beae51baa19dc3d8ef62c04b469133.png','Iliopsoas'),(21,18,'upload/muscle-picture/iliopsoas/ed4205586bfaf0b1603ad8e70dae6706.png','Iliopsoas'),(22,19,'upload/muscle-picture/infraspinatus/3e3d3ded3335c56a7f932c6e38a3ed53.png','Infraspinatus'),(23,20,'upload/muscle-picture/latissimus-dorsi/67f687e9482a2a6bca9a38544e45d31c.png','Latissimus Dorsi'),(24,20,'upload/muscle-picture/latissimus-dorsi/LatSmall.png','Latissimus Dorsi'),(25,21,'upload/muscle-picture/levator-scapulae/5083bc6f81d7a598832a5cb53340fb4a.png','Levator Scapulae'),(26,22,'upload/muscle-picture/obliques/1d421470bb1b8650b68a055d15704abe.png','Obliques'),(27,22,'upload/muscle-picture/obliques/ObliqueCrossSection.gif','Obliques'),(28,23,'upload/muscle-picture/pectineous/52d884ea5ad22f197b0335468e4ca6e7.png','Pectineous'),(29,25,'upload/muscle-picture/clavicular-head/11a9ea1af4fa3e206ec2eecc7e60100e.png','Clavicular Head'),(30,25,'upload/muscle-picture/clavicular-head/0e1ed54440e102b3ec973207ea371964.png','Clavicular Head'),(31,26,'upload/muscle-picture/sternal-head/5a6b344e7b8a52c715adf8b091461f7d.png','Sternal Head'),(32,26,'upload/muscle-picture/sternal-head/PectoralAttachmentSmall.png','Sternal Head'),(33,28,'upload/muscle-picture/major/TeresMajorSmall.png','Major'),(34,29,'upload/muscle-picture/minor/TeresMinorSmall.png','Minor'),(35,30,'upload/muscle-picture/tibialis-anterior/TibialisAnteriorSmall.png','Tibialis Anterior'),(36,31,'upload/muscle-picture/transverse-abdominus/TransverseAbdominisCrossSectionNew.jpg','Transverse Abdominus'),(37,33,'upload/muscle-picture/lower-fibers/TrapLowerHalfSmall.png','Lower Fibers'),(38,34,'upload/muscle-picture/middle-fibers/TrapMiddleHalfSmall.png','Middle Fibers'),(39,35,'upload/muscle-picture/upper-fibers/TrapUpperHalfSmall.png','Upper Fibers'),(40,36,'upload/muscle-picture/triceps-brachii/TricepsOutsideSmall.gif','Triceps Brachii'),(41,38,'upload/muscle-picture/extensors/WristExtensorsSupSmall.gif','Extensors'),(42,39,'upload/muscle-picture/flexors/WristFlexorNeutSmall.gif','Flexors'),(43,40,'upload/muscle-picture/pectoralis-minor/e7cda9218a2e2c84a31a7ca32e98c3a9.png','Pectoralis Minor'),(44,41,'upload/muscle-picture/popliteus/PopliteusSmall.png','Popliteus'),(45,42,'upload/muscle-picture/quadratus-lumborum/QuadratusLumborumSmall.png','Quadratus Lumborum'),(46,43,'upload/muscle-picture/quadriceps/QuadricepsAnteriorSmall.png','Quadriceps'),(47,44,'upload/muscle-picture/rectus-abdominis/RectusAbdominisWaistSmall.png','Rectus Abdominis'),(48,44,'upload/muscle-picture/rectus-abdominis/RectusAbdominalCrossSectionNew.jpg','Rectus Abdominis'),(49,45,'upload/muscle-picture/rhomboids/RhomboidsHalfSmall.png','Rhomboids'),(50,46,'upload/muscle-picture/sartorius/SartoriusAnteriorSmall.png','Sartorius'),(51,47,'upload/muscle-picture/serratus-anterior/SerratusAnteriorSideSmall.png','Serratus Anterior'),(52,47,'upload/muscle-picture/serratus-anterior/SerratusAnteriorPullSmall.png','Serratus Anterior'),(53,47,'upload/muscle-picture/serratus-anterior/SerratusScapulaTransverseCu.gif','Serratus Anterior'),(54,48,'upload/muscle-picture/soleus/SoleusLateralSmall.png','Soleus'),(55,49,'upload/muscle-picture/splenius/SpleniusSpineSmall.png','Splenius'),(56,49,'upload/muscle-picture/splenius/SpeniusHalfSmall.png','Splenius'),(57,50,'upload/muscle-picture/sternocleidomastoid/SternoSideSmall.png','Sternocleidomastoid'),(58,51,'upload/muscle-picture/subscapularis/SubscapularisSmall.png','Subscapularis'),(59,52,'upload/muscle-picture/supraspinatus/SupraspinatusBackSmall.png','Supraspinatus'),(60,53,'upload/muscle-picture/tensor-fasciae-latae/TensorFasciaeLataeASmall.png','Tensor Fasciae Latae'); -/*!40000 ALTER TABLE `muscle_image` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `permission` --- - -DROP TABLE IF EXISTS `permission`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `permission` ( - `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'Primary key', - `url` varchar(200) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'URL. If type of record is page (1), URL stands for route; if type of record is button (2), URL stands for API', - `description` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'Permission description', - `type` tinyint NOT NULL COMMENT 'Permission type. 1 - page; 2 - button', - `permission_expression` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'Permission expression', - `method` enum('GET','HEAD','POST','PUT','DELETE','CONNECT','OPTIONS','TRACE','PATCH') COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'HTTP method of API', - `sort` int NOT NULL DEFAULT '0' COMMENT 'Sort number', - `parent_id` bigint DEFAULT '0' COMMENT 'Primary key of parent', - `deleted` tinyint NOT NULL DEFAULT '0' COMMENT 'Deleted flag', - `created_time` datetime NOT NULL COMMENT 'Created time', - `modified_time` datetime NOT NULL COMMENT 'Modified time', - PRIMARY KEY (`id`), - UNIQUE KEY `permission_expression_UNIQUE` (`permission_expression`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Permission.'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `permission` --- - -LOCK TABLES `permission` WRITE; -/*!40000 ALTER TABLE `permission` DISABLE KEYS */; -/*!40000 ALTER TABLE `permission` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `related_muscle` --- - -DROP TABLE IF EXISTS `related_muscle`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `related_muscle` ( - `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'The ID of related muscle.', - `muscle_id` bigint unsigned NOT NULL COMMENT 'The ID of muscle.', - `related_muscle_id` bigint unsigned NOT NULL COMMENT 'Related muscle''s ID.', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=56 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Muscle''s related muscles.'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `related_muscle` --- - -LOCK TABLES `related_muscle` WRITE; -/*!40000 ALTER TABLE `related_muscle` DISABLE KEYS */; -INSERT INTO `related_muscle` VALUES (1,1,16),(2,2,3),(3,2,4),(4,3,2),(5,3,4),(6,4,3),(7,4,2),(8,10,49),(9,10,42),(10,11,48),(11,16,1),(12,16,17),(13,17,11),(14,17,46),(15,17,16),(16,18,46),(17,18,53),(18,21,45),(19,22,42),(20,22,44),(21,23,1),(22,23,18),(23,23,46),(24,23,53),(25,25,40),(26,26,40),(27,28,20),(28,29,19),(29,31,44),(30,31,22),(31,33,45),(32,34,45),(33,35,21),(34,40,47),(35,41,17),(36,42,22),(37,42,10),(38,43,18),(39,43,46),(40,43,53),(41,44,22),(42,45,32),(43,45,21),(44,45,47),(45,46,18),(46,46,53),(47,46,17),(48,47,40),(49,47,45),(50,48,11),(51,49,50),(52,49,10),(53,50,49),(54,53,18),(55,53,46); -/*!40000 ALTER TABLE `related_muscle` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `role` --- - -DROP TABLE IF EXISTS `role`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `role` ( - `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'Primary key', - `name` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'Role name', - `description` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'Role description', - `created_time` datetime NOT NULL COMMENT 'Created time', - `modified_time` datetime NOT NULL COMMENT 'Modified time', - PRIMARY KEY (`id`), - UNIQUE KEY `name_UNIQUE` (`name`) -) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Role.'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `role` --- - -LOCK TABLES `role` WRITE; -/*!40000 ALTER TABLE `role` DISABLE KEYS */; -INSERT INTO `role` VALUES (1,'admin','M&F system admin','2020-05-09 16:18:45','2020-05-09 16:18:51'); -/*!40000 ALTER TABLE `role` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `role_permission` --- - -DROP TABLE IF EXISTS `role_permission`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `role_permission` ( - `role_id` bigint NOT NULL COMMENT 'Primary key of role', - `permission_id` varchar(45) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'Primary key of permission', - PRIMARY KEY (`role_id`,`permission_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Role-permission Relation.'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `role_permission` --- - -LOCK TABLES `role_permission` WRITE; -/*!40000 ALTER TABLE `role_permission` DISABLE KEYS */; -/*!40000 ALTER TABLE `role_permission` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `test_table` --- - -DROP TABLE IF EXISTS `test_table`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `test_table` ( - `id` bigint unsigned NOT NULL AUTO_INCREMENT, - `string_value` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, - `int_value` int DEFAULT NULL, - `double_value` double DEFAULT NULL, - `datetime_value` datetime DEFAULT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Test Table for ORM library.'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `test_table` --- - -LOCK TABLES `test_table` WRITE; -/*!40000 ALTER TABLE `test_table` DISABLE KEYS */; -INSERT INTO `test_table` VALUES (1,'Hello',12,12.2,'2020-01-10 14:23:33'); -/*!40000 ALTER TABLE `test_table` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `user` --- - -DROP TABLE IF EXISTS `user`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `user` ( - `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'Primary key of user', - `username` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'Username', - `email` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'Email', - `cellphone` varchar(11) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'Cellphone number', - `password` varchar(60) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'Password', - `full_name` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'Full name', - `birthday` date DEFAULT NULL COMMENT 'Birthday', - `gender` enum('Agender','Androgyne','Bigender','Cisgender','Cisgender Female','Cisgender Male','Female to Male','Gender Fluid','Gender Nonconforming','Gender Questioning','Gender Variant','Genderqueer','Intersex','Male to Female','Neither','Neutrois','Non-binary','Other','Pangender','Transfeminine','Transgender','Transgender Female','Transgender Male','Transgender Person','Transmasculine','Two-Spirit') COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '26 gender options', - `avatar` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'User avatar full path on SFTP server', - `status` tinyint NOT NULL DEFAULT '1' COMMENT 'Status. 1 - enabled, 2 - disabled', - `created_time` datetime NOT NULL COMMENT 'Created time', - `modified_time` datetime NOT NULL COMMENT 'Modified time', - PRIMARY KEY (`id`), - UNIQUE KEY `email_UNIQUE` (`email`), - UNIQUE KEY `username_UNIQUE` (`username`), - UNIQUE KEY `cellphone_UNIQUE` (`cellphone`) -) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='User.'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `user` --- - -LOCK TABLES `user` WRITE; -/*!40000 ALTER TABLE `user` DISABLE KEYS */; -INSERT INTO `user` VALUES (1,'ijohnnymiller','ijohnnymiller@icloud.com','13100959832','$2a$10$zndhsonjmOxlC2zDYP58luhUHp4ejFerj8e3gWY3Q.buaDDutkNYe','Johnny Miller','1996-04-29','Cisgender Male','',1,'2020-05-09 15:13:19','2020-05-09 16:26:23'); -/*!40000 ALTER TABLE `user` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `user_role` --- - -DROP TABLE IF EXISTS `user_role`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `user_role` ( - `user_id` bigint NOT NULL COMMENT 'Primary key of user', - `role_id` bigint NOT NULL COMMENT 'Primary key of role', - PRIMARY KEY (`user_id`,`role_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='User-role Relation. Roles that users have.'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `user_role` --- - -LOCK TABLES `user_role` WRITE; -/*!40000 ALTER TABLE `user_role` DISABLE KEYS */; -INSERT INTO `user_role` VALUES (1,1); -/*!40000 ALTER TABLE `user_role` ENABLE KEYS */; -UNLOCK TABLES; -/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; - -/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; -/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; -/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; -/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; -/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; -/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; -/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; - --- Dump completed on 2020-05-09 16:27:41 diff --git a/docker/script/mysql-init-script/zipkin.sql b/docker/script/mysql-init-script/zipkin.sql deleted file mode 100644 index 4aa71f09..00000000 --- a/docker/script/mysql-init-script/zipkin.sql +++ /dev/null @@ -1,68 +0,0 @@ --- MySQL script: https://github.com/openzipkin/zipkin/blob/master/zipkin-storage/mysql-v1/src/main/resources/mysql.sql - --- --- Copyright 2015-2019 The OpenZipkin Authors --- --- Licensed 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. --- - -CREATE DATABASE IF NOT EXISTS zipkin; - -USE zipkin; - -CREATE TABLE IF NOT EXISTS zipkin_spans ( - `trace_id_high` BIGINT NOT NULL DEFAULT 0 COMMENT 'If non zero, this means the trace uses 128 bit traceIds instead of 64 bit', - `trace_id` BIGINT NOT NULL, - `id` BIGINT NOT NULL, - `name` VARCHAR(255) NOT NULL, - `remote_service_name` VARCHAR(255), - `parent_id` BIGINT, - `debug` BIT(1), - `start_ts` BIGINT COMMENT 'Span.timestamp(): epoch micros used for endTs query and to implement TTL', - `duration` BIGINT COMMENT 'Span.duration(): micros used for minDuration and maxDuration query', - PRIMARY KEY (`trace_id_high`, `trace_id`, `id`) -) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci; - -ALTER TABLE zipkin_spans ADD INDEX(`trace_id_high`, `trace_id`) COMMENT 'for getTracesByIds'; -ALTER TABLE zipkin_spans ADD INDEX(`name`) COMMENT 'for getTraces and getSpanNames'; -ALTER TABLE zipkin_spans ADD INDEX(`remote_service_name`) COMMENT 'for getTraces and getRemoteServiceNames'; -ALTER TABLE zipkin_spans ADD INDEX(`start_ts`) COMMENT 'for getTraces ordering and range'; - -CREATE TABLE IF NOT EXISTS zipkin_annotations ( - `trace_id_high` BIGINT NOT NULL DEFAULT 0 COMMENT 'If non zero, this means the trace uses 128 bit traceIds instead of 64 bit', - `trace_id` BIGINT NOT NULL COMMENT 'coincides with zipkin_spans.trace_id', - `span_id` BIGINT NOT NULL COMMENT 'coincides with zipkin_spans.id', - `a_key` VARCHAR(255) NOT NULL COMMENT 'BinaryAnnotation.key or Annotation.value if type == -1', - `a_value` BLOB COMMENT 'BinaryAnnotation.value(), which must be smaller than 64KB', - `a_type` INT NOT NULL COMMENT 'BinaryAnnotation.type() or -1 if Annotation', - `a_timestamp` BIGINT COMMENT 'Used to implement TTL; Annotation.timestamp or zipkin_spans.timestamp', - `endpoint_ipv4` INT COMMENT 'Null when Binary/Annotation.endpoint is null', - `endpoint_ipv6` BINARY(16) COMMENT 'Null when Binary/Annotation.endpoint is null, or no IPv6 address', - `endpoint_port` SMALLINT COMMENT 'Null when Binary/Annotation.endpoint is null', - `endpoint_service_name` VARCHAR(255) COMMENT 'Null when Binary/Annotation.endpoint is null' -) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci; - -ALTER TABLE zipkin_annotations ADD UNIQUE KEY(`trace_id_high`, `trace_id`, `span_id`, `a_key`, `a_timestamp`) COMMENT 'Ignore insert on duplicate'; -ALTER TABLE zipkin_annotations ADD INDEX(`trace_id_high`, `trace_id`, `span_id`) COMMENT 'for joining with zipkin_spans'; -ALTER TABLE zipkin_annotations ADD INDEX(`trace_id_high`, `trace_id`) COMMENT 'for getTraces/ByIds'; -ALTER TABLE zipkin_annotations ADD INDEX(`endpoint_service_name`) COMMENT 'for getTraces and getServiceNames'; -ALTER TABLE zipkin_annotations ADD INDEX(`a_type`) COMMENT 'for getTraces and autocomplete values'; -ALTER TABLE zipkin_annotations ADD INDEX(`a_key`) COMMENT 'for getTraces and autocomplete values'; -ALTER TABLE zipkin_annotations ADD INDEX(`trace_id`, `span_id`, `a_key`) COMMENT 'for dependencies job'; - -CREATE TABLE IF NOT EXISTS zipkin_dependencies ( - `day` DATE NOT NULL, - `parent` VARCHAR(255) NOT NULL, - `child` VARCHAR(255) NOT NULL, - `call_count` BIGINT, - `error_count` BIGINT, - PRIMARY KEY (`day`, `parent`, `child`) -) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci; diff --git a/docker/script/mysql-server-master/1_init_user.sql b/docker/script/mysql-server-master/1_init_user.sql new file mode 100644 index 00000000..e8c65da4 --- /dev/null +++ b/docker/script/mysql-server-master/1_init_user.sql @@ -0,0 +1,8 @@ +CREATE USER 'replication_user'@'%' IDENTIFIED BY 'replication_password'; +GRANT REPLICATION SLAVE ON *.* TO 'replication_user'@'%'; + +CREATE USER 'maf_mysql_rw'@'%' IDENTIFIED BY 'maf@mysql'; +GRANT SELECT, INSERT, UPDATE, DELETE ON *.* TO 'maf_mysql_rw'@'%'; + +CREATE USER 'maf_mysql_r'@'%' IDENTIFIED BY 'maf@mysql'; +GRANT SELECT ON *.* TO 'maf_mysql_r'@'%'; diff --git a/docker/script/mysql-server-master/2_Dump20210704.sql b/docker/script/mysql-server-master/2_Dump20210704.sql new file mode 100644 index 00000000..0175ccfd --- /dev/null +++ b/docker/script/mysql-server-master/2_Dump20210704.sql @@ -0,0 +1,512 @@ +-- MySQL dump 10.13 Distrib 8.0.23, for Win64 (x86_64) +-- +-- Host: 127.0.0.1 Database: muscle_and_fitness +-- ------------------------------------------------------ +-- Server version 8.0.23 + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!50503 SET NAMES utf8 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; +SET @MYSQLDUMP_TEMP_LOG_BIN = @@SESSION.SQL_LOG_BIN; +SET @@SESSION.SQL_LOG_BIN= 0; + +-- +-- Table structure for table `body_part` +-- + +DROP TABLE IF EXISTS `body_part`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `body_part` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'The ID of body part.', + `name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'The name of body part.', + `created_by` bigint unsigned NOT NULL DEFAULT '1' COMMENT 'Created by.', + `created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Created time', + `modified_by` bigint unsigned DEFAULT NULL COMMENT 'Modified by', + `modified_time` datetime DEFAULT NULL COMMENT 'Modified time', + `deleted` tinyint NOT NULL DEFAULT '0' COMMENT 'Deleted', + PRIMARY KEY (`id`), + UNIQUE KEY `body_part_name_uindex` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Human Body Part.'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `body_part` +-- + +LOCK TABLES `body_part` WRITE; +/*!40000 ALTER TABLE `body_part` DISABLE KEYS */; +INSERT INTO `body_part` VALUES (1,'Neck',1,'2021-06-27 13:31:48',NULL,NULL,0),(2,'Shoulders',1,'2021-06-27 13:31:48',NULL,NULL,0),(3,'Upper Arms',1,'2021-06-27 13:31:48',NULL,NULL,0),(4,'Forearms',1,'2021-06-27 13:31:48',NULL,NULL,0),(5,'Back',1,'2021-06-27 13:31:48',NULL,NULL,0),(6,'Chest',1,'2021-06-27 13:31:48',NULL,NULL,0),(7,'Waist',1,'2021-06-27 13:31:48',NULL,NULL,0),(8,'Hips',1,'2021-06-27 13:31:48',NULL,NULL,0),(9,'Thighs',1,'2021-06-27 13:31:48',NULL,NULL,0),(10,'Calves',1,'2021-06-27 13:31:48',NULL,NULL,0),(11,'Other Exercises',1,'2021-06-27 13:31:48',NULL,NULL,0); +/*!40000 ALTER TABLE `body_part` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `equipment` +-- + +DROP TABLE IF EXISTS `equipment`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `equipment` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'The ID of exercise equipment.', + `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'The name of equipment.', + `created_by` bigint unsigned NOT NULL DEFAULT '1' COMMENT 'Created by', + `created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Created time', + `modified_by` bigint unsigned DEFAULT NULL COMMENT 'Modified by', + `modified_time` datetime DEFAULT NULL COMMENT 'Modified time', + `deleted` tinyint NOT NULL DEFAULT '0' COMMENT 'Deleted', + PRIMARY KEY (`id`), + UNIQUE KEY `equipment_name_uindex` (`name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Exercise Equipment.'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `equipment` +-- + +LOCK TABLES `equipment` WRITE; +/*!40000 ALTER TABLE `equipment` DISABLE KEYS */; +/*!40000 ALTER TABLE `equipment` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `exercise` +-- + +DROP TABLE IF EXISTS `exercise`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `exercise` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'The ID of exercise.', + `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'The name of exercise.', + `preparation` varchar(800) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'Exercise preparation description.', + `execution` varchar(800) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'Exercise execution description.', + `exercise_gif_path` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'Exercise GIF image path.', + `created_by` bigint unsigned NOT NULL DEFAULT '1' COMMENT 'Created by', + `created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Created time', + `modified_by` bigint unsigned DEFAULT NULL COMMENT 'Modified by', + `modified_time` datetime DEFAULT NULL COMMENT 'Modified time', + `deleted` tinyint NOT NULL DEFAULT '0' COMMENT 'Deleted', + PRIMARY KEY (`id`), + UNIQUE KEY `exercise_name_uindex` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=1692 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Exercise.\n\nhttps://exrx.net/Lists/Directory'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `exercise` +-- + +LOCK TABLES `exercise` WRITE; +/*!40000 ALTER TABLE `exercise` DISABLE KEYS */; +INSERT INTO `exercise` VALUES (1,'Cable Neck Flexion (with belt)','Attach belt on low pulley cable by attaching carabiner on belt buckle. Grasp attached belt, face away from pulley, and place head in belt loop. With belt above ears, clamp belt snugly around head by tightly gripping ends close to back of mid-head. With neck braced and assistance of arm, lunge forward to angle torso forward with feet staggered. Place hand on lower thigh for support.','Pull head forward and down by flexing neck until chin touches upper chest. Return by hyperextending neck until head is angled upward. Repeat.','upload/exercise-picture/CBNeckFlexionBelt.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(2,'Cable Neck Flexion','Sit on bench facing away from middle pulley. Place neck in harness cable attachment. Place arms on lower thighs for support.','Move head away from pulley by bending neck forward until chin touches upper chest. Return head by hyperextending neck and repeat.','upload/exercise-picture/CBNeckFlexion.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(3,'Lever Neck Flexion (plate loaded)','Sit on seat in machine. Position padded lever on face. Position body so neck is in line with lever axis. Grasp handles for support.','Move head forward by flexing neck until chin touches upper chest. Return head by hyperextending neck and repeat.','upload/exercise-picture/LVNeckFlexionH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(4,'Cable Neck Rotation (with belt)','Place workout chair or bench with vertical back support facing to one side near adjustable height cable pulley. Adjust pulley approximately height of head when seated. Attach belt on low pulley cable by attaching carabiner on belt buckle. Sit on bench, grasp attached belt from side. Face toward cable pulley and place head in belt loop. With belt above ears, clamp belt snugly around head by tightly gripping ends close forehead. Position torso upright with feet wide apart and hand nearest cable pulley on lower thigh for added support.','Turn head away from pulley cable by rotating head away from pulley. Turn head back toward cable pulley and repeat. Turn seat the opposite direction or attach belt to pulley on opposite side and continue with other side.','upload/exercise-picture/CBNeckRotationBelt.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(5,'Lever Lateral Neck Flexion','Sit on seat in machine with feet apart. Position side of head on padded lever. Center body so neck is in line with lever axis. Grasp handles for support.','Move head down to side by laterally flexing neck. Return head to opposite side and repeat. Sit in machine backwards and continue with opposite side.','upload/exercise-picture/LVNeckLateralFlexion.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(6,'Cable Lateral Neck Flexion (with belt)','Adjust pulley approximately height of neck or head when seated. Attach belt on low pulley cable by attaching carabiner on belt buckle. Sit on bench with pulley to one side and feet apart. Place head in belt loop. With belt above ears, clamp belt snugly around head by tightly gripping ends close to side of head. Pull torso upright by bracing opposite hand on far side of bench.','Pull head away from pulley cable by laterally flexing neck. Tilt head back toward cable pulley and repeat. Sit on bench the opposite direction and continue with other side.','upload/exercise-picture/CBLateralNeckFlexionBelt.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(7,'Lever Lateral Neck Flexion (plate loaded)','Sit on seat in machine with feet apart\n\n\n. Position padded lever on side of head. Center body so neck is in line with lever axis. Grasp handles for support.','Move head down to side by laterally flexing neck. Return head to opposite side and repeat. Sit in machine backwards and continue with opposite side.','upload/exercise-picture/LVLateralNeckFlexionH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(8,'Lever Neck Flexion','Sit on seat in machine. Position padded lever on face. Position body so neck is in line with lever axis. Grasp handles for support.','Move head forward by flexing neck until chin touches upper chest. Return head by hyperextending neck and repeat.','upload/exercise-picture/LVNeckFlexion.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(9,'Weighted Lying Neck Flexion','Place folded towel on weight plate(s). Lie supine on bench, head extending off of end of bench. Place plates on forehead with towel placed in between for comfort.','Move head up by flexing neck until chin touches upper chest. Return by hyperextending neck and repeat.','upload/exercise-picture/WtNeckFlexion.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(10,'Weighted Neck Flexion','Place folded towel on weight plate. Lie supine perpendicular on bench with low back and hips extending off and feet on floor. Place weight and towel on forehead. Place plates on forehead with towel placed in between for comfort.','Move head up by flexing neck until chin touches upper chest. Return by hyperextending neck and repeat.','upload/exercise-picture/WTNeckFlexionCrossBench.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(11,'Weighted Lateral Neck Flexion','Place folded towel on weight plate. Lie on bench on side with knees and hips bent and arm hanging over edge. Position weight and towel on side of upper head. Hold weight on side of head with hand of upper arm. Place hand of lower arm on floor for support.','Move head up to side by laterally flexing neck. Lower head to opposite side and repeat. Lie on other side and continue.','upload/exercise-picture/WTLateralNeckFlexion.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(12,'Neck Rotation Stretch','Stand or sit.','Turn head over shoulder to one side. Hold stretch. Repeat to other side.','upload/exercise-picture/2fbe7e69b265b483d2414574acf6142e.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(13,'Wall Side Neck Bridge','Place small or folded cushioned mat on column or at end of wall approximately shoulder height. With hands supporting mat, stand with side toward mat. Step far to side so feet are away from wall or column forward. Place side of head on mat with shoulder extending over end of adjacent side of column or wall so body leans to side. Fold hands behind low back or hips.','Push side of head into mat and roll onto top of head moving body away from mat. Return to original position by rolling back down to side of head while bringing shoulder back over end of column or wall. Repeat.','upload/exercise-picture/BWWallSideNeckBridge.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(14,'Neck Retraction Stretch','Stand or sit.','Pull head back as far possible while looking slightly down and hold stretch.','upload/exercise-picture/360cb46b3b96821a6d08e84228e08c07.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(15,'Suspended Neck Flexion','Place belt or strap around end of suspension trainer. Face away from suspension trainer with belt in hand. Place belt around head above ears and clamp belt snugly around head by tightly gripping ends close to back of mid-head. Step forward until suspension trainer is taut. Lean forward at angle against support of belt and suspension trainer by stepping back slightly while keeping head and body straight.','Increase angle of body by bowing head until chin touches upper chest. Lower angle of body by raising head. Repeat.','upload/exercise-picture/STNeckFlexion.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(16,'Front Neck Bridge','Kneel on all fours on well cushioned mat. Place head on mat between hands. Rise and straighten knees. Fold hands behind low back or hips.','Roll back onto forehead until nose touches mat. Roll forward onto top of head until chin touches upper chest. Repeat.','upload/exercise-picture/BWFrontNeckBridge.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(17,'Wall Front Neck Bridge','Place small or folded cushioned mat on wall or column approximately chest height. With hands supporting mat on each side stand back so feet are away from wall or column with body leaning forward. Place top of forehead on mat. Fold hands behind low back or hips.','Roll down onto forehead until nose touches mat. Roll up onto top of head until chin touches upper chest. Repeat.','upload/exercise-picture/BWWallFrontNeckBridge.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(18,'Suspended Lateral Neck Flexion','Place belt or strap around end of suspension trainer. Hold belt in hand and stand away from suspension trainer so it hangs to one side. Place belt around head above ears and clamp belt snugly around head by tightly gripping ends close to head above ear closest to suspension trainer. Step further away from suspension trainer until it is taut. Lean away at angle against support of belt and suspension trainer by positioning feet closer to side of suspension trainer while keeping head and body straight.','Lower angle of body by tilting head to side of suspension trainer. Increase angle of body by tilting head away from side of suspension trainer. Repeat and continue in opposite position.','upload/exercise-picture/STNeckLateralExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(19,'Cable Neck Extension','Sit on bench facing pulley. Place neck in harness cable attachment. Place forearms on lower thighs for support.','Move head away from pulley by hyperextending neck. Return by bending neck forward until chin touches upper chest. Repeat.','upload/exercise-picture/CBNeckExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(20,'Lever Neck Extension','Sit on seat in machine. Place back of head under padded lever. Position body so neck is in line with lever axis. Grasp handles for support.','Move head back by hyperextending neck. Return by bending neck forward until chin touches upper chest. Repeat.','upload/exercise-picture/LVNeckExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(21,'Lever Neck Extension (plate loaded)','Sit on seat in machine. Place back of head under padded lever. Position body so neck is in line with lever axis. Grasp handles for support.','Move head back by hyperextending neck. Return by bending neck forward until chin touches upper chest. Repeat.','upload/exercise-picture/LVNeckExtensionH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(22,'Weighted Lying Neck Extension','Lie prone on bench with head extended off of end and folded towel and weight plate(s) on floor. With both hands, place plate(s) on back of head with towel placed in between for comfort.','Move head up by hyperextending neck up as high as possible. Return by bending neck down until chin touches upper chest. Repeat.','upload/exercise-picture/WTLyingNeckExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(23,'Weighted Neck Extension','Kneel on side of bench with weight plates on end of bench. With both hands, hold weight plate(s) cushioned with towel. Position upper body prone and perpendicular on bench with head and arms extending off of side. With both hands, place weight plate(s) on back of head with towel placed in between for comfort.','Move head up by hyperextending neck up as high as possible. Return by bending neck down until chin touches upper chest. Repeat.','upload/exercise-picture/WTNeckExtensionCrossBench.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(24,'Cable Neck Extension (with belt)','Sit on bench facing low pulley. Attach belt on low pulley cable by attaching carabiner on belt buckle. Place head in belt loop. With belt above ears, clamp belt snugly around head by tightly gripping ends close to forehead. Place other hand or forearm on lower thighs for support.','Pull head up and back by hyperextending neck. Return by bending neck forward until chin touches upper chest. Repeat.','upload/exercise-picture/CBNeckExtensionBelt.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(25,'Weighted Neck Harness Extension','Sit on bench with weighted neck harness on head. Allow weight to dangle in front by bending over.','Move head up by hyperextending neck. Return by bending neck down until chin touches upper chest. Repeat.','upload/exercise-picture/WTNeckExtensionHarness.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(26,'Weighted Seated Neck Extension','Place folded towel on weight plate. On bench or stool, sit bent over on thighs. With both hands, place plate(s) on back of head with towel placed in between for comfort.','Move head up by hyperextending neck up as high as possible. Return by bending neck down until chin touches upper chest. Repeat.','upload/exercise-picture/WtNeckExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(27,'Band Resistive Neck Retraction','Execution\nPush back of neck into band by retracting head. Returning head to neutral postion and repeat.','Comments','upload/exercise-picture/BRNeckRetraction.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(28,'Wall Rear Neck Bridge','Hold small or folded cushioned mat behind head. Facing away from wall or column position head and back of shoulders low on wall or column with mat between. Stand with feet far away from wall or column so body is angled back. Position hips and back straight and bend knees just slightly. Place arms to side or hold hands on abdomen.','Push head back into mat and roll head upward. Arch spine and straighten knees. Hyperextend neck so head is facing up. Return to origianl position by rolling head down while allowing low back to straighten and knees to bend slightly. Continue down until back of head and shoulders make contact with mat. Repeat.','upload/exercise-picture/BWWallRearNeckBridge.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(29,'Rear Neck Bridge','Lying supine on well cushioned mat. Position feet very close to hips. Raise buttocks and low back slightly off of floor and fold hands on abdomen.','Extend hips and knees while pushing head back into floor. Roll back on head while arching spine high off of floor. Hyperextend neck back in attempt to bring forehead toward mat. Return body to close to mat until back of head and shoulders make contact with mat. Repeat.','upload/exercise-picture/BWRearNeckBridge.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(30,'Neck Extensor Stretch','Bow head forward with jaw shut. Depress chin into top of sternum.','Slightly turn head to one side. Hold stretch. Repeat to other side.','upload/exercise-picture/0b4142cf0100659361840fb8e05756e4.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(31,'Suspended Neck Extension','Place belt or strap around end of suspension trainer. Place belt around head above ears and clamp belt snugly around head by tightly gripping ends close to forehead. Step back facing direction of suspension trainer until it is taut. Lean back at angle against support of belt and suspension trainer by stepping forward slightly while keeping head and body straight.','Lower angle of body by bowing head until chin is near upper chest. Increase angle of body by raising head. Repeat.','upload/exercise-picture/STNeckExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(32,'Lying Neck Retraction Isometric','Execution\nPush head into mat and hold position. Relax and repeat.','Comments','upload/exercise-picture/IsometricNeckRetraction.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(33,'Barbell Behind Neck Press','Grasp barbell with overhand grip from rack or clean from floor. Position bar behind neck.','Press bar upward until arms are extended overhead. Return behind neck and repeat.','upload/exercise-picture/BBSeatedBehindNeckPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(34,'Barbell Incline Front Raise','Grasp barbell with shoulder width overhand grip. Lie supine on upper portion of 45 degree incline bench with legs straight. Position barbell on top of upper thighs.','With elbows straight or slightly bent, raise barbell up and over shoulders until uppers arm are vertical. Lower barbell to upper thigh and repeat.','upload/exercise-picture/BBInclineFrontRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(35,'Barbell Military Press','Grasp barbell from rack or clean barbell from floor with overhand grip, slightly wider than shoulder width. Position bar in front of neck.','Press bar upward until arms are extended overhead. Lower to front of neck and repeat.','upload/exercise-picture/BBMilitaryPressBentLeg.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(36,'Barbell Front Raise','Grasp barbell with overhand grip with elbows straight or slightly bent.','Raise barbell forward and upward until upper arms are above horizontal. Lower and repeat.','upload/exercise-picture/BBFrontRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(37,'Barbell Shoulder Press','Grasp barbell with slightly wider than shoulder width overhand grip from rack. Position bar near upper chest.','Press bar upward until arms are extended overhead. Return to upper chest and repeat.','upload/exercise-picture/BBShoulderPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(38,'Cable Bar Behind Neck Press','Stand facing cable bar, mounted on each side to upper waist height narrow double pulley cables. Grasp cable bar with wide overhand grip upper chest height. Stand directly between both cable pulleys with one foot forward and other foot back. Push cable bar over head and position cable bar behind neck or rest on shoulders.','Press cable bar upward until arms are extended overhead. Return behind neck and repeat.','upload/exercise-picture/CBBarBehindNeckPressSide.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(39,'Cable Bar Military Press','Stand facing cable bar, mounted on each side to upper waist height narrow double pulley cables. Grasp cable bar with overhand grip, slightly wider than shoulder width. Position cable bar upper chest height. Stand directly between both cable pulleys with one foot forward and other foot back.','Press cable bar upward until arms are extended overhead. Return to upper chest and repeat.','upload/exercise-picture/CBBarMilitaryPressSide.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(40,'Cable Bar Shoulder Press','Stand facing cable bar mounted on each side to upper waist height narrow double pulley cables. Grasp cable bar with wide overhand grip and position upper chest height. Stand directly between both cable pulleys with one foot forward and other foot back.','Press cable bar upward until arms are extended overhead. Return to upper chest and repeat.','upload/exercise-picture/CBBarMilitaryPressSide.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(41,'Barbell Seated Military Press','Grasp barbell with slightly wider than shoulder width overhand grip from rack. Position bar near upper chest.','Press bar upward until arms are extended overhead. Return to upper chest and repeat.','upload/exercise-picture/BBSeatedMilitaryPressFF.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(42,'Cable Seated Front Raise','Sit on seat above twin cable pulleys. Grasp stirrups on each side. Sit upright with arms straight down to each side with palms facing back.','Raise stirrups forward and upward until upper arms are well above horizontal. Lower and repeat.','upload/exercise-picture/CBSeatedFrontRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(43,'Cable Alternating Front Raise','Stand with low double pulleys behind. Grasp stirrup attachments, one in each hand. Stand away from pulley slightly with arms back somewhat at side and elbows straight or slightly bent.','Raise one stirrup forward and upward until upper arm is well above horizontal. Lower and repeat with opposite arm, alternating between arms.','upload/exercise-picture/CBAlternatingFrontLateralRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(44,'Cable Alternating Seated Front Raise','Sit on seat above twin cable pulleys. Grasp stirrups on each side. Sit upright with arms straight down to each side with palms facing back.','Raise one stirrup forward and upward until upper arm is well above horizontal. Lower and repeat with opposite arm. Continue by alternating raises between sides.','upload/exercise-picture/CBAlternatingSeatedFrontRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(45,'Cable One Arm Front Raise (with rope)','Grasp end of Triceps Rope Cable attachment with one hand so that protruding end is in contact with side of hand (thumb and index finger). Stand away from\n\n\npulley with arm back at side and elbow straight.','Raise stirrup forward and upward until arm is well above horizontal or cable makes contact with underside of upper arm. Lower and repeat. Repeat with opposite arm.','upload/exercise-picture/CBFrontRaiseRope.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(46,'Cable Shoulder Press','Sit on seat and grasp stirrups from low to medium low position from each side. Position stirrups to each side of shoulders with elbows down to sides and stirrups above or slightly narrower than elbows.','Push stirrups upward until arms are extended overhead. Return stirrups to sides of shoulders and repeat.','upload/exercise-picture/CBShoulderPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(47,'Cable One Arm Front Raise','Grasp stirrup attachment. Stand away from pulley slightly with arm back somewhat at side and elbow straight or slightly bent.','Raise stirrup forward and upward until upper arm is well above horizontal. Lower and repeat. Repeat with opposite arm.','upload/exercise-picture/CBFrontRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(48,'Dumbbell Alternating Incline Front Raise','Grasp dumbbells and lie supine on upper portion of 45 degree incline bench with legs straight. Position dumbbells downward below each shoulder.','With elbows straight or slightly bent, raise one dumbbell forward, up and over shoulder until upper arm is vertical. Lower dumbbell down to starting position. Repeat raise with other arm, alternating between sides.','upload/exercise-picture/DBAlternInclineFrontRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(49,'Cable Twisting Overhead Press','Stand beside low to medium height pulley. Grasp cable stirrup. Position stirrup to front of shoulder with elbow down to side. Place opposite hand on hip. With feet wide apart, squat down slightly.','Rotate body away from pulley and straighten legs while pushing stirrup diagonally upward toward opposite side of body. Return to original position and repeat.','upload/exercise-picture/CBTwistingOverheadPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(50,'Cable Standing Shoulder Press','Stand between two low to medium height pulleys. Grasp cable stirrups from each side. Position stirrups to each side of shoulders with elbows down to sides and stirrups above or slightly narrower than elbows.','Push stirrups upward until arms are extended overhead. Return stirrups to sides of shoulders and repeat.','upload/exercise-picture/CBStandingShoulderPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(51,'Dumbbell Front Raise','Grasp dumbbells in both hands. Position dumbbells in front of upper legs with elbows straight or slightly bent.','Raise dumbbells forward and upward until upper arms are above horizontal. Lower and repeat.','upload/exercise-picture/DBFrontRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(52,'Dumbbell Alternating Front Raise','Grasp dumbbells in both hands. Position dumbbells in front of upper legs with elbows straight or slightly bent.','Raise one dumbbell forward and upward with until upper arm is above horizontal. Lower and repeat with opposite arm, alternating between arms.','upload/exercise-picture/DBAlternatingFrontRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(53,'Dumbbell Arnold Press','Stand with two dumbbells position in front of shoulders, palms facing body and elbows under wrists.','Initiate movement by bringing elbows out to sides. Continue to raise elbows outward while pressing dumbbells overhead until arms are straight. Lower to front of shoulders in opposite pattern and repeat.','upload/exercise-picture/DBArnoldPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(54,'Dumbbell Shoulder Press','Position dumbbells to each side of shoulders with elbows below wrists.','Press dumbbells upward until arms are extended overhead. Lower to sides of shoulders and repeat.','upload/exercise-picture/DBShoulderPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(55,'Lever Reclined Shoulder Press (plate loaded)','Lie on back pad facing up. Grasp lever handles on each side with overhand grip.','Press lever until arms are extended. Lower and repeat.','upload/exercise-picture/LVReclinedShoulderPressPL.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(56,'Lever Behind Neck Press (plate loaded)','Sit back on seat. Grasp lever bars to each side with overhand grip.','Press levers upward until arms are extended overhead. Lower and repeat.','upload/exercise-picture/LVBehindNeckShoulderPressH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(57,'Lever Barbell Behind Neck Press (plate loaded)','Sit on bench with bar positioned behind shoulders, also facing away from fulcrum. Grasp bar with wide overhand grip. Disengage bar by rotating bar back.','Press bar upward until arms are extended overhead. Lower bar behind neck and repeat.','upload/exercise-picture/LVSMSeatedBehindNeckPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(58,'Lever Military Press (plate loaded)','Set and grasp lever handles to each side with overhand grip.','Press lever until arms are extended upward. Lower and repeat.','upload/exercise-picture/LVMilitaryInclinePressH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(59,'Dumbbell One Arm Shoulder Press','Stand with dumbbells positioned near shoulder with elbow below wrists.','Press dumbbell upward until arm is extended overhead. Lower to side of shoulder and repeat.','upload/exercise-picture/DBOneArmShoulderPressLean.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(60,'Lever One Arm Front Raise','Stand with lever to side, fulcrum approximately shoulder height and handle just below hip. Grasp lever handle with elbow straight or slightly bent.','Raise lever handle forward and upward until upper arm is well above horizontal. Lower and repeat. Repeat with opposite arm.','upload/exercise-picture/LVOneArmFrontRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(61,'Lever Shoulder Press (plate loaded)','Set and grasp lever handles to each side with overhand grip.','Press lever upward until arms are extended overhead. Lower and repeat.','upload/exercise-picture/LVShoulderPressH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(62,'Lever Barbell Shoulder Press (plate loaded)','Sit on bench with bar positioned in front of shoulders. Grasp bar with wide overhand grip. Disengage bar by rotating bar back.','Press bar upward until arms are extended overhead. Lower bar to front of shoulders and repeat.','upload/exercise-picture/LVSMSeatedShoulderPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(63,'Lever One Arm Shoulder Press (plate loaded)','Stand to one side, near loaded end of barbell, opposite of landmine lever. Lift end of barbell and position near shoulder with underhand grip. Stand with feet far apart (leg on same side of loaded arm is back and opposite leg is forward and bent).','Press end of barbell upward and forward until arm is extended. Lower to shoulder and repeat. Repeat with opposite side.','upload/exercise-picture/LVOneArmShoulderPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(64,'Lever Reclined Shoulder Press','Lie on back pad facing up. Grasp lever handles to each side with overhand grip.','Press lever until arms are extended. Lower and repeat.','upload/exercise-picture/LVReclinedShoulderPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(65,'Lever Reclined Parallel Grip Shoulder Press','Lie on back pad facing up. Grasp parallel lever handles on each side.','Press lever until arms are extended. Lower and repeat.','upload/exercise-picture/LVReclinedShoulderPressParGrip.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(66,'Sled Shoulder Press','Set and grasp lever handles to each side with overhand grip.','Press handles upward until arms are extended overhead. Lower and repeat.','upload/exercise-picture/SLShoulderPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(67,'Lever Shoulder Press','Set and grasp lever handles to each side with overhand grip.','Press lever upward until arms are extended overhead. Lower and repeat.','upload/exercise-picture/LVShoulderPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(68,'Sled Shoulder Press (parallel grip)','Sit on seat and grasp parallel bar grips to front of shoulders on each side.','Press handles upward until arms are extended overhead. Lower and repeat.','upload/exercise-picture/SLShoulderPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(69,'Lever Alternating Shoulder Press','Set and grasp lever handles to each side with overhand grip.','Press one lever upward until arm is extended overhead. Lower to original position. Repeat with opposite arm. Continue by alternating movement between arms.','upload/exercise-picture/LVAlternatingShoulderPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(70,'Lever Shoulder Press (parallel grip)','Sit on seat and grasp parallel bar grips in front of shoulders on each side.','Press lever upward until arms are extended overhead. Lower and repeat.','upload/exercise-picture/LVClosWidParGripShouldPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(71,'Smith Shoulder Press','Sit on bench with bar positioned in front of shoulders. Grasp bar with wide overhand grip. Disengage bar by rotating bar back.','Press bar upward until arms are extended overhead. Lower bar to front of shoulders and repeat.','upload/exercise-picture/SMShoulderPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(72,'Smith Behind Neck Press','Sit on bench with bar positioned behind shoulders. Grasp bar with wide overhand grip. Disengage bar by rotating bar back.','Press bar upward until arms are extended overhead. Lower bar behind neck and repeat.','upload/exercise-picture/SMBehindNeckPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(73,'Handstand Shoulder Press (between benches)','Stand facing wall between two benches positioned side by side, slightly apart, and slightly away and perpendicular to wall. Place hands on ends of benches closest to wall. Place forefeet on bench and kick lower body up to handstand position with arms and legs straight. Maintain balance with lower body against wall.','Lower head between ends of benches by bending arms. Push body back up to original position by extending arms. Repeat.','upload/exercise-picture/BWHandstandPressBenches.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(74,'Lying Front Deltoid Stretch','Sit on floor or mat. Lean back and place hands flat on floor behind body slightly wider than shoulder width with fingers positioned away from body.','Scoot hips forward away from hands. Hold stretch.','upload/exercise-picture/55ab2c829aa0fcebd5d58d00c31dd5cb.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(75,'PNF Seated Front Deltoid Stretch','Instruct participant to sit on floor or bench and place arms to behind hips. From behind, grasp participant\'s wrists, positioning them wider than shoulder width.','Continue to raise participant\'s arms upward behind their body, out to sides. Hold stretch.','upload/exercise-picture/653009242a6a02fb25ad40c66eb2737b.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(76,'Doorway Front Deltoid Stretch','Stand at end of wall or in doorway facing perpendicular to wall. Position palm on surface of wall slightly lower than shoulder. Bend elbow slightly.','Turn body away from positioned arm. Hold stretch. Repeat with opposite arm.','upload/exercise-picture/5616f45948903873fa68bfd777cf1388.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(77,'Pike Press','Kneel on two benches positioned side by side slightly apart at end nearest head. Place hands on ends of benches. With forefeet on opposite ends of bench, raise rear end high up with arms, back, and knees straight. Adjust feet so they are somewhat close to hands while keeping back and legs straight.','Lower head between ends of benches by bending arms. Push body back up to original position by extending arms. Repeat.','upload/exercise-picture/BWPikePress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(78,'Decline Pike Press','Stand between two incline benches positioned side by side slightly apart at end nearest head. Place hands on ends of benches and straighten arms. Position forefeet on opposite ends of bench. Raise rear end high up with arms, back, and knees straight.','Lower head between ends of benches by bending arms. Push body back up to original position by extending arms. Repeat.','upload/exercise-picture/BWPikePressDeclined.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(79,'Suspended Front Raise','Grasp suspension handles and momentarily step back until arms are extended forward and straight. While keeping arms straight and shoulders back, step forward so body reclines back behind suspension handles. Position body and legs straight at desired angle, hanging from handles with arms straight and palms facing downward.','Raise arms upward over head by flexing shoulders with arms straight. Return and lower body back until arms are extended straight forward in original position. Repeat.','upload/exercise-picture/STFrontRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(80,'Wall Front Deltoid Stretch','Face away from wall. Bend over and place hands slightly wider than shoulder width as high as possible on wall with fingers positioned upward.','Bring rear end and back toward wall and squat down. Hold stretch for 20 seconds.','upload/exercise-picture/ff15584ed4d354bd3c44c8e22fae9f77.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(81,'Cable Lateral Raise','With low pulleys to each side, grasp left stirrup with right hand and right stirrup with left hand. Stand upright.','With elbows slightly bent, raise arms to sides\n\n\nuntil elbows are shoulder height. Lower and repeat.','upload/exercise-picture/CBLateralRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(82,'Barbell Wide Grip Upright Row','Grasp bar with wide overhand grip.','Pull bar to neck with elbows leading. Allow wrists to flex\nas bar rises. Lower and repeat.','upload/exercise-picture/BBWideGripUprightRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(83,'Cable One Arm Lateral Raise','Grasp stirrup cable attachment. Stand facing with side of resting arm toward low pulley. Grasp ballet bar if available.','With elbow slightly bent, raise arm to side away from low pulley until elbow is shoulder height. Lower and repeat.','upload/exercise-picture/CBOneArmLateralRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(84,'Barbell Upright Row','Grasp bar with shoulder width or slightly narrower overhand grip.','Pull bar to neck with elbows leading. Allow wrists to flex as bar rises. Lower and repeat.','upload/exercise-picture/BBUprightRowM.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(85,'Cable Seated Lateral Raise','Sit on seat above twin cable pulleys. Grasp stirrups on each side. Sit upright with arms nearly straight down to each side.','With elbows slightly bent, raise arms to side until elbows are shoulder height. Lower and repeat.','upload/exercise-picture/CBSeatedLateralRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(86,'Cable Upright Row','Grasp cable bar with shoulder width or slightly narrower overhand grip. Stand close to pulley.','Pull bar to neck with elbows leading. Allow wrists to flex as bar rises. Lower and repeat.','upload/exercise-picture/CBUprightRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(87,'Cable Bar Upright Row','Grasp cable bar with shoulder width or slightly narrower overhand grip. Stand close to cable bar.','Pull bar to neck with elbows leading. Allow wrists to flex as bar rises. Lower and repeat.','upload/exercise-picture/CBBarUprightRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(88,'Cable Upright Row (dual pulley)','Stand between low dual pulleys. Grasp handles with opposite hands - right hand holds left stirrup and left hand holds right stirrup. Stand upright with arms straight and palms facing back (overhand grip), one stirrup in front of other.','Pull handles up to front of shoulders with elbows leading and cables crossed. Allow wrists to flex as stirrups are lifted. Lower and repeat.','upload/exercise-picture/CBUprightRowDoublePulley.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(89,'Cable One Arm Upright Row','Grasp stirrup on low pulley with overhand grip. Stand with side of arm with stirup away from pulley machine, arm against front of body. Place other hand on ballet bar or side of pulley column for support.','Pull stirup to front side of shoulder with elbow leading. Allow wrist to flex as stirrup is lifted. Lower and repeat.','upload/exercise-picture/CBOneArmUprightRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(90,'Cable Upright Row (with rope attachment)','Grasp each side of rope with overhand grip, just under rope\nends. Stand close to pulley.','Pull rope ends to front of shoulders with elbows leading.\nAllow wrists to flex as stirrups are lifted. Lower and repeat.','upload/exercise-picture/CBUprightRowRope.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(91,'Cable Lateral Raise (pulleys close)','Stand facing two low pulleys positioned side by side. Grasp stirrups with each hand. Stand upright with arms staight down to each side.','With elbows slightly bent, raise arms to side until elbows are shoulder height. Lower and repeat.','upload/exercise-picture/CBLateralRaiseClose.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(92,'Cable Seated Y Raise (with rope attachment)','Sit slightly forward on seat or bench and grasp ends of rope attachment with hand. Place feet on vertical platform. Slide hips back so knees are slightly bent.','With torso upright pull rope upward over head until elbows are approximately lateral to each ear. Lower stirrups forward and downward until arms are extended straight in front of body. Repeat.','upload/exercise-picture/CBSeatedYRowRope.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(93,'Cable Y Raise','Stand facing between low pulleys medium width apart, grasp left stirrup with right hand and right stirrup with left hand. Step back slightly away from pulleys and stand upright with cables crossed in front of hips.','With elbows slightly bent, raise arms upward and outward to sides in Y configuration until elbows are approximately lateral to each ear. Lower stirrups forward and downward in reverse pattern. Repeat.','upload/exercise-picture/CBYRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(94,'Dumbbell One Arm Lateral Raise','Position dumbbell in front of pelvis with elbow slightly bent. Grasp stationary object with other hand for support. Bend over with hips and knees bent slightly.','Raise upper arm to side until elbow is shoulder height. Maintain elbow\'s height above or equal to wrist. Lower and repeat. Continue with opposite arm.','upload/exercise-picture/DBOneArmLateralRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(95,'Cable Wide Grip Upright Row','Grasp cable bar with wide overhand grip. Stand close to pulley.','Pull bar to neck with elbows leading. Allow wrists to flex\nas bar rises. Lower and repeat.','upload/exercise-picture/CBWideGripUprightRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(96,'Dumbbell Incline Lateral Raise','Grasp dumbbell in one hand. Lie on 30° to 45° incline bench with opposite side of body on incline, arm over top of bench, lower leg positioned on front side of seat, and upper leg on back side of seat. Position dumbbell inside of lower leg, just in front of upper leg.','Raise dumbbell from until upper arm is perpendicular to torso. Maintain slight fixed bend in elbow throughout exercise. Lower dumbbell to front of upper leg and repeat.','upload/exercise-picture/DBInclineLateralRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(97,'Cable Seated Y Raise','On dual pulley seated row machine, sit slightly forward on seat or bench in order to grasp both cable attachments. Place feet on vertical platform. Position torso upright and slide hips back so knees are slightly bent.','Raise arms upward and outward to sides in Y configuration while allowing elbows to partially bend. Pull back until elbows are approximately lateral to each ear. Lower stirrups forward and downward until arms are extended straight in front of body. Repeat.','upload/exercise-picture/CBSeatedYRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(98,'Cable Upright Row (stirrup attachments)','Grasp handles of both stirrups with overhand grip. Stand close to pulley.','Pull handles to front of shoulders with elbows leading. Allow wrists to flex as stirrups are lifted. Lower and repeat.','upload/exercise-picture/CBUprightRowStirrups.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(99,'Dumbbell Lateral Raise','Grasp dumbbells in front of thighs with elbows slightly bent. Bend over slightly with hips and knees bent slightly.','Raise upper arms to sides until elbows are shoulder height. Maintain elbows\' height above or equal to wrists. Lower and repeat.','upload/exercise-picture/DBLateralRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(100,'Dumbbell Lying Lateral Raise','Lie on side with legs separated for support. Grasp dumbbell in front of thigh.','Raise dumbbell from floor until arm is vertical. Maintain fixed elbow position (10° to 30° angle) throughout exercise. Lower and repeat.','upload/exercise-picture/DBLyingLateralRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(101,'Dumbbell One Arm Seated Lateral Raise','Sit on stool or end of bench with legs together. Position dumbbell to side with elbow slightly bent. Angle torso slightly forward and place free hand on end of thigh for support.','Raise upper arm to side until elbow is shoulder height. Maintain elbow\'s height above or equal to wrist. Lower and repeat. Continue with opposite arm.','upload/exercise-picture/DBOneArmSeatedLateralRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(102,'Lever Barbell Upright Row (plate loaded)','Stand behind bar mid-thigh height, facing away from from fulcrum. Grasp bar with shoulder width or slightly narrower overhand grip. Disengage bar by rotating bar back and stand upright.','Pull bar to neck with elbows leading. Allow wrists to flex as bar rises. Lower and repeat.','upload/exercise-picture/LVSMUprightRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(103,'Dumbbell Raise','Stand and grasp dumbbells with arms to side, palms facing sides of thighs.','Pull dumbbells up to sides of ribs with elbows out to sides. Lower and repeat.','upload/exercise-picture/DBRaise8.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(104,'Dumbbell Upright Row','Grasp dumbbells and stand with palms facing front of thighs.','Pull dumbbells to front of shoulder with elbows leading out to sides. Allow wrists to flex as dumbbells rise upward. Lower and repeat.','upload/exercise-picture/DBUprightRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(105,'Dumbbell One Arm Upright Row','Grasp dumbbells with palms facing front of thighs. Position other hand for support.','Pull dumbbell to front of shoulder with elbow leading. Allow wrist to flex as dumbbell rises upward. Lower and repeat. Continue with opposite arm.','upload/exercise-picture/DBOneArmUprightRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(106,'Lever Lateral Raise','Sit in machine. Situate bent arms between padded lever and sides of body. Grasp handles if available.','Raise arms to sides until upper arms are horizontal. Return and repeat.','upload/exercise-picture/LVLateralRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(107,'Lever Lateral Raise (plate loaded)','Sit in machine. Situate bent arms between padded lever and sides of body.','Raise arms to sides until upper arms are horizontal. Return and repeat.','upload/exercise-picture/LVLateralRaiseH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(108,'Dumbbell Seated Upright Row','Sit on end of bench with legs far apart. Grasp dumbbell between legs with arm vertical under shoulder. Position torso slightly forward with hand on knee for support.','Pull dumbbell to front of shoulder with elbow leading out to side. Allow wrists to flex as dumbbell rises upward. Lower and repeat.','upload/exercise-picture/DBOneArmSeatedUprightRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(109,'Lever Extended Arm Lateral Raise','Stand facing machine and grasp lever handles to each side with elbows straight or slightly bent.','Raise lever handles to sides until elbows are shoulder height. Maintain elbows\' height above or equal to wrists. Lower and repeat.','upload/exercise-picture/LVExtendedArmLateralRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(110,'Lever Extended Arm Kneeling Lateral Raise','Kneel on shin pads facing machine and grasp lever handles to each side with elbows straight or slightly bent.','Raise lever handles to sides until elbows are shoulder height. Maintain elbows\' height above or equal to wrists. Lower and repeat.','upload/exercise-picture/LVExtendedArmKneelingLateralRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(112,'Side Deltoid Stretch','Position arm across chest. Place opposite hand on elbow.','Push elbow toward chest. Hold stretch. Repeat with opposite arm.','upload/exercise-picture/217101e410d8d1d25cfc6478d0115ad1.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(113,'Fixed Bar Side Deltoid Stretch','Face stationary bar. Grasp stationary bar with one hand approximately chest height. Rotate body so upper arm is positioned across chest.','Turn body into upper arm. Hold stretch. Repeat with opposite arm.','upload/exercise-picture/d9fca31f579fd29d33241749ea84f365.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(114,'Suspended Y Lateral Raise','Grasp suspension handles and momentarily step back until arms are extended forward and straight. While keeping arms straight and shoulders back, step forward so body reclines back behind suspension handles. Position body and legs straight at desired angle hanging from handles with arms straight and palms angled inward.','Raise arms upward and outward in shape of a Y while keeping arms straight. Return and lower body back in opposite motion until arms are extended straight forward in original position. Repeat.','upload/exercise-picture/STYShoulderRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(115,'Smith Wide Grip Upright Row','Stand behind bar mid-thigh height. Grasp bar with wide grip\noverhand grip. Disengage bar by rotating bar back and stand upright.','Pull bar to neck with elbows leading. Allow wrists to flex\nas bar rises. Lower and repeat.','upload/exercise-picture/SMWideGripUprightRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(116,'Smith Upright Row','Stand behind bar mid-thigh height. Grasp bar with shoulder width or slightly narrower overhand grip. Disengage bar by rotating bar back and stand upright.','Pull bar to neck with elbows leading. Allow wrists to flex as bar rises. Lower and repeat.','upload/exercise-picture/SMUprightRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(117,'Barbell Lying Rear Delt Row','Lie chest down on elevated bench. Grasp bar with wide overhand grip.','Keeping upper arm perpendicular to torso, pull barbell up toward upper chest until upper arms are just beyond parallel to floor. Return and repeat.','upload/exercise-picture/BBLyingRearDeltRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(118,'Cable Reverse Fly','Stand facing twin pulley cables positioned close together and approximately shoulder height. Grasp stirrup cable attachment in each hand. Step back away from machine so cable is taut. Stand with feet staggered. Point elbows outward with arms straight or slightly bent.','Pull stirrups out to sides, maintaining stiff elbow position throughout exercise. Return to original position and repeat.','upload/exercise-picture/CBStandingRearDeltFly.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(119,'Cable Standing Rear Delt Row (with rope)','Stand facing rope attachment on high pulley cable. Grasp\neach end of rope just above enlarged ends. Step back with one\nfoot so arms and shoulders are positioned straight forward with\ncable taut. Point elbows outward.','Pull rope to upper chest or neck, keeping elbows at shoulder\nheight until elbows travel slightly behind back. Keep upper arms\nperpendicular to trunk. Return until arms are extended forward.\nRepeat.','upload/exercise-picture/CBStandingRearDeltRowRope.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(120,'Cable Supine Reverse Fly','With bench between two high pulleys to each side, grasp left stirrup with right hand and right stirrup with left hand. Lie on bench with pulleys to each side of shoulders. Arms should be crossed above upper chest with elbows slightly bent.','Pull upper arms down to sides until elbows are shoulder height. Maintain upper arms perpendicular to torso and fixed elbow position (just slightly bent) as arms are pulled down to sides. Return arms to original position and repeat.','upload/exercise-picture/CBSupineRearLateralPull_.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(121,'Barbell Rear Delt Raise','Stand holding barbell behind thighs or hips with arms straight down to sides.','Pull barbell behind hips and low back up as far as possible allowing elbows to travel up behind body to each side. Flex wrists near top of movement so bar can be raised higher. Lower until arms and wrists are straight. Repeat.','upload/exercise-picture/BBRearDeltRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(122,'Cable Seated Reverse Fly','Sit on seat facing twin pulley cables positioned approximately shoulder height. Grasp stirrup cable attachment in each hand. Straighten lower back upright so cable is taut. Point elbows outward with arms slightly bent.','Keeping elbows pointed high, pull stirrups out to sides, maintaining slightly bent elbow position throughout exercise. Return to original position and repeat.','upload/exercise-picture/CBSeatedRearDeltPull.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(123,'Cable Rear Delt Row','Sit slightly forward on bench or platform in order to grasp cable bar attachment. With elbow width overhand grip, straighten torso upright and slide hips back until knees are only\n\n\nslightly bent.','Pull cable attachment toward upper chest, just below neck, with elbows up out to sides until elbows travel slightly behind back. Keep upper arms horizontal, perpendicular to trunk. Return until arms are extended and shoulders are stretched forward. Repeat.','upload/exercise-picture/CBRearDeltRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(124,'Barbell Rear Delt Row','Bend knees slightly and bend over bar with back straight, approximately horizontal. Grasp bar with wide overhand grip.','Keeping upper arm perpendicular to torso, pull barbell up toward upper chest until upper arms are just beyond horizontal. Return and repeat.','upload/exercise-picture/BBRearDeltRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(125,'Cable One Arm Reverse Fly','Stand with side to shoulder height cable pulley. Grasp stirrup cable attachment with hand furthest from pulley. Position arm across neck with elbow bent 30° to 45° outward.','Keeping elbows pointed high, pull stirrup out to side, maintaining fixed elbow position throughout exercise. Return to original position and repeat. Repeat with other arm.','upload/exercise-picture/CBRearDeltPull.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(126,'Cable Rear Delt Row (stirrups)','On dual pulley seated row machine, sit slightly forward on seat or bench in order to grasp both cable attachments. Place feet on vertical platform. Position torso upright and slide hips back until knees are only slightly bent and cable taut. Point elbows outward.','Pull stirrups out to sides, keeping elbows at shoulder height until elbows travel slightly behind back. Allow wrists to follow elbows. Keep upper arms horizontal, perpendicular to trunk. Return until arms are extended and shoulders are stretched forward. Repeat.','upload/exercise-picture/CBRearDeltRowStirrups.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(127,'Cable One Arm Rear Delt Row','Sit slightly forward on bench or platform in order to grasp stirrup cable attachment with one hand. Straighten torso upright and slide hips back until knees are only slightly bent. Point elbow out to side.','Pull stirrup out to side, elbows up shoulder height until elbows travel slightly behind back. Allow wrist to follow elbow. Keep upper arm horizontal, perpendicular to trunk. Return until arm is extended and shoulder is stretched forward. Repeat.','upload/exercise-picture/CBOneArmRearDeltRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(128,'Cable Seated Rear Delt Row (stirrups)','Sit on seat facing twin pulley cables positioned shoulder height. Grasp stirrup cable attachment in each hand. Straighten lower back upright so arms and shoulders are positioned straight forward with cable taut. Point elbows outward.','Pull stirrups out to sides, keeping elbows at shoulder height until elbows travel slightly behind back. Allow wrists to follow elbows. Keep upper arms horizontal, perpendicular to trunk. Return until arms are extended and shoulders are stretched forward. Repeat.','upload/exercise-picture/CBSeatedRearDeltRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(129,'Cable Seated Rear Lateral Raise','Sit at edge of bench with feet of floor ahead of knees. Rest torso on thighs. Reach under legs and grasp stirrup cable attachments, right hand holding left stirrup, left hand holding right stirrup.','Pull stirrups out to sides until elbows are shoulder height. Maintain upper arms perpendicular to torso and fixed elbow position (10° to 30° angle) throughout exercise. Lower until arms contact sides of legs. Repeat.','upload/exercise-picture/CBSeatedRearLateralRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(130,'Cable One Arm Rear Lateral Raise','Stand with side to low pulley. Grasp stirrup attachment with hand furthest from pulley. Bend knees slightly and bend over with resting arm to side of low pulley.','Raise arm to side until elbow is shoulder height. Maintain upper arm perpendicular to torso and fixed elbow position (10° to 30° angle) throughout exercise. Lower and repeat. Repeat with other arm.','upload/exercise-picture/CBRearLateralRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(131,'Cable Standing Rear Delt Row (stirrups)','Stand facing twin pulley cables positioned shoulder height. Grasp stirrup cable attachment in each hand. Step back with one foot so arms and shoulders are positioned straight forward with cable taut. Point elbows outward.','Pull stirrups out to sides, keeping elbows at shoulder height until elbows travel slightly behind back. Allow wrists to follow elbows. Keep upper arms horizontal, perpendicular to trunk. Return until arms are extended and shoulders are stretched forward. Repeat.','upload/exercise-picture/CBStandingRearDeltRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(132,'Dumbbell Lying Rear Lateral Raise','Lie chest down on elevated bench. Grasp dumbbells below to each side.','Raise upper arms to sides until elbows are shoulder height. Maintain upper arms perpendicular to torso and fixed elbow position (10° to 30° angle) throughout exercise. Maintain height of elbows above wrists by raising \"pinkie\" side up. Lower and repeat.','upload/exercise-picture/DBLyingRearLateralRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(133,'Dumbbell Lying Rear Delt Row','Lie chest down on elevated bench. Grasp dumbbells below.','Keeping upper arm perpendicular to torso and dumbbells just below elbows, pull dumbbells up until elbows are just above shoulders. Return and repeat.','upload/exercise-picture/DBLyingRearDeltRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(134,'Cable Rear Lateral Raise','Stand with cable columns to each side. Grasp left stirrup with right hand and right stirrup with left hand. Bend knees and bend over at hips, so torso is approximately horizontal with back straight. Point elbows outward with arms slightly bent.','Raise upper arms to sides until elbows are shoulder height. Maintain upper arms perpendicular to torso and slight bend in elbows as arms are raised to sides. Lower and repeat.','upload/exercise-picture/CableBentOverLateralRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(135,'Cable Standing Cross Row','Stand between two shoulder-high cable pulleys (adjustable cross-over machine). Grasp right stirrup with left hand and left stirrup with right hand. Step back until cables are angled back 30° to 45°. Position both elbows at height of shoulders, one over other.','Pull both cable attachments by moving elbows back to sides. Keep upper arms horizontal, perpendicular to trunk. Return and repeat.','upload/exercise-picture/CBStandingCrossRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(136,'Cable One Arm Standing Cross Row','Facing shoulder height cable pulley, grasp stirrup cable attachment with one hand, palm orientated down. Step back and turn body inward about 30° to 45° to face extended arm about. Stand back just enough to allow arm to be fully extended with weight raised up slightly.','Pull stirrup back with elbow up at shoulder height until elbow travels just behind shoulder. Keep upper arm horizontal, perpendicular to trunk. Return until arm is fully extended. Repeat.','upload/exercise-picture/CBOneArmCrossRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(137,'Dumbbell Side Lying Rear Delt Raise','Lie on side with legs separated for support. Grasp dumbbell in front of chest, palm facing down, arm extended forward with slight bend.','Raise dumbbell from floor until it travels above shoulder. Return dumbbell to floor at original position. Repeat.','upload/exercise-picture/DBLyingRearDeltRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(138,'Dumbbell Rear Lateral Raise','Grasp dumbbells to each side. Bend knees and bend over through hips with back flat, close to horizontal. Position elbows with slight bend and palms facing together.','Raise upper arms to sides until elbows are shoulder height. Maintain upper arms perpendicular to torso and fixed elbow position (10° to 30° angle) throughout exercise. Maintain height of elbows above wrists by raising \"pinkie finger\" side up. Lower and repeat.','upload/exercise-picture/DBRearLateralRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(139,'Dumbbell Lying One Arm Rear Lateral Raise','With dumbbell in one hand, lie chest down on elevated bench. Position palm forward (thumb up) with elbow straight or slightly bent.','Raise upper arm to side until elbow is shoulder height. Maintain upper arms perpendicular to torso with elbow straight throughout exercise. Maintain palm forward position. Lower and repeat.','upload/exercise-picture/DBOneArmLyingLateralRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(140,'Dumbbell Rear Delt Row','Kneel over side of bench with arm and leg to side. Grasp dumbbell.','Pull dumbbell up out to side with upper arm perpendicular to trunk until upper arm is just beyond horizontal. Lower and repeat.','upload/exercise-picture/DBRearDeltRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(141,'Lever Incline Rear Delt Row (plate loaded)','Lie chest low on inclined platform and grasp forward lever handles with wide overhand grip.','Pull lever with elbows\n\nforward\n\nout to sides until upper arms are just beyond parallel, keeping upper arm perpendicular to torso. Return and repeat.','upload/exercise-picture/LVInclineRearDeltRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(142,'Lever Lying Rear Lateral Raise (plate loaded)','Lie on machine with chest against padding. Position arms between padded lever arms with elbows below shoulders.','Pull arms up until elbows are beyond back. Return and repeat.','upload/exercise-picture/LVLyingRearDeltRaiseH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(143,'Lever Seated Rear Delt Row (plate loaded)','Place seat at low position. Sit on seat with chest against pad and grasp upper handles.','Pull lever with elbows up out to sides until upper arms are just beyond parallel, keeping upper arm horizontal, perpendicular to torso. Return and repeat.','upload/exercise-picture/LVRearDeltRowH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(144,'Dumbbell Seated Rear Lateral Raise','Sit on edge of bench with feet placed beyond knees. Bend over and rest torso on thighs. Grasp dumbbells with each hand under legs. Position elbows with slight bend with palms facing together behind ankles (as shown) or just to sides of ankles.','Raise upper arms to sides until elbows are shoulder height. Maintain upper arms perpendicular to torso and fixed elbow position (10° to 30° angle) throughout exercise. Maintain elbows height above wrists by raising \"pinkie finger\" side up. Lower and repeat.','upload/exercise-picture/DBSeatedRearLateralRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(145,'Lever Rear Delt Raise (plate loaded)','Stand between lever handles facing away from machine. Squat down and grasp lever handles to each side. Stand up with arms straight to sides.','Pull lever up as far as possible allowing elbows to travel up behind body to each side. Lower until arms are straight and repeat.','upload/exercise-picture/LVRearRaiseH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(147,'Lever Seated Rear Lateral Raise (plate loaded)','Sit on seat with feet placed on platform ahead of knees. Rest torso on thighs. Reach under legs and grasp lever handles on each side.','Pull lever handles out to sides until elbows are shoulder height. Maintain upper arms perpendicular to torso and fixed elbow position (10° to 30° angle) throughout exercise. Lower and repeat.','upload/exercise-picture/LVSeatedRearLateralRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(148,'Lever Rear Lateral Raise (on extended arm kneeling lateral raise machine)','Stand on platform facing lateral raise machine. Bend knees and bend over at hips with back flat close to horizontal. With arms straight or slightly bent, grasp lever handles with each hand.','Maintaining torso position, raise handles to sides until upper arm is shoulder height. Lower and repeat.','upload/exercise-picture/LVBentOverExtArmLateralRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(149,'Lever Seated Rear Delt Row','Place seat at low position. Sit on seat with chest against pad and grasp upper handles.','Pull lever with elbows up out to sides until upper arms are just beyond parallel, keeping upper arm horizontal, perpendicular to torso. Return and repeat.','upload/exercise-picture/LVSeatedRearDeltRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(150,'Lever Seated Reverse Fly (parallel grip)','Sit on machine with chest against pad. Grasp parallel handles with thumbs up at shoulder height. Slightly bend elbows and internally rotate shoulders so elbows are also at height of shoulders.','Keeping elbows pointed high, pull handles apart and to rear until elbows are just behind back. Return and repeat.','upload/exercise-picture/LVSeatedReverseFlyParallelGrip.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(151,'Lever Rear Lateral Raise (on lateral raise machine)','Stand on platform facing lateral raise machine. Bend knees and bend over at hips with back flat close to horizontal. With elbows bent under shoulders, position back of upper arms against arm pads.','Maintaining torso position, raise upper arms to sides until elbows are shoulder height. Lower and repeat.','upload/exercise-picture/LVRearLateralRaiseOnLatRsMch.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(152,'Lever T-Bar Rear Delt Row (plate loaded)','Straddle lever bar facing handles. Bend knees slightly and bend over handles with back straight. Grasp wide grip handles with overhand grip. With arms extended, position torso just high enough to allow weight to make contact with floor.','With elbows out to sides, pull bar up toward upper chest until elbows are same height as shoulders or just beyond, keeping upper arm perpendicular to torso. Return and repeat.','upload/exercise-picture/LVTBarRearDeltRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(153,'Lever Lying Rear Lateral Raise','Lie on machine with chest against padding. Position arms between padded lever arms with elbows below shoulders.','Pull arms up until elbows are beyond back. Lower and repeat.','upload/exercise-picture/LVLyingRearLateralRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(154,'Lever Seated Reverse Fly (on pec deck)','Sit on machine with chest against vertical pad. Position arms against padded lever arms at height of shoulders.','Pull arms back until elbows are beyond back. Return and repeat.','upload/exercise-picture/LVSeatedRearDeltFlyOnPecDeck.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(155,'Lever Seated Reverse Fly (overhand grip)','Sit on machine with chest against pad. Grasp horizontal handles with overhand grip at shoulder height. Internally rotate shoulders so elbows are also at height of shoulders.','Keeping elbows pointed high, pull handles apart and to rear until elbows are just behind back Return and repeat.','upload/exercise-picture/LVRearDeltFlyOverhandGrip.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(156,'Lever Seated Reverse Fly (pronated parallel grip)','Sit in machine with chest against pad. Grasp parallel handles from inside with thumbs down at shoulder height.','Keeping elbows pointed high, pull handles apart and to rear until elbows are just behind back. Return and repeat.','upload/exercise-picture/LVSeatedRearDeltFlyInsideParallelGrip.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(157,'Lever Seated Reverse Fly (gripless)','Sit on machine with back against vertical pad and roller pads in front of body. Place feet forward on foot bars. Cross both arms in front of body situated between roller pads. Position arms one on top of another, shoulder height.','Pull arms apart and back until elbows are slightly beyond back. Return to starting position and repeat.','upload/exercise-picture/LVSeatedRearDeltFly.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(158,'Rear Delt Inverted Row (high bar)','Stand facing lower to upper chest height horizontal bar. Step toward bar so chest makes contact. Grasp bar with wide overhand grip. Turn elbows outward to sides. Position feet forward on floor so body is reclined back with legs, hips and spine straight. Position forearms perpendicular to body, orientated forward. Also, position upper arms perpendicular to body, orientated to each side.','Lower body back until arms are extended straight while keeping body straight and elbows high (upper arm perpendicular to torso). Pull body toward bar until upper arms are just beyond parallel to one another. Return and repeat.','upload/exercise-picture/BWRearDeltInvertedRowHigh.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(159,'Rear Delt Inverted Row','Stand facing waist to lower chest height horizontal bar. Grasp bar with wide overhand grip. Turn elbows outward to sides. Walk forward under bar while pulling upper chest close to bar. With heels on floor, position body at angle under bar with legs, hips and spine straight. Position forearms perpendicular to body, orientated forward. Also, position upper arms perpendicular to body, orientated to each side.','Lower body downward until arms are extended straight while keeping body straight and elbows high (upper arm perpendicular to torso). Pull body toward bar until upper arms are just beyond parallel to one another. Return and repeat.','upload/exercise-picture/BWRearDeltInvertedRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(160,'Smith Rear Delt Row','Stand near low smith bar. Bend knees and bend over bar with back straight. Grasp bar with wide\n\n\noverhand grip. Disengage bar by rotating bar back.','Keeping upper arm perpendicular to torso, pull bar up toward upper chest until upper arms are just beyond parallel to floor. Return and repeat.','upload/exercise-picture/SMBentoverRearDeltRowSideView.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(162,'Suspended Reverse Fly','Grasp suspension handles and momentarily step back until arms are extended forward and straight. While keeping arms straight and shoulders back, step forward so body reclines back behind suspension handles. Position body and legs straight at desired angle hanging from handles with arms straight. Internally rotate shoulders so elbows are positioned directly outwards with arms straight or slightly bent. Shoulder should be positioned approximately 90° relative to torso position.','Pull handles out to sides while keeping stiff elbow position and maintaining shoulder at 90° plane to torso throughout exercise. Raise up until upper arms are in-line to one another. Return to original position in same plane and repeat.','upload/exercise-picture/STReverseFlyStaggered.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(163,'Suspended Rear Delt Row','Grasp suspension handles and momentarily step back until arms are extended forward and straight. While keeping arms straight and shoulders back, step forward so body reclines back behind suspension handles.\nPosition body and legs straight at desired angle hanging from handles with arms straight. Internally rotate shoulders so elbows are positioned directly outwards.','Pull body up while keeping elbows pointed directly out to each side and body and legs straight. Pull until elbows are directly lateral to each side without allowing elbows to drop. Return until arms are extended straight and shoulders are stretched forward, maintaining high elbow position. Repeat.','upload/exercise-picture/STRearDeltRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(164,'Rear Deltoid Stretch','Position arm across neck. Place opposite hand on elbow.','Push elbow toward neck. Hold stretch. Repeat with opposite arm.','upload/exercise-picture/e804bc162a98017991aec45287ea60f3.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(165,'Fixed Bar Rear Deltoid Stretch','Face stationary bar. Grasp stationary bar with one hand approximately face height. Rotate body so upper arm is positioned across neck.','Turn body into upper arm. Hold stretch. Repeat with opposite arm.','upload/exercise-picture/277fbfe41e0114de998ccabb0af995e7.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(167,'Dumbbell Seated Front Lateral Raise','Sit on stool or end of bench with dumbbell. Position dumbbell down to side with arm straight. Turn pinkie finger side outward.','Raise arms to side, slightly in front until shoulder height or slightly higher. Lower and repeat. Continue with opposite arm.','upload/exercise-picture/DBOneArmSeatedFrontLateralRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(168,'Dumbbell Front Lateral Raise','Grasp dumbbell and position in front of thigh with arm straight. Turn pinkie finger side outward.','Raise arms to side, slightly to front until shoulder height or slightly higher. Lower and repeat. Continue with opposite arm.','upload/exercise-picture/DBFrontLateralRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(169,'Dumbbell Full Can Lateral Raise','Grasp dumbbells with each hand with palms facing forward.','Raise arms to side with thumb side up. Lower and repeat.','upload/exercise-picture/DBFullCanLateralRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(170,'Cable Front Lateral Raise','Grasp dumbbell cable attachment. Stand facing side with resting arm toward low pulley. Grasp ballet bar if available for support. Internally rotate shoulders so elbows point out to sides.','With elbow straight or slightly bent, raise upper arm away from low pulley to side, slightly to front (30°) until upper arm is shoulder height. Lower and repeat. Continue with opposite arm.','upload/exercise-picture/CBFrontLateralRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(171,'Cable Seated Front Lateral Raise','Sit on seat above twin cable pulleys. Grasp stirrups on each side. Sit upright with arms nearly straight down to each side. Internally rotate shoulders so elbows point out to sides.','With elbows straight or slightly bent, raise upper arm away from low pulley to side, slightly to front (30° to 45°) until upper arm is shoulder height or slightly higher. Lower and repeat.','upload/exercise-picture/CBSeatedFrontLateralRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(172,'Barbell Close Grip Bench Press','Lie on bench and grasp barbell from rack with shoulder width grip.','Lower weight to chest with elbows close to body. Push barbell back up until arms are straight. Repeat.','upload/exercise-picture/BBCloseGripBenchPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(173,'Machine-assisted Triceps Dip','Mount shoulder width dip bar, arms straight with shoulders above hands. Step down onto assistance lever. Keep hips and knees straight.','Lower body until slight stretch is felt in shoulders. Push body up until arms are straight. Repeat.','upload/exercise-picture/ASTricepsDip.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(174,'Barbell JM Bench Press','Lie on bench with back flat on bench and grasp barbell from rack with shoulder width or slightly narrower grip.','Lower in straight line toward neck while keeping elbows relatively high and bending them out to sides, approximately 45° from midline of body. Flex wrists slightly as bar is lowered as to keep weight of bar on base of palms. Pause when forearms mak\n\n\ne solid contact with biceps. Push barbell back up until arms are straight. Repeat.','upload/exercise-picture/BBJMPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(175,'Machine-assisted Triceps Dip (kneeling)','Mount shoulder width dip bar, arms straight with shoulders above hands. Kneel on padded platform, lowering it down slightly so hips are slightly bent.','Lower body until slight stretch is felt in shoulders. Push body up until arms are straight. Repeat.','upload/exercise-picture/ASTricepsDipKneeling.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(176,'Barbell Lying Triceps Extension','Lie on bench with narrow overhand grip on barbell. Position barbell over forehead with arms extended.','Lower bar by bending elbows. As bar nears head, move elbows slightly back just enough to allow bar to clear around curvature of head. Extend arms. As bar clears head, reposition elbows to their former position until arms are fully extended. Repeat.','upload/exercise-picture/BBLyingTricepsExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(177,'Barbell Close Grip Incline Bench Press','Lie on bench with bar above chest. Grasp bar from rack with shoulder width or slightly narrower grip. Disengage bar by rotating bar back.','Lower weight to chest with elbows close to body. Push barbell up until arms are straight. Repeat.','upload/exercise-picture/BBCloseGripInclineBenchPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(178,'Barbell Lying Triceps Extension \"Skull Crusher\"','Lie on bench with narrow overhand grip on barbell. Position barbell over shoulders with arms extended.','Lower bar to forehead by bending elbows. Extend arms and repeat.','upload/exercise-picture/BBLyingTricepsExtensionSC.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(179,'Barbell Incline Triceps Extension','Lie on slightly incline bench with narrow overhand grip on barbell. Position barbell over shoulders with arms extended.','Lower bar by bending elbows. As bar nears head, move elbows slightly back just enough to allow bar to clear around curvature of head. Extend arms. As bar clears head, reposition elbows to their former position until arms are fully extended. Repeat.','upload/exercise-picture/BBInclineTricepsExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(180,'Barbell Triceps Extension','Position barbell overhead with narrow overhand grip.','Lower forearm behind upper arm with elbows remaining overhead. Extend forearm overhead. Lower and repeat.','upload/exercise-picture/BBSeatedTricepsExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(181,'Barbell Decline Triceps Extension','Lie on decline bench with narrow overhand grip on barbell. Position barbell over shoulders with arms extended.','Lower bar by bending elbows. As bar nears head, move elbows slightly back just enough to allow bar to clear around curvature of head. Extend arms. As bar clears head, reposition elbows to its former position until arms are fully extended. Repeat.','upload/exercise-picture/BBDeclineTricepsExt.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(182,'Cable Bent-over Triceps Extension','Grasp cable bar from medium high pulley with narrow or shoulder width overhand grip. Turn body away from pulley apparatus and position turned cable bar behind neck. Bend over downward with cable bar positioned behind neck, gripped at each side. Lunge forward with one leg. Allow elbows to be pulled back under cable resistance.','Extend forearms forward until elbows are straight. Allow cable bar to return back over neck. Repeat.','upload/exercise-picture/CBOverheadTricepsExt.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(183,'Cable Forward Triceps Extension','Grasp stirrup from medium high pulley. Turn body away from pulley apparatus and position stirrup over shoulder with palms down. Step forward with one foot so cable is taut. Position elbow forward about shoulder height.','Push stirrup forward by extending forearm until elbow is straight. Allow stirrup to return back over shoulder. Repeat and repeat. Continue with opposite arm.','upload/exercise-picture/CBOneArmForwardTricepsExt.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(184,'Cable Incline Triceps Extension','Grasp cable bar from behind with narrow overhand grip. Position elbows overhead.','Extend forearm overhead until elbows are straight. Lower until forearms are against upper arms. Repeat.','upload/exercise-picture/CBInclineTricepsExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(185,'Cable Bent-over Triceps Extension (with rope attachment)','Grasp rope attachment from medium high pulley. Turn body away from pulley apparatus and position turned rope attachment behind neck. Bend over downward with rope attachment positioned behind neck gripped at each side. Lunge forward with one leg. Allow elbows to be pulled back under cable resistance.','Extend forearms forward until elbows are straight. Allow cable bar to return back over neck. Repeat.','upload/exercise-picture/CBOverheadTricepsExtRope.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(186,'Cable Lying Triceps Extension','Lie on bench and grasp bar with narrow overhand grip. With arms extended, position bar over forehead.','Lower bar by bending elbow. As bar nears head, move elbows slightly back just enough to allow bar to clear around curvature of head. Extend arm. As bar clears head, reposition elbows to its former position until arm is fully extended. Repeat.','upload/exercise-picture/CBLyingTricepsExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(187,'Cable Kneeling Triceps Extension','Grasp cable bar from middle pulley with narrow or shoulder width overhand grip. Turn body away from pulley apparatus with cable bar above head. Kneel before bench, bend over and place elbows on edge of bench. Maintain upper arms parallel with shoulders as low as possible.','Extend forearms over head until elbow are fully extended. Return and repeat.','upload/exercise-picture/CBKneelingTricepsExt.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(188,'Cable Decline Triceps Extension','Position legs under lower leg pad and lie back on bench. Grasp bar with narrow overhand grip. Position bar near forehead or top of head.','Extend elbows to raise bar attachment until arms are straight. As arms extended, position them vertically. Lower bar by bending elbows. As bar nears head, reposition elbows back just enough to allow bar to clear around curvature of head. Repeat.','upload/exercise-picture/CBDeclineTricepsExt.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(189,'Cable Pushdown (forward leaning)','Face high pulley and grasp revolving bar cable attachment with overhand grip. Position one leg back and bend forward leg with body leaning forward. Position revolving bar down in front of face with forearms nearing vertical.','Push cable bar downward by extending arms until elbows are straight. Return to front of face until forearms are nearly vertical and close to upper arm. Repeat.','upload/exercise-picture/CBForwardLeaningPushdown.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(190,'Cable Bar Pushdown','Position adjustable pulleys slightly above head. Face cable bar and grasp with overhand narrow grip. Position elbows to side.','Extend arms down. Return until forearm is close to upper arm. Repeat.','upload/exercise-picture/CBBarPushdown.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(191,'Cable Pushdown','Face high pulley and grasp cable attachment with narrow overhand grip. Position elbows to side.','Extend arms down. Return until forearm is close to upper arm. Repeat.','upload/exercise-picture/CBPushdown.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(192,'Cable Alternating Seated Pushdown','Sit on seat or bench in font of two close high pulleys. Grasp stirrup with each hand (over or underhand grip). Position elbows to side.','Push one stirrup down by extending elbow until arm is straight. Return until forearm returns to original positon, keeping elbow close to side. Repeat with opposite arm and alternate.','upload/exercise-picture/CBAlternatingSeatedPushdown.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(193,'Cable Pushdown (with V-bar)','Face high pulley and grasp V-bar attachment with narrow overhand grip. Position elbows to side.','Extend arms down. Return until forearm is close to upper arm. Repeat.','upload/exercise-picture/CBPushdownV.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(194,'Cable Side Triceps Extension','Grasp stirrup from medium high pulley. Turn body so pulley is to side of free arm while lifting stirrup over head. Step forward, just slightly to allow stirrup to be placed behind head, just over shoulder. Place elbow just slightly higher than shoulder height and position palm down.','Push stirrup out to side by extending forearm until elbow is straight. Allow stirrup to return back over shoulder. Repeat and repeat. Continue with opposite arm.','upload/exercise-picture/CBOneArmSideTricepsExt.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(195,'Cable Pushdown (with rope attachment)','Face high pulley and grasp rope attachment with clinched hands side by side (palms in). Position elbows to side.','Extend arms down. Turn palms down at bottom. Return until forearm is close to upper arm and hands are in original position. Repeat.','upload/exercise-picture/CBPushdownRope.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(196,'Cable Pushdown (with back support)','Place back against vertical back support. Grasp cable attachment from high pulley with narrow overhand grip. Position elbows to side.','Extend arms down. Return until forearm is close to upper arm. Repeat.','upload/exercise-picture/CBStandingTricepsExtensionBackSupport.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(197,'Cable One Arm Pushdown','Grasp dumbbell cable attachment with underhand grip. Position elbow to side.','Extend arm down. Return until forearm is close to upper arm. Repeat. Continue with opposite arm.','upload/exercise-picture/CBOneArmPushdown.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(198,'Cable Incline Pushdown','Lie on incline bench facing away from high pulley. Grasp cable attachment overhead with overhand narrow grip. Position elbow to sides, slightly up.','Extend arms with elbows stationary. Return until forearm is close to upper arm. Repeat.','upload/exercise-picture/CBInclinePushdown.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(199,'Cable One Arm Triceps Extension (supinated grip)','Grasp stirrup cable attachment from behind. Place hand with cable behind neck; palm toward neck and elbow positioned upward.','Extend arm upward. Return and repeat. Continue with opposite arm.','upload/exercise-picture/CBSeatedTricepsExtSupGrip.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(200,'Cable Triceps Dip','Step between shoulder width dip bars with dip belt around waist. Kneel as close to low pulley and attach cable to dip belt. Stand up and mount dip bar, arms straight with shoulders above hands. Keep hips straight.','Lower body by bending arms until slight stretch is felt in shoulders. Push body up until arms are straight. Repeat.','upload/exercise-picture/CBTricepsDip.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(201,'Cable Triceps Extension','Stand or sit on bench or seat with back support just below shoulders. Position cable bar behind neck or shoulders with narrow overhand grip. Position elbows over head.','Extend forearm overhead until arms are straight. Lower until forearms are against upper arms. Repeat.','upload/exercise-picture/CBSeatedTricepsExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(202,'Cable One Arm Triceps Extension (pronated grip)','Grasp stirrup cable attachment from behind. Place hand with cable behind neck; palm toward neck and elbow positioned upward.','Extend arm upward. Return and repeat. Continue with opposite arm.','upload/exercise-picture/CBOneArmTricepsExtensionPronated.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(203,'Dumbbell One Arm Triceps Extension','Sit on seat with back support just below shoulder height. Position dumbbell over head with arm straight up or slightly back.','Lower dumbbell behind neck or shoulder while maintaining upper arm\'s vertical position throughout exercise. Extend arm until straight. Return and repeat. Continue with opposite arm.','upload/exercise-picture/DBSeatedTricepsExtBackSupport.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(204,'Dumbbell Lying Triceps Extension','Lie on bench and position dumbbells over head with arms extended.','Lower dumbbells by bending elbow until they are to sides of head. Extend arm. Repeat.','upload/exercise-picture/DBLyingTricepsExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(205,'Dumbbell Kickback','Kneel over bench with arm supporting body. Grasp dumbbell. Position upper arm parallel to floor.','Extend arm until it is straight. Return and repeat. Continue with opposite arm.','upload/exercise-picture/DBKickback.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(206,'Dumbbell Decline Triceps Extension','Lie on decline bench and position dumbbells over shoulders with arms extended.','Lower dumbbells by bending elbow until they are to sides of head; dumbbells touch shoulder. Extend arm. Repeat.','upload/exercise-picture/DBDeclineTricepsExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(207,'Cable Triceps Extension (with rope)','From low pulley cable, grasp ends of rope attachment just\nunder enlarged ends. Raise one arm over head while turning body\naway from pulley. Face away from pulley with feet staggered.\nPosition ends of ropes behind head or neck and elbows upward\nover head.','Raise ends of rope overhead by extending forearms until arms\nare straight. Lower rope attachment until forearms are against\nupper arms. Repeat.','upload/exercise-picture/CBTricepsExtensionRope.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(208,'Dumbbell Incline Triceps Extension','Lie supine on incline bench with back of head on upper corner of bench. Position dumbbells over head with arms extended.','Lower dumbbells by bending elbow until they are to sides of head. Extend arm and repeat.','upload/exercise-picture/DBInclineTricepsExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(209,'Dumbbell Triceps Extension','Position one dumbbell over head with both hands under inner plate (heart shaped grip).','With elbows over head, lower forearm behind upper arm by flexing elbows. Flex wrists at bottom to avoid hitting dumbbell on back of neck. Raise dumbbell over head by extending elbows while hyperextending wrists. Return and repeat.','upload/exercise-picture/DBTricepsExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(210,'Dumbbell One Arm Triceps Extension (on bench)','Position dumbbell behind neck with elbow positioned upward.','Extend arm until straight while maintaining upper arm\'s vertical position throughout exercise. Return until dumbbell is behind neck or shoulder and repeat. Continue with opposite arm.','upload/exercise-picture/DBOneArmTricepsExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(211,'Lever Close Grip Bench Press (plate loaded)','Lie on bench with lever handles above sides of chest. Grasp handles with narrow overhand grip just above each side of chest.','Press lever up until arms are extended. Return weights down to starting position. Repeat.','upload/exercise-picture/LVCloseGripBenchPressH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(212,'Lever Barbell Close Grip Bench Press (plate loaded)','Lie on bench with bar above chest and grasp bar with shoulder width or slightly narrower grip. Disengage bar by rotating bar back.','Lower weight to chest with elbows close to body. Push barbell back up until arms are straight. Repeat.','upload/exercise-picture/LVSMCloseGripBenchPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(213,'Lever Overhead Triceps Extension','Sit on seat. Push foot lever down with foot and grasp lever handles from behind. With lever handles behind neck, place both feet on support or floor.','Push lever handles up over head until arms are fully extended. Return and repeat.','upload/exercise-picture/LVOverheadTricepsExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(214,'Lever Incline Triceps Extension','Sit on seat and lie back on back support. Push foot lever down with foot and grasp lever handles from behind. With lever handles behind head, place both feet on support or floor.','Push lever handles up over head until arms are fully extended. Return and repeat.','upload/exercise-picture/LVInclineTricepsExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(215,'Lever Pushdown','Sit on seat and grasp handles by shoulders. Position elbows to sides.','Push lever down beyond hips until arm is fully extended. Return and repeat.','upload/exercise-picture/LVPushdown.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(216,'Lever Triceps Extension (no seat, plate loaded)','Stand behind arm pad facing lever handles. Place one foot forward under arm pad and opposite foot back on foot bar. Grasp handles with narrow overhand grip. Squat down and position chest up against side of pad and back of upper arms on upper angled padded surface.','Push lever down until arms are fully extended. Return and repeat.','upload/exercise-picture/LVTricepsExtensionNoSeatPL.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(217,'Lever Triceps Dip (plate loaded)','Sit upright on seat. If possible, place handles in narrow position. Grasp handles.','Push levers down with elbows pointing back. Allow lever bar to raise until shoulders are slightly stretched. Repeat.','upload/exercise-picture/LVTricepsDipH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(218,'Lever Triceps Extension (plate loaded)','Sit on seat. Place forearms on lever pad and back of upper arms, parallel on padding with elbows in line with lever\'s fulcrum.','Push lever down until arms are fully extended. Return and repeat.','upload/exercise-picture/LVTriExtGripless.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(219,'Lever Triceps Dip','If possible, place handles in narrow position. Sit on seat with legs under pads. Grasp handles and position elbows back.','Push levers down by straightening arms downward. Allow lever bar to raise with elbows pointing back until shoulders are slightly stretched. Repeat.','upload/exercise-picture/LVTricepsDip2.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(220,'Lever Seated Close Grip Press','Sit on seat with chest at height of handles. Grasp handles with shoulder width or slightly narrower overhand grip, just against sides of chest; elbows somewhat down to sides.','Press lever until arms are extended. Return weight until forearm is against upper arm. Repeat.','upload/exercise-picture/LVCloseGripChestPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(222,'Lever Close Grip Incline Bench Press','Lie on incline bench with parallel lever bars close to sides of chest. Grasp handles with shoulder width grip.','Press lever until arms are ext\n\n\nended. Return weight until wrists are at side of chest. Repeat.','upload/exercise-picture/LVCloseGripInclineBenchPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(223,'Lever Alternating Triceps Extension','Sit on seat. Grasp handles and place back of upper arms on padding.','Push one lever out and down until arm is fully extended. Return until forearm contacts upper arm. Repeat with opposite arm. Continue alternating movement between arms.','upload/exercise-picture/LVAlternatingTricepsExtensionS.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(224,'Lever Triceps Extension','Sit on seat. Grasp handles and place back of upper arms parallel on padding with elbows approximately in line with lever\'s fulcrum.','Push lever down until arms are fully extended. Return until forearms contact upper arms. Repeat.','upload/exercise-picture/LVTricepsExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(225,'Sled Standing Triceps Dip','Stand between handles facing machine. Grasp parallel handles and position elbows back. Squat down slightly by bending hips and knees, just enough to raise selected weight up from remaining weight stack.','Push levers down by straightening arms downward. Allow lever bar to raise with elbows pointing back until slight stretch is felt in shoulders. Repeat.','upload/exercise-picture/SLStandingTricepsDip.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(226,'Smith Close Grip Bench Press','Lie on bench with bar above chest and grasp bar with shoulder width or slightly narrower grip. Disengage bar by rotating bar back.','Lower weight to chest with elbows close to body. Push bar back up until arms are straight. Repeat.','upload/exercise-picture/SMCloseGripBenchPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(228,'Lever Overhand Triceps Dip','Sit on seat with back against pad. Gra\n\n\nsp end of handles with overhand grip and position elbows back.','Push levers down by straightening arms downward. Allow lever bar to raise with elbows pointing back until shoulders are slightly stretched. Repeat.','upload/exercise-picture/LVTricepsDipOverhand.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(229,'Smith Close Grip Incline Bench Press','Lie on incline bench with bar above chest and grasp bar with shoulder width or slightly narrower grip. Disengage bar by rotating bar back.','Lower weight to chest with elbows close to body. Push bar back up until arms are straight. Repeat.','upload/exercise-picture/SMCloseGripInclineBenchPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(230,'Weighted Bench Dip','Sit on inside of one of two benches placed parallel, slightly less than leg\'s length away. Place hands on edge of bench. Straighten arms, slide rear end off of edge of bench and position heels on adjacent bench with legs straight. Have assistant place weight on lap near hips.','Lower body by bending arms until slight stretch is felt in chest or shoulder, or rear end touches floor. Raise body and repeat.','upload/exercise-picture/WTBenchDip.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(231,'Weighted Triceps Dip','Place weight on dip belt around waist or place dumbbell between lower legs just above feet. Mount shoulder width dip bar, arms straight with shoulders above hands. Keep hips straight.','Lower body until slight stretch is felt in shoulders. Push body up until arms are straight. Repeat.','upload/exercise-picture/WtTricepsDip.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(232,'Weighted Close Grip Push-up','Lie prone on floor with hands under shoulders or slightly narrower. Position body up off floor with extended arms and body straight. Partner can place weight plate(s) on back if needed.','Keeping body straight, lower body to floor by bending arms. Push body up until arms are extended. Repeat.','upload/exercise-picture/WTCloseGripPushUp.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(233,'Close Grip Push-up (on knees)','Lie prone on floor with hands under shoulders or slightly narrower. Position body up off floor with extended arms and body straight.','Keeping body straight, lower body to floor by bending arms. Push body up until arms are extended. Repeat.','upload/exercise-picture/BWCloseGripPushUpKnees.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(234,'Bench Dip','Sit on inside of one of two benches placed parallel, slightly less than leg\'s length away. Place hands on edge of bench, straighten arms, slide rear end off of bench, and position heels on adjacent bench with legs straight.','Lower body by bending arms until slight stretch is felt in chest or shoulder, or rear end touches floor. Raise body and repeat.','upload/exercise-picture/BWBenchDipLegsElevated.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(235,'Close Grip Push-up','Lie prone on floor with hands under shoulders or slightly narrower. Position body up off floor with extended arms and body straight.','Keeping body straight, lower body to floor by bending arms. Push body up until arms are extended. Repeat.','upload/exercise-picture/BWCloseGripPush.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(236,'Bench Dip (heels on floor)','Sit on side of bench. Place hands on edge of bench. Position feet away from bench. Straighten arms, slide rear end off of edge of bench, and rest heels on floor with legs straight.','Lower body by bending arms until slight stretch is felt in chest or shoulder, or rear end touches floor. Raise body and repeat.','upload/exercise-picture/BWBenchDipFloor.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(237,'Band-assisted Triceps Dip','Place one foot on middle of exercise band with ends looped on shoulder width dip bars. Push band down partially by extending leg. Mount dip bar with arms straight and shoulders above hands. Place other foot on exercise band next to other foot. Keep hips straight.','Lower body until slight stretch is felt in shoulders. Push body up until arms are straight. Repeat.','upload/exercise-picture/ASTricepsDipFootBand.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(238,'Bench Dip (knees bent)','Sit on side of bench. Place hands on edge of bench. Place feet on floor away from bench. Straighten arms, slide rear end off of edge of bench, and position feet on floor with knees bent.','Lower body by bending arms until slight stretch is felt in chest or shoulder, or rear end touches floor. Raise body and repeat.','upload/exercise-picture/BWBenchDipBentKnee.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(240,'Triceps Dip','Mount shoulder width dip bar, arms straight with shoulders above hands. Keep hips straight.','Lower body until slight stretch is felt in shoulders. Push body up until arms are straight. Repeat.','upload/exercise-picture/BWTricepsDip.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(241,'Suspended Triceps Extension (with rope)','Grasp triceps rope hanging from secured bar (chest height or lower). Position forefeet on floor, back from bar with body straight. Elbows can be either be completely bent or straight during mount with upper arms somewhat perpendicular with body.','Keeping body straight, raise body up and back up until arms are extended. Lower body by bending elbows, allowing head to travel between ends of rope. Repeat.','upload/exercise-picture/BWSuspendedTricepsExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(242,'Close Grip Incline Push-up (on bar)','Grasp horizontal bar (lower than chest height) with hands shoulder width or slightly narrower. Position forefeet back from bar with arms and body straight. Arms should be perpendicular to body.','Keeping body straight, lower chest to bar by bending arms. Push body up until arms are extended. Repeat.','upload/exercise-picture/BWCloseGripInclinePushUpOnBar.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(243,'Triceps Dip (between benches)','Stand between ends of two benches. Place hands on ends of benches with fingers off end of benches. Grip should be somewhat narrow. Position feet out in front with legs straight, heels on floor, and torso upright.','Lower body by bending arms, allowing elbows to point back. When slight stretch is felt in chest or shoulders, push body up until arms are straight. Repeat.','upload/exercise-picture/BWDoubleBenchDipsTriceps.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(244,'Suspended Self-assisted Triceps Dip','Stand between two suspension handles, approximately mid-thigh height. Grasp handles on each side and straighten arms with shoulders above hands. Holding position firmly and place bodyweight on handles. Place toes on floor behind with knees bent and feet back.','Lower body by bending arms back. If necessary, use minimal assistance of lower body to control descent, allowing knees to bend, keeping toes in contact with floor. When slight stretch is felt in chest or shoulders, push body up back up until arms are straight. Repeat with minimal assistance from legs.','upload/exercise-picture/STSelfAssistedDipOnToes.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(245,'Triceps Dip (bent knees between benches)','Stand between ends of two benches. Place hands on ends of benches with fingers off ends of benches. Grip should be somewhat narrow. Position feet in front with legs bent and torso upright.','Lower body by bending arms, allowing elbows to point back. When slight stretch is felt in chest or shoulders, push body up until arms are straight. Repeat.','upload/exercise-picture/BWDoubleBenchDipBentKneeTriceps.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(246,'Suspended Triceps Extension','Grasp handles and step forward between suspension trainers. Position arms downward and slightly forward, nearly parallel with suspension straps. Lean forward, placing upper body weight onto handles with arms straight, while stepping back onto forefeet so body is leaning forward at desired angle. Straighten body, so torso is in-line with legs.','Lower body by bending elbows, allowing head to travel between suspension handles. Raise body up and back up until arms are extended. Repeat.','upload/exercise-picture/STTricepsExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(247,'Suspended Triceps Dip','Stand between two suspension handles and grasp handles on each side of torso. Hold position firmly and lift feet from floor.','Push body up until arms are straight. Lower body until slight stretch is felt in shoulders. Repeat.','upload/exercise-picture/STDip.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(249,'Towel Triceps Stretch','Grasp near end of towel or rope. Position towel behind head so towel dangles down behind body. Reach behind back or waist with opposite hand and grasp opposite end of towel. Position upper arm close to back side of head.','Pull towel downward with lower arm. Hold stretch. Repeat with opposite arm.','upload/exercise-picture/3799ed8a83c8eac5efb901d9b10cdba5.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(250,'Overhead Triceps Stretch','Put one arm overhead. Position forearm as close as possible to upper arm. Grasp elbow overhead with other hand.','Pull elbow back and toward head. Hold stretch. Repeat with opposite arm.','upload/exercise-picture/edeae1cee9ffa6dc4c5e5fed632f9bba.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(251,'PNF Overhead Triceps Stretch','Instruct participant to stand or sit on floor, chair, or bench and place arm overhead. Standing behind participant, grasp their wrist and position their forearm against upper arm.','Pull participant\'s elbow behind their head while keeping forearm against upperarm. Hold stretch. Repeat with opposite arm.','upload/exercise-picture/389b7b9e3728a886909b6b7a5f9a6e8a.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(252,'Self-assisted Triceps Dip','Stand on bench or elevation between parallel bars. Mount shoulder width dip bar, arms straight with shoulders above hands. Bend knees and place toes on bench or elevation behind and below body.','Lower body by bending arms back. If necessary, use minimal assistance of lower body to control descent, allowing knees to bend, keeping toes in contact with bench or elevation. When slight stretch is felt in chest or shoulders push body up until arms are straight. Repeat with minimal assistance from legs.','upload/exercise-picture/ASTricepsDipSelf.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(253,'Cable Alternating Seated Curl','Sit on seat situated between two low pulleys down to each side. Grasp stirrups in each hand, palms facing forward.','Pull one stirrup up toward shoulder while keeping elbow stationary. Return until arm is fully extended. Repeat with other arm, alternating between sides.','upload/exercise-picture/CBSeatedAlternatingCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(254,'Cable Alternating Curl','Stand between or facing double low pulleys. Grasp stirrups to each side, palms facing forward.','Pull one stirrup up forward and upward toward shoulder while keeping elbow stationary. Return until arm is fully extended. Repeat on other arm, alternating between sides.','upload/exercise-picture/CBAlternatingCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(255,'Barbell Drag Curl','Grasp bar with shoulder width underhand grip.','Raise barbell straight up so elbows travel back as elbows flex. Follow contour of hips and waist. As elbows continues to flex, begin bringing elbows forward when forearms rises past horizontal position. Continue upward over chest until forearms are perpendicular. Lower until arms are fully extended. Repeat.','upload/exercise-picture/BBDragCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(256,'Barbell Curl','Grasp bar with shoulder width underhand grip.','With elbows to side, raise bar until forearms are vertical. Lower until arms are fully extended. Repeat.','upload/exercise-picture/BBCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(257,'Cable Curl','Grasp low pulley cable bar with shoulder width underhand grip. Stand close to pulley.','With elbows to side, raise bar until forearms are vertical. Lower until arms are fully extended. Repeat.','upload/exercise-picture/CBCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(258,'Cable Seated Curl','Sit on seat situated between two low pulleys down to each side. Grasp stirrups in each hand, palms facing forward.','Pull both stirrups up toward shoulders while keeping elbows stationary. Return until arms are fully extended and repeat.','upload/exercise-picture/CBSeatedCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(259,'Cable Bar Curl','Grasp low cable bar with shoulder width underhand grip. Stand close to cable bar.','With elbows to side, raise bar until forearms are vertical. Lower until arms are fully extended. Repeat.','upload/exercise-picture/CBBarCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(260,'Cable One Arm Curl','Face low pulley and grasp stirrup cable attachment to one side with underhand grip.','With elbow to side, raise bar until forearms are vertical. Lower until arms are fully extended. Repeat. Continue with opposite arm.','upload/exercise-picture/CBOneArmCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(261,'Cable Curl (with stirrups)','Stand between or facing double low pulleys. Grasp stirrups to each side, palms facing forward.','Pull stirrups forward and upward toward shoulders while keeping elbows stationary. Return until arms are fully extended. Repeat.','upload/exercise-picture/CBCurlStirrups.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(262,'Cable Supine Curl','Sit on floor with feet or heels against pulley machine. Grasp low pulley cable bar with shoulder width underhand grip. Lie back on floor with arms to sides.','With elbows to side, pull bar until elbows are flexed. Lower until arms are fully extended. Repeat.','upload/exercise-picture/CBSupineArmCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(263,'Dumbbell Curl','Position two dumbbells to sides, palms facing in, arms straight.','With elbows to sides, raise one dumbbell and rotate forearm until forearm is vertical and palm faces shoulder. Lower to original position and repeat with opposite arm. Continue to alternate between sides.','upload/exercise-picture/DBCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(264,'Underhand Inverted Row (high bar)','Stand facing arms length away from waist to head height horizontal bar. Grasp bar with shoulder width underhand grip. Position body under bar with legs, hips and spine straight. Arms should be straight, approximately perpendicular to body. Heels should make contact with floor with feet about perpendicular to legs.','Keeping body straight, pull body up to bar. Return until arms are extended and shoulders are stretched forward. Repeat.','upload/exercise-picture/BWSupineRowUnderhandHigh.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(265,'Lever Alternating Curl','Sit on seat and grasp handles with underhand grip.','Raise lever on handle until elbow is fully flexed with back of upper arm remaining on pad. Lower handle until arm is fully extended. Repeat with opposite arm. Continue to alternate movement between sides.','upload/exercise-picture/LVAlternatingCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(266,'Lever Curl','Sit on seat and grasp handles with underhand grip.','Raise lever handles until elbows are fully flexed with back of upper arm remaining on pad. Lower handles until arm is fully extended. Repeat.','upload/exercise-picture/LVCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(267,'Doorway Biceps Stretch','Stand at end of wall or in doorway facing perpendicular to wall. Position front of straight arm and palm on surface of wall. Situate arm around same height of shoulder with elbow positioned away from wall.','Turn body away from positioned arm. Hold stretch. Repeat with opposite arm.','upload/exercise-picture/43d668452405c4e4fc3558c7198e186a.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(268,'Seated Biceps Stretch','Sit on floor or mat. Lean back and place hands flat on floor close together behind body with fingers positioned away from body.','Scoot hips forward away from hands. Hold stretch.','upload/exercise-picture/055a2e3f70a4c9da644902025b37f71d.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(269,'Dumbbell Incline Curl','Sit back on 45-60 degree incline bench. With arms hanging down straight, position two dumbbells with palms facing inward.','With elbows back to sides, raise one dumbbell and rotate forearm until forearm is vertical and palm faces shoulder. Lower to original position and repeat with opposite arm. Continue to alternate between sides.','upload/exercise-picture/DBInclineCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(270,'Chin-up','Step up and grasp bar with underhand shoulder width grip.','Pull body up until elbows are to sides. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/BWUnderhandChinup.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(271,'Underhand Inverted Row','Lay on back under fixed horizontal bar. Grasp bar with shoulder width underhand grip.','Keeping body straight, pull body up to bar. Return until arms are extended and shoulders are stretched forward. Repeat.','upload/exercise-picture/BWSupineRowUnderhand.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(272,'Standing Biceps Stretch','Clasp hands behind back with palms together. Straighten arms and rotate arms (inside down) so palm turn downward.','Raise arms away from body. Hold stretch.','upload/exercise-picture/6cb903dd82c279b928786e7c041a8650.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(273,'PNF Seated Biceps Stretch','Instruct participant to sit on floor or bench and place arms to behind hips. From behind, grasp participant\'s wrists, positioning them downward and close together.','Continue to raise participant\'s arms upward behind their body. Hold stretch.','upload/exercise-picture/7fb262891ac5c6933385580cfca31e8d.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(274,'Wall Biceps Stretch','Face away from wall. Bend over and place hands close together as high as possible on wall with fingers positioned upward.','Bring rear end and back toward wall and squat down. Hold stretch for 20 seconds.','upload/exercise-picture/e56394f43d421e81a3dcd5db1bc18917.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(275,'Cable Preacher Curl','Sit on preacher bench placing back of arms on pad. Grasp cable bar with shoulder width underhand grip.','Raise cable bar toward shoulders. Lower cable bar until arms are fully extended. Repeat.','upload/exercise-picture/CBPreacherCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(276,'Cable Alternating Preacher Curl','Grasp cable stirrups with each hand. Sit on preacher bench placing back of arms on pad with palms up.','Raise one stirrup upward toward shoulder of same arm. Lower stirrup until arm is fully extended. Repeat with opposite arm. Continue alternating between arms.','upload/exercise-picture/CBAlternatingPreacherCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(277,'Cable Concentration Curl','Facing low pulley cable, sit on seat or bench with legs apart to each side. Grasp stirrup attachment. Place upper arm against inner thigh.','Pull stirrup to front of shoulder until elbow is completely flexed. Lower stirrup until arm is fully extended. Repeat. Continue with opposite arm.','upload/exercise-picture/CBConcentrationCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(278,'Cable Preacher Curl (stirrups)','Grasp cable stirrups with each hand. Sit on preacher bench placing back of arms on pad with palms up.','Raise both stirrups upward toward shoulders. Lower stirrups until arm is fully extended. Repeat.','upload/exercise-picture/CBPreacherCurlStirrups.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(279,'Cable One Arm Standing Preacher Curl','Standing behind standing preacher bench and grasp cable stirrup.\nPlace back of arm on pad with palm up.','Raise stirrup upward toward shoulder of same arm. Lower stirrup\nuntil arm is fully extended. Repeat.','upload/exercise-picture/CBOneArmStandingPreacherCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(280,'Barbell Prone Incline Curl','Lie prone on incline bench with shoulders near top of incline. Knees can rest on seat or legs can be straddled to sides. From low rack or partner, grasp curl bar with shoulder width underhand grip.','Raise bar until arms are flexed. Lower barbell until arms are fully extended. Repeat.','upload/exercise-picture/BBProneInclineCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(281,'Cable Standing Preacher Curl','Stand behind preacher bench. Grasp cable bar with shoulder\nwidth underhand grip. Position back of arms on pad.','Raise cable bar toward shoulders. Lower cable bar until arms\nare fully extended. Repeat.','upload/exercise-picture/CBStandingPreacherCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(282,'Barbell Standing Preacher Curl','Placing back of arms on pad with one foot forward, grasp curl bar with shoulder width underhand grip.','Raise bar until forearms are vertical. Lower barbell until arms are fully extended. Repeat.','upload/exercise-picture/BBStandingPreacherCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(283,'Barbell Preacher Curl','Sit on preacher bench placing back of arms on pad. Grasp curl bar with shoulder width underhand grip.','Raise bar until forearms are vertical. Lower barbell until arms are fully extended. Repeat.','upload/exercise-picture/BBPreacherCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(284,'Cable Prone Incline Curl','Lie prone on incline bench with shoulders near top of incline. Knees can rest on seat or legs can be straddled to sides. Grasp cable attachment with shoulder width underhand grip.','Raise bar until arms are flexed. Lower barbell until arms are fully extended. Repeat.','upload/exercise-picture/CBProneInclineCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(285,'Cable One Arm Preacher Curl','Grasp cable stirrup. Sit on preacher bench placing back of arm on pad with palm up.','Raise stirrup upward toward shoulder of same arm. Lower stirrup until arm is fully extended. Repeat.','upload/exercise-picture/CBOneArmPreacherCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(286,'Dumbbell Preacher Curl','Grasp dumbbell and sit on preacher bench. With arm bent and palm facing shoulder, place back of arm down on pad.','Lower dumbbell until arm is fully extended. Raise dumbbell until forearm is vertical. Repeat. Continue with opposite arm.','upload/exercise-picture/DBPreacherCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(287,'Dumbbell Concentration Curl','Sit on bench. Grasp dumbbell between feet. Place back of upper arm to inner thigh. Lean into leg to raise elbow slightly.','Raise dumbbell to front of shoulder. Lower dumbbell until arm is fully extended. Repeat. Continue with opposite arm.','upload/exercise-picture/DBConcentrationCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(288,'Lever Preacher Curl (plate loaded)','Sit on curl machine placing back of arms on pad. Grasp lever handles with underhand grip. Align elbows at same pivot point as fulcrum of lever.','Raise lever handles toward shoulders. Lower handles until arms are fully extended. Repeat.','upload/exercise-picture/LVPreacherCurlH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(289,'Lever Preacher Curl (arms high, plate loaded)','Sit on curl machine. Grasp lever handles with underhand grip. Align elbows at same pivot point as fulcrum of lever while placing back of arms up on pads.','Pull lever handles toward shoulders. Return handles until arms are fully extended. Repeat.','upload/exercise-picture/LVHighPreacherCurlArmsHighPL.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(290,'Dumbbell Prone Incline Curl','Lie prone on incline bench with shoulders near top of incline. Knees can rest on seat or legs can be straddled to sides. From elevated platform or partner, grasp dumbbell and position palms forward.','Raise dumbbells until arms are flexed. Lower dumbbells until arms are fully extended. Repeat.','upload/exercise-picture/DBProneInclineCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(291,'Dumbbell Standing Preacher Curl','With dummbell in hand, arm bent, and palm facing shoulder, place back of arm on pad.','Lower dumbbell until arm is fully extended. Raise dumbbell until forearm is vertical. Repeat. Continue with opposite arm.','upload/exercise-picture/DBStandingOneArmPreacherCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(292,'Lever Alternating Preacher Curl (arms high, plate loaded)','Sit on curl machine. Grasp lever handles with underhand grip. Align elbows at same pivot point as fulcrum of lever while placing back of arms up on pads.','Pull one lever handle toward shoulder. Return handle until arm is fully extended. Repeat with opposite arm. Continue alternating movement between arms.','upload/exercise-picture/LVAlternatingHighPreacherCurlArmsHighPL.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(293,'Lever Preacher Curl (no seat, plate loaded)','Stand behind arm pad and face lever handles on opposite side. Place one foot forward under arm pad and opposite foot back on foot bar. Lean over arm pads and grasp handles with slightly narrower than shoulder width underhand grip. Squat down and position back of upper arms on arm pads.','Raise lever handles toward shoulders. Lower handles until arms are fully extended. Repeat.','upload/exercise-picture/LVStandingPreacherCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(294,'Lever Preacher Curl (arms high)','Sit on curl machine. Grasp lever handles with underhand grip. Align elbows at same pivot point as fulcrum of lever while placing back of arms up on pads.','Pull lever handles toward shoulders. Return handles until arms are fully extended. Repeat.','upload/exercise-picture/LVHighPreacherCurlS.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(295,'Lever Preacher Curl','Sit on curl machine placing back of arms on pad. Grasp lever handles with underhand grip. Align elbows at same pivot point as fulcrum of lever.','Raise lever handles toward shoulders. Lower handles until arms are fully extended. Repeat.','upload/exercise-picture/LVPreacherCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(296,'Lever Alternating Preacher Curl (arms high)','Sit on curl machine. Grasp lever handles with underhand grip. Align elbows at same pivot point as fulcrum of lever while placing back of arms up on pads.','Pull one lever handle toward shoulder. Return handle until arm is fully extended. Repeat with opposite arm. Continue alternating movement between arms.','upload/exercise-picture/LVAlternatingHighPreacherCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(297,'Suspension Arm Curl','Grasp suspension handles and momentarily step back until arms are extended forward and straight. While keeping arms straight and shoulders back, step forward so body is reclined back. Position palms up or slightly inward.','Bring handles toward shoulders by flexing arms, while keeping elbows pointed forward. Return by straightening arms and repeat.','upload/exercise-picture/STArmCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(298,'Lever Preacher Curl (no seat)','Stand behind arm pad and face lever handles on opposite side. Place one foot forward under arm pad and opposite foot back on foot bar. Lean over arm pads and grasp\n\n\nhandles with slightly narrower than shoulder width underhand grip. Squat down and position back of upper arms on arm pads.','Raise lever handles toward shoulders. Lower handles until arms are fully extended. Repeat.','upload/exercise-picture/LVPreacherCurlSeatless.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(299,'Barbell Standing Reverse Preacher Curl','Place back of arms on pad with one foot forward. Grasp curl bar with shoulder width underhand grip.','Raise bar until forearms are vertical. Lower barbell until arm is fully extended. Repeat.','upload/exercise-picture/BBStandingReversePreacherCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(300,'Cable Hammer Curl','Grasp cable rope with palms facing inward. Stand upright with arms straight down to sides.','With elbows to side, raise rope forward and upward with both arms until forearms are vertical. Lower until arms are fully extended. Repeat.','upload/exercise-picture/CBHammerCurlRope.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(301,'Barbell Reverse Curl','Grasp bar with shoulder width overhand grip.','With elbows to side, raise bar until forearms are vertical. Lower until arms are fully extended. Repeat.','upload/exercise-picture/BBReverseCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(302,'Cable Reverse Curl','Grasp cable bar with shoulder width overhand grip.','With elbows to side, raise bar until forearms are vertical. Lower until arms are fully extended. Repeat.','upload/exercise-picture/CBReverseCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(303,'Cable Bar Reverse Curl','Grasp cable bar with shoulder width overhand grip. Stand close to cable bar.','With elbows to side, raise bar until forearms are vertical. Lower until arms are fully extended. Repeat.','upload/exercise-picture/CBBarReverseCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(304,'Dumbbell Hammer Curl','Position two dumbbells to sides, palms facing in, arms straight.','With elbows to sides, raise one dumbbell until forearm is vertical and thumb faces shoulder. Lower to original position and repeat with alternative arm.','upload/exercise-picture/DBHammerCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(305,'Lever Reverse Curl','Sit on seat and grasp handles with overhand grip. Position elbows to sides so they are in line with lever\'s fulcrum.','Raise lever handles until elbows are fully flexed with back of upper arm remaining on pad. Lower handles until arm is fully extended. Repeat.','upload/exercise-picture/LVReverseCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(306,'Lever Hammer Preacher Curl','Sit on curl machine placing back of arms on pad. Grasp lever handles and position grips with thumb side up. Align elbows at near same pivot point as fulcrum of lever.','Raise lever handles toward shoulders, maintaining palms in grip. Lower handles until arm is fully extended. Repeat.','upload/exercise-picture/LVHammerPreacherCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(307,'Cable Standing Reverse Preacher Curl','Stand behind preacher bench. Grasp cable bar with shoulder\nwidth overhand grip. Position back of arms on pad.','Raise cable bar toward shoulders. Lower cable bar until arm\nis fully extended. Repeat.','upload/exercise-picture/CBStandingReversePreacherCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(308,'Barbell Reverse Preacher Curl','Sit on preacher bench placing back of arms on pad. Grasp curl bar with shoulder width overhand grip.','Raise bar until forearms are vertical. Lower barbell until arm is fully extended. Repeat.','upload/exercise-picture/BBReversePreacherCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(309,'Cable Reverse Preacher Curl','Sit on preacher bench placing back of arms on pad. Grasp cable bar with shoulder width overhand grip.','Raise cable bar toward shoulders. Lower cable bar until arm is fully extended. Repeat.','upload/exercise-picture/CBReversePreacherCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(310,'Standing Brachioradialis Stretch','Cross wrists, point thumbs downward, and clasp hands.','Straighten arms and externally rotate shoulders by back. Hold stretch.','upload/exercise-picture/e5de318835474e554b63aa69f6b28291.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(311,'Lever Reverse Preacher Curl','Sit on curl machine placing back of arms on pad. Grasp lever handles with overhand grip. Align elbows at near same pivot point as fulcrum of lever.','Raise lever handles toward shoulders. Lower handles until arm is fully extended. Repeat.','upload/exercise-picture/LVReversePreacherCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(312,'Cable Roller Wrist Flexion','Stand behind weight plate(s) on floor and grasp wrist roller handle with both hands; over hand grip.','With left hand gripping handle, relax grip of right hand and slide grip behind handle (by hypexending wrist) and regrip. Relax grip of left hand and flex right wrist. Repeat sequence with opposite hands, alternating back and forth until weight plate has raised up near hands. Lower weight steadily with opposite movement.','upload/exercise-picture/CableRollerWristFlexion.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(313,'Lever Wrist Curl (plate loaded)','Grasp bar with underhand grip. Place forearm on padded platform.','Raise bar up until wrist is fully flexed. Lower and repeat.','upload/exercise-picture/LVWristCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(314,'Cable One Arm Wrist Curl','Sit and grasp cable stirrup. Rest forearm on thigh with palm up and wrist just beyond knees.','Allow cable bar to roll out of palms down to fingers. Raise cable bar back up by gripping and pointing knuckles up as high as possible. Lower and repeat.','upload/exercise-picture/CBOneArmWristCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(315,'Barbell Wrist Curl','Sit and grasp bar with narrow to shoulder width underhand grip. Rest forearms on thighs with wrists just beyond knees.','Allow barbell to roll out of palms down to fingers. Raise barbell back up by gripping and pointing knuckles up as high as possible. Lower and repeat.','upload/exercise-picture/BBWristCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(316,'Dumbbell Ulnar Deviation','Grasp half loaded dumbbell with plate on pinkie side. Position arm down to side.','Bend wrist so weighted side is pulled upward. Lower until weighted side is pointing downward. Repeat.','upload/exercise-picture/DBUlnarFlexion.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(317,'Cable Wrist Curl','Sit and grasp cable bar with narrow to shoulder width underhand grip. Rest forearms on thighs with wrists just beyond knees.','Allow cable bar to roll out of palms down to fingers. Raise cable bar back up by gripping and pointing knuckles up as high as possible. Lower and repeat.','upload/exercise-picture/CBWristCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(318,'Dumbbell Wrist Curl','Sit and grasp dumbbell with underhand grip. Rest forearm on thigh with wrist just beyond knee.','Allow dumbbell to roll out of palm down to fingers. Raise dumbbell back up by gripping and pointing knuckles up as high as possible. Lower and repeat.','upload/exercise-picture/DBWristCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(319,'Lever Grip (plate loaded)','Sit on seat, straddling apparatus. Grasp lever handles on each side; fingers around lever handles and base of thumbs around stationary bars.','Squeeze bars together with both hands until lower lever makes contact with upper bars. Lower to original position and repeat.','upload/exercise-picture/LVGripper.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(320,'Lever Grip','Sit on seat. Grasp lever handles on each side; fingers around lever handles and base of thumbs around stationary bars.','Squeeze bars together with both hands until lever makes contact with stationary bars. Lower to original position and repeat.','upload/exercise-picture/LVSeatedGripper.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(321,'Lever Wrist Curl','Grasp bar with underhand grip to each side. Place forearms on arm pads.','Raise handles up until wrist is fully flexed. Lower handles until wrists are full hyperextended. Repeat.','upload/exercise-picture/LVSeatedWristCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(322,'Lever Ulnar Deviation','Rotate handle over and under so handle is in slightly downward position toward thighs. Grasp handle with thumb ups grip so fist is pulled up under resistance.','Bend wrist so pinky side of fist is pulled down. Return to starting position and repeat.','upload/exercise-picture/LVUlnarDeviation.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(323,'Sled One Hand Grip','Stand in front of apparatus. Grasp bar grips with one hand; fingers around far bar and base of thumb around near stationary bar.','Squeeze bar grips together until far bar makes contact with nearest bar. Release to original position and repeat.','upload/exercise-picture/SLGripper.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(324,'Sled One Hand Pinch Grip (plate loaded)','Place hand around horizontal surfaces; fingers along lower surface and thumb on upper surface.','Pinch surfaces together until lower part makes contact with upper part. Release to original position or just before surfaces become too far apart. Repeat.','upload/exercise-picture/SLOneHandGripPinchPL.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(325,'Sled Grip (plate loaded)','Bend over and grasp bar grips with both hands; fingers under lower bar and base of thumbs over top stationary bar.','Squeeze bar grips together until lower bar makes contact with upper bar. Release to original position and repeat.','upload/exercise-picture/SLGripPL.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(326,'Lever Roller Wrist Flexion','Grasp wrist roller handles with both hands; over hand grip.','With left hand gripping handle, relax grip of right hand and slide grip behind handle (by hypexending wrist) and regrip. Relax grip of left hand and flex right wrist. Repeat sequence with opposite hands, alternating back and forth until weight plate has raised up near hands. Lower weight steadily with opposite movement or loosen grip slightly to control descent of weight stack. Repeat.','upload/exercise-picture/LVRollerAlternatingWristFlexion.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(327,'Praying Wrist Flexor Stretch','Place palms together in front of body. Point fingers toward neck.','Pushing hands together, lower away from body until wrists separate. Hold stretch. Repeat with opposite arm.','upload/exercise-picture/687f3c5f65553be7ab1ce1453499fdf2.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(328,'Sled One Hand Grip (plate loaded)','Bend over and grasp bar grips with one hand; fingers under lower bar and base of thumb over top stationary bar.','Squeeze bar grips together until lower bar makes contact with upper bar. Release to original position and repeat.','upload/exercise-picture/SLOneHandGripPL.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(329,'Seated Wrist Flexor Stretch','Sit on floor. Place palms on floor to sides, behind hips with fingers pointing to back.','Lean back with arms straight. Hold stretch.','upload/exercise-picture/0e6c9ab24bc1acaa9bbb811fa0f0f70a.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(330,'Single Arm Wrist Flexor Stretch','With palm facing downward, grasp underside of fingers with other hand and straighten elbow.','Pull finger and wrist upward and back toward forearm. Hold stretch. Repeat with opposite arm.','upload/exercise-picture/87d4e6a3bad34ced76d50c60a6b2fbf8.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(331,'Kneeling Wrist Flexor Stretch','Kneel on floor or mat. Place palms of hand on floor with fingers pointing toward knees.','Shift body back with elbows straight. Hold stretch.','upload/exercise-picture/f4b4e6a42d8874f9e70106cf09e141d9.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(332,'Lever Roller Ulnar Deviation','Place hands on knobs at each end of roller.','With left hand gripping knob, relax grip of right hand and slide grip upward so fingers are more over knob (by radial deviation) and regrip. Relax grip of left hand and rotate knob with right hand so thumb travels away from body (by ulnar deviation). Repeat sequence with opposite hands, alternating back and forth until weight plate has raised up near hands. Lower weight steadily with opposite movement or loosen grip slightly to control descent of weight stack.','upload/exercise-picture/LVWristRollerUlnarFlexion.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(333,'Dumbbell Radial Deviation','Grasp half loaded dumbbell with plate on thumb side. Position arm down to side.','Bend wrist so weighted side is pulled upward. Lower until weighted side is pointing downward. Repeat.','upload/exercise-picture/DBRadialDeviation.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(334,'Cable Reverse Wrist Curl','Sit and grasp cable bar with narrow to shoulder width overhand grip. Rest forearms on thighs with wrists just beyond knees.','Raise stirrup by pointing knuckles upward as high as possible. Return until knuckles are pointing downward as far as possible. Repeat.','upload/exercise-picture/CBReverseWristCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(335,'Dumbbell Reverse Wrist Curl','Sit and grip dumbbell with overhand grip. Rest forearm on thigh with wrist just beyond knee.','Raise dummbell by pointing knuckles upward as high as possible. Return until knuckles are pointing downward as far as possible. Repeat.','upload/exercise-picture/DBReverseWristCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(336,'Lever Radial Deviation','Rotate handle under and over so handle is in slightly upward position toward head. Grasp handle with thumb ups grip so thumb side of fist is pulled away under resistance.','Bend wrist so thumb side of fist is pulled up. Return to starting position and repeat.','upload/exercise-picture/LVRadialDeviation.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(337,'Cable One Arm Reverse Wrist Curl','Sit and grasp cable stirrup. Rest forearm on thigh with palm facing down and with wrist just beyond knee.','Raise stirrup by pointing knuckles upward as high as possible. Return until knuckles are pointing downward as far as possible. Repeat.','upload/exercise-picture/CBOneArmReverseWristCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(338,'Barbell Reverse Wrist Curl','Sit and grasp bar with narrow to shoulder width overhand grip. Rest forearms on thighs with wrists just beyond knees.','Raise barbell by pointing knuckles upward as high as possible. Return until knuckles are pointing downward as far as possible. Repeat.','upload/exercise-picture/BBReverseWristCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(339,'Lever Reverse Wrist Curl (plate loaded)','Grasp bar with overhand grip. Place forearm on padded platform.','Raise bar until wrist is fully hyperextended and return until wrist is fully flexed. Repeat.','upload/exercise-picture/LVReverseWristCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(340,'Cable Roller Wrist Extension','Stand behind weight plate(s) on floor and grasp wrist roller handle with both hands; over hand grip.','With left hand gripping handle, relax grip of right hand and slide grip in front of handle (by flexing wrist) and regrip. Relax grip of left hand and hyperextend right wrist. Repeat sequence with opposite hands, alternating back and forth until weight plate has raised up near hands. Lower weight steadily with opposite movement.','upload/exercise-picture/CableRollerWristExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(341,'Lever Reverse Wrist Curl','Grasp handles with overhand grip to each side. Place forearms on arm pads.','Raise handles until wrist is fully hyperextended. Lower handles until wrists are fully flexed. Repeat.','upload/exercise-picture/LVSeatedReverseWristCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(342,'Lever Roller Radial Deviation','Place hands on knobs at each end of roller.','With left hand gripping knob, relax grip of right hand and slide grip downward so fingers are under bottom of knob (by ulnar deviation) and regrip. Relax grip of left hand and rotate knob with right hand so thumb travels closer to body (by radial deviation). Repeat sequence with opposite hands, alternating back and forth until weight plate has raised up near hands. Lower weight steadily with opposite movement or loosen grip slightly to control descent of weight stack.','upload/exercise-picture/LVWristRollerRadialFlexion.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(343,'Single Arm Wrist Extensor Stretch','With palm facing downward, pull wrist and fingers downward toward forearm.','Extend or straighten elbow. Hold stretch. Repeat with opposite arm.','upload/exercise-picture/1ef1476e3bcaf5b7a89a2cbfcc3bdd8f.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(344,'Kneeling Wrist Extensor Stretch','Kneel on floor or mat. Flex wrists and place tops of hand on floor with fingers pointing toward knees.','Lean against floor with elbows straight. Hold stretch for 20 seconds.','upload/exercise-picture/KneelingWristExtensor.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(345,'Dumbbell Lying Pronation (arm up)','Lie on bench or mat. With hand of upper arm, grasp unilaterally loaded dumbbell; pinkie positioned near weighted side. Bend elbow approximately 90-degrees and place arm on hip or side of waist. Position thumb upward (supinated).','Rotate dumbbell so thumb turns downward (pronation). Return and repeat.','upload/exercise-picture/DBPronationUp.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(346,'Dumbbell Seated Pronation','Sit next to elevated surface, approximately arm pit height. With hand of upper arm, grasp unilaterally loaded dumbbell; pinkie positioned near weighted side. Bend elbow approximately 90-degrees and place upperarm on elevated surface. Position thumb upward (supinated).','Rotate dumbbell so thumb turns downward (pronation). Return and repeat.','upload/exercise-picture/DBSeatedPronation.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(347,'Lever Seated Forearm Pronation','Sit on seat. Grasp rotating handles with underhand grip on each side and place forearms on pads.','Rotate shafts by turning palm downward. Return and repeat.','upload/exercise-picture/LVSeatedPronation.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(348,'Lever Standing Forearm Pronation','Grasp open handle at end of shaft with underhand grip.','Rotate shaft by turning palm downward. Return and repeat.','upload/exercise-picture/LVWristPronation.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(349,'Dumbbell Lying Pronation (arm down)','Grasp unilaterally loaded dumbbell with thumb next to weighted side. Lie on bench on side with weight and position arm with \"half dumbbell\" on bench. Bend elbow approximately 90-degrees and tucked bent elbow under body. Position thumb down (supinated).','Rotate dumbbell so thumb turns upward (pronation). Return and repeat.','upload/exercise-picture/DBPronationDown.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(350,'Lever Standing Forearm Supination','Grasp open handle at end of shaft with overhand grip.','Rotate shaft by turning palm upward. Return and repeat.','upload/exercise-picture/LVForearmSupination.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(351,'Dumbbell Lying Supination (arm down)','Grasp unilaterally loaded dumbbell with pinkie finger next to weight side. Lie on bench on side with weight and position arm with \"half dumbbell\" on bench. Bend elbow approximately 90-degrees and tuck bent elbow under body. Position thumb up (pronated).','Rotate dumbbell so thumb turns downward (supinated). Return and repeat.','upload/exercise-picture/DBSupinateDown.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(352,'Dumbbell Lying Supination','Lie on bench or mat. With hand of upper arm, grasp unilaterally loaded dumbbell; thumb next to side with weight. Bend elbow approximately 90-degrees and place forearm on hip, or side of waist. Position thumb downward (pronated).','Rotate dumbbell so thumb turns upward (supination). Return and repeat.','upload/exercise-picture/DBSupinationUp.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(353,'Dumbbell Seated Supination','Sit next to elevated surface, approximately arm pit height. With hand of arm next to elevated surface, grasp unilaterally loaded dumbbell; thumb next to side with weight. Bend elbow approximately 90-degrees and place upperarm on elevated surface. Position thumb downward (pronated).','Rotate dumbbell so thumb turns upward (supination). Return and repeat.','upload/exercise-picture/DBSeatedSupination.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(354,'Lever Seated Forearm Supination','Sit on seat. Grasp rotating handles with overhand grip on each side and place forearms on pads.','Rotate shafts by turning palm upward. Return and repeat.','upload/exercise-picture/LVSeatedSupination.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(355,'Barbell Close Grip Bent-over Row','Bend knees slightly and bend over bar with back straight. Grasp bar with shoulder width overhand grip.','Pull bar to waist. Return until arms are extended and shoulders are stretched forward. Repeat.','upload/exercise-picture/BBBentOverRowClose.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(356,'Cable Incline Row','Sit on incline and place feet on lower bar, or foot platform. Slide hips down by bending knees. Bend over and grasp cable attachment. Slide hips back, positioning knees with slight bend.','Pull cable attachment to waist while straightening back upright. Pull shoulders back and push chest forward while arching back. Return until arms are extended, shoulders are stretched forward, and lower back is flexed forward. Repeat.','upload/exercise-picture/CBInclineRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(357,'Cambered Barbell Lying Row','Lie chest down on elevated bench. Grasp cambered barbell below with overhand grip.','Pull bar to upper waist or lower chest. Return until arms are extended and shoulders are stretched downward. Repeat.','upload/exercise-picture/CMBLyingRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(358,'Cable Straight Back Incline Row','Sit on incline and place feet on lower bar, or foot platform. Slide hips down by bending knees. Bend over and grasp cable attachment. Slide hips back, positioning knees with slight bend. Straighten lower back so it is approximately perpendicular to incline.','Pull cable attachment to waist. Pull shoulders back and lift chest by arching back. Return until arms are extended, back is straight and perpendicular to incline, and shoulders are stretched forward. Repeat.','upload/exercise-picture/CBStraightBackInclineRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(359,'Barbell Bent-over Row','Bend knees slightly and bend over bar with back straight. Grasp bar with wide overhand grip.','Pull bar to upper waist. Return until arms are extended and shoulders are stretched downward. Repeat.','upload/exercise-picture/BBBentOverRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(360,'Barbell Underhand Bent-over Row','Bend knees slightly and bend over bar with back straight. Grasp bar with underhand grip.','Pull bar to waist. Return until arms are extended and shoulders are stretched downward. Repeat.','upload/exercise-picture/BBUnderhandBentOverRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(361,'Cable Kneeling Row','Place right knee on lower pad (positioned to right side) with foot of other leg slightly back out to side and knee slightly bent. Place right forearm on right side of upper pad and grasp handle. Grasp cable stirrup below with left hand. Allow left shoulder to be pulled forward without spinal rotation.','Pull stirrup up to side until elbow travels beyond surface of back. Return until arm is extended and shoulder is stretched downward. Repeat and continue with opposite side.','upload/exercise-picture/CBOneArmKneelingRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(362,'Cable Lying Row','Straddle head of bench and grasp stirrups on two high pulley cables. Lie on bench with stirrups in each hand and arms extended upward.','Pull stirrups down to each side of chest until elbows are behind back and shoulders are pulled back. Return until arms are extended and shoulders are stretched upward. Repeat.','upload/exercise-picture/CBLyingRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(363,'Cable One Arm Bent-over Row','Grasp cable stirrup. Step back away from pulley, with foot on same side as exercising arm, positioned out to side well behind forward foot. Bend over with hand on nearby bar or above knee for support. Keep back straight and knees slightly bent. Allow shoulder with stirrup to be pulled forward.','Pull cable attachment to side of torso, pulling shoulder back. Return until arm is extended and shoulder is stretched forward. Repeat. Continue with opposite arm.','upload/exercise-picture/CBOneArmBentOverRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(364,'Cable One Arm Seated Row','Sit slightly forward on platform or secured bench in order to grasp cable stirrup with one hand. Position hips back with knees slightly bent\n\n\n. Allow shoulder with stirrup to be pulled forward.','Pull cable attachment to side of torso, slightly twisting through waist. Pull shoulder back and push chest forward during contraction. Return until arm is extended and shoulder is stretched forward. Repeat. Continue with opposite arm.','upload/exercise-picture/CBOneArmRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(365,'Cable Twisting Seated Row','Sit slightly forward on platform or secured bench close to cable attachment. Bend forward and grasp cable stirrup with one hand. Slide hips back by positioning knees with slight bend. Allow shoulder with stirrup to be pulled forward with forward bend and twist through waist.','Pull cable attachment to side, extending and twisting through waist. Pull shoulders back and sit upright while pushing chest forward during contraction. Return until arm is extended and shoulder is stretched forward. Repeat and perform exercise with opposite arm.','upload/exercise-picture/CBOneArmTwistingRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(366,'Cable One Arm Seated High Row','Sit slightly forward on platform or secured bench close to cable attachment. Bend forward and grasp cable stirrup with one hand. Slide hips back by positioning knees with slight bend. Allow arm, shoulder, and torso to be pulled forward under weight on cable.','Pull cable attachment to side of torso, straightening back and leaning back slightly. Pull shoulder back and push chest forward during contraction. Return until arm is extended and torso is pulled forward. Repeat. Continue with opposite arm.','upload/exercise-picture/CBOneArmHighRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(367,'Cable Seated High Row','Sit slightly forward on bench or platform in order to\n\n\ngrasp cable attachment. Place feet on vertical platform. Slide hips back positioning knees with slight bend. Allow weight on cable to pull torso forward while stretching arms and shoulders upward.','Pull cable attachment to waist and lean back slightly. Pull shoulders back and push chest forward while arching back. Return until torso, arms, and shoulders pulled forward. Repeat.','upload/exercise-picture/CBHighRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(368,'Cable Twisting Seated High Row','Sit on seat or bench. Bend forward and grasp cable stirrup with one hand. Allow shoulder with stirrup to be pulled forward with twist through waist.','Pull cable attachment to side of torso while twisting though waist in opposite direction. Pull shoulder back and push chest forward. Return until arm is extended and shoulder is pulled forward. Repeat. Continue with opposite arm.','upload/exercise-picture/CBOneArmTwistingHighRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(369,'Cable Alternating Seated High Row','Sit and grasp cable stirrups one with each hand. Lean back slightly allowing arms, shoulders, and torso to be pulled forward under weight on cables.','Pull one cable stirrup to side. Pull shoulder back, push chest forward, and rotate body slightly toward pulling arm. Return until arm is extended and torso faces forward. Pull with opposite arm alternating between each side. Repeat.','upload/exercise-picture/CBAlternatingHighRowLeanBack.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(370,'Cable Seated Row','Sit slightly forward on seat or bench in order to grasp cable attachment. Place feet on vertical platform. Slide hips back positioning knees with slight bend.','Pull cable attachment to waist while straightening lower back. Pull shoulders back and push chest forward while arching back. Return until arms are extended, shoulders are stretched forward, and lower back is flexed forward. Repeat.','upload/exercise-picture/CBSeatedRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(371,'Cable One Arm Straight Back Seated High Row','Sit on seat or bench. Bend forward and grasp cable stirrup with one hand. Position torso upright allowing shoulder to be pulled forward under weight on cable.','Pull cable attachment to side of torso while pulling shoulder back, arching spine, and pushing chest forward. Return until arm is extended and shoulder is pulled forward. Repeat. Continue with opposite arm.','upload/exercise-picture/CBOneArmStrBackHighRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(372,'Cable Wide Grip Seated Row','Sit slightly forward on platform in order to grasp cable attachment. With awider than shoulder width grip, slide hips back positioning knees with slight bend.','Pull cable attachment to waist while pulling torso upright. Pull shoulders back and push chest forward while arching back. Return until arms are extended, shoulders are stretched forward, and lower back is flexed forward. Repeat.','upload/exercise-picture/CBWideGripSeatedRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(373,'Cable Straight Back Seated Row','Sit slightly forward on bench with feet on foot bar or vertical platform. Grasp close grip cable attachment. Straighten torso\n\n\nupright and slide hips back so knees are slightly bent.','Pull cable attachment to waist. Pull shoulders back and lift chest by arching back. Return until arms are extended, back is straight, and shoulders are stretched forward. Repeat.','upload/exercise-picture/CBSeatedRowStraightBack.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(374,'Cable Wide Grip Straight Back Seated Row','Sit slightly forward on bench or platform in order to grasp cable bar attachment. With wider than shoulder width overhand grip, straighten torso upright and slide hips back until knees are only\n\n\nslightly bent.','Pull cable attachment to waist. Pull shoulders back and lift chest by arching back. Return until arms are extended, back is straight, and shoulders are stretched forward. Repeat.','upload/exercise-picture/CBSeatedRowWideGripStrBack.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(375,'Cable Standing Row','Stand to side of medium height, rotating pulley. Place hand shoulder height or slightly lower on support bar with arm straight. Place foot nearest supporting arm forward with knee slightly bent and opposite foot back. Grasp cable stirrup with one hand, allowing shoulder to be pulled forward under weight on cable.','Pull cable attachment to side of torso while pulling shoulder back, arching spine, and pushing chest forward. Return until arm is extended and shoulder is pulled forward. Repeat. Continue with opposite arm.','upload/exercise-picture/CBOneArmStandingRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(376,'Dumbbell Bent-over Row','Kneel over side of bench by placing knee and hand of supporting arm on bench. Position foot of opposite leg slightly back to side. Grasp dumbbell from floor.','Pull dumbbell to up to side until it makes contact with ribs or until upper arm is just beyond horizontal. Return until arm is extended and shoulder is stretched downward. Repeat and continue with opposite arm.','upload/exercise-picture/DBBentoverRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(377,'Cable Standing Low Row','Stand to side of low pulley. Place hand on support bar with arm straight. Place foot nearest supporting arm forward with knee slightly bent and opposite foot back. Grasp cable stirrup with one hand, allowing shoulder to be pulled forward under weight on cable.','Pull cable attachment to side of torso while pulling shoulder back, arching spine, and pushing chest forward. Return until arm is extended and shoulder is pulled forward. Repeat. Continue with opposite arm.','upload/exercise-picture/CBStandingLowRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(378,'Dumbbell Lying Row','Lie chest down on elevated bench. Grasp dumbbells below.','Pull dumbbells to sides until upper arm is just beyond horizontal or height of back. Return until arms are extended and shoulders are stretched downward. Repeat.','upload/exercise-picture/DBLyingRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(379,'Cable Twisting Standing High Row','Stand facing high pulley positioned slightly above head level. Grasp stirrup with one hand and step back so arm is straight. With leg of opposite side as loaded arm, plant forefoot far back on floor. Slightly bend knee of forward leg, same direction as foot. Allow shoulder with stirrup to be pulled forward with twist through waist.','Pull cable attachment to side of torso and rotate body toward side of pulling arm. Pull shoulder back and push chest forward. Return until arm is extended and shoulder is pulled forward. Repeat. Continue with opposite arm.','upload/exercise-picture/CBStandingTwistingRowOpStance.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(380,'Lever Bent-over Row (plate loaded)','With lever handles to sides, bend knees slightly and bend over with back straight. Grasp lower handles.','Pull lever handles up to sides. Return until arms are extended and shoulders are stretched downward. Repeat.','upload/exercise-picture/LVBentOverRowH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(381,'Lever Wide Grip Bent-over Row (plate loaded)','With lever handles to sides, bend knees slightly and bend over with back straight. Grasp wider handles.','Pull lever handles up to sides. Return until arms are extended and shoulders are stretched downward. Repeat.','upload/exercise-picture/LVWideGripBentOverRowH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(382,'Lever Barbell Bent-over Row (plate loaded)','Stand with toes under bar facing fulcrum. Bend knees slightly and bend over bar with back straight. Grasp bar with wide overhand grip.','Pull bar to waist. Return until arms are extended and shoulders are stretched downward. Repeat.','upload/exercise-picture/LVSMBentoverRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(383,'Lever Incline Row (plate loaded)','Lie chest on inclined platform and grasp lever handles with overhand grip.','Pull lever up as high as possible. Return until arms are extended and shoulders are stretched downward. Repeat.','upload/exercise-picture/LVInclineRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(384,'Lever One Arm Bent-over Row (plate loaded)','Kneel over side of bench facing loaded side of lever bar by placing knee and hand of supporting arm on bench. Position foot of opposite leg slightly back to side, straddling bar. Grasp bar from floor, several inches under barbell plates.','Pull lever bar up to side until bar contacts shoulder or just until elbow travels behind height of back. Return until arm is extended and shoulder is stretched downward. Repeat and continue with opposite arm.','upload/exercise-picture/LVOneArmBentOverRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(385,'Lever Close Grip Incline Row (plate loaded)','Lie chest on inclined platform and grasp lever close grip handles.','Pull lever up as high as possible. Return until arms are extended and shoulders are stretched downward. Repeat.','upload/exercise-picture/LVCloseGripInclineRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(386,'Lever One Arm Standing Row (plate loaded)','Place hand on support bar and grasp lever far forward. Place foot on side of moving arm on foot support and position opposite foot behind.','Pull lever to side while twisting torso toward opposite side. Pull shoulder back and push chest forward during contraction. Return until arm is extended and torso is pulled toward original direction. Repeat. Continue with opposite arm.','upload/exercise-picture/LVOneArmStandingRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(387,'Lever Narrow Grip Seated Row (plate loaded)','Sit on seat and position chest against pad. Grasp lever handles with underhand grip.','Pull levers back until elbows are behind back and shoulders are pulled back. Return until arms are extended and shoulders are stretched forward. Repeat.','upload/exercise-picture/LVSeatedRowLowNarrowH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(388,'Lever Alternating Wide Grip Seated Row (plate loaded)','Sit on seat and position chest against pad. Grasp lever handles with underhand grip.','Pull one lever back until elbow is behind back and shoulder is pulled back. Return until arm is extended and shoulder is stretched forward. Repeat with opposite arm, alternating between sides.','upload/exercise-picture/LVAlternatingWideGripSeatedRowH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(389,'Lever Alternating Narrow Grip Seated Row (plate loaded)','Sit on seat and position chest against pad. Grasp lever handles with underhand grip.','Pull one lever back until elbow is behind back and shoulder is pulled back. Return until arm is extended and shoulder is stretched forward. Repeat with opposite arm, alternating between sides.','upload/exercise-picture/LVSeatedRowAlternatingNarrowH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(390,'Lever Wide Grip Seated Row (high bar, plate loaded)','Sit on seat and position chest against pad. Grasp lever handles with underhand grip.','Pull levers back until elbows are behind back and shoulders are pulled back. Return until arms are extended and shoulders are stretched forward. Repeat.','upload/exercise-picture/LVWideGripSeatedRowH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(391,'Lever Wide Grip Seated Row (plate loaded)','Sit on seat and position chest against pad. Grasp lever handles with underhand grip.','Pull levers back until elbows are behind back and shoulders are pulled back. Return until arms are extended and shoulders are stretched forward. Repeat.','upload/exercise-picture/LVSeatedRowWideH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(392,'Lever Seated High Row (plate loaded)','Sit on seat and position chest against pad. Grasp lever handles with overhand grip.','Pull lever back until elbows are behind back and shoulders are pulled back. Return until arms are extended and shoulders are stretched forward. Repeat.','upload/exercise-picture/LVSeatedHighRowH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(393,'Lever Straight Back Seated Row (no chest pad, plate loaded)','Sit on seat with feet positioned on foot bar or platform. Grasp handles with each hand. Position torso upright with knees bent slightly.','Pull handles to body. Pull shoulders back and lift chest by arching back. Return until arms are extended, back is straight, and shoulders are stretched forward. Repeat.','upload/exercise-picture/LVStrBackSeatedRowNoPadPL.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(394,'Lever Seated Low Row (plate loaded)','Sit on seat and position chest against pad. Grasp lever handles with overhand/neutral grip.','Pull levers back until elbows are behind back and shoulders are pulled back. Return until arms are extended and shoulders are stretched forward. Repeat.','upload/exercise-picture/LVSeatedLowRowH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(395,'Lever Seated Row (no chest pad, plate loaded)','Sit on seat and grasp handles with each hand. Place feet on vertically angled platform. Slide hips back with knees slightly bent.','Pull handles to waist while straightening torso upright. Pull shoulders back and push chest forward while arching back. Return until arms are extended, shoulders are stretched forward, and lower back is flexed forward. Repeat.','upload/exercise-picture/LVSeatedRowNoPadPL.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(396,'Lever Close Grip T-bar Row (plate loaded)','Bend knees slightly and bend over lever handles with back straight. Grasp parallel lever handles.','Pull handles up to waist. Return until arms are extended and shoulders are stretched downward. Repeat.','upload/exercise-picture/LVCloseGripTBarRowPL.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(398,'Lever T-bar Row (plate loaded)','Bend knees slightly and bend over lever handles with back straight. Grasp lever handles with shoulder width to wide overhand grip.','Pull lever up to torso. Return until arms are extended and shoulders are stretched downward. Repeat.','upload/exercise-picture/LVBentOverRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(399,'Lever Alternating Underhand Seated Row (plate loaded)','Sit on seat and position chest against pad. Grasp lever handles with underhand grip.','Pull one lever back until elbow is behind back and shoulder is pulled back. Return until arm is extended and shoulder is stretched forward. Repeat with opposite arm, alternating between sides.','upload/exercise-picture/LVAlternatingSeatedUnderhandRowH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(401,'Lever Seated High Row','Sit on seat and position thighs under pad. Lean\n\nforward\n\nand grasp lever handles above.','Pull lever down while leaning back slightly. As elbows travel to sides, lift chest slightly and pull shoulders and elbows back. Return until arms are extended and body and shoulders are stretched forward. Repeat.','upload/exercise-picture/LVHighRowB.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(402,'Lever Seated Row','Sit on seat and position chest against pad. Push foot lever if available. Grasp narrower parallel grip handles.','Pull lever back until elbows are behind back and shoulders are pulled back. Return until arms are extended and shoulders are stretched forward. Repeat.','upload/exercise-picture/LVSeatedRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(403,'Lever Alternating Seated High Row','Sit on seat and position chest against pad. Grasp lever handles with overhand grip.','Pull one lever handle back until elbow is behind back and shoulder is pulled back. Return until arm is extended and shoulder is stretched forward. Repeat with opposite arm, alternating between sides.','upload/exercise-picture/LVAlternatingHighRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(405,'Lever Underhand Seated Row (plate loaded)','Sit on seat and position chest against pad. Grasp lever handles with underhand grip.','Pull levers back until elbows are behind back and shoulders are pulled back. Return until arms are extended and shoulders are stretched forward. Repeat.','upload/exercise-picture/LVSeatedUnderhandRowH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(406,'Lever Wide Grip Seated Row','Sit on seat and position chest against pad. Grasp outer lever handles with overhand grip.','Pull lever back until elbows are behind back and shoulders are pulled back. Return until arms are extended and shoulders are stretched forward. Repeat.','upload/exercise-picture/LVWideGripSeatedRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(407,'Lever Alternating Underhand Seated Row','Sit on seat and position chest against pad. Grasp lever handles with underhand grip.','Pull one lever handle back until elbow is behind back and shoulder is pulled back. Return until arm is extended and shoulder is stretched forward. Repeat with opposite arm, alternating between sides.','upload/exercise-picture/LVAlternatingUnderhandSeatedRowS.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(408,'Lever Underhand Seated Row','Sit on seat and position chest against pad. Grasp lever handles with underhand grip.','Pull lever handles back until elbows are behind back and shoulders are pulled back. Return until arms are extended and shoulders are stretched forward. Repeat.','upload/exercise-picture/LVUnderhandSeatedRowS.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(410,'Lever Seated Row (no chest pad)','Sit on seat and grasp handles with each hand. Place feet on vertically angled platform. Slide hips back with knees slightly bent.','Pull handles to waist while straightening torso upright. Pull shoulders back and push chest forward while arching back. Return until arms are extended, shoulders are stretched forward, and lower back is flexed forward. Repeat.','upload/exercise-picture/LVSeatedRowNoPad.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(411,'Lever Straight Back Seated Row (no chest pad)','Sit on seat with feet positioned on foot bar or platform. Grasp handles with each hand. Position torso upright with knees bent slightly.','Pull handles to body. Pull shoulders back and lift chest by arching back. Return until arms are extended, back is straight, and shoulders are stretched forward. Repeat.','upload/exercise-picture/LVStraightBackSeatedRowNoPad.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(412,'Inverted Row (feet elevated)','Lay on back under fixed horizontal bar. Grasp bar with wide overhand grip. Place back of heels on elevated surface.','Keeping body straight, pull body up to bar. Return until arms are extended and shoulders are stretched forward. Repeat.','upload/exercise-picture/BWSupineRowFeetElevated.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(413,'Smith Bent-over Row','Bend knees slightly and bend over bar with back straight. Grasp bar with wide overhand grip. Disengage bar by rotating bar back.','Pull bar to upper waist. Return until arms are extended and shoulders are stretched downward. Repeat.','upload/exercise-picture/SMBentoverRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(414,'Inverted Row','Lay on back under fixed horizontal bar. Grasp bar with wide overhand grip.','Keeping body straight, pull body up to bar. Return until arms are extended and shoulders are stretched forward. Repeat.','upload/exercise-picture/BWSupineRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(415,'Weighted Inverted Row','Lay on back under fixed horizontal bar. Grasp bar with wide overhand grip. Place back of heels on elevated surface.','Keeping body straight, pull body up to bar. Return until arms are extended and shoulders are stretched forward. Repeat.','upload/exercise-picture/WTInvertedRowFeetElevated.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(417,'Inverted Row (on hips)','Lay on back with belly under fixed horizontal bar. Bend knees and position feet on floor. Grasp bar with wide overhand grip.','Comments','upload/exercise-picture/BWSupineRowOnHip.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(419,'Inverted Row (high bar)','Stand facing arms length away from waist to head height horizontal bar. Grasp bar with wide overhand grip. Position body under bar with legs, hips and spine straight. Arms should be straight, approximately perpendicular to body. Heels should make contact with floor.','Keeping body straight, pull body up to bar. Return until arms are extended and shoulders are stretched forward. Repeat.','upload/exercise-picture/BWSupineRowHigh.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(420,'Suspended Row','Grasp suspension handles and momentarily step back until arms are extended forward and straight. While keeping arms straight and shoulders back, step forward so body reclines back behind suspension handles. Position body and legs straight at desired angle, hanging from handles with arms straight.','Pull body up so sides of chest make contact with handles while keeping body and legs straight. Return until arms are extended straight and shoulders are stretched forward. Repeat.','upload/exercise-picture/STRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(421,'Fixed Bar Back Stretch','Stand facing stationary bar. Grasp stationary bar with one hand approximately waist height.','Bend over allowing hips to fall back. Slightly lean torso toward stretched arm. Hold stretch. Repeat with opposite side.','upload/exercise-picture/2febe4db68138ccd83658bc2e5387d62.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(422,'Suspended Inverted Row','Position suspension handles higher than arms\' length above floor. Sit on floor and grasp handles. Position body supine hanging from handles with arms straight, shoulders under handles, body straight, and back of heels on floor.','Pull body up so sides of chest make contact with handles while keeping body straight. Return until arms are extended straight and shoulders are stretched forward. Repeat.','upload/exercise-picture/STInvertedRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(423,'Suspended Bent-knee Inverted Row','Position suspension handles higher than arms\' length above floor. Sit on floor and grasp handles. Hang shoulders under handles with arms straight, back and hips straight, with knees bent and feet flat on floor.','Pull body up so sides of chest make contact with handles while keeping body straight. Return until arms are extended straight and shoulders are stretched forward. Repeat.','upload/exercise-picture/STInvertedRowLowKneesBent.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(424,'Lever Back Stretch','Sit on seat in forward position with lower legs on shin pad, feet on foot rest. Place hands through wrist straps. Hold upper bar with arms crossed, overhand grip.','Push and lower seat back. Hold stretch. Repeat with opposite arm position.','upload/exercise-picture/PCCrosshand8.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(425,'Suspended Power Pull','Grasp suspension handle(s) with one hand. Step back until handle is chest height when held to side of chest. Facing suspension apparatus with feet shoulder width apart, point other arm and its shoulder forward, parallel with angle of strap.','Rotate body and extended arm, reaching outward while lowering body downward by extending arm holding onto handle. Extend arms and shoulders in-line with suspension strap so body is angled back to one side. Return by raising body back upward in opposite motion, reaching outward and toward suspension strap while pulling handle back to side of chest until body is upright and arm parallel with angle of strap. Repeat and continue with opposite side.','upload/exercise-picture/STPowerPull.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(426,'Barbell Pullover','Lie upper back perpendicular on bench. Flex hips slightly. Grasp barbell from behind and position over chest with elbows bent slightly.','With elbows bent slightly, lower bar over and beyond head until shoulders are fully flexed or upper arms are approximately parallel to torso. Return and repeat.','upload/exercise-picture/BBPullover.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(427,'Machine-assisted Pull-up (open-centered bar)','Step up and grasp bar with wide overhand grip. Kneel on padded platform and lower body down with arm extended.','Pull body up until neck reaches height of hands. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/ASPullUpKneelingOpen.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(428,'Machine-assisted Parallel Close Grip Pull-up (standing)','Step up and grasp parallel grips. Step down onto assistance lever or platform.','Pull body up until elbow are to sides. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/AsCloseGripPullup.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(429,'Machine-assisted Pull-up','Step up and grasp bar with wide overhand grip. Kneel on padded platform and lower body down with arm extended.','Pull body up until neck reaches height of hands. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/ASPullupKneeling.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(430,'Machine-assisted Pull-up (open-centered bar, standing)','Step up and grasp bar with wide overhand grip. Step down onto assistance lever or platform.','Pull body up until neck reaches height of hands. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/AsPullup.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(431,'Machine-assisted Chin-up','Step up and grasp bar with underhand shoulder width grip. Kneel onto platform or step onto bar.','Pull body up until elbows are to sides. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/ASUnderhandChinupKneeling.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(432,'Cable One Arm Pulldown','Grasp stirrup in one hand. Sit with thighs under supports.','Pull down cable attachment to side of chest. Return until arm and shoulder is fully extended, allowing shoulder to raise. Repeat and continue with other arm.','upload/exercise-picture/CBOneArmPulldown.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(433,'Barbell Bent Arm Pullover','Lie upper back perpendicular on bench. Flex hips slightly. Grasp barbell from behind and position over chest with elbows bent approximately 90°.','With elbow bent, lower bar over and just behind head until upper arm is approximately parallel to torso. Return and repeat.','upload/exercise-picture/BBBentArmPullover.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(434,'Cable Close Grip Pulldown','Grasp parallel cable attachment. Sit with thighs under supports.','Pull down cable attachment to upper chest. Return until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/CBCloseGripPulldown.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(435,'Machine-assisted Parallel Close Grip Pull-up','Step up and grasp parallel grips. Kneel on padded platform and lower body down with arm extended.','Pull body up until elbows are to sides. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/ASCloseGripPullUpKneeling.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(436,'Cable Alternating Close Grip Pulldown','Grasp stirrups in each hand. Sit with thighs under supports.','Pull down one cable attachment to side of chest. Return until arm and shoulder is fully extended. Repeat with opposite arm, alternating between sides.','upload/exercise-picture/LVAlternatingCloseGripPulldown.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(437,'Cable One Arm Kneeling Pulldown','Grasp stirrup in one hand and kneel on floor.','Pull down cable attachment to side of chest. Return until arm and shoulder is fully extended, allowing shoulder to raise. Repeat and continue with other arm.','upload/exercise-picture/CBOneArmKneelingPulldown.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(438,'Cable Pulldown','Grasp cable bar with wide grip. Sit with thighs under supports.','Pull down cable bar to upper chest. Return until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/CBFrontPulldown.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(439,'Cable Close Grip Pulldown (stirrups)','Grasp stirrups in each hand. Sit with thighs under supports.','Pull down cable attachments to sides of chest. Return until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/CBCloseGripPulldownStirrups.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(440,'Cable Kneeling Bent-over Pulldown','Kneel on mat slightly away from high pulley. Grasp cable rope attachment with both hands. Sit with hips back and bend down by flexing hips so torso is bent over at approximately 30º angle. Allow resistance on cable pulley to pull arms upward with elbows bent.','Pull cable rope down until elbows are back and inside of rope attachment is behind neck. Return attachment over head until shoulder is completely flexed upward. Repeat.','upload/exercise-picture/KneelingBentOverPulldown.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(441,'Cable Parallel Grip Pulldown','Grasp parallel cable attachment. Sit with thighs under supports.','Pull down cable attachment to upper chest. Return until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/CBParallelGripPulldown.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(442,'Cable Alternating Pulldown','Grasp stirrups in each hand. Sit with thighs under supports.','Pull down one cable attachment to front side shoulder. Return until arm and shoulder are fully extended. Repeat with opposite arm, alternating between sides.','upload/exercise-picture/CBAlternatingPulldown.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(443,'Cable Pullover','Lie upper back perpendicular on bench. Flex hips slightly, so hips are slightly lower than torso. Grasp revolving barbell cable attachment from behind. Pull to position cable attachment over chest. Fix elbows with small bend.','Lower cable attachment toward pulley with elbows bent only slightly. Lower until shoulders are fully flexed or upper arms are in-line with upper torso. Raise cable attachment over head and continue toward lower body until cable becomes very close to head. Repeat.','upload/exercise-picture/CBPullover.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(444,'Cable Pulldown (pro lat bar)','Grasp pro lat bar with wide parallel grip. Sit with thighs under supports.','Pull down cable bar to upper chest. Return until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/CBFrontPulldownProBar.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(445,'Cable Pulldown (stirrups)','Grasp stirrups in each hand. Sit with thighs under supports.','Pull down cable attachments to front sides of shoulders. Return until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/CBPulldownStirrups.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(446,'Cable Bent-over Pullover','Face high pulley and grasp revolving cable attachment with arm slightly bent. Place one foot slightly back and bend over at hip until shoulder is fully flexed (upper arms at sides of head).','With elbows fixed approximately 30°, pull cable attachment down until upper arms are to sides. Return attachment overhead. Repeat.','upload/exercise-picture/CBStraightArmPullDown.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(447,'Cable Parallel Close Grip Pull-up','Place dip belt around waist. Kneel as close as possible to low pulley or lever and attach hook to dip belt in front between legs. Step up and grasp close grip p\n\n\narallel bars with hands facing inward. Lift legs off of steps or floor.','Pull body up until elbow are to sides. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/CBParallelCloseGripPullup.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(448,'Cable Chin-up','Place dip belt around waist. Kneel close to low pulley or lever and attach hook to dip belt chains. Step up and grasp bars with shoulder width underhand grip. Lift legs off of steps or floor.','Pull body up until elbow are to sides. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/CBChinup.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(449,'Cable Parallel Grip Pull-up','Place dip belt around waist. Kneel as close as possible to low pulley or lever and attach hook to dip belt in front between legs. Step up and grasp parallel bars with hands facing inward. Lift legs off of steps or floor.','Pull body up until elbow are to sides. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/LVPullup.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(450,'Cable Seated Pullover','Sit on bench facing away from cable pulley apparatus. Grasp revolving cable attachment over head with overhand grip.','With elbows fixed with slight bend, pull cable attachment forward and down as far as possible. Return cable attachment forward and overhead. Repeat.','upload/exercise-picture/CBSeatedStraightArmPulldown.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(451,'Cable Rear Pull-up','Place dip belt around waist. Kneel close to low pulley or lever and attach hook to dip belt. Step up and grasp bars with overhand wide grip. Lift legs off of steps or floor.','Pull body up until bar touches back of neck. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/CBRearPullup.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(452,'Cable Pull-up','Place dip belt around waist. Kneel close to low pulley or lever and attach hook to dip belt. Step up and grasp bars with overhand wide grip. Lift legs off of steps or floor.','Pull body up until chin is above bar. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/CBPullup.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(453,'Cable Rear Pulldown','Grasp cable bar with wide grip. Sit with thighs under supports.','Pull cable bar down behind neck. Return until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/CBRearPulldown.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(454,'Lever Close Grip Pulldown (plate-loaded)','Grasp handles and sit with thighs under padded supports.','Pull down handles to sides of chest while leaning back slightly. Return until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/LVCloseGripPulldownPL.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(455,'Cable Twisting Standing Overhead Pull','Stand facing very high pulley. Grasp stirrup in one hand and step back so arm is straight. With leg of opposite side as loaded arm, plant forefoot far back on floor. Slightly bend knee of forward leg, same direction as foot.','Pull down cable attachment to side of chest and rotate body toward side of pulling arm. Return until arm and shoulder is fully extended, allowing shoulder to raise. Repeat. Continue with opposite arm.','upload/exercise-picture/CBStandTwistPulldownOpStance.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(456,'Cable Underhand Pulldown','Grasp cable bar with underhand grip. Sit with thighs under supports.','Pull down cable bar to upper chest until elbows are to sides. Return until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/CBUnderhandPulldown.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(457,'Lever Rear Pulldown (plate loaded)','Grasp lever bar with wide grip. Sit with thighs under supports.','Pull lever bar down behind neck. Return until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/LVRearPulldownPL.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(458,'Lever Pulldown (plate loaded)','Grasp handles to each side with overhand grip. Sit on seat and position thighs under leg pads.','Pull levers down to sides of shoulders. Return until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/LVPulldownH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(459,'Lever Underhand Pulldown (plate loaded)','Grasp lever handles with underhand grip. Sit with thighs under supports.','Pull down lever handles toward sides until elbows are to sides. Return until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/LVUnderhandPulldownH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(460,'Lever Front Pulldown (plate loaded)','Grasp lever bar with wide grip. Sit with thighs under supports.','Pull down lever bar to upper chest. Return until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/LVFrontPulldownPL.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(462,'Lever Pullover (plate loaded)','Adjust seat height so lever is near shoulder axis. Sit on machine. Place elbows on pads and grasp bar from behind.','Pull lever forward and down until elbows are to sides. Return until shoulders are fully flexed, or upper arms are parallel to torso. Repeat.','upload/exercise-picture/LVPulloverH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(463,'Lever Close Grip Pulldown','Grasp parallel lever bars. Sit with thighs under supports.','Pull down handles to sides of chest while leaning back slightly. Return until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/LVCloseGripPulldown.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(464,'Lever Front Pulldown','Grasp lever handles. Sit with thighs under supports.','Pull down lever to upper chest. Return until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/LVFrontPulldown.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(465,'Lever Iron Cross','Stand on platform and grasp handles to sides with palms down grip.','With arms straight, pull lever handles down below hips. Return lever handles upward just above shoulder high, or just before slight pressure in shoulder is felt. Repeat.','upload/exercise-picture/LVIronCross.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(467,'Lever Underhand Pulldown','Grasp lever handles with underhand grip. Sit with thighs under supports.','Pull down lever handles to sides until elbows are to sides. Return until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/LVBiLateralUnderhandPulldownS.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(468,'Lever Pullover','Adjust seat height so lever is near shoulder axis. Sit on machine and push foot lever. Place elbows on pads and grasp bar from behind. Release foot lever and place feet on platform or to sides.','Pull lever forward and down until elbows are to sides. Return until shoulders are fully flexed, or upper arms are parallel to torso. Repeat.','upload/exercise-picture/LVPullover.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(470,'Lever Pulldown','Sit on seat. Reach up and grasp handles with wide overhand grip.','Pull levers down to sides of shoulders. Return until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/LVPullDown.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(471,'Lever Pulldown (parallel grip)','Sit on seat. Reach up and grasp parallel handles.','Pull levers down to sides of shoulders. Return until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/LVPullDownParallelGrip.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(473,'Weighted Parallel Close Grip Pull-up','Step up and grasp close grip parallel bars.','Pull body up until elbow are to sides. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/WTCloseGripChinup.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(474,'Weighted Chin-up','Step up and grasp bar with underhand shoulder width grip.','Pull body up until elbows are to sides. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/WTChinUpUnderhand.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(475,'Lever Alternating Underhand Pulldown','Grasp lever handles with underhand grip. Sit with thighs under supports.','Pull down one lever handle to side until elbow is down to side. Return until arm and shoulder are fully extended. Repeat with opposite arm. Continue to alternate pulldown between arms.','upload/exercise-picture/LVAlternatingUnderhandPulldownS.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(476,'Weighted Pull-up','Step up and grasp bar with overhand wide grip.','Pull body up until chin is above bar. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/WTChinUp.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(477,'Band-assisted Pull-up','Grab each side of hanging exercise band with both hands. Stretch exercise band down and step onto bottom inside of band with one foot. Stretch band down further by extending leg straight down. Reach up and grasp bar with overhand wide grip while keeping banded leg straight.','Pull body up until chin is above bar. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/ASPullupFootBand.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(478,'Weighted Pull-up (open-centered bar)','Reach up and grasp bar with wide overhand grip.','Pull body up until neck reaches height of hands. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/WTPullUpDB.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(479,'Band-assisted Chin-up','Grab each side of hanging exercise band with both hands. Stretch exercise band down and step onto bottom inside of band with one foot. Stretch band down further by extending leg straight down. Reach up and grasp bar with underhand shoulder width grip while keeping banded leg straight.','Pull body up until elbows are to sides. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/ASChinupFootBand.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(480,'Weighted Rear Pull-up','Step up and grasp bar with overhand wide grip.','Pull body up until bar touches back of neck. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/WTRearPullup.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(481,'Band-assisted Parallel Grip Pull-up','Grab each side of hanging exercise band with both hands. Stretch exercise band down and step onto bottom inside of band with one foot. Stretch band down further by extending leg straight down. Reach up and grasp parallel bars while keeping banded leg straight.','Pull body up until elbow are to sides. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/ASParallelGripPullupFootBand.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(483,'Weighted Pull-up (neutral grip)','Step up and grasp bar with neutral grip.','Pull body up until neck reaches height of hands. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/WTPullUpN.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(484,'Band-assisted Neutral Grip Pull-up','Grab each side of hanging exercise band with both hands. Stretch exercise band down and step onto bottom inside of band with one foot. Stretch band down further by extending leg straight down. Reach up and grasp bar with neutral grip while keeping banded leg straight.','Pull body up until neck reaches height of hands. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/ASNeutralGripPullupFootBand.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(485,'Parallel Close Grip Pull-up','Step up and grasp parallel bars.','Pull body up until elbow are to sides. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/BWCloseGripPullup.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(486,'Band-assisted Rear Pull-up','Grasp middle of hanging exercise band and pull down to side of leg. Lift foot and hook band under heel. Stretch band down further by extending leg straight down. Face perpendicular under pullup bar and position band behind body. Pull band apart and place other foot onto band so both feet are together inside of band. Reach up and grasp pull-up bar with overhand wide grip while keeping legs straight.','Pull body up until bar touches back of neck. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/ASRearPullupFootBand.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(487,'Pull-up','Step up and grasp bar with overhand wide grip.','Pull body up until chin is above bar. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/BWWideGripChinup.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(488,'Partner-assisted Rear Pull-up','Step up and grasp bar with overhand wide grip. Bend knees so partner can assist from behind.','Pull body up until bar touches back of neck. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/AsRearPullupPartner.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(489,'Pull-up (open-centered bar)','Reach up and grasp bar with wide overhand grip.','Pull body up until neck reaches height of hands. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/BWPullUp.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(490,'Pull-up (neutral grip)','Step up and grasp bar with neutral grip.','Pull body up until neck reaches height of hands. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/BWPullUpN.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(491,'Rear Pull-up','Step up and grasp bar with overhand wide grip.','Pull body up until bar touches back of neck. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/BWRearPullup.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(492,'Partner-assisted Chin-up','Step up and grasp bar with underhand shoulder width grip. Bend knees so partner can assist from behind.','Pull body up until elbows are to sides or chin is just above bar. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/AsUnderhandChinupPartner.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(493,'Partner-assisted Pull-up','Step up and grasp bar with wide overhand grip. Bend knees so partner can assist from behind.','Pull body up until chin is just above bar. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/AsChinupPartner.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(494,'Self-assisted Rear Pull-up','Grasp bar with overhand wide grip. Position forefeet on floor just behind low bar or on bench just behind high bar.','Lower body until arms and shoulders are fully extended. If necessary, use minimal assistance of lower body to control descent allowing knees to bend. Pull body up until bar touches back of neck, again with minimal assistance from lower body. Repeat.','upload/exercise-picture/BWRearPullupSelfAssistedRear.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(495,'Self-assisted Pull-up','Stand facing fixed horizontal bar at neck height. Grasp bar with wide overhand grip. Position feet forward on floor, slightly in front of bar.','Lower body under bar until arms and shoulders are fully extended. If necessary, use minimal assistance of lower body to control descent, allowing knees and hips to bend, keeping flat on floor. Pull body up until chin is just above bar, again with minimal assistance from legs. Repeat.','upload/exercise-picture/BWChinupSelfAssistedFront.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(496,'Self-assisted Chin-up','Stand facing fixed horizontal bar at neck height. Grasp bar with underhand grip shoulder width. Position feet forward on floor, slightly in front of bar.','Lower body under bar until arms and shoulders are fully extended. If necessary, use minimal assistance of lower body to control descent, allowing knees and hips to bend, keeping flat on floor. Pull body up until elbows are to sides, again with minimal assistance from lower body. Repeat.','upload/exercise-picture/BWUnderHandChinupSelfAssistedFront.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(497,'Wheel Rollout','Kneel on floor or mat. Grasp handles on wheel to each side with overhand grip. Position wheel near front of knees and lean over wheel with arms extended downward, supporting upper body.','With arms straight, roll wheel out as far as possible. Lower body gently to floor extending arms forward. Raise body back up by flexing hips and pulling arms back to original position. Return until hips are extended. Repeat.','upload/exercise-picture/BWKneelingWheelRollout.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(498,'Suspended Rollout','Kneel on floor or mat and grasp suspension trainer handles. Position body upright with subtle bend through hip. Also, straighten arms in front of body with slight bend.','Lean body forward while maintaining small bend in hip. Allow arms to bend forward to sides of head. Bend over as far as possible. Raise body back up by pulling arms back until kneeling upright in original position. Repeat.','upload/exercise-picture/STKneelingRollout.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(499,'Suspended Self-assisted Pull-up','Stand facing suspension handles placed at neck height. Grasp handles and position feet forward on floor, slightly in front of handles.','Lower body under handles until arms and shoulders are fully extended. If necessary, use minimal assistance of lower body to control descent, allowing knees and hips to bend, keeping flat on floor. Pull body up until chin is just above handles, again with minimal assistance from legs. Repeat.','upload/exercise-picture/STSelfAssistedPullup.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(500,'Bar Lat Stretch','Standing distance facing bar approximately lower chest height. Grasp bar with both hands. Lean body forward so bar is behind/under bar and arms are to sides of head. Feet are keep away from bar.','Allow upper body to hang downward while keeping arms to sides of head. Hold stretch.','upload/exercise-picture/01d980e27b31196413c44429d1bf8e00.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(501,'Suspended Pull-up','Grasp high suspension handles.','Pull body up until neck reaches height of hands. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/STPullup.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(502,'Bent-over Lat Stretch (on chair or bench)','Kneel in front of chair on floor or mat. Place inside of crossed arms on end of chair and position head between arms.','Lower torso. Hold stretch.','upload/exercise-picture/Bentover.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(503,'Stability Ball Rollout','Kneel on floor or mat facing stability ball within arm\'s reach. Straighten hips with subtle bend. Also straighten arms with slight bend, down in front of body. Place fists side by side on upper side of ball closest to hips.','Lean forward and roll ridged arms out over ball. Roll forward as far as possible. Raise body back up by pulling arms back until kneeling upright in original position. Repeat.','upload/exercise-picture/BWRolloutBall.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(504,'Lever Lat Stretch','Sit on seat in forward position with lower legs on shin pad, feet on foot rest. Place hands through wrist straps. Hold upper bar with underhand grip.','Push and lower seat back. Hold stretch.','upload/exercise-picture/PCUnderhand8.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(505,'Bent-over Lat Stretch','Kneel on mat or floor. Extend arms well beyond knees and place forearms on floor.','Lower torso as far down as possible and sit back. Hold stretch.','upload/exercise-picture/BentoverFloorLat.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(506,'Overhead Lat Stretch','Put one arm overhead. Grasp elbow or wrist overhead with other hand.','Pull elbow toward head and back or pull arm down toward opposite shoulder. Lean torso to side, away from direction of arm behind head. Hold stretch. Repeat with opposite arm.','upload/exercise-picture/StandingSideBendLat.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(507,'Seated Side Reach Lat Stretch','Sit on bench or floor. Place one arm down to side on bench or floor, slightly behind for support. Put opposite arm overhead.','Lean and reach to side away from raised arm. Hold stretch. Repeat with opposite arm.','upload/exercise-picture/524bb061bc1d45f04e9d210ca87e864b.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(508,'Standing Side Reach Lat Stretch','Stand with feet far apart. Place one arm on side of thigh. Put opposite arm overhead.','Lean and reach to side away from raised arm. Hold stretch. Repeat with opposite arm.','upload/exercise-picture/7926682b1fd64e1118a13f8b734fecef.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(509,'Wall Lat Stretch','Standing toward wall. Bend over and place palms of hands on wall, approximately shoulder width and waist height.','Lower torso. Hold stretch.','upload/exercise-picture/8ba64011570f73050fcd1c3d26fe4b02.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(510,'PNF Overhead Lat Stretch','Instruct participant to stand or sit on floor, chair, or bench and place arm overhead. Standing behind participant, grasp their wrist and position their forearm behind their head.','Pull participant\'s wrist toward back of shoulder. Lean torso to side, away from direction of arm behind head. Hold stretch. Repeat with opposite arm.','upload/exercise-picture/af32125548f8472201151459ae3d6336.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(511,'Cambered Barbell Seated Shrug','Sit on end of bench and grasp cambered bar from beneath with overhand or mixed grip.','Elevate shoulders as high as possible. Lower and repeat.','upload/exercise-picture/CMBSeatedShrug.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(512,'Trap Bar Shrug','Step into trap barbell and stand holding handles of trap bar to sides.','Elevate shoulders as high as possible. Lower and repeat.','upload/exercise-picture/TBShrug.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(513,'Cable Bar Shrug','Position adjustable pulleys at low position. Stand close to cable bar and grasp with shoulder width or slightly wider overhand grip.','Elevate shoulders as high as possible. Lower and repeat.','upload/exercise-picture/CBBarShrug.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(514,'Barbell Shrug','Stand holding barbell with overhand or mixed grip; shoulder width or slightly wider.','Elevate shoulders as high as possible. Lower and repeat.','upload/exercise-picture/BBShrug.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(515,'Trap Bar Shrug (elevated stand)','Step into elevated trap bar stand. Bend down and grasp handles of apparatus to sides. Stand upright.','Elevate shoulders as high as possible. Lower and repeat.','upload/exercise-picture/SBShrugStand.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(516,'Cable Shrug (with stirrups)','Stand between two low pulleys and grasp stirrups to each side. Stand upright with arms straight down to each side.','With arms straight, elevate shoulders as high as possible. Lower and repeat.','upload/exercise-picture/CBShrugStirrups.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(517,'Cable Shrug','Stand facing low pulley and grasp cable bar with shoulder width or slightly wider overhand grip. Stand close to pulley.','With arms straight, elevate shoulders as high as possible. Lower and repeat.','upload/exercise-picture/CBShrug.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(518,'Cable One Arm Shrug','Grasp stirrup with one hand and stand close to low pulley to side.','With arms straight, elevate shoulder as high as possible. Lower and repeat.','upload/exercise-picture/CBOneArmShrug.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(519,'Dumbbell Shrug','Stand holding dumbbells to sides.','Elevate shoulders as high as possible. Lower and repeat.','upload/exercise-picture/DBShrug.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(520,'Cable Shrug (dual pulley)','Stand between two low pulleys and grasp stirrups to each side. Stand upright with arms straight down to each side.','With arms straight, elevate shoulders as high as possible. Lower and repeat.','upload/exercise-picture/CBShrugDualPulley.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(521,'Lever Gripless Shrug (plate loaded)','Stand with shoulders under padded lever.','Elevate shoulders as high as possible. Lower and repeat.','upload/exercise-picture/LVGriplessShrugPL.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(522,'Lever Narrow Grip Shrug (plate loaded)','Stand very near to close lever handles. Bend over and grasp handles with each hand. Stand upright.','Elevate shoulders as high as possible. Lower and repeat.','upload/exercise-picture/LVShrugNarrow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(523,'Lever Shrug (plate loaded)','Stand between lever handles to sides. Squat down with feet flat on floor and grasp upper handles to sides. Stand upright by extending hips and knees to full extension.','Elevate shoulders as high as possible. Lower and repeat.','upload/exercise-picture/LVShrugH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(524,'Lever Seated Gripless Shrug','Sit on seat and place forearms in padded bars.','Elevate shoulders as high as possible. Lower and repeat.','upload/exercise-picture/LVSeatedGriplessShrug.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(525,'Lever Barbell Shrug (plate loaded)','Stand behind bar mid-thigh height. Stand grasping bar with shoulder width or slightly wider overhand grip. Disengage bar by rotating bar back and stand upright.','Elevate shoulders as high as possible. Lower and repeat.','upload/exercise-picture/LVSMShrug.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(526,'Lever Shrug','Stand holding lever bar with shoulder width overhand or mixed grip.','Elevate shoulders as high as possible. Lower and repeat.','upload/exercise-picture/LVShrug.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(527,'Smith Shrug','Stand grasping smith bar with shoulder width or slightly wider overhand grip. Disengage bar by rotating bar back.','Elevate shoulders as high as possible. Lower and repeat.','upload/exercise-picture/SMShrug.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(528,'Lever Seated Shrug (plate loaded)','Sit on bench and grasp lower handles to each side. Sit upright.','Elevate shoulders as high as possible. Lower and repeat.','upload/exercise-picture/LVSeatedShrugH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(529,'Inverted Shrug (on parallel bars)','Stand between parallel bars. Squat down and grasp parallel bars from above. Kick legs up inverting and balancing body upside down. Legs can be kept bent or straight, positioned vertically.','Raise body up a high as possible by pulling shoulders toward ears. Lower body to original position and repeat.','upload/exercise-picture/BWBentKneeInvertedShrug.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(530,'Sled Gripless Shrug','Stand with shoulders under padded bar.','Elevate shoulders as high as possible. Lower and repeat.','upload/exercise-picture/SLGriplessShrug.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(531,'Lever Gripless Shrug','Stand with shoulders under padded lever.','Elevate shoulders as high as possible. Lower and repeat.','upload/exercise-picture/LVGriplessShrug.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(532,'Upper Trapezius Stretch','Grasp wrist or hand from behind and pull arm to opposite side','Tilt head away from lowered shoulder by positioning ear toward front of opposite shoulder. Hold stretch. Repeat to other side.','upload/exercise-picture/90b391614b804836394c8232d1f1bc8b.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(533,'Suspended Inverted Shrug','Grasp gymnastics rings, one in each hand. Sit on mat between parallel bars. Kick legs up inverting and balancing body upside down.','Raise body up a high as possible by pulling shoulders toward ears. Lower body to original position and repeat.','upload/exercise-picture/BWInvertedShrugsRings.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(534,'Fixed Bar Rhomboids Stretch','Stand facing very close to stationary bar. Grasp stationary bar with both hands just below chest height.','Lean back allowing body and hips to fall back and shoulders to be pulled forward. Hold stretch.','upload/exercise-picture/d3bb866a867c108318859f20ac343f44.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(535,'Hugging Stretch','Cross both arms and place both hands behind shoulders of opposite arms.','Bring elbows closer together in front of body. Raise elbows slightly and hold stretch.','upload/exercise-picture/247d61a1ccbd2df25a96521b4a9f1d46.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(536,'Dumbbell Seated Shoulder External Rotation','Sit on bench. Place foot on other side of bench and other foot on floor with knees bent. Place upper elbow on knee with dumbbell positioned above knee.','Lower dumbbell downward toward lower leg by rotating shoulder until slight stretch is felt. Return and repeat. Continue with opposite arm.','upload/exercise-picture/DBSeatedShoulderExternalRotation.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(537,'Cable Seated Shoulder External Rotation','Sit with side to low pulley. Grasp dumbbell cable attachment with far arm. Position elbow against side and forearm across belly.','Pull cable attachment away from body by externally rotating shoulder. Return and repeat. Turn around and continue with opposite arm.','upload/exercise-picture/CBSeatedExternalRotation.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(538,'Dumbbell Lying Shoulder External Rotation','Lie on side with legs separated for support. Grasp dumbbell and position elbow against side and forearm across belly.','Lift dumbbell by rotating shoulder. Return and repeat. Flip over and continue with opposite arm.','upload/exercise-picture/DBLyingExternalRotation.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(539,'Dumbbell Incline Shoulder External Rotation','Lie high up on low incline bench or reverse on decline bench on side with arm pit over leg pad (as demonstrated). Position legs lower on bench for support. Grasp dumbbell and position elbow against side and forearm across belly.','Lift dumbbell upright above elbow by rotating shoulder. Return and repeat. Flip body over and continue with opposite arm.','upload/exercise-picture/DBExternalRotationDecline.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(540,'Cable Upright Shoulder External Rotation','Stand facing low to medium height cable pulley. Grasp stirrup attachment and position bent elbow shoulder height out to side with forearm in line with cable.','Pull stirrup up and back as far as possible. Return by lowering stirrup to original position. Repeat. Continue with opposite arm.','upload/exercise-picture/CBExternalShoulderRotation2.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(541,'Dumbbell Upright Shoulder External Rotation','Stand or sit with dumbbell positioned out to side of head; bend elbow, shoulder height with dumbbell above elbow.','Lower dumbbell forward by rotating shoulder. Return and repeat. Continue with opposite arm.','upload/exercise-picture/DBUprightShoulderExtRotation.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(542,'Cable Standing Shoulder External Rotation','Stand with side to elbow height cable pulley. Grasp stirrup attachment with far arm. Position elbow against side and forearm across belly.','Pull cable attachment away from body as far as possible by externally rotating shoulder. Return and repeat. Turn around and continue with opposite arm.','upload/exercise-picture/CBStandingExternalRotation.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(543,'Lever Shoulder External Rotation','Place elbow on forearm pad and grasp handle with upper arm to side of body and forearm against body.','Pull lever away from body. Return and repeat. Adjust lever to opposite side and repeat with other arm.','upload/exercise-picture/LVShoulderExternalRotation.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(544,'Dumbbell Upright Shoulder External Rotation (with support)','Stand or sit with side against chest height platform. With dumbbell in hand, position upper arm horizontally on platform, elbow bent so forearm is upright.','Lower dumbbell forward by rotating shoulder. Return and repeat. Continue with opposite arm.','upload/exercise-picture/DBStandingExternalRotationSupport.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(545,'Lever Upright Shoulder External Rotation','Lever should be forward with lever handle down. Push elbow pad forward with forearm, grasp handle with overhand grip. Sit on seat with arm pads and lever to side and position in elbow pad at shoulder height. With opposite hand, grasp seat handle if available, for added stability.','Pull lever handle upward and back as far as possible by rotating upper arm. Lower lever to original position. Repeat. Continue with opposite arm.','upload/exercise-picture/LVUprightExternalRotation.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(546,'Lever Shoulder External Rotation (plate loaded)','Lie supine on section of bench nearest pads to each side. Position body so shoulders and elbows are aligned to fulcrum on each side. Place wrists or back of hands on under upper set of pads to each side.','Pull both lever arms back and down as far as possible to each side of head by simultaneously rotating upper arms. Lower lever arms to original position and repeat.','upload/exercise-picture/LVShoulderExternalRotationPL.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(547,'Side Lying Infraspinatus Stretch','Lie supine on mat or floor with knees bent approximately 90 degrees. Position hand under side of waist, palm down.','Allow legs and hips to fall to side of positioned arm. Hold stretch. Repeat on opposite side.','upload/exercise-picture/e83cc4e80c252e68fe01e3d0a4891143.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(548,'Seated Bent-over Infraspinatus Stretch','Sit on bench or chair. Place both hands on waist with thumbs facing forward. Lean over and rest torso on thighs.','Allow elbows to fall downward toward floor. Hold stretch.','upload/exercise-picture/681599629550fe54ecfdc24bff39e6db.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(549,'Bent-over Infraspinatus Stretch','Place both hands on waist with thumbs facing forward. Bend over so torso is parallel to floor.','Allow elbows to fall downward toward floor. Hold stretch .','upload/exercise-picture/af975066da66427c3e87e4ed52c67e18.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(550,'Side Lying Teres Minor Stretch','Lie down on side on mat or floor. Position arm on floor with bent elbow positioned forward on mat and hand above elbow. With other hand, grasp back of wrist.','Keeping elbow bend at a right angle, push forearm downward toward floor. Hold stretch. Repeat on opposite side.','upload/exercise-picture/ae28a6393c675efab53e9fbae0240a63.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(551,'Broom Stick Infraspinatus Stretch','Grasp pole at one end and position overhead with other end of pole behind opposite arm. Grasp other end of pole with hand positioned below elbow. Position elbow at height of shoulder.','Pull upper end of pole forward so shoulder is internally rotated. Hold stretch. Repeat with opposite arm.','upload/exercise-picture/f9fdd43b88238a8e619a6d655b251781.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(552,'Suspended Shoulder External Rotation','Grasp suspension handles and position bent elbows to each sides of waist.','Pull handles apart from each side, while keeping fixed elbow position and body and legs straight throughout movement. Raise forward so handles are to each side of body. Return back until handles come back together in front of body. Repeat.','upload/exercise-picture/STShoulderExternalRotation.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(553,'Dumbbell Shoulder Internal Rotation (on floor)','Hold dumbbell in one hand. Lie on mat with dumbbell in hand. Position upper arm on mat close to body. Bend elbow approximately 90° with dumbbell held upright above elbow.','Maintaining 90° bend in elbow, lower dumbbell toward floor until slight stretch is felt in shoulder. Lift dumbbell toward body by internally rotating shoulder until forearm is vertical and repeat. Continue with opposite arm.','upload/exercise-picture/DBInternalRotationFloor.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(554,'Cable Standing Shoulder Internal Rotation','Stand with side to elbow height cable pulley. Grasp cable stirrup with near arm. Position elbow against side with elbow bent approximately 90°.','Pull cable stirrup toward body by internally rotating shoulder until forearm is across belly. Return and repeat. Continue with opposite arm.','upload/exercise-picture/CBStandingInternalRotation.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(555,'Dumbbell Shoulder Internal Rotation (on bench)','Hold dumbbell in one hand. Lie on bench close to edge on side with dumbbell in hand. Position elbow on edge of bench against side of body with elbow bent approximately 90°. Position legs on bench for support.','Maintaining 90° bend in elbow, lower dumbbell away from body until slight stretch is felt in shoulder. Lift dumbbell toward body by internally rotating shoulder until forearm is across belly. Continue with opposite arm.','upload/exercise-picture/DBInternalRotation.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(556,'Lever Shoulder Internal Rotation','Place elbow on forearm pad and grasp handle with upper arm to side of body and forearm away from body.','Pull lever toward from body. Return and repeat. Adjust lever to opposite side and repeat with other arm.','upload/exercise-picture/LVShoulderInternalRotation.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(557,'Cable Seated Shoulder Internal Rotation','Sit with side to low pulley. Grasp cable stirrup with near arm. Position elbow against side with elbow bent approximately 90°.','Pull cable stirrup toward body by internally rotating shoulder until forearm is across belly. Return and repeat. Continue with opposite arm.','upload/exercise-picture/CBInternalRotation.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(558,'Lever Shoulder Internal Rotation (plate loaded)','Lie supine on section of bench furthest away from pads to each side. Position body so shoulders and elbows are aligned to fulcrum on each side. Place wrists or hands on under lower set of pads to each side of head.','Pull lever arms upward and toward each side of torso as far as possible by simultaneously rotating upper arms. Lower lever arms to original position and repeat.','upload/exercise-picture/LVShoulderInternalRotationPL.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(559,'Doorway Subscapularis Stretch','Stand at end of wall or in doorway facing perpendicular to wall. Bent elbow and place inside of forearm on surface of wall. Position bent elbow just below height of shoulder. Place far leg forward and near leg back.','Bent over at hip while bending knees slightly. Hold stretch . Repeat with opposite arm.','upload/exercise-picture/7e7c92a3099c3dc0c2eb456ebadd0a5e.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(560,'Broom Stick Subscapularis Stretch','Grasp end of pole to side of head with other end of pole behind arm. Bring elbow forward slightly and bend wrist back. Reach around body with opposite arm and grasp lower end of pole. Place pole in middle of back side of upper arm. Position elbow at height of shoulder.','Pull lower end of pole forward so shoulder is externally rotated.. Hold stretch. Repeat with opposite arm.','upload/exercise-picture/04ab06bb0ae4639867ed65834a7aff6a.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(561,'Lever Upright Shoulder Internal Rotation','Primary lever should be positioned back with lever handle resting forward on elbow pad. Lift lever handle and sit on seat with arm pads and lever to side. Place elbow in elbow pads at shoulder height and grip handle with over hand grip so forearm is orientated upward and back. With opposite hand, grasp seat handle if available, for added stability.','Pull lever handle forward and downward as far as possible by rotating upper arm. Allow lever to return to original position. Repeat. Continue with opposite arm.','upload/exercise-picture/LVUprightInternalRotation.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(562,'Machine-assisted Chest Dip','Mount wide dip bar with oblique grip (bar diagonal under palm), arms straight with shoulders above hands. Step down onto assistance lever with hips and knees bent.','Lower body by bending arms, allowing elbows to flare out to sides. When slight stretch is felt in chest or shoulders, push body up until arms are straight. Repeat.','upload/exercise-picture/AsChestDip.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(563,'Machine-assisted Chest Dip (kneeling)','Mount wide dip bar with oblique grip (bar diagonal under palm), arms straight with shoulders above hands. Kneel on padded platform, lowering it down slightly so hips are slightly bent.','Lower body by bending arms, allowing elbows to flare out to sides. When slight stretch is felt in chest or shoulders push body up until arms are straight. Repeat.','upload/exercise-picture/ASChestDipKneeling.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(564,'Barbell Board Press','Lie supine on bench. Grasp bar with overhand and slightly wider than shoulder width grip. Arch back, extend hips, and position feet back flat on floor. Dismount barbell from rack over chest. Have assistant hold board on center of chest.','Lower weight toward lower chest on\n\n\nto board. Press bar upward until arms are extended. Repeat.','upload/exercise-picture/BBBoardPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(565,'Barbell Guillotine Bench Press','Lie supine on bench. Dismount barbell from rack over upper chest using wide oblique overhand grip.','Lower weight to neck to upper chest. Upper arms will be perpendicular to torso. Press bar until arms are extended. Repeat.','upload/exercise-picture/BBBenchPressGuillotine.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(566,'Barbell Bench Press (power lift)','Lie supine on bench. Grasp bar with overhand and slightly wider than shoulder width grip. Arch back, extend hips, and position feet back flat on floor. Dismount barbell from rack over chest.','Lower weight to lower chest. Press bar upward until arms are extended. Repeat.','upload/exercise-picture/BBBenchPressPowerlift.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(567,'Barbell Bench Press','Lie supine on bench. Dismount barbell from rack over upper chest using wide oblique overhand grip.','Lower weight to chest. Press bar upward until arms are extended. Repeat.','upload/exercise-picture/BBBenchPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(568,'Barbell Floor Press','Lie supine on floor at base of power rack. Place feet on floor with knees bent. Grasp bar from rack with overhand and slightly wider than shoulder width grip. Dismount barbell from rack over chest.','Lower weight to lower chest until the triceps are completely on the floor. Relax momentarily, then press bar upward until arms are extended. Repeat.','upload/exercise-picture/BBFloorPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(569,'Barbell Decline Bench Press','Lie supine on decline bench with feet under leg brace. Dismount barbell from rack over chest using wide oblique overhand grip.','Lower weight to chest. Press bar until arms are extended. Repeat.','upload/exercise-picture/BBDeclineBenchPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(570,'Cable Chest Dip','Step between wide dip bars with dip belt around waist. Kneel as close as possible to low pulley and attach cable to dip belt. Stand up and mount dip bar with oblique grip (bar diagonal under palm), arms straight with shoulders above hands. Keep hips and knees bent.','Lower body by bending arms, allowing elbows to flare out to sides. When slight stretch is felt in chest or shoulders, push body up until arms are straight and repeat.','upload/exercise-picture/CBChestDip.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(571,'Cable Decline Fly','Grasp two opposing high pulley dumbbell attachments. Lie supine on decline bench, in middle and perpendicular to both pulleys. Slightly bend elbows and internally rotate shoulders so elbows are back.','Bring cable stirrups together above upper abdomen in hugging motion; elbows in fixed position and shoulders internally rotated so elbows are to sides. Return to starting position until chest is slightly stretched. Repeat.','upload/exercise-picture/CBDeclineFly.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(572,'Barbell Bench Press (with chains)','Lie supine on bench. Grasp barbell loaded with thick chains from each side, with overhand and slightly wider than shoulder width grip. Dismount barbell from rack over chest.','Lower weight to chest. Press bar upward until arms are extended. Repeat.','upload/exercise-picture/BBBenchPressChain.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(573,'Cable Seated Fly','Sit on seat and grasp stirrups to each side. Slightly bend elbows and internally rotate shoulders so elbows are back.','Keeping elbows pointed high, bring cable attachments together in hugging motion with elbows in fixed position. Return to starting position until slight stretch. Repeat.','upload/exercise-picture/CBSeatedFly.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(574,'Cable Lying Fly','Grasp two opposing low pulley stirrup attachments. Lie supine on bench, in middle and perpendicular to both pulleys. Slightly bend elbows and internally rotate shoulders so elbows are back.','Bring cable attachments together in hugging motion with elbows in fixed position and shoulders internally rotated so elbows are to sides. Return to starting position until slight stretch. Repeat.','upload/exercise-picture/CBLyingFly.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(575,'Cable Bench Press','Lie on bench and grasp stirrups attached to low cable pulley on each side. Position stirrups out to each side of chest with bent arm under each wrist.','Push stirrups up over each shoulder until arms are straight and parallel to one another. Return stirrups to original position, until slight stretch is felt in shoulders or chest. Repeat.','upload/exercise-picture/CBBenchPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(576,'Cable Standing Fly','Grasp two opposing high pulley dumbbell attachments. Stand with pulleys to each side. Bend over slightly by flexing hips and knees. Bend elbows slightly and internally rotate shoulders so elbows are back initially.','Bring cable attachments together in hugging motion with elbows in fixed position. Keep shoulders internally rotated so elbows are pointed upward at top and out to sides at bottom. Return to starting position until chest muscles are stretched. Repeat.','upload/exercise-picture/CBStandingFly.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(577,'Cable One Arm Chest Press','Sit on seat and grasp stirrup to one side. Position elbows out to side, slightly lower than shoulder height. Position hand slightly narrower than elbow width in front of upper arm.','Push stirrups out straight in front of shoulder until arm is straight. Return stirrups to original position until slight stretch is felt through shoulder or chest. Repeat.','upload/exercise-picture/CBOneArmChestPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(578,'Cable Bar Standing Chest Press','Stand facing behind cable bar, mounted on each side to shoulder height narrow double pulley cables. Grasp cable bar with wide overhand grip. Position bar chest height with elbows angled behind. Lean and step forward with one foot in front, bending forward leg.','Push cable bar forward until arms are straight. Return cable bar to original position until slight stretch is felt in chest or shoulders. Repeat.','upload/exercise-picture/CBBarStandingChestPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(579,'Cable Twisting Chest Press','Sit on seat and grasp stirrup to one side. Position elbow out to side, slightly lower than shoulder height. Position hand slightly narrower than elbow width, in front of upper arm. Lean forward in seat.','Push stirrup out in front of upper chest while turning torso away from pulley. Return stirrup and torso back to original position allowing torso to rotate back until slight stretch is felt through chest, shoulder or waist. Repeat.','upload/exercise-picture/CBTwistingChestPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(580,'Cable Bar Bench Press','Position adjustable pulley higher than intended height but within arms reach from bench. Position bench under cable bar. Lie supine on bench. While lying on bench, reach over and lower each pulley into intended position so that cables are taut in lowest position with bar on chest. Grasp bar with both hands using wide oblique overhand grip.','Press bar upward until arms are extended. Lower bar to chest or until slight stretch is felt in shoulders. Repeat.','upload/exercise-picture/CBBarBenchPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(581,'Cable Chest Press','Sit on seat and grasp stirrups to each side. Position elbows out to sides, slightly lower than shoulder height. Position hands slightly narrower than elbow width in front of upper arms.','Push stirrups out straight until arms are straight and parallel to one another. Return stirrups to original position, until slight stretch is felt in shoulders or chest. Repeat.','upload/exercise-picture/CBChestPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(582,'Cable Standing Chest Press','Stand between two shoulder height pulleys, facing away from cable columns. Grasp cable stirrups from each side. Position stirrups to sides of chest with elbows out to sides. Position forearms horizontally and parallel with hands elbow width. Step forward in lunging posture (one foot in front and other foot behind). Lean and step forward with one foot in front, bending forward leg.','Push stirrups forward until arms are straight and parallel to one another. Return stirrups to original position until slight stretch is felt in chest or shoulders. Repeat.','upload/exercise-picture/CBStandingChestPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(583,'Dumbbell Bench Press','Sit down on bench with dumbbells resting on lower thigh. Kick weights to shoulder and lie back. Position dumbbells to sides of chest with bent arm under each dumbbell.','Press dumbbells up with elbows to sides until arms are extended. Lower weight to sides of chest until slight stretch is felt in chest or shoulder. Repeat.','upload/exercise-picture/DBBenchPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(584,'Cable Decline Chest Press','Sit on seat and grasp stirrups to each side. Position elbows out to sides, slightly lower than shoulder height. Position hands slightly narrower than elbow width in front of upper arms.','Push stirrups forward and slightly downward until arms are straight and parallel to one another. Return stirrups to original position, until slight stretch is felt in shoulders or chest. Repeat.','upload/exercise-picture/CBDeclineChestPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(585,'Cable Twisting Standing Chest Press','Grasp cable stirrup from chest height pulley. Turn body away from pulley. Position elbow of loaded arm out to side, lower chest height. Position loaded hand back approximately shoulder height and elbow width. Step far forward with foot of opposite side of loaded arm. Bend knees and position heel off rear foot off floor.','Push stirrups away from body, horizontally until arm is straight and inline with cable. Return stirrups to original position until slight stretch is felt in chest or shoulder. Repeat. Continue with opposite arm.','upload/exercise-picture/CBStandingTwistingChestPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(586,'Cable Standing Decline Chest Press','Stand between two high pulleys, facing away from cable columns. Grasp cable stirrups from each side. Position stirrups down to sides of lower chest with elbows high out to sides. Angle forearms downward with hands elbow width or slightly narrower. Lean and step forward with forward leg bent or stand feet side by side with both legs slightly bent (as shown).','Push stirrups at forward/downward angle until arms are straight and parallel to one another. Return stirrups to original position until slight stretch is felt in chest or shoulders. Repeat.','upload/exercise-picture/CBStandingDeclinePress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(587,'Cable Bar Standing Decline Chest Press','Stand facing behind cable bar mounted on each side to shoulder height narrow double pulley cables. Grasp cable bar with wide overhand grip. Position bar\n\n\nchest height with elbows angled behind and above. Lean and step forward with one foot in front, bending forward knee.','Push cable bar forward and downward until bar is about hip height and arms are straight. Return cable bar to original position until slight stretch is felt in chest or shoulders. Repeat.','upload/exercise-picture/CBBarStandingDeclineChestPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(588,'Dumbbell Decline Bench Press','Sit down on decline bench with feet under leg brace and dumbbells resting on thigh. Lie back with dumbbells. Position dumbbells to sides of chest with bent arm under each dumbbell.','Press dumbbells up with elbows to sides until arms are extended. Lower weight to sides of chest until slight stretch is felt in chest or shoulder. Repeat.','upload/exercise-picture/DBDeclineBenchPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(589,'Dumbbell Decline Fly','Grasp two dumbbells. Lie supine on decline bench. Support dumbbells above upper abdomen with arms fixed in slightly bent position. Internally rotate shoulders so elbows are to sides.','Lower dumbbells to sides until chest muscles are stretched with elbows fixed. Bring dumbbells together in wide hugging motion until dumbbells are nearly together. Repeat.','upload/exercise-picture/DBDeclineFly.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(590,'Dumbbell Pullover (on apparatus)','Sit on lower pad with back against upper pad, facing dumbbell in rack. Position feet under padded bars. Grasp dumbbell by handle with both hands. Pull top of dumbbell to chest. Push dumbbell up over chest with both hands under inner plate of dumbbell. Raise hips up from pad and recline torso back so chest faces upward. Keep hips and elbows slightly bent.','Keeping elbows slightly bent throughout movement, lower dumbbell over and beyond head until upper arms are in-line with torso. Pull dumbbell up and over chest. Repeat.','upload/exercise-picture/DBPulloverBench.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(591,'Dumbbell Fly','Grasp two dumbbells. Lie supine on bench. Support dumbbells above chest with arms fixed in slightly bent position. Internally rotate shoulders so elbows point out to sides.','Lower dumbbells to sides until chest muscles are stretched with elbows fixed in slightly bent position. Bring dumbbells together in wide hugging motion until dumbbells are nearly together. Repeat.','upload/exercise-picture/DBFly.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(592,'Dumbbell Pullover','Lie on upper back perpendicular to bench. Flex hips slightly. Grasp one dumbbell from behind or from side with both hands under inner plate of dumbbell. Position dumbbell over chest with elbows slightly bent.','Keeping elbows slightly bent throughout movement, lower dumbbell over and beyond head until upper arms are in-line with torso. Pull dumbbell up and over chest. Repeat.','upload/exercise-picture/DBPullover.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(593,'Lever Barbell Bench Press (plate loaded)','Lie supine on bench with upper chest under bar. Grasp bar with wide oblique overhand grip. Disengage bar by rotating bar.','Lower weight to chest. Press bar until arms are extended. Repeat.','upload/exercise-picture/LVSMBenchPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(594,'Lever Decline Chest Press (plate loaded)','Sit on seat with handles lower chest height. Grasp handle with wide overhand grip; elbows out to sides just below shoulders.','Press lever until arms are extended. Return weight until chest muscles are slightly stretched. Repeat.','upload/exercise-picture/LVDeclineChestPressHighH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(595,'Lever Chest Press (plate loaded)','Sit on seat with chest approximately height of handles. Grasp handles with wide overhand grip; elbows out to sides just below shoulders.','Press levers until arms are extended. Return weight until chest muscles are slightly stretched. Repeat.','upload/exercise-picture/LVChestPressH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(596,'Dumbbell Pullover (on arched bench)','Sit on seat of arched bench with dumbbell on lower thigh. Kick dumbbell up to shoulder while lying back on bench. Grasp both hands under inner plate of dumbbell. Position dumbbell over chest with elbows slightly bent.','Keeping elbows slightly bent throughout movement, lower dumbbell over and beyond head until upper arms are in-line with torso. Pull dumbbell up and over chest. Repeat.','upload/exercise-picture/DBPulloverArchedBench.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(597,'Lever Bench Press (plate loaded)','Lie supine on bench with chest under lever bar. Grasp lever bar with wide oblique overhand grip.','Press bar until arms are extended. Lower weight to upper chest. Repeat.','upload/exercise-picture/LVBenchPressH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(598,'Lever Chest Dip (plate loaded)','Sit on seat and grasp handles with oblique grip. If possible, place handles in wide position. Lean forward slightly.','Push lever down with elbows away from body. Return until chest is slightly stretched. Repeat.','upload/exercise-picture/LVChestDipH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(599,'Lever Chest Dip','If possible, place handles in wide position. Sit on seat and grasp handles with oblique grip. Lean forward slightly and allow elbows to flare out.','Push lever down by straightening arms. Return lever up with elbows flaring out until chest is slightly stretched. Repeat.','upload/exercise-picture/LVChestDip.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(602,'Lever Wide Grip Chest Press (plate loaded)','Sit on seat with chest approximately height of handles. Grasp handles with wide overhand grip and elbows out to sides.','Press lever until arms are extended. Return weight until chest muscles are slightly stretched. Repeat.','upload/exercise-picture/LVWideGripChestPressSeatLowH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(603,'Lever Decline Pec Deck Fly','Sit on machine with back on pad. If available, push foot lever until padded lever moves forward. Place forearms on padded lever. Position upper arms approximately parallel. Release foot lever.','Push levers together. Return until chest muscles are stretched. Repeat.','upload/exercise-picture/LVDeclineFly.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(604,'Lever Pec Deck Fly','Sit on machine with back on pad. If available, push foot lever until padded lever moves forward. Place forearms on padded lever. Position upper arms approximately parallel. Release foot lever.','Push levers together. Return until chest muscles are stretched. Repeat.','upload/exercise-picture/LVFly.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(605,'Lever Bent-over Fly (on iron cross machine)','Stand on platform in front of Lever Iron Cross Machine. Grasp handles to each side. Bend over at hips with knees and elbows bent slightly. Internally rotate shoulders so elbows are pointing upward.','Bring lever handles together in hugging motion with elbows in fixed position. Keep shoulders internally rotated so elbows are pointed upward at top and out to sides at bottom. Return to starting position until chest muscles are stretched. Repeat.','upload/exercise-picture/LVBentOverFly.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(606,'Lever Seated Decline Fly (gripless)','Sit on seat with back against seat. Position both arms over back of padded levers. Slightly bend elbows and internally rotate shoulders, wrists are slightly lower than elbows.','Bring padded levers together by pushing pads forward and downward in hugging motion. Return to starting position until chests muscle are stretched. Repeat.','upload/exercise-picture/LVSeatedDeclineFly.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(607,'Lever Seated Iron Cross Fly','Straddle seat with both levers positioned slightly above horizontal. Grasp both lever ends with elbows slightly above levers. Sit down near end of seat with torso leaning\n\nforward\n\nslightly and slightly bent elbows pointing back.','Push levers downward and together in hugging motion. Keep shoulders internally rotated so elbows are pointed slightly upward at top and out to sides at bottom. Return to starting position until chest muscles are stretched. Repeat.','upload/exercise-picture/LVSeatedFlyIronCross.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(608,'Lever Seated Fly (gripless)','Sit on seat with back against pad and feet on foot bar. Position both arms behind padded levers. Slightly bend elbows and internally rotate shoulders so elbows are pointed back.','Bring padded levers forward and together in hugging motion. Return to starting position until stretch in chests or shoulder is felt. Repeat.','upload/exercise-picture/LVSeatedFlyGripless.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(609,'Lever Seated Fly','Sit on machine with back on pad. Grasp handles to both sides, shoulder height. Slightly bend elbows and internally rotate shoulders so elbows are back.','Keeping elbows pointed high, push lever handles forward and together. Return to back toward original position until mild stretch is felt in chest or shoulder. Repeat.','upload/exercise-picture/LVSeatedFly2.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(611,'Lever Lying Fly','Lie supine on bench. Position both arms under padded levers. Slightly bend elbows and internally rotate shoulders so elbows are back.','Bring padded levers upward and together in hugging motion. Return to starting position until chest muscles are stretched. Repeat.','upload/exercise-picture/LVLyingFly.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(612,'Lever Bench Press','Lie supine on bench with chest under lever bar. Grasp lever bar with wide oblique overhand grip.','Press bar until arms are extended. Lower weight to upp\n\n\ner chest. Repeat.','upload/exercise-picture/LVBenchPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(613,'Lever Alternating Chest Press','Sit on seat with lever grips lower chest height. Grasp grips with wide overhand grip; elbows out to sides just below shoulders.','Press one lever until arm is extended. Return lever back until chest muscle is slightly stretched. Repeat with opposite arm, alternating between sides.','upload/exercise-picture/LVAlternatingChestPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(614,'Lever Decline Chest Press','Sit on seat with lever grips lower chest height. Grasp grips with wide overhand grip; elbows out to sides just below shoulders.','Press lever until arms are extended. Return weight until chest muscles are slightly stretched. Repeat.','upload/exercise-picture/LVDeclineChestPress2.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(615,'Lever Chest Press','Sit on seat with chest approximately height of horizontal handles. If available, push foot lever until lever is within grasping range. Grasp handles with wide overhand grip; elbows out to sides just below shoulders. Release foot lever.','Press lever until arms are extended. Return weight until chest muscles are slightly stretched. Repeat.','upload/exercise-picture/LVChestPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(617,'Lever Alternating Decline Chest Press','Sit on seat with lever grips lower chest height. Grasp grips with wide overhand grip; elbows out to sides just below shoulders.','Press one lever until arm is extended. Return lever back until chest muscle is slightly stretched. Repeat with opposite arm, alternating between sides.','upload/exercise-picture/LVAlternatingDeclineChestPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(618,'Lever Parallel Grip Chest Press','Sit on seat with sides of ribs approximately height of parallel handles. If available, push foot lever until handles are within grasping range. Grasp parallel handles. Release foot lever.','Press lever until arms are extended. Return weight until shoulders or chest feels slightly stretched. Repeat.','upload/exercise-picture/LVParallelGripBenchPressB.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(619,'Sled Horizontal Grip Standing Chest Dip','Stand between handles facing machine. Bend forward slightly and grasp transverse handles with overhand grip. Position elbows upward and outward. Bend knees just enough to raise selected weight up from remaining weight stack.','Push lever down by straightening arms. Return lever up with elbows flaring out until chest is slightly stretched. Repeat.','upload/exercise-picture/SLStandingChestDipWideHorizontalGrip.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(620,'Sled Standing Chest Dip','Stand between handles facing machine. Bend forward slightly and grasp parallel handles with oblique grip. Position elbows upward and outward. Bend knees just enough to raise selected weight up from remaining weight stack.','Push lever down by straightening arms. Return lever up with elbows flaring out until chest is slightly stretched. Repeat.','upload/exercise-picture/SLStandingChestDip.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(621,'Smith Bench Press','Lie supine on bench with chest under bar. Grasp bar with wide oblique overhand grip. Disengage bar by rotating bar back.','Lower weight to chest. Press bar until arms are extended. Repeat.','upload/exercise-picture/SMBenchPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(622,'Lever Decline Bench Press','Lie supine on decline bench with feet under leg brace and chest under lever bar. Grasp lever bar with wide oblique overhand grip.','Press bar until arms are extended. Lower weight to chest. Repeat.','upload/exercise-picture/LVDeclineBenchPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(623,'Weighted Push-up','Lie prone on floor with hands slightly wider than shoulder width. Raise body up off floor by extending arms with body straight. Partner can place weight plate(s) on back if needed.','Keeping body straight, lower body to floor by bending arms. Push body up until arms are extended. Repeat.','upload/exercise-picture/WtPushup.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(624,'Chest Dip','Mount wide dip bar with oblique grip (bar diagonal under palm), arms straight with shoulders above hands. Bend knees and hips slightly.','Lower body by bending arms, allowing elbows to flare out to sides. When slight stretch is felt in chest or shoulders, push body up until arms are straight. Repeat.','upload/exercise-picture/BWChestDip.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(625,'Band-assisted Chest Dip','Place one foot on middle of exercise band with ends looped on wide dip bars. Push band down partially by extending leg. Mount dip bar with oblique grip (bar diagonal under palm), arms straight, and shoulders above hands. Place other foot on exercise band next to other foot. Bend knees and hips slightly.','Lower body by bending arms, allowing elbows to flare out to sides. When slight stretch is felt in chest or shoulders, push body up until arms are straight. Repeat.','upload/exercise-picture/ASChestDipFootBand.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(626,'Smith Decline Bench Press','Lie supine on decline bench with feet under leg brace and chest under bar. Grasp bar with wide oblique overhand grip. Disengage bar by rotating bar back.','Lower weight to chest. Press bar until arms are extended. Repeat.','upload/exercise-picture/SMDeclineBenchPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(627,'Weighted Push-up (on handles)','Kneel before two push-up handles placed slightly wider than shoulder width apart. Grasp both handles and place feet back on floor or slightly elevated platform. Position body straight with arms extended. Partner can place weight plate(s) on back if needed.','Keeping body ridged, lower body downward by bending arms until slight stretch is felt in chest or shoulders. Push body back up until arms are extended. Repeat.','upload/exercise-picture/WTPushupHandles.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(628,'Push-up','Lie prone on floor with hands slightly wider than shoulder width. Raise body up off floor by extending arms with body straight.','Keeping body straight, lower body to floor by bending arms. Push body up until arms are extended. Repeat.','upload/exercise-picture/BWPushupWide.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(629,'Weighted Chest Dip','Place weight on dip belt around waist or place dumbbell between lower legs just above feet. Mount wide dip bar with oblique grip (bar diagonal under palm), arms straight with shoulders above hands. Keep hips and knees bent.','Lower body by bending arms, allowing elbows to flare out to sides. When slight stretch is felt in chest or shoulders, push body up until arms are straight. Repeat.','upload/exercise-picture/WTChestDip.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(630,'Chest Dip (between benches)','Stand between ends of two benches. Place hands on ends of benches with fingers off ends of benches. Grip should be somewhat wide. Position feet out in front with legs straight, heels on floor, and torso upright.','Lower body by bending arms, allowing elbows to flare out to sides. When slight stretch is felt in chest or shoulders, push body up until arms are straight. Repeat.','upload/exercise-picture/BWDoubleBenchDips.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(631,'Chest Dip (bent knees between benches)','Stand between ends of two benches. Place hands on ends of benches with fingers off ends of benches. Position feet out in front with legs bent and torso upright.','Lower body by bending arms, allowing elbows to flare out to sides. When slight stretch is felt in chest or shoulders, push body up until arms are straight. Repeat.','upload/exercise-picture/BWDoubleBenchDipsBentKnee.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(632,'Incline Push-up','Stand facing bench or sturdy elevated platform. Place hands on edge of bench or platform, slightly wider than shoulder width. Position forefoot back from bench or platform with arms and body straight. Arms should be perpendicular to body.','Keeping body straight, lower chest to edge of box or platform by bending arms. Push body up until arms are extended. Repeat.','upload/exercise-picture/BWPushupOnBox.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(633,'Suspended Chest Dip','Stand between two suspension handles and grasp handles on each side of torso. Hold position firmly and lift feet from floor.','Push body up until arms are straight. Lower body until slight stretch is felt in shoulders. Repeat.','upload/exercise-picture/STDip.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(634,'Incline Push-up (on bar)','Grasp horizontal bar (lower than chest height) with hands slightly wider than shoulder width. Position forefeet back from bar with arms and body straight. Arms should be perpendicular to body.','Keeping body straight, lower chest to bar by bending arms. Push body up until arms are extended. Repeat.','upload/exercise-picture/BWPushupOnBar.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(635,'Suspended Self-assisted Chest Dip','Stand between two suspension handles, approximately mid-thigh height. Grasp handles on each side and straighten arms with shoulders above hands. Hold position firmly and place portion of body weight on handles.','Lower body by bending arms back. If necessary, use minimal assistance of lower body to control descent, allowing knees to bend, keeping feet in contact with floor. When slight stretch is felt in chest or shoulders, push body up back up until arms are straight. Repeat with minimal assistance from legs.','upload/exercise-picture/STSelfAssistedChestDip.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(636,'Suspended Chest Press','Grasp handles and step forward between suspension trainers. Position arms downward and slightly forward, nearly parallel with suspension straps. Lean forward, placing upper body weight onto handles with arms straight, while stepping back onto forefeet so body is leaning forward at desired angle. Straighten body so torso is in-line with legs.','Lower body by bending arms while keeping body straight. Allow handles to come apart slightly to keep in-line with elbows flaring out. Stop descent once mild stretch is felt through shoulders or chest. Push body up to original position, allowing handles to travel inward to keep in line with elbows converging until arms are fully extended. Repeat.','upload/exercise-picture/STChestPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(637,'Behind Head Chest Stretch','Place hands behind head.','Pull elbows back further behind ears. Hold stretch.','upload/exercise-picture/31a7b461c0ecbd48cc96c1d82724df4e.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(638,'Self-assisted Chest Dip','Stand on bench or elevation between parallel bars. Mount wide dip bar with oblique grip (bar diagonal under palm), arms straight with shoulders above hands. Bend knees and hips slightly and place forefoot on bench or elevation below.','Lower body by bending arms, allowing elbows to flare out to sides. If necessary, use minimal assistance of lower body to control descent, allowing knees and hips to bend, keeping forefeet in contact with bench or elevation. When slight stretch is felt in chest or shoulders, push body up until arms are straight and repeat, again with minimal assistance from legs.','upload/exercise-picture/ASChestDipSelfAssisted.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(639,'Suspended Fly','Grasp handles and step forward between suspension trainer. Position arms downward and slightly forward, nearly parallel with suspension straps. Lean forward, placing upper body weight onto handles with arms straight, while stepping back onto forefeet, so body is leaning forward at desired angle. Straighten body so torso is in-line with legs. Bend elbows slightly and internally rotate shoulders, so elbows are pointed outward to each side.','Lower body by allowing suspension handles to separate outward until mild stretch is felt in chest. Reverse motion by bringing handles back together in hugging motion. Repeat.','upload/exercise-picture/STChestFly.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(640,'Push-up (on knees)','Lie prone on floor with hands slightly wider than shoulder width. Bend knees and raise body up off floor by extending arms with body straight.','Keeping body straight and knees bent, lower body to floor by bending arms. Push body up until arms are extended. Repeat.','upload/exercise-picture/BWPushupWideKnee.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(641,'Straight Arm Chest Stretch','With arm extended, position hand on fixed structure shoulder height.','Turn body away from positioned arm. Hold stretch. Repeat with opposite arm.','upload/exercise-picture/35105281f94e7095770bdd334abaf11b.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(642,'Doorway Modified Chest Stretch','Stand at end of wall or in doorway facing perpendicular to wall. Place front of shoulder and inside of bent arm on surface of wall. Position bent elbow around same height of shoulder. Position both feet back behind original stance.','Lean into wall allowing shoulder to be pushed back. Turn body away from positioned arm. Hold stretch. Repeat with opposite arm.','upload/exercise-picture/9d5fa017ad5d4a4b9ccaad68c16a6db6.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(643,'PNF Behind Head Chest Stretch','Instruct participant to sit on floor or bench and place hands behind head, facing forward. Stand behind participant and position leg behind their head. Place hands on participant\'s elbows.','Pull participant\'s elbows back. Hold stretch.','upload/exercise-picture/fd41223d6c4bf840b668fe7cd1810421.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(644,'Doorway Chest Stretch','Stand at end of wall or in doorway facing perpendicular to wall. Place inside of bent arm on surface of wall. Position bent elbow shoulder height.','Turn body away from positioned arm. Hold stretch. Repeat with opposite arm.','upload/exercise-picture/274cce510915d8b305b711f55c0f015c.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(645,'Cable Incline Chest Press','Sit on seat and grasp stirrups to each side (attached to medium height pulleys). Position elbows out to sides, slightly lower than shoulder height. Position hands back approximately shoulder height and elbow width.','Push stirrups away from body, slightly upward at 30º to 45º until arms are straight and parallel to one another. Return stirrups to original position until slight stretch is felt in chest or shoulders. Repeat.','upload/exercise-picture/CBInclineChestPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(646,'Cable Bar Incline Bench Press','Position adjustable pulley higher than intended height, but within arms reach from incline bench. Position incline bench under cable bar. Lie supine on incline bench. While lying on bench, reach over and lower each pulley into intended position so that cables are taut in lowest position with bar on chest. Grasp bar with both hands using wide oblique overhand grip.','Press bar upward until arms are extended. Lower bar to upper chest or until slight stretch is felt in shoulders. Repeat.','upload/exercise-picture/CBBarInclineBenchPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(647,'Cable Standing Incline Chest Press','Stand between two hip height pulleys, facing away from cable columns. Grasp cable stirrups from each side. Position elbows out to sides, lower chest height. Position hands back approximately shoulder height and elbow width. Lean and step forward with one foot in front bending forward knee.','Push stirrups forward and upward at 30º to 45º angle until arms are straight and parallel to one another. Return stirrups to original position until slight stretch is felt in chest or shoulders. Repeat.','upload/exercise-picture/CBStandingInclinePress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(648,'Barbell Incline Bench Press','Lie supine on incline bench. Dismount barbell from rack over upper chest using wide oblique overhand grip.','Lower weight to upper chest. Press bar until arms are extended. Repeat.','upload/exercise-picture/BBInclineBenchPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(649,'Cable Incline Bench Press','Sit on seat and grasp stirrups to each side (attached to low cable pulleys). Lie back on incline back support. Position stirrups out to each side of chest with bent arm under each wrist.','Push stirrups up over each shoulder until arms are straight and parallel to one another. Return stirrups to original position, until slight stretch is felt in chest or shoulders. Repeat.','upload/exercise-picture/CBInclineBenchPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(650,'Cable Bar Standing Incline Chest Press','Stand facing behind cable bar, mounted on each side to lower chest height narrow double pulley cables. Grasp cable bar with wide overhand grip. Position bar upper mid-chest height with elbows angled behind and downward. Lean and step forward with one foot in front, bending forward knee.','Push cable bar forward and upward at 30º to 45º until arms are straight. Return cable bar to original position until slight stretch is felt in chest or shoulders. Repeat.','upload/exercise-picture/CBBarStandingInclineChestPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(651,'Dumbbell Incline Fly','Grasp two dumbbells. Lie supine on bench. Support dumbbells above upper chest with arms fixed in slightly bent position. Bend elbows slightly and internally rotate shoulders so elbows point out to sides.','Lower dumbbells outward to sides of shoulders. Keep elbows fixed in slightly bent position. When a stretch is felt in chest or shoulders, bring dumbbells back together in hugging motion above upper chest until dumbbells are nearly together. Repeat.','upload/exercise-picture/DBInclineFly.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(652,'Dumbbell Incline Bench Press','Sit down on incline bench with dumbbells resting on lower thigh. Kick weights to shoulders and lean back. Position dumbbells to sides of chest with upper arm under each dumbbell.','Press dumbbells up with elbows to sides until arms are extended. Lower weight to sides of upper chest until slight stretch is felt in chest or shoulder. Repeat.','upload/exercise-picture/DBInclineBenchPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(653,'Cable Standing Incline Fly','Stand between two pulleys position hip height and arms width or slightly wider apart. Grasp stirrups, one in each hand. Extend arms out with elbows slightly bent, pointed back and downward slightly. Step forward until cables are taut or when weights are lifted up slightly. Stand with feet staggered.','Keeping elbows fixed in slightly bent position, bring stirrups together in upwardly arching, hugging motion, at 30º to 45º angle until they meet at top of motion. Lower stirrups to original position in reverse pattern. As soon as stretch is felt in chest or shoulders, repeat motion.','upload/exercise-picture/CBStandingInclineFly.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(654,'Cable One Arm Standing Incline Chest Press','Grasp cable stirrup from hip height pulley. Turn body away from pulley. Position elbow of loaded arm out to side, lower chest height. Position loaded hand back approximately shoulder height and elbow width. Step far forward with foot of opposite side of loaded arm. Bend knees and position heel of rear foot off floor.','Push stirrups forward and upward at 30º to 45º until arm is straight and in-line with cable. Return stirrup to original position until slight stretch is felt in chest or shoulder. Repeat. Continue with opposite arm.','upload/exercise-picture/CBStandTwistInclineChestPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(655,'Cable Incline Fly','Sit on seat with stirrups in each hand (attached to low cable pulleys). Lie back on incline back support. Position stirrups out to each side of chest with bent arm under each wrist. Press stirrups over each shoulder until arms vertical. Bend elbows slightly and internally rotate shoulders so elbows point out to sides.','Lower stirrups outward to sides of shoulders. Keep elbows fixed in slightly bent position. When a stretch is felt in chest or shoulders, bring stirrups back together in hugging motion above upper chest until stirrups are nearly together Repeat.','upload/exercise-picture/CBInclineFly.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(656,'Lever Incline Chest Press (on Hammer military press)','Sit on seat with upper chest just above base of handles on lever. Grasp grips with wide overhand grip. Lift levers into starting position with elbows slightly low.','Press levers until arms are extended. Return weight until chest muscles are slightly stretched with elbows positioned out to sides. Repeat.','upload/exercise-picture/LVInclineChestPressOnHammerMilitaryPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(657,'Lever Incline Chest Press (plate loaded)','Sit on seat with upper chest just above grips on lever. Grasp grips with wide overhand grip and position elbows out to sides.','Press lever until arms are extended. Return weight until chest muscles are slightly stretched. Repeat.','upload/exercise-picture/LVInclineChestPressSeatLowH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(658,'Lever Barbell Incline Bench Press (plate loaded)','Lie supine on incline bench with upper chest under bar. Grasp bar with wide oblique overhand grip. Disengage bar by rotating bar back.','Lower weight to chest. Press bar until arms are extended. Repeat.','upload/exercise-picture/LVSMInclineBenchPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(659,'Lever Incline Bench Press','Lie supine on incline bench with upper chest under lever bar. Grasp lever bar with wide oblique overhand grip.','Press bar until arms are extended. Lower weight to upper chest. Repeat.','upload/exercise-picture/LVInclineBenchPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(660,'Lever Parallel Grip Incline Bench Press (plate loaded)','Lie supine on incline bench with parallel lever bars out to sides of rib cage. Grasp parallel handles.','Press lever bars up until arms are extended. Lower weight toward upper chest. Repeat.','upload/exercise-picture/LVParellelGripInclineBenchPressNPL.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(661,'Lever Incline Bench Press (plate loaded)','Lie supine on incline bench with lever bars out to sides of chest. Grasp handles with wide overhand grip.','Press lever bars up until arms are extended. Lower weight toward upper chest. Repeat.','upload/exercise-picture/LVInclineBenchPressNPL.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(662,'Lever Parallel Grip Incline Bench Press','Lie supine on incline bench with parallel lever bars out to sides of rib cage. Grasp parallel handles.','Press lever bars up until arms are extended. Lower weight toward upper chest. Repeat.','upload/exercise-picture/LVInclineParallelGripBenchPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(663,'Lever Parallel Grip Incline Chest Press','Sit on seat with lower chest at height of parallel handles. If available, push foot lever until handles are within grasping range. Grasp parallel handles.','Press lever bars up until arms are extended. Return weight until shoulders or chest feels slightly stretched. Repeat.','upload/exercise-picture/LVParallelGripInclineChestPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(664,'Lever Alternating Incline Chest Press','Sit on seat with upper chest just above grips on lever. Grasp grips with wide overhand grip and position elbows out to sides.','Press one lever until arm is extended. Return lever back down until chest muscle is slightly stretched. Repeat with opposite arm, alternating between sides.','upload/exercise-picture/LVAlternatingInclineChestPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(665,'Lever Incline Chest Press','Sit on seat with upper chest just above grips on lever. If available, push foot lever until handles are within grasping range. Grasp handles with wide oblique overhand grip and position elbows out to sides. Release foot lever.','Press lever until arms are extended. Return weight until shoulders or chest feels slightly stretched. Repeat.','upload/exercise-picture/LVInclineChestPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(666,'Smith Incline Bench Press','Lie supine on incline bench with upper chest under bar. Grasp bar with wide oblique overhand grip. Disengage bar by rotating bar back.','Lower weight to upper chest. Press bar until arms are extended. Repeat.','upload/exercise-picture/SMInclineBenchPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(667,'Decline Push-up','Kneel on floor with bench or elevation behind body. Position hands on floor slightly wider than shoulder width. Place feet on bench or elevation. Raise body body in plank position with body straight and arms extended.','Keeping body straight, lower upper body to floor by bending arms. To allow for full descent, pull head back slightly without arching back. Push body up until arms are extended. Repeat.','upload/exercise-picture/BWDeclinePushup.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(668,'Lever Incline Fly','Lie supine on bench. Position inside of forearms under roller pads with arms out to each side. Slightly bend elbows and internally rotate shoulders so elbows are back.','Raise lever upward and together in hugging motion. Lower weight until slight stretch is felt in chest or shoulder. Repeat.','upload/exercise-picture/LVInclineFly.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(669,'Pike Push-up','Kneel on two benches positioned side by side slightly apart at end nearest head. Place hands on ends of benches. With forefeet on opposite ends of bench, raise rear end high up with arms, back, and knees straight.','Lower head between ends of benches by bending arms. Push body back up to original position by extending arms. Repeat.','upload/exercise-picture/BWFarPikePress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(670,'Decline Push-up (on stability ball)','Kneel with chest or waist on exercise ball. Dive over top and place hands on floor with arms extended down supporting upper body. While keeping body horizontal, walk hands further away from ball until thighs are positioned on top of ball and hands are slightly wider than shoulder width. Bend knees so feet are up above knees.','Keeping hips straight, lower upper body to floor by bending arms. To allow for full descent, pull head back slightly without arching back. Push body up until arms are extended. Repeat.','upload/exercise-picture/DeclinePushUpOnBall.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(671,'Lying Shoulder Girdle Stretch','Lie supine with soles of feet on floor, hips and knees bent. Bend elbows and position back of arms against floor or mat with elbows to sides.','Push shoulders, forearms, and back of hand into floor or mat and slowly move arms toward sides of head. Still pushing shoulders and back of arms into floor, slowly arms toward sides.','upload/exercise-picture/81c9c6613602c71360e4ca55e904cf66.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(677,'Towel Shoulder Girdle Stretch','Grasp large towel or rope with very wide overhand grip, approximately length of arm to opposite elbow. Raise towel over head.','Pull towel back away from back of head while attempting to pull towel outward on each side.','upload/exercise-picture/fac48a97a71ddfde86c8d863dcbd396d.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(678,'Wall Shoulder Girdle Stretch','Position back against wall. Place feet away from wall, slightly bending hips and knees. Bend elbows and position back of arms against wall with elbows to sides.','Push shoulders and back of arms and hands into wall and slowly raise arms as high as possible. Still pushing shoulders arms, slowly lower arms to starting position.','upload/exercise-picture/WallShoulderGirdle.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(679,'Lever Incline Shoulder Raise','Sit on lever chest press machine with shoulders aligned with lever grips. Grasp lever grips with shoulder width overhand grip. Push weight up so arms are straight.','Raise shoulders toward lever grips as far as possible. Lower shoulders to bench and repeat.','upload/exercise-picture/LVInclineShoulderRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(680,'Barbell Incline Shoulder Raise','Lie supine on incline bench. Dismount barbell from rack with shoulder width overhand grip. Position barbell over upper chest with elbows extended.','Raise shoulders toward bar as high as possible. Lower shoulders to bench and repeat.','upload/exercise-picture/BBInclineShoulderRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(681,'Dumbbell Incline Shoulder Raise','Sit down on incline bench with dumbbells resting on lower thigh. Kick weights to shoulders and lean back. Position dumbbells above shoulders with elbows extended.','Raise shoulders toward dumbbells as high as possible. Lower shoulders to bench and repeat.','upload/exercise-picture/DBInclineShoulderRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(682,'Cable Incline Shoulder Raise','Sit on seat and grasp stirrups to each side. Push stirrups out at 30º to 45º until arms are straight and parallel to one another.','Raise shoulders toward stirrups as high as possible. Lower shoulders down and back and repeat.','upload/exercise-picture/CBShoulderRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(683,'Lever Incline Shoulder Raise (plate loaded)','Sit on lever chest press machine with shoulders aligned with lever grips. Grasp lever grips with shoulder width overhand grip. Push weight up so arms are straight.','Raise shoulders toward lever grips as far as possible. Lower shoulders to bench and repeat.','upload/exercise-picture/LVInclineShoulderRaisePL.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(685,'Cable One Arm Incline Push','Sit on seat and grasp stirrup with one hand. Position elbow out to side, slightly lower than shoulder height. Position hand down, slightly higher than shoulder height, slightly narrower than elbow width.','Push stirrup forward and up at 30º to 45º while rotating torso away allowing shoulder to be extended forward. Return stirrups to original position, until slight stretch, and repeat. Continue with opposite side.','upload/exercise-picture/CBOneArmInclinePush.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(686,'Smith Incline Shoulder Raise','Lie supine on incline bench with shoulders under bar. Grasp bar with shoulder width overhand grip. Extend elbows. Disengage bar by rotating bar back.','Raise shoulders toward bar as high as possible. Lower shoulders to bench and repeat.','upload/exercise-picture/SMInclineShoulderRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(687,'Push-up Plus','Lie prone on floor with hands slightly wider than shoulder width. Raise body up off floor by extending arms with body straight.','Keeping body straight, lower body to floor by bending arms. Push body up until arms are extended. Continue lifting body further up by pushing shoulders infront of chest. Repeat.','upload/exercise-picture/BWPushUpPlus.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(689,'Barbell Push Crunch','Position feet under foot pad and lie supine on steep incline bench. Pull barbell from floor or grasp from rack behind with overhand grip. Position barbell over chest with shoulder width or slightly wider grip.','Flex waist to raise upper torso from bench, keeping low back on bench. Return until back of shoulders contact padded incline board. Repeat.','upload/exercise-picture/BBPushCrunch.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(690,'Cable Lying Crunch (on stability ball)','Sit on stability ball against low pulley column. Roll back away from low pulley column, so back is on ball. Reach back and grasp cable rope attachment with both hands and place inside of wrists on sides of head. Allow weight to hyperextend lower back against stability ball.','With hips stationary, flex waist so elbows travel toward thighs. Return and repeat.','upload/exercise-picture/CBLyingCrunchStabBall.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(691,'Cable Lying Leg-Hip Raise (on bench)','Attach cable ankle straps to both ankles, then attach ankle straps to cable. Lie supine on floor or mat, back far enough so cable is taut. Grasp support behind head.','Raise legs by flexing hips while flexing knees until hips are fully flexed. Raise hips from floor by flexing waist. Return until legs are extended horizontally. Repeat.','upload/exercise-picture/CBLyingLegHipRaiseBench.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(692,'Barbell Push Sit-up','Position feet under foot pad and lie supine on flat or incline bench. Pull barbell from floor or grasp from rack behind with overhand grip. Position barbell over chest with shoulder width or slightly wider grip.','Raise torso from bench as high as possible by bending waist and hips. Keep weight positioned above shoulders. Achieve near upright posture (hip flexibility, incline, and initial hip position permitting). Return to original lying posture with back of shoulders contacting padded incline board. Repeat.','upload/exercise-picture/BBInclineSitup.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(693,'Cable Seated Crunch (plate loaded)','Sit on apparatus with back on back support. Grasp cable rope attachment with both hands and place securely over both shoulders. Allow weight to lift chest up with spine arched back slightly.','With hips stationary, flex waist small of back pushes into back of seat as upper back travels forward. Return and repeat.','upload/exercise-picture/CBInclineCrunch.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(694,'Cable Lying Leg-Hip Raise','Attach cable ankle straps to both ankles then attach ankle straps to cable. Lie supine on floor or mat, back far enough so cable is taut. Grasp support behind head.','Raise legs by flexing hips while flexing knees until hips are fully flexed. Raise hips from floor by flexing waist. Return until waist, hips and knees are extended downward. Repeat.','upload/exercise-picture/CBLyingLegHipRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(695,'Cable Lying Straight Leg-Hip Raise','Attach cable ankle straps to both ankles, then attach ankle straps to cable. Lie supine on floor or mat, back far enough so cable is taut. Grasp support behind head.','Raise legs by flexing hips until fully flexed. Raise hips from floor by flexing waist. Return until waist and hips are extended downward. Repeat.','upload/exercise-picture/CBLyingStraightLegHipRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(696,'Cable Seated Crunch','Seat with back support away from medium high pulley. Grasp cable rope attachment with both hands and place securely over both shoulders. Allow weight to lift chest up with spine arched back slightly.','With hips stationary, flex waist so elbows travel toward hips. Return and repeat.','upload/exercise-picture/CBSeatedCrunch.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(697,'Cable Kneeling Crunch','Kneel below high pulley. Grasp cable rope attachment with both hands. Place wrists against head. Position hips back and flex hips, allowing resistance on cable pulley to lift torso upward so spine is hyperextended.','With hips stationary, flex waist so elbows travel toward middle of thighs. Return and repeat.','upload/exercise-picture/CBKneelingCrunch.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(698,'Cable Overhead Seated Crunch','Sit on bench or seat below two very close high pulleys. Grasp two separate cable stirrups, one with each hand. Pull stirrups down with palms facing back over each shoulder. Holding arms in place, allow weight to pull torso up, hyperextend lower back slightly.','With arms fixed in place, flex waist so shoulders travel forward and downward toward thighs. Return until chest is high and back is hyperextended. Repeat.','upload/exercise-picture/CBOverheadSeatedCrunch.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(699,'Cable Standing Crunch','Position back against back pad with knees slightly bent, shoulders back, and chest high. Position both cable ropes over shoulders, one in each hand. Place hands with cable ropes in front of each shoulder so that cable is taut. If available, place hand in rope slot that allows cable to be taut when hands are in position.','Flex waist so torso pulls ropes forward and downward. Return until back of shoulders return to surface. Repeat alternating twists with opposite sides.','upload/exercise-picture/CBStandingCrunch.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(700,'Dumbbell Push Crunch','With dumbbells in each hand, position feet under foot pad and lie supine on steep incline bench. Position dumbbells straight over shoulders.','Flex waist to raise upper torso from bench, keeping low back on bench. Return until back of shoulders contact padded incline bench. Repeat.','upload/exercise-picture/DBPushCrunch.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(701,'Lever Lying Crunch (plate loaded)','Lie on machine with feet on foot bar. Place forearms on bars at sides or grasp handles above to each side.','With hips stationary, raise upper back pad by flexing waist. Return and repeat.','upload/exercise-picture/LVLyingCrunchArmsSide.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(702,'Cable Standing Overhead Crunch (multi-exercise bar)','Stand below high pulley. Grasp multi-exercise bar cable attachment with parallel grip. Position hands near sides of head. Squat down slightly with hips flexed, allowing resistance on cable pulley to lift torso upward so spine is hyperextended.','With knees and hips stationary, flex waist so elbows travel toward middle of thighs. Return and repeat.','upload/exercise-picture/CBStandingOverheadCrunchMultiBar.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(703,'Cable Standing Overhead Crunch','Stand below high pulley. Grasp cable rope attachment and place wrists against head. Squat down slightly with hips flexed, allowing resistance on cable pulley to lift torso upward so spine is hyperextended.','With knees and hips stationary, flex waist so elbows travel toward middle of thighs. Return and repeat.','upload/exercise-picture/CBStandingOverheadCrunch.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(704,'Dumbbell Push Sit-up','Position feet under foot pad and lie supine on flat or incline bench. Position dumbbells straight over shoulders.','Raise torso from bench as high as possible by bending waist and hips. Keep weight positioned above shoulders. Achieve near upright posture (hip flexibility, incline, and initial hip position permitting). Return to original lying posture with back of shoulders, contacting padded incline board. Repeat.','upload/exercise-picture/DBInclineSitup.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(705,'Lever Lying Crunch','Lie on machine with legs over pads or feet on foot bar. Grasp bars near head at each side.','With hips stationary, raise upper back pad by flexing waist. Return and repeat.','upload/exercise-picture/LVLyingCrunch.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(706,'Lever Lying Leg-Hip Raise (plate loaded)','Lie supine on machine with lower legs between padded bars. Grasp handles on each side.','Pull lower leg bar up by flexing hips toward arms by flexing hips then waist. Continue to raise knees toward shoulders by flexing waist, raising hips from board. Return until waist and hips are extended down to original position. Repeat.','upload/exercise-picture/LVLyingLegHipRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(707,'Lever Lying Leg Raise Crunch (plate loaded)','Lie supine on machine with lower legs between padded bars. Grasp handles on each side.','Pull handles toward legs while pulling lower leg bar toward arms by flexing waist and hips. Return and repeat.','upload/exercise-picture/LVCrunchLegRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(708,'Lever Vertical Leg-Hip Raise (plate loaded)','Grasp handles slightly to front and stand on foot bar with knees slightly bent and hips against pad.','Raise legs as high as possible by flexing hips then waist. Return and repeat.','upload/exercise-picture/LVVerticalLegHipRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(709,'Lever Seated Leg Raise Crunch (plate loaded)','Sit on machine with back against back support and lower legs under padded bar. Grasp handles above to each side.','Pull handles down while pulling lower leg bar up by flexing waist and pelvis. Return and repeat.','upload/exercise-picture/LVSeatedLegRaiseCrunchPL.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(710,'Lever Seated Leg Raise Crunch','Sit on machine with back against back support and lower legs under padded bar. Grasp handles above to each side.','Pull handles down while pulling lower leg bar up by flexing waist and pelvis. Return and repeat.','upload/exercise-picture/LVCrunchHipRaiseN.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(711,'Lever Seated Crunch (chest pad)','Position seat so chest is same height of padded lever. Sit on machine with back of hips against hip pad. Place hands on outside of lever pad.','With hips stationary, flex waist in \"C\" shape so shoulders travel forward and downward. Return and repeat.','upload/exercise-picture/LVCrunchChestPad.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(712,'Lever Push Crunch','Sit on machine with back of hips against hip support. Push hips securely back by pushing feet against foot bar. Grasp handles and push resistance lever until arms are extended in front of body.','Push resistance lever forward by flexing waist. Return by allowing upper body to be pushed back until low back is hyperextended. Repeat.','upload/exercise-picture/LVPushCrunch.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(713,'Lever Seated Crunch (arm pad)','Position seat so shoulders are same height of padded lever. Sit on machine and place arms over lever pad. Push padded lever down slightly until shoulder is fixed at approximately 90º or slightly greater.','With hips stationary, flex waist in \"C\" shape so elbows point downward. Return and repeat.','upload/exercise-picture/LVSeatedCrunchArmPad.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(714,'Sled Leg Hip Raise (ab coaster)','Straddle machine facing handles. Grasp handles on each side and place forearms on pads. Place shins on padded sled with knees forward and feet hanging off of back end. Sit back toward heels without bending over.','Slide forward and up by pulling knees up high. Deliberately attempt to flex waist in a \"C\" shape. Return sled down and back arching spine in opposite direction while keeping hips bent. Repeat.','upload/exercise-picture/SLLegHipRaiseAbCoaster.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(715,'Lever Seated Crunch','Sit on machine with back and hips against back supports. If available, place lower legs under pads or on platform. Grasp handles above and position back of arm against pads to each side.','With hips stationary, flex waist so elbows travel downward. Return and repeat.','upload/exercise-picture/LVSeatedCrunch.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(716,'Lever Seated Crunch (arm bar)','Sit on machine with back and hips against padded supports. Place feet on floor or feet bars so thigh is approximately horizontal. Grasp handles and position forearms on bars or pads.','With hips stationary, flex waist so arms and upper torso travel forward and downward. Return and repeat.','upload/exercise-picture/LVSeatedCrunchArmsForward.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(717,'Lever Side Lying Leg Hip Raise','Lie on side with head on elevated head pad and legs between padded rollers. Flex hips slightly until rear and front of thighs are snugly positioned against pads. Flex knees so back of lower leg is against furthest padded roller. Grasp handles in front of head.','Pull knees toward arms by flexing waist and hips. Return and repeat.','upload/exercise-picture/LVSideLyingLegHipRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(718,'Weighted Crunch','Lie supine on bench with head hanging off and knees and hips bent. Hold plate behind neck.','Flex waist to raise upper torso from bench. Keep low back on bench and raise torso up as high as possible. Return until back of shoulders contact padded incline board. Repeat.','upload/exercise-picture/WTCrunch.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(719,'Weighted Crunch (plate on chest)','Lie supine on mat with lower legs on bench. Hold plate on chest with both hands.','Flex waist to raise upper torso from mat. Keep low back on mat and raise torso up as high as possible. Return until back of shoulders contact mat. Repeat.','upload/exercise-picture/WtCrunchChestX.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(720,'Weighted Incline Crunch (arms crossed)','Hook feet under foot brace and lie supine on incline board with hips bent. Hold plate on chest with both hands or use no weight.','Flex waist to raise upper torso from bench. Keep low back on bench and raise torso up as high as possible. Return until back of shoulders contact padded incline board. Repeat.','upload/exercise-picture/WTInclineCrunchX.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(721,'Weighted Incline Sit-up (arms crossed)','Hook feet under foot brace and lie supine on incline board with hips bent. Hold plate on chest with both hands or use no weight.','Raise torso from bench by bending waist and hips. Return until back of shoulders contact padded incline board. Repeat.','upload/exercise-picture/WTInclineSitupX.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(722,'Weighted Incline Sit-up','Hook feet under support and lie supine on incline bench with hips bent. Hold plate behind neck or clasp hands behind neck with no weight.','Raise torso from bench by bending waist and hips. Return until back of shoulders contact padded incline board. Repeat.','upload/exercise-picture/WtInclineSitUp.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(723,'Weighted Overhead Crunch (on stability ball)','Sit on exercise ball with medicine ball in hands. Walk forward on ball and lie back on ball with shoulders and head hanging off and knees and hips bent. Gently hyperextend back to contour of ball. Position medicine ball over upper chest with arms extended.','Keeping arms extended and medicine ball over upper chest, flex waist to raise upper torso. Return to original position. Repeat.','upload/exercise-picture/WTOverheadBallCrunch.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(724,'Weighted Incline Crunch','Hook feet under support and lie supine on incline bench with hips bent. Hold plate behind neck or clasp hands behind neck with no weight.','Flex waist to raise upper torso from bench. Keep low back on bench and raise torso up as high as possible. Return until back of shoulders contact padded incline board. Repeat.','upload/exercise-picture/WtInclineCrunch.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(725,'Weighted Crunch (on stability ball)','Sit on exercise ball. Walk forward on ball and lie back on ball with shoulders and head hanging off and knees and hips bent. Gently hyperextend back to contour of ball. Hold plate behind neck or on chest with both hands or use no weight.','Flex waist to raise upper torso. Return to original position. Repeat.','upload/exercise-picture/WTBallCrunch.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(726,'Medicine Ball Chest Throw Sit-up (machine)','Position feet under support with knees bent. With two medicine\nballs at bottom of chute, grasp closest medicine ball with both\nhands.','With ball in both hands, lie down onto back support while\nlowering medicine ball to chest. Raise torso from back support\nby bending waist and hips while pushing ball away from chest.\nImmediately throw ball into target and grasp other medicine ball\nat bottom of chute. Repeat movement.','upload/exercise-picture/MBSitupChest.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(727,'Weighted Sit-up','Hook feet under support and lie supine on floor or mat with hips bent. Hold plate behind neck.','Raise torso from floor by bending waist and hips. Return until back of shoulders contact with floor or mat. Repeat.','upload/exercise-picture/WTSitUp.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(728,'Weighted Sit-up (arms on chest)','Hook feet under support and lie supine on floor or mat with hips and knees bent. With both hands, hold plate on chest with forearms crossed or use no weight.','Raise torso from floor by bending waist and hips. Return until back of shoulders contact with floor or mat. Repeat.','upload/exercise-picture/WTSitUpX.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(729,'Medicine Ball Overhead Throw Sit-up (machine)','Position feet under support with knees bent. With two medicine balls at bottom of chute, grasp closest medicine ball with both hands.','With ball in both hands, lie down onto back support while lowering medicine ball behind head. Raise torso from back support by bending waist and hips while raising ball overhead. Immediately throw ball into target and grasp other medicine ball at bottom of chute. Repeat movement.','upload/exercise-picture/Absolo.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(730,'Weighted Vertical Leg-Hip Raise (Bosu support)','Place weight between ankles. Position forearms on padded parallel bars with hands on handles and back on convexed surface.','Raise legs by flexing hips and knees. As hips approach full flexion, lean back. Continue to raise knees toward shoulders by flexing waist and raising hips and low back from convexed surface. Return until waist, hips, and knees are extended. Repeat.','upload/exercise-picture/WTVerticalLegHipRaiseConvex.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(731,'Weighted Vertical Leg-Hip Raise','Place weight between ankles or use no weight. Position forearms on padded parallel bars with hands on handles and back on vertical pad.','Raise legs by flexing hips and knees until hips are fully flexed. Continue to raise knees toward shoulders by flexing waist, raising hips from back board. Return until waist, hips, and knees are extended. Repeat.','upload/exercise-picture/WtVerticalLegHipRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(732,'Weighted Vertical Leg-Hip Raise (on parallel bars)','Place weight between ankles. Stand between parallel bars and grip bar on each side with overhand grip. Lift body off floor and balance body upright with arms straight.','Raise legs by flexing hips and knees until hips are fully flexed. Continue to raise knees toward shoulders by flexing waist. Return until waist, hips, and knees are extended. Repeat.','upload/exercise-picture/WTVerticalLegHipRaiseDipBar.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(733,'Weighted Lying Leg-Hip Raise','Place weight between ankles or use no weight. Lie supine on bench or floor. Grasp sides of bench for support.','Raise legs by flexing hips while flexing knees until hips are fully flexed. Continue to raise knees toward shoulders by flexing waist, raising hips from board. Return until waist, hips and knees are extended. Repeat.','upload/exercise-picture/WTLyingLegHipRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(734,'Weighted Hanging Leg-Hip Raise','Place weight between ankles or use no weight. Grasp and hang from high bar.','Raise legs by flexing hips and knees until hips are fully flexed. Continue to raise knees toward shoulders by flexing waist. Return until waist, hips, and knees are extended. Repeat.','upload/exercise-picture/WTHangingLegHipRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(735,'Weighted Side Crunch','Lie upper back supine on floor or mat. With both legs together, knees and hips bent, position outside of leg down to side. Use no weight or hold weight to opposite side of head or across upper chest.','Flex waist, raising upper torso off surface. Return until back of shoulders return to surface. Repeat and continue with movement in opposite position.','upload/exercise-picture/WTSideCrunch.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(736,'Weighted Incline Twisting Crunch (arms crossed)','Hook feet under padding and lie supine on incline bench with hips bent. Hold plate on upper chest with both hands or use no weight.','Flex and twist waist to raise upper torso from bench to one side. Return until back of shoulders contact padded incline board. Repeat to opposite side alternating twists.','upload/exercise-picture/WTInclineTwistingCrunch.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(737,'Cable Standing Twisting Crunch','Position back against back pad with knees slightly bent, shoulders back, and chest high. Place both cable straps over shoulders, one in each hand. Place hands with cable strap in front of each shoulder so that cable is taut. If available, place hands in strap slots that allow cable to be taut when hands are in position with shoulders back.','Flex and twist spine so torso pulls strap forward and downward while twisting one shoulder to forward center. Return until back of shoulders return to back pad. Repeat alternating twists with opposite sides.','upload/exercise-picture/CBStandingTwistingCrunch.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(738,'Lever Seated Twisting Leg Raise Crunch (plate loaded)','Sit on machine with position back against back support and lower legs under padded bar. Grasp handles above to each side.','Pull handles down while pulling lower leg bar up and over to one side by flexing and twisting waist and pelvis. Return and repeat movement to opposite side. Continue alternating between sides.','upload/exercise-picture/LVSeatedTwistingLegRaiseCrunch.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(739,'Weighted Incline Leg-Hip Raise','Sit on incline board. Place weight between ankles or use no weight. Lie supine on incline board with torso elevated. Grasp feet hooks or sides of board by head for support.','Raise legs by flexing hips while flexing knees until hips are fully flexed. Continue to raise knees toward shoulders by flexing waist, raising hips from board. Return until waist, hips and knees are extended. Repeat.','upload/exercise-picture/WtInclineLegHipRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(740,'Weighted Incline Twisting Situp','Hook feet under foot or ankle brace and lie supine on incline bench with hips and knees bent. Hold plate behind neck with both hands.','Flex and twist waist to one direction while raising torso from bench by bending hips. Return until back of shoulders contact padded incline board. Repeat to opposite side, alternating twists.','upload/exercise-picture/WtInclineTwistingSitUp.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(741,'Weighted Twisting Crunch','Lie supine on floor or bench with knees and hips bent. Hold plate behind neck or on chest with both hands.','Flex and twist waist to raise upper torso off surface to one side. Return until back of shoulders return to surface. Repeat to opposite side alternating twists.','upload/exercise-picture/WTTwistingCrunch.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(742,'Weighted Side Crunch (on stability ball)','Sit on exercise ball. Walk forward on ball and lie back on ball with shoulders and head hanging off. Switch position of feet by positioning bent leg under extended leg so waist is twisted with hip positioned sideways. Gently hyperextend back to contour of ball. Hold plate behind neck or on chest with both hands or use no weight.','Flex waist to raise upper torso. Return to original position and repeat. Position legs in opposite position and continue.','upload/exercise-picture/WTSideCrunchOnBall.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(743,'Weighted Incline Twisting Situp (arms crossed)','Hook feet under foot brace and lie supine on incline board with hips and knees bent. Hold plate on chest with both hands or use no weight.','Flex and twist waist to one direction while raising torso from bench by bending hips. Return until back of shoulders contact padded incline board. Repeat to opposite side alternating twists.','upload/exercise-picture/WtInclineTwistingSitUpChest.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(744,'Crunch (arms down)','Lie supine on mat or bench. Bend knees and hips and place feet on floor. Extend arms down to sides.','Flex waist to raise upper torso from mat or bench. Keep low back on floor or mat and raise torso up as high as possible. Extend hands toward sides of heels. Return until back of shoulders contact mat or bench. Repeat.','upload/exercise-picture/CrunchArmsStraight.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(745,'Crunch','Lie supine on mat with lower legs on bench. Place hands behind neck or head.','Flex waist to raise upper torso from mat. Keep low back on mat and raise torso up as high as possible. Return until back of shoulders contact mat. Repeat.','upload/exercise-picture/BWCrunchHead.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(746,'Weighted Twisting Situp','Place feet under low overhanging stationary object. Lie supine on floor or mat with hips and knees bent. Hold plate behind neck with both hands.','Flex and twist waist to one direction while raising torso from bench by bending hips. Return until back of shoulders contact floor or mat. Repeat to opposite side alternating twists.','upload/exercise-picture/WTTwistingSitUp.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(747,'Crunch (arms crossed)','Lie supine on mat with lower legs on bench. Cross wrists on chest.','Flex waist to raise upper torso from mat. Keep low back on mat and raise torso up as high as possible. Return until back of shoulders contact mat. Repeat.','upload/exercise-picture/BWCrunchX.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(748,'Weighted Twisting Crunch (on stability ball)','Sit on exercise ball. Walk forward on ball and lie back on ball with shoulders and head hanging off and knees and hips bent. Gently hyperextend back to contour of ball. Hold plate behind neck or on chest with both hands or use no weight.','Flex waist to raise upper torso. Return to original position and repeat.','upload/exercise-picture/WTTwistingCrunchOnBall.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(749,'Weighted Twisting Situp (arms crossed)','Place feet under low overhanging stationary object. Lie supine on floor or mat with hips and knees bent. With both hands, hold plate on chest with forearms crossed.','Flex and twist waist to one direction while raising torso from bench by bending hips. Return until back of shoulders contact floor or mat. Repeat to opposite side alternating twists.','upload/exercise-picture/WTTwistingSitUpX.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(750,'Crunch Up','Lie supine on mat or floor with bent leg and arms pointed up.','Flex waist to raise upper torso from floor. Return until back of shoulders contact padded incline board. Repeat.','upload/exercise-picture/CrunchUps.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(751,'Jack-knife Sit-up','Sit on floor or mat. Lie supine with hands to sides.','Simultaneously raise knees and torso until hips and knees are flexed. Return to starting position with waist, hips and knees extended. Repeat.','upload/exercise-picture/WtJacknifeSitUp.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(752,'Incline Crunch','Hook feet under foot brace and lie supine on incline board with hips bent. Place hands behind neck or head.','Flex waist to raise upper torso from bench. Keep low back on bench and raise torso up as high as possible. Return until back of shoulders contact incline board. Repeat.','upload/exercise-picture/BWInclineCrunchHead.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(753,'Ball Crunch (on stability ball)','Sit on exercise ball. Walk forward on ball and lie back on ball with shoulders and head hanging off and knees and hips bent. Gently hyperextend back on contour of ball. Place hands behind neck or beside head.','Flex waist to raise upper torso. Return to original position. Repeat.','upload/exercise-picture/BWBallCrunch.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(754,'Crunch (on stability ball, arms crossed)','Sit on exercise ball. Walk forward on ball and lie back on ball with shoulders and head hanging off and knees and hips bent. Gently hyperextend back on contour of ball. Cross arms on chest.','Flex waist to raise upper torso. Return to original position. Repeat.','upload/exercise-picture/BWCrunchBallX.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(755,'Incline Crunch (arms down)','Hook feet under foot brace and lie supine on incline board with hips bent. Extend arms down to sides or cross arms on chest.','Flex waist to raise upper torso from bench. Keep low back on bench and raise torso up as high as possible. Return until back of shoulders contact incline board. Repeat.','upload/exercise-picture/BWInclineCrunchDown.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(756,'Hanging Leg-Hip Raise','Stand below ab straps hanging from high bar. Place upper arms in straps and grasp straps above.','Raise legs by flexing hips and knees until hips are fully flexed. Continue to raise knees toward shoulders by flexing waist. Return until waist, hips, and knees are extended downward. Repeat.','upload/exercise-picture/BWHangingHipLegRaiseAbStrap.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(757,'Hanging Straight Leg-Hip Raise','Grasp and hang from high bar.','Raise legs by flexing hips until fully flexed. Continue to raise feet toward bar by flexing waist. Return until waist and hips are extended downward. Repeat.','upload/exercise-picture/BWHangingStraightLegHipRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(758,'Incline Leg-Hip Raise','Lie supine on incline board with torso elevated. Grasp feet hooks or sides of board by head for support.','Raise legs by flexing hips and knees until hips are fully flexed. Continue to raise knees toward shoulders by flexing waist, raising hips from board. Return until waist, hips and knees are extended. Repeat.','upload/exercise-picture/BWInclineLegHipRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(759,'Lying Leg-Hip Raise','Lie supine on bench or floor. Grasp sides of bench for support.','Raise legs by flexing hips while flexing knees until hips are fully flexed. Continue to raise knees toward shoulders by flexing waist, raising hips from board. Return until waist, hips and knees are extended. Repeat.','upload/exercise-picture/BWLyingLegHipRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(760,'Vertical Leg-Hip Raise (parallel bars)','Stand between parallel bars and grip bar on each side with overhand grip. Lift body off floor and balance body upright with arms straight.','Raise legs by flexing hips and knees until hips are fully flexed. Continue to raise knees toward shoulders by flexing waist. Return until waist, hips, and knees are extended. Repeat.','upload/exercise-picture/WTVerticalLegHipRaisePB.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(761,'Leg-Hip Raise (on stability ball)','Position ball against sturdy support. Lie with back on ball and heels on floor with legs straight. Grasp sturdy bar(s) near head for support.','Raise legs by flexing hips and knees until hips are fully flexed. Continue to raise knees toward shoulders by flexing waist, raising hips from board. Return until waist, hips and knees are extended. Repeat.','upload/exercise-picture/BWLegHipRaiseExerciseBall.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(762,'Vertical Leg-Hip Raise (Bosu support)','Position forearms on padded parallel bars with hands on handles and back on convexed surface.','Raise legs by flexing hips and knees. As hips approach full flexion, lean back. Continue to raise knees toward shoulders by flexing waist and raising hips and low back from convexed surface. Return until waist, hips, and knees are extended. Repeat.','upload/exercise-picture/BWVerticalLegHipRaiseConvex.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(763,'Vertical Straight Leg-Hip Raise (parallel bars)','Stand between parallel bars and grip bar on each side with overhand grip. Lift body off floor and balance body upright with arms straight.','Raise legs by flexing hips until fully flexed. Continue to raise feet toward bar by flexing waist. Return until waist and hips are extended downward. Repeat.','upload/exercise-picture/BWVertStraightLegHipRaiseDipBar.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(764,'Vertical Leg-Hip Raise','Position forearms on padded parallel bars with hands on handles, and back on vertical pad.','Raise legs by flexing hips and knees until hips are fully flexed. Continue to raise knees toward shoulders by flexing waist, raising hips from back board. Return until waist, hips, and knees are extended. Repeat.','upload/exercise-picture/BWVerticalLegHipRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(765,'Incline Sit-up','Hook feet under support and lie supine on incline bench with hips bent. Place hands behind neck or on side of neck.','Raise torso from bench by bending waist and hips. Return until back of shoulders contact incline board. Repeat.','upload/exercise-picture/BWInclineSitups.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(766,'Incline Sit-up (arms crossed)','Hook feet under foot brace and lie supine on incline board with hips bent. Cross arms on chest.','Raise torso from bench by bending waist and hips. Raise crossed arms over knees at top. Return until back of shoulders contact incline board. Repeat.','upload/exercise-picture/BWInclineSitupX.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(767,'Inverted Sit-up','Hang inverted from high bar with gravity boots on each leg. Lie supine with hands on floor over head.','Raise trunk as high as possible by flexing hips and waist. Return to starting position. Repeat.','upload/exercise-picture/BWInvertedSitup.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(768,'Sit-up','Hook feet under foot brace or secure low overhang. Lie supine on floor or bench with hips bent. Place hands behind neck or on side of neck.','Raise torso from bench by bending waist and hips. Return until back of shoulders contact incline board. Repeat.','upload/exercise-picture/BWSitupNeck.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(769,'Sit-up (arms crossed)','Hook feet under foot brace or secure low overhang. Lie supine on mat or bench with hips bent. Cross arms and place hands in front of shoulders.','Raise torso from mat or bench by bending waist and hips. Raise crossed arms over knees at top. Return until back of shoulders contact mat or bench. Repeat.','upload/exercise-picture/BWSitupShoulder.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(771,'Suspended Jack-knife','Sit on floor facing suspension trainer loops in low position. Place right foot in left lower loop. Cross left leg over right leg placed in right lower loop. Turn body to right and place hands on floor, shoulder width apart. Turn body to kneel on hands and knees. Reposition hands squared with desired distance from suspension trainer, shoulder width or slightly wider. With arms straight, raise knees from ground so body is supported by arms and suspension trainer.','Pull legs under torso by bending hips and knees. Pull knees toward chest hips and knees until completely flexed. Return by extending hips and knees to original position. Repeat.','upload/exercise-picture/STJackknife.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(772,'Sit-up (arms down)','Lie supine on mat or bench with hips bent and feet on floor or bench. Hook feet under foot brace or secure low overhang if required to keep feet down. Extend arms down to sides.','Raise torso from mat or bench by bending waist and hips. Extend hands toward sides of heels. Return until back of shoulders contact mat or bench. Repeat.','upload/exercise-picture/BWSitupArmsSides.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(773,'Suspended Pull Through','Sit on floor with feet under suspension trainer loops in low position. Reach and grasp bottom of loops and lay back supine. Raise legs and place heels in loops with soles contacting handles (or ankles through loops as shown). Extend legs out straight. Sit up and place hands on floor to sides at desired distance from suspension trainer. Raise hips from floor supporting upper body with arms.','Pull hips back while flexing spine in C shape. Raise hips up high by straightening spine and hips until straight.','upload/exercise-picture/STPullThrough.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(774,'V-up','Sit on floor or mat. Lie supine with hands on floor over head.','Simultaneously raise straight legs and torso. Reach toward raised feet. Return to starting position. Repeat.','upload/exercise-picture/BWVup.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(775,'Kneeling Abdominal Stretch','Kneel on floor or mat with hips straight. Place hands on back of hips','Lean torso back by arching back. Hold stretch.','upload/exercise-picture/c3e400f67216ec0dad67111d3c0e6460.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(776,'Suspended Jack-knife Pike','Sit on floor facing suspension trainer loops in low position. Place right foot in left lower loop. Cross left leg over right leg placed in right lower loop. Turn body to right and place hands on floor, shoulder width apart. Turn body to kneel on hands and knees. Reposition hands (shoulder width or slightly wider) at desired distance from suspension trainer so that body is square with suspension trainer straps. With arm straight, raise knees from ground so body is supported by arms and suspension trainer.','Pull knees toward shoulders while raising hips very high. Lower hips by extending body to original straight position, while keeping shins close to horizontal. Repeat.','upload/exercise-picture/STJackknifePike.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(778,'Front Plank','Lie prone on mat. Place forearms on mat, elbows under shoulders. Place legs together with forefeet on floor.','Raise body upward by straightening body in straight line. Hold position.','upload/exercise-picture/FrontPlank.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(779,'Lying (Prone) Abdominal Stretch','Lie prone on mat or floor. Position hands on floor to sides of shoulders.','Push torso up keeping pelvis on floor. Hold stretch.','upload/exercise-picture/8c63d5a850f5767f5c7fde0838087164.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(780,'Lying (supine) Abdominal Stretch','Lie supine on mat or floor with arms extended overhead and legs straight.','Lift chest away from lower body while reach away with arms. Hold stretch.','upload/exercise-picture/31b12e7d0a1eda93f9822786a1ea0687.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(781,'Standing Abdominal Stretch','Stand with arms extended overhead.','Arch back by lift chest up and bringing arms back as far as possible. Hold stretch.','upload/exercise-picture/bd73ab9130ed13b74774ee88fc716f62.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(782,'Abdominal Vacuum','Sit, kneel, lie, or stand.','Pull navel into spine and hold.','upload/exercise-picture/AbdominalVacuum.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(783,'Cable Side Bend','With side to low pulley, grasp stirrup attachment with near arm. Stand with arm straight.','Pull stirrup by bending sideways through waist so torso moves away from pulley. Lower stirrup by leaning torso toward pulley. Repeat. Continue with opposite side.','upload/exercise-picture/CBSideBend.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(784,'Cable Seated Cross Arm Twist','Grasp stirrup from medium height cable pulley with far hand. Sit on stool or straddle bench with lower body facing away from pulley. Allow torso to turn to side of near arm. Place far arm across body onto near arm. Support far elbow with near hand.','Rotate torso through waist to face opposite side until slight stretch if felt. Return to original side until slight stretch is felt. Repeat. Continue with opposite side.','upload/exercise-picture/CBSeatedCrossArmTwist.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(785,'Cable Seated Twist','Grasp stirrup and straddle bench orientated with side facing medium height cable pulley. Sit with feet on floor. Hold onto stirrup with both hands with arms extending out straight toward stirrup.','Keeping arms straight, rotate torso to opposite side until cable makes contact with shoulder. Return to original position and repeat. Continue with opposite side.','upload/exercise-picture/CBSeatedTwistB.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(787,'Cable Kneeling Twisting Crunch','Kneel below high pulley. Grasp cable rope attachment with both hands. Place wrists against head. Position hips back and flex hips, allowing resistance on cable pulley to lift torso upward so spine is hyperextended.','With hips stationary, flex waist to one side so elbow travels toward mid-thigh on opposite side. Return to original position and repeat on opposite side. Continue by alternating between sides.','upload/exercise-picture/CBKneelingTwistingCrunch.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(788,'Cable Side Crunch','With side close to high pulley, grasp stirrup attachment with near hand. Position stirrup at side of shoulder, palm orientated inward, and elbow down to side.','Pull stirrup downward by bending toward cable column through waist so torso moves toward base of cable column. Bend in opposite direction by leaning torso away from cable column, allowing stirrup to rise upward. Repeat. Continue with opposite side.','upload/exercise-picture/CBSideCrunch.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(789,'Cable Standing Twisting Crunch (single side)','Position back against back pad with knees slightly bent, shoulders back, and chest high. Place cable straps over shoulder. Hold against front of body with opposite hand so that cable is taut. If available, place hand in rope slot that allows cable to be taut when hand is in position with shoulders back.','Flex and twist spine so shoulder pulls strap diagonally forward and downward away from pulley. Return until back of shoulder returns to back pad and repeat.','upload/exercise-picture/LVStandingTwistingCrunchSingle.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(790,'Cable Russian Twist (on stability ball)','Grasp stirrup and sit on stability ball with side facing low cable pulley. Roll body down and lie with back on ball, hips nearly straight, and feet apart on floor. Hold onto stirrup with both hands with arms extending straight upward.','Allow resistance from cable to turn torso downward, toward direction of pulley while keeping arms straight and perpendicular to torso throughout movement. Pull stirrup in an arch over shoulders by rotating torso to opposite direction of pulley until cable makes contact with shoulder. Return to original position in opposite direction and repeat. Continue with opposite side.','upload/exercise-picture/CBRussianTwistBall.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(791,'Cable Twist','Grasp stirrup from shoulder height cable pulley with both hands. Step and turn lower body away from pulley until near arm is horizontal and straight. Position feet wide apart facing away from pulley, furthest foot further away from pulley. Raise heel of nearest foot off floor. Bend knees of both legs slightly. Place far hand over other hand or interlace fingers.','Keeping arms straight, rotate torso to opposite side until cable makes contact with shoulder. Return to original position and repeat. Continue with opposite side.','upload/exercise-picture/CBTwist.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(792,'Cable Twist (down up)','Grasp stirrup from low cable pulley. Turn to one side, away from pulley. Position feet wide apart with furthest foot away from pulley and nearest foot close to pulley. Point both feet away from pulley. Raise heel of nearest foot off floor. Bend knees of both legs slightly. Place far hand over other hand or interlace fingers.','Keeping arms straight, pull stirrup diagonally upward around shoulders by rotating torso and raising arms gradually upward until cable makes contact with side of body. Bend knees slightly more as stirrup approaches top. Return to original position and repeat. Continue with opposite side.','upload/exercise-picture/CBDownUpTwist.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(793,'Cable Twist (up down)','Grasp stirrup from shoulder height cable pulley. Turn to one side, away from pulley until near arm is extended straight. Position feet wide apart with furthest foot away from pulley and nearest foot close to pulley. Point both feet away from pulley. Raise heel of nearest foot off floor. Place far hand over other hand or interlace fingers.','Keeping arms straight, pull stirrup diagonally downward around shoulders by rotating torso and gradually lowering arms downward until cable is just above shoulder. Gradually bend knees as stirrup makes its way around body and approaches bottom. Return to original position and repeat. Continue with opposite side.','upload/exercise-picture/CBUpDownTwist.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(794,'Lever Barbell Side Bend (plate loaded)','Stand with side to bar mid-thigh height. Grasp bar and disengage.','Bend waist to opposite side of bar. Lower weight by bending toward side with bar and repeat. Continue with opposite side facing opposite direction.','upload/exercise-picture/LVSMSideBend.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(795,'Dumbbell Russian Twist (on stability ball)','With dumbbell in hand, sit on stability ball. Roll body down and lie with back on ball, hips nearly straight, and feet apart on floor. Hold onto dumbbell with both hands with arms extending straight upward.','Turn torso to one side while keeping arms straight and perpendicular to torso throughout movement. Return dumbbell back over shoulders by rotating torso to original position. Continue lowering dumbbell to opposite side. Repeat.','upload/exercise-picture/DBRussianTwistBall.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(796,'Lever Seated Side Bend','Position seat so shoulders are same height of padded lever. Sit in machine with legs to one side. Place over lever pad. Push padded lever down slightly until shoulder is fixed at approximately 90º; upper arm parallel to floor.','With hips stationary, push down lever by bending to side so elbow points downward. Return and repeat. Position lower body to opposite side and repeat.','upload/exercise-picture/LVSideBend.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(797,'Lever Seated Side Leg Raise Crunch (plate loaded)','Sit on machine with seat turned to one side. Position back against back support and lower legs under padded bar. Grasp handles above to each side.','Pull handles down while pulling lower leg bar up by flexing waist and pelvis. Return and repeat. Turn seat to opposite side and repeat.','upload/exercise-picture/LVSeatedSideLegRaiseCrunchOblique.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(799,'Lever Kneeling Twist','Adjust range of motion setting on machine to one side. Kneel on padded stool with both knees between leg pads. Place torso against upper pads and grasp handles.','Rotate lower body through waist to opposite side. Return and repeat. Adjust range of motion setting to opposite side and repeat in opposite direction.','upload/exercise-picture/LVKneelingTwist.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(800,'Dumbbell Side Bend','Grasp dumbbell with arm straight to side.','Bend waist to opposite side of dumbbell until slight stretch is felt. Lower to opposite side, same distance and repeat. Continue with opposite side.','upload/exercise-picture/DBSideBend.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(801,'Dumbbell 45° Side Bend','Position side of thigh on padding and side of feet on leg padding or platform lip. Hold dumbbell straight downward with lower arm.','Raise torso upward by lateral flexing waist. Lower torso by bending waist downward. Repeat. Position body facing opposite side and continue with opposite side.','upload/exercise-picture/DB45SideBend.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(802,'Lever Seated Twist','Adjust range of motion setting on machine to one side. Sit with legs against padding. Place torso against pad and grasp handles.','Rotate torso through waist to opposite side. Return and repeat. Adjust range of motion setting to opposite side and repeat in opposite direction.','upload/exercise-picture/LVTwist.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(803,'Lever Lying Twist','Lie in machine with hands on handles, head on pad, partition between legs, and feet on foot bars. Disengage hand lever and rotate apparatus to one side until full spinal rotation is felt. Re-engage hand lever.','Rotate torso through waist to opposite side. Return and repeat. Readjust range of motion setting to opposite side and repeat in opposite direction.','upload/exercise-picture/LVLyingTwist.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(805,'Lever Seated Twist (gripless)','Adjust range of motion setting on seat to one side. Sit with legs straddled against padding. Wrap arms behind and under padded bars around each side.','Rotate torso through waist to opposite side. Return and repeat. Adjust range of motion setting to opposite side and repeat in opposite direction.','upload/exercise-picture/LVTwistGripless.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(806,'Sled Side Leg Hip Raise (ab coaster)','Straddle machine facing handles with seat turned to one side. Grasp handles on each side and place forearms on pads. Place shins on padded sled with knees in front of turned seat and feet hanging off of back end. Sit back toward heels without bending over.','Slide forward and up by pulling knees up high. Deliberately attempt to flex waist in a \"C\" shape. Return sled down and back arching spine in opposite direction while keeping hips bent. Repeat. Turn seat to opposite side and repeat.','upload/exercise-picture/SLSideHipRaiseAbCoaster.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(808,'Lever Seated Side Crunch','Position seat so shoulders are same height of padded lever. Sit on machine with legs angled to one side. Place arms over lever pad. Push padded lever down slightly until shoulders are are approximately 90º; upper arm parallel to floor.','With hips stationary, flex waist in \"C\" shape so elbows point downward. Return and repeat. Position lower body to opposite side and repeat.','upload/exercise-picture/LVSideCrunch.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(809,'Lever Standing Side Bend','Stand with side to lever handle and grasp. Stand upright.','Bend waist to opposite side of lever. Lower weight by bending to opposite side and repeat. Continue with opposite side facing opposite direction.','upload/exercise-picture/LVStandingSideBend.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(810,'Weighted Bent-knee Lying Twist','On floor or mat, place medicine ball between bent knees. Lie on back with arms extended out to sides. Raise bent legs so thighs are vertical and lower legs are horizontal.','Lower legs to one side until side of thigh is on floor. Raise and lower legs to opposite side. Repeat.','upload/exercise-picture/WTLyingBentKneeTwist.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(811,'Weighted Lying Twist','On floor or mat, place exercise ball between lower legs. Lie on back with arms extended out to sides. Raise legs upward with knees slightly bent.','Lower legs to one side until side of thigh is on floor. Raise and lower legs to opposite side. Repeat.','upload/exercise-picture/EBLyingTwist.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(812,'Weighted 45° Side Bend','Position side of thigh on padding and side of feet on leg padding or platform lip. Hold weight to chest or behind head.','Raise torso upward by lateral flexing waist. Lower torso by bending waist downward. Repeat. Position body facing opposite side and continue with opposite side.','upload/exercise-picture/Wt45SideBend.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(813,'Weighted Russian Twist (on stability ball)','With weight plate or medicine ball in hand, sit on stability ball. Roll body down and lie with back on ball, hips nearly straight, and feet apart on floor. Hold onto weight with both hands with arms extending straight upward.','Turn torso to one side while keeping arms straight and perpendicular to torso throughout movement. Return weight back over shoulders by rotating torso to original position. Continue lowering weight to opposite side. Repeat.','upload/exercise-picture/MBRussianTwistBall.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(817,'Weighted Side Bend (on stability ball)','Lie on ball on side of torso, waist, and hip. Position legs outward with feet on floor or against floor board. Hold weight behind or above head.','Raise side of torso up by laterally flexing waist. Lower torso back on ball and repeat. Position other side on ball and repeat with opposite side.','upload/exercise-picture/WTSideBendOnBall.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(826,'Dumbbell One Arm Straight Leg Deadlift','Stand with shoulder width or wide stance. Grasp dumbbell to side. Place opposite hand to side or behind low back.','With knees straight, lower dumbbell between feet by bending hips and twisting waist, so shoulder of weighted side is turned forward. Allow hips to fall back and waist to bend as dumbbell approaches floor. Lift dumbbell upward and back to side by extending hips and waist until standing upright. Pull shoulder back if rounded. Repeat. Perform exercise with opposite arm.','upload/exercise-picture/DBOneArmStraightlegDeadlift.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(827,'Bent-knee Lying Twist','Lie on back on floor or mat with arms extended out to sides. Raise bent legs so thighs are vertical and lower legs are horizontal.','Lower legs to one side until side of thigh is on floor. Raise and lower legs to opposite side. Repeat.','upload/exercise-picture/BWLyingBentKneeTwist.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(828,'Angled Side Bridge','Place forearm on padded elevated surface, positioned perpendicular to body. Position feet out away from elevated surface, one foot in front of other with hips and knees straight. Place free hand on upper hip and allow lower hip and waist to bend downward.','Raise hips upward by lateral flexion of spine. Lower to original position and repeat. Repeat with opposite side.','upload/exercise-picture/BWAngledSideBridgeRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(829,'Lying Twist','Lie on back on floor or mat with arms extended out to sides. Raise legs upward with knees slightly bent.','Lower legs to one side until side of thigh is on floor. Raise and lower legs to opposite side. Repeat.','upload/exercise-picture/BWLyingStraightLegTwist1.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(830,'Side Bridge','Lie on side on mat. Place forearm on mat under shoulder perpendicular to body. Place upper leg directly on top of lower leg and straighten knees and hips.','Raise hips upward by lateral flexion of spine. Lower to original position and repeat. Repeat with opposite side.','upload/exercise-picture/BWSideBridgeRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(831,'Bent Knee Side Bridge','Lie on side on mat. Place forearm on mat under shoulder perpendicular to body. Bend knees at a right angle. Place upper leg directly on top of lower leg and straighten hips.','Raise hips upward by lateral flexion of spine. Lower to original position and repeat. Repeat with opposite side.','upload/exercise-picture/BWBentKneeSideBridgeRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(832,'Side Bend (on stability ball)','Lie on ball on side of torso, waist, and hip. Position legs outward with feet on floor or against floor board.','Raise side of torso up by lateral flexing waist. Lower torso back on ball and repeat. Position other side on ball and repeat with opposite side.','upload/exercise-picture/EBSideBend.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(833,'Plank Twist (on stability ball)','Kneel with chest or waist on exercise ball. Dive over top and place hands on floor with arms extended down supporting upper body. While keeping body horizontal, walk hands further away from ball until thighs are positioned on top of ball. Bend knees so feet are up above knees.','Rotate hips so thighs roll over top of ball to one side. Rotate to opposite side and repeat.','upload/exercise-picture/BWExerciseBallPlankTwist.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(834,'Incline Twisting Crunch','Hook feet under foot bar and lie supine on incline bench with hips bent. Place hands behind neck.','Flex and twist waist to raise upper torso from bench to one side. Return until back of shoulders contact padded incline board. Repeat to opposite side alternating twists.','upload/exercise-picture/BWInclineTwistingCrunchNeck.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(835,'Twisting Situp (arms crossed)','Place feet under foot bar or low overhanging stationary object. Lie supine on floor, mat, or sit-up bench with hips and knees bent. Cross arms on chest.','Flex and twist waist to one direction while raising torso from bench by bending hips. Return until back of shoulders contact floor or mat. Repeat to opposite side alternating twists.','upload/exercise-picture/BWTwistingSitupShoulders.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(836,'Incline Twisting Situp (arms crossed)','Hook feet under foot or ankle brace and lie supine on incline bench with hips and knees bent. Cross arms on chest.','Flex and twist waist to one direction while raising torso from bench by bending hips. Raise crossed arm over opposite knees at top. Return until back of shoulders contact padded incline board. Repeat to opposite side alternating twists.','upload/exercise-picture/BWInclineTwistingSitupChest.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(837,'Twisting Situp','Place feet under foot bar or low overhanging stationary object. Lie supine on floor, mat, or sit-up bench with hips and knees bent. Place hands behind neck.','Flex and twist waist to one direction while raising torso from bench by bending hips. Return until back of shoulders contact floor or mat. Repeat to opposite side alternating twists.','upload/exercise-picture/BWTwistingSitupNeck.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(838,'Incline Twisting Crunch (arms crossed)','Hook feet under foot bar and lie supine on incline bench with hips bent. Cross arms on chest.','Flex and twist waist to raise upper torso from bench to one side. Return until back of shoulders contact padded incline board. Repeat to opposite side alternating twists.','upload/exercise-picture/BWInclineTwistingCrunchChest.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(839,'Incline Twisting Situp','Hook feet under foot or ankle brace and lie supine on incline bench with hips and knees bent. Place hands behind neck.','Flex and twist waist to one direction while raising torso from bench by bending hips. Return until back of shoulders contact padded incline board. Repeat to opposite side alternating twists.','upload/exercise-picture/BWTwistingSitupsNeck.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(840,'Twisting Crunch (on stability ball)','Sit on exercise ball. Walk forward on ball and lie back on ball with shoulders and head hanging off, and knees and hips bent. Gently hyperextend back to contour of ball. Hold plate behind neck or on chest with both hands or use no weight.','Flex waist to raise upper torso. Return to original position. Repeat.','upload/exercise-picture/BWTwistingCrunchBallHead.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(841,'Side Crunch','Lie upper back supine on floor or mat. With both legs together, knees and hips bent, position outside of leg down to side. Place one hand base on of neck or place arms across upper chest.','Flex waist, raising upper torso off mat or floor. Return until back of shoulders return to mat or floor. Repeat and continue with movement in opposite position.','upload/exercise-picture/BWSideCrunchOneArm.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(842,'Suspended Side Bend','Grasp handles, step away, and face body to one side of suspension trainer anchor. Hold handles above head with arms bent. Stand far enough away to make suspension trainer straps taut. Step in just enough to achieve desired lean of body, while keeping tension on suspension trainer straps.','Lower hips away from direction of suspension trainer anchor by laterally flexing spine. Return to original upright position and repeat. Reposition body facing opposite direction. Continue with other side.','upload/exercise-picture/STSideBend.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(843,'Twisting Crunch','Lie supine on mat with lower legs on bench. Place hands behind neck or head.','Flex and twist waist to raise upper torso from mat to one side. Return until back of shoulders contact mat. Repeat to opposite side alternating twists.','upload/exercise-picture/BWTwistingCrunchHead.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(844,'Suspended Side Bridge','Sit on floor or mat, facing suspension trainer loops in low position. Grasp bottom of loops, then lay supine. Raise legs and place heels in loops with soles contacting handles. Extend legs out with one leg crossed over other. Turn on side of lower leg so legs are parallel. Place forearm on mat or floor under shoulder perpendicular to body.','Raise hips upward by lateral flexion of spine. Lower to original position and repeat. Reposition to opposite side and continue.','upload/exercise-picture/STSideBridge.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(845,'Suspended Twist','Grasp suspension handle(s) with both hands, together with either one hand over other hand or with interlaced fingers. Momentarily step back until arms are extended forward and straight. While keeping arms straight and shoulders back, step forward so body reclines back behind suspension handle(s). Position body and legs straight at desired angle, hanging from handles with arms straight. Feet can be either shoulder width or as wide as desired.','While keeping arms straight and shoulders fixed, rotate torso up to one side. Twist until upright or slight stretch is felt in waist, whichever comes soonest. Rotate back to starting position and repeat. Continue on opposite side.','upload/exercise-picture/STTwist.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(846,'Side Crunch (on stability ball)','Sit on exercise ball. Walk forward on ball and lie back on ball with shoulders and head hanging off. Switch position of feet by positioning bent leg under extended leg so waist is twisted with hip positioned sideways. Gently hyperextend back to contour of ball. Place hands behind neck or cross arms across chest.','Flex waist to raise upper torso. Return to original position and repeat. Position legs in opposite position and continue.','upload/exercise-picture/BWSideCrunchOnBall.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(847,'Suspended Twisting Jack-knife','Sit on floor facing suspension trainer loops in low position. Place right foot in left lower loop. Cross left leg over right leg placed in right lower loop. Turn body to right and place hands on floor, shoulder width apart. Turn body to kneel on hands and knees. Reposition hands (shoulder width or slightly wider) at desired distance from suspension trainer so that body is square with suspension trainer straps. With arms straight, raise knees from ground so body is supported by arms and suspension trainer.','Pull knees toward one elbow by bending hips a nd knees to one side. Twist legs to one side, until hips and knees are completely flexed. Return by extending hips and knees to original straight position. Perform movement to opposite side. Continue by alternating each side.','upload/exercise-picture/STTwistingJackknife.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(848,'Twisting Crunch (arms crossed)','Lie supine on mat with lower legs on bench. Cross arms on chest.','Flex and twist waist to raise upper torso from mat to one side. Return until back of shoulders contact mat. Repeat to opposite side alternating twists.','upload/exercise-picture/BWTwistingCrunchChest.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(849,'Lying Crossover Stretch','On floor or mat, lie supine with arms extended to sides. Lift one leg straight up.','Lower leg to opposite side toward hand. Hold stretch. Repeat with opposite side.','upload/exercise-picture/f606be3198fbe65c3c1136f9a1c73c4e.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(850,'Pretzel Stretch','Sit on floor or mat with knees straight. Place one foot on floor to outside of other knee. Turn torso toward side of bent knee supporting body with extended arm behind. Place elbow of opposite arm to outside of bent knee.','Turn torso further around by pushing side of knee with elbow. Hold stretch. Repeat with opposite side.','upload/exercise-picture/dad74d1575d3cc3c6a0ba8f858c3a909.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(851,'Seated Bent Leg Oblique Stretch','Sit on floor or mat. Lean back slightly and place arms behind body with hands on floor for support. Bend knees and hips and place feet flat on floor.','Bring both knees and hip to one side. Hold stretch. Repeat with opposite side.','upload/exercise-picture/0431eaab87f7ddf8f7f0806f3a80d345.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(852,'Lying Bent Leg Oblique Stretch','Lie supine on floor or mat. Bend knees and place feet flat on floor.','Bring both knees and hip to one side. Hold stretch. Repeat with opposite side.','upload/exercise-picture/190c5905bcd45a2c9a98a05429b1c8d6.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(853,'Side Plank','Lie on side on mat. Place forearm on mat under shoulder perpendicular to body. Place upper leg directly on top of lower leg and straighten knees and hips.','Raise body upward by straightening waist so body is ridged. Hold position. Repeat with opposite side.','upload/exercise-picture/SidePlankElbow.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(854,'Bent Knee Side Plank','Lie on side on mat. Place forearm on mat under shoulder perpendicular to body. Bend knees at a right angle. Place upper leg directly on top of lower leg and straighten hips.','Raise body upward by straightening waist so hips and waist are ridged. Hold position. Repeat with opposite side.','upload/exercise-picture/SidePlankElbowKnee.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(855,'Barbell Back Extension (on hyperextension apparatus)','Position thighs prone on large pad and lower legs under padded bar. Place barbell on back of shoulders and grasp bar to sides.','Lower body by bending waist until fully flexed. Raise or extend waist until torso is parallel to legs. Repeat.','upload/exercise-picture/BBBackExtention.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(856,'Barbell Bent Knee Good-morning','Position barbell on back of shoulders and grasp bar to sides.','Bend hips to lower torso forward until parallel to floor. Bend knees slightly during descent. Raise torso until hips are extended. Repeat.','upload/exercise-picture/BBBentKneeGoodMorning.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(857,'Barbell Deadlift','With feet flat beneath bar, squat down and grasp bar with shoulder width or slightly wider overhand or mixed grip.','Lift bar by extending hips and knees to full extension. Pull shoulders back at top of lift if rounded. Return and repeat.','upload/exercise-picture/BBDeadlift.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(858,'Barbell Hyperextension','Position thighs prone on large pad and lower legs under padded brace. Place barbell on back of shoulders and grasp bar to sides.','Raise upper body until hips and waist are fully extended. Lower body by bending hips and waist until fully flexed. Repeat.','upload/exercise-picture/BBHyperExtention.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(859,'Barbell Sumo Deadlift','Position feet under bar with very wide stance. Squat down and grasp bar between legs with shoulder width mixed grip. Face forward while positioning shoulders upward with arms straight, chest high, hips low, and back straight.','Pull bar up by driving feet outward while pulling chest up. Extend knees when bar passes knees. At top of lift, when torso is upright, drive shoulders back and chest up. Return weight to floor by bending hips back and knees pointed outward, while keeping chest high and back straight. Repeat.','upload/exercise-picture/BBSumoDeadlift.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(860,'Barbell 45° Hyperextension','Position thighs prone on padding. Hook heels on platform lip or under padded brace. Place barbell on back of shoulders and grasp bar to sides.','Raise upper body until hips and waist are fully extended. Lower body by bending hips and waist until fully flexed. Repeat.','upload/exercise-picture/BBHyperextension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(861,'Barbell 45° Back Extension (on hyperextension apparatus)','Position thighs prone on padding. Hook heels on platform lip or under padded brace. Place barbell on back of shoulders and grasp bar to sides.','Lower body by bending waist until fully flexed. Raise, or extend waist until torso is parallel to legs. Repeat.','upload/exercise-picture/BBBackExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(862,'Barbell Block Pull','With barbell on blocks, position feet shoulder width or slightly narrower beneath bar. Squat down and grasp bar with shoulder width or slightly wider overhand or mixed grip.','Lift bar by extending hips and knees to full extension. Pull shoulders back at top of lift if rounded. Return and repeat.','upload/exercise-picture/BBBlockPull.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(863,'Barbell Sumo Block Pull','With barbell on blocks, position feet under bar with very wide stance. Squat down and grasp bar between legs with shoulder width mixed grip. Face forward while positioning shoulders upward with arms straight, chest high, hips low, and back straight.','Pull bar up by driving feet outward while pulling chest up. Extend knees when bar passes knees. At top of lift, when torso is upright, drive shoulders back and chest up. Return weight to blocks by bending hips back and knees pointed outward, while keeping chest high and back straight. Repeat.','upload/exercise-picture/BBBlockSumoPull.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(864,'Barbell Deficit Deadlift','Stand on weight plate, bumper plate, or shallow elevated platform with loaded bar above feet. Squat down and grasp bar with shoulder width or slightly wider overhand or mixed grip.','Lift bar by extending hips and knees to full extension. Pull shoulders back at top of lift if rounded. Return weights to floor by bending hips back while allowing knees to bend forward, keeping back straight and knees pointed same direction as feet. Repeat.','upload/exercise-picture/BBDeficitDeadlift.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(865,'Barbell Rack Pull','In power rack, with barbell on safety bar in low position, place feet shoulder width or slightly narrower beneath bar. Squat down and grasp bar with shoulder width or slightly wider overhand or mixed grip.','Lift bar by extending hips and knees to full extension. Pull shoulders back at top of lift if rounded. Return and repeat.','upload/exercise-picture/BBRackPullLow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(866,'Cable Stiff Leg Deadlift','Stand between two very low pulleys with shoulder width or narrower stance. Squat down and grasp stirrup attachments to each side. Stand upright with arms straight down to sides.','Bow forward by bending hips. Bend knees slightly during descent and keep waist straight, flexing low back at bottom. With knees slightly bent, raise torso by extending at waist, then hips, gradually extending knees until standing upright. Pull shoulders back slightly if rounded. Repeat.','upload/exercise-picture/CBStiffLegDeadlift.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(867,'Barbell Stiff Leg Deadlift','Stand with shoulder width or narrower stance on shallow platform with feet flat beneath bar. Bend knees and bend over with lower back straight. Grasp barbell with shoulder width overhand or mixed grip, shoulder width or slightly wider. Lift weight to standing position.','Lower bar to top of feet by bending hips. Bend knees slightly during descent and keep waist straight, flexing only slightly at bottom. With knees bent, lift bar by extending at hips until standing upright. Pull shoulders back slightly if rounded. Extend knees at top if desired. Repeat.','upload/exercise-picture/BBStiffLegDeadlift.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(868,'Trap Bar Deadlift','Stand with feet shoulder width or narrower in trap bar, weight to each side. Squat down with feet flat, low back taut. Grasp handles to sides.','Lift bar by extending hips and knees to full extension. Pull shoulders back at top of lift if rounded. Return and repeat.','upload/exercise-picture/TBDeadlift.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(869,'Trap Bar Stiff Leg Deadlift','Stand on platform under loaded trap bar. Squat down and grasp handles to sides. Squat / Deadlift bar up to standing position.','Lower bar by bending hips. Bend knees slightly during descent and keep waist straight, flexing only slightly at bottom. With knees bent, lift bar by extending at hips until standing upright. Pull shoulders back slightly if rounded. Extend knees at top if desired. Repeat.','upload/exercise-picture/TBStiffLegDeadlift.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(870,'Barbell Straight Leg Deadlift','Stand with shoulder width or narrower stance on shallow platform with feet flat beneath bar. Bend knees and bend over with lower back straight. Grasp barbell with shoulder width overhand or mixed grip, shoulder width or slightly wider. Lift weight to standing position.','With knees straight, lower bar toward top of feet by bending hips and waist. Lift bar by extending waist and hip until standing upright. Pull shoulders back slightly if rounded. Repeat.','upload/exercise-picture/BBStraightLegDeadlift.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(871,'Trap Bar Straight Leg Deadlift','Stand on platform under loaded trap bar. Squat down and grasp handles to sides. Squat / Deadlift bar up to standing position.','With knees straight, lower bar down by bending hips. After hips can no longer flex, bend waist as weights approach floor. Hands should be lowered near sides of ankles. Set weight on floor. Lift bar by extending waist and hip until standing upright. Pull shoulders back slightly if rounded. Repeat.','upload/exercise-picture/TBStraightLegDeadlift.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(872,'Dumbbell Straight Leg Deadlift','Stand with shoulder width or narrower stance. Grasp dumbbells to sides.','With knees straight, lower dumbbells to top or sides of feet by bending hips. Allow hips to fall back and bend waist as dumbbell approaches feet. Lift dumbbells by extending hips and waist until standing upright. Pull shoulders back if rounded. Repeat.','upload/exercise-picture/DBStraightLegDeadlift.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(873,'Lever Deadlift (plate loaded)','Stand in between lever handles. Squat down with feet flat and grasp handles to sides.','Lift lever by extending hips and knees to full extension. Pull shoulders back at top of lift if rounded. Return and repeat.','upload/exercise-picture/LVDeadliftA.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(874,'Cable Straight Leg Deadlift','Stand between two very low pulleys with shoulder width or narrower stance. Squat down and grasp stirrup attachments to each side. Stand upright with arms straight down to sides.','With knees straight, bow forward by bending hips. Bend waist as stirrups approach lowest position. Lift dumbbells by extending hips and waist until standing upright. Pull shoulders back slightly if rounded. Repeat.','upload/exercise-picture/CBStraightLegDeadlift.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(876,'Lever Kneeling Back Extension','Slide back under lever pad and kneel on lower pad. Grasp handles and position feet on foot bars. Make sure knees are against knee pad and hips are against upper thigh pad.','Extend spine until hyperextended. Return and repeat.','upload/exercise-picture/LVKneelingBackExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(877,'Lever Back Extension','Sit on machine with back against padded lever. Push hips back against back of seat by pushing feet against platform. Arch back in \"C\" shape.','Extend spine until hyperextended. Return and repeat.','upload/exercise-picture/LVBackExtensionN.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(878,'Lever Stiff Leg Deadlift (plate loaded)','Stand between lever handles with shoulder width or narrower stance. Squat down and grasp handles to each side. Stand upright with arms straight down to sides.','Bow forward by bending hips. Bend knees slightly during descent and keep waist straight, flexing low back at bottom. With knees slightly bent, raise torso by extending at waist, then hips, gradually extending knees until standing upright. Pull shoulders back slightly if rounded. Repeat.','upload/exercise-picture/LVStiffLegDeadlift.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(879,'Lever Straight Leg Deadlift (plate loaded)','Stand between lever handles with shoulder width or narrower stance. Squat down and grasp handles to each side. Stand upright with arms straight down to sides.','With knees straight, bow forward by bending hips. Bend waist as stirrups approach lowest position. Lift lever by extending hips and waist until standing upright. Pull shoulders back slightly if rounded. Repeat.','upload/exercise-picture/LVStraightLegDeadlift.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(880,'Smith Deadlift','Stand with shoulder width or narrower stance with feet flat beneath bar. Grasp bar with shoulder width or slightly wider mixed grip or slightly wider. Disengage bar by rotating bar back.','Squat down to lower bar by bending hips and knees. Lift bar by extending hips and knees to full extension. Pull shoulders back at top of lift if rounded. Return and repeat.','upload/exercise-picture/SMDeadlift.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(881,'Smith Stiff Leg Deadlift','Stand with shoulder width or narrower stance on elevated platform with thigh against bar. Grasp bar with shoulder width or slightly wider overhand grip. Disengage bar by rotating bar back.','With knees slightly bent, Lower bar toward top of feet by bending hips. Keep waist straight, flexing only slightly at bottom. Lift bar by extending at hips until standing upright. Pull shoulders back slightly if rounded. Extend knees at top if desired. Repeat.','upload/exercise-picture/SMStiffLegDeadlift.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(884,'Smith Bent Knee Good-morning','Position bar on back of shoulders. Grasp bar to sides. Disengage bar by rotating bar back.','Bend hips to lower torso forward until parallel to floor. Bend knees slightly during descent. Raise torso until hips are extended. Repeat.','upload/exercise-picture/SMBentkneeGoodmorning.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(885,'Smith Straight Leg Deadlift','Stand with shoulder width or narrower stance on elevated platform with thigh against bar. Grasp bar with shoulder width or slightly wider overhand grip. Disengage bar by rotating bar back.','With knees straight, lower bar toward top of feet by bending hips. After hips can no longer flex, bend waist as bar approaches top of feet. Lift bar by extending waist and hip until standing upright. Pull shoulders back slightly if rounded. Repeat.','upload/exercise-picture/SMStraightLegDeadlift.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(886,'Weighted Hyperextension','Position thighs prone on large pad and lower legs under padded brace. Hold weight to chest or behind neck.','Raise upper body until hips and waist are fully extended. Lower body by bending hips and waist until fully flexed. Repeat.','upload/exercise-picture/WTHyperExtension3.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(888,'Weighted Back Extension (on hyperextension apparatus)','Position thighs prone on large pad and lower legs under padded brace. Hold weight to chest or behind neck.','Lower body by bending waist until fully flexed. Raise, or extend waist until torso is parallel to legs. Repeat.','upload/exercise-picture/WTBackExtension2.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(889,'Weighted 45° Hyperextension','Position thighs prone on padding. Hook heels on platform lip or under padded brace. Hold weight to chest or behind neck.','Raise upper body until hips and waist are fully extended. Lower body by bending hips and waist until fully flexed. Repeat.','upload/exercise-picture/WtHyperExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(890,'Weighted Back Extension (on stability ball)','Lie prone on ball. Position toes out wide on floor for balance. Hold weight under chin or behind neck.','Raise torso off of ball by hyperextending spine. Return torso to ball and repeat.','upload/exercise-picture/SBHyperextention.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(891,'Weighted 45° Back Extension (on hyperextension apparatus)','Position thighs prone on padding. Hook heels on platform lip or under padded brace. Hold weight to chest or behind neck.','Lower body by bending waist until fully flexed. Raise, or extend waist until torso is parallel to legs. Repeat.','upload/exercise-picture/WTBackExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(892,'Back Extension (on stability ball, arms crossed)','Lie prone on ball, with front of feet apart on floor or with feet against base of wall. Cross arms, hands in front of shoulders.','Raise torso off of ball by hyperextending spine. Return torso to ball and repeat.','upload/exercise-picture/BWHyperextensionBallArmsCrossed.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(893,'Back Extension (on stability ball, arms up)','Lie prone on ball with feet against base of wall. Place arms parallel out over floor beyond head.','Raise torso off of ball and hands over head by hyperextending spine. Return torso to ball and hands toward floor. Repeat.','upload/exercise-picture/BWHyperextensionBallArmsUp.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(895,'Back Extension (on stability ball, arms down)','Lie prone on ball with feet against base of wall. Place arms to sides or clasp hands behind hips.','Raise torso off of ball by hyperextending spine. Return torso to ball and repeat.','upload/exercise-picture/BWHyperextensionBall.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(896,'Bird Dog','Kneel on mat on all fours with legs and hands slightly apart.','Raise arm out straight beside head while raising and extending leg on opposite side up out behind body. Lower arm and leg to floor to original position and repeat. Perform movement with opposite arm and leg.','upload/exercise-picture/BWBirdDog.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(897,'Alternating Bird Dog','Kneel on mat on all fours with legs and hands slightly apart.','Raise left arm out straight beside head while raising and extending right leg up out behind body. Lower arm and leg to floor to original position. Repeat by raising and lowering right arm and left leg in same manner. Repeat by alternating between opposite sides.','upload/exercise-picture/BWAlternatingBirdDog.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(898,'Hanging Hyperextension','Stand behind bar facing elevated platform positioned slightly away on other side of bar. Grasp bar with slightly wider than shoulder width grip. Walk body under bar and position back of heels on elevated platform. With legs extended forward, hang under bar with arms straight and hips bent just above floor.','Raise hips up as high as possible by extending hips and spine. Lower hips to original position just above floor. Repeat.','upload/exercise-picture/BWHangingHyperextension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(899,'Alternating Bird Dog (on exercise ball)','Lay on top of exercise ball with legs and hands slightly apart. Place chest down so torso is wrapped over ball.','Raise left arm and torso upward beside head while raising right leg up behind body. Lower arm, torso, and leg to original position and repeat. Repeat by raising and lowering right arm and left leg in same manner. Repeat by alternating between opposite sides.','upload/exercise-picture/BWAlternBirdDogHyperExBall.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(900,'Hyperextension (arms crossed)','Position thighs prone on large pad and lower legs under padded brace. Cross arms on chest.','Raise upper body until hips and waist are fully extended. Lower body by bending hips and waist until fully flexed. Repeat.','upload/exercise-picture/BWHyperExtensionX.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(901,'Bird Dog (on stability ball)','Lay on top of exercise ball with legs and hands slightly apart. Place chest down so torso is wrapped over ball.','Raise arm and torso upward beside head while raising leg on opposite side up out behind body. Lower arm, torso, and leg to original position and repeat. Perform movement with opposite arm and leg.','upload/exercise-picture/BWBirdDogHyperExBall.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(902,'Superman','Lie prone on mat with legs together and arms extended out on floor approximately parallel.','Slowly raise upper body and legs off floor. Return upper body and legs to floor and repeat.','upload/exercise-picture/Superman.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(903,'Contralateral Superman','Lie prone on mat with legs together and arms extended out on floor approximately parallel.','Raise left arm and shoulder and right leg up off floor. Lower arm and shoulder and leg to floor. Repeat by raising and lowering right arm and shoulder and left leg. Repeat by alternating between opposite sides.','upload/exercise-picture/ContraLateralSuperman.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(904,'Hyperextension','Position thighs prone on large pad and lower legs under padded brace. Place hands behind neck or to sides of head.','Raise upper body until hips and waist are fully extended. Lower body by bending hips and waist until fully flexed. Repeat.','upload/exercise-picture/BWHyperExtensionHead.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(905,'Hyperextension (hands behind hips)','Position thighs prone on large pad and lower legs under padded brace. Clasp hands behind hips.','Raise upper body until hips and waist are fully extended. Lower body by bending hips and waist until fully flexed. Repeat.','upload/exercise-picture/BWHyperExtensionHips.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(906,'Cat Stretch','Kneel on mat or floor. Place hands shoulder width apart.','Flex spine by hunching back up. Hold stretch.','upload/exercise-picture/85a341a1a24012749fe473a1106c6984.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(907,'Rear Incline Bridge','Sit on mat with legs together. Place hands back to sides on floor or mat so torso is reclined back slightly.','Raise hips up off floor until hips are straight. Hold position.','upload/exercise-picture/RearInclineBridge.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(908,'Bent-over Cat Stretch','Bend over with hands just above bent knees.','Flex spine by hunching back up. Hold stretch.','upload/exercise-picture/b5749d48d4c58dbce20b4c492af82004.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(909,'Cat Movement','Kneel on mat or floor. Place hands shoulder width apart.','Flex spine by hunching back up. Extend spine by arching back. Repeat.','upload/exercise-picture/CatMovement.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(910,'Lying Lower Back Stretch','Lie supine on floor or mat. Raise both knees and grasp back of thighs behind knees.','Pull knees toward shoulders allowing hips to be raised further off floor. Hold stretch.','upload/exercise-picture/ef0e66c71170773cedd6aaa015f334af.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(911,'Seated Lower Back Stretch','Sit on floor or mat with feet apart and knees bent approximately 90 degrees.','Reach forward between feet. Hold stretch.','upload/exercise-picture/d852814763a527dc7329c405e0155655.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(912,'Lever Lower Back Stretch','Sit on seat in forward position with lower legs on shin pad, feet on foot rest. Place hands through wrist straps. Hold upper bar with overhand grip.','Push and lower seat back. Hold stretch.','upload/exercise-picture/PCLowBack8.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(913,'Suspended Hyperextension','Grasp suspension handles and momentarily step back until arms are extended forward and straight. While keeping arms straight and shoulders back, step forward so body reclines back behind suspension handles. Fold at hips onto heels, allowing rear end to fall far back with arms and shoulders stretched forward.','Drive hips forward until hips are straight, while keeping arms and shoulders straight. Near top of motion, reach back with arms over head and hyperextend spine. While keeping arms over head, lower body with hips falling back down to starting position and repeat.','upload/exercise-picture/STHyperextension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(915,'Rear Decline Bridge','Lie supine on mat with arms to sides. Place feet flat on floor or mat with knees bent.','Raise hips up off floor until hips are straight. Hold position.','upload/exercise-picture/RearDeclineBridge.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(916,'Seated Bent-over Lower Back Stretch','Sit on chair or bench with feet wide apart. Bend over and position shoulders between knees.','Reach to floor under back of chair. Hold stretch.','upload/exercise-picture/764b4335143f6a5842325004e906a3f8.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(917,'Squatting Lower Back Stretch','Stand facing hip height fixed bar approximately arm length away. Grasp fixed bar.','Keeping feet flat on floor, squat down as low as possible and bend down with arms straight. Lean back slightly and allow shoulders to stretch forward. Hold stretch.','upload/exercise-picture/a1bb91259e95d163254658e3d2d1d6a2.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(918,'Plow Stretch','Lie on back and lift legs and hip overhead.','Allow knees to drop toward floor to sides of head. Hold stretch.','upload/exercise-picture/81ec4b57c0839751142053459f41f27c.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(919,'Barbell Seated Good-morning','Position barbell on back of shoulders and grasp bar to sides. Sit on end of bench or corner of box secured to floor. Position feet apart on floor with knees slightly bent.','Keeping back straight, bend torso forward as low as possible by bending hips. Raise torso until torso is upright. Repeat.','upload/exercise-picture/BBSeatedGoodMorning.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(926,'Barbell Single Leg Stiff-leg Deadlift','Hold barbell down in front, arms straight with shoulder width or slightly wider overhand grip. Stand with feet together. Lift leg slightly so foot is just off floor.','Lower bar to floor while raising lifted leg back behind. Keep back straight and knee of supporting leg slightly bent. Keep hip and knee of lifted leg extended throughout movement. Once stretch is felt or barbell contacts floor, return to original position by raising torso while lowering lifted leg. Straighten knee of supporting leg as torso becomes upright. Repeat.','upload/exercise-picture/BBSingleLegStiffLegDeadlift_.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(929,'Barbell Straight-back Stiff-leg Deadlift','Grasp barbell from rack or deadlift from floor with shoulder width or slightly wider overhand or mixed grip. Stand with shoulder width or narrower stance.','With back straight, lower bar to top of feet by bending hips. Bend knees slightly during descent and keep waist straight. Place weight onto floor. With knees still bent, lift bar by straightening hips until standing upright. Pull shoulders back if rounded. Extend knees at top if desired. Repeat.','upload/exercise-picture/BBStraightBackStiffLegDeadlift.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(930,'Barbell Hip Thrust','Sit on floor with long side of bench behind back. Roll barbell back and center over hips. Position upper back on corner of bench. Place feet on floor approximately shoulder width with knees bent. Grasp bar to each side.','Raise bar upward by extending hips until straight. Lower and repeat.','upload/exercise-picture/BBHipThrust.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(931,'Barbell Single Leg Split Squat','Stand facing away from bench. Position bar on back of shoulders and grasp barbell to sides. Extend leg back and place top of foot on bench.','Squat down by flexing knee and hip of front leg until knee of rear leg is almost in contact with floor. Return to original standing position by extending hip and knee of forward leg. Repeat. Continue with opposite leg.','upload/exercise-picture/BBSingleLegSplitSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(932,'Barbell Lunge','Clean bar from floor or dismount bar from rack. From rack with barbell upper chest height, position bar on back of shoulders and grasp barbell to sides.','Lunge forward with first leg. Land on heel, then forefoot. Lower body by flexing knee and hip of front leg until knee of rear leg is almost in contact with floor. Return to original standing position by forcibly extending hip and knee of forward leg. Repeat by alternating lunge with opposite leg.','upload/exercise-picture/BBLungeGlute.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(933,'Barbell Rear Lunge','From rack with barbell upper chest height, position bar on back of shoulders and grasp barbell to sides. Dismount bar from rack.','Step back with one leg while bending supporting leg. Plant forefoot far back on floor. Lower body by flexing knee and hip of supporting leg until knee of rear leg is almost in contact with floor. Return to original standing position by extending hip and knee of forward supporting leg and return rear leg next to supporting leg. Repeat movement with opposite legs alternating between sides.','upload/exercise-picture/BBRearLunge.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(934,'Barbell Single Leg Squat','Stand with arms extended out in front holding barbell. Balance on one leg with opposite leg extended straight leg forward as high as possible.','Squat down as far as possible while keeping leg elevated off of floor. Keep\n\n\nsupporting knee pointed same direction as foot supporting. Raise body back up to original position until knee and hip of supporting leg is straight. Return and repeat. Continue with opposite leg.','upload/exercise-picture/BBSingleLegSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(935,'Barbell Side Lunge','Clean bar from floor or dismount bar from rack. From rack with barbell upper chest height, position bar on back of shoulders and grasp barbell to sides.','Lunge to one side with first leg. Land on heel, then on forefoot. Lower body by flexing knee and hip of lead leg, keeping knee pointed same direction of foot. Return to original standing position by forcibly extending hip and knee of lead leg. Repeat by alternating lunge with opposite leg.','upload/exercise-picture/BBSideLunge.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(936,'Barbell Squat (low bar)','From rack with barbell at upper chest height, position bar low on back of shoulders. Grasp barbell to sides. Dismount bar from rack and stand with wide stance.','Squat down by bending hips back while allowing knees to bend forward slightly, keeping back straight and knees pointed same direction as feet. Descend until thighs are just past parallel to floor. Extend hips and knees until legs are straight. Return and repeat.','upload/exercise-picture/BBSquatPowerlift.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(937,'Barbell Walking Lunge','Position barbell on back of shoulders and grasp bar to sides.','Step forward with first leg. Land on heel, then forefoot. Lower body by flexing knee and hip of front leg until knee of rear leg is almost in contact with floor. Stand on forward leg with assistance of rear leg. Lunge forward with opposite leg. Repeat by alternating lunge with opposite legs.','upload/exercise-picture/BBWalkingLunge.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(938,'Barbell Split Squat','Position barbell on back of shoulders and grasp barbell to sides. Stand with feet far apart; one foot forward and other foot behind.','Squat down by flexing knee and hip of front leg. Allow heel of rear foot to rise up while knee of rear leg bends slightly until it almost makes contact with floor. Return to original standing position by extending hip and knee of forward leg. Repeat. Continue with opposite leg.','upload/exercise-picture/BBSplitSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(939,'Safety Barbell Squat','Standing facing safety barbell on rack upper chest height. Position head in yoke with padded bar around shoulders. Hands can be placed on ends of yoke (as shown) or on safety bar out to sides. Dismount bar from rack and step back.','Squat down by bending hips back while allowing knees to bend slightly forward, keeping back straight and knees pointed same direction as feet. Descend until thighs are just past parallel to floor. Stand by extending hips and knees until legs are straight. Repeat.','upload/exercise-picture/SBSquatC.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(940,'Barbell Full Squat','From rack with barbell upper chest height, position barbell on back of shoulders and grasp bar to sides. Dismount bar from rack.','Squat down by bending hips back while allowing knees to bend forward, keeping back straight and knees pointed same direction as feet. Descend until knees and hips are fully bent. Extend knees and hips until legs are straight. Return and repeat.','upload/exercise-picture/BBFullSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(941,'Safety Barbell Squat (long handles)','Standing facing safety barbell on rack upper chest height. Position head in yoke with padded bar around shoulders. Grasp ends of handles. Dismount bar from rack and step back.','Squat down by bending hips back while allowing knees to bend slightly forward, keeping back straight and knees pointed same direction as feet. Descend until thighs are just past parallel to floor. Stand with or without assistance of arms, extending knees and hips until legs are straight. Repeat.','upload/exercise-picture/SBSquatHandles.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(942,'Barbell Hack Squat','Position barbell just behind legs. With feet flat on floor, squat down and grasp barbell from behind with overhand grip.','Lift bar by extending hips and knees to full extension. Squat down by bending knees forward while allowing hips to bend back behind, keeping back straight and knees pointed same direction as feet. Descend until thighs are close to parallel to floor and bar is behind lower leg. Repeat.','upload/exercise-picture/BBHackSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(943,'Barbell Box Squat','From rack with barbell at upper chest height, position bar on back of shoulders. Grasp barbell to sides. Dismount bar from rack and back up until contact is made with box immediately behind. Stand with wide stance with feet flared out slightly.','Sit back onto box by bending hips back while bending knees, keeping shins nearly perpendicular or knees slightly behind ankles. Lower rear end back onto box in controlled manner. Rock torso back slightly. Once torso rocks forward, immediately stand back up rapidly by driving hips upward, keeping knees above ankles and chest high until legs are straight. Return and repeat.','upload/exercise-picture/BBBoxSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(944,'Barbell Zercher Squat','From rack with barbell upper waist height position, forearms under bar and in front of bar with elbows shoulder width apart. Cross wrists and pull bar in, close against body. Lift barbell from rack. Step back with wide stance, feet pointing out 20-30°.','Squat down by bending hips back while allowing knees to bend forward, keeping back straight, hands close to body, and knees pointed same direction as feet. Descend until thighs are near parallel. Extend knees and hips until legs are straight. Return and repeat.','upload/exercise-picture/BBZercherSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(945,'Safety Barbell Squat (self-spotting)','Stand facing safety barbell on rack upper chest height. Place hands vertical rack supports. Position head in yoke with padded bar around shoulders. Dismount bar from rack and step back so body is upright at arms length from supports.','Squat down by bending hips back while allowing knees to bend forward slightly, keeping back straight and knees pointed same direction as feet. Descend until thighs are just past parallel to floor. Stand with or without assistance of arms, extending hips and knees until legs are straight. Repeat.','upload/exercise-picture/SBSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(946,'Trap Bar Squat','Stand on platform under loaded trap bar. Squat down until thighs are just past parallel to floor with knees pointed same direction as feet and feet flat on platform. Grasp handles to sides. Posture chest up with back arched tightly.','Lift weight upward by extending knees and hips until straight. Pull shoulders back at top of lift if rounded. Return weight to floor by bending hips back, while allowing knees to bend forward slightly, keeping back straight and knees pointed same direction as feet. Repeat.','upload/exercise-picture/TBSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(947,'Barbell Squat (with chains)','Stand facing barbell, racked upper chest height, with thick chains hanging to floor on each side. Position bar low on back of shoulders. Grasp barbell to sides and position elbows back. Dismount bar from rack and stand with wide stance.','Squat down by bending hips back while allowing knees to bend forward slightly, keeping back straight and knees pointed same direction as feet.\n\n\nDescend until thighs are just past parallel to floor. Extend hips and knees until legs are straight. Return and repeat.','upload/exercise-picture/BBSquatChains.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(948,'Barbell Front Squat','From rack with barbell upper chest height, position bar in front of shoulders. Cross arms and place hands on top of barbell with upper arms parallel to floor. Dismount bar from rack.','Squat down by bending hips back while allowing knees to bend forward, keeping back straight and knees pointed same direction as feet. Descend until thighs are just past parallel. Extend knees and hips until legs are straight. Return and repeat.','upload/exercise-picture/BBFrontSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(949,'Barbell Lateral Step-up','Stand between two benches, one to each side. Position bar on back of shoulders and grasp barbell to sides.','Lift leg and place foot on bench to side and forward of straight knee. Stand on bench by straightening leg and pushing body upward. Step down returning feet to original position. Repeat with opposite leg, alternating between legs.','upload/exercise-picture/BBLateralStepUp.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(950,'Cable Rear Lunge','Stand between two very low pulleys with shoulder width or narrower stance. Squat down and grasp stirrup attachments to each side. Stand upright with arms straight down to sides.','Step back with one leg while bending supporting leg. Plant forefoot far back on floor. Lower body by flexing knee and hip of supporting leg until knee of rear leg is almost in contact with floor. Return to original standing position by extending hip and knee of forward supporting leg and return rear leg next to supporting leg. Repeat movement with opposite legs alternating between sides.','upload/exercise-picture/CBRearLunge.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(952,'Barbell Step-up','Stand facing side of bench. Position bar on back of shoulders and grasp barbell to sides.','Place foot of first leg on bench. Stand on bench by extending hip and knee of first leg and place foot of second leg on bench. Step down with second leg by flexing hip and knee of first leg. Return to original standing position by placing foot of first leg to floor. Repeat first step with opposite leg alternating first steps between legs.','upload/exercise-picture/BBStepUp.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(954,'Trap Bar Straight-back Stiff-leg Deadlift','Stand with feet shoulder width or narrower in trap bar, weight to each side. Squat down with feet flat and grasp handles to sides. Deadlift from floor.','With back straight, lower bar toward floor by bending at hips. Bend knees slightly during descent and keep waist straight. Place weight onto floor. With knees still bent, lift bar by extending at hips until standing upright. Pull shoulders back if rounded. Extend knees at top if desired. Repeat.','upload/exercise-picture/TBStraightBackStiffLegDeadlift.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(955,'Cable One Arm Single Leg Split Squat','Stand between bench and low pulley cable. Grasp cable stirrup with one hand. Facing low pulley, extend leg back and place top of foot or forefoot on bench. Place other hand on hip or support to side.','Squat down by flexing knee and hip of front leg until knee of rear leg is almost in contact with floor. Return to original standing position by extending hip and knee of forward leg. Repeat. Continue with opposite leg.','upload/exercise-picture/CBSingleLegSplitSquatOneArm.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(956,'Cable Split Squat (belt)','Facing low pulley, kneel to attach cable belt or dip belt around waist. Place hand(s) on ballet bar or machine (not on guide rod!) for balance. Stand away from pulley with one leg forward and opposite leg to rear.','Squat down by flexing knee and hip of front leg. Allow heel of rear foot to rise up while knee of rear leg bends slightly until it almost makes contact with floor. Return to original straddle position by extending hip and knee of forward leg. Repeat. Continue with legs in opposite position.','upload/exercise-picture/CBLungeFar.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(957,'Cable Rear Step-down Lunge','Stand on upper platform with stirrups grasped to sides.','Extend one leg back on forefoot. Lower body on other leg by flexing knee and hip of front leg until knee of rear leg is almost in contact with lower platform. Return to original standing position by extending hip and knee of forward leg. Repeat by alternating rear lunge with opposite leg.','upload/exercise-picture/CBRearLunge.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(958,'Cable Single Leg Split Squat','Facing away from bench, stand between two very low pulleys with shoulder width or narrower stance. Squat down and grasp stirrup attachments to each side. Stand upright with arms straight down to sides. Extend leg back and place top of foot on bench.','Squat down by flexing knee and hip of front leg until knee of rear leg is almost in contact with floor. Return to original standing position by extending hip and knee of forward leg. Repeat. Continue with opposite leg.','upload/exercise-picture/CBSingleLegSplitSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(959,'Cable Bar Squat','Adjust cable pulleys to medium low positions. Kneel under attached cable bar while supporting it with both hands. Position body in lower squat position with cable bar on top of shoulders, both feet flat on floor with mid feet in line with both pulleys, knees positioned same direction as feet, back straight and angled forward, and hands grasping bar to each side.','Stand up by extending hips and knees until legs are straight. Squat back down by bending hips back while allowing knees to bend slightly forward, keeping back straight and knees pointed same direction as feet. Descend until thighs are just past parallel to floor. Return and repeat.','upload/exercise-picture/CBBarSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(960,'Cable One Arm Split Squat','Face low pulley and grasp stirrup attachment with one hand. Stand away from pulley with one leg forward and opposite leg to rear. Place other hand on hip or on support to side.','Squat down by flexing knee and hip of front leg. Allow heel of rear foot to rise up while knee of rear leg bends slightly until it almost makes contact with floor. Return to original straddle position by extending hip and knee of forward leg. Repeat. Continue with legs in opposite position.','upload/exercise-picture/CBLungeOneArm.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(961,'Cable Standing Hip Extension','Attach ankle cuff to low pulley. With cuff on one ankle, grasp ballet bar with both hands and step back with other foot. Elbows remain straight. Attached leg is straight and foot is slightly off floor.','Pull cable attachment back by extending hip. Return leg to original position. Repeat. Continue with opposite leg.','upload/exercise-picture/CBStandingHipExtentionFM.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(962,'Cable Squat','Stand with feet shoulder width or slightly wider on platform between very low and close pulley cables. Squat down with knees slightly beyond foot and shoulder above feet. Grasp stirrups to each side with arms straight.','Keeping chest high and back straight, raise stirrups by extending knees and hips until legs are straight. Squat down by bending hips back while allowing knees to bend forward slightly, keeping back straight and knees pointed same direction as feet. Squat down until thighs are just past parallel to floor. Return and repeat.','upload/exercise-picture/CBSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(963,'Cable Split Squat','Stand between two very low cable pulleys. Grasp stirrup attachments with each hand. Place one leg far forward and opposite leg far back to rear.','Squat down by flexing knee and hip of front leg. Allow heel of rear foot to rise up while knee of rear leg bends slightly until it almost makes contact with floor. Return to original straddle position by extending hip and knee of forward leg. Repeat. Continue with legs in opposite position.','upload/exercise-picture/CBLungeGlute.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(965,'Cable Belt Squat','Place pin on lightest weight. Place belt around waist. Pull cable from pulley and attach to front of belt. Step onto platform and grasp pole. Squat or sit on platform and select desired weight. Stand with feet shoulder width or wider to each side of cable. Place both hands on pole at waist height.','Squat down by bending hips back while allowing knees to bend forward slightly, keeping back straight and knees pointed same direction as feet.\n\n\nDescend until thighs are just past parallel to floor. Squat up by extending knees and hips until legs are straight. Return and repeat.','upload/exercise-picture/CBSquatBeltGlute.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(966,'Cable Bent-over Hip Extension','Attach ankle cuff to low pulley. With cuff on one ankle, grasp ballet bar with both hands and step far back with other foot. Elbows remain straight to support body leaning forward. Attached leg is straight and foot is stretched off floor.','Pull cable attachment back by extending hip. Return leg to original position. Repeat. Continue with opposite leg.','upload/exercise-picture/CBStandingHipExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(967,'Cable Straight-back Stiff-leg Deadlift','Stand between two very low pulleys with shoulder width or narrower stance. Squat down and grasp stirrup attachments to each side. Stand upright with arms straight down to sides.','With back straight, bow forward by bending hips and bend knees slightly during descent. Raise torso by extending hips while gradually extending knees until standing upright. Pull shoulders back slightly if rounded. Repeat.','upload/exercise-picture/CBStraightBackStifLegDeadlift.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(968,'Cable Step-up','Stand behind elevated platform and low and close pulley cables to sides. Grasp stirrups at each side of platform. Stand upright with arms straight down at sides.','Place foot of first leg on elevated platform. Stand on elevated platform by extending hip and knee of first leg and place foot of second leg on bench. Step down with second leg by flexing hip and knee of first leg. Return to original standing position by placing foot of first leg to lower position. Repeat first step with opposite leg alternating first steps between legs.','upload/exercise-picture/CBStepUp.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(969,'Dumbbell Squat','Stand with dumbbells grasped to sides.','Squat down by bending hips back while allowing knees to bend forward slightly, keeping back straight and knees pointed same direction as feet.\n\n\nDescend until thighs are just past parallel to floor. Extend knees and hips until legs are straight. Return and repeat.','upload/exercise-picture/DBSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(970,'Dumbell Single Leg Stiff-leg Deadlift','Hold dumbbell in each hand. Position dumbbells down in front of upper thighs with arms straight. Stand with feet together. Lift leg slightly so foot is just off floor.','Lower dumbells to floor while raising lifted leg back behind. Keep back straight and knee of supporting leg slightly bend. Keep hip and knee of lifted leg extended throughout movement. Once stretch is felt or dumbells contacts floor, return to original position by raising torso while lowering lifted leg. Straighten knee of supporting leg as torso becomes upright. Repeat.','upload/exercise-picture/DBSingleLegStiffLegDeadlift.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(971,'Dumbbell Single Leg Split Squat','Stand with dumbbells grasped to sides facing away from bench. Extend leg back and place top of foot on bench.','Squat down by flexing knee and hip of front leg until knee of rear leg is almost in contact with floor. Return to original standing position by extending hip and knee of forward leg. Repeat. Continue with opposite leg.','upload/exercise-picture/DBSingleLegSplitSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(972,'Dumbbell Rear Lunge','Stand with dumbbells grasped to sides.','Step back with one leg while bending supporting leg. Plant forefoot far back on floor. Lower body by flexing knee and hip of supporting leg until knee of rear leg is almost in contact with floor. Return to original standing position by extending hip and knee of forward supporting leg and return rear leg next to supporting leg. Repeat movement with opposite legs alternating between sides.','upload/exercise-picture/DBRearLunge.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(973,'Dumbbell Lunge','Stand with dumbbells grasped to sides.','Lunge forward with first leg. Land on heel then forefoot. Lower body by flexing knee and hip of front leg until knee of rear leg is almost in contact with floor. Return to original standing position by forcibly extending hip and knee of forward leg. Repeat by alternating lunge with opposite leg.','upload/exercise-picture/DBLungeGlute.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(974,'Dumbbell Side Lunge','Stand with dumbbells grasped to sides.','Lunge to one side with first leg. Position closest dumbbell behind thigh and opposite dumbbell to front. Land on heel then forefoot. Lower body by flexing knee and hip of lead leg, keeping knee pointed same direction of foot. Return to original standing position by forcibly extending hip and knee of lead leg. Repeat by alternating lunge with opposite leg.','upload/exercise-picture/DBSideLunge.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(975,'Dumbbell Split Squat','Stand with dumbbells grasped to sides. Stand with feet far apart; one foot forward and other foot behind.','Squat down by flexing knee and hip of front leg. Allow heel of rear foot to rise up while knee of rear leg bends slightly until it almost makes contact with floor. Return to original standing position by extending hip and knee of forward leg. Repeat. Continue with opposite leg.','upload/exercise-picture/DBSplitSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(976,'Dumbbell Front Squat','Stand with dumbbells grasped to sides. Clean dumbbells up to shoulders so side of each dumbbell rests on top of each shoulder. Balance dumbbells on shoulder by holding on to dumbbells with elbows flaring outward. Position feet shoulder width or slightly narrower apart.','Squat down by bending hips back while allowing knees to bend forward slightly, keeping back straight and knees pointed same direction as feet. Descend until thighs are just past parallel to floor. Extend knees and hips until legs are straight. Return and repeat.','upload/exercise-picture/DBFrontSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(977,'Dumbbell Walking Lunge','Stand with dumbbells grasped to sides.','Step forward with first leg. Land on heel then forefoot. Lower body by flexing knee and hip of front leg until knee of rear leg is almost in contact with floor. Stand on forward leg with assistance of rear leg. Lunge forward with opposite leg. Repeat by alternating lunge with opposite legs.','upload/exercise-picture/DBWalkingLunge.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(978,'Dumbbell Single Leg Squat','Stand with dumbbells grasped to sides. Balance on one leg with opposite leg extended straight leg forward as high as possible.','Squat down as far as possible while keeping leg elevated off of floor. Keep\n\n\nsupporting knee pointed same direction as foot supporting. Raise body back up to original position until knee and hip of supporting leg is straight. Return and repeat. Continue with opposite leg.','upload/exercise-picture/DBSingleLegSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(979,'Lever Bent-over Rear Kick (plate loaded)','Lean over wide padded area, place forearms on padded arm rest, and grip handles. Bend knee and position foot against lever platform.','Push platform back by extending leg back. Return leg to original position. Repeat. Continue with opposite leg.','upload/exercise-picture/LVBentOverRearKickPL.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(981,'Dumbbell Lateral Step-up','Stand between two benches, one to each side. Hold dumbbells in each hand down to sides','Lift leg and place foot on bench to side and forward of straight knee. Stand on bench by straightening leg and pushing body upward. Step down returning feet to original position. Repeat with opposite leg alternating between legs.','upload/exercise-picture/DBLateralStepUp.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(982,'Dumbbell Step Down','Hold dumbbells in each hand down to sides and stand with one foot on bench. Position foot on bench to side, forward of straight knee.','Stand on bench by straightening leg and pushing body upward. Step down returning foot off of bench to floor and repeat. Continue with opposite position.','upload/exercise-picture/DBStepDown.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(984,'Dumbbell Step-up','Stand with dumbbells grasped to sides facing side of bench.','Place foot of first leg on bench. Stand on bench by extending hip and knee of first leg and place foot of second leg on bench. Step down with second leg by flexing hip and knee of first leg. Return to original standing position by placing foot of first leg to floor. Repeat first step with opposite leg, alternating first steps between legs.','upload/exercise-picture/DBStepUp.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(985,'Lever Hack Press (plate loaded)','Sit on seat with back of hips against back pad. Place feet on platform shoulder width or slightly wider. Extend hips and knees. Disengage dock lever if it does not automatically disengage.','Lower seat by flex hips and knees until either is near complete flexion. Raise seat by extending knees and hips. Repeat.','upload/exercise-picture/LVHackPressWide.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(986,'Lever 45° Leg Press (plate loaded)','Sit on machine with back on padded support. Place feet slightly high on platform. Extend hips and knees. Release dock lever and grasp handles to sides.','Flex hips and knees to lower lever until hips are completely flexed. Push platform by extending knees and hips. Repeat.','upload/exercise-picture/LV45DegLegPressWide.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(987,'Lever Straight-back Stiff-leg Deadlift (plate loaded)','Stand between lever handles with shoulder width or narrower stance. Squat down and grasp handles to each side. Stand upright with arms straight down to sides.','With back straight, bow forward by bending hips and bend knees slightly during descent. Raise torso by extending hips while gradually extending knees until standing upright. Pull shoulders back slightly if rounded. Repeat.','upload/exercise-picture/LVStraightBackStiffLegDeadlift.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(988,'Lever Single Leg 45° Leg Press','Sit on machine with back on padded support. Place one foot mid height to high up on platform. Place outside of resting foot on lower surface with knee positioned out for greater clearance. Push platform up by extending hip and knee. Release dock lever and grasp handles to sides.','Lower platform by bending leg until knee is just short of complete flexion. Return by extending knee and hip. Repeat. Continue with opposite leg.','upload/exercise-picture/LVSingleLeg45DegLegPressGluteL.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(989,'Lever Single Leg Lying Leg Press (custom - plate loaded)','Lie supine on padded platform. Place hands on bars above head or to sides. Place one foot on platform and other foot on floor below platform.','Push platform away by extending hip and knee. Return by bending leg until knee or hip is just short of complete flexion. Repeat. Continue with opposite leg.','upload/exercise-picture/LVSingleLegLyingLegPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(990,'Lever Lying Leg Press (plate loaded)','Climb up steps to top of machine. Lie supine on horizontal padded platform with shoulders against pad. Place feet equally spaced and slightly high on platform. Grip handles above shoulder pads.','Push lever platform away by extending hips and knees until knees are straight. Return lever platform by flexing hips and knees until knees are just short of complete flexion or until hips are completely flexed. Repeat.','upload/exercise-picture/LVLyingLegPressH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(991,'Lever Alternating Seated Leg Press (plate loaded)','Sit on machine with back on padded support. Place feet on slightly high on platform. Grasp handles to sides.','Push one platform away by extending knee and hip. Return to original position. Repeat with opposite leg. Continue by alternating between sides.','upload/exercise-picture/LVAlternatingLegPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(992,'Lever Single Leg Seated Leg Press (plate loaded)','Sit on machine with back on padded support. Place one foot slightly high on platform and other foot near floor below platform or off to side.','Push platform away by extending hip and knee. Return by bending leg until knee or hip is just short of complete flexion. Repeat. Continue with opposite leg.','upload/exercise-picture/LVSingleLegSeatedLegPress2.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(993,'Lever Seated Leg Press (plate loaded)','Sit on machine with back on padded support. Place feet slightly high on platform. Grasp handles to sides.','Push platform(s) away by extending knees and hips until knees are fully extended. Return until hips are completely flexed. Repeat.','upload/exercise-picture/LVSeatedLegPresWideH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(994,'Lever Lying Hip Extension (plate loaded)','Lie on bench with knees legs over pads. Align hip joints with lever fulcrum. Strap hips down with belt. Grasp handles at each side.','Extend hips and knees until legs are straight. Return to original position by flexing hips and knees. Repeat.','upload/exercise-picture/LVLyingHipExtentionH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(995,'Lever Power Runner (plate loaded)','Place forefeet into pedals. Squat down and position shoulders forward in padded yoke. Grasp handles to sides. Push one pedal back by extending knee and hip so one leg is straight while the other remains forward.','Push forward pedal back by extending leg while allowing other pedal to come forward by bending opposite leg. Continue pedalling by alternating between sides.','upload/exercise-picture/LVPowerRunnerPL.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(996,'Lever Lying Leg Press (custom - plate loaded)','Lie supine on padded platform. Place hands on bars above head or to sides. Place feet flat on lever platform with hips and knees bent.','Push lever platform by extending hips and knees until knees are straight. Lower lever platform by flexing hips and knees until knees are just short of complete flexion. Repeat.','upload/exercise-picture/LVLyingLegPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(997,'Lever Barbell Rear Lunge (plate loaded)','With bar upper chest height, position bar on back of shoulders and grasp bar to sides. Place feet under bar or slightly forward. Straighten legs so weight is lifted. Disengage bar by rotating bar back. Place feet slightly forward.','Step back with one leg while bending supporting leg. Plant forefoot far back on floor. Lower body by flexing knee and hip of supporting leg until knee of rear leg is almost in contact with floor. Return to original standing position by extending hip and knee of forward supporting leg and return rear leg next to supporting leg. Repeat movement with opposite legs alternating between sides.','upload/exercise-picture/LVSMReverseLunge.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(998,'Lever Rear Lunge (plate loaded)','Stand between lever handles to sides. Squat down with feet flat on floor and grasp lower handles to sides. Lift lever by extending hips and knees to full extension. Position both feet slightly forward.','Step back with one leg while bending supporting leg. Plant forefoot far back on floor. Lower body by flexing knee and hip of supporting leg\n\n\nuntil knee of rear leg is almost in contact with floor. Return to original standing position by extending hip and knee of forward supporting leg and return rear leg next to supporting leg. Repeat movement with opposite legs alternating between sides.','upload/exercise-picture/LVRearLunge.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(999,'Lever Single Leg Split Squat (plate loaded)','Stand between lever handles to sides. Extend leg back and place top of foot on cross bar. Squat down and grasp handles to sides.','With chest high, lift lever by extending hips and knees to full extension. Return until knee of rear leg is almost in contact with floor. Repeat. Continue with opposite leg.','upload/exercise-picture/LVSingleLegSplitSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1000,'Lever Barbell Split Squat (plate loaded)','With bar upper chest height, position bar on back of shoulders and grasp bar to sides. Place one foot forward and forefoot of other leg further back. Disengage bar by rotating bar back.','Lower body on other leg by flexing knees and hips of of both legs until knee of rear leg is almost in contact with floor. Return to original straddled position by extending hips and knees of both legs. Repeat. Continue with opposite leg.','upload/exercise-picture/LVSMSingleLegSplitSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1001,'Lever Split Squat (plate loaded)','Stand between lever handles to sides. Place forefoot of one foot on floor to rear and other foot slightly forward. Squat down and grasp handles to sides.','With chest high, lift lever by extending hips and knees to full extension. Return until knee of rear leg is almost in contact with floor and repeat. Continue with opposite leg.','upload/exercise-picture/LVSplitSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1002,'Lever Barbell Single Leg Split Squat (plate loaded)','Place bench behind smith bar. With bar upper chest height, position bar on back of shoulders and grasp bar to sides. Place foot slightly forward under bar. Extend other leg back and place top of foot on bench. Disengage bar by rotating bar back.','Lower body by flexing knee and hip of front leg until knee of rear leg is almost in contact with floor. Return to original standing position by extending hip and knee of forward leg. Repeat. Continue with opposite leg.','upload/exercise-picture/LVSMReverseLunge.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1003,'Lever Reverse Hyper-extension (plate loaded)','Place one leg in strap so it is positioned above ankle. Step up onto step built on side of apparatus with other foot. Lay torso and waist on bench and grasp handles. Place stepping foot inside of strap, just in front of leg already in strap. Position legs side by side. Feet should be above floor with legs hanging straight down.','Raise lever by extending hips as high as possible with legs nearly straight. Lower legs to original position. Repeat.','upload/exercise-picture/LVReverseHyperExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1004,'Lever Squat (plate loaded)','Squat down to place shoulders under padded lever. Place feet shoulder width or marginally wider apart, slightly in front of shoulders. Extend knees and hips until legs are straight. Release support lever.','Squat down by bending hips back while allowing knees to bend forward slightly, keeping back straight and knees pointed same direction as feet. Descend by bending knees and hip until thighs are just past parallel to floor. Lift lever up by extending knees and hips until legs are straight. Repeat.','upload/exercise-picture/LVSquatGlutePL2.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1005,'Lever Single Leg Squat (plate loaded)','Stand between handles facing away from fulcrum. Grasp both handles to sides and stand upright. Cross lower leg above knee of supporting leg.','Bend knee forward slightly while allowing hips to bend back behind, keeping back straight and knee pointed same direction of foot. Squat down as low as possible. Extend knee and hip until leg is straight. Return and repeat. Continue with opposite leg.','upload/exercise-picture/LVSingleLegSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1007,'Lever Sliding Split Squat (plate loaded)','Stand with one foot on stationary platform under foot pad and other foot back on sliding platform. Squat down and grasp handles to sides. Stand upright with arms straight to sides.','Lower lever downward by sliding platform back and squatting down on forward leg. Keep chest high as hips descend to knee height. Lift sliding forward and extending hips and knee to full extension. Repeat and continue with opposite leg.','upload/exercise-picture/LVSlidingSplitSquatPL.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1008,'Lever Barbell Squat (plate loaded)','With bar upper chest height, position bar on back of shoulders and grasp bar to sides. Place feet slightly forward. Disengage bar by rotating bar back.','Squat down by bending hips back while allowing knees to bend forward slightly, keeping back straight and knees pointed same direction as feet.\n\n\nDescend until thighs are just past parallel to floor. Extend knees and hips until legs are straight. Return and repeat.','upload/exercise-picture/LVSMSplitSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1009,'Lever Bent-over Hip Extension','Step up onto platform. Position belly on wide pad, forearms on padded arm rest, and grip handles. Position bottom of foot on foot lever with lower leg under pad.','Push foot lever back by extending hip. Return leg to original position. Repeat. Reposition and continue with opposite leg.','upload/exercise-picture/LVBentOverHipExtention.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1010,'Lever Hack Squat (plate loaded)','Position shoulders under shoulder pad and back on back pad. Place feet slightly high on platform. Extend hips and knees and release dock lever if available.','Lower lever by bending hips and knees, until knees are just short of complete flexion. Raise sled by extending knees and hips. Repeat.','upload/exercise-picture/LVHackSquatGlute.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1011,'Lever Kneeling Hip Extension','Kneel on lowest (shin) pad with roller pad behind lower thighs. Position midsection on middle pad. Place forearms on padded arm rest and grip handles.','Keeping one leg on shin pad, extend hip of other leg and push roller pad back. Raise roller pad up until hip is completely extended. Return leg to original position and repeat. Continue with opposite leg.','upload/exercise-picture/LVKneelingHipExtensionRoller.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1012,'Lever Full Squat (plate loaded)','Squat down to place shoulders under padded lever. Place feet shoulder width apart slightly in front of shoulders. Extend knees and hips until legs are straight. Release support lever.','Squat down by bending hips back while allowing knees to bend forward slightly, keeping back straight and knees pointed same direction as feet. Descend until knees and hips are fully bent. Lift lever up by extending knees and hips until legs are straight. Repeat.','upload/exercise-picture/LVFullSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1013,'Lever Front Squat','Step onto platform facing padded levers. Squat down to place shoulders under padded lever. Place feet shoulder width apart on platform. Extend knees and hips until legs are straight. Release support lever if it does not disengage by itself.','Lower lever by bending hips back while allowing knees to bend forward slightly, keeping back straight and knees pointed same direction as feet. Descend until thighs are just past parallel to floor. Lift lever up by extending knees and hips until legs are straight. Repeat.','upload/exercise-picture/LVFrontSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1014,'Lever Standing Hip Extension','Stand on platform facing to one side and grasp bar for support. Place leg nearest machine on padded roller while standing on other leg.','Lower lever by extending hip. Return until knee is higher than hip. Repeat. Continue with opposite leg.','upload/exercise-picture/LVStandingHipExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1015,'Lever Lying Hip Extension','With leg lever positioned in the lower position, lie supine on machine with legs over padded bar. Align hip joints with lever fulcrum. Strap hips down with belt if available. Release leg lever and adjust until leg lever is in upper position. Grasp handles to sides of head.','Push padded leg bar down until hips are extended. Return and repeat.','upload/exercise-picture/LVLyingHipExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1016,'Lever Alternating Lying Hip Extension','Lie on bench with knees legs over pads. Align hip joints with lever fulcrum. Strap hips down with belt. Extend both hips with feet toward floor.','Raise one knee by flexing hip. Return to original position by extending hip. Repeat with opposite leg, alternating between sides.','upload/exercise-picture/LVLyingHipExtensionN.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1017,'Lever V-Squat (plate loaded)','Position shoulders under shoulder pads with back against back pad. Place feet on platform, shoulder or hip width apart. Extend hips and knees and release lever if available.','Bend knees forward slightly while allowing hips to bend back behind, keeping back straight and knees pointed same direction as feet. Descend until hips are just short of complete flexion. Raise sled by extending knees and hips. Repeat.','upload/exercise-picture/LVVSquatGluteH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1018,'Lever Alternating Kneeling Hip Extension','Kneel on lowest (shin) pad with roller pad behind lower thighs. Position midsection on middle pad. Place forearms on padded arm rest and grip handles.','Keeping one leg on shin pad, extending hip of other leg and push roller pad back. Raise roller pad up until hip is completely extended. Return leg to original position. Repeat with opposite leg. Continue alternating between each side.','upload/exercise-picture/LVAlternatingKneelingHipExtRoller.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1019,'Lever Standing Hip Extension (with abdominal pad)','Stand on platform so front of hips are against edge of abdominal pad. Position flexed leg over padded roller while standing on other leg. Grasp handles with both hands.','Extend lever back by extending hip and straightening leg. Return by flexing hip and knee. Repeat. Continue with opposite leg.','upload/exercise-picture/LVStandingHipExtension2.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1020,'Lever Kneeling Rear Kick','Kneel on machine by placing one knee on lower pad. Rest torso on middle pad, place forearms on padded arm rest, and grip handles. Position other foot of other leg up to lever platform.','Push platform back by extending leg back. Return leg to original position and repeat. Continue with opposite leg.','upload/exercise-picture/LVKneelingHipExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1021,'Lever Single Leg Seated Leg Press','Sit on machine with back on padded support. Place one foot slightly high on platform and other foot on floor below platform.','Push platform away by extending hip and knee. Return by bending leg until knee or hip is just short of complete flexion. Repeat. Continue with opposite leg.','upload/exercise-picture/LVSingleLegPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1022,'Lever Seated Leg Press','Sit on machine with back on padded support. Place feet slightly high on platform. Grasp handles to sides.','Extend knees and hips until knees are fully extended. Return until hips are completely flexed. Repeat.','upload/exercise-picture/LVSeatedLegPressGlute.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1023,'Lever Squat','Squat down to place shoulders under padded lever. Place feet shoulder width apart slightly in front of shoulders.','Raise lever up by extending knees and hips until legs are straight. Squat down by bending hips back while allowing knees to bend forward slightly, keeping back straight and knees pointed same direction as feet. Descend until thighs are just past parallel to floor. Return and repeat.','upload/exercise-picture/LVSquatGlute.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1024,'Lever Standing Rear Kick','Step on left platform with left foot. Grasp handle bars to each side. Place right foot on highest lever platform.','Push platform down by extending leg until straight. Return leg to original position. Repeat. Continue with opposite leg positions.','upload/exercise-picture/LVStandingSingleLegPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1025,'Lever Bent-over Rear Kick','Lean over padded surface and grasp handles. Bend knee and position foot against lever platform or pedal.','Push platform or pedal back by extending leg. Return leg to original position. Repeat. Continue with opposite leg.','upload/exercise-picture/LVBentOverRearKick.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1026,'Lever Alternating Seated Leg Press','Lie on machine with shoulder under pads. Place feet slightly high on individual lever platforms. Grasp handles to sides. Push both lever platforms away by extending knees and hips so knees are straight.','Lower one lever platform toward body by bending knee and hip until weight taps or nearly taps unused portion of weight stack. Push lever platform away by extending knee and hip. Repeat with opposite leg. Continue by alternating between sides.','upload/exercise-picture/LVAlternatingLyingLegPressN.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1027,'Lever V-Squat','Position shoulders under shoulder pads with back against back pad. Place feet on platform, shoulder or hip width apart. Squeeze hand lever. Keeping hand lever squeezed, squat down by bending hips and knees until knees or hips are just short of complete flexion. Release hand lever and raise up on sled just slightly until weight stack is engaged (click is heard).','Raise lever by extending knees and hips until legs are straight. Squat down with knees pointed same direction as feet. Descend until knees or hips are near complete flexion. Repeat.','upload/exercise-picture/LVVSquatGluteFM.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1028,'Lever Split V-Squat','Position shoulders under shoulder pads with back against back pad. Place feet on platform, shoulder or hip width apart, slightly forward. Squeeze hand lever. Keeping hand lever squeezed, squat down by bending hips and knees until knees or hips are just short of complete flexion. Release hand lever and raise up on sled just slightly until weight stack is engaged (click is heard). Raise sled by extending knees and hips until legs are straight. Place one leg back behind platform with toes pointed downward over floor.','Squat down with knee pointed same direction as foot. Allow leg to bend behind with forefoot on floor. Descend until forward hip is near complete flexion. Raise sled by extending knee and hip until leg is straight. Repeat. Continue with other leg.','upload/exercise-picture/LVSingleLegVSquatGlute.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1029,'Sled Single Leg 45° Leg Press','Sit on machine with back on padded support. Place one foot high up on platform and other foot on floor below platform. Extend hip and knee. Release dock lever and grasp handles to sides.','Lower sled by bending leg until knee is just short of complete flexion. Return by extending knee and hip. Repeat. Continue with opposite leg.','upload/exercise-picture/SLSingleLeg45DegreeLegPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1030,'Lever Single Leg Split V-Squat','Position shoulders under shoulder pads with back against back pad. Place one foot forward on platform. Place other foot against rear vertical platform. Squeeze hand lever. Keeping hand lever squeezed, squat down by bending hips and knees until hip or knee is short of complete flexion. Release hand lever and raise up on sled just slightly until weight stack is engaged (click is heard).','Raise lever by extending knees and hips. Lower lever by flexing hips and knees until knee of rear leg is almost in contact with floor. Repeat. Continue with opposite leg positions.','upload/exercise-picture/LVSingleLegSplitVSquatGlute.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1031,'Sled 45° Leg Press','Sit on machine with back on padded support. Place feet slightly high on platform. Extend hips and knees. Release dock lever and grasp handles to sides.','Lower sled by flexing hips and knees until knees are just short of complete flexion or until hips are completely flexed. Return by extending knees and hips. Repeat.','upload/exercise-picture/SL45DegLegPressWide.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1032,'Lever Alternating Single Leg Split V-Squat','Position shoulders under shoulder pads with back against back pad. Place feet slightly forward on platform. Squeeze hand lever. Keeping hand lever squeezed, squat down by bending hips and knees until hip or knee is short of complete flexion. Release hand lever and raise up on sled just slightly until weight stack is engaged (click is heard). Raise lever by extending knees and hips.','Transfer right foot back to inside of rear vertical platform. Lower lever by flexing hips and knees until knee of rear leg is almost in contact with floor. Raise lever by extending knees and hips until knee is straight. Return right foot to original position by other foot. Repeat with opposite leg movement and continue alternating between sides.','upload/exercise-picture/LVAlternatingSingleLegSplitVSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1033,'Sled Alternating 45° Leg Press','Sit on machine with back on padded support. Place feet slightly high on individual platforms. Grasp handles to sides. Push both platforms away by extending knees and hips so knees are straight. Release dock lever and grasp handles to sides.','Lower one platform toward body by bending knee and hip until knees are just short of complete flexion or until hips are completely flexed. Push platform away by extending knee and hip. Repeat with opposite leg. Continue by alternating between sides.','upload/exercise-picture/SLAlternating45LegPressGlute.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1034,'Sled Hack Press','Sit on sled with back of hips against back pad. Place feet on platform shoulder width or slightly wider. Extend hips and knees. Release dock lever(s).','Lower sled by flexing hips and knees until either is near complete flexion. Raise sled by extending knees and hips. Repeat.','upload/exercise-picture/SLSeatedHackPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1035,'Sled Lying Leg Press (plate loaded)','Lie supine on platform with shoulders against pad. Place feet slightly high on platform. Extend hips and knees. Release dock lever and grasp handles to sides.','Bring sled toward platform by flexing hips and knees until knees are just short of complete flexion or until hips are completely flexed. Return by extending knees and hips. Repeat.','upload/exercise-picture/SLLyingLegPressPLGlute.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1036,'Sled Single Leg Lying Leg Press (plate loaded)','Lie supine on platform with shoulders against pad. Place feet slightly high on platform. Prop one leg up, on support if available. Extend hip and knee of leg positioned on platform. Release dock lever and grasp handles to sides if available.','Bring sled toward platform by flexing hip and knee of supporting leg until knee is just short of complete flexion or until hip is completely flexed. Return by extending knee and hip. Repeat. Continue with opposite leg.','upload/exercise-picture/SLLyingSingleLegPressPL.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1037,'Sled Lying Leg Press','Lie supine on platform with shoulders against pad. Place feet slightly high on platform.','Extend hips and knees. Return until hips are completely flexed. Repeat.','upload/exercise-picture/SLLyingLegPressGlute.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1038,'Sled Single Leg Lying Leg Press','Lie supine on platform with shoulders against pad. Place\nfoot slightly high on platform. Position other leg with lower\nleg parallel to platform.','Push platform by extending knee and hip until knee is straight.\nReturn by bending hip and knee of supporting leg until knee is\njust short of complete flexion or until hip is completely flexed.\nRepeat. Continue with opposite leg.','upload/exercise-picture/SLSingleLegLyingLegPressGlute.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1039,'Sled Standing Rear Kick','Straddle sled and place foot on pedal. Place chest on pad and grasp handles.','Push platform back by extending leg\n\n\nback until straight. Return leg to original position. Repeat. Continue with opposite leg.','upload/exercise-picture/SLStandingHipExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1040,'Sled Seated Leg Press','Sit on machine with back on padded support. Place feet slightly high on platform. Grasp handles to sides.','Extend knees and hips until knees are fully extended. Return until hips are completely flexed. Repeat.','upload/exercise-picture/SLSeatedLegPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1041,'Sled Vertical Leg Press','Lie on declined back pad with hips under weighted sled. Place feet on platform. Raise weight by extending hips and knees. Release dock levers and grasp handles to sides.','Lower sled by flexing hips and knees until knees are just short of complete flexion or just before hips raise up from pad. Return by extending knees and hips. Repeat.','upload/exercise-picture/SLVerticalLegPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1042,'Sled Single Leg Vertical Leg Press','Lie on declined back pad with hips under weighted sled. Place both feet on platform. Raise weight by extending hips and knees. Place foot down off of foot platform. Release dock levers and grasp handles to sides.','Lower sled by flexing leg until knees are just short of complete flexion or just before hips raise up from pad. Push weight up by extending knee and hip. Repeat and continue with opposite leg.','upload/exercise-picture/SLVerticalSingleLegPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1043,'Sled Single Leg Hack Squat','Lie supine on platform with shoulders against pad. Place feet high up on platform. Extend hips and knees. Cross lower leg above knee of supporting leg. Release dock lever(s).','Lower sled by flexing hips and knee of supporting leg until knees are just short of complete flexion. Raise sled by extending knee and hips. Repeat. Continue with opposite leg.','upload/exercise-picture/SLSingleLegHackSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1044,'Sled Hack Squat','Lie supine on platform with shoulders against pad. Place feet high up on platform. Extend hips and knees. Release dock levers.','Lower sled by flexing hips and knees until hips are completely flexed. Raise sled by extending knees and hips. Repeat.','upload/exercise-picture/SLHackSquatGlute.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1045,'Sled Rear Lunge','Position shoulders under padded bars handles. Place feet under bar or just slightly forward. Straighten legs so weight is lifted. Disengage dock lever(s) if available. Place feet slightly forward.','Step back with one leg while bending supporting leg. Plant forefoot far back on floor. Lower body by flexing knee and hip of supporting leg until knee of rear leg is almost in contact with floor. Return to original standing position by extending hip and knee of forward supporting leg and return rear leg next to supporting leg. Repeat movement with opposite legs, alternating between sides.','upload/exercise-picture/SLRearLunge.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1046,'Sled Squat','Squat down to place shoulders under padded bars. Lean back against back pad if available. Place feet shoulder width apart, slightly in front of shoulders.','If hand or lever lock is available, disengage weight, squat to lowest position and re-engage lock. Lift sled by extending knees and hips until legs are straight. Lower sled by bending knees forward slightly while allowing hips to bend back behind, keeping back straight and knees pointed same direction as feet. Descend until thighs are just past parallel to floor. Return and repeat.','upload/exercise-picture/SLSquatGlute.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1048,'Sled Kneeling Rear Kick','Kneel on machine by placing knees on lower pad and feet against bars to rear, if available. Place forearms on padded arm rest, and grip handles. Position one foot up so middle of sole is positioned under foot bar.','Push foot bar up by extending leg back as far as possible. Return leg to original position and repeat. Continue with opposite leg.','upload/exercise-picture/SLKneelingHipExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1050,'Smith Single Leg Split Squat','Place bench behind smith bar. With bar upper chest height, position bar on back of shoulders and grasp bar to sides. Place foot slightly forward under bar. Extend other leg back and place top of foot on bench. Disengage bar by rotating bar back.','Lower body by flexing knee and hip of front leg until knee of rear leg is almost in contact with floor. Return to original standing position by extending hip and knee of forward leg. Repeat. Continue with opposite leg.','upload/exercise-picture/SMSingleLegSplitSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1051,'Smith Straight-back Stiff-leg Deadlift','Stand with shoulder width or narrower stance with thigh against bar. Grasp bar with shoulder width or slightly wider overhand grip. Disengage bar by rotating bar back.','With knees bent, lower bar toward top feet by bending hips and keeping waist straight. Lift bar by extending at hips until standing upright. Pull shoulders back slightly if rounded. Extend knees at top if desired. Repeat.','upload/exercise-picture/SMStrBackStiffLegDeadlift.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1053,'Smith Split Squat','With bar upper chest height, position bar on back of shoulders and grasp bar to sides. Place one foot forward and forefoot of other leg further back. Disengage bar by rotating bar back.','Lower body on other leg by flexing knees and hips of both legs until knee of rear leg is almost in contact with floor. Return to original straddled position by extending hips and knees of both legs. Repeat. Continue with opposite leg.','upload/exercise-picture/SMSplitSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1054,'Smith Single Leg Squat','With bar upper chest height, position bar on back of shoulders and grasp bar to sides. Place feet slightly forward and cross lower leg above knee of supporting leg. Disengage bar by rotating bar back.','Bend knee slightly forward while allowing hips to bend, keeping back straight and knee pointed same direction of foot. Descend until thigh of supporting leg is just past parallel to floor. Extend knee and hip until leg is straight. Return and repeat.','upload/exercise-picture/SMSingleLegSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1055,'Smith Rear Lunge','With bar upper chest height, position bar on back of shoulders and grasp bar to sides. Place feet under bar or slightly forward. Straighten legs so weight is lifted. Disengage bar by rotating bar back. Place feet slightly forward.','Step back with one leg while bending supporting leg. Plant forefoot far back on floor. Lower body by flexing knee and hip of supporting leg until knee of rear leg is almost in contact with floor. Return to original standing position by extending hip and knee of forward supporting leg and return rear leg next to supporting leg. Repeat movement with opposite legs, alternating between sides.','upload/exercise-picture/SMRearLunge.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1056,'Smith Hack Squat','Stand with back of thighs or gluteus against bar. Grasp bar from behind with overhand grip. Disengage bar by rotating bar back.','Squat down by bending knees forward while allowing hips to bend back behind, keeping back straight and knees pointed same direction as feet. Descend until thighs are too close to parallel to floor and bar is behind lower leg. Lift bar by extending hips and knees to full extension. Repeat.','upload/exercise-picture/SMHackSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1057,'Smith Squat','With bar upper chest height, position bar on back of shoulders and grasp bar to sides. Place feet slightly forward. Disengage bar by rotating bar back.','Squat down by bending hips back while allowing knees to bend forward slightly, keeping back straight and knees pointed same direction as feet.\n\n\nDescend until thighs are just past parallel to floor. Extend knees and hips until legs are straight. Return and repeat.','upload/exercise-picture/SMSquatGlutes.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1058,'Smith Front Squat','With bar upper chest height, grasp bar with overhand shoulder width grip. Position bar on front of shoulders with elbows forward and wrists hyperextended. Place feet slightly forward. Disengage bar by rotating bar back.','Squat down by bending hips back while allowing knees to bend forward\n\n\n, keeping back straight and knees pointed same direction as feet. Descend until thighs are just past parallel to floor. Extend knees and hips until legs are straight. Return and repeat.','upload/exercise-picture/SMFrontSquatGlute.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1059,'Weighted Front Squat','Stand with feet shoulder width or slightly narrower apart. Holding weight plate upper chest height with both hands.','Squat down by bending hips back while allowing knees to bend forward, keeping back straight and knees pointed same direction as feet. Descend until thighs are just past parallel to floor. Extend knees and hips until legs are straight. Return and repeat.','upload/exercise-picture/WTFrontSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1060,'Weighted Single Leg Squat','Stand with arms extended out in front, holding medicine ball or weight plate. Balance on one leg with opposite leg extended straight leg forward as high as possible.','Squat down as far as possible while keeping leg elevated off of floor. Keep supporting knee pointed same direction as foot supporting. Raise body back up to original position until knee and hip of supporting leg is straight. Return and repeat. Continue with opposite leg.','upload/exercise-picture/WTPistolSquatFarLeg.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1061,'Weighted Belt Squat','Place weight on dip belt around waist. Step up onto boxes or benches spaced apart; foot on each bench. Arms can be extended forward throughout exercise.','Squat down by bending hips back while allowing knees to bend forward slightly, keeping back straight and knees pointed same direction as feet.\n\n\nDescend until thighs are just past parallel to floor. Squat up by extending knees and hips until legs are straight. Return and repeat.','upload/exercise-picture/WTSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1062,'Weighted Reverse Hyper-extension','Place sandbag or medicine ball between ankles. Lay torso and waist on bench and grasp handles. Feet should be above floor with legs straight.','Raise weight by extending hips as high as possible until legs are nearly straight. Lower legs to original position. Repeat.','upload/exercise-picture/WtReverseHyperExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1063,'Smith Wide Squat','With bar upper chest height, position bar on back of shoulders and grasp bar to sides. Place feet wide, pointing outward 45° to 30°. Disengage bar by rotating bar back.','Squat down by bending hips back while allowing knees to bend forward slightly, keeping back straight and knees pointed same direction as feet. Descend until thighs are just past parallel to floor. Extend knees and hips until legs are straight. Return and repeat.','upload/exercise-picture/SMSquatWide.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1064,'Reverse Hyper-extension','Lay torso and waist on bench and grasp handles. Feet should be above floor with legs straight.','Raise legs by extending hips as high as possible until legs are nearly straight. Lower legs to original position. Repeat.','upload/exercise-picture/BWReverseHyperExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1065,'Lunge','Stand with hands on hips or clasped behind neck.','Lunge forward with first leg. Land on heel, then forefoot. Lower body by flexing knee and hip of front leg until knee of rear leg is almost in contact with floor. Return to original standing position by forcibly extending hip and knee of forward leg. Repeat by alternating lunge with opposite leg.','upload/exercise-picture/BWLunge.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1066,'Single Leg Hip Bridge','Lie on floor or mat. Place one leg straight and bend the other leg with foot flat on floor or mat. Place arms down on mat to each side of hips.','Raise body by extending hip of bent leg, keeping extended leg and hip straight. Return to original position by lowering body with extended leg and hip straight. Repeat and continue with opposite sides.','upload/exercise-picture/BWSupineSingleLegHipBridge.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1067,'Single Leg Box Squat','Stand in front of adjustable height bench or box. Extend arms out in front of body. Balance on one leg with opposite leg extended straight leg forward as high as possible.','Squat down while keeping leg elevated off of floor. Keep back straight and supporting knee pointed same direction as foot supporting. Once bottocks makes contact with bench or box, raise body back up to original position until knee and hip of supporting leg is straight. Repeat and continue with opposite leg.','upload/exercise-picture/BWSingleLegBenchSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1068,'Single Leg Reclining Squat (bar)','Stand behind horizontal bar, lower chest to upper waist height. Grasp bar with both hands. Place feet slightly forward and lean back with arms straight. Balance on one leg with opposite leg extended straight leg forward as high as possible.','While reclining back, squat down as far as possible while keeping leg elevated off of floor. Keep back straight and supporting knee pointed same direction as suppor ting foot. Raise body back up to original position until knee and hip of supporting leg is straight. Repeat and continue with opposite leg.','upload/exercise-picture/BWRecliningSingleLegPistolSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1069,'Reverse Hyper-extension (on stability ball)','Lay prone with waist on stability ball. Grasp secure anchor or bar near floor. Feet should be above floor with legs straight.','Holding firmly on anchor, extend legs upward by lifting and straightening leg as high as possible. Lower legs to original position with thighs close to stability ball. Repeat.','upload/exercise-picture/BWReverseHyperExtensionBall.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1070,'Single Leg Squat (with leg back)','Stand with arms extended out in front.','Squat down as far as possible while keeping raised leg from contacting floor as far down as possible. Keep back straight and supporting knee pointed same direction as foot supporting. In lowest position, gently place elevated lower leg on floor. Raise body back up with minimal assistance from raised leg on floor. Stand to original position until knee and hip of supporting leg are straight. Return and repeat. Continue with opposite leg.','upload/exercise-picture/BWSingleLegSquatLegBack.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1071,'Single Leg Squat (pistol)','Stand with arms extended out in front. Balance on one leg with opposite leg extended straight leg forward as high as possible.','Squat down as far as possible while keeping leg elevated off of floor. Keep back as straight as possible and supporting knee pointed same direction as foot supporting. Raise body back up to original position until knee and hip of supporting leg is straight. Repeat and continue with opposite leg.','upload/exercise-picture/BWSingleLegSquatPistol_.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1072,'Single Leg Stiff-leg Deadlift','Stand with feet together and hands just in front of thighs. Lift leg slightly so foot is just off floor.','Lower torso forward and downward while raising lifted leg back behind. Keep back straight and knee of supporting leg slightly bend. Keep hip and knee of lifted leg extended throughout movement. Once stretch is felt or hands contact floor, return to original position by raising torso while lowering lifted leg. Straighten knee of supporting leg as torso becomes upright. Repeat.','upload/exercise-picture/BWSingleLegStiffLegDeadlift_.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1073,'Split Squat','Stand with hands on hips. Position feet far apart; one foot forward and other foot behind.','Squat down by flexing knee and hip of front leg. Allow heel of rear foot to rise up while knee of rear leg bends slightly until it almost makes contact with floor. Return to original standing position by extending hip and knee of forward leg. Repeat. Continue with opposite leg.','upload/exercise-picture/BWSplitSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1074,'Single Leg Split Squat','Stand facing away from bench. Extend leg back and place top of foot on bench.','Squat down by flexing knee and hip of front leg until knee of rear leg is almost in contact with floor. Return to original standing position by extending hip and knee of forward leg and repeat. Continue with opposite leg.','upload/exercise-picture/BWSingleLegSplitSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1075,'Squat','Stand with arms extended forward.','Squat down by bending hips back while allowing knees to bend forward slightly, keeping back straight and knees pointed same direction as feet. Descend until thighs are just past parallel to floor. Squat up by extending knees and hips until legs are straight. Return and repeat.','upload/exercise-picture/BWSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1076,'Step-down','Stand with one foot on bench or elevated surface. Position foot on elevated surface to side, forward of straight knee.','Stand on bench by straightening leg and pushing body upward. Step down returning foot off of bench to floor and repeat. Continue with opposite position.','upload/exercise-picture/BWStepDown.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1077,'Step-up','Stand facing side of bench, step or platform.','Place foot of first leg on bench. Stand on bench by extending hip and knee of first leg and place foot of second leg on bench. Step down with second leg by flexing hip and knee of first leg. Return to original standing position by placing foot of first leg to floor. Repeat first step with opposite leg, alternating first steps between legs.','upload/exercise-picture/BWStepUp.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1078,'Self-assisted Single Leg Squat (bar)','Stand behind horizontal bar, lower chest to waist height. Place finger tips or inside base of thumbs on bar, hold with just enough contact for balance and self-assistance. Balance on one leg with opposite leg extended straight leg forward as high as possible.','Squat down as far as possible while keeping leg elevated off of floor. Keep back straight and supporting knee pointed same direction as supporting foot. Raise body back up to original position until knee and hip of supporting leg is straight. Repeat and continue with opposite leg.','upload/exercise-picture/ASSingleLegSquatPistolSelf.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1079,'Self-assisted Single Leg Squat (leg wrapped)','Stand with hand on hip height elevated surface or other tall, sturdy structure for support. Stand on one leg by wrapping leg around back of supporting leg so top of lifted foot is on outside of supporting leg\'s ankle.','Squat down by bending knee forward and hip back behind. Keep back straight and supporting knee pointed same direction as foot supporting. Descend until thigh is just past parallel to floor. Return to standing position with minimal assistance from wrapped leg. Stand to original position until knee and hip of supporting leg are straight. Return and repeat. Continue with opposite leg.','upload/exercise-picture/BWSingleLegSquatSelfAssistLeg.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1080,'Lateral Step-up','Stand between two benches, one to each side.','Lift leg and place foot on bench to side and forward of straight knee. Stand on bench by straightening leg and pushing body upward. Step down returning feet to original position. Repeat with opposite leg, alternating between legs.','upload/exercise-picture/BWLateralStepUp.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1081,'Self-assisted Step-down','Stand with one foot on bench or elevated surface. Position foot on elevated surface to side and forward of straight knee.','Stand on bench by straightening leg and pushing body upward. Step down returning foot off of bench to floor and repeat. Continue with opposite position.','upload/exercise-picture/ASStepDownSelf.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1082,'Self-assisted Single Leg Reclining Squat (pole)','Stand with feet behind vertical pole. Grasp pole with both hands, waist to hip height. Balance on one leg with opposite leg raised up off of floor to side of pole.','Squat down while keeping leg elevated off of floor. With arms slightly flexed, lean back slightly while only allowing knee to travel slightly forward. Keep back straight and supporting knee pointed same direction as supporting foot. Descend to lowest position. Raise body back up to original position while keeping knee behind bar and arms slightly flexed until knee and hip of supporting leg is straight. Repeat and continue with opposite leg.','upload/exercise-picture/ASVerticalPoleRecliningPistolSquats.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1083,'Suspended Hip Bridge','Sit on floor facing suspension trainer loops in low position. Grasp bottom of loops, then lay supine. Raise legs and place heels in loops with soles contacting handles. Lie down supine on mat so knees and hips are bent with suspension straps hanging vertical. Place arms off to sides.','Raise hips up by extending hips until fully extended. Lower hips until hips and back make contact with mat. Repeat.','upload/exercise-picture/STHipBridge.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1084,'Alternating Step-down','Stand on bench or narrow platform, with feet side by side.','Step down with first foot to side of elevated surface onto floor. Stand back up on elevated surface by straightening upper leg and pushing body upward. Place foot to original position next to opposite foot. Step down and back up with opposite leg in same manner. Repeat by alternating between sides.','upload/exercise-picture/BWAlternatingStepDown.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1085,'Lying Glute Stretch','Lie on floor or mat. Bend knees with feet on floor. Cross lower leg over thigh of other leg. Grasp foot and knee with both hands.','Pull leg toward torso. Hold stretch. Repeat with opposite leg.','upload/exercise-picture/30ef1c4275fd2c4cfaeeeb0d8dd02dc8.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1087,'Suspended Single Leg Split Squat (self-assisted)','Grasp one or both suspension trainer handle(s) in lower position hanging. Stand facing nearby fixed support and hold with one hand for balance. With other hand, secure foot in loop(s) from behind while balancing on one leg. With both hands, hold lightly on fixed support for balance and minimal assistance if needed.','Squat down by flexing knee and hip of front leg until knee of rear leg is almost in contact with floor. Return to original standing position by extending hip and knee of supporting leg. Repeat and continue with opposite leg.','upload/exercise-picture/STSingleLegSplitSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1088,'Suspended Single Leg Squat','Grasp suspension handles and momentarily step back until arms are extended forward and straight. While keeping arms straight and shoulders back, step forward so body reclines back behind suspension handles. Position body and legs straight at desired angle hanging from handles with arms straight. Balance on one leg with opposite leg extended straight forward as high as possible.','Squat down as far as possible while keeping leg elevated off of floor. Keep supporting knee pointed same direction as foot supporting. Raise body back, up to original position until knee and hip of supporting leg is straight. Repeat and continue with opposite leg.','upload/exercise-picture/STPistolSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1089,'PNF Lying Glute Stretch','Instruct participant to lie on floor or mat. Kneel beside participant. Bend participant\'s knee and hip and rotate leg cross wise. Position outside of participant\'s knee on nearest shoulder with participants lower leg extended under arm. Position near ankle on participant\'s opposite lower leg.','Extend or place hands on mat to each side of participant. Push participant\'s leg by leaning toward participant. Repeat with opposite leg.','upload/exercise-picture/601b4db67e8babb5ca963871f631d7d4.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1090,'Lever Glute Stretch','Sit on seat in forward position with lower leg on shin pad, feet on foot rest. Place hands through wrist straps. Hold lower bar with overhand grip. Position ankle on thigh or knee.','Push and lower seat back. Hold stretch. Repeat with opposite leg.','upload/exercise-picture/PCGlute8.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1091,'Lying Wall Glute Stretch','Sit on floor with hip and thigh against wall. Lift back of legs up against wall by pivoting on hips and lying on back. Cross lower leg over thigh of straight leg.','Bend knee of straight leg while lowering heel on wall. Hold stretch. Repeat with opposite leg.','upload/exercise-picture/596a1075c3ba2b462bf9673be6694ae9.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1092,'Prone Glute Stretch','Sit on floor or mat with outside of lower leg bent in front so it is approximately perpendicular to body. Place hands on floor in front and extend opposite leg back on floor so knee is toward floor.','Allow body to ease down toward floor with support of arms. Hold stretch and repeat with opposite leg.','upload/exercise-picture/432530b69b09c56a29da7a22cc0e8d08.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1093,'Towel Lying Glute Stretch','Lasso lower thigh with towel and lie on floor or mat. Bend knees with feet on floor. Cross lower leg over thigh of lassoed leg. Holding each side of towel position towel under knee.','Pull both ends of towel so leg travels toward torso. Hold stretch. Repeat with opposite leg.','upload/exercise-picture/777cefd67a1e210b525426dcbbb4e67d.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1094,'Suspended Single Leg Split Squat','Grasp one or both suspension trainer handle(s) in lower position. Step and face away from suspension trainers. Balance on one leg while raising foot from behind and slipping single foot in loop(s). Release handle with hand and position leg back so it is supported behind body by suspension trainer. Place hands on hips and maintain balance throughout exercise.','Squat down by flexing knee and hip of front leg until knee of rear leg is almost in contact with floor. Return to original standing position by extending hip and knee of forward leg and repeat. Continue with opposite leg.','upload/exercise-picture/STSplitSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1095,'Standing Glute Stretch','Stand facing close to elevated platform. Place outside of foot on bench with knee bent out to side.','Lean down, lowering torso toward thighs. Hold stretch. Repeat with opposite leg.','upload/exercise-picture/9272e1aa7795cd6d69eeec84008ae2bc.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1096,'Seated Glute Stretch','Sit on floor or mat reclining back with support of both arms behind body. Bend knees approximately 90 degrees with feet on floor. Cross lower leg (just above ankle) over thigh of opposite leg.\nSit on floor or mat and cross lower leg over thigh of straight leg. Lean back slightly and bend knee of lower leg with heel on floor. Grasp foot and knee.','Bring torso upright by walking hands closer to hips, keeping arms straight. Lean forward and hold stretch. Repeat with opposite leg.\nLean forward by pulling torso toward legs. Hold stretch. Repeat with opposite leg.','upload/exercise-picture/054db6718469ffb535af273b9a17cc98.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1097,'Seated Glute Stretch (chair)','Sit on chair or bench with ankles positioned below knees. Cross lower leg over thigh of opposite leg.','Lean down, lowering torso toward thighs. Hold stretch. Repeat with opposite leg.','upload/exercise-picture/136d4f4b1a6032c4ea14eea7427436c6.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1098,'Seated Glute Stretch (bench)','Straddle bench and sit. With one foot on floor, place outside of other foot on bench close to pelvis.','Lean down, lowering torso toward thighs. Hold stretch. Repeat with opposite leg.','upload/exercise-picture/58ce4a640c1833fb4a7f4e526d24f68e.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1099,'PNF Seated Glute Stretch','Instruct participant to sit on floor or mat, reclining back with support of both arms behind body, and feet on floor and knees bent. Have them cross their lower leg (just above ankle) over thigh of opposite leg. Position chest on participant\'s back and grasp participant\'s lower knee and upper ankle.','Push participant\'s torso toward legs. Hold stretch. Repeat with legs in opposite position','upload/exercise-picture/accfd2eb6746dc16fab0a4b4236c178f.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1100,'Seated Bent-over Glute Stretch','Sit on floor or mat with outside of lower leg bent in front and inside of opposite lower leg bent to side. Position bottom of forward foot against knee of opposite leg. Place hands on floor in front of forward leg.','Reach or slide forward with support of arms and hold stretch. Repeat with opposite leg.','upload/exercise-picture/66e6dd21450b69f03bbc492bafd6961d.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1101,'Squatting Glute Stretch','Stand toward fixed bar, approximately waist height. Grasp bar with both hands, arms extended. Bend knees and hips slightly. Cross lower leg over lower thigh of opposite leg.','Squat lower and lean forward toward crossed leg. Hold stretch . Repeat with opposite leg.','upload/exercise-picture/9571fa8af0d75d538ce0eaa398a67954.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1102,'Knee Hug','Stand on one leg. Raise knee high and grasp shin below knee with both hands.','Pull knee toward body until stretch is felt in hip. Release and step forward with stretched leg. Repeat with opposite leg. Continue by alternating stretch and step between each leg until specific distance is covered or desired number of repetitions have been completed.','upload/exercise-picture/KneeHug.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1103,'Walking Ankle Grab','Stand on one foot. Grasp foot with both hands by raising inside of foot upward with knee pointing outward; opposite hand grasps heal and near hand grasps shin, just above ankle.','Pull foot and lower leg upward until stretch is felt in hip. Release and step forward with stretched leg. Repeat with opposite leg. Continue by alternating stretch and step between each leg until specific distance is covered or desired number of repetitions have been completed.','upload/exercise-picture/WalkingAnkleGrab.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1104,'Lever Lying Hip Abduction','Sit in machine with heels on bars or legs inside of side pads. Lie back on back pad. Pull in on lever to position legs together. Release lever into position and grasp bars to sides.','Move legs away from one another by abduction hip. Return and repeat.','upload/exercise-picture/LVLyingAbduction.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1105,'Cable Seated Hip Internal Rotation','Sit on bench or chair with low pulley to side. Attach cable ankle cuff to ankle furthest pulley. Place foot of stationary leg just forward of foot attached to cable. Grasp bench and handle bar on cable column if available. Position thighs of both legs side by side, perpendicular to cable. Raise foot attached to cable slightly off of floor.','Keeping knee of attached leg bent approximately 90°, pull cable attachment away from pulley by rotating hip as far as possible. Return foot behind stationary foot and toward pulley. Repeat. Place ankle cuff on opposite leg and continue facing opposite direction.','upload/exercise-picture/CBSeatedHipInternalRotation.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1106,'Dumbbell Lying Hip Abduction','Lie on side on floor or mat. Extend top leg down straight and position lower leg back underneath. Grasping dumbbell with hand of arm furthest from floor, position dumbbell as low as possible on top side of thigh.','Raise weighted leg up off ground as high as possible, keeping dumbbell positioned on side of upper thigh. Return to leg to floor and repeat. Repeat and continue with opposite leg.','upload/exercise-picture/DBLyingHipAbduction.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1107,'Lever Standing Hip Abduction','Adjust platform so lever fulcrum is same height as hip articulation. Adjust roller in low position. Face machine and grasp bars to sides. Place outside of thigh against roller pad and shift body weight to opposite leg.','Raise leg against roller pad to side by abduction hip. Return and repeat. Reposition roller pad lever and continue with opposite leg.','upload/exercise-picture/LVStandingHipAbduction.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1108,'Cable Lying Hip Internal Rotation','Attach cable ankle cuff to ankle, furthest low pulley. Step near foot over cable and lie prone perpendicular to cable. Bend knee 90° so attached ankle crosses over resting straight leg nearest pulley. Adjust positioning of legs slightly away from cable pulley so slight stretch is felt in hip.','Keeping knee of attached leg bent approximately 90°, pull cable attachment away from pulley by rotating hip as far as possible. Return leg to original position toward pulley and repeat. Place ankle cuff on opposite leg and continue lying opposite direction.','upload/exercise-picture/CBLyingInternalHipRotation.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1109,'Cable Hip Abduction','Stand in front of low pulley facing to one side. Attach cable cuff to far ankle. Step out away from stack and grasp ballet bar. Stand on near foot and allow far leg to cross in front.','Move leg to opposite side of low pulley by abduction hip. Return and repeat. Turn around and continue with opposite leg.','upload/exercise-picture/CBHipAbduction.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1110,'Lever Seated Hip Abduction (plate loaded)','Stand near side of apparatus. Place one leg onto far padded lever and sit on seat. Lift other leg onto other padded lever. Lean back onto back pad. Grasp handles to sides.','Move legs away from one another as far as possible. Return and repeat.','upload/exercise-picture/LVSeatedHipAbductionH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1111,'Lever Seated Hip Abduction','Sit on machine with legs inside of side pads. If available, place heels on foot bars. Release and pull lever brace to position legs together. Engage lever into locked position. Lie back and grasp bars to sides.','Move legs apart as far as possible. Return and repeat.','upload/exercise-picture/LVSeatedHipAbduction.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1113,'Weighted Lying Hip Abduction','Sit on floor or mat with bar, plates loaded on one side. Sit on hip with knees bent and place bar on outside of shoe with weight plate(s) positioned beyond foot. Holding on to opposite end of bar, lie on side with weighted leg extended out straight and lower leg bent underneath.','Raise weighted leg up off ground as high as possible. Balance bar on side of foot while holding onto closest side of bar. Return to floor and repeat. Continue with opposite leg.','upload/exercise-picture/WtLyingHipAbductionRear.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1114,'Bent Knee Side Bridge Hip Abduction','Lie on side with legs bent back 90 degrees, one leg on top of the other. Place forearm under shoulder perpendicular to body.','Keeping shank of lower leg on mat or floor, raise hips up off ground while raising upper leg upward away from lower leg. Return to original position and repeat. Continue with opposite leg.','upload/exercise-picture/BWBentKneeSideBridgeHipAbduction.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1115,'Suspended Hip Abduction','Sit on floor facing suspension trainer loops in low position. Grasp bottom of loops, then lay supine. Raise legs and place heels in loops with soles contacting handles. Extend legs out and place arms on floor off to sides. Straighten low back, knees, and hips, raising back and hips off of floor.','Pull legs apart as far as possible. Return by placing legs together and repeat.','upload/exercise-picture/STHipAbduction.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1117,'Angled Side Bridge Hip Abduction','Grasp vertical bar with one hand and turn to side. Position feet out away from vertical bar with arm supporting body extended out to side. Legs should be straight and positioned side by side. Supporting arm should be approximately vertical to body and other arm can be placed on hips. Lower hips downward to floor until slight stretch is felt.','Keeping foot closest to bar on ground, raise hips upward and away from bar while raising leg furthest from bar upward away from lower leg. Return to original position with hips sagging downward and repeat. Continue with opposite leg.','upload/exercise-picture/BWAngledSideBridgeHipAbduction.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1123,'Side Bridge Hip Abduction','Lie on side with legs straight, one leg on top of the other. Place forearm under shoulder perpendicular to body.','Keeping side of bottom foot on ground, raise hips up off ground while raising upper leg upward away from lower leg. Return to original position and repeat. Continue with opposite leg.','upload/exercise-picture/BWSideBridgeHipAbduction.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1124,'Seated Hip Internal Rotator Stretch (chair or bench)','Sit on chair or end of bench and cross legs with outside of ankle on lower thigh.','Push knee toward downward. Hold stretch. Repeat with opposite side.','upload/exercise-picture/44b37e1aab348eb93bafb89080cea192.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1125,'Lying Pretzel Stretch','On floor or mat, lie supine with arms extended to sides. Cross thighs and position foot behind slightly bent leg.','Lower knee to opposite side, twisting waist so hip rolls to side. Hold stretch. Repeat with opposite side.','upload/exercise-picture/dab35e72da31b59d94623a0640b1926c.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1126,'Seated Hip Internal Rotator Stretch','Sit on floor or mat and cross lower leg over thigh of straight leg.','Push knee toward floor. Hold stretch. Repeat with opposite side.','upload/exercise-picture/9b05f865c78abdf92295a759ccbceacd.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1127,'PNF Lying Crossover Stretch','Instruct participant to lie on floor or mat. Kneel beside participant. Bend participant\'s near knee and hip. Place hand on outside of participant\'s near knee and opposite hand on participant\'s shoulder.','Push participant\'s knee to opposite side while backing participant\'s shoulder down. Hold stretch. Repeat with opposite side.','upload/exercise-picture/7a5b64ba949b42e3a72e160f92c2f955.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1128,'Seated Hip Internal Rotator Stretch (bent leg under)','Sit on floor or mat and place extended leg on top of inside of bent lower leg positioned perpendicular.','Straighten extended knee pushing bent knee toward floor. Hold stretch. Repeat with opposite side.','upload/exercise-picture/f66b7fdbd9075369b00d1c2e07a25a7e.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1130,'Lying Iliotibial Stretch','Lie on one side. Position ankle of lower leg over outside of upper thigh. Grasp top ankle or forefoot behind. Reposition side of upper body on floor.','Pull knee of rear leg back by straightening hip. Hold stretch. Repeat with opposite side.','upload/exercise-picture/4d256a130280ed534e17716ef102c5fd.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1131,'Squatting Iliotibial Stretch','Stand with feet together and side toward wall, arm\'s length away. Place hand on wall and opposite hand on hip.','Squat with supporting leg while placing leg nearest wall behind and across supporting leg so foot is positioned away from wall. Hold stretch. Repeat with opposite side.','upload/exercise-picture/9d854b4a82b260b4f3808518acb59a7b.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1132,'Seated Pretzel Stretch','Sit on floor or mat with knees straight. Place one foot on floor to outside of other knee. Turn torso toward side of bent knee supporting body with extended arm behind. Place elbow of opposite arm to outside of bent knee.','Push side of knee with elbow so bent leg further crosses thigh of straight leg. Hold stretch. Repeat with opposite side.','upload/exercise-picture/d82859f560a16796c812d0a3e19e610e.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1133,'Side Pretzel Stretch','Sit on side of thigh on floor or mat with knees bent. Position bent knee of upper leg behind foot of lower leg. Position chest facing floor with both hands on floor; arms somewhat extended and torso nearly inline with upper thigh.','Turn chest and front of pelvis further toward floor. Hold stretch. Repeat with opposite side.','upload/exercise-picture/b579aa254b37411388e062c381fe3de2.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1134,'Wall Iliotibial Stretch','Stand with feet together and side toward wall, slightly greater than arm\'s length away. Place closest hand on wall and opposite hand on hip.','With legs and hip straight, lower hip toward wall. Hold stretch . Repeat with opposite side.','upload/exercise-picture/c16a7f0b42ff96059d3f4ef4fec6107b.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1135,'Standing Iliotibial Stretch','Stand erect with legs crossed, outsides of feet together.','Maintaining complete extension of hip, shift body weight to rear leg allowing hip of leg in front to drop. Hold stretch. Repeat with opposite side.','upload/exercise-picture/8afc9098cde1ca0a010ebc1a6d9df8b8.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1136,'Cable Lying Leg Raise','Attach cable ankle straps to both ankles, then attach ankle straps to cable. Lie supine on floor or mat, back far enough so cable is taut. Grasp support behind head.','Raise legs by flexing hips and knees until thighs are just past perpendicular to torso or before hips raise off of bench. Return until hips and knees are extended. Repeat.','upload/exercise-picture/CBLyingLegRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1137,'Cable Lying Leg Raise (on bench)','Attach cable ankle straps to both ankles. Sit on end of bench facing pulley at bench height. Attach cable to both ankle straps. Lie supine on bench until cable is taut. Grasp sides of bench behind head.','Raise legs by flexing hips and knees until thighs are past perpendicular to torso or before hips raise off of bench. Return until hips and knees are extended. Repeat.','upload/exercise-picture/CBLyingLegRaiseBench.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1138,'Cable Standing Leg Raise','Attach cable ankle cuff to one ankle. Stand facing away from low pulley. Step\n\nforward\n\nwith opposite leg so leg with cuff is pulled back. Grasp lateral bars or other prop for support.','Raise knee by flexing hip while allowing lower leg to bend back under resistance. When thigh is just beyond horizontal, lower leg until hip and knee is extended. Repeat. Continue with opposite leg.','upload/exercise-picture/CBLegRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1139,'Cable Lying Straight Leg Raise','Attach cable ankle straps to both ankles, then attach ankle straps to cable. Lie supine on floor, mat, or bench back far enough so cable is taut. Grasp support behind head.','With knees straight, raise legs by flexing hips until thighs are just past perpendicular to torso or before hips raise off of mat. Return until hips are extended. Repeat.','upload/exercise-picture/CBStraightLegRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1140,'Cable Assisted Wheel Rollout','With ab wheel attached to cable via double looped strap attachment, straddle cable facing away from low pulley. Kneel with both knees on mat. Grasp handles on wheel to each side with overhand grip. Position wheel near front of knees and lean over wheel with arms extended downward, supporting upper body.','With arms straight, roll wheel out as far as possible. Lower body gently to floor extending arms forward. Raise body back up by flexing hips and pulling arms back to original position. Return until hips are extended. Repeat.','upload/exercise-picture/ASKneelingWheelRollout.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1141,'Lever Hip Flexion','Stand on platform facing to one side and grasp bar for support. Position front of leg nearest to machine against padded roller while standing on other leg.','Raise lever by flexing hip until knee is higher than hip. Return until hip is extended. Repeat. Continue with opposite leg.','upload/exercise-picture/LVHipFlexion.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1142,'Cable Standing Straight Leg Raise','Stand facing away from low pulley. Place foot in cable boot or foot harness. Grasp lateral bars or other prop for support. Stand forward on free leg, allowing leg attached to cable to be pulled back.','Raise leg upward by flexing hip while keeping knee straight. Raise leg as high as possible. Lower leg to original starting position. Repeat. Continue with opposite leg.','upload/exercise-picture/CBStandingStraightLegRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1143,'Lever Vertical Leg Raise','Grasp handles slightly to front and stand on foot bar with knees slightly bent and hips against pad.','With back straight, raise legs as high as possible by flexing hips. Return and repeat.','upload/exercise-picture/LVVerticalLegRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1144,'Weighted Decline Sit-up','Sit on apparatus with lower leg secured under padded bar. Hold weight in front of chest (as shown) or behind neck or use no weight.','Lower body back until hips are almost extended. Raise body by flexing hips until torso is upright. Repeat.','upload/exercise-picture/WtDeclineSitUp.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1145,'Weighted Hanging Leg Raise','Place weight between ankles or use no weight. Grasp and hang from high bar.','Raise legs by flexing hips and knees until hips are completely flexed or knees are well above hips. Return until hips and knees are extended. Repeat.','upload/exercise-picture/WTHangingLegRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1146,'Lever Lying Leg Raise','Sit on end of bench with both legs over padded lever and hips aligned with fulcrum. Strap legs onto padded lever. Lie supine on bench. Grasp handles near head.','Raise legs by flexing hips until they are completely flexed. Lower legs until hips are extended. Repeat.','upload/exercise-picture/LVLyingLegRaiseN.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1147,'Weighted Incline Straight Leg Raise','Sit on incline board. Place weight between ankles. Lie supine on incline board with torso elevated. Grasp feet hooks or sides of board for support.','With knees straight, raise legs by flexing hips until thighs are just past perpendicular to torso. Return until hips and knees are extended. Repeat.','upload/exercise-picture/WtInclineStraightLegRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1148,'Weighted Incline Leg Raise','Sit on incline board. Place weight between feet or use no weight. Lie supine on incline board with torso elevated. Grasp feet hooks or sides of board for support.','Raise legs by flexing hips and knees until hips are completely flexed. Return until hips and knees are extended. Repeat.','upload/exercise-picture/WtInclineLegRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1149,'Weighted Incline Straight Leg Raise (arms on pads)','Sit on bottom edge of incline board and place weight between feet. Lie back on incline board. Grasp handles and place forearms on arm pads to each side.','With knees straight, raise legs by flexing hips until hips are flexed. Return until hips and knees are extended. Repeat.','upload/exercise-picture/WTInclineStraightLegRaiseArmPads.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1150,'Weighted Lying Leg Raise','Sit on end of bench. Place weight between feet. Lie supine on bench. Grasp bench on each side behind head for support.','Raise legs by flexing hips and knees until hips are completely flexed. Return until hips and knees are extended. Repeat.','upload/exercise-picture/WtLyingLegRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1151,'Weighted Hanging Straight Leg Raise','Place weight between ankles or use no weight. Grasp and hang from high bar.','With knees straight, raise legs by flexing hips until thighs are just past parallel to floor. Return until hips are extended downward. Repeat.','upload/exercise-picture/WtHangingStraightLegRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1152,'Weighted Seated Leg Raise','Sit on edge of bench with legs extended to floor. Place weight between ankles. Grasp edge of bench. Lean torso back and balance bodyweight on edge of bench.','Raise legs by flexing hips and knees while pulling torso slightly forward to maintain balance. Return by extending hips and knees and lean torso back to counter balance. Repeat.','upload/exercise-picture/WtSeatedLegRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1153,'Weighted Incline Leg Raise (arms on pads)','Sit on bottom edge of incline board and place weight between feet. Lie back on incline board. Grasp handles and place forearms on arm pads to each side.','Raise legs by flexing hips and knees until hips are completely flexed. Return until hips and knees are extended. Repeat.','upload/exercise-picture/WtLegRaiseArmsPads.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1154,'Weighted Vertical Leg Raise (on parallel bars)','Place weight between ankles. Stand between parallel bars and grip bar on each side with overhand grip. Lift body off floor and balance body upright with arms straight.','Raise legs by flexing hips and knees until thighs are just past parallel to floor. Return until hips and knees are extended. Repeat.','upload/exercise-picture/WTVerticalLegRaisePB.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1155,'Weighted Vertical Leg Raise','Place weight between ankles or use no weight. Position forearms on padded parallel bars with hands on handles, and back on vertical pad.','Raise legs by flexing hips and knees until hips are completely flexed or knees are well above hips. Return until hips and knees are extended. Repeat.','upload/exercise-picture/WtVerticalLegRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1156,'Weighted Roman Chair Sit-up','Sit on apparatus with lower leg secured under padded bar. Hold weight to front of chest or behind neck or use no weight.','Lower body back until hips are almost extended. Raise body by flexing hips until torso is upright. Repeat.','upload/exercise-picture/WTRomanChairSitup.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1157,'Hanging Leg Raise','Grasp and hang from high bar with slightly wider than shoulder width overhand grip.','Raise legs by flexing hips and knees until hips are completely flexed or knees are well above hips. Return until hips and knees are extended downward. Repeat.','upload/exercise-picture/BWHangingLegRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1158,'Hanging Straight Leg Raise','Grasp and hang from high bar with slightly wider than shoulder width overhand grip.','With knees straight, raise legs by flexing hips until hips are completely flexed or knees are well above hips. Return until hips are extended downward. Repeat.','upload/exercise-picture/BWHangingStraightLegRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1159,'Hanging Leg Raise (with ab straps)','Stand below ab straps hanging from high bar. Place upper arms in straps and grasp straps above.','Raise legs by flexing hips and knees until hips are completely flexed or knees are well above hips. Return until hips and knees are extended downward. Repeat.','upload/exercise-picture/BWHangingLegRaiseAbStraps.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1160,'Incline Leg Raise','Lie supine on incline board with torso elevated. Grasp feet hooks or sides of board for support.','Raise legs by flexing hips and knees until hips are completely flexed. Return until hips and knees are extended. Repeat.','upload/exercise-picture/BWInclineLegRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1161,'Incline Straight Leg Raise (arms on pads)','Lie back on incline board. Grasp handles and place forearms on arm pads to each side.','With knees straight, raise legs by flexing hips until hips are flexed. Return until hips and knees are extended. Repeat.','upload/exercise-picture/BWInclineStraightLegRaiseArmPads.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1162,'Weighted Vertical Straight Leg Raise','Place weight between ankles or use no weight. Position forearms on padded parallel bars with hands on handles, and back on vertical pad.','With knees straight, raise legs by flexing hips until thighs are just past parallel to floor. Return until hips are extended. Repeat.','upload/exercise-picture/WtVerticalStraightLegRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1163,'Incline Leg Raise (arms on pads)','Lie back on incline board. Grasp handles and place forearms on arm pads to each side.','Raise legs by flexing hips and knees until hips are flexed. Return until hips and knees are extended. Repeat.','upload/exercise-picture/BWLegRaiseArmsPads.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1164,'Lying Leg Raise (on bench)','Lie supine on bench. Place hands under lower buttock on each side to support pelvis.','Raise legs by flexing hips and knees until thighs are completely flexed. Return until hips and knees are extended. Repeat.','upload/exercise-picture/BWLyingLegRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1165,'Incline Straight Leg Raise','Sit on incline board. Lie supine on incline board with torso elevated. Grasp feet rollers or sides of board for support.','With knees straight, raise legs by flexing hips until hips are completely flexed. Return until hips and knees are extended. Repeat.','upload/exercise-picture/BWInclineStraightLegRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1166,'Lying Simultaneous Alternating Leg Raise','Lie supine on bench or mat. Place hands under lower buttock on each side to support pelvis. Raise bent leg up so lower leg is approximately horizonal above hip. If lying on floor, raise other leg slightly off of floor.','Simultaneously change positions of legs, lowering and straightening raised leg down just above floor while raising and bending lower leg to opposite position. Continue alternating leg positions.','upload/exercise-picture/BWSimultaneousAlternatingLegRaises.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1167,'Vertical Leg Raise (on parallel bars)','Stand between parallel bars and grip bar on each side with overhand grip. Lift body off floor and balance body upright with arms straight.','Raise legs by flexing hips and knees until hips are completely flexed. Return until hips and knees are extended. Repeat.','upload/exercise-picture/BWVerticalLegRaisePB.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1168,'Vertical Leg Raise','Position forearms on padded parallel bars with hands on handles, and back on vertical pad.','Raise legs by flexing hips and knees until hips are completely flexed or knees are well above hips. Return until hips and knees are extended. Repeat.','upload/exercise-picture/BWVerticalLegRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1169,'Lying Straight Leg Raise','Lie supine on bench or mat. Place hands under lower buttock on each side to support pelvis.','Keeping knees straight, raise legs by flexing hips until hips are completely flexed. Return until hips and knees are extended. Repeat.','upload/exercise-picture/BWLyingStraightLegRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1170,'Seated Leg Raise','Sit on edge of bench with legs extended to floor. Place weight between ankles or use no weight. Grasp edge of bench. Lean torso back and balance body weight on edge of bench.','Raise legs by flexing hips and knees while pulling torso slightly forward to maintain balance. Return by extending hips and knees and lean torso back to counter balance. Repeat.','upload/exercise-picture/BWSeatedLegRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1171,'Lying Scissor Kick','Lie supine on bench or mat. Place hands under lower buttock on each side to support pelvis. Raise one leg up vertical with knee nearly straight. If lying on floor, raise other leg slightly off of floor.','Keeping knees nearly straight, simultaneously change positions of legs so vertical leg is lowered while lower leg is raised vertically. Continue alternating leg positions.','upload/exercise-picture/BWScissorsKicks.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1172,'Lying Simultaneous Alternating Straight Leg Raise','Lie supine on bench or mat. Place hands under lower buttock on each side to support pelvis. Raise one leg up vertically with knee nearly straight. If lying on floor, raise other leg slightly off of floor.','Keeping knees nearly straight, simultaneously change positions of legs so vertical leg is lowered while lower leg is raised vertically. Continue alternating leg positions.','upload/exercise-picture/BWSimultaneousAltStraightLegRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1173,'Lying Leg Raise (on floor)','Lie supine on mat or floor. Place hands under lower buttock on each side to support pelvis.','Raise legs by flexing hips and knees until thighs are completely flexed. Return until hips and knees are extended. Repeat.','upload/exercise-picture/BWLyingBentLegRaiseFloor.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1174,'Roman Chair Sit-up','Sit on chair or bench with lower leg secured under low over hang or heavy bar. Place hands on waist, chest, neck, or head depending upon desired difficulty.','Lower body back until hips are almost extended. Raise body by flexing hips until torso is upright. Repeat.','upload/exercise-picture/BWRomanChairBench.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1175,'Vertical Straight Leg Raise','Position forearms on padded parallel bars with hands on handles, and back on vertical pad.','With knees straight, raise legs by flexing hips until thighs are just pass parallel to floor. Return until hips are extended. Repeat.','upload/exercise-picture/BWVerticalStraightLegRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1176,'Jack-knife on Ball','Kneel with chest or waist on exercise ball. Dive over top and place hands on floor with arms extended down supporting upper body. While keeping body horizontal, walk hands further away from ball until shins are positioned on top of ball. With arms vertical and straight, support body off of floor with body straight. See suggested mount onto exercise ball.','Bend hips and knees, allowing shins to roll over top of ball. Pull knees toward chest until heels are under or near glutes. Return by extending hips and knees to original position. Repeat.','upload/exercise-picture/BWJackKnifeBall.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1177,'Pike on Power Wheel','With feet strapped to power wheel, kneel on floor. Place hands shoulder width apart on floor. With arms vertical and straight, support body off of floor while rolling power wheel back until body is straight.','From plank position, raise rear end up as high as possible by bending hips. Pull power wheel toward hands while keeping knees straight. Return by extending hips to original position.\n\n\nRepeat.','upload/exercise-picture/BWWheelPike.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1178,'Pike on Discs','Kneel on floor with forefeet on gliding discs. Place hands shoulder width apart on floor. With arms vertical and straight, support body off of floor while sliding gliding discs back until body is straight.','From plank position, raise rear end up as high as possible by bending hips. Pull gliding discs toward hands while keeping knees straight. Return by extending hips to original position. Repeat.','upload/exercise-picture/BWDiscPike.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1179,'Jack-knife on Power Wheel','With feet strapped to power wheel, kneel on floor. Place hands shoulder width apart on floor. With arms vertical and straight, support body off of floor while rolling power wheel back until body is straight.','Bend hips and knees, pulling legs under body. Pull bent knees toward chest, allowing rear end to raise upward. Return by extending hips and knees to original position. Repeat.','upload/exercise-picture/BWWheelJackknife.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1181,'Kneeling Hip Flexor Stretch','Lunge forward with knee on padded mat. Position foot beyond forward knee. Place hands on knee.','Straighten hip of rear leg by pushing hips forward. Hold stretch. Repeat with opposite side.','upload/exercise-picture/5dec96831a3cb85fb04c2c192e699f8c.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1182,'Lunging Hip Flexor Stretch','Lunge with one foot far behind other foot.','Squat down with chest high, straightening hip of rear leg by pushing hips down and forward. Hold stretch. Repeat with opposite side.','upload/exercise-picture/7e0821bc06976b844c669e3e4c5a5b8f.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1183,'Bent-over Lunging Hip Flexor Stretch','Kneel down and position one leg extended behind. Balancing with hands positioned on floor to sides. Rear knee is extended off floor. Body weight is supported on both forefeet.','Straighten hip of rear leg by pushing hips down and forward. Hold stretch. Repeat with opposite side.','upload/exercise-picture/96a7d17ea46181c828f7be181175434e.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1184,'Suspended Mountain Climber','Sit on floor facing suspension trainer loops in low position. Place right foot in left lower loop. Cross left leg over right leg placed in right lower loop. Turn body to right and place hands on floor, shoulder width apart. Turn body to kneel on hands and knees. Reposition hands (shoulder width or slightly wider) at desired distance from suspension trainer so that body is square with suspension trainer straps. With arms straight, raise knees from ground so body is supported by arms and suspension trainer. Bend one leg so knee is pointing down while keeping other leg extended out straight.','Simultaneously alternate leg positions by straightening bent leg behind, while bending straight leg forward. Repeat.','upload/exercise-picture/STMountainClimber.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1185,'Lever Hip Flexor Stretch','Flip seat all way back. Stand facing bar with supporting foot slightly forward under, or near apparatus. Grasp handle bars for support. Place top of other foot back on top edge of shin pad.','Squat down with back straight while straightening hip of rear leg by pushing hips forward. Hold stretch. Repeat with opposite side.','upload/exercise-picture/PCHipFlexors8.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1186,'Suspended Pike','Sit on floor facing suspension trainer loops in low position. Place right foot in left lower loop. Cross left leg over right leg placed in right lower loop. Turn body to right and place hands on floor shoulder width apart. Turn body to kneel on hands and knees. Reposition hands (shoulder width or slightly wider) at desired distance from suspension trainer so that body is square with suspension trainer straps. With arms straight, raise knees from ground, so body is supported by arms and suspension trainer.','Raise rear end up as high as possible by bending hips. Pull feet toward hands, while keeping knees straight. Return by extending hips to original straight body position. Repeat.','upload/exercise-picture/STPike.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1190,'Standing Hip Flexor Stretch','Stand facing bench or elevated platform, approximately legs length away. Place one foot on bench or platform.','Slowly lunge forward by bending forward leg. With chest high, straighten hip of rear leg by pushing hips forward. Hold stretch. Repeat with opposite side.','upload/exercise-picture/99a9392130283de0ac595065ad21a3f0.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1191,'Sled Kneeling Hip Flexor Stretch','Straddle machine and grasp handles for support. Place foot on lower platform under podium and other lower leg on padded support behind.','Squeeze release grips and slide padded leg support back until mild stretch is felt. Hold stretch. Repeat with opposite side.','upload/exercise-picture/1acff9d0c5a6577673d144f23b4eb36e.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1192,'Lying Hip Flexor Stretch','Lie on tall bench with thigh hanging down off end or side of bench. Raise opposite thigh toward side of torso. Hook hand around inside of upper thigh. Grasp elbow with opposite hand and keep arms close to body.','Allow lower thigh to drop toward floor. Hold stretch. Repeat with opposite side.','upload/exercise-picture/80b72e66f678fe1c106d3f51c422d3f3.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1194,'Cable Seated Hip External Rotation','Sit on bench or chair with low pulley to side. Attach cable ankle cuff to ankle, nearest pulley. Place far stationary foot slightly forward. Grasp lower thigh of leg with attached cuff, position it along side thigh of stationary leg while keeping foot slightly above floo\n\n\nr.','Keeping knee of attached leg bent approximately 90°, pull cable attachment under thigh of stationary leg by rotating hip. Return until slight stretch is felt in hip, then repeat. Place ankle cuff on opposite leg and continue facing opposite direction.','upload/exercise-picture/CBSeatedHipExternalRotation.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1195,'Lying Hip External Rotator Stretch','Lie on floor or mat and with one leg straight and other leg bent approximately 90 degrees out to side.','Lower bent knee beside straight leg. Hold stretch. Repeat with opposite side.','upload/exercise-picture/6814ad0e04c771d1ee315fbce56de8fa.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1197,'PNF Lying Piriformis Stretch','Instruct participant to lie on floor or mat with legs bent. Stand near their feet facing them. Assist them crossing their thighs, placing outside of one knee close to top of their other knee. Bend over participant\'s hips, position their foot of closest bent leg on your chest or shoulder while grasping their lower leg, in addition to knee of opposite leg with other hand.','Push your bodyweight down on foot while pushing down on side of participant\'s knee. Hold stretch. Repeat with legs in opposite position.','upload/exercise-picture/c4ab7a481b05c4dc34fc5daa95e2f72d.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1199,'Lever Piriformis Stretch','Sit on seat in forward position with lower leg on shin pad, feet on foot rest. Place hands through wrist straps. Hold upper bar with overhand grip, both hands left of center. Position left leg extended toward right center.','Push and lower seat back. Repeat with opposite leg.','upload/exercise-picture/PCPeriformis8.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1200,'Seated Piriformis Stretch','Sit on floor or mat, reclining back with support of both arms behind body, and feet on floor and knees bent approximately 90 degrees. Cross thighs by placing back of knee on thigh of other leg. Grasp lower leg.','Reposition hands forward with arms straight to place torso closer to legs. Hold stretch. Repeat with opposite leg.','upload/exercise-picture/c49b018ec1b80983d7d0e8c378f751d1.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1201,'Cable Lying Hip External Rotation','Attach cable ankle cuff to ankle, nearest low pulley. Lie prone with legs slightly apart and knee of attached leg bent 90°. Adjust position of legs slightly away from cable pulley so slight stretch is felt in hip.','Keeping knee of attached leg bent approximately 90°, pull cable attachment toward opposite knee by rotating hip. Return until slight stretch is felt in hip, then repeat. Place ankle cuff on opposite leg and continue lying opposite direction.','upload/exercise-picture/CBLyingExternalHipRotation.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1202,'Seated Hip External Rotator Stretch','Sit on floor or mat and with one leg straight and other leg bent approximately 90 degrees out to side.','Lower bent knee beside straight leg. Hold stretch. Repeat with opposite side.','upload/exercise-picture/3bc2bfb10ed4b6ecdd493e2dacf3dcc4.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1203,'Lying Piriformis Stretch','Lie on floor or mat with feet on floor and knees bent approximately 90 degrees. Cross thighs by lacing back of knee on thigh of other leg. Lift legs and hug both thighs locking both hands together behind knee of lower leg.','Pull leg toward torso. Hold stretch. Repeat with opposite leg.','upload/exercise-picture/eb19a49ba33c584eb6e916e0faf87d3b.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1204,'Lying Piriformis Stretch (single leg)','Lie on floor or mat. Lift one leg and grasp ankle and knee with both hands.','Pull thigh toward torso while keeping knee over torso. Hold stretch. Repeat with opposite leg.','upload/exercise-picture/ff6c6e39d18091125b4ce72a9c98d2e9.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1205,'Seated Piriformis Stretch (chair or bench)','Sit on chair of bench with feet on floor and knees bent approximately 90 degrees. Cross thighs by placing back of knee on thigh of other leg. Grasp lower leg.','Lean forward pulling body toward legs. Hold stretch. Repeat with opposite leg.','upload/exercise-picture/b1562667bd54d0e5b91470e22135b530.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1206,'PNF Seated Piriformis Stretch','Instruct participant to sit on floor or mat, reclining back with support of both arms behind body, and feet on floor and knees bent. Have them cross their thighs by placing back of knee on thigh of other leg. Ask them position foot on floor closer to hip. Place your hands on back of participants shoulders or position your chest on participant\'s upper back and your hands under participant\'s lower thighs.','Push participant\'s torso toward legs. Hold stretch. Repeat with legs in opposite position.','upload/exercise-picture/cd0fa842e5cae16357d90b063855ba67.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1211,'Barbell Side Split Squat','Place barbell on back of shoulders and grasp bar on each side. Stand with feet wide apart; foot of lead leg angled out to side.','Lower body toward side of angled foot by bending knee and hip of lead leg while keeping opposite leg only slightly bent. Return to original standing position by extending hip and knee of lead leg. Repeat.','upload/exercise-picture/BBSideSplitSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1217,'Barbell Squat','From rack with barbell at upper chest height, position bar high on back of shoulders and grasp barbell to sides. Dismount bar from rack and stand with shoulder width stance.','Squat down by bending hips back while allowing knees to bend forward, keeping back straight and knees pointed same direction as feet. Descend until thighs are just past parallel to floor. Extend knees and hips until legs are straight. Return and repeat.','upload/exercise-picture/BBSquatHigh.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1237,'Cable Belt Half Squat','Place cable belt or dip belt around waist. Kneel before low pulley and attach it to cable. Stand on elevated platform with feet shoulder width or slightly wider on platform between very low and close pulley cables. Place hand(s) on ballet bar or machine (not on guide rod!) for balance.','Squat down by bending hips back while allowing knees to bend forward, keeping back straight and knees pointed same direction as feet. Descend until weight stack taps or comes very close from making contact. Keeping chest high and back straight, raise back up by extending knees and hips until legs are straight. Repeat.','upload/exercise-picture/CBThreeQuarterSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1239,'Cable Standing Leg Extension','Stand facing away from low pulley. Place foot in cable boot attachment (as shown) or foot harness. Grasp lateral bars or other prop for support. Stand forward on free leg. Raise knee up positioning thigh approximately 45° forward. Allow lower leg attached to cable to be pulled back.','Keeping thigh stationary, extend lower leg forward until leg is straight. Return by lowering lower leg down and back to original position. Repeat.','upload/exercise-picture/CBStandingLegExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1243,'Cable Step Down','Grasp cable stirrup(s) with both hands. Place one foot on elevated platform positioned near or between low pulleys.','Raise body by extending knee and hip on platform until leg is straight. Return until foot of lower leg makes contact with lower platform or floor and repeat. Continue with opposite leg.','upload/exercise-picture/CBStepDown.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1249,'Lever Leg Extension (plate loaded)','Sit on apparatus with back against padded back support. Place front of lower legs under padded lever. Position knee articulation at same axis as lever fulcrum. Grasp handles to sides for support.','Move lever forward and upward by extending knees until legs are straight. Return lever to original position by bending knees. Repeat.','upload/exercise-picture/LVLegExtensionH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1254,'Lever Alternating Leg Extension (plate loaded)','Sit on apparatus with back against padded back support. Place front of lower legs under padded lever. Position knee articulation at same axis as lever fulcrum. Grasp handles to sides for support.','Move one lever forward and upward by extending one knee until leg is straight. Lower to original position. Repeat with opposite side. Continue to alternate between sides.','upload/exercise-picture/LVAlternatingLegExtensionPL.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1262,'Lever Single Leg Standing Leg Press (plate loaded)','Step on left platform with left foot. Grasp handle bars to each side. Place right foot on highest lever platform.','Push platform down by extending hip and knee until straight. Return leg to original position. Repeat. Continue with opposite leg positions.','upload/exercise-picture/LVStandingSingleLegPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1271,'Lever Front Squat (plate loaded)','Step onto platform facing padded levers. Squat down to place shoulders under padded lever. Place feet shoulder width apart on platform. Extend knees and hips until legs are straight. Release support lever if it does not disengage by itself.','Lower lever by bending hips back while allowing knees to bend forward, keeping back straight and knees pointed same direction as feet. Descend until thighs are just past parallel to floor. Lift lever up by extending knees and hips until legs are straight. Repeat.','upload/exercise-picture/LVFrontSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1279,'Lever Alternating Leg Extension','Sit on apparatus with back against padded back support. Place front of lower legs under padded lever. Position knee articulation at same axis as lever fulcrum. Grasp handles to sides for support.','Move lever forward and upward by extending one knee until leg is straight. Lower to original position. Repeat with opposite leg. Continue to alternate between sides.','upload/exercise-picture/LVAlternatingLegExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1281,'Lever Alternating Leg Extension (unilateral machine)','Sit on apparatus with back against padded back support. Place front of lower legs under padded levers. Position knee articulation at same axis as lever fulcrum. Grasp handles to sides for support.','Move one lever forward and upward by extending one knee until leg is straight. Lower to original position. Repeat with opposite side. Continue to alternate between sides.','upload/exercise-picture/LVAlternatingLegExtensionUnilateral.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1285,'Lever Leg Extension','Sit on apparatus with back against padded back support. Place front of lower legs under padded lever. Position knee articulation at same axis as lever fulcrum. Grasp handles to sides for support.','Move lever forward and upward by extending knees until legs are straight. Return lever to original position by bending knees. Repeat.','upload/exercise-picture/LVLegExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1286,'Lever Alternating Lying Leg Press','Lie on machine with shoulder under pads. Place feet on individual lever platforms. Grasp handles to sides. Push both lever platforms away by extending knees and hips so knees are straight.','Lower one lever platform toward body by bending knee and hip until weight taps or nearly taps unused portion of weight stack. Push lever platform away by extending knee and hip. Repeat with opposite leg. Continue by alternating between sides.','upload/exercise-picture/LVAlternatingLyingLegPressN.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1289,'Sled Hack Press (plate loaded)','Sit on sled with back of hips against back pad. Place feet on platform shoulder width or slightly wider. Extend hips and knees. Release dock lever(s).','Lower sled by flexing hips and knees until either is near complete flexion. Raise sled by extending knees and hips. Repeat.','upload/exercise-picture/SLSeatedHackPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1309,'Smith Step Down','Position smith bar upper chest height with platform under\nbar off to one side. Positioned shoulders under bar and one foot\non platform with other leg extended slightly forward on floor.','Raise bar upward by straightening leg and pushing body upward.\nLower body downward by returning foot off of bench to floor and\nrepeat. Continue with opposite position.','upload/exercise-picture/SMStepDownQuad.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1317,'Weighted Sissy Squat','With shoulder width stance, grasp fixed bar or support at hip level with one arm and secure plate across chest with other arm.','With hips and waist straight, bend knees to allow body to fall backwards as knees come forward. Allow heels to raise from floor. Lower body until knees are almost fully flexed or near floor. Return to original position by extending knees as heels return to floor.','upload/exercise-picture/WTSissySquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1323,'Weighted Sissy Squat (on apparatus)','Place feet under lower padded bar with calves against upper pads. Secure weight plate high on chest with both arms.','Allow body to fall backwards by bending knees. During descent, gradually bend hips, yet keep chest high and don\'t allow torso to angle forward. Lower body until back of thigh is against upper pad. Rise to original position by extending knees and hips while keeping shoulders behind hips. Repeat.','upload/exercise-picture/WTSissySquatAp.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1324,'Sissy Squat','With shoulder width stance, grasp fixed bar or support at hip level with one arm.','With hips and waist straight, bend knees to allow body to fall backwards as knees come forward. Allow heels to raise from floor. Lower body until knees are almost fully flexed or near floor. Return to original position by extending knees as heels return to floor.','upload/exercise-picture/BWSissySquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1329,'Sissy Squat (on apparatus)','Place feet under lower padded bar with calves against upper pads. Cross arms and touch shoulders or place arms out straight in front of shoulders.','Allow body to fall backwards by bending knees. During descent, gradually bend hips, yet keep chest high and don\'t allow torso to angle forward. Lower body until back of thigh is against upper pad. Rise to original position by extending knees and hips while keeping shoulders behind hips. Repeat.','upload/exercise-picture/SissySquatAp.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1332,'Alternating Step Down','Stand on bench or narrow platform, with feet side by side.','Step down with first foot to side of elevated surface onto floor. Stand back up on elevated surface by straightening upper leg and pushing body upward. Place foot to original position, next to opposite foot. Step down and back up with opposite leg in same manner. Repeat by alternating between sides.','upload/exercise-picture/BWAlternatingStepDown.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1466,'Kneeling Quadriceps Stretch','Kneel with knee on padded mat and other foot positioned forward. Place hands on knee. Grasp other hand under top of foot.','Drive hip forward and pull foot toward rear end. Hold stretch. Repeat with opposite side.','upload/exercise-picture/59c68250d668fa021bf4756f0d834455.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1467,'PNF Lying (prone) Quadriceps Stretch','Instruct participant to lie prone on mat or floor. Straddle participant facing toward feet. Knee beside participant with leg extended over or just above participant\'s hips. Bend participant\'s near knee and place hand under participant\'s upper leg and opposite hand on ankle.','Lift knee and push ankle down toward hip. Hold stretch. Repeat with opposite side.','upload/exercise-picture/f5d0adea1ef2e6f57ffb075662e5b805.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1468,'Lying (prone) Quadriceps Stretch','Lie prone on mat or floor. Grasp top ankle or forefoot behind.','Pull ankle or forefoot to rear end. Hold stretch. Repeat with opposite side.','upload/exercise-picture/8650332bac4a78ee12233f7f381967a7.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1469,'Lever Quadriceps Stretch','Flip seat all way back. Stand facing bar with supporting foot slightly forward under, or near apparatus. Grasp handle bars for support. Place top of other foot back on top edge of shin pad.','Squat down with back straight and chest up while positioning hip straight close to back of heel. Hold stretch. Repeat with opposite side.','upload/exercise-picture/PCQuadriceps8.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1470,'Standing Quadriceps Stretch (towel)','With foot on bench or floor place towel around ankle. Grasp both ends of towel behind ankle with closest hand. Stand on opposite leg and touch wall or stationary object with other arm for balance. Pull foot to rear end with towel.','Straighten hip by moving knee backward. Hold stretch. Repeat with opposite side.','upload/exercise-picture/2bfdf923775985d2c43a391f4974ac29.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1471,'Standing Quadriceps Stretch','Stand and touch wall or stationary object for balance. Grasp top ankle or forefoot behind. Pull ankle or forefoot to rear end.','Straighten hip by moving knee backward. Hold stretch. Repeat with opposite side.','upload/exercise-picture/9e704875a65e1a3cec886b2d49e7212b.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1472,'Lying (side) Quadriceps Stretch','Lie on one side. Grasp top ankle or forefoot behind. Pull ankle or forefoot to rear end.','Straighten hip by moving knee backward. Hold stretch. Repeat with opposite side.','upload/exercise-picture/98c53b178d92d5e8dd7f7f0de119bc49.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1473,'Standing Quadriceps Stretch (on apparatus)','Stand facing away from adjustable shelf, hip to upper thigh height. Grasp support for balance. With assistance from other hand, bend over slightly and place foot on shelf behind hip. Grasp supports with both hands and stand upright.','Bend supporting knee slightly while driving hip back closer to heel. Hold stretch. Repeat with opposite side.','upload/exercise-picture/ad26b1a7a309d91749d8a2a408dc3bf0.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1474,'Walking Quadriceps Stretch','Stand and step forward with left foot.','Standing on left foot, position right foot behind and grasp it with right hand. Pull right heel toward right glute while pulling right knee down and back. Release right foot, step forward with right foot, and repeat on left side while standing on right foot. Continue by alternating between each side until specific distance is covered or desired number of repetitions have been completed.','upload/exercise-picture/WalkingQuadStretch.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1476,'Barbell Good-morning','Position barbell on back of shoulders and grasp bar to sides.','Keeping back straight, bend hips to lower torso forward until parallel to floor. Raise torso until hips are extended. Repeat.','upload/exercise-picture/BBGoodMorning.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1478,'Barbell Back Raise (on hyperextension apparatus)','Stand in hyper-extension apparatus. Position thighs prone on large pad and lower leg under padded bar. Place barbell on back of shoulders and grasp bar to sides.','Lower body by bending hips until fully flexed. Raise, or extend hips until torso is parallel to legs. Repeat.','upload/exercise-picture/BBHipExtention.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1479,'Barbell Straight-back Straight-leg Deadlift','Grasp barbell from rack or deadlift from floor with shoulder width or slightly wider overhand or mixed grip. Stand with shoulder width or narrower stance.','With knees and back straight, lower bar by bending hips until hamstrings are tight, or just before lower back bends. Lift bar by extending hips until upright. Pull shoulders slightly back at top of lift if rounded. Repeat.','upload/exercise-picture/BBStraightBackStraightLegDeadlift.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1480,'Trap Bar Straight-back Straight-leg Deadlift','Stand with feet shoulder width or narrower in trap bar, weight to each side. Squat down with feet flat and grasp handles to sides. Deadlift from floor.','With knees and back straight, lower bar by bending hips until hamstrings are tight, or just before lower back bends. Lift bar by extending hips until upright. Pull shoulders slightly back at top of lift if rounded. Repeat.','upload/exercise-picture/TBStrtBackStrtLegDeadlift.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1481,'Barbell Glute-Ham Raise','Place ankles between ankle roller pads with feet on vertical platform and position knees on pad with lower thighs against large padded hump. If barbell can safely be placed on horizontal handles, grasp barbell in upright position and place behind shoulders. If barbell is placed on floor, lower torso by extending knees and flexing hips, then position barbell on back of shoulders. Grasp bar to sides.','From lower position, raise torso by extending hips until fully extended. Continue to raise body by flexing knees until body is upright. Lower body by straightening knees until body is horizontal. Continue to lower torso by bending hips until body is upside down. Repeat.','upload/exercise-picture/BBGluteHamRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1483,'Barbell Inverse Leg Curl','Adjust padded supports and kneel upright in apparatus. Position knees against large roller pad or near-upper side of padded hump, ankles between padded supports, and feet on platform. Place barbell on back of shoulders and grasp bar to sides.','Lower body until horizontal by straightening knees. Raise body by flexing knees only allowing hips to bend slightly. Repeat.','upload/exercise-picture/BBHamRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1485,'Barbell 45° Back Raise (on hyperextension apparatus)','Position thighs prone on upper padding of 45-degree hyper-extension apparatus. Hook heels on platform lip or under padded brace. Place barbell on back of shoulders and grasp bar to sides.','Lower body by bending hips until fully flexed. Raise or extend hips until torso is parallel to legs. Repeat.','upload/exercise-picture/BBHipExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1486,'Cable Straight-back Straight-leg Deadlift','Stand between two very low pulleys with shoulder width or narrower stance. Squat down and grasp stirrup attachments to each side. Stand upright with arms straight down to sides.','With knees and back straight, bow forward by bending hips until hamstrings are tight, or just before lower back bends. Raise body upright by extending hips until standing. Pull shoulders back slightly at top of lift if rounded. Repeat.','upload/exercise-picture/CBStraightBackStraightLegDeadlift.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1487,'Cable Lying Leg Curl','Attach two ankle cuffs to low pulley attachment. With cuffs on both ankles lie prone on flat bench with knees just beyond edge of bench. Grip under side or base of bench for support.','Raise ankles to glutes by flexing knees. Lower ankles until knees are straight. Repeat.','upload/exercise-picture/CBLyingLegCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1489,'Cable Bent-over Leg Curl','Attach ankle cuff to low pulley. With cuff on one ankle, grasp ballet bar with both hands and step far back with other foot. Elbows remain straight to support body leaning forward. Attached foot is stretched off floor.','Pull cable attachment back and up slightly by flexing knee. Raise knee slightly by flexing hip until knee is fully flexed. Return by straightening knee and lowering knee slightly to original position. Repeat. Continue with opposite leg.','upload/exercise-picture/CBBentOverLegCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1491,'Lever Kneeling Leg Curl (plate loaded)','Mount machine by placing supporting knee on horizontal pad and other leg under roller pad with knee against vertical pad. Grip handles and place forearm on padded arm rest.','Raise ankle to back of thigh by flexing knee. Lower ankle until knee is straight. Repeat. Continue with opposite leg.','upload/exercise-picture/LVKneelingLegCurlH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1492,'Cable Standing Leg Curl','Attach foot harness to low pulley. With foot harness on one ankle, grasp support bar with both hands and step back with other foot. Elbows remain straight to support body. Attached foot is slightly off floor.','Pull cable attachment back by flexing knee until knee is fully flexed. Return by straightening knee to original position and repeat. Continue with opposite leg.','upload/exercise-picture/CBStandingLegCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1493,'Dumbbell Straight-back Straight-leg Deadlift','Stand with shoulder width or narrower stance. Grasp dumbbells to each side.','With knees straight, lower dumbbells by bending hips until hamstrings are tight, or just before lower back bends. Lift dumbbells by extending hips until straight. Pull shoulders back slightly at top of lift if rounded. Repeat.','upload/exercise-picture/DBStraightBackStraightLegDeadlift.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1494,'Lever Lying Leg Curl (plate loaded)','Facing bench, stand between bench and lever pads. Lie prone on bench with knees just beyond edge of bench and lower legs under lever pads. Grasp handles.','Raise lever pad to back of thighs by flexing knees. Lower lever pads until knees are straight. Repeat.','upload/exercise-picture/LVLyingLegCurlH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1495,'Lever Alternating Lying Leg Curl (plate loaded)','Facing bench, stand between bench and lever pads. Lie prone on bench with knees just beyond edge of bench and lower legs under lever pads. Grasp handles.','Raise one lever pad to back of thigh by flexing knee. Lower lever pad until knee is straight. Raise and lower other leg pad. Continue by alternating legs.','upload/exercise-picture/LVAlternatingLyingLegCurlH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1496,'Lever Bent-over Leg Curl','Stand in machine with lower pads behind lower legs, upper pads in front of thighs, and lever fulcrum between knees. Bend over, placing forearms on pads, and grasp handles. Stand with body weight shifted on foot of resting leg and raise foot of exercising leg slightly off of floor or platform.','Raise lever up by bending knee as high as possible. Return lever until knee is straight. Repeat. Continue with opposite leg.','upload/exercise-picture/LVBentOverLegCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1497,'Lever Lying Leg Curl (on reverse hyper-extension machine, plate loaded)','Place lower legs between pads with feet on bar. Lay torso and waist on bench and grasp handles.','Raise lever back and up by flexing knees. Lower lever until knees are straight. Repeat.','upload/exercise-picture/LVLyingLegCurlRevHyperMachPL.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1499,'Lever Straight-back Straight-leg Deadlift (plate loaded)','Stand between lever handles with shoulder width or narrower stance. Squat down and grasp handles to each side. Stand upright with arms straight down to sides.','With knees and back straight, bow forward by bending hips until hamstrings are tight, or just before lower back bends. Raise body upright by extending hips until standing. Pull shoulders back slightly at top of lift if rounded. Repeat.','upload/exercise-picture/LVStraightBackStraightLegDeadlift.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1500,'Lever Seated Leg Curl (plate loaded)','Sit on apparatus with back against padded back support. Push hand lever to lower leg pads. Place legs in between pads. Release hand lever gradually. Grasp handles to sides with each hand.','Pull lever to back of thighs by flexing knees. Return lever until knees are straight. Repeat.','upload/exercise-picture/LVSeatedLegCurlH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1501,'Lever Single Leg Seated Leg Curl (plate loaded)','Sit on seat with back against padded back support. Push hand lever to lower leg pads. Place one leg in between pads. Place other leg on top of upper most pad bar. Release hand lever gradually. Grasp handles to sides with each hand.','Pull padded lever to back of thighs as far as possible by flexing knee. Return padded lever until knee is straight. Change legs and repeat for opposite leg.','upload/exercise-picture/LVSingleLegSeatedLegCurlH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1502,'Lever Alternating Bent-over Leg Curl','Stand in machine with lower pads behind lower legs, upper pads in front of thighs, and lever fulcrum between knees. Bend over, placing forearms on pads, and grasp handles.','Raise left foot slightly off of floor or platform. Raise lever up with left leg, bending knee as high as possible. Return lever until knee is straight. Shift body weight to left foot and raise right foot slightly off of floor or platform. Raise lever up with right leg, bending knee as high as possible. Continue alternating movement between legs.','upload/exercise-picture/LVAlternatingBentoverLegCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1503,'Lever Kneeling Leg Curl','Mount machine by placing supporting knee on horizontal pad and other leg under roller pad with knee against vertical pad. Grip handles and place forearm on padded arm rest.','Raise ankle to back of thigh by flexing knee. Lower ankle until knee is straight. Repeat. Continue with opposite leg.','upload/exercise-picture/LVKneelingLegCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1504,'Lever Lying Leg Curl','Facing bench, stand between bench and lever pads. Lie prone on bench with knees just beyond edge of bench and lower legs under lever pads. Grasp handles.','Raise lever pad to back of thighs by flexing knees. Lower lever pads until knees are straight. Repeat.','upload/exercise-picture/LVLyingLegCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1505,'Lever Alternating Lying Leg Curl','Facing bench, stand between bench and lever pads. Lie prone on bench with knees just beyond edge of bench and lower legs under lever pads. Grasp handles.','Raise lever pad to back of thighs by flexing one knee. Lower lever pads until knee is straight and repeat with opposite leg. Continue to alternate between sides.','upload/exercise-picture/LVAlternatingLegCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1506,'Lever Alternating Standing Leg Curl','Stand in machine with lower pads behind lower legs, upper pads in front of thighs, and lever fulcrum between knees. Bend over and grasp handles for support if available.','Raise left foot slightly off of floor or platform. Raise lever up with left leg, bending knee as high as possible. Return lever until knee is straight. Shift body weight to left foot and raise right foot slightly off of floor or platform. Raise lever up with right leg, bending knee as high as possible. Continue alternating movement between legs.','upload/exercise-picture/LVAlternatingStandingLegCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1507,'Lever Standing Leg Curl (on leg extension)','Place platform to one side of padded lever. Have additional padded board in hand. Facing machine, stand to one side of padded roller. Place far leg on elevated platform. Position closest leg into apparatus by placing back of lower leg against lever roller. Place extra padded board between knee and edge of seat. Position knee forward securely against padded board and edge of seat. Bend over seat by bending hips and support torso with arms.','Pull lever to back of thigh by flexing knee. Return lever until knee is straight. Repeat. Continue with opposite leg.','upload/exercise-picture/LVStandingLegCurlonExt.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1508,'Lever Standing Leg Curl (on multi-hip machine)','Adjust platform to highest position or lever fulcrum to lowest position so fulcrum is at height of knee. If necessary, place extra elevation near end of platform to stand on, so knee is aligned with fulcrum. Adjust padded roller approximately 45° downward. Step on extra elevation facing padded roller. Place leg closest to lever over roller. Bend over at hips and grasp bar. Slightly extend hip to lower roller so knee maintains alignment with fulcrum.','Pull padded roller to glutes by flexing knee. Lower padded roller until knee is straight. Repeat. Reposition roller pad lever and continue with opposite leg.','upload/exercise-picture/LVStandingLegCurlHipMach.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1509,'Lever Seated Leg Curl','Sit on apparatus with back against padded back support. Place back of lower leg on top of padded lever. Secure lap pad against thigh just above knees. Grasp handles on lap support.','Pull lever to back of thighs by flexing knees. Return lever until knees are straight. Repeat.','upload/exercise-picture/LVSeatedLegCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1510,'Lever Standing Leg Curl','Stand in machine with one or both legs between pads depending upon machine\'s design. Position exercising leg with lever pad behind lower leg and upper pad in front of lower thigh. Bend over and grasp handles for support if available. Stand with body weight shifted on foot of resting leg and raise foot of exercising leg slightly off of floor or platform.','Pull lever up to back of thigh by flexing knee. Return lever until knee is straight. Repeat. Continue with opposite leg.','upload/exercise-picture/LVStandingLegCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1511,'Smith Straight-back Straight-leg Deadlift','Stand with shoulder width or narrower stance with thigh against bar. Grasp bar with shoulder width or slightly wider overhand grip. Disengage bar by rotating bar back.','With knees and back straight, lower bar by bending hips until hamstrings are tight, or just before lower back bends. Lift bar by extending hips until straight. Pull shoulders back slightly if rounded. Repeat.','upload/exercise-picture/SMStrtBackStrtLegDeadlift.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1512,'Smith Good-morning','Position bar on back of shoulders. Grasp bar to sides. Disengage bar by rotating bar back.','Bend hips to lower torso forward until parallel to floor. Raise torso until hips are extended. Repeat.','upload/exercise-picture/SMGoodmorning.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1514,'Lever Straight-leg Lying Hip Extension','Lie on bench and place back of lower legs against leg pad. Position hips in line with fulcrum. Grasp bottom sides of bench to keep body from moving under resistance.','With knees straight, extend lever downward until hips are extended. Return lever to upright position without allowing back of hips to raise up off of bench. Repeat.','upload/exercise-picture/LVStraightLegLyingHipExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1516,'Weighted 45° Back Raise (on hyperextension apparatus)','Position thighs prone on padding of 45-degree hyper-extension apparatus. Hook heels on platform lip or under padded brace. Hold weight to chest or behind neck.','Lower body by bending hips until fully flexed. Raise or extend hips until torso is parallel to legs. Repeat.','upload/exercise-picture/WTHipExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1518,'Weighted Back Raise (on hyperextension apparatus)','Stand in hyper-extension apparatus. Position thighs prone on large pad and lower leg under padded bar. Hold weight to chest or behind neck.','Lower body by bending hips until fully flexed. Raise or extend hips until torso is parallel to legs. Repeat.','upload/exercise-picture/WTHipExtension2.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1519,'Weighted Inverse Leg Curl','Adjust padded supports and kneel upright in apparatus. Position knees against large roller pad or near-upper side of padded hump, ankles between padded supports, and feet on platform. Hold weight to chest or behind neck.','Lower body until horizontal by straightening knees. Raise body by flexing knees, only allowing hips to bend slightly. Repeat.','upload/exercise-picture/WTHamRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1520,'Single Leg Hanging Hamstring Bridge','Stand behind bar facing elevated platform positioned slightly away on other side of bar. Grasp bar with slightly wider than shoulder width grip. Walk body under bar. Position back of heel on elevated platform. Place other foot on or just over floor so leg is bent. Hang under bar with arms straight and hips bent just above floor.','Raise hips up as high as possible by extending hip and spine. Maintain bent position of lower leg allowing it to rise with hips. Lower hips along with bent lower leg to original position and repeat. Continue with legs in opposite position.','upload/exercise-picture/BWSingleLegHangingHamstringBridge.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1521,'Hanging Hamstring Bridge','Stand behind bar facing elevated platform positioned slightly away on other side of bar. Grasp bar with slightly wider than shoulder width grip. Walk body under bar and position back of heels on elevated platform. With legs extended forward, hang under bar with arms straight and hips bent just above floor.','Raise hips up as high as possible by extending hips. Lower hips to original position just above floor. Repeat.','upload/exercise-picture/BWHangingHamstringBridge.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1522,'Hanging Straight Hip Leg Curl','Lay supine under fixed horizontal bar. Grasp bar with wide overhand grip. Straighten and raise body off of floor keeping heels on floor.','Pull body toward feet by bending knees while keeping hips straight. Roll onto feet until knees are fully flexed. Return body to original position by extending knees. Repeat.','upload/exercise-picture/BWHangingStraightHipLegCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1523,'Leg Curl (on stability ball)','Lie supine on floor with lower legs on exercise ball. Extended arms out to sides. Straighten low back, knees, and hips, raising back and hips off of floor.','Keeping hips and low back straight, bend knees, pulling heels toward rear end. Allow feet to rollup on to ball. Lower to original position by straightening knees. Repeat.','upload/exercise-picture/BWBallLegCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1524,'Leg Curl (on power wheel)','Lie supine on floor with feet strapped onto power wheel. Extended arms out to sides. Straighten knees and hips.','Keeping hips and low back straight, bend knees, pulling heels toward rear end. Raise up until lower legs are vertical. Lower to original position by straightening knees. Repeat.','upload/exercise-picture/BWWheelLegCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1525,'Inverse Leg Curl','Adjust padded supports and kneel upright in apparatus. Position knees on near-upper side of padded hump, ankles between padded supports, and feet on platform. Place arms behind back, across chest, or bent beside head depending on desired intensity.','Lower body until horizontal by straightening knees. Raise body by flexing knees only allowing hips to bend slightly. Repeat.','upload/exercise-picture/BWHamRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1526,'Hanging Leg Curl','Lay supine under fixed horizontal bar. Grasp bar with wide overhand grip. Straighten and raise body off of floor keeping heels on floor.','Pull body toward feet by bending knees and hips. Roll onto feet until knees are fully flexed. Return body to original position by extending knees and hips. Repeat.','upload/exercise-picture/BWHangingLegCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1527,'Self-assisted Inverse Leg Curl (on floor)','Kneel on floor. Position ankles under fixed bar or pad and knees on thick dense pad. Kneel upright with hips straight. Extend arms out to sides with elbow pointing back and slightly bent. Position hands slightly forward with palms facing forward or slightly toward floor.','Lower body with hips straight by slowly straightening knees. Control descent only with hamstrings as low as possible. Only when body begins to fall, touch down with tensed finger tips out to each side. Once fingers make contact with floor, control remaining descent with assistance of arms. Allowing chest to come very close to floor, rapidly push off against floor, again just enough to assist hamstrings in raising body upward. Return to upright kneeling position and repeat.','upload/exercise-picture/AsHamstringRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1528,'Self-assisted Inverse Leg Curl','Place elevated platform in front of glute-hamstring apparatus. Adjust padded supports and kneel upright in apparatus. Position knees against large roller pad or near-upper side of padded hump (depending on model), ankles between padded supports, and feet on platform.','Lower body with hips straight by slowly straightening knees. Position hands forward, ready to push body weight back up off of surface. Control descent only with hamstrings as low as possible before catching body by quickly placing hands on elevated platform and rapidly pushing off against platform, just enough to assist hamstrings in raising body upward. Return to upright kneeling position and repeat.','upload/exercise-picture/ASHamstringRaiseSelf.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1530,'Suspended Hanging Leg Curl','Lay supine under suspension trainer and grasp handles. Straighten and raise body off of floor keeping heels on floor.','Pull body toward feet by bending knees and hips. Roll onto feet until knees are fully flexed. Return body to original position by extending knees and hips. Repeat.','upload/exercise-picture/STHangingLegCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1531,'Suspended Hanging Straight Hip Leg Curl','Lay supine under suspension trainer and grasp handles. Straighten and raise body off of floor keeping heels on floor.','Pull body toward feet by bending knees while keeping hips and back straight. Roll onto feet until knees are fully flexed. Return body to original position by extending knees maintaining straight hip position. Repeat.','upload/exercise-picture/STHangingStraightHipLegCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1532,'Suspended Straight Hip Leg Curl','Sit on floor facing suspension trainer loops in low position. Grasp bottom of loops, then lay supine. Raise legs and place heels in loops with soles contacting handles. Extend legs out and place arms on floor off to sides. Straighten low back, knees, and hips, raising back and hips off of floor.','Bend knees, pulling heels toward rear end while keeping hips and low back straight. Raise up until lower legs are vertical or fully flexed. Lower body to original position by straightening knees, maintaining straight hip position. Repeat.','upload/exercise-picture/STLegCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1533,'Lying Hamstring Stretch','Lie on back and lift knee up. Grasp behind thigh near knee with both hands. Pull knee close to chest.','Extend knee while maintaining knee close to chest. Hold stretch. Repeat with opposite leg.','upload/exercise-picture/d343918f30680d3ba702ed5afa8e8f06.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1534,'Lever Lying Hamstring Stretch','Lie on bench with leg on padded lever and foot against horizontal bar.','Pull release lever. Keeping knee straight, pull rail so leg rises upward until mild stretch is felt. Hold stretch. Repeat with opposite leg.','upload/exercise-picture/f2666aa2a800fc2fe6dc36dee892faf1.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1535,'PNF Lying Hamstring Stretch','Instruct participant to lie on floor or mat. Kneel beside participant and extend participant\'s leg upward. Position back of participant\'s lower leg on nearest shoulder. Position near ankle on participant\'s opposite lower leg.','Push participant\'s leg close to participants chest. Place hands on floor with arms extended to control resistance. Repeat with opposite leg.','upload/exercise-picture/ad3b598f490e6b8b995cb1340055bfb4.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1536,'Suspended Hamstring Runner','Sit on floor facing suspension trainer loops in low position. Grasp bottom of loops, then lay supine. Raise legs and place heels in loops with soles contacting handles. Extend one leg out straight, keep other leg bent so knee is pointing up. Place arms on floor off to sides. Lift low back and hips off of floor so one leg is straight with back and other leg bent, so foot of bent leg is close to knee of straight leg.','Simultaneously alternate leg positions by straightening bent leg while bending straight knee. Repeat.','upload/exercise-picture/STHamstringRunner2.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1537,'Suspended Leg Curl','Sit on floor facing suspension trainer loops in low position. Grasp bottom of loops, then lay supine. Raise legs and place heels in loops with soles contacting handles. Extend legs out and place arms on floor off to sides. Straighten low back, knees, and hips, raising back and hips off of floor.','Pull heels toward rear end by bending knees and hips simultaneously. Lower body to original position by straightening knees and hips. Repeat.','upload/exercise-picture/STHamstringCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1538,'Lever Seated Hamstring Stretch','Sit on seat in forward position with lower leg on shin pad, feet on foot rest. Place hands through wrist straps. Hold lower bar with overhand grip.','Push and lower seat back. Hold stretch. Repeat with opposite leg.','upload/exercise-picture/PCHamstring8.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1539,'Seated Hamstring Stretch','Sit on floor or mat with knees straight.','Reach toward or beyond toes or bring torso toward legs. Hold stretch.','upload/exercise-picture/a422b3586f6873533c458303bf5eb3e4.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1540,'Seated Hamstring Stretch (Chair)','Sit on edge of chair or exercise ball. Position heels on floor with knees straight.','Reach toward toes or bring torso toward legs. Hold stretch.','upload/exercise-picture/57dc517f31121e83c57b6105b4a2ed96.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1541,'Seated Single Leg Hamstring Stretch','Sit on floor or mat with legs apart and knees straight.','Reach toward one foot or bring torso toward one leg. Hold stretch for 20 seconds. Repeat with opposite leg.','upload/exercise-picture/5b56995e644b0d712ba1b67b2f8db277.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1542,'Lying Hamstring Stretch (towel)','Sit on mat or floor with knees bent. Position towel under middle of foot with hands grasping towel on both ends. Lie back and raise leg straight above maintaining grip on towel with both hands.','Pull leg back while keeping knee straight. Hold stretch. Repeat with opposite leg.','upload/exercise-picture/7dc8003e4a2f4d121769db944044da4e.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1543,'PNF Seated Hamstring Stretch','Instruct participant to sit with knees straight on floor or mat. Kneel behind participant and position chest on participant\'s back. Place hands just above knees from each side.','Push participant\'s torso toward legs with chest while holding down knees. Hold stretch.','upload/exercise-picture/98bd050fcb0ea0c6998fb6de92b4d2e2.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1544,'Lying Vertical Hamstring Stretch','Lie on floor with one leg extending up onto side of wall or column and other leg bent with foot on floor. One way this can be position can be achieved in a single motion is by sitting on floor with back of one shoulder against end of wall or column. Rotate body 90° onto back while swinging one leg up onto side of wall or column, ending up with back on floor and head positioned away from wall.','Straighten elevated knee until slight stretch is felt in back of thigh. If no stretch is felt, slowly straighten bent leg until slight stretch is felt in back of thigh. Hold stretch. Repeat with opposite leg on opposite side of wall or column.','upload/exercise-picture/LyingVerticalHamstringStretch.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1545,'Standing Hamstring Stretch','Stand and bend over with knees straight.','Reach toward toes or floor or bring torso toward legs. Hold stretch.','upload/exercise-picture/91a7ef2697a2704d3c1a7d86d33aa879.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1546,'Seated Single Leg Hamstring Stretch (Bench)','Sit on bench. Place one leg on bench with knee straight.','Reach toward foot or bring torso toward leg on bench. Hold stretch. Repeat with opposite leg.','upload/exercise-picture/a2bc88ca82564c16bdc1bc7f5d1c5ec0.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1547,'Seated Single Leg Hamstring Stretch (Chair)','Sit on edge of chair or exercise ball. Position heel on floor with knee straight.','Reach toward toe or bring torso toward leg. Hold stretch. Repeat with opposite leg.','upload/exercise-picture/ec248e61d0b6bbd886eeecbf4ef669b5.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1548,'Standing Cross Leg Hamstring Stretch','Stand erect with legs crossed, outsides of feet together. Bend over with rear knee straight.','Reach toward feet or bring torso toward legs. Hold stretch. Repeat with opposite leg.','upload/exercise-picture/983c5c33d55888967b68cf2cb93db26c.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1549,'Standing Single Leg Hamstring Stretch','Sand with on foot forward and rear foot pointing out. Bend over and brace torso by placing hand just above bent rear knee.','Lean down and bend rear knee further. Hold stretch. Repeat with opposite leg.','upload/exercise-picture/2165e6dfac69ea56cf98ac8a23b1ccd7.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1550,'Standing Single Leg Hamstring Stretch (Bench)','Place foot on bench or elevation.','Reach toward foot on bench or bring torso toward leg. Hold stretch. Repeat with opposite leg.','upload/exercise-picture/f3a004d8d78c90f707422c91c7fefcf9.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1551,'Soldier Kick','Stand and step forward with left foot.','Next step, extend left arm forward while swinging right leg up so foot touches or comes close to hand. Lower right leg. Repeat with same sequence on opposite side. Continue by alternating between each side until specific distance is covered or desired number of repetitions have been completed.','upload/exercise-picture/SoldierKick.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1552,'Soldier Kick (intermittent)','Stand and step forward with left foot.','Next step, extend left arm forward while swinging right leg up so foot touches or comes close to hand. Lower right leg, then take two steps, with left and right legs. Repeat with same sequence on opposite side. Continue by alternating between each side followed by double steps until specific distance is covered or desired number of repetitions have been completed.','upload/exercise-picture/SoldierKickIntermittent.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1553,'Lever Standing Hip Adduction','Adjust platform so lever fulcrum is same height as hip articulation. Adjust roller pad to side position. Face machine and grasp bars to sides. Place inside of thigh on roller pad and remain standing on supporting leg.','Move leg toward and across supporting leg Return and repeat. Reposition roller pad lever and continue with opposite leg.','upload/exercise-picture/LVStandingHipAdduction.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1554,'Lever Seated Hip Adduction','Sit in machine with legs outside of vertical center pads. If available, place heels on foot bars. Disengage and pull lever brace to position legs apart until slight stretch is felt. Engage lever into locked position. Lie back and grasp bars to sides.','Move legs together. Return and repeat.','upload/exercise-picture/LVSeatedHipAdduction.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1556,'Cable Lying Hip Adduction','Stand or sit in front of low pulley and attach cable cuff to ankle. Step away from pulley toward opposite pull, pulling weight plates up just far enough get next to opposite cable pulley. Attach other cable cuff to opposite ankle. Sit so hips are between both low pulley cables to each side. Lie down on back and lift legs up vertically.','Lower legs apart out to each side until stretch is felt in inner thigh. Raise legs together. Return and repeat.','upload/exercise-picture/CBLyingHipAdduction.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1557,'Lever Lying Hip Adduction','Sit in machine with legs outside of vertical center pads. If available, place heels on foot bars. Lie back on back pad. Disengage and pull lever brace to position legs apart until slight stretch is felt. Engage lever into locked position. Lie back and grasp bars to sides.','Move legs together. Return and repeat.','upload/exercise-picture/LVLyingAdduction.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1558,'Weighted Lying Hip Adduction','Sit on floor or mat with bar, weight plates loaded on one side. Sit on hip with knees bent and place bar on inside of shoe with weight plate beyond foot. Holding on to opposite end of bar, lie on side with weighted leg extended out straight and upper leg extended behind.','Raise weighted leg up off floor as high as possible while balanciong bar inside of foot and holding onto nearest side of bar. Return to floor and repeat. Repeat and continue with opposite leg.','upload/exercise-picture/WtLyingHipAdduction.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1559,'Lever Seated Hip Adduction (plate loaded)','Sit on seat and lift one leg onto padded lever. Lean back onto back pad. Grasp handles attatched to leg levers. Push handles together and raise other leg onto other padded lever. Release leg lever handles and grasp other handles to each side.','Move legs together until leg levers make contact. Allow legs to seperate far apart until slight stretch and repeat.','upload/exercise-picture/LVHipAdductionH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1560,'Cable Hip Adduction','Stand in front of low pulley facing to one side. Attach cable cuff to near ankle. Step out away from stack with wide stance and grasp ballet bar. Stand on far foot and allow near leg to be Pulled toward low pulley.','Move near leg just in front of far leg by abduction hip. Return and repeat. Turn around and continue with opposite leg.','upload/exercise-picture/CBHipAdduction.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1564,'Lying Groin Stretch','Lie on floor or mat. Place soles of feet together on floor close to body with knees far apart.','Lower knees toward floor. Hold stretch.','upload/exercise-picture/e9193c7fc71f76f33a62c8b12d86ffa6.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1565,'PNF Bent Leg Groin Stretch','Instruct participant to lie on floor or mat. Ask them to place soles of feet together on floor close to body with knees apart. Kneel close to participant and place hands on insides of participant\'s knees.','Spread participant\'s legs down to sides and hold stretch.','upload/exercise-picture/47cbe592bfdf56a5990239826ca76ad7.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1566,'Kneeling Side Lunge Stretch','Kneel on floor or mat. Place one foot pointing out and somewhat perpendicular to opposite kneeling leg.','Shift upright body toward supporting foot. Hold stretch. Repeat on opposite leg.','upload/exercise-picture/d183ca3634ed1a15ce4e86750dc12769.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1567,'Kneeling Groin Stretch','Kneel with feet pointed out to sides. Place forearms and hands on floor.','Spread knees apart and gently lower hips. Hold stretch for 20 seconds.','upload/exercise-picture/c048a0741ded61fa0dda2a92ef77b95c.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1569,'Lying Wall Groin Stretch','Sit on floor with hip and thigh against wall. Lift back of legs up against wall by pivoting on hips and lying on back. Place back of legs against wall.','Spread legs. Hold stretch.','upload/exercise-picture/495b5c75dd3cd406a20b460c59d9554b.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1570,'Seated Groin Stretch','Sit on floor or mat with soles of feet together on floor and close to body. Grasp feet with both hands and position elbows on inside of lower legs.','Press knees toward floor with elbows. Hold stretch.','upload/exercise-picture/2e5747087dc8bafff113bf6b80a668eb.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1571,'Lever Groin Stretch','Sit on seat in forward position. Place hands through wrist straps. Hold lower bar with overhand grip. Position soles of feet together on top edge of shin pad.','Push and lower seat back. Hold stretch.','upload/exercise-picture/PCGroin8.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1572,'Seated Groin Stretch (on apparatus)','Sit on platform facing adjustable handles. Spread legs apart and place inside of legs on outer surface of padded stumps. Straighten knees, grasp handles, and sit upright.','Straighten back and pull legs further apart by pulling on handles. Hold stretch.','upload/exercise-picture/a27b9cca96504dabff67b776873d74e1.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1573,'PNF Straight Leg Groin Stretch','Instruct participant to lie on floor or mat with legs positioned straight up, slightly apart. Grasp participant\'s ankle from inside.','Spread legs down to sides and hold stretch.','upload/exercise-picture/4a953ad380e1760b3e40028a0fdca304.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1574,'Squatting Groin Stretch','Stand with feet pointed approximately 45° outward. Squat down completely with knees pointed outward over toes. Place palms of hands on floor with inside of upper arm positioned against inner thigh.','Pull thighs apart with upper arms. Hold stretch.','upload/exercise-picture/34c9835255b7324f033509782d62fa19.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1575,'Side Lunge Stretch','Stand with feet far apart, toes pointed 45° outward.','Lunge toward one side. Allow foot of straight leg to point upward with heel on floor. Hold stretch. Repeat on opposite leg.','upload/exercise-picture/517f3409f5a115f38d544800a5a1ffad.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1576,'Standing Groin Stretch','Stand next to upper thigh height surface off to side. Hold onto elevated surface or other stable structure for balance and place inner side of nearest bent lower leg on elevated surface.','Lower body slightly by bending knee of base leg until stretch if felt. Repeat on opposite leg.','upload/exercise-picture/e6c0cc8d037dc5ec14ae367e397bf998.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1577,'Seated Groin Stretch (chair or bench)','Sit on end of chair or bench. Place legs as far apart as possible with knees bent approximately 90 degrees and feet flat on floor pointing same direction as knees. Lean over and position upper forearms inside lower thighs near knees.','Lean forward more while pushing thighs apart. Hold stretch.','upload/exercise-picture/079df26ca2d76ff727a699a7a908aeb7.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1578,'Lever Seated Groin Stretch','Sit on apparatus with each leg on adjacent platforms.','Separate legs apart by turning knob. Lean forward slightly and grasp forward bar if available. Hold stretch.','upload/exercise-picture/62c0cef1a94cf836a047d8c587d39a21.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1579,'Seated Adductor Magnus Stretch','Sit on floor or mat with feet far apart and knees bent approximately 90 degrees. Reach forward grasp bottom of feet.','Pull torso forward and hold stretch.','upload/exercise-picture/079df26ca2d76ff727a699a7a908aeb7.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1580,'Kneeling Adductor Magnus Stretch','Kneel with one foot on floor or mat. Position torso to inside of upper thigh with hands on floor.','Lower torso downward. Hold stretch.','upload/exercise-picture/2fb387607233825c08f29be65f8612b2.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1581,'Seated Adductor Magnus Stretch (chair or bench)','Straddle and sit on chair or bench with feet far apart and feet on floor.','Lean forward placing finger tips or hands on floor if possible. Allow torso to be lowered downward and hold stretch.','upload/exercise-picture/95f43547ca7605ef764baea16ba1b9cc.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1582,'Bent-over Adductor Magnus Stretch','Stand with one foot on chair or bench. Bend over.','Reach toward floor. Hold stretch.','upload/exercise-picture/81c5dc1f1d715c1f451f378fe03b9427.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1583,'Lying Adductor Magnus Stretch','Lie supine on floor or mat. Raise knees and grasp back of thighs behind knees.','Pull knee toward shoulders or to side of torso while keeping opposite leg on floor. Hold stretch.','upload/exercise-picture/606b95ba87532c1a4ce991be5c7a6f0a.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1584,'Seated Single Leg Adductor Magnus Stretch','Sit on floor or mat and place outside of flexed leg on floor. Over that leg, position opposite leg with foot flat on floor and back of heel against shin.','Bent torso forward. Hold stretch.','upload/exercise-picture/3e224ee57a9ee6e20edcd66d60ab1f14.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1585,'Safety Barbell Standing Leg Calf Raise','Stand facing safety barbell on rack upper chest height and calf block on floor just below. Position toes and balls of feet on calf block with arches and heels extending off. Place hands on bar to each sides or on vertical rack bars. Position head in yoke with padded bar around shoulders. Dismount bar from rack by standing erect with safety bar, away yet close to rack.','Raise heels by extending ankles as high as possible. Lower heels by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/SFStandingCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1586,'Barbell Standing Leg Calf Raise','Set barbell on power rack upper chest height with calf block under barbell. Position back of shoulders under barbell with both hands to sides. Position toes and balls of feet on calf block with arches and heels extending off. Lean barbell against rack and raise from supports by extending knees and hips. Support barbell against verticals with both hands to sides.','Raise heels by extending ankles as high as possible. Lower heels by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/BBStandingCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1587,'Cable Standing Calf Raise','Place cable belt or dip belt around waist. Kneel before low pulley and attach belt to cable. Stand on calf block and grasp support bar for balance. Position toes and balls of feet on calf block with arches and heels extending off.','Raise heels by extending ankles as high as possible. Lower heels by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/CBStandingCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1588,'Cable One Arm Single Leg Calf Raise','Stand facing low pulley with platform on floor. Bend over and grasp stirrup attachment with one hand. Stand on edge of platform and grasp support bar for balance. Position toes and balls of feet on platform with arches and heels extending off. Lift one leg up off of floor.','Raise heel by extending ankle as high as possible. Lower heel by bending ankle until calf is stretched. Repeat.','upload/exercise-picture/CBSingleLegCalfRaiseStirrup.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1589,'Cable Single Leg Calf Raise','Kneel before low pulley and attach cable belt or dip belt to cable. Stand on edge of platform and grasp support bar for balance. Position toes and balls of feet on platform with arches and heels extending off. Lift one leg up off of floor.','Raise heel by extending ankle as high as possible. Lower heel by bending ankle until calf is stretched. Repeat.','upload/exercise-picture/CBSingleLegCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1590,'Dumbbell Single Leg Calf Raise','Grasp dumbbell in one hand to side. Position toes and balls of feet on calf block with arches and heels extending off. Place hand on support for balance. Lift other leg to rear by bending knee.','Raise heel by extending ankle as high as possible. Lower heel by bending ankle until calf is stretched. Repeat. Continue with opposite leg.','upload/exercise-picture/DBSingleLegCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1591,'Dumbbell Standing Calf Raise','Grasp dumbbell in one hand to side. Position toes and balls of feet on calf block with arches and heels extending off. Place hand on support for balance.','Raise heels by extending ankles as high as possible. Lower heels by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/DBCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1592,'Lever 45° Calf Press (plate loaded)','Sit on seat with back on padded support. Place feet on platform. Grasp handles to sides and extend hips and knees. Place toes and balls of feet on lower portion of platform with heels and arches extending off.','Push platform by extending ankles as far as possible. Return by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/LV45DegCalfPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1593,'Lever Calf Extension (plate loaded)','Sit on seat and position forefeet on lever platform. Grasp handles to sides and straighten knees.','Push lever by extending ankle as far as possible. Return by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/LVSeatedCalfExtensionH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1594,'Lever Donkey Calf Raise (plate loaded)','Position lower back and hips under padded lever. Place forearms on supports. Position toes and balls of feet on calf block with arches and heels extending off. Straighten knees.','Raise heels by extending ankles as high as possible. Lower heels by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/LVDonkeyCalfRaisePL.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1595,'Lever 45° Calf Raise (plate loaded)','Sit on machine with low back against padding and grasp handles to sides. Place feet high on platform and straighten knees. Position toes and balls of feet on lower portion of platform with arches and heels extending off.','Raise heels by extending ankles as high as possible. Lower heels by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/LVCalfRaiseHackPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1596,'Lever Calf Raise (on v-squat machine, plate loaded)','Position shoulders under shoulder pads with back against back pad. Place feet on platform shoulder width apart. Extend hips and knees. Position toes and balls of feet on nearest edge of platform with arches and heels extending off.','Raise heels by extending ankles as high as possible. Lower heels by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/LVVCalfRaisePL.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1597,'Lever Seated Calf Press (plate loaded)','Place seat away from platform. Sit on seat with lower back against back of seat. Place toes and balls of feet on lower portion of platform(s) with heels and arches extending off. Grasp handles to sides and straighten knees.','Push lever platform(s) by extending ankles as far as possible. Return by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/LVSeatedCalfPressH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1598,'Lever Calf Extension','Sit on seat and position forefeet on horizontal foot bar. Grasp handles to sides and straighten knees.','Push lever by extending ankles as far as possible. Return by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/LVSeatedCalfExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1599,'Lever Standing Calf Raise (plate loaded)','Place shoulders under padded lever. Position toes and balls of feet on calf block with arches and heels extending off. Grasp handles or sides of padded lever. Stand erect by extending hips and knees.','Raise heels by extending ankles as high as possible. Lower heels by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/LVStandingCalfRaisePL.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1600,'Lever 45° Calf Raise','Sit on machine with low back against padding and grasp handles to sides. Position toes and balls of feet on lower portion of platform or foot bar with arches and heels extending off. Straighten knees.','Raise heels by extending ankles as high as possible. Lower heels by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/LV45DegreeCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1601,'Lever Donkey Calf Raise','Position lower back and hips under padded lever. Place forearms on supports. Position toes and balls of feet on calf block with arches and heels extending off. Straighten knees.','Raise heels by extending ankles as high as possible. Lower heels by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/LVDonkeyCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1602,'Lever Alternating Calf Extension','Sit on seat and position forefeet on pedals. Grasp handles to sides and straighten knees.','Push left pedal by extending ankle as far as possible while allowing right pedal to return back until calf is stretched. Reverse motion by pushing right pedal and allowing left pedal to return back. Continue to alternate motion.','upload/exercise-picture/LVAlterSeatedCalfExtStrLeg.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1603,'Lever Seated Calf Press','Place seat away from platform. Sit on seat with lower back against back of seat. Place toes and balls of feet on lower portion of platform with heels and arches extending off. Grasp handles to sides and straighten knees.','Push lever by extending ankles as far as possible. Return by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/LVSeatedCalfPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1604,'Lever Calf Extension (bilateral)','Sit on seat and position forefeet on lever platform or foot pedals. Grasp handles to sides and straighten knees.','Push lever by extending ankles as far as possible. Return by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/LVSeatedCalfExtensionBentKnees.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1605,'Lever Standing Calf Raise','Place shoulders under padded lever. Position toes and balls of feet on calf block with arches and heels extending off. Grasp handles or sides of padded lever. Stand erect by extending hips and knees.','Raise heels by extending ankles as high as possible. Lower heels by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/LVStandingCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1606,'Lever Standing Calf Raise (belt loaded)','Place lever belt or dip belt around waist. Kneel before lever and attach belt. Stand on calf block and grasp support bar for balance. Position toes and balls of feet on calf block with arches and heels extending off.','Raise heels by extending ankles as high as possible. Lower heels by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/LVStandingCalfRaiseBelt.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1607,'Sled 45° Alternating Calf Press','Sit on seat with back on padded support. Grasp handles to sides. Place toes and balls of feet on lower portion of platform with heels and arches extending off.','Push sled by extending ankles as far as possible. Return by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/SL45DegAlternCalfPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1608,'Sled 45° Calf Raise','Sit on machine with lower back against padding and grasp handles to sides. Position toes and balls of feet on foot platform with arches and heels extending off. Straighten knees.','Raise heels by extending ankles as high as possible. Lower heels by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/SL45DegreeCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1609,'Sled 45° Calf Raise (plate loaded)','Sit on machine with lower back against padding and grasp handles to sides. Position toes and balls of feet on foot of platform with arches and heels extending off. Straighten knees.','Raise heels by extending ankles as high as possible. Lower heels by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/SL45DegCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1610,'Lever Forward Angled Calf Raise','Place shoulders under padded lever. Position toes and balls of feet on top of calf block with arches and heels extending off. Grasp handles or sides of padded lever. Stand erect by extending hips and knees.','Raise heels by extending ankles as high as possible. Lower heels by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/LVForwardAngledCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1611,'Sled Donkey Calf Raise','Position lower back and hips under upper pad. Place forearms on supports. Position toes and balls of feet on calf block with arches and heels extending off. Straighten knees.','Raise heels by extending ankles as high as possible. Lower heels by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/SLDonkeyCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1612,'Sled Hack Calf Press','Lie supine on sled with shoulders against pad and place feet on platform. Grasp handles to sides and straighten knees. Place toes and balls of feet on lower portion of platform with heels and arches extending off.','Push sled up away from platform by extending ankles as far as possible. Return by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/HackCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1613,'Sled Lying Calf Press','Position sled away from platform. Lie supine on sled with shoulders against pad and place feet on platform. Grasp handles to sides and straighten knees. Place toes and balls of feet on lower portion of platform with heels and arches extending off.','Push sled away from platform by extending ankles as far as possible. Return by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/SLLyingCalfPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1614,'Sled Lying Calf Press (plate loaded)','Position sled away from platform. Lie supine on sled with shoulders against pad and place feet on platform. Grasp handles to sides and straighten knees. Place toes and balls of feet on lower portion of platform with heels and arches extending off.','Push sled away from platform by extending ankles as far as possible. Return by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/SLLyingCalfPressPL.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1615,'Sled 45° Calf Press','Sit on seat with back on padded support. Place feet on platform. Grasp handles to sides and extend hips and knees. Place toes and balls of feet on lower portion of platform with heels and arches extending off.','Push sled by extending ankles as far as possible. Return by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/SL45DegCalfPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1616,'Sled Seated Calf Press','Place seat away from platform. Sit on seat and place feet on platform. Grasp handles to sides and extend hips and knees. Place toes and balls of feet on lower portion of platform with heels and arches extending off.','Push sled by extending ankles as far as possible. Return by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/SLSeatedCalfPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1617,'Sled Vertical Calf Press','Lie on back pad. Place feet on platform. Grasp handles to sides and extend hips and knees. Place toes and balls of feet on platform with heels and arches extending off.','Push sled by extending ankles as far as possible. Return by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/SLVerticalCalfPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1618,'Smith Standing Leg Calf Raise','Position bar on upper chest height and place calf block under bar. Position back of shoulders under bar and grasp bar to sides. Position toes and balls of feet on calf block with arches and heels extending off. Disengage bar by rotating bar back. Stand erect by extending knees and hips.','Raise heels by extending ankles as high as possible. Lower heels by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/SMStandCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1619,'Smith Donkey Calf Raise','Engage both safety stops mid height so bar will be just above in lowest range of motion. Place calf block under bar. Position padded surface of tall bench or Roman Chair in front of smith machine for arm rest. Place stiffly padded board within arms reach. Step on calf block while standing between smith bar and arm rest. Situate padded board on back of hips while bending under smith bar. Arrange smith bar above upper hips or lower waist with padded board in between. Place forearms on supports. Lift bar off of safety stops by straighten knees. Position toes and balls of feet on calf block with arches and heels extending off.','Raise heels by extending ankles as high as possible. Lower heels by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/SMDonkeyCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1620,'Sled Standing Calf Raise','Place shoulders under padded bars. Position toes and balls of feet on calf block with arches and heels extending off. Grasp handles or sides of padded bars. Stand erect by extending hips and knees.','Raise heels by extending ankles as high as possible. Lower heels by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/SLStandingCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1621,'Weighted Single Leg Calf Raise','Hang weight from dip belt around waist. Position toes and ball of foot on calf block end of platform with heel and arch extending off. Place hand or hands on support for balance. Lift other leg to rear by bending knee.','Raise heel by extending ankle as high as possible. Lower heel by bending ankle until calf is stretched. Repeat. Continue with opposite leg.','upload/exercise-picture/WTSingleLegCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1622,'Sled Forward Angled Calf Raise','Lie forward so chest is on pad and shoulders are under padded bars. Position toes and balls of feet on calf block with arches and heels extending off. Grasp handles or sides of padded bars. Stand erect by extending hips and knees. Release lever if available.','Raise heels by extending ankles as high as possible. Lower heels by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/SLFrontCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1623,'Weighted Donkey Calf Raise','Stand on edge of platform, toes and balls of feet on calf block with arches and heels extending off. Bend over and grasp knee high bar (as shown) or place forearms on thigh high surface (see example). Allow training partner to mount hips or lower back from bench.','Raise heels by extending ankles as high as possible. Lower heels by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/WtDonkeyCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1624,'Standing Calf Raise','Position toes and balls of feet on calf block with arches and heels extending off. Place hand on support for balance.','Raise heels by extending ankles as high as possible. Lower heels by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/BWCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1625,'Single Leg Calf Raise','Position toes and balls of feet on calf block or elevation with heels and arches extending off. Place hand or hands on support for balance. Lift one leg to rear by bending knee.','Raise heel by extending ankle as high as possible. Lower heel by bending ankle until calf is stretched. Repeat. Continue with opposite leg.','upload/exercise-picture/BWSingleLegCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1626,'Pike Straight Leg Calf Stretch','There are number of ways to enter into this stretch:','There are number of ways to enter into this stretch:','upload/exercise-picture/2148f0312430e4335a53af5b850a45d7.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1627,'Floor Board Straight Leg Calf Stretch','Face wall with both knees slightly bent. Position fore foot on wall with heel on floor.','Straighten knees and lean body toward wall. Hold stretch . Repeat with opposite leg.','upload/exercise-picture/a0e542a3b6a5a73791a91a9581d07a03.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1628,'Self-assisted Leg Calf Raise','Position toes and balls of feet on calf block with heels and arches extending off. Place hands on support for assistance. Lift one leg to rear by bending knee.','Raise heel by extending ankle as high as possible, assisting with upper body as little as possible. Lower heel by bending ankle until calf is stretched. Repeat. Continue with opposite leg.','upload/exercise-picture/ASSingleLegCalfRaiseSelfPull.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1629,'Self-assisted Single Leg Calf Raise (with opposite leg)','Position toes and ball of foot on calf block with heels and arches extending off. Place hand or hands on support for balance. Raise one ankle by bending knee forward, keeping forefoot on platform.','Raise body upward as high as possible by extending lower ankle while straightening knee of assisting leg. Lower heel by bending ankle while bending knee of assisting leg forward. Repeat. Continue with opposite leg positioning.','upload/exercise-picture/ASSingleLegCalfRaiseSelfFoot.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1630,'Lunging Straight Leg Calf Stretch','Stand with one leg far forward and other leg extended back with knees straight. Both feet are positioned directly forward.','Lower body forward by bending forward knee only. Hold stretch. Repeat with opposite leg.','upload/exercise-picture/72e16e3fd573bcad77e28416da6e9be4.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1631,'Single Leg Forward Angled Calf Raise','Stand facing mid-thigh to hip high vertical bar. Grasp bar with wide overhand grip. Step back so body is angled forward with body straight and arms extended approximately perpendicular to body. Feet should be pointed forward. Lift one leg to rear by bending knee.','Raise heel by extending ankle as high as possible. Allow body to travel forward and upward in same direction as body is orientated. Lower heel allowing foot to come back down flat on floor. Repeat. Continue with opposite leg.','upload/exercise-picture/BWSingleLegForwardAngledCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1632,'Single Leg Pike Straight Leg Calf Stretch','Step forward with one front forward. Bend over and place hands on floor well in front of forward foot with arms straight.','Position rear foot flat on floor while keeping rear knee straight and hold stretch. Repeat with opposite leg position.','upload/exercise-picture/ad4308a843d634d40a8009930853b52c.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1633,'Wall Straight Leg Calf Stretch','Place both hands on wall with arms extended. Lean against wall with one leg bent forward and other leg extended back with knee straight and foot positioned directly forward.','Push rear heal to floor and move hips slightly forward. Hold stretch. Repeat with opposite leg.','upload/exercise-picture/4ce1dd65b26d1b568fad686821e5f401.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1634,'Step Straight Leg Calf Stretch','Position toes and balls of feet on stair step or calf block with arches and heels extending off. Use railing or wall for balance.','With knees straight, shift body weight to one foot. Hold stretch. Repeat with opposite leg.','upload/exercise-picture/c9a754ea29b499f34e3b68b97a279195.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1635,'Towel Straight Leg Calf Stretch','Sit of floor or mat and place towel or band under foot. With both ends of towel or band in each hand, straighten leg with towel under foot.','Pull towel and hold stretch. Repeat with opposite leg.','upload/exercise-picture/0ab540f8815536fe46c029b18f1aee83.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1636,'Lever Seated Calf Extension','With leg pads in upper position, sit on seat and place feet on lever platform with legs under pads. Lower leg pads on legs so they are snuggly adjusted just behind knees. Place hands on top of thigh pads.','Push lever platform down by extending ankles as far as possible. Return by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/LVSeatedCalfRaiseExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1637,'Safety Bar Seated Calf Raise','Place safety bar on rack approximately lower leg height with calf block slightly rear of safety bar. Sit on bench facing safety bar and place toes on lower portion of platform with heels extending off. Scoot forward to edge of bench and position lower thighs under safety bar. Grasp bar to sides and lift bar from rack by pushing heels up. Slide back to center of bench.','Lower heels by bending ankles until calves are stretched. Raise heels by extending ankles as high as possible. Repeat.','upload/exercise-picture/SBSeatedCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1638,'Lever Bent Knee Calf Extension','With seat close to lever platform or foot pedals, sit on seat. Position forefeet on lever platform or foot pedals. Grasp handles to sides. Push feet into lever platform or foot pedals to prevent knees from coming back during lift.','Push lever by extending ankles as far as possible. Return by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/LVBentKneeSeatedCalfExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1639,'Lunging Bent Knee Calf Stretch','Stand with one leg far forward and other leg extended back with knees straight. Both feet are positioned directly forward.','Squat down by flexing both knees just before rear heel raises off floor. Hold stretch. Repeat with opposite leg.','upload/exercise-picture/d2e7c4e33d630b74700bd7539f474b55.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1640,'Floor Board Bent Knee Calf Stretch','Face wall with both knees slightly bent. Position fore foot on wall with heel on floor.','Straighten knee of rear leg and lean body toward wall. Hold stretch. Repeat with opposite leg.','upload/exercise-picture/10fd5c6c923c1b4f5aa350ab1ae994ff.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1641,'Lever Alternating Bent-knee Seated Calf Extension','Sit on seat and position forefeet on pedals. Grasp handles to sides and extend knees but maintain small bend in knees.','Push left pedal by extending ankle knee Simultaneously allow right pedal to return back by relaxing ankle and bending knee more. Reverse motion by pushing right pedal and allowing left pedal to return back by same means. Continue to alternate motion.','upload/exercise-picture/LVAltBentKneeSeatedCalfExt.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1642,'Lever Seated Calf Raise (plate loaded)','Sit on seat facing lever. Place forefeet on platform with heels extending off. Position lower thighs under lever pads. Grasp handles if available or place hands on lever pad. Lift lever slightly by pushing heels up. Release support lever.','Lower heels by bending ankles until calves are stretched. Raise heels by extending ankles as high as possible. Repeat.','upload/exercise-picture/LVSeatedCalfRaiseH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1643,'Smith Seated Calf Raise','Position bar slightly higher than lower leg height. Wrap bar pad around center of bar. Place calf block under bar and bench near bar. Sit on bench facing bar and place toes on lower portion of platform with heels extending off. Grasp bar to sides and extend ankles to raise knees so lower thighs are under padded bar. Push heels further up. Disengage bar by rotating bar back.','Lower heels by bending ankles until calves are stretched. Raise heels by extending ankles as high as possible. Repeat.','upload/exercise-picture/SMSeatedCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1644,'Single Leg Pike Bent Leg Calf Stretch','Step forward with one front forward. Bend over and place hands on floor well in front of forward foot with arms straight. Bend rear leg and place rear foot flat on floor.','Straighten rear knee slightly or lean forward slightly. Hold stretch. Repeat with opposite leg position.','upload/exercise-picture/824cb4509c44d51beaef7d84c2bdd8dc.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1645,'Pike Bent Leg Calf Stretch','There are number of ways to enter into this stretch:','There are number of ways to enter into this stretch:','upload/exercise-picture/9ec26b4ff7c9ddfd683bc06970ad16e7.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1646,'Lever Seated Calf Raise','Sit on seat facing lever. Reach forward and pull hand lever toward body. Place forefeet on platform with heels extending off. Position lower thighs under lever pads. Release hand lever by pushing away from body. Place hands on top of thigh pads.','Raise heels by extending ankles as high as possible. Lower heels by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/LVSeatedCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1647,'Wall Bent Knee Calf Stretch','Place both hands on wall with arms extended. Lean against wall with one leg bent forward and other leg extended back. Bend rear knee slightly, positioned foot directly forward, and place heal to floor.','Lower knee until just before heel raises. Hold stretch for 20 seconds. Repeat with opposite leg.','upload/exercise-picture/a76413823656f25915cf5e643ee9ee78.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1648,'Kneeling Calf Stretch','Kneel on lower leg. Place foot of opposite leg flat on floor.','Lean forward so knee travels beyond toes. Hold stretch . Repeat with opposite leg.','upload/exercise-picture/8102281e325bb7441e79e5f13d306c10.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1649,'Step Bent Knee Calf Stretch','Position toes and balls of feet on stair step or calf block with arches and heels extending off. Place support leg up to higher steps. Use railing or wall for balance. Bend rear knee.','Allow rear heel to lower below step. Hold stretch for 20 seconds. Repeat with opposite leg.','upload/exercise-picture/c779d0bfc0ebedf9c3a06e0392788c32.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1650,'Seated Bent Leg Calf Stretch','Sit of floor or mat. Place heel on floor or mat with bent knee upright. Grasp top of forefoot.','Pull forefoot toward shin. Repeat with opposite leg.','upload/exercise-picture/6735c80e66fbedcb5332915a053127b5.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1651,'Towel Bent Leg Calf Stretch','Sit of floor or mat. With both ends of towel or band in each hand, place towel or band under foot.','With knee bent, pull towel and hold stretch. Repeat with opposite leg.','upload/exercise-picture/9fccaf897f02ea7677d2fd16d72d5716.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1652,'Cable Single Leg Reverse Calf Raise','Place cable belt or dip belt around waist. Kneel before low pulley and attach it to cable. Stand and position heel on forward edge of platform. Raise other leg off block. Grasp support bar for balance.','Pull forefoot up toward body as far as possible. Return by extending feet until toes are pointed downward. Repeat.','upload/exercise-picture/CBSingleLegReverseCalfRaise1.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1653,'Barbell Reverse Calf Raise','Place barbell on power rack upper chest height and calf block under barbell. Position back of shoulders under barbell with both hands to sides. Position heels on forward edge of calf block. Lean barbell against rack and raise from supports by extending knees and hips. Support barbell against verticals with both hands to sides.','Pull forefoot of both feet up toward body as far as possible. Return by extending feet until toes are pointed downward. Repeat.','upload/exercise-picture/BBReverseCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1654,'Dumbbell Single Leg Reverse Calf Raise','Grasp dumbbell in one hand to side. Position one heel on forward edge of platform. Grasp support with other hand for balance. Lift other leg to rear by bending knee.','Pull forefoot up toward body as far as possible. Return by extending foot until toes are pointed downward. Repeat. Continue with opposite leg.','upload/exercise-picture/DBSingleLegReverseCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1655,'Lever Reverse Calf Extension (plate loaded)','Sit on seat and position heels on lever platform with fore feet extended off top. Grasp handles to sides and straighten knees.','Pull forefoot back toward body as far as possible while pushing platform with heels. Return feet down to platform and repeat.','upload/exercise-picture/LVSeatedReverseCalfExtensionH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1656,'Lever 45° Reverse Calf Raise (plate loaded)','Sit on machine with lower back against padding. Grasp handles to sides and place feet on top portion of platform. Straighten knees and position heels on top edge of platform.','Pull forefoot of both feet up and back toward body as far as possible. Return by extending feet return to platform. Repeat.','upload/exercise-picture/LV45ReverseCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1657,'Safety Bar Reverse Calf Raise','Standing facing safety barbell on rack upper chest height and calf block on floor just below. Position heels on forward edge of calf block. Place hands on bar to each sides or on vertical rack bars. Position head in yoke with padded bar around shoulders. Dismount bar from rack by standing erect with safety bar, away yet close to rack.','Pull forefeet up toward body as far as possible. Return by extending feet until toes are pointed downward. Repeat.','upload/exercise-picture/SBReverseCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1658,'Cable Reverse Calf Raise','Place cable belt or dip belt around waist. Kneel before low pulley and attach it to cable. Stand and position heels on forward edge of platform. Grasp support bar for balance.','Pull forefeet up toward body as far as possible. Return by extending feet until toes are pointed downward. Repeat.','upload/exercise-picture/CBReverseCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1659,'Dumbbell Reverse Calf Raise','Grasp dumbbell in one hand to side. Position heels on forward edge of platform. Grasp support with other hand for balance.','Pull forefoot of both feet up toward body as far as possible. Return by extending feet until toes are pointed downward. Repeat.','upload/exercise-picture/DBReverseCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1660,'Lever 45° Reverse Calf Press (plate loaded)','Sit on seat with back on padded support. Place feet very high on platform, grasp handles to sides, and extend knees.','Pull forefoot back toward body as far as possible while pushing platform with heels. Return feet down to platform and repeat.','upload/exercise-picture/LV45DegReverseCalfPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1661,'Lever Reverse Calf Raise (on v-squat machine, plate loaded)','Position shoulders under shoulder pads with back against back pad. Position feet far forward on platform. Grasp handles or sides of padded lever.','Pull forefeet up toward body as far as possible. Return by extending feet until toes are pointed downward. Repeat.','upload/exercise-picture/LVReverseVCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1662,'Lever Reverse Calf Raise (plate loaded)','Place shoulders under padded lever. Stand erect by extending hips and knees. Position heels on forward edge of platform placed under padded lever. Grasp handles or sides of padded lever.','Pull forefoot of both feet up toward body as far as possible. Return by extending feet until toes are pointed downward. Repeat.','upload/exercise-picture/LVReverseCalfRaisePL.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1663,'Lever Reverse Calf Extension','Sit on seat and position heels on lever platform with fore feet extended off top. Grasp handles to sides and straighten knees.','Pull forefoot back toward body as far as possible while pushing platform with heels. Return feet down to platform and repeat.','upload/exercise-picture/LVReverseCalfExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1664,'Lever Donkey Reverse Calf Raise','Position lower back and hips under upper lever pad. Place forearms on supports. Position heels on forward edge of platform.','Pull forefoot up and toward body as far as possible. Return by extending feet until toes are pointed away from body. Repeat.','upload/exercise-picture/LVDonkeyReverseCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1665,'Lever Seated Tibia Raise (plate loaded)','Sit on bench or stool. Place both feet under padded lever with heels on pedal.','Lift forefeet upward as far as possible. Return by extending feet until toes are pointed downward. Repeat.','upload/exercise-picture/LVSSeatedTibiaRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1666,'Lever Reverse Calf Raise','Place shoulders under padded lever. Stand erect by extending hips and knees. Position heels on forward edge of platform placed under padded lever. Grasp handles or sides of padded lever.','Pull forefoot of both feet up toward body as far as possible. Return by extending feet until toes are pointed downward. Repeat.','upload/exercise-picture/LVReverseCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1667,'Lever Single Leg Seated Tibia Raise (plate loaded)','Sit on bench or stool. Place foot under padded lever with heel on pedal and other foot off to side.','Lift forefoot upward as far as possible. Return by extending foot until toes are pointed downward. Repeat.','upload/exercise-picture/LVSingleLegSeatedTibiaRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1668,'Sled 45° Reverse Calf Raise','Sit on machine with lower back against padding. Grasp handles to sides and place feet on platform. Straighten knees and position heels on top edge of platform.','Pull forefoot of both feet up and back toward body as far as possible. Return by extending feet until toes are pointed away from body. Repeat.','upload/exercise-picture/SL45ReverseCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1669,'Lever Standing Tibia Raise (plate loaded)','Standing behind machine hold on to support for balance. Place foot under padded lever with heel on pedal.','Lift forefoot upward as far as possible. Return by extending foot until toes are pointed downward. Repeat.','upload/exercise-picture/LVStandingTibiaRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1670,'Sled 45° Reverse Calf Raise (plate loaded)','Sit on machine with lower back against padding. Grasp handles to sides and place feet on platform. Straighten knees and position heels on top edge of platform.','Pull forefoot of both feet up and back toward body as far as possible. Return by extending feet until toes are pointed away from body. Repeat.','upload/exercise-picture/SL45DegReverseCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1671,'Sled 45° Reverse Calf Press','Sit on seat with back on padded support. Place feet very high on platform, grasp handles to sides, and extend knees.','Pull forefoot back toward body as far as possible while pushing platform with heels. Return feet down to platform and repeat.','upload/exercise-picture/SL45DegReverseCalfPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1672,'Lever Seated Reverse Calf Press','Place seat away from platform. Sit on seat with lower back against padding and place feet very high on platform. Grasp handles to sides and straighten knees.','Pull forefoot back toward body as far as possible while pushing platform with heels. Return feet down to platform and repeat.','upload/exercise-picture/LVSeatedReverseCalfPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1673,'Sled Reverse Donkey Calf Raise (plate loaded)','Position lower back and hips under upper pad. Place forearms on supports. Position heels on forward edge of platform.','Pull forefoot up and toward body as far as possible. Return by extending feet until toes are pointed away from body. Repeat.','upload/exercise-picture/SLDonkeyReverseCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1674,'Sled Lying Reverse Calf Press','Position sled away from platform. Lie supine on sled with shoulders against pad and place feet very high on platform. Grasp handles to sides and straighten knees.','Pull forefoot back toward body as far as possible while pushing platform with heels. Return feet down to platform and repeat.','upload/exercise-picture/SLLyingReverseCalfPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1675,'Sled 45° Reverse Calf Raise (on hack press)','Sit on machine with lower back against padding. Grasp handles to sides and place feet on top portion of platform. Straighten knees and position heels on top edge of platform.','Pull forefoot of both feet up and back toward body as far as possible. Return by extending feet return to platform. Repeat.','upload/exercise-picture/SL45ReverseCalfRaiseHackPressPL.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1676,'Sled Hack Reverse Calf Raise','Lie supine on back pad with shoulders against pads. Place feet very high on platform. Extend hips and knees. Release dock levers.','Pull forefoot of both feet up toward body as far as possible. Return by extending feet until toes are pointed away from body. Repeat.','upload/exercise-picture/SLHackReverseCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1677,'Sled Reverse Calf Raise (plate loaded)','Place shoulders under padded bars. Stand erect by extending hips and knees. Position heels on forward edge of platform positioned under padded bars. Grasp handles or sides of padded bars.','Pull forefoot of both feet up toward body as far as possible. Return by extending feet until toes are pointed downward. Repeat.','upload/exercise-picture/SLStandingReverseCalfRaisePL.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1678,'Sled Lying Reverse Calf Press (plate loaded)','Position sled away from platform. Lie supine on sled with shoulders against pad and place feet very high on platform. Grasp handles to sides and straighten knees.','Pull forefoot back toward body as far as possible while pushing platform with heels. Return feet down to platform and repeat.','upload/exercise-picture/SLLyingReverseCalfPressPL.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1679,'Sled Standing Reverse Calf Raise','Place shoulders under padded bars. Stand erect by extending hips and knees. Position heels on forward edge of platform positioned under padded bars. Grasp ends or sides of padded bars.','Pull forefoot of both feet up toward body as far as possible. Return by extending feet until toes are pointed downward. Repeat.','upload/exercise-picture/SLStandingReverseCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1680,'Smith Reverse Calf Raise','Position bar upper chest height and place calf block under bar. Position back of shoulders under bar and grasp bar to sides. Position heels on forward edge of calf block. Disengage bar by rotating bar back. Stand erect with knees and hips straight.','Pull forefoot of both feet up toward body as far as possible. Return by extending feet until toes are pointed downward. Repeat.','upload/exercise-picture/SMReverseCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1681,'Reverse Calf Raise','Position heels on forward edge of calf block or platform. Grasp support with other hand for balance.','Pull forefoot of both feet up toward body as far as possible. Return by extending feet until toes are pointed downward. Repeat.','upload/exercise-picture/DBReverseCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1682,'Sled Seated Reverse Calf Press','Sit on seat and place feet very high on platform. Grasp handles to sides and extend knees.','Pull forefoot back toward body as far as possible while pushing platform with heels. Return feet down to platform and repeat.','upload/exercise-picture/SLSeatedReverseCalfPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1683,'Standing Shin Stretch','Stand and touch wall or stationary object for balance. Grasp forefoot behind.','Pull forefoot to lower back. Hold stretch. Repeat with opposite side.','upload/exercise-picture/6f8914a8ffb2d11f8beb1556ceaeeffb.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1684,'Seated Shin Stretch','Sit on chair or bench and cross lower leg over thigh of opposite leg. Place one hand above ankle and other hand on top of your foot.','Pull forefoot to extend ankle. Hold stretch. Repeat with opposite side.','upload/exercise-picture/5cdf2831c84a57c531f5f6fbd084bcdf.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1685,'Kneeling Shin Stretch','Kneel on both knees with buttocks over both heels and feet extend back.','Sit down on or toward heels. Hold stretch.','upload/exercise-picture/54b780357143690c4f905794962e7e29.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1686,'Lying Shin Stretch','Lie on one side. Grasp top forefoot behind.','Pull forefoot to lower back. Hold stretch. Repeat with opposite foot.','upload/exercise-picture/db4e77e1aa267a1a61f9d75ad4d27030.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1687,'Single Leg Reverse Calf Raise','Position one heel on forward edge of platform. Grasp support with other hand for balance. Lift other leg to rear by bending knee.','Pull forefoot up toward body as far as possible. Return by extending foot until toes are pointed downward. Repeat. Continue with opposite leg.','upload/exercise-picture/BWSingleLegReverseCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0); +/*!40000 ALTER TABLE `exercise` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `exercise_classification` +-- + +DROP TABLE IF EXISTS `exercise_classification`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `exercise_classification` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'The ID of exercise classification.', + `name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'The name of exercise classification.', + `description` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'The description of exercise classification.', + `created_by` bigint unsigned NOT NULL DEFAULT '1' COMMENT 'Created by', + `created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Created time', + `modified_by` bigint unsigned DEFAULT NULL COMMENT 'Modified by', + `modified_time` datetime DEFAULT NULL COMMENT 'Modified time', + `deleted` tinyint NOT NULL DEFAULT '0' COMMENT 'Deleted', + PRIMARY KEY (`id`), + UNIQUE KEY `exercise_classification_name_uindex` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Exercise Classification.\n\nhttps://exrx.net/WeightTraining/Glossary'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `exercise_classification` +-- + +LOCK TABLES `exercise_classification` WRITE; +/*!40000 ALTER TABLE `exercise_classification` DISABLE KEYS */; +INSERT INTO `exercise_classification` VALUES (1,'Basic','A principal exercise that can place greater absolute intensity on muscles exercised relative to auxiliary exercises. Basic exercises tend to have more of the following characteristics:\n\ngravity dependent\ninclusion or shift of resistance through multiple muscle group throughout the range of motion\n\ne.g. bench press: front deltoid to pectoralis major to triceps\n\nnatural transfer of torsion force to compression force (e.g., lockout on squat, bench press, etc.) or tension force (e.g. extension of arm curl) to the bone(s) and joint(s) during full range of motion\n\nAlso see angle of pull\n\ngravity dependent',1,'2021-06-27 13:38:55',NULL,NULL,0),(2,'Auxiliary','An optional exercise that may supplement a basic exercise. Auxiliary exercises may place greater relative intensity on a specific muscle or a head of a muscle.Compound',1,'2021-06-27 13:38:55',NULL,NULL,0),(3,'Compound','An exercise that involves two or more joint movements.',1,'2021-06-27 13:38:55',NULL,NULL,0),(4,'Isolated','An exercise that involves just one discernible joint movement.\nPull',1,'2021-06-27 13:38:55',NULL,NULL,0),(5,'Closed Chain','An exercise or movement in which the end segment of the exercised limb is fixed, or the end is supporting the weight. Most compound exercises are closed-chainmovements.',1,'2021-06-27 13:38:55',NULL,NULL,0),(6,'Open Chain','An exercise or movement in which the end segment of the exercised limb is not fixed, or the end is not supporting the weight. Many isolated exercises are open-chain movements.',1,'2021-06-27 13:38:55',NULL,NULL,0),(7,'Functional','An exercise which allows one to gain motor development or strength in a manner in which it is used in the execution of a particular task (eg: specific sport skill, occupational task, or daily activity).',1,'2021-06-27 13:38:55',NULL,NULL,0),(8,'Push','Movement away from center of body during the concentric contraction of the target muscle. Isolated movements are classified by their compound counterparts.',1,'2021-06-27 13:38:55',NULL,NULL,0),(9,'Pull','Movement toward center of body during the concentric contraction of the target muscle. Isolated movements are classified by their compound counterparts.',1,'2021-06-27 13:38:55',NULL,NULL,0); +/*!40000 ALTER TABLE `exercise_classification` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `exercise_comment` +-- + +DROP TABLE IF EXISTS `exercise_comment`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `exercise_comment` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'The ID of exercise comment.', + `exercise_id` bigint unsigned NOT NULL COMMENT 'The ID of exercise.', + `comment` varchar(2500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'The comment.', + `created_by` bigint unsigned NOT NULL DEFAULT '1' COMMENT 'Created by', + `created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Created time', + `modified_by` bigint unsigned DEFAULT NULL COMMENT 'Modified by', + `modified_time` datetime DEFAULT NULL COMMENT 'Modified time', + `deleted` tinyint NOT NULL DEFAULT '0' COMMENT 'Deleted', + PRIMARY KEY (`id`), + UNIQUE KEY `exercise_comment_exercise_id_uindex` (`exercise_id`) +) ENGINE=InnoDB AUTO_INCREMENT=1347 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Exercise Comment.\n\nRelationship:\nOne exercise to one comment.\n\nIf the exercise doen''t have comment,\nthen this table will still store the comment record for it,\nlike { id: 1, exercise_id: 1, comment: ''NONE'' }.'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `exercise_comment` +-- + +LOCK TABLES `exercise_comment` WRITE; +/*!40000 ALTER TABLE `exercise_comment` DISABLE KEYS */; +INSERT INTO `exercise_comment` VALUES (1,1,'Use neck to pull belt rather than allowing hand to assist. Keep clinched grip on belt against back of mid-head throughout movement. Clamping belt higher up further from base of skull will permit torque throughout fuller range of motion, particularly range of motion nearer full flexion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(2,4,'Sit at distance away from pulley so weight does not bottom out at lowest range of motion. Keep clinched grip on belt against side of head throughout movement. Use heads friction on belt to pull belt rather than pushing with the hand used to keep belt tight around head. Keep back against back pad to minimize torso movement, reducing rotation below cervical spine.',1,'2021-06-27 13:39:40',NULL,NULL,0),(3,3,'None',1,'2021-06-27 13:39:40',NULL,NULL,0),(4,2,'Positioning pulley higher will alter tension curve by decreasing effort required near initiation of concentric contraction while increasing effort required near end of concentric contraction. Positioning pulley slightly higher than what is shown will allow greater effort in middle of movement.',1,'2021-06-27 13:39:40',NULL,NULL,0),(5,5,'See all muscle used in Lateral Flexion:',1,'2021-06-27 13:39:40',NULL,NULL,0),(6,6,'Sit at distance away from pulley so weight does not bottom out at lowest range of motion. Keep clinched grip on belt against side of head throughout movement. Woven cotton or cloth belts tend to slip less, particularly on bald heads. If belt slips from head, place small towel between belt and head.',1,'2021-06-27 13:39:40',NULL,NULL,0),(7,7,'See all muscle used in Lateral Flexion:',1,'2021-06-27 13:39:40',NULL,NULL,0),(8,8,'None',1,'2021-06-27 13:39:40',NULL,NULL,0),(9,9,'Balance weight on back of head with both hands throughout movement. Weight plate(s) can be tilted slightly to higher point on head to keep resistance slightly more consistent throughout movement. Tilt weight forward slightly at bottom and back slightly at top. Also see Weighted Neck Flexion positioning body perpendicular on bench.',1,'2021-06-27 13:39:40',NULL,NULL,0),(10,10,'Balance weight on back of head with both hands throughout movement.Weight plate(s) can be tilted slightly to higher point on head to keep resistance slightly more consistent throughout movement. Tilt wei\n\n\nght forward slightly at bottom and back slightly at top. Also see Weighted Lying Neck Flexion lying on bench longwise.',1,'2021-06-27 13:39:40',NULL,NULL,0),(11,11,'See all muscle used in Lateral Flexion:',1,'2021-06-27 13:39:40',NULL,NULL,0),(12,12,'Head can be pulled toward back.',1,'2021-06-27 13:39:40',NULL,NULL,0),(13,13,'Keep body somewhat straight allowing waist to bend outward away from mat slightly at end of lift. See all muscle used in Lateral Flexion:',1,'2021-06-27 13:39:40',NULL,NULL,0),(14,14,'Neck retraction primarily consists of Cervical Flexion (spine) accompanied by subtle Thoracic Flexion (spine) and Neck Flexion (atlanto-occipital joint). Cervical spine has natural lordotic curvature (see diagram of spine). Much of the retraction motion is actually flattening or slight reversing the normal lordosis. The deep neck flexors perform majority of this movement. Slight neck Flexion at the atlanto-occipital joint also occurs to maintain forward head positioning.',1,'2021-06-27 13:39:40',NULL,NULL,0),(15,15,'This exercise can be performed with belt looped on TRXⓇ style suspension trainer or adjustable length gymnastics rings. Throughout movement, keep body straight and maintain tight grip on belt against back of mid-head throughout movement. Use neck to pull belt rather than allowing hand to assist. Clamping belt higher up further from base of skull will permit torque throughout fuller range of motion, particularly range of motion nearer full flexion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(16,16,'Exercise involves neck flexors as well as neck extensors. See controversial exercises.',1,'2021-06-27 13:39:40',NULL,NULL,0),(17,17,'Keep body somewhat straight bending spine and hips slightly as head rolls down. Exercise involves neck flexors as well as neck extensors. See controversial exercises.',1,'2021-06-27 13:39:40',NULL,NULL,0),(18,18,'This exercise can be performed with belt looped on TRXⓇ style suspension trainer or adjustable length gymnastics rings. Throughout movement, keep body straight and maintain tight grip on belt against side of head throughout movement. Use neck to pull belt rather than allowing hand to assist.',1,'2021-06-27 13:39:40',NULL,NULL,0),(19,19,'No comment.',1,'2021-06-27 13:39:40',NULL,NULL,0),(20,20,'None',1,'2021-06-27 13:39:40',NULL,NULL,0),(21,21,'None',1,'2021-06-27 13:39:40',NULL,NULL,0),(22,22,'Balance weight on back of head with both hands throughout movement. Weight plate(s) can be tilted slightly to\n\n\nhigher point on head to keep resistance slightly more consistent throughout movement. Tilt weight forward slightly at top and back slightly at bottom. Also see same movement with body lying perpendicular to bench.',1,'2021-06-27 13:39:40',NULL,NULL,0),(23,26,'Balance weight on back of head with both hands throughout movement. Weight plate(s) can be tilted slightly to\n\n\nhigher point on head to keep resistance slightly more consistent throughout movement. Tilt weight forward slightly at top and back slightly at bottom.',1,'2021-06-27 13:39:40',NULL,NULL,0),(24,25,'Exercise can also be performed by bending over with hands on bent knees.',1,'2021-06-27 13:39:40',NULL,NULL,0),(25,23,'Balance weight on back of head with both hands throughout movement. Weight plate(s) can be tilted slightly to higher point on head to keep resistance slightly more consistent throughout movement. Tilt weight slightly forward at top and back slightly at bottom. Also same see movement with body lying on bench.',1,'2021-06-27 13:39:40',NULL,NULL,0),(26,24,'Use neck to pull belt rather than allowing hand to assist. Keep clinched grip on belt against forehead throughout movement. Woven cotton or cloth belts tend to slip less, particularly on bald head. If belt slips from head, place small towel between belt and head.',1,'2021-06-27 13:39:40',NULL,NULL,0),(27,28,'See controversial exercises.',1,'2021-06-27 13:39:40',NULL,NULL,0),(28,27,'This exercise may be prescribed for functional forward head posture since it strengthens Splenius without neck flexion. Neck retraction primarily consists of Cervical Flexion (spine) accompanied by subtle Thoracic Flexion (spine) and Neck Flexion (atlanto-occipital joint). Cervical spine has natural lordotic curvature (see diagram of spine). Much of the retraction motion is actually flattening or slight reversing the normal lordosis. The deep neck flexors perform majority of movement. Slight neck Flexion at the atlanto-occipital joint also occurs to maintain forward head positioning.',1,'2021-06-27 13:39:40',NULL,NULL,0),(29,29,'Also known as wrestler\'s bridge. See controversial exercises.',1,'2021-06-27 13:39:40',NULL,NULL,0),(30,30,'None.',1,'2021-06-27 13:39:40',NULL,NULL,0),(31,31,'This exercise can be performed with belt looped on TRXⓇ style suspension trainer or adjustable length gymnastics rings. Throughout movement, keep body straight and maintain tight grip on belt against forehead. Use neck to pull belt rather than allowing hand to assist.',1,'2021-06-27 13:39:40',NULL,NULL,0),(32,32,'This exercise may be prescribed for functional forward head posture since it strengthens Splenius without neck flexion. The stretch that occurs during complete neck flexion, may exacerbate forward head posture, particularly if neck flexion is held under load. Neck flexion normally occurs at end of eccentric portion of dynamic Splenius exercises.',1,'2021-06-27 13:39:40',NULL,NULL,0),(33,33,'Exercise may be performed on shoulder press apparatus with rack or off of power rack with seat or without back support. Also see mount and dismount off of special articulating rack.',1,'2021-06-27 13:39:40',NULL,NULL,0),(34,34,'Movement can also be performed on old fashioned incline bench without seat.',1,'2021-06-27 13:39:40',NULL,NULL,0),(35,35,'See unrack and rack technique. Feet may be positioned shoulder width apart or one foot in front of other with forward leg slightly bent (as shown). Upper chest assists (instead of side delts) since grip is slightly narrower and chest is high with low back arched back slightly. Also known as Overhead Press.\n\n\nAlso see Push Press and Press Strength Standards.',1,'2021-06-27 13:39:40',NULL,NULL,0),(36,36,'Absolute height of movement may depend on range of motion. Raise should be limited to height achieved just before tightness is felt in shoulder capsule. Alternatively, height just above horizontal may be considered adequate. Elbows may be kept straight or slightly bent throughout movement.',1,'2021-06-27 13:39:40',NULL,NULL,0),(37,37,'Set barbell on forward rack slightly below shoulder height so bar may be more easily mounted and racked. Position seat so bar does not hit uprights but close enough to easily mount and rack. Range of motion will be compromised if grip is too wide.',1,'2021-06-27 13:39:40',NULL,NULL,0),(38,38,'Exercise may also be performed seated, straddling bench or on weight chair with back support.',1,'2021-06-27 13:39:40',NULL,NULL,0),(39,40,'Exercise may also be performed seated, straddling bench or on weight chair with back support. Range of motion will be compromised if grip is too wide.',1,'2021-06-27 13:39:40',NULL,NULL,0),(40,39,'Feet may be positioned shoulder width apart or one foot in front of other with forward leg slightly bent (as shown). Upper chest assists (instead of side delts) since grip is slightly narrower and chest is high with low back arched back slightly.',1,'2021-06-27 13:39:40',NULL,NULL,0),(41,42,'Absolute height of movement may depend on range of motion or when stirrup or cable makes contact with underside of forearm. Raise should be limited to height achieved just before tightness is felt in shoulder capsule. Alternatively, height just above horizontal may be considered adequate. Elbows may be kept straight or slightly bent throughout movement.',1,'2021-06-27 13:39:40',NULL,NULL,0),(42,41,'Set barbell on forward rack slightly below shoulder height so bar may be more easily unracked and racked. Position seat so bar does not hit uprights but close enough to easily mount and rack. Range of motion will be compromised if grip is too wide. Grip is slightly narrower than shoulder press. Torso is postured more upright than traditional Military Press.',1,'2021-06-27 13:39:40',NULL,NULL,0),(43,43,'Absolute height of movement may depend on range of motion or when stirrup or cable makes contact with underside of forearm. Raise should be limited to height achieved just before tightness is felt in shoulder capsule. Alternatively, height just above horizontal may be considered adequate. Elbows may be kept straight or slightly bent throughout movement.',1,'2021-06-27 13:39:40',NULL,NULL,0),(44,44,'Absolute height of movement may depend on range of motion or when stirrup or cable makes contact with underside of forearm. Raise should be limited to height achieved just before tightness is felt in shoulder capsule. Alternatively, height just above horizontal may be considered adequate. Elbows may be kept straight or slightly bent throughout movement.',1,'2021-06-27 13:39:40',NULL,NULL,0),(45,45,'Absolute height of movement may depend on range of motion or when cable makes contact with underside of forearm. Raise should be limited to height achieved just before tightness is felt in shoulder capsule. Alternatively, height just above horizontal may be considered adequate.',1,'2021-06-27 13:39:40',NULL,NULL,0),(46,47,'Absolute height of movement may depend on range of motion or when stirrup or cable makes contact with underside of forearm. Raise should be limited to height achieved just before tightness is felt in shoulder capsule. Alternatively, height just above horizontal may be considered adequate. Elbows may be kept straight or slightly bent throughout movement.',1,'2021-06-27 13:39:40',NULL,NULL,0),(47,46,'Wrists maintain their approximate position above each elbow throughout movement.',1,'2021-06-27 13:39:40',NULL,NULL,0),(48,48,'Movement can also be performed on old fashion incline bench without seat.',1,'2021-06-27 13:39:40',NULL,NULL,0),(49,49,'Internal rotation of far hip (opposite side with resistance) is much greater than spinal rotation.',1,'2021-06-27 13:39:40',NULL,NULL,0),(50,51,'Absolute height of movement may depend on range of motion. Raise should be limited to height achieved just before tightness is felt in shoulder capsule. Alternatively, height just above horizontal may be considered adequate. Elbows may be kept straight or slightly bent throughout movement. Also see Dumbbell Alternating Front Raise.',1,'2021-06-27 13:39:40',NULL,NULL,0),(51,50,'Wrists maintain their approximate position above each elbow throughout movement. Feet may be positioned apart to each side or one foot back as shown. Cable pulleys should be much closer together than what is typically found on standard cable cross over setup.',1,'2021-06-27 13:39:40',NULL,NULL,0),(52,52,'Absolute height of movement may depend on range of motion. Raise should be limited to height achieved just before tightness is felt in shoulder capsule. Alternatively, height just above horizontal may be considered adequate. Elbows may be kept straight or slightly bent throughout movement. Also see Dumbbell Front Raise.',1,'2021-06-27 13:39:40',NULL,NULL,0),(53,53,'Movement should emphasize shoulder abduction while minimizing forearm pronation as this exercise attempts to combine lateral raise like motion with shoulder press. Lean forward slightly when lifting Dumbbells.',1,'2021-06-27 13:39:40',NULL,NULL,0),(54,54,'See suggested mount and dismount when using heavy dumbbells.',1,'2021-06-27 13:39:40',NULL,NULL,0),(55,55,'Range of motion will be compromised if grip is too wide.',1,'2021-06-27 13:39:40',NULL,NULL,0),(56,56,'Exercise can also be performed on certain lever shoulder presses by facing away from machine. Range of motion will be compromised if grip is too wide.',1,'2021-06-27 13:39:40',NULL,NULL,0),(57,57,'Range of motion will be compromised if grip is too wide.',1,'2021-06-27 13:39:40',NULL,NULL,0),(58,59,'Torso can lean away for balance as shown or torso can maintain upright posture. Also see Kettlebell Press.',1,'2021-06-27 13:39:40',NULL,NULL,0),(59,58,'Range of motion will be compromised if grip is too wide. Movement angle is arguably similar to lever incline press, for upper chest. Seat should be set so only slight stretch is felt in shoulder at bottom of movement.',1,'2021-06-27 13:39:40',NULL,NULL,0),(60,60,'Absolute height of movement may depend on individual range of motion. Raise should be limited to height achieved just before tightness is felt in shoulder capsule. Alternatively, height just above horizontal may be considered adequate. Elbows may be kept straight or slightly bent throughout movement. Exercise is performed on Lever Extended Arm Lateral Raise Machine featuring long lever arms and handles attached to secondary levers as shown.',1,'2021-06-27 13:39:40',NULL,NULL,0),(61,61,'Range of motion will be compromised if grip is too wide.',1,'2021-06-27 13:39:40',NULL,NULL,0),(62,62,'Pull head back slightly so bar does not head. Range of motion will be compromised if grip is too wide.',1,'2021-06-27 13:39:40',NULL,NULL,0),(63,63,'Keep back straight when lifting end of barbell from floor. Also see Lever One Arm Press for power.',1,'2021-06-27 13:39:40',NULL,NULL,0),(64,64,'Range of motion will be compromised if grip is too wide.',1,'2021-06-27 13:39:40',NULL,NULL,0),(65,65,'Range of motion will be compromised if grip is too wide.',1,'2021-06-27 13:39:40',NULL,NULL,0),(66,66,'Range of motion will be compromised if grip is too wide.',1,'2021-06-27 13:39:40',NULL,NULL,0),(67,67,'Range of motion will be compromised if grip is too wide.',1,'2021-06-27 13:39:40',NULL,NULL,0),(68,68,'Parallel grip can be used for variety or when flexibility does not permit standard overhand grip further back.',1,'2021-06-27 13:39:40',NULL,NULL,0),(69,69,'Range of motion will be compromised if grip is too wide.',1,'2021-06-27 13:39:40',NULL,NULL,0),(70,70,'Parallel grip can be used for variety or when flexibility does not permit standard overhand grip further back.',1,'2021-06-27 13:39:40',NULL,NULL,0),(71,71,'Pull head back slightly so bar does not head. Range of motion will be compromised if grip is too wide.',1,'2021-06-27 13:39:40',NULL,NULL,0),(72,72,'Range of motion will be compromised if grip is too wide.',1,'2021-06-27 13:39:40',NULL,NULL,0),(73,73,'Benches must be secured to prevent sliding on floor. Also, each benches\' base of support should be under edge of bench where hand is placed to prevent bench toppling under body weight. Falling from an inverted position may result in very serious injury. Also known as Elevated Handstand Push-up.',1,'2021-06-27 13:39:40',NULL,NULL,0),(74,74,'Instead of scooting hips forward, hands can be eased backwards.',1,'2021-06-27 13:39:40',NULL,NULL,0),(75,75,'See PNF stretch techniques. Also see Seated Front Deltoid Stretch for similar static stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(76,76,'A stationary bar can also be used instead of wall.',1,'2021-06-27 13:39:40',NULL,NULL,0),(77,77,'Pike Press (for front delts) differs from Pike Push-up (for upper chest) in that, feet are at closer distance to hands so body is more inverted in lowest position. Keep knees and back straight. A slight curve (spinal flexion) is acceptable if hamstrings are tight.',1,'2021-06-27 13:39:40',NULL,NULL,0),(78,78,'Keep knees and back straight. A slight curve (spinal flexion) is acceptable if hamstrings are tight.',1,'2021-06-27 13:39:40',NULL,NULL,0),(79,79,'At higher angles, feet can be placed flat on floor. When angled further back, only heels may contact floor with forefeet raising upward. Dismounting can be achieved by walking backward until body is upright. This exercise can be performed on TRXⓇ style suspension trainer or adjustable length gymnastics rings',1,'2021-06-27 13:39:40',NULL,NULL,0),(80,80,'A stationary bar can also be used instead of wall.',1,'2021-06-27 13:39:40',NULL,NULL,0),(81,81,'Maintain fixed slightly bent elbow position throughout exercise. Stirrup is raised by shoulder abduction, not external rotation. Also see Cable Lateral Raise performed with pulleys very close together.',1,'2021-06-27 13:39:40',NULL,NULL,0),(82,82,'Bar can be received from barbell rack, standing behind bar\nmid-thigh height. See\nUpright\nRow Safety.',1,'2021-06-27 13:39:40',NULL,NULL,0),(83,84,'Bar can be recieved from barbell rack, standing behind bar mid-thigh height. See Upright Row Safety.',1,'2021-06-27 13:39:40',NULL,NULL,0),(84,86,'See Upright Row Safety.',1,'2021-06-27 13:39:40',NULL,NULL,0),(85,83,'Maintain fixed elbow position (10° to 30° angle) throughout exercise. Stirrup is raised by shoulder abduction, not external rotation.',1,'2021-06-27 13:39:40',NULL,NULL,0),(86,85,'Maintain fixed slightly bent elbow position throughout exercise. At top of movement, elbows (not necessarily dumbbells) should be directly lateral to shoulders since elbows are slightly bent forward. Stirrup is raised by shoulder abduction, not external rotation. If elbows drop lower than wrists, front deltoids become primary mover instead of lateral deltoids.',1,'2021-06-27 13:39:40',NULL,NULL,0),(87,87,'See Upright Row Safety.',1,'2021-06-27 13:39:40',NULL,NULL,0),(88,88,'To prevent cable parts from catching, stand with body turned very subtly to side of cable behind other. Positioning one cable slightly in front of other cable may result in slight asymmetrical movement. Therefore, alternate opposite arm positions every other workout or set. See Upright Row Safety. Also see Cable Upright Row with two stirrup attachments attached to single pulley cable.',1,'2021-06-27 13:39:40',NULL,NULL,0),(89,89,'See Upright Row Safety.',1,'2021-06-27 13:39:40',NULL,NULL,0),(90,90,'See\nUpright Row Safety.',1,'2021-06-27 13:39:40',NULL,NULL,0),(91,91,'Maintain fixed slightly bent elbow position throughout exercise. Stirrup is raised by shoulder abduction, not external rotation.',1,'2021-06-27 13:39:40',NULL,NULL,0),(92,92,'Keep torso upright while maintaining fixed slightly bent elbow position throughout exercise. Stirrup is raised by combining shoulder abduction and flexion with slight external rotation. Also see Cable Seated Y Raise on dual pulley machine with stirrup attachments.',1,'2021-06-27 13:39:40',NULL,NULL,0),(93,93,'Maintain fixed slightly bent elbow position throughout exercise. Stirrup is raised by combining shoulder abduction and flexion. Slight shoulder external rotation may occur with elbows bent. Front Deltoid assists shoulder flexion if upper arm angle is slightly\n\n\nhigh. Rear Deltoid assists shoulder horizontal abduction if upper arm angle is slightly low. Also see Cable Seated Y Raise on dual pulley Cable Row machine.',1,'2021-06-27 13:39:40',NULL,NULL,0),(94,95,'See Upright\nRow Safety. Also see side view.',1,'2021-06-27 13:39:40',NULL,NULL,0),(95,94,'Maintain fixed elbow position (10° to 30° angle) throughout exercise. At top of movement, elbow (not necessarily dumbbell) should be directly lateral to shoulder since elbow is slightly bent forward. Dumbbell is raised by shoulder abduction, not external rotation. As elbow drops lower than wrist, front deltoid become primary mover instead of lateral deltoid. See Lateral Raise Errors.',1,'2021-06-27 13:39:40',NULL,NULL,0),(96,96,'In order for lateral deltoid to be exercised, dumbbell must be raised by shoulder abduction, not external rotation. Also see exercise Dumbbell Incline Lateral Raise performed on preacher bench.',1,'2021-06-27 13:39:40',NULL,NULL,0),(97,97,'Keep torso upright throughout exercise. Stirrup is raised by combining shoulder abduction and flexion. Slight shoulder external rotation may occur with elbows bent. Front Deltoid assists shoulder flexion if upper arm angle is slightly high. Rear Deltoid assists shoulder horizontal abduction if upper arm angle is slightly low. Also see Cable Seated Y Raise on single pulley machine with rope attachment.',1,'2021-06-27 13:39:40',NULL,NULL,0),(98,98,'Setup requires attaching two stirrup attachments to single pulley cable. Also see Cable Upright Row with dual pulley. See Upright Row Safety.',1,'2021-06-27 13:39:40',NULL,NULL,0),(99,99,'Keep elbows pointed high while maintaining slight bend through elbows (10° to 30° angle) throughout movement. At top of movement, elbows (not necessarily dumbbells) should be directly lateral to shoulders since elbows are slightly bent forward. Dumbbells are raised by shoulder abduction, not external rotation. If elbows drop lower than wrists, front deltoids become primary mover instead of lateral deltoids. To keep resistance targeted to side delt, torso is bent over slightly. See other view and Lateral Raise Errors.',1,'2021-06-27 13:39:40',NULL,NULL,0),(100,100,'Dumbbell is raised by shoulder abduction, not external rotation.',1,'2021-06-27 13:39:40',NULL,NULL,0),(101,101,'Maintain fixed elbow position (10° to 30° angle) throughout exercise. At top of movement, elbow (not necessarily dumbbell) should be directly lateral to shoulder since elbow is slightly bent forward. Dumbbell is raised by shoulder abduction, not external rotation. As elbow drops lower than wrist, front deltoid becomes primary mover instead of lateral deltoid. See Lateral Raise Errors.',1,'2021-06-27 13:39:40',NULL,NULL,0),(102,102,'See Upright Row Safety.',1,'2021-06-27 13:39:40',NULL,NULL,0),(103,103,'When dumbbells are raised, wrist can be flexed, extended, or keep neutral.',1,'2021-06-27 13:39:40',NULL,NULL,0),(104,104,'When dumbbells are raised, wrists should be in front or just below of shoulders; elbows should be to sides, not pointing\n\n\nforward. See Upright Row Safety.',1,'2021-06-27 13:39:40',NULL,NULL,0),(105,105,'See Upright Row Safety. Also see Seated Upright Row.',1,'2021-06-27 13:39:40',NULL,NULL,0),(106,107,'None.',1,'2021-06-27 13:39:40',NULL,NULL,0),(107,108,'When dumbbell is raised, wrist should be in front or just below of shoulder; elbow should be to side, not too pointing forward. See Upright Row Safety. Also see Dumbbell One Arm Upright Row in standing position.',1,'2021-06-27 13:39:40',NULL,NULL,0),(108,106,'If necessary, lean forward slightly to keep elbows directly lateral to body. Also see alternative machine.',1,'2021-06-27 13:39:40',NULL,NULL,0),(109,109,'If elbows drop much lower than wrists, front deltoids become primary mover instead of lateral deltoids. Torso can also lean forward slightly to keep resistance targeted to side delt.',1,'2021-06-27 13:39:40',NULL,NULL,0),(110,110,'If elbows drop much lower than wrists, front deltoids become primary mover instead of lateral deltoids.',1,'2021-06-27 13:39:40',NULL,NULL,0),(111,112,'Positioning arm on upper chest stretches rear deltoid. See Rear Delt Stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(112,113,'None',1,'2021-06-27 13:39:40',NULL,NULL,0),(113,114,'At higher angles, feet can be placed flat on floor. When angled further back, only heels may contact forefeet floor with forefeet raising upward. Dismounting can be achieved by walking backward until body is upright. This exercise can be performed on TRXⓇ style suspension trainer or adjustable length gymnastics rings.',1,'2021-06-27 13:39:40',NULL,NULL,0),(114,115,'See Upright\nRow Safety.',1,'2021-06-27 13:39:40',NULL,NULL,0),(115,116,'See Upright Row Safety.',1,'2021-06-27 13:39:40',NULL,NULL,0),(116,117,'If upper arm travels closer than perpendicular to trunk, latissimus dorsi becomes involved. Elbows should be raised directly lateral to shoulders. Bench should be just high enough to prevent barbell from hitting floor and close to horizontal. Lying at 45° is not sufficient angle to target rear deltoids. Much lighter resistance is required as Cambered Bar Lying Row.',1,'2021-06-27 13:39:40',NULL,NULL,0),(117,118,'Upper arms should travel in horizontal path at shoulder height (not downward) to minimize Latissimus Dorsi involvement.',1,'2021-06-27 13:39:40',NULL,NULL,0),(118,119,'The relatively powerful Latissimus\nDorsi\n becomes involved:',1,'2021-06-27 13:39:40',NULL,NULL,0),(119,120,'Upper arm should travel perpendicular to torso to minimize latissimus dorsi involvement. Elbows may bend slightly at top of movement (as shown) or they may be kept fixed.',1,'2021-06-27 13:39:40',NULL,NULL,0),(120,121,'Flexion of wrist can allow for slightly greater range of movement near top, but this movement optional.',1,'2021-06-27 13:39:40',NULL,NULL,0),(121,122,'Upper arms should travel in horizontal path at shoulder height (not downward) to minimize Latissimus Dorsi involvement.',1,'2021-06-27 13:39:40',NULL,NULL,0),(122,123,'Elbow width is determined when elbows are raised at height of shoulders out to sides. The relatively powerful Latissimus Dorsi becomes involved:',1,'2021-06-27 13:39:40',NULL,NULL,0),(123,124,'If upper arm travels closer than perpendicular to trunk, latissimus dorsi becomes involved. Elbows should be raised directly lateral to shoulders. Positioning torso at 45° is not sufficient angle to target rear deltoids. Keep torso bent over approximately horizontal. Knees are bent in effort to keep low back straight (See Hamstring Inflexibility). If low back becomes rounded due to tight hamstrings, either knees should be bent more or torso may not be positioned as low. If low back is rounded due to poor form, deadlift weight to standing position and lower torso into horizontal position with knees bent and back straight. Much lighter resistance is required as Barbell Bent-over Row.',1,'2021-06-27 13:39:40',NULL,NULL,0),(124,125,'Upper arm should travel in horizontal path at shoulder height (not downward) to minimize Latissimus Dorsi involvement.',1,'2021-06-27 13:39:40',NULL,NULL,0),(125,126,'Dual pulley cables should be positioned approximately shoulder height or not much lower.\n\n\nThe relatively powerful Latissimus Dorsi becomes involved:',1,'2021-06-27 13:39:40',NULL,NULL,0),(126,127,'The relatively powerful Latissimus Dorsi becomes involved:',1,'2021-06-27 13:39:40',NULL,NULL,0),(127,128,'The relatively powerful Latissimus Dorsi becomes involved:',1,'2021-06-27 13:39:40',NULL,NULL,0),(128,129,'Upper arm should travel in perpendicular path to torso to minimize Latissimus Dorsi involvement. If stirrups are not within reach, training partner can hand exercises cable attachments.',1,'2021-06-27 13:39:40',NULL,NULL,0),(129,130,'Upper arm should travel in perpendicular path to torso to minimize Latissimus Dorsi involvement.',1,'2021-06-27 13:39:40',NULL,NULL,0),(130,131,'The relatively powerful Latissimus Dorsi becomes involved:',1,'2021-06-27 13:39:40',NULL,NULL,0),(131,132,'Dumbbells are raised by shoulder transverse abduction, not external rotation, nor extension. Upper arm should travel in perpendicular path to torso to minimize latissimus dorsi involvement. Upper arm should travel in perpendicular path to torso to minimize latissimus dorsi involvement. Bench should be high enough to prevent dumbbells from hitting floor and close to horizontal. Also see exercise performed on Lying Rear Delt Apparatus. Lying at 45° is not sufficient angle to target rear deltoids. Also see Rear Lateral Raise Errors.',1,'2021-06-27 13:39:40',NULL,NULL,0),(132,133,'If upper arm travels closer than perpendicular to trunk, latissimus dorsi becomes involved. Elbows should be raised directly lateral to shoulders. Bench should be just high enough to prevent dumbbells from hitting floor and close to horizontal. Also see exercise performed on Lying Rear Delt Apparatus. Lying at 45° is not sufficient angle to target rear deltoids. Much lighter resistance is required as Dumbbell Lying Row.',1,'2021-06-27 13:39:40',NULL,NULL,0),(133,134,'Upper arm should travel perpendicular to torso to minimize latissimus dorsi involvement. Elbows may bend slightly at bottom of movement (as shown) or they may be kept fixed. If low back cannot be kept straight due to inflexibility of hamstrings, try keeping knees bent more.',1,'2021-06-27 13:39:40',NULL,NULL,0),(134,135,'Latissimus Dorsi becomes involved if elbows drop below shoulders.',1,'2021-06-27 13:39:40',NULL,NULL,0),(135,136,'The relatively powerful Latissimus Dorsi becomes involved:',1,'2021-06-27 13:39:40',NULL,NULL,0),(136,137,'Maintain fixed elbow position straight or slightly bent and keep upper arm perpendicular to trunk throughout exercise.',1,'2021-06-27 13:39:40',NULL,NULL,0),(137,138,'Dumbbells are raised by shoulder transverse abduction, not external rotation, nor extension. Upper arm should travel in perpendicular path to torso to minimize relatively powerful latissimus dorsi involvement. In other words, at top of movement, elbows (not necessarily dumbbells) should be directly lateral to shoulders since elbows are slightly bent forward. To exercise posterior deltoid and not lateral deltoid, keep torso close to horizontal. Positioning torso at 45° is not sufficient angle to target rear deltoids. Knees are bent in effort to keep low back straight (See Hamstring Inflexibility). If low back becomes rounded due to tight hamstrings, either knees should be bent more or torso may not be positioned as low. If low back is rounded due to poor form, slowly lower torso into horizontal position with knees bent and back straight. Also see Rear Lateral Raise Errors.',1,'2021-06-27 13:39:40',NULL,NULL,0),(138,139,'Bench should be horizontal and be high enough to prevent dumbbell from touching floor. Upper arm should travel in perpendicular path to torso to minimize latissimus dorsi involvement. Bench should be high enough to prevent dumbbells from hitting floor and close to horizontal. Lying at 45° is not sufficient angle to target rear deltoids. This exercise AKA \"prone full can\" has been suggested to exercise supraspinatus muscle in rehabilitation settings (Blackburn TA, et al. 1990; Reinold MM, et al. 2007).',1,'2021-06-27 13:39:40',NULL,NULL,0),(139,140,'If upper arm travels closer than perpendicular to trunk, latissimus dorsi becomes involved. Elbow should be raised dire\n\n\nctly lateral to shoulder. Positioning torso at 45° is not sufficient angle to target rear deltoids. Keep torso bent over approximately horizontal. See side view of Dumbbell Rear Delt Row. Much lighter resistance is required as Dumbbell Bent-over Row.',1,'2021-06-27 13:39:40',NULL,NULL,0),(140,141,'If upper arm travels closer than perpendicular to trunk, latissimus dorsi becomes involved. Elbows should be kept on same movement plane as shoulders. Much lighter resistance is required as Lever Incline Row.',1,'2021-06-27 13:39:40',NULL,NULL,0),(141,142,'Upper arm should travel in perpendicular path to torso. At lower portion of exercise, keep elbows pointed outward below shoulders. At upper portion of exercise, keep elbows pointed outward to sides of shoulders. Legs may be kept together, extending off end (as shown), or bent straddling.',1,'2021-06-27 13:39:40',NULL,NULL,0),(142,145,'None.',1,'2021-06-27 13:39:40',NULL,NULL,0),(143,143,'If upper arm travels closer than perpendicular to trunk, latissimus dorsi becomes involved. Elbows should be kept same height as shoulders. Much lighter resistance is required as Lever Seated Row or even Wide Grip Lever Seated Row.',1,'2021-06-27 13:39:40',NULL,NULL,0),(144,144,'Dumbbells are raised by shoulder transverse abduction, not external rotation, nor extension. Upper arm should travel in perpendicular path to torso to minimize relatively powerful latissimus dorsi involvement. This mean at top of movement, elbows (not necessarily dumbbells) should be directly lateral to shoulders since elbows are slightly bent forward. To exercise posterior deltoid and not lateral deltoid, keep upper torso close to horizontal. Positioning upper torso at 45° is not sufficient angle to target rear deltoids. The spine can be flexed to achieve this positioning if thighs can provide sufficient support for torso. Some individuals may not be able to bend sufficiently at hip due to flexibility or girth constraints. Also see Rear Lateral Raise Errors and Low Back Alignment Exceptions.',1,'2021-06-27 13:39:40',NULL,NULL,0),(145,147,'Upper arm should travel in perpendicular path to torso to minimize Latissimus Dorsi involvement.',1,'2021-06-27 13:39:40',NULL,NULL,0),(146,148,'Platform height should allow pivot point of shoulders to be aligned with lever fulcrum. Upper arm should travel in perpendicular path to torso to minimize relatively powerful latissimus dorsi involvement. At top of movement, elbows (not necessarily dumbbells) should be directly lateral to shoulders since elbows are slightly bent forward. To exercise posterior deltoid and not lateral deltoid, keep torso close to horizontal. Positioning torso at 45° is not sufficient angle to target rear deltoids. Knees are bent in effort to keep low back straight (See Hamstring Inflexibility). Apparatus was originally designed to be used for Extended Arm Kneeling Lateral Raise. Also see Rear View Angle.',1,'2021-06-27 13:39:40',NULL,NULL,0),(147,149,'If upper arm travels closer than perpendicular to trunk, latissimus dorsi becomes involved. Elbows should be kept same height as shoulders. Also see exercise performed on alternative lever row machine. Much lighter resistance is required as compared to Lever Seated Row.',1,'2021-06-27 13:39:40',NULL,NULL,0),(148,150,'Keep elbows raised at same height of shoulders to minimize Latissimus Dorsi involvement. Thumbs down grip may be used so shoulders more naturally assume height of shoulders. Some machines allow for a more neutral overhand grip.',1,'2021-06-27 13:39:40',NULL,NULL,0),(149,151,'Platform height should allow pivot point of shoulders to be aligned with lever fulcrum. Upper arm should travel in perpendicular path to torso. At lower portion of exercise, keep elbows pointed outward below shoulders. At upper portion of exercise, keep elbows pointed outward to sides of shoulders. Knees are bent in effort to keep low back straight (See Hamstring Inflexibility).',1,'2021-06-27 13:39:40',NULL,NULL,0),(150,152,'If upper arm travels closer than perpendicular to trunk, latissimus dorsi becomes involved. Elbows should be raised directly lateral to shoulders. Keep torso bent over as far as possible allowing just enough height to fully extend arms. Knees are bent in effort to keep low back straight (See Hamstring Inflexibility). If low back becomes rounded due to tight hamstrings, either knees should be bent more or torso may not be positioned as low. If low back is rounded due to poor form, slowly lower torso into horizontal position with knees bent and back straight. Much lighter resistance is required as Lever T-Bar Row.',1,'2021-06-27 13:39:40',NULL,NULL,0),(151,155,'Keep elbows raised at same height of shoulders to minimize Latissimus Dorsi involvement. Exercise can also be performed with parallel grip, either with thumbs up or thumbs down positioning.',1,'2021-06-27 13:39:40',NULL,NULL,0),(152,153,'Upper arm should travel in perpendicular path to torso. At lower portion of exercise, keep elbows pointed outward below shoulders. At upper portion of exercise, keep elbows pointed outward to sides of shoulders. Legs may be kept together, extending off end, or bent straddling bench as demonstrated.',1,'2021-06-27 13:39:40',NULL,NULL,0),(153,157,'To maintain hips and back against pad during lift, legs must push into foot bar while keeping spine ridged. If apparatus is unavailable, a similar movement can be performed on certain pec deck machines with adequate ranges of motion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(154,156,'Pronated grip will internally rotate shoulders so elbows are kept at height of shoulders. Preventing elbows from dropping below shoulders will minimize Latissimus Dorsi involvement. With thumbs down grip, shoulder must be deliberately internally rotated to keep elbow at proper height. Some machines allow for a more neutral overhand grip.',1,'2021-06-27 13:39:40',NULL,NULL,0),(155,154,'Can be performed on certain pec deck machines as shown if their range of motion and design are adequate, although Gripless Lever Seated Reverse Fly machine is typically better suited for this exercise.',1,'2021-06-27 13:39:40',NULL,NULL,0),(156,158,'If elbows fall so upper arms no longer travels perpendicular to trunk, Latissimus Dorsi becomes involved. Elbows should be positioned directly lateral to shoulders at highest position. Pulling bar to lower chest is not sufficient angle to target rear deltoids. A higher bar (ie: lighter resistance) is required than what is required on Inverted Row. Bar height can be adjusted to vary resistance. See Gravity Vectors for greater understanding of how body angle influences resistance. Also known as Body Row or Supine Row.',1,'2021-06-27 13:39:40',NULL,NULL,0),(157,159,'If elbows fall so upper arms no longer travels perpendicular to trunk, Latissimus Dorsi becomes involved. Elbows should be positioned directly lateral to shoulders at highest position. Pulling bar to lower chest is not sufficient angle to target rear deltoids. A higher bar (ie: lighter resistance) is required than what is required on Inverted Row. Bar height can be adjusted to vary resistance. See Gravity Vectors for greater understanding of how body angle influences resistance. Also known as Body Row or Supine Row.',1,'2021-06-27 13:39:40',NULL,NULL,0),(158,160,'If upper arm travels closer than perpendicular to trunk, latissimus dorsi becomes involved. Elbows should be raised directly lateral to shoulders. Positioning torso at 45° is not sufficient angle to target rear deltoids. Keep torso bent over approximately horizontal. Knees are bent in effort to keep low back straight (See Hamstring Inflexibility). If low back becomes rounded due to tight hamstrings, either knees should be bent more or torso may not be positioned as low. If low back is rounded due to poor form, slowly lower torso into horizontal position with knees bent and back straight. Much lighter resistance is required as Smith Bent-over Row. Also see front angled view.',1,'2021-06-27 13:39:40',NULL,NULL,0),(159,162,'Upper arms should travel in transverse path at shoulder level without allowing elbows to drop to minimize Latissimus Dorsi involvement. A very upright position (ie: very light resistance) with one foot positioned slightly back (see \'Easier\') is typically required for proper execution. Take care to maintain tension on suspension trainer near top of movement. Dismounting can be achieved by walking backward until body is upright or stepping out at top of movement. This exercise can be performed on TRXⓇ style suspension trainer or adjustable length gymnastics rings.',1,'2021-06-27 13:39:40',NULL,NULL,0),(160,163,'If elbows fall so upper arms no longer travels perpendicular to trunk, Latissimus Dorsi becomes involved. Elbows should be positioned directly lateral to shoulders at highest position throughout movement. Executing exercise with elbows dropping lower than shoulders is not sufficient position to target rear deltoids. A more upright position (ie: lighter resistance) is required than what is used on Suspended Row for General B ack. Dismounting can be achieved by walking backward until body is upright.',1,'2021-06-27 13:39:40',NULL,NULL,0),(161,164,'Positioning arm on lower chest stretches side deltoid. See Side Delt Stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(162,165,'None',1,'2021-06-27 13:39:40',NULL,NULL,0),(163,167,'Raise toward 10 o\'clock with left arm and toward 2 o\'clock with right arm. Maintain straight elbow position with elbow pointing outward throughout exercise.',1,'2021-06-27 13:39:40',NULL,NULL,0),(164,168,'Raise toward 10 o\'clock with left arm and toward 2 o\'clock with right arm. Maintain straight elbow position with elbow pointing outward throughout exercise.',1,'2021-06-27 13:39:40',NULL,NULL,0),(165,169,'Maintain straight elbow position throughout exercise. Exercise may also be performed with shoulder traveling up to 30º forward, more inline with plane of scapular.',1,'2021-06-27 13:39:40',NULL,NULL,0),(166,170,'Maintain straight or nearly straight elbow position with elbows pointing outward throughout exercise. If low pulley is fixed, turn slightly away from low pulley.',1,'2021-06-27 13:39:40',NULL,NULL,0),(167,171,'Maintain straight or nearly straight elbow position with elbows pointing outward throughout exercise.',1,'2021-06-27 13:39:40',NULL,NULL,0),(168,172,'Grip can be slightly narrower than shoulder width but not too close. Too close of grip can decrease range of motion, may tend to hyper-adduct wrist joint, and unnecessarily decrease stability of bar.\n\n\nAlso see Bench Press Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(169,173,'See mount and dismount. Some assisted machines require you to kneel on pad. Also see Assisted Chest Dip.',1,'2021-06-27 13:39:40',NULL,NULL,0),(170,174,'Movement is hybrid between Bench Press and Triceps Extension. A false grip or standard thumb opposing grip can be taken, approximately 16\" (40 cm) apart for men. Bar is brought downward anywhere between chin and upper chest. As to minimize shoulder involvement, keep elbows up, allowing elbow to fold upon itself. Range of motion is determined by muscle mass of forearm and biceps. After mastering form and gradually progressing in resistance, push barbell upward more rapidly for greater power development.',1,'2021-06-27 13:39:40',NULL,NULL,0),(171,175,'See mount and dismount. Some assisted machines require you to stand on bar. Also see Assisted Chest Dip.',1,'2021-06-27 13:39:40',NULL,NULL,0),(172,177,'Grip can be slightly narrower than shoulder width but not too close. Also see Bench Press Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(173,176,'With arms fully extended, bar can be brought back over upper chest. Shoulders can be internally rotated between repetitions as needed to allow for relative release of tension in muscles. Barbell can be received from the floor or from rack either situated over abdomen or from behind head. Exercise can also be performed with straight barbell. Movement with cambared bar as shown above is also known as EZ Barbell or EZ Bar Lying Triceps Extension.',1,'2021-06-27 13:39:40',NULL,NULL,0),(174,179,'With arms fully extended, bar can be brought back over shoulders. Shoulders can be internally rotated between repetitions as needed to allow for relative release of tension in muscles. Either straight barbell or EZ barbell can be used.',1,'2021-06-27 13:39:40',NULL,NULL,0),(175,178,'Slow barbell\'s descent as it approaches forehead. Exercise can also be performed with elbow traveling slightly back during extension. With this altered form, barbell essentially moves in straight line, up and down, over forehead. Either straight barbell or EZ barbell can be used. See Lying Triceps Extension Bench with rack.',1,'2021-06-27 13:39:40',NULL,NULL,0),(176,181,'With arms fully extended, bar can be brought back over shoulders. Shoulders can be internally rotated between repetitions as needed to allow for relative release of tension in muscles. Either straight barbell or EZ barbell can be used.',1,'2021-06-27 13:39:40',NULL,NULL,0),(177,180,'Let barbell pull arm back to maintain full shoulder flexion. Exercise may be performed standing or on seat with or without back support. Either straight barbell or EZ barbell can be used.',1,'2021-06-27 13:39:40',NULL,NULL,0),(178,182,'Let cable resistance pull arm back to maintain degree of shoulder flexion, dependent upon flexibility.',1,'2021-06-27 13:39:40',NULL,NULL,0),(179,183,'Keep elbow approximately same position throughout movement.',1,'2021-06-27 13:39:40',NULL,NULL,0),(180,184,'Avoid using shoulders by attempting to press bar over head. If incline is designed to pivot back, lean seat back for mount & dismount.',1,'2021-06-27 13:39:40',NULL,NULL,0),(181,185,'Let cable resistance pull arm back to maintain degree of shoulder flexion, dependent upon flexibility.',1,'2021-06-27 13:39:40',NULL,NULL,0),(182,186,'With arms fully extended, shoulders can be internally rotated between repetitions as needed to allow for relative release of tension in muscles.',1,'2021-06-27 13:39:40',NULL,NULL,0),(183,187,'Let cable attachment pull arm back to maintain full shoulder flexion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(184,188,'A very low pulley and/or high decline is needed to achieve full range of motion at bottom position. With arms fully extended, shoulders can be internally rotated between repetitions as needed to allow for relative release of tension in muscles.',1,'2021-06-27 13:39:40',NULL,NULL,0),(185,189,'Position face close to cable to provide resistance at top of motion. Elbows is brought close to body so arms are vertical at bottom of motion, either at or near the end of full extension, or in one movement as bar is pushed downward.',1,'2021-06-27 13:39:40',NULL,NULL,0),(186,190,'The elbow can travel up slightly at top of motion. Stay close to cable to provide resistance at top of motion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(187,191,'The elbow can travel up slightly at top of motion. Stay close to cable to provide resistance at top of motion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(188,192,'If seat is positioned back behind pulleys as shown, bending forward can provide resistance at top of motion. See Angle of Pull.',1,'2021-06-27 13:39:40',NULL,NULL,0),(189,193,'Wrist can be flexed slightly at top of movement to compensate for hyperextension required at bottom of movement. The elbow can travel up slightly at top of motion. Stay close to cable to provide resistance at top of motion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(190,194,'Stand far enough away from pulley to keep cable taut in lowered position. Keep elbow approximately same position throughout movement.',1,'2021-06-27 13:39:40',NULL,NULL,0),(191,195,'The elbow can travel up slightly at top of motion. Stay close to cable to provide resistance at top of motion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(192,197,'The elbow can travel up few inches at top of motion. Step close to cable to provide resistance at top of motion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(193,196,'Keep back against back pad throughout exercise.',1,'2021-06-27 13:39:40',NULL,NULL,0),(194,198,'If high pulley is adjustable, lower pulley slightly to provide resistance at top of motion. If high pulley is fixed, position bench distance away from cable column. If incline is positioned too high, range of motion at lower position may be compromised.',1,'2021-06-27 13:39:40',NULL,NULL,0),(195,200,'If cable dip machine is not available, A dip bar placed in front of low pully cable. Also see rear view and Cable Chest Dip.',1,'2021-06-27 13:39:40',NULL,NULL,0),(196,199,'Let cable pull arm back to maintain full shoulder flexion. Exercise can also be performed on traditional low pulley setup. Also see exercise with Pronated Grip.',1,'2021-06-27 13:39:40',NULL,NULL,0),(197,201,'Let cable attachment pull arm back to maintain full shoulder flexion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(198,202,'Let cable pull arm back to maintain full shoulder flexion. Also see exercise with Supinated Grip.',1,'2021-06-27 13:39:40',NULL,NULL,0),(199,203,'Let dumbbell pull back arm slightly to maintain full shoulder flexion. Keep elbow in so movement does not turn into overhead press. Back support sho\n\n\nuld not be so high that it interferes with dumbbell being completely lowered (i.e. full range of motion). See rear view. Exercise may be performed on bench without back support.',1,'2021-06-27 13:39:40',NULL,NULL,0),(200,204,'With arms fully extended, dumbbells can be brought to upper chest between repetitions as needed to allow for relative release of tension in muscles.',1,'2021-06-27 13:39:40',NULL,NULL,0),(201,205,'For greater range of motion, upper arm can be positioned with elbow slightly higher than shoulder. Also see Triceps Kickback Errors.',1,'2021-06-27 13:39:40',NULL,NULL,0),(202,206,'Keep elbows pointed up or just slightly back throughout movement.',1,'2021-06-27 13:39:40',NULL,NULL,0),(203,207,'Let cable attachment pull arm back to maintain full shoulder\nflexion.\n\n\nExercise can also\nbe performed seated on bench or seat with back support just below\nshoulders.',1,'2021-06-27 13:39:40',NULL,NULL,0),(204,208,'Movement can also be performed on old fashioned incline bench without seat.',1,'2021-06-27 13:39:40',NULL,NULL,0),(205,209,'Position wrists closer together to keep elbows from pointing out too much. Let dumbbell pull back arm to maintain full shoulder flexion. Consider using seat with back support as illustrated. Back support should not be so high that it interferes with dumbbell being completely lowered (i.e. full range of motion). If shoulder flexion flexibility is not adequate, position hips slightly forward (as illustrated) so elbows are positioned upward. Position body more upright if shoulder flexion flexibility is adequate. See suggested mount & dismount.',1,'2021-06-27 13:39:40',NULL,NULL,0),(206,210,'Let dumbbell pull back arm to maintain full shoulder flexion. Consider using seat with back support.',1,'2021-06-27 13:39:40',NULL,NULL,0),(207,211,'Hands will be closer together at top of movement as compared to Barbell Close Grip Bench Press since lever arms travel inward at top of motion. Also see Bench Press Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(208,212,'Grip can be slightly narrower than shoulder width but not too close. Also see Bench Press Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(209,213,'When finished, push foot lever down, release handles, then release foot lever.',1,'2021-06-27 13:39:40',NULL,NULL,0),(210,214,'When finished, push foot lever down, release handles, then release foot lever.',1,'2021-06-27 13:39:40',NULL,NULL,0),(211,215,'Also see movement performed on alternative machine.',1,'2021-06-27 13:39:40',NULL,NULL,0),(212,216,'In effort to achieve fuller range of motion, head can be positioned down so handles can clear over head. With heavy resistance, back pad will need to be adjusted to keep torso close to arm pad. Position armpit to rest near top of pad. Back of upper arm should remain on pad throughout movement.',1,'2021-06-27 13:39:40',NULL,NULL,0),(213,217,'Also see Lever Chest Dip.',1,'2021-06-27 13:39:40',NULL,NULL,0),(214,218,'With heavy resistance, back pad will need to be adjusted to keep torso close to arm pad. Adjust seat height so back of upper arms rest on padding. If seat is too high, shoulder will need to rise near end of extension to complete final range of motion since forearms will make contact with pad before lockout. If seat is too low, range of motion will be compromised because elbows will not be completely flexed at beginning of movement. Also see Lever Triceps Extension on alternative apparatus.',1,'2021-06-27 13:39:40',NULL,NULL,0),(215,219,'See exercise on alternative machine. Also see Lever Chest Dip on machine facing away from fulcrum and Lever Chest Dip.',1,'2021-06-27 13:39:40',NULL,NULL,0),(216,220,'If lever arms freely move together or apart, keep moderately close grip throughout movement. Triceps will not be as involved in movement if grip is lower than chest. Seat height should be adjusted so bar is at least lower chest height. Also Lever Parallel Grip Bench Press for chest.',1,'2021-06-27 13:39:40',NULL,NULL,0),(217,222,'Also Lever Parallel Grip Incline Bench Press for upper chest.',1,'2021-06-27 13:39:40',NULL,NULL,0),(218,223,'If machine has secondary lever (as shown), elbows do not have to be exactly aligned with primary fulcrum.',1,'2021-06-27 13:39:40',NULL,NULL,0),(219,224,'With heavy resistance, back pad will need to be adjusted to keep torso close to arm pad. Adjust seat height, so back of upper arms rest on padding. If seat is too high, shoulder will need to rise near end of extension to complete final range of motion since forearms will make contact with pad before lockout. If seat is too low, range of motion will be compromised because elbows will not be completely flexed at beginning of movement. If machine has secondary lever (as shown), elbows do not have to be exactly aligned with primary fulcrum. Also see Lever Triceps Extension on alternative apparatus.',1,'2021-06-27 13:39:40',NULL,NULL,0),(220,225,'This particular machine design is rare. See typical dip machines:​​​​',1,'2021-06-27 13:39:40',NULL,NULL,0),(221,226,'Grip can be slightly narrower than shoulder width but not too close. Also see Bench Press Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(222,228,'Also see parallel grip Lever Triceps Dip and Lever Chest Dip.',1,'2021-06-27 13:39:40',NULL,NULL,0),(223,229,'Grip can be slightly narrower than shoulder width but not too close. Also see Bench Press Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(224,230,'Bench height should allow for full range of motion. If assistant is not available, place weight on lap sitting on floor or edge of bench.',1,'2021-06-27 13:39:40',NULL,NULL,0),(225,231,'Also see Weighted Chest Dips.',1,'2021-06-27 13:39:40',NULL,NULL,0),(226,232,'Both upper and lower body must be kept straight throughout movement. Exercise can be performed without additional weight (See Close Grip Pushup without weight). If additional weight is used, partner will need to add and remove weight, and keep weight from sliding off back. See wider grip push-up.',1,'2021-06-27 13:39:40',NULL,NULL,0),(227,233,'Both upper and lower body must be kept straight throughout movement. Forefeet can remain on floor as long as body is pivoting on knees. Also see close grip variation and wider grip push-ups on knees.',1,'2021-06-27 13:39:40',NULL,NULL,0),(228,234,'Bench height should allow for full range of motion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(229,235,'Both upper and lower body must be kept straight throughout movement. See wider grip push-up.',1,'2021-06-27 13:39:40',NULL,NULL,0),(230,236,'Bench height should allow for full range of motion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(231,237,'Also see Band-assisted Chest Dips.',1,'2021-06-27 13:39:40',NULL,NULL,0),(232,238,'Bench height should allow for full range of motion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(233,240,'Also see Chest Dips.',1,'2021-06-27 13:39:40',NULL,NULL,0),(234,241,'Instead of 1 Triceps Rope (as shown), 2 ab slings or 2 nylon/cloth Stirrups with long straps can also be used (see how to loop cable stirrup onto bar) with overhand grip. Both upper and lower body must be kept straight throughout movement. Height of bar affects difficulty of movement. See Gravity Vectors for greater understanding of how body angle influences resistance. Also see Suspended Triceps Extension with Suspension Trainer.',1,'2021-06-27 13:39:40',NULL,NULL,0),(235,242,'Both upper and lower body must be kept straight throughout movement. Height of bar affects difficulty of movement. See Gravity Vectors for greater understanding of how body angle influences resistance. Also see wider grip push-up.',1,'2021-06-27 13:39:40',NULL,NULL,0),(236,243,'In above clip, hands are positioned at ends of main segments of benches with fingers between gaps. On standard benches, hands should be placed near ends of benches. Perform on higher benches if slight stretch is not felt. Also see Bench Dip and Chest Dip (between benches).',1,'2021-06-27 13:39:40',NULL,NULL,0),(237,244,'If lower body is used for assistance, Quadriceps are utilized. Hips are kept straighter and body more upright, as compared to Assisted Chest Dip. This exercise can be performed on adjustable length gymnastics rings or a dual anchored suspension trainer.',1,'2021-06-27 13:39:40',NULL,NULL,0),(238,245,'In above clip, hands are positioned at ends of main segments of benches with fingers between gaps. On standard benches, hands should be placed near ends of benches. Perform on higher benches if slight stretch is not felt. Also see Bench Dip (bent knee) and Chest Dip (bent knees between benches).',1,'2021-06-27 13:39:40',NULL,NULL,0),(239,247,'This exercise can be performed on adjustable length gymnastics rings or a dual anchored suspension trainer. To emphasize triceps, position body more upright than demonstrated by positioning hips straighter. Also see Chest Dips.',1,'2021-06-27 13:39:40',NULL,NULL,0),(240,246,'Both upper and lower body should be kept straight throughout movement. Angle of body affects difficulty of movement. See Gravity Vectors for greater understanding of how body angle influences resistance. Also see Suspended Triceps Extension with Triceps Rope. This exercise can be performed on TRXⓇ style suspension trainer or adjustable length gymnastics rings.',1,'2021-06-27 13:39:40',NULL,NULL,0),(241,249,'None.',1,'2021-06-27 13:39:40',NULL,NULL,0),(242,250,'See Overhead Lat Stretch for similar exercise which can be performed with this stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(243,251,'See PNF Overhead Lat Stretch for similar exercise which can be performed with this stretch. Also see Overhead Triceps Stretch for similar static stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(244,252,'If lower body is used for assistance, Quadriceps are utilized. Hips are kept straighter and body more upright, as compared to Assisted Chest Dip.',1,'2021-06-27 13:39:40',NULL,NULL,0),(245,253,'When elbow is fully flexed, it can travel forward slightly, allowing forearm to be no more than vertical. This additional movement allows for relative release of tension in muscles between repetitions. Pulleys should not be too far apart. Cables can be positioned under shoulders with ad hoc or customized set up. See Cable Seated Curl and movement performed on apparatus facing double low pulleys.\nAlso see mechanical analysis of arm curl and question regarding elbow position.',1,'2021-06-27 13:39:40',NULL,NULL,0),(246,254,'When elbow is fully flexed, it can travel forward slightly, allowing forearm to be no more than vertical. This additional movement allows for relative release of tension in muscles between repetitions. Pulleys should not be too far apart.\nAlso see mechanical analysis of arm curl and question regarding elbow position.',1,'2021-06-27 13:39:40',NULL,NULL,0),(247,255,'Bringing ebows back forward, allowing forearms to be no more than vertical, permits a relative release of tension in muscles between repetitions. Exercise can also be performed with EZ barbell, in which case, making it also known as EZ Barbell or EZ Bar Drag Curl. Also see standard Barbell Curl.',1,'2021-06-27 13:39:40',NULL,NULL,0),(248,256,'When elbows are fully flexed, they can travel forward slightly allowing forearms to be no more than vertical. This additional movement allows for relative release of tension in muscles between repetitions. Exercise can also be performed with straight barbell. Movement with cambered bar as shown above is also known as EZ Barbell Curl or EZ Bar Curl. Also see mechanical analysis of arm curl and question regarding elbow position.',1,'2021-06-27 13:39:40',NULL,NULL,0),(249,257,'When elbows are fully flexed, they can travel forward slightly, allowing forearms to be no more than vertical. This additional movement allows for relative release of tension in muscles between repetitions.',1,'2021-06-27 13:39:40',NULL,NULL,0),(250,259,'When elbows are fully flexed, they can travel slightly forward, allowing forearms to be no more than vertical. This additional movement allows for relative release of tension in muscles between repetitions.',1,'2021-06-27 13:39:40',NULL,NULL,0),(251,258,'When elbows are fully flexed, they can travel forward slightly, allowing forearms to be no more than vertical. This additional movement allows for relative release of tension in muscles between repetitions. Pulleys should not be too far apart. Cables can be positioned under shoulders with ad hoc or customized set up. Also see Cable Alternating Seated Curl.',1,'2021-06-27 13:39:40',NULL,NULL,0),(252,260,'An alternative method is to stand facing with side of exercise arm toward low pulley. When elbow is fully flexed, it can travel forward slightly allowing forearms to be no more than vertical. This additional movement allows for relative release of tension in muscles between repetitions.\nAlso see mechanical analysis of arm curl and question regarding elbow position.',1,'2021-06-27 13:39:40',NULL,NULL,0),(253,261,'When elbow is fully flexed, it can travel forward slightly, allowing forearm to be no more than vertical. This additional movement allows for relative release of tension in muscles between repetitions. Pulleys should not be too far apart.',1,'2021-06-27 13:39:40',NULL,NULL,0),(254,262,'When elbows are fully flexed, they can travel upward, slightly allowing forearms to be no more than horizontal in this lying posture. This additional movement allows for relative release of tension in muscles between repetitions.\nAlso see mechanical analysis of arm curl and question regarding elbow position.',1,'2021-06-27 13:39:40',NULL,NULL,0),(255,263,'Biceps may be exercised alternating (as described), simultaneous, or in simultaneous-alternating fashion. When elbow is fully flexed, it can travel forward slightly, allowing forearms to be no more than vertical. This additional movement allows for relative release of tension in muscles between repetitions. Also see mechanical analysis of arm curl and question regarding elbow position.',1,'2021-06-27 13:39:40',NULL,NULL,0),(256,264,'Bar height can be adjusted to vary resistance. See Gravity Vectors for greater understanding of body angle influences resistance. Also known as Underhand Body Row or Underhand Supine Row.',1,'2021-06-27 13:39:40',NULL,NULL,0),(257,265,'The biceps may be exercised simultaneous. If machine does not provide support for back of arm, keep elbows from traveling back, particularly during initial flexion. Some machines do not offer adequate resistance at initial range of motion. Consider positioning wrists with slight flexion to compensate.',1,'2021-06-27 13:39:40',NULL,NULL,0),(258,267,'A stationary bar can also be used instead of wall.',1,'2021-06-27 13:39:40',NULL,NULL,0),(259,268,'Instead of scooting hips forward, hands can be eased backwards.',1,'2021-06-27 13:39:40',NULL,NULL,0),(260,266,'The biceps may be exercised alternating or simultaneous. If machine does not provide support for back of arm, keep elbows from traveling back, particularly during initial flexion. Some machines do not offer adequate resistance at initial range of motion. Consider positioning wrists with slight flexion to compensate.',1,'2021-06-27 13:39:40',NULL,NULL,0),(261,269,'This exercise may be performed by alternating (as described), simultaneous, or in simultaneous-alternating fashion. When elbow is fully flexed, it can travel forward slightly, allowing forearms to be no more than vertical. This additional movement allows for relative release of tension in muscles between repetitions. Also see mechanical analysis of arm curl and question regarding elbow position.',1,'2021-06-27 13:39:40',NULL,NULL,0),(262,271,'Fixed bar should be just high enough to allow arm to fully extend. See Gravity Vectors for greater understanding of how body angle influences resistance. Also known as Underhand Body Row or Underhand Supine Row.',1,'2021-06-27 13:39:40',NULL,NULL,0),(263,270,'Easier',1,'2021-06-27 13:39:40',NULL,NULL,0),(264,272,'None.',1,'2021-06-27 13:39:40',NULL,NULL,0),(265,273,'Participant\'s wrists must continue to face downward. See PNF stretch techniques. Also see Seated Biceps Stretch for similar static stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(266,274,'A stationary bar can also be used instead of wall.',1,'2021-06-27 13:39:40',NULL,NULL,0),(267,275,'Seat should be adjusted to allow arm pit to rest near top of pad. Back of upper arm should remain on pad throughout movement. The long head (lateral head) of biceps brachii is activated significantly more than short head (medial head) of biceps brachii since short head enters into active insufficiency as it continues to contract. At bottom position, weight stack in use should not make contact with remaining weight stack. Also see movement on horizontal pad.',1,'2021-06-27 13:39:40',NULL,NULL,0),(268,276,'Seat should be adjusted to allow arm pit to rest near top of pad. Back of upper arms should remain on pad throughout movement. The long head (lateral head) of biceps brachii is activated significantly more than short head (medial head) of biceps brachii since short head enters into active insufficiency as it continues to contract. At bottom position, weight stack in use should not make contact with remaining weight stack.',1,'2021-06-27 13:39:40',NULL,NULL,0),(269,277,'The long head (lateral head) of biceps brachii is activated significantly more than short head (medial head) of biceps brachii since short head enters into active insufficiency as it continues to contract.',1,'2021-06-27 13:39:40',NULL,NULL,0),(270,281,'Feet can be staggered and bent slightly (if needed) to allow\narm pit to rest near top of pad.\n\n\nBack\nof upper arm should remain on pad throughout movement. The long\nhead (lateral head) of biceps brachii is activated significantly\nmore than short head (medial head) of biceps brachii since short\nhead enters into\nactive\ninsufficiency\n as it continues to contract. At bottom position,\nweight stack in use should not make contact with remaining weight\nstack. Also see movement on\nhorizontal pad.',1,'2021-06-27 13:39:40',NULL,NULL,0),(271,280,'Also known as Barbell Spider Curl. The long head (lateral head) of biceps brachii is activated significantly more than short head (medial head) of biceps brachii since short head enters into active insufficiency as it continues to contract.',1,'2021-06-27 13:39:40',NULL,NULL,0),(272,278,'Seat should be adjusted to allow arm pit to rest near top of pad. Back of upper arms should remain on pad throughout movement. The long head (lateral head) of biceps brachii is activated significantly more than short head (medial head) of biceps brachii since short head enters into active insufficiency as it continues to contract. At bottom position, weight stack in use should not make contact with remaining weight stack.',1,'2021-06-27 13:39:40',NULL,NULL,0),(273,279,'Stirrup can be hung from one side of rack for easier access.\nFeet can be staggered and bent slightly (if needed) to allow\narm pit to rest near top of pad. Back of upper arm should remain\non pad throughout movement. The long head (lateral head) of biceps\nbrachii is activated significantly more than short head (medial\nhead) of biceps brachii since short head enters into\nactive\ninsufficiency\n as it continues to contract. At bottom position,\nweight stack in use should not make contact with remaining weight\nstack.',1,'2021-06-27 13:39:40',NULL,NULL,0),(274,282,'Body should be positioned to allow arm pit to rest near top of pad. Back of upper arm should remain on pad throughout movement. The long head (lateral head) of biceps brachii is activated significantly more than short head (medial head) of biceps brachii since short head enters into active insufficiency as it continues to contract.',1,'2021-06-27 13:39:40',NULL,NULL,0),(275,283,'Seat should be adjusted to allow arm pit to rest near top of pad. Back of upper arm should remain on pad throughout movement. The long head (lateral head) of biceps brachii is activated significantly more than short head (medial head) of biceps brachii since short head enters into active insufficiency as it continues to contract.',1,'2021-06-27 13:39:40',NULL,NULL,0),(276,284,'Also known as Cable Spider Curl. The long head (lateral head) of biceps brachii is activated significantly more than short head (medial head) of biceps brachii since short head enters into active insufficiency as it continues to contract.',1,'2021-06-27 13:39:40',NULL,NULL,0),(277,285,'Seat should be adjusted to allow arm pit to rest near top of pad. Back of upper arm should remain on pad throughout movement. The long head (lateral head) of biceps brachii is activated significantly more than short head (medial head) of biceps brachii since short head enters into active insufficiency as it continues to contract. At bottom position, weight stack in use should not make contact with remaining weight stack.',1,'2021-06-27 13:39:40',NULL,NULL,0),(278,286,'Seat should be adjusted to allow arm pit to rest near top of pad. Back of upper arm should remain on pad throughout movement. Long head (lateral head) of biceps brachii is activated significantly more than short head (medial head) of biceps brachii since short head enters into active insufficiency as it continues to contract.',1,'2021-06-27 13:39:40',NULL,NULL,0),(279,287,'The long head (lateral head) of biceps brachii is activated significantly more than short head (medial head) of biceps brachii since short head enters into active insufficiency as it continues to contract.',1,'2021-06-27 13:39:40',NULL,NULL,0),(280,288,'Seat should be adjusted to allow arm pit to rest near top of pad. Back of upper arm should remain on pad throughout movement. If no resistance is experienced during initial range of motion, make sure seat is adjusted to allow for back of arm to be positioned flush against arm pad. If resistance is still not experienced, consider keeping wrists in a slight flexed position to compensate. If machine has secondary lever (as shown), it is not as essential to position elbows in-line with the primary fulcrum, as would otherwise be required.',1,'2021-06-27 13:39:40',NULL,NULL,0),(281,289,'Back of upper arms should remain on pad throughout movement. If machine has secondary lever (as shown), it is not as essential to position elbows in-line with the primary fulcrum, as would otherwise be required.',1,'2021-06-27 13:39:40',NULL,NULL,0),(282,290,'Also known as Dumbbell Spider Curl. The long head (lateral head) of biceps brachii is activated significantly more than short head (medial head) of biceps brachii since short head enters into active insufficiency as it continues to contract.',1,'2021-06-27 13:39:40',NULL,NULL,0),(283,291,'Body should be positioned to allow arm pit to rest near top of pad. Back of upper arm should remain on pad throughout movement. Long head (lateral head) of biceps brachii is activated significantly more than short head (medial head) of biceps brachii since short head enters into active insufficiency as it continues to contract.',1,'2021-06-27 13:39:40',NULL,NULL,0),(284,292,'Back of upper arms should remain on pad throughout movement. If machine has secondary lever (as shown), elbows can be positioned further away from primary fulcrum. Long head (lateral head) of biceps brachii is activated significantly more than short head (medial head) of biceps brachii since short head enters into active insufficiency as it continues to contract. Long head of Triceps Brachii is only significantly activated as antagonist stabilizer when it approaches passive insufficiency as elbow nears full flexion. See exercise performed with both arms simultaneously.',1,'2021-06-27 13:39:40',NULL,NULL,0),(285,293,'Position armpit to rest near top of pad. Back of upper arm should remain on pad throughout movement. Notice that this machine has secondary lever so elbows are not aligned with primary fulcrum. Also see movement performed with narrow grip. The particular machine shown doubles as Triceps Extension Machine by placing weight on opposite side of fulcrum.',1,'2021-06-27 13:39:40',NULL,NULL,0),(286,294,'Back of upper arms should remain on pad throughout movement. If machine has secondary lever (as shown), it is not as essential to position elbows in-line with the primary fulcrum, as would otherwise be required.',1,'2021-06-27 13:39:40',NULL,NULL,0),(287,295,'Seat should be adjusted to allow arm pit to rest near top of pad. Back of upper arm should remain on pad throughout movement. If machine has secondary lever (as shown), it is not as essential to position elbows in-line with the primary fulcrum, as would otherwise be required. Long head (lateral head) of biceps brachii is activated significantly more than short head (medial head) of biceps brachii since short head enters into active insufficiency as it continues to contract.',1,'2021-06-27 13:39:40',NULL,NULL,0),(288,296,'Back of upper arms should remain on pad throughout movement. If machine has secondary lever (as shown), elbows can be positioned further away from primary fulcrum. Long head (lateral head) of biceps brachii is activated significantly more than short head (medial head) of biceps brachii since short head enters into active insufficiency as it continues to contract. Long head of Triceps Brachii is only significantly activated as antagonist stabilizer when it approaches passive insufficiency as elbow nears full flexion. See exercise performed with both arms simultaneously.',1,'2021-06-27 13:39:40',NULL,NULL,0),(289,297,'Dismounting can be achieved by walking backward until body is upright. Also known as Suspended Biceps Curl, arguably somewhat of a misnomer. The positioning of arms, with elbows high, places short head (medial head) of Bicep Brachii in active insufficiency as arm continues to flex. The long head of Biceps Brachii (lateral head) and in particular, Brachialis are primary movers in this position.',1,'2021-06-27 13:39:40',NULL,NULL,0),(290,298,'Position armpit to rest near top of pad. Back of upper arm should remain on pad throughout movement. Notice that this machine has secondary lever so elbows are not aligned with primary fulcrum. This particular machine also features a weight pack that can be positioned closer or further away from fulcrum thereby making resistance easier or harder.',1,'2021-06-27 13:39:40',NULL,NULL,0),(291,299,'Body should be positioned to allow arm pit to rest near top of pad. Back of upper arm should remain on pad.',1,'2021-06-27 13:39:40',NULL,NULL,0),(292,300,'When elbows are fully flexed, they can travel forward slightly, allowing forearms to be no more than vertical. This additional movement allows for relative release of tension in muscles between repetitions.',1,'2021-06-27 13:39:40',NULL,NULL,0),(293,301,'When elbows are fully flexed, they can travel forward slightly, allowing forearms to be no more than vertical. This additional movement allows for relative release of tension in muscles between repetitions.',1,'2021-06-27 13:39:40',NULL,NULL,0),(294,302,'When elbows are fully flexed, they can travel forward, slightly allowing forearms to be no more than vertical. This additional movement allows for relative release of tension in muscles between repetitions.',1,'2021-06-27 13:39:40',NULL,NULL,0),(295,303,'When elbows are fully flexed, they can travel slightly forward, allowing forearms to be no more than vertical. This additional movement allows for relative release of tension in muscles between repetitions.',1,'2021-06-27 13:39:40',NULL,NULL,0),(296,304,'The biceps may be exercised alternating (as described), simultaneous, or in simultaneous-alternating fashion. When elbows are fully flexed, they can travel forward slightly allowing forearms to be no more than vertical. This additional movement allows for relative release of tension in muscles between repetitions.',1,'2021-06-27 13:39:40',NULL,NULL,0),(297,306,'Seat should be adjusted to allow arm pit to rest near top of pad. Back of upper arm should remain on pad. If machine has secondary lever, elbows can be positioned further away from primary fulcrum.',1,'2021-06-27 13:39:40',NULL,NULL,0),(298,305,'The biceps may be exercised alternating or simultaneous. If machine does not provide support for back of arm, keep elbows from traveling back, particularly during initial flexion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(299,307,'Feet can be staggered and bent slightly (if needed) to allow\narm pit to rest near top of pad. Back of upper arm should remain\non pad. At bottom position, weight stack in use should not make\ncontact with remaining weight stack.',1,'2021-06-27 13:39:40',NULL,NULL,0),(300,308,'Seat should be adjusted to allow arm pit to rest near top of pad. Back of upper arm should remain on pad.',1,'2021-06-27 13:39:40',NULL,NULL,0),(301,309,'Seat should be adjusted to allow arm pit to rest near top of pad. Back of upper arm should remain on pad. At bottom position, weight stack in use should not make contact with remaining weight stack.',1,'2021-06-27 13:39:40',NULL,NULL,0),(302,310,'Wrist Extensors can also be stretched in this position by flexing forward wrist so hands bend toward side of forward arm. The arm can be crossed to stretch opposite wrist.',1,'2021-06-27 13:39:40',NULL,NULL,0),(303,311,'Seat should be adjusted to allow arm pit to rest near top of pad. Back of upper arm should remain on pad. If machine has secondary lever, elbows can be positioned further away from primary fulcrum.',1,'2021-06-27 13:39:40',NULL,NULL,0),(304,312,'None.',1,'2021-06-27 13:39:40',NULL,NULL,0),(305,313,'Some units, as one illustrated above, may be placed on sturdy table top or on floor. Keep forearm flat on padded platform throughout exercise.',1,'2021-06-27 13:39:40',NULL,NULL,0),(306,314,'Hand may be placed under wrist (as demonstrated) to offer stability and to maintain horizontal orientation of forearm.',1,'2021-06-27 13:39:40',NULL,NULL,0),(307,315,'Keep elbows approximately wrist height to maintain resistance through full range of motion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(308,316,'If half loaded dumbbell is not available, one of two substitutes can be used.',1,'2021-06-27 13:39:40',NULL,NULL,0),(309,317,'None.',1,'2021-06-27 13:39:40',NULL,NULL,0),(310,319,'Also see muscles for finger articulations and thumb articulations.',1,'2021-06-27 13:39:40',NULL,NULL,0),(311,318,'Keep elbow approximately wrist height to maintain resistance through full range of motion. Hand may be placed under wrist to offer stability and to maintain horizontal orientation of forearm.',1,'2021-06-27 13:39:40',NULL,NULL,0),(312,320,'Also see muscles for finger articulations and thumb articulations. See lever grip up close.',1,'2021-06-27 13:39:40',NULL,NULL,0),(313,321,'Keep forearms horizontal, flat on arm pads throughout exercise. See wrist curl up close.',1,'2021-06-27 13:39:40',NULL,NULL,0),(314,322,'None.',1,'2021-06-27 13:39:40',NULL,NULL,0),(315,323,'See sled grip up close. Also see muscles for finger articulations and thumb articulations.',1,'2021-06-27 13:39:40',NULL,NULL,0),(316,324,'Also see muscles for finger articulations and thumb articulations.',1,'2021-06-27 13:39:40',NULL,NULL,0),(317,325,'Also see muscles for finger articulations and thumb articulations.',1,'2021-06-27 13:39:40',NULL,NULL,0),(318,326,'Also see Lever Roller Wrist Extension.',1,'2021-06-27 13:39:40',NULL,NULL,0),(319,327,'None',1,'2021-06-27 13:39:40',NULL,NULL,0),(320,329,'Keep arms straight.',1,'2021-06-27 13:39:40',NULL,NULL,0),(321,330,'None',1,'2021-06-27 13:39:40',NULL,NULL,0),(322,331,'Keep elbows straight.',1,'2021-06-27 13:39:40',NULL,NULL,0),(323,332,'Exercise is performed on specialized piece of equipment which includes knobs at each end of wrist roller.',1,'2021-06-27 13:39:40',NULL,NULL,0),(324,328,'See exercise on alternative machine. Also see muscles for finger articulations and thumb articulations.',1,'2021-06-27 13:39:40',NULL,NULL,0),(325,333,'If half loaded dumbbell is not available, one of two substitutes can be used.',1,'2021-06-27 13:39:40',NULL,NULL,0),(326,334,'Do not allow elbows to rise.',1,'2021-06-27 13:39:40',NULL,NULL,0),(327,335,'Keep elbow approximately wrist height to maintain resistance through full range of motion. Hand may be placed under wrist to offer stability and to maintain horizontal orientation of forearm.',1,'2021-06-27 13:39:40',NULL,NULL,0),(328,336,'None.',1,'2021-06-27 13:39:40',NULL,NULL,0),(329,337,'Do not allow elbow to rise. Hand may be placed under wrist (as demonstrated) to offer stability and to maintain horizontal orientation of forearm.',1,'2021-06-27 13:39:40',NULL,NULL,0),(330,338,'Keep elbows approximately wrist height to maintain resistance through full range of motion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(331,340,'None.',1,'2021-06-27 13:39:40',NULL,NULL,0),(332,339,'Some units, as one illustrated above, may be placed on sturdy table top or on floor. Keep forearm flat on padded platform throughout exercise.',1,'2021-06-27 13:39:40',NULL,NULL,0),(333,341,'Keep forearms horizontal, flat on arm pads throughout exercise. See reverse wrist curl up close.',1,'2021-06-27 13:39:40',NULL,NULL,0),(334,342,'Exercise is performed on specialized piece of equipment which includes knobs at each end of wrist roller.',1,'2021-06-27 13:39:40',NULL,NULL,0),(335,343,'Elbow may be extended first, followed by pulling palm toward forearm. Brachioradialis can also be stretched by positioining downward or back (ie: external rotation of shoulder)',1,'2021-06-27 13:39:40',NULL,NULL,0),(336,344,'Keep elbows straight.',1,'2021-06-27 13:39:40',NULL,NULL,0),(337,346,'If unilaterally loaded dumbbell, or \"half dumbbell\" is not available, grasp conventional dumbbell to one side of handle with thumb against inside surface.',1,'2021-06-27 13:39:40',NULL,NULL,0),(338,347,'Depending on participant\'s range of motion and machine\'s design, handles may need to be prerotated so resistance is present throughout movement, particularly initial phase of rotation. See forearm pronation up close.',1,'2021-06-27 13:39:40',NULL,NULL,0),(339,345,'Pad or firm pillow (ball pictured) may be placed between hip and arm. Elevation of elbow allows resistance during initial range of motion. This exercise can also be performed seated by corner of table higher than shoulder height (See Dumbbell Seated Pronation. If unilaterally loaded dumbbell, or \"half dumbbell\" is not available, grasp conventional dumbbell to one side of handle with thumb against inside surface. Also see Dumbbell Lying Pronation with arm down.',1,'2021-06-27 13:39:40',NULL,NULL,0),(340,348,'Depending on participant\'s range of motion and machine\'s design, handle may need to be prerotated so resistance is present throughout movement, particularly initial phase of rotation.',1,'2021-06-27 13:39:40',NULL,NULL,0),(341,349,'Bench can be flat or slightly incline (0-30 degrees) so resistance occurs during initial range of motion. If unilaterally loaded dumbbell, or \"half dumbbell\" is not available, grasp conventional dumbbell to one side of handle with pinkie against inside surface. Also see conventiontal Dumbbell Lying Pronation.',1,'2021-06-27 13:39:40',NULL,NULL,0),(342,350,'Depending on participant\'s range of motion and machine\'s design, handle may need to be prerotated so resistance is present throughout movement, particularly initial phase of rotation.',1,'2021-06-27 13:39:40',NULL,NULL,0),(343,351,'Bench can be flat or slightly incline (0-30 degrees) so resistance occurs during final range of motion. If unilaterally loaded dumbbell, or \"half dumbbell\" is not available, grasp conventional dumbbell to one side of handle with thumb against inside surface. Also see conventional Dumbbell Lying Supination.',1,'2021-06-27 13:39:40',NULL,NULL,0),(344,352,'Pad or firm pillow may be placed between hip and arm. Elevation of elbow allows resistance during final range of motion. If unilaterally loaded dumbbell, or \"half dumbbell\" is not available, grasp conventional dumbbell to one side of handle with pinkie against inside surface. Also see Dumbbell Lying Supination with arm down. This exercise can also be performed seated by corner of table higher than shoulder height (See Seated Supination).',1,'2021-06-27 13:39:40',NULL,NULL,0),(345,353,'If unilaterally loaded dumbbell, or \"half dumbbell\" is not available, grasp conventional dumbbell to one side of handle with pinkie against inside surface.',1,'2021-06-27 13:39:40',NULL,NULL,0),(346,354,'Depending on participant\'s range of motion and machine\'s design, handles may need to be prerotated so resistance is present throughout movement, particularly initial phase of rotation. See forearm supination up close.',1,'2021-06-27 13:39:40',NULL,NULL,0),(347,355,'Torso may be kept horizontal for strict execution. Knees are bent in effort to keep low back straight (See Hamstring Inflexibility). If low back becomes rounded due to tight hamstrings, either try bending knees more or don\'t position torso as low. Either fix may compromise involvement of Latissimus Dorsi since it forces more shoulder transverse extension and less shoulder extension range of motion. If low back is rounded due to poor form, deadlift weight to standing position and lower torso into horizontal position with knees bent and back straight. A shoulder width or underhand grip can increase lat involvement by emphasizing shoulder extension over transverse extension.',1,'2021-06-27 13:39:40',NULL,NULL,0),(348,356,'Begin with light weight and add additional weight gradually to allow lower back adequate adaptation. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch. Full range of motion through lower back will vary from person to person. See Cable Seated Row Question. Also see Cable Straight Back Incline Row and Dangerous Exercise Essay.',1,'2021-06-27 13:39:40',NULL,NULL,0),(349,357,'Bench should be high enough to allow shoulders to stretch forward without barbell hitting floor.',1,'2021-06-27 13:39:40',NULL,NULL,0),(350,358,'Also see Cable Incline Row.',1,'2021-06-27 13:39:40',NULL,NULL,0),(351,359,'Torso may be kept horizontal for strict execution. Knees are bent in effort to keep low back straight (See Hamstring Inflexibility). If low back becomes rounded due to tight hamstrings, either try bending knees more or don\'t position torso as low. Either fix may compromise involvement of Latissimus Dorsi since it forces more shoulder transverse extension and less shoulder extension range of motion. If low back is rounded due to poor form, deadlift weight to standing position and lower torso into horizontal position with knees bent and back straight. A shoulder width or underhand grip can increase lat involvement by emphasizing shoulder extension over transverse extension. A wide overhand grip involves overall back musculature while slightly emphasizing Rear Delt, Infraspinatus and Teres Minor involvement. Also known as Pendlay Row.',1,'2021-06-27 13:39:40',NULL,NULL,0),(352,362,'Pulleys should not be too far apart, as they are on standard cable crossover machines. Stirrups on pulleys should be high enough to allow shoulders to stretch forward when arms extend. Pull shoulder blades together when completing pull. Other rowing exercises should be considered if resistance required begins to exceed upper body weight since back will begin to raise up off of bench.',1,'2021-06-27 13:39:40',NULL,NULL,0),(353,360,'Torso may be kept horizontal for strict execution. Knees are bent in effort to keep low back straight (See Hamstring Inflexibility). If low back becomes rounded due to tight hamstrings, either try bending knees more or don\'t position torso as low. Either fix may compromise involvement of Latissimus Dorsi since it forces more shoulder transverse extension and less shoulder extension range of motion. If low back is rounded due to poor form, deadlift weight to standing position and lower torso into horizontal position with knees bent and back straight. A shoulder width or underhand grip can increase lat involvement by emphasizing shoulder extension over transverse extension.',1,'2021-06-27 13:39:40',NULL,NULL,0),(354,361,'Allow scapula to articulate, but do not rotate torso.',1,'2021-06-27 13:39:40',NULL,NULL,0),(355,363,'Supporting hand can also be placed on nearby bar, available on some pulley machines. Hamstrings and Gluteus Maximus stabilize near top of movement on forward leg.',1,'2021-06-27 13:39:40',NULL,NULL,0),(356,364,'It is optional to bend lower back forward during stretch and pull it upright during contraction. If low back is kept still, Erector Spinae acts as synergist muscle. Also see Cable One Arm Twisting Seated Row.',1,'2021-06-27 13:39:40',NULL,NULL,0),(357,365,'Also see Cable One Arm Seated Row.',1,'2021-06-27 13:39:40',NULL,NULL,0),(358,366,'It is optional to bend lower back forward during stretch and pull it upright during contraction. If torso does not bend forward, Erector Spinae acts as stabilizer muscle. See straight back form. Quadratus Lumborum and Obliques are involved in spinal rotation if waist is rotated more than demonstrated. Hamstrings and Gluteus Maximus are no longer stabilizers if seated on bench with upper leg support.',1,'2021-06-27 13:39:40',NULL,NULL,0),(359,367,'It is optional to bend lower back forward during stretch and pull it upright during contraction. If low back is kept still, Erector Spinae acts as synergist muscle. Also see exercise on bench and adjustable height pulley.',1,'2021-06-27 13:39:40',NULL,NULL,0),(360,368,'If two high pulleys are available use opposite pulley as exercised arm. If pulley is far enough away, it is optional to bend lower back forward during stretch and pull it upright during contraction. See Cable One Arm Seated High Row. Hamstrings and Gluteus Maximus become stabilizers if seated on bench with feet propped forward with no upper leg support.',1,'2021-06-27 13:39:40',NULL,NULL,0),(361,369,'Rotation of torso as shown is optional. Quadratus Lumborum and Obliques act as stabilizers if waist is not rotated as demonstrated. Hamstrings and Gluteus Maximus act as stabilizers if seat is not available and legs are propped forward.',1,'2021-06-27 13:39:40',NULL,NULL,0),(362,370,'Begin with light weight and add additional weight gradually to allow lower back adequate adaptation. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch. Full range of motion through lower back will vary from person to person. See Cable Seated Row Question. Also see Cable Straight Back Seated Row and Dangerous Exercise Essay.',1,'2021-06-27 13:39:40',NULL,NULL,0),(363,371,'If two high pulleys are available, consider using opposite pulley as arm exercised. If pulley is far away enough, it is optional to bend lower back forward during stretch and pull it upright during contraction. See Cable One Arm Seated High Row. Quadratus Lumborum and Obliques are involved in spinal rotation if waist rotates. Hamstrings and Gluteus Maximus become stabilizers, if seated on bench with feet propped forward with no upper leg support.',1,'2021-06-27 13:39:40',NULL,NULL,0),(364,372,'Begin with light weight and additional weight gradually to allow lower back adequate adaptation. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch. Full range of motion through lower back will vary from person to person. See Cable Seated Row Question. Also see Cable Wide Grip Straight Back Seated Row and Dangerous Exercise Essay.',1,'2021-06-27 13:39:40',NULL,NULL,0),(365,373,'Also see Cable Seated Row.',1,'2021-06-27 13:39:40',NULL,NULL,0),(366,374,'Also see Cable Wide Grip Seated Row.',1,'2021-06-27 13:39:40',NULL,NULL,0),(367,375,'Stirrup handle should be behind supporting bar. Few pulley units have vertical support bar (for supporting hand) far enough back from pulley to allow full range of motion and adequate pulley rotation to allow it to be aligned with line of pull. If pulley unit does not allow for this configuration, consider placing sturdy prop (for supporting hand) in front of pulley, far back enough to allow full range of motion. Also see Cable Standing Low Row.',1,'2021-06-27 13:39:40',NULL,NULL,0),(368,376,'Allow scapula to articulate but do not rotate torso in effort to throw weight up. Torso should be close to horizontal. Positioning supporting knee and/or arm slightly forward or back will allow for proper levelling of torso. Torso may be positioned lower to allow for heavier dumbbell to make contact with floor, if desired.',1,'2021-06-27 13:39:40',NULL,NULL,0),(369,377,'Also see Cable Standing Row with medium height pulley.',1,'2021-06-27 13:39:40',NULL,NULL,0),(370,378,'Bench should be high enough to allow shoulders to stretch forward without dumbbells hitting floor.',1,'2021-06-27 13:39:40',NULL,NULL,0),(371,379,'In standing position, both spinal rotation and hip rotation contribute to body\'s rotation. Because rear leg is only supported by forefoot, hip of forward leg is utilized (hip internal rotation / transverse adduction) much greater than hip of rear leg since forward leg offers more secured base of support.',1,'2021-06-27 13:39:40',NULL,NULL,0),(372,380,'Torso should be kept horizontal if flexibility allows. Knees are bent in effort to keep low back straight (See Hamstring Inflexibility). If low back becomes rounded due to tight hamstrings, try bending knees more. Placing weight plates on higher bar lightens resistance at top where strength lessens, without compromising range of motion. See Gravity Vectors to understand how this positioning, altering direction of load, affects exercise resistance (resistance curve). Also see wide grip form.',1,'2021-06-27 13:39:40',NULL,NULL,0),(373,381,'Torso should be kept as close to horizontal while allowing for full arm extension. Knees are bent in effort to keep low back straight (See Hamstring Inflexibility). If low back becomes rounded due to tight hamstrings, try bending knees more. Placing weight plates on higher bar lightens resistance at top where strength lessens, without compromising range of motion. See Gravity Vectors to understand how this positioning, altering direction of load, affects exercise resistance throughout movement (resistance curve). Also see Lever Bent-over Row.',1,'2021-06-27 13:39:40',NULL,NULL,0),(374,382,'Exact stance from bar will depend upon height of fulcrum and length of lever. Torso may be kept horizontal for strict execution. Knees are bent in effort to keep low back straight (See Hamstring Inflexibility). If low back becomes rounded due to tight hamstrings, either try bending knees more or don\'t position torso as low. Either fix may compromise involvement of Latissimus Dorsi, since it forces more shoulder transverse extension and less shoulder extension range of motion. If low back is rounded due to poor form, grasp bar in standing position and lower torso into horizontal position with knees bent and back straight. A shoulder width or underhand grip can increase lat involvement by emphasizing shoulder extension over transverse extension. A wide overhand grip involves overall back musculature while slightly emphasizing Rear Delt, Infraspinatus and Teres Minor involvement.',1,'2021-06-27 13:39:40',NULL,NULL,0),(375,383,'Near top arch upper back and pull shoulders back as shown. To maximize back involvement, position body on pad or grip so wrists follow elbows. Some Incline Row apparatuses allow feet to be placed on floor, particularly if foot platform cannot be adjusted to accommodate height.',1,'2021-06-27 13:39:40',NULL,NULL,0),(376,385,'Near top arch upper back and pull shoulders back as shown. To maximize back involvement, position body on pad or grip so wrists follow elbows.',1,'2021-06-27 13:39:40',NULL,NULL,0),(377,384,'Allow scapula to articulate but do not rotate torso in effort to throw weight up. Lever base shown attaches to standard Olympic barbell. Improvising by placing barbell in corner may cause excessive wear on floor and floor board, or wall.',1,'2021-06-27 13:39:40',NULL,NULL,0),(378,386,'Unique apparatus designed and built by Tracey Cheuvront.',1,'2021-06-27 13:39:40',NULL,NULL,0),(379,387,'Seat or grip should be adjusted to allow wrists to follow elbows. When completing pull, chest slightly and pull shoulder blades together while keeping lower chest on pad. Let shoulders roll forward when arms extend.',1,'2021-06-27 13:39:40',NULL,NULL,0),(380,389,'None.',1,'2021-06-27 13:39:40',NULL,NULL,0),(381,388,'None.',1,'2021-06-27 13:39:40',NULL,NULL,0),(382,390,'When completing pull, lift chest slightly and pull shoulder blades together while keeping lower chest on pad. Let shoulders roll forward when arms extend.',1,'2021-06-27 13:39:40',NULL,NULL,0),(383,391,'Seat or grip should be adjusted to allow wrists to follow elbows. When completing pull, lift chest slightly and pull shoulder blades together while keeping lower chest on pad. Let shoulders roll forward when arms extend.',1,'2021-06-27 13:39:40',NULL,NULL,0),(384,392,'Chest pad should be adjusted to allow shoulders to stretch forward. The seat or grip should be adjusted to allow wrists to follow elbows. Also see Cybex High Row.',1,'2021-06-27 13:39:40',NULL,NULL,0),(385,393,'Exercise is performed on apparatus with no chest pad, in contrast to standard lever seated row machine. This exercise is more similar to Cable Straight Back Seated Row. Exercise may also be performed with greater low back involvement; see Lever Seated Row (no chest pad).',1,'2021-06-27 13:39:40',NULL,NULL,0),(386,394,'Seat or grip should be adjusted to allow wrists to follow elbows. When completing pull, lift chest slightly and pull shoulder blades together while keeping lower chest on pad. Let shoulders roll forward when arms extend. See exercise on alternative machine.',1,'2021-06-27 13:39:40',NULL,NULL,0),(387,395,'Exercise is performed on apparatus with no chest pad, in contrast to standard lever seated row machine. This exercise is more similar to Cable Seated Row. Begin with light weight and add additional weight gradually to allow lower back adequate adaptation. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch. Full range of motion through lower back will vary from person to person. For even greater hip and low back articulation, hips may be slid back further with knees straighter. See Cable Seated Row Question and Dangerous Exercise Essay. Also see Lever Straight Back Seated Row (no chest pad).',1,'2021-06-27 13:39:40',NULL,NULL,0),(388,396,'Closer grip increases lat involvement by emphasizing shoulder extension over transverse extension. Keep low back straight. Lighten load if torso raises beyond 45 degrees in order to complete repetition. See Gravity Vectors to understand how load would be decreased by positioning torso too high. Also see Lever T-Bar Row.',1,'2021-06-27 13:39:40',NULL,NULL,0),(389,398,'Position torso as low as possible, allowing for full arm extension. Keep low back straight. Lighten load if torso raises beyond 45 degrees in order to complete repetition. See Gravity Vectors to understand how load would be decreased by positioning torso too high. Also see close grip form.',1,'2021-06-27 13:39:40',NULL,NULL,0),(390,399,'Seat or grip should be adjusted to allow wrists to follow elbows.',1,'2021-06-27 13:39:40',NULL,NULL,0),(391,401,'Seat should be adjusted to allow for full range of motion. Also see Lever Seated Hammer High Row.',1,'2021-06-27 13:39:40',NULL,NULL,0),(392,402,'Chest pad should be adjusted to allow shoulders to stretch forward. The seat or grip should be adjusted to allow wrists to follow elbows. When completing pull, lift chest slightly and pull shoulder blades together while keeping lower chest on pad. Let shoulders roll forward when arms extend.',1,'2021-06-27 13:39:40',NULL,NULL,0),(393,403,'Chest pad should be adjusted to allow shoulders to stretch forward. The seat or grip should be adjusted to allow wrists to follow elbows.',1,'2021-06-27 13:39:40',NULL,NULL,0),(394,405,'Seat or grip should be adjusted to allow wrists to follow elbows. When completing pull, lift chest slightly and pull shoulder blades together while keeping lower chest on pad. Let shoulders roll forward when arms extend. Also see front view.',1,'2021-06-27 13:39:40',NULL,NULL,0),(395,406,'Chest pad should be adjusted to allow shoulders to stretch forward. The seat or grip should be adjusted to allow wrists to follow elbows. When completing pull, lift chest slightly and pull shoulder blades together while keeping lower chest on pad. Let shoulders roll forward when arms extend.',1,'2021-06-27 13:39:40',NULL,NULL,0),(396,407,'Seat or grip should be adjusted to allow wrists to follow elbows.',1,'2021-06-27 13:39:40',NULL,NULL,0),(397,408,'Seat or grip should be adjusted to allow wrists to follow elbows.',1,'2021-06-27 13:39:40',NULL,NULL,0),(398,411,'Exercise is performed on apparatus with no chest pad, in contrast to standard lever seated row machine. This exercise is more similar to Cable Straight Back Seated Row. Exercise may also be performed with greater low back involvement; see Lever Seated Row (no chest pad).',1,'2021-06-27 13:39:40',NULL,NULL,0),(399,410,'Exercise is performed on apparatus with no chest pad, in contrast to standard lever seated row machine. This exercise is more similar to Cable Seated Row. Begin with light weight and add additional weight gradually to allow lower back adequate adaptation. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch. Full range of motion through lower back will vary from person to person. For even greater hip and low back articulation, hips may be slid back further with knees straighter. See Cable Seated Row Question and Dangerous Exercise Essay. Also see Lever Straight Back Seated Row (no chest pad).',1,'2021-06-27 13:39:40',NULL,NULL,0),(400,413,'Torso may be kept horizontal for strict execution. Platform (as shown) is only needed if smith machine does not allow bar to be lowered to lowest position. Knees are bent in effort to keep low back straight (See Hamstring Inflexibility ). If low back becomes rounded due to tight hamstrings, either knees should be bent more or torso may not be positioned as low. Either fix may compromise involvement of Latissimus Dorsi since it forces more shoulder transverse extension and less shoulder extension range of motion. If low back is rounded due to poor form, deadlift weight to standing position and lower torso into horizontal position with knees bent and back straight. A shoulder width or underhand grip can increase lat involvement by emphasizing shoulder extension over transverse extension.',1,'2021-06-27 13:39:40',NULL,NULL,0),(401,412,'Fixed bar should be just high enough to allow arm to fully extend. Placing back of heels on elevated surface is optional. This exercise is typically performed without added resistance, although additional weight can be placed on belly or pelvis. Partner can add and remove weight, and keep weight from sliding off belly. Resistance can be reduced by raising bar and positioning heels on floor. See Gravity Vectors for greater understanding of body angle influences resistance. Also known as Body Row or Supine Row.',1,'2021-06-27 13:39:40',NULL,NULL,0),(402,414,'Fixed bar should be just high enough to allow arm to fully extend. See Gravity Vectors for greater understanding of body angle influences resistance. Also known as Body Row or Supine Row.',1,'2021-06-27 13:39:40',NULL,NULL,0),(403,415,'Fixed bar should be just high enough to allow arm to fully extend. Placing back of heels on elevated surface is optional. This exercise is typically performed without added resistance, although a weight vest can be worn or additional weight can be placed on belly or pelvis. Partner can add and remove weight, and keep weight from sliding off belly. Resistance can be further reduced by performing movement from higher bar and/or positioning heels on floor (see Inverted Row on high bar). See Gravity Vectors for greater understanding of how body angle influences resistance. Also known as Weighted Body Row or Weighted Supine Row.',1,'2021-06-27 13:39:40',NULL,NULL,0),(404,417,'Fixed bar should be just high enough to allow arm to fully extend. See Gravity Vectors for greater understanding of how body angle influences resistance. Also known as Body Row on Hips or Supine Row on Hips.',1,'2021-06-27 13:39:40',NULL,NULL,0),(405,419,'Bar height can be adjusted to vary resistance. See Gravity Vectors for greater understanding of how body angle influences resistance. Also known as Body Row or Supine Row.',1,'2021-06-27 13:39:40',NULL,NULL,0),(406,420,'At higher angles, feet can be placed flat on floor. When angled further back, only heels may contact floor with forefeet raising upward. Dismounting can be achieved by walking backward until body is upright.',1,'2021-06-27 13:39:40',NULL,NULL,0),(407,421,'None',1,'2021-06-27 13:39:40',NULL,NULL,0),(408,422,'Fixed bar should be just high enough to allow arm to fully extend. See Gravity Vectors for greater understanding of body angle influences resistance.',1,'2021-06-27 13:39:40',NULL,NULL,0),(409,424,'To intensify stretch, look up or to one side.',1,'2021-06-27 13:39:40',NULL,NULL,0),(410,423,'Handles should be positioned to allow for full arm extension, no lower. Instead of mounting from a seated or lying position, position can be assumed by stepping back with handles grasped in each hand until arms are straight forward. While keeping arms straight and shoulders back, step forward so body reclines back and under suspension handles. Dismounting can be achieved by walking backward until body is upright, minimizing contact with ground. See Gravity Vector for greater understanding of how body angle influences resistance.',1,'2021-06-27 13:39:40',NULL,NULL,0),(411,425,'This exercise can be performed on TRXⓇ style suspension trainer or adjustable length gymnastics rings. Some suspension trainer brands allow independent use of only one handle, whereas, more popular brands require either anchoring unused handle within stirrup of gripped handle or grasping both handles with one hand.',1,'2021-06-27 13:39:40',NULL,NULL,0),(412,426,'Lower body extending off of bench acts as counter balance to resistance and keeps upper back fixed on bench. Avoid hips from raising up significantly. Actual range of motion is dependent upon individual shoulder flexibility. Keep elbows fixed at small bend throughout exercise. Either straight barbell or EZ barbell can be used. Also see Barbell Bent Arm Pullover.',1,'2021-06-27 13:39:40',NULL,NULL,0),(413,427,'See suggested mount and dismount. Some assisted machines require you to stand on bar. If no assisted machine is used, assist as needed by allowing training partner to pull feet up behind legs or push self up with legs on elevation. Range of motion will decrease if grip is too wide.',1,'2021-06-27 13:39:40',NULL,NULL,0),(414,428,'See suggested mount and dismount. Some assisted machines require you to kneel on platform instead of standing on bar. If no assisted machine is used, assist as needed by allowing training partner to pull feet up behind legs or push self up with legs on elevation.',1,'2021-06-27 13:39:40',NULL,NULL,0),(415,429,'See suggested mount and dismount. Some assisted machines require you to stand on bar. If no assisted machine is used, assist as needed by allowing training partner to pull feet up behind legs or push self up with legs on elevation. Range of motion will decrease if grip is too wide.',1,'2021-06-27 13:39:40',NULL,NULL,0),(416,430,'Some assisted machines require you to kneel on platform instead of standing on bar. If no assisted machine is used, assist as needed by allowing training partner to pull feet up behind legs or push self up with legs on elevation. Range of motion will decrease if grip is too wide.',1,'2021-06-27 13:39:40',NULL,NULL,0),(417,431,'See suggested mount and dismount. Some assisted machines require you to stand on platform or bar. If no assisted machine is used, assist as needed by allowing training partner to pull feet up behind legs or push self up with legs on elevation. Also see self-assisted technique without machine.',1,'2021-06-27 13:39:40',NULL,NULL,0),(418,432,'Muscles listed as Stabilizers become Synergists if spinal lateral flexion occurs during exercise.',1,'2021-06-27 13:39:40',NULL,NULL,0),(419,433,'Keep elbows bent approximately 90° throughout exercise. Keep hips from raising up significantly. Either straight barbell or EZ barbell can be used. Also see Barbell Pullover.',1,'2021-06-27 13:39:40',NULL,NULL,0),(420,434,'Exercise can be performed with V-Bar or Multi-exercise Bar.',1,'2021-06-27 13:39:40',NULL,NULL,0),(421,435,'See suggested mount and dismount. Some assisted machines require standing on bar. If no assisted machine is used, assist as needed by allowing training partner to pull feet up behind legs or push self up with legs on elevation.',1,'2021-06-27 13:39:40',NULL,NULL,0),(422,436,'Stirrups are attached to split pulley.',1,'2021-06-27 13:39:40',NULL,NULL,0),(423,437,'Muscles listed as Stabilizers become Synergists if spinal lateral flexion occurs during exercise.',1,'2021-06-27 13:39:40',NULL,NULL,0),(424,438,'Range of motion will be compromised if grip is too wide.',1,'2021-06-27 13:39:40',NULL,NULL,0),(425,440,'Keep hips and torso in same position throughout movement.',1,'2021-06-27 13:39:40',NULL,NULL,0),(426,439,'Stirrups are attached to split pulley.',1,'2021-06-27 13:39:40',NULL,NULL,0),(427,441,'Parallel Grip Cable Attachment is shorter than Pro Lat Bar, yet longer than Close Grip Cable Attachments.',1,'2021-06-27 13:39:40',NULL,NULL,0),(428,442,'Stirrups are attached to split pulley.',1,'2021-06-27 13:39:40',NULL,NULL,0),(429,443,'Lower body extending off of bench acts as counter balance to resistance and keeps upper back fixed on bench. Avoid hips from raising up significantly. Actual range of motion is dependent upon individual shoulder flexibility. Keep elbows fixed at small bend throughout exercise.',1,'2021-06-27 13:39:40',NULL,NULL,0),(430,444,'Range of motion will be compromised if grip is too wide.',1,'2021-06-27 13:39:40',NULL,NULL,0),(431,445,'Stirrups are attached to split pulley.',1,'2021-06-27 13:39:40',NULL,NULL,0),(432,446,'Fix elbows approximately 30° throughout exercise. Also known as Straight Arm Pulldown.',1,'2021-06-27 13:39:40',NULL,NULL,0),(433,447,'If weight bottoms out at bottom of movement, attach cable on chain links nearer ends of dip belt.',1,'2021-06-27 13:39:40',NULL,NULL,0),(434,448,'If weight bottoms out at bottom, attach cable on chain links nearer ends of dip belt.',1,'2021-06-27 13:39:40',NULL,NULL,0),(435,450,'If cable attachment is too high, grasp attachment first, then sit down. Fix elbows approximately 30° throughout exercise. Also known as Cable Seated Straight Arm Pulldown.',1,'2021-06-27 13:39:40',NULL,NULL,0),(436,449,'This particular apparatus could arguably be referred to as lever machine since dip belt attaches to lever arm, although relatively free movement between lever and dip belt offers qualities similar to cable machine. If weight bottoms out at bottom of movement, attach cable on chain links nearer ends of dip belt.',1,'2021-06-27 13:39:40',NULL,NULL,0),(437,451,'If weight bottoms out at bottom of motion, attach cable on chain links nearer ends of dip belt. Range of motion will be compromised if grip is too wide.',1,'2021-06-27 13:39:40',NULL,NULL,0),(438,452,'If weight bottoms out at bottom of movement, attach cable on chain links nearer ends of dip belt. Range of motion will be compromised if grip is too wide.',1,'2021-06-27 13:39:40',NULL,NULL,0),(439,453,'Range of motion will be compromised if grip is too wide.',1,'2021-06-27 13:39:40',NULL,NULL,0),(440,454,'Erector Spinae can become slightly engaged when torso arches back.',1,'2021-06-27 13:39:40',NULL,NULL,0),(441,455,'In standing position, both spinal rotation and hip rotation contribute to body\'s rotation. Because rear leg is only supported by forefoot, hip of forward leg is utilized (hip internal rotation / transverse adduction) much greater than hip of rear leg since forward leg offers more secured base of support.',1,'2021-06-27 13:39:40',NULL,NULL,0),(442,456,'None',1,'2021-06-27 13:39:40',NULL,NULL,0),(443,457,'Range of motion will be compromised if grip is too wide.',1,'2021-06-27 13:39:40',NULL,NULL,0),(444,458,'None',1,'2021-06-27 13:39:40',NULL,NULL,0),(445,459,'See pad kick down on Hammer Machine. Also see movement on alternative machine.',1,'2021-06-27 13:39:40',NULL,NULL,0),(446,460,'Range of motion will be compromised if grip is too wide.',1,'2021-06-27 13:39:40',NULL,NULL,0),(447,462,'Actual range of motion is dependent upon individual shoulder flexibility.',1,'2021-06-27 13:39:40',NULL,NULL,0),(448,463,'Erector Spinae can become slightly engaged when torso arches back.',1,'2021-06-27 13:39:40',NULL,NULL,0),(449,464,'None',1,'2021-06-27 13:39:40',NULL,NULL,0),(450,465,'Platform should be adjusted so shoulder joint and girdle are approximate height as lever fulcrum. Also See Bent-over Fly on Iron Cross\n\n\nMachine.',1,'2021-06-27 13:39:40',NULL,NULL,0),(451,467,'See pad kick down on Hammer Machine. Also see exercise on alternative machine.',1,'2021-06-27 13:39:40',NULL,NULL,0),(452,468,'When finished, push foot lever before releasing arm from lever. Release foot lever after releasing arm from lever. Actual range of motion is dependent upon individual shoulder flexibility.',1,'2021-06-27 13:39:40',NULL,NULL,0),(453,470,'Range of motion will be compromised if grip is too wide. See Lever Pulldown performed on alternative apparatus. Also see exercise with parallel grip.',1,'2021-06-27 13:39:40',NULL,NULL,0),(454,471,'Also see Lever Pulldown.',1,'2021-06-27 13:39:40',NULL,NULL,0),(455,473,'Added weight can be placed on dip belt or dumbbell can be placed between ankles.',1,'2021-06-27 13:39:40',NULL,NULL,0),(456,474,'Added weight can be placed on dip belt or dumbbell can be placed between ankles.',1,'2021-06-27 13:39:40',NULL,NULL,0),(457,476,'Added weight can be placed on dip belt or dumbbell can be placed between ankles as shown. Range of motion will be compromised if grip is too wide.',1,'2021-06-27 13:39:40',NULL,NULL,0),(458,475,'See pad kick down on Hammer Machine.',1,'2021-06-27 13:39:40',NULL,NULL,0),(459,477,'Free foot can be placed on top of foot in band for safety in case band slips from foot. Range of motion will be compromised if grip is too wide.',1,'2021-06-27 13:39:40',NULL,NULL,0),(460,478,'Added weight can be placed on dip belt or dumbbell can be placed between ankles. Also see Pull-up without added weight. Range of motion will be compromised if grip is too wide.',1,'2021-06-27 13:39:40',NULL,NULL,0),(461,479,'Free foot can be placed inside of band (as shown) or on top of foot in band for safety in case band slips from foot. At conclusion of set, step down with free foot at bottom of exercises. Dismount band by grasping each side of exercise band, stretch exercise band down, and step out. Continuing to hold on to each side of band while allowing band to contract to normal length.',1,'2021-06-27 13:39:40',NULL,NULL,0),(462,480,'Added weight can be placed on dip belt (as shown) or dumbbell can be placed between ankles. Range of motion will be compromised if grip is too wide.',1,'2021-06-27 13:39:40',NULL,NULL,0),(463,481,'Free foot can be placed inside of band (as shown) or on top of foot in band for safety in case band slips from foot. At conclusion of set, step down with free foot at bottom of exercises. Dismount band by grasping each side of exercise band, stretch exercise band down, and step out. Continuing to hold on to each side of band while allowing band to contract to normal length.',1,'2021-06-27 13:39:40',NULL,NULL,0),(464,483,'Added weight can be placed on dip belt or dumbbell can be placed between ankles. Special angled pull-up bar assembly is shown. Also see Wide Grip Pull-up and Underhand Chin-up.',1,'2021-06-27 13:39:40',NULL,NULL,0),(465,484,'Special angled pull-up bar assembly is shown. Free foot can be placed on top of foot in band for safety in case band slips from foot.',1,'2021-06-27 13:39:40',NULL,NULL,0),(466,485,'Easier',1,'2021-06-27 13:39:40',NULL,NULL,0),(467,486,'Range of motion will be compromised if grip is too wide. At conclusion of set, step one foot out of band at bottom of exercises. Grasping each side of exercise band from behind and pull down. Transfer body weight onto free leg, bend knee of banded leg, release band from under foot, and step out. Transfer both sides of taut band to one hand behind body. Turn body to side of hand holding band while permitting band to contract to normal length.',1,'2021-06-27 13:39:40',NULL,NULL,0),(468,487,'Range of motion will be compromised if grip is too wide.',1,'2021-06-27 13:39:40',NULL,NULL,0),(469,489,'Range of motion will be compromised if grip is too wide.',1,'2021-06-27 13:39:40',NULL,NULL,0),(470,488,'Partner can assist as needed by pulling ankles or top feet up from behind. Range of motion will be compromised if grip is too wide.',1,'2021-06-27 13:39:40',NULL,NULL,0),(471,490,'Special angled pull-up bar assembly is shown.',1,'2021-06-27 13:39:40',NULL,NULL,0),(472,491,'Range of motion will be compromised if grip is too wide.',1,'2021-06-27 13:39:40',NULL,NULL,0),(473,492,'Partner can assist as needed by pulling ankles or top feet up from behind. Also see self-assisted technique.',1,'2021-06-27 13:39:40',NULL,NULL,0),(474,493,'Partner can assist as needed by pulling ankles or top feet up from behind. Exercise can be used until Pull-ups can be performed. Range of motion will be compromised if grip is too wide .',1,'2021-06-27 13:39:40',NULL,NULL,0),(475,494,'If bar is too low, knees may need to spread apart at bottom of motion (as shown) to achieve full range of motion. Range of motion will be compromised if grip is too wide. If lower body is used for assistance, Quadriceps are utilized.',1,'2021-06-27 13:39:40',NULL,NULL,0),(476,495,'If lower body is used for assistance, Hip and Knee Extensors muscles are utilized. Back extensors may be activated minimally as stabilizer through spine. Range of motion will be compromised if grip is too wide.',1,'2021-06-27 13:39:40',NULL,NULL,0),(477,496,'If lower body is used for assistance, Hip and Knee Extensors muscles are utilized. Back extensors may be activated minimally as stabilizer through spine.',1,'2021-06-27 13:39:40',NULL,NULL,0),(478,497,'Keep elbows straight or nearly straight throughout exercise. Also known as Wheel Kneeling Rollout. Rectus Abdominis and Obliques practically contract isometrically since little waist flexion occurs under resistance. With no waist flexion, Rectus Abdominis and External Oblique act to stabilize pelvis and waist during hip flexion. See target muscle of rollout question. Also see Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(479,498,'Try to keep elbows nearly straight throughout exercise. Target muscle, Rectus Abdominis practically contracts isometrically since only a small degree of waist flexion occurs under resistance and, with the assistance of the External Oblique, act to stabilize spine. See target muscle of rollout question. Also see Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(480,500,'Triceps become more involved if shoulders are keep close to wrists.',1,'2021-06-27 13:39:40',NULL,NULL,0),(481,499,'If lower body is used for assistance, Hip and Knee Extensors muscles are utilized. Back extensors may be activated minimally as stabilizer through spine. Range of motion will be compromised if handles are too wide apart.',1,'2021-06-27 13:39:40',NULL,NULL,0),(482,501,'This exercise can be performed on adjustable length gymnastics rings or a dual anchored suspension trainer where the handles can be placed a short distance apart. Performing this exercise on a TRXⓇ style suspension trainer would require a narrower grip, with the hands closer together.',1,'2021-06-27 13:39:40',NULL,NULL,0),(483,502,'None.',1,'2021-06-27 13:39:40',NULL,NULL,0),(484,504,'To intensify stretch, look up or to one side.',1,'2021-06-27 13:39:40',NULL,NULL,0),(485,503,'Try to keep elbows nearly straight throughout exercise. Also known as Stability Ball Kneeling Rollout.',1,'2021-06-27 13:39:40',NULL,NULL,0),(486,505,'None.',1,'2021-06-27 13:39:40',NULL,NULL,0),(487,506,'Avoid overstressing neck anteriorly. See Overhead Triceps Stretch for similar exercise which can be performed with this stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(488,507,'Allow shoulder to raise toward side of head for greater stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(489,509,'Alternatively, forearms can be placed on wall, parallel with elbows pointed downward.',1,'2021-06-27 13:39:40',NULL,NULL,0),(490,508,'Allow shoulder to raise toward side of head for greater stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(491,510,'Participant can be asked to lean torso away from side with arm behind head. See PNF Overhead Triceps Stretch for similar exercise which can be performed with this stretch. Also see Overhead Lat Stretch for similar static stretch. Long head of triceps is only stretched if elbow nears complete flexion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(492,511,'Since this movement becomes more difficult as full shoulder elevation is achieved, height criteria for shoulder elevation may be needed. For example, raising shoulders until slope of shoulders becomes horizontal may be considered adequate depending upon individual body structure and range of motion with lighter weight. Also see ROM Criteria and Shoulder Shrug Errors.',1,'2021-06-27 13:39:40',NULL,NULL,0),(493,513,'Since this movement becomes more difficult as full shoulder elevation is achieved, height criteria for shoulder elevation may be needed. For example, raising shoulders until slope of shoulders becomes horizontal may be considered adequate, depending upon individual body structure and range of motion with lighter weight. Also see ROM Criteria and Shoulder Shrug Errors.',1,'2021-06-27 13:39:40',NULL,NULL,0),(494,512,'Since this movement becomes more difficult as full shoulder elevation is achieved, height criteria for shoulder elevation may be needed. For example, raising shoulders until slope of shoulders becomes horizontal may be considered adequate depending upon individual body structure and range of motion with lighter weight. Also see ROM Criteria and Shoulder Shrug Errors.',1,'2021-06-27 13:39:40',NULL,NULL,0),(495,514,'Since this movement becomes more difficult as full shoulder elevation is achieved, height criteria for shoulder elevation may be needed. For example, raising shoulders until slope of shoulders becomes horizontal may be considered adequate depending upon individual body structure and range of motion with lighter weight. Also see ROM Criteria and Shoulder Shrug Errors.',1,'2021-06-27 13:39:40',NULL,NULL,0),(496,517,'Since this movement becomes more difficult as full shoulder elevation is achieved, height criteria for shoulder elevation may be needed. For example, raising shoulders until slope of shoulders becomes horizontal may be considered adequate depending upon individual body structure and range of motion with lighter weight. Also see ROM Criteria and Shoulder Shrug Errors.',1,'2021-06-27 13:39:40',NULL,NULL,0),(497,515,'Since this movement becomes more difficult as full shoulder elevation is achieved, height criteria for shoulder elevation may be needed. For example, raising shoulders until slope of shoulders becomes horizontal may be considered adequate, depending upon individual body structure and range of motion with lighter weight. Also see ROM Criteria and Shoulder Shrug Errors.',1,'2021-06-27 13:39:40',NULL,NULL,0),(498,518,'Since this movement becomes more difficult as full shoulder elevation is achieved, height criteria for shoulder elevation may be needed. For example, raising shoulders until slope of shoulders becomes horizontal may be considered adequate depending upon individual body structure and range of motion with lighter weight. Also see ROM Criteria and Shoulder Shrug Errors.',1,'2021-06-27 13:39:40',NULL,NULL,0),(499,516,'Since this movement becomes more difficult as full shoulder elevation is achieved, height criteria for shoulder elevation may be needed. For example, raising shoulders until slope of shoulders becomes horizontal may be considered adequate depending upon individual body structure and range of motion with lighter weight. Also see ROM Criteria and Shoulder Shrug Errors.',1,'2021-06-27 13:39:40',NULL,NULL,0),(500,519,'Exercise may be performed standing perfectly upright or very slightly bent over. Since this movement becomes more difficult as full shoulder elevation is achieved, height criteria for shoulder elevation may be needed. For example, raising shoulders until slope of shoulders becomes horizontal may be considered adequate depending upon individual body structure and range of motion with lighter weight. Also see ROM Criteria and Shoulder Shrug Errors.',1,'2021-06-27 13:39:40',NULL,NULL,0),(501,520,'Since this movement becomes more difficult as full shoulder elevation is achieved, height criteria for shoulder elevation may be needed. For example, raising shoulders until slope of shoulders becomes horizontal may be considered adequate depending upon individual body structure and range of motion with lighter weight. Also see ROM Criteria and Shoulder Shrug Errors.',1,'2021-06-27 13:39:40',NULL,NULL,0),(502,521,'If possible, position lever height high enough so weight will not need to be squat up that high, but not so high that weight stack bottoms out during exercise. Since this movement becomes more difficult as full shoulder elevation is achieved, height criteria for shoulder elevation may be needed. For example, raising shoulders until slope of shoulders becomes horizontal may be considered adequate depending upon individual body structure and range of motion with lighter weight. Also see ROM Criteria.',1,'2021-06-27 13:39:40',NULL,NULL,0),(503,522,'Since this movement becomes more difficult as full shoulder elevation is achieved, height criteria for shoulder elevation may be needed. For example, raising shoulders until slope of shoulders becomes horizontal may be considered adequate depending upon individual body structure and range of motion with lighter weight. Also see ROM Criteria.',1,'2021-06-27 13:39:40',NULL,NULL,0),(504,523,'Since this movement becomes more difficult as full shoulder elevation is achieved, height criteria for shoulder elevation may be needed. For example, raising shoulders until slope of shoulders becomes horizontal may be considered adequate depending upon individual body structure and range of motion with lighter weight. Also see ROM Criteria and Shoulder Shrug Errors.',1,'2021-06-27 13:39:40',NULL,NULL,0),(505,524,'Since this movement becomes more difficult as full shoulder elevation is achieved, height criteria for shoulder elevation may be needed. For example, raising shoulders until slope of shoulders becomes horizontal may be considered adequate depending upon individual body structure and range of motion with lighter weight. Also see ROM Criteria.',1,'2021-06-27 13:39:40',NULL,NULL,0),(506,527,'Since this movement becomes more difficult as full shoulder elevation is achieved, height criteria for shoulder elevation may be needed. For example, raising shoulders until slope of shoulders becomes horizontal may be considered adequate depending upon individual body structure and range of motion with lighter weight. Also see ROM Criteria and Shoulder Shrug Errors.',1,'2021-06-27 13:39:40',NULL,NULL,0),(507,526,'Since this movement becomes more difficult as full shoulder elevation is achieved, height criteria for shoulder elevation may be needed. For example, raising shoulders until slope of shoulders becomes horizontal may be considered adequate depending upon individual body structure and range of motion with lighter weight. Also see ROM Criteria and Shoulder Shrug Errors.',1,'2021-06-27 13:39:40',NULL,NULL,0),(508,528,'Since this movement becomes more difficult as full shoulder elevation is achieved, height criteria for shoulder elevation may be needed. For example, raising shoulders until slope of shoulders becomes horizontal may be considered adequate depending upon individual body structure and range of motion with lighter weight. Also see ROM Criteria.',1,'2021-06-27 13:39:40',NULL,NULL,0),(509,525,'Since this movement becomes more difficult as full shoulder elevation is achieved, height criteria for shoulder elevation may be needed. For example, raising shoulders until slope of shoulders becomes horizontal may be considered adequate depending upon individual body structure and range of motion with lighter weight. Also see ROM Criteria and Shoulder Shrug Errors.',1,'2021-06-27 13:39:40',NULL,NULL,0),(510,529,'Falling from an inverted position or hitting head on structural bar when flipping body may result in very serious injury. Adequate clearance must be allowed for head to clear any obstruction during both inversion and dismount. Exercise can also be performed on gymnastic rings. A safer position would be hanging centimeters above well padded flooring. Since this movement becomes more difficult as full shoulder elevation is achieved, height criteria for shoulder elevation may be needed. For example, raising shoulders until slope of shoulders becomes horizontal may be considered adequate depending upon individual body structure and range of motion with lighter weight. Also see ROM Criteria.',1,'2021-06-27 13:39:40',NULL,NULL,0),(511,530,'If possible, position lever height high enough so weight will not need to be squat up that high, but not so high that weight stack bottoms out during exercise. Since this movement becomes more difficult as full shoulder elevation is achieved, height criteria for shoulder elevation may be needed. For example, raising shoulders until slope of shoulders becomes horizontal may be considered adequate depending upon individual body structure and range of motion with lighter weight. Also see ROM Criteria.',1,'2021-06-27 13:39:40',NULL,NULL,0),(512,531,'If possible, position lever height high enough so weight will not need to be squat up that high, but not so high that weight stack bottoms out during exercise. Since this movement becomes more difficult as full shoulder elevation is achieved, height criteria for shoulder elevation may be needed. For example, raising shoulders until slope of shoulders becomes horizontal may be considered adequate depending upon individual body structure and range of motion with lighter weight. Also see ROM Criteria.',1,'2021-06-27 13:39:40',NULL,NULL,0),(513,532,'None.',1,'2021-06-27 13:39:40',NULL,NULL,0),(514,533,'Falling from an inverted position may result in very serious injury. To decrease potential of injury, position gymnastic rings over well padded surface, only high enough to allow full range of motion. Since this movement becomes more difficult as full shoulder elevation is achieved, height criteria for shoulder elevation may be needed. For example, raising shoulders until slope of shoulders becomes horizontal may be considered adequate, depending upon individual body structure and range of motion with lighter weight. Also see ROM Criteria. This exercise can be performed on adjustable length gymnastics rings or a dual anchored suspension trainer.',1,'2021-06-27 13:39:40',NULL,NULL,0),(515,534,'None',1,'2021-06-27 13:39:40',NULL,NULL,0),(516,535,'None',1,'2021-06-27 13:39:40',NULL,NULL,0),(517,536,'Throughout movement, keep bent elbow (approximately 90°) in front of body, chest or shoulder height.',1,'2021-06-27 13:39:40',NULL,NULL,0),(518,538,'Maintain elbow against side and fixed elbow position (90° angle) throughout exercise. Placing towel roll under arm increase infraspinatus and teres minor EMG signal activity compared to no towel roll (Wilk KE 2002), although subsequent study found no significant difference (Reinold MM 2004). Also see Dumbbell Shoulder External Rotation Errors.',1,'2021-06-27 13:39:40',NULL,NULL,0),(519,537,'Maintain elbow against side and fixed elbow position (90° angle) throughout exercise. Exercise may be performed standing with medium high pulley.',1,'2021-06-27 13:39:40',NULL,NULL,0),(520,539,'Maintain elbow against side and fixed elbow position (90° angle) throughout exercise. Position incline as low as possible so dumbbell can still be aligned against gravity.',1,'2021-06-27 13:39:40',NULL,NULL,0),(521,541,'Throughout movement, keep bent elbow (approximately 90°) out to side, shoulder height.',1,'2021-06-27 13:39:40',NULL,NULL,0),(522,540,'Wrist may be kept straighter throughout movement than what is shown. Also, keep elbow at shoulder height and bent at right angle. Height of cable pulley is dependent upon:',1,'2021-06-27 13:39:40',NULL,NULL,0),(523,542,'Maintain elbow against side and fixed elbow position (90° angle) throughout exercise. Exercise may be performed seated on chair with pulley lowered to elbow height or seated on floor with low pulley.',1,'2021-06-27 13:39:40',NULL,NULL,0),(524,543,'Adjust lever and body orientation to achieve full range of motion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(525,544,'Throughout movement, keep bent elbow (approximately 90°) out to side, shoulder height.',1,'2021-06-27 13:39:40',NULL,NULL,0),(526,545,'Exercise can also be performed with seat facing inward at 45° but this may limit internal rotation ROM of shoulder and supraspinatus will not assist.',1,'2021-06-27 13:39:40',NULL,NULL,0),(527,546,'Those with shorter forearms whose wrists do not make contact with pad would utilize Wrist Extensors as stabilizer to keep wrists ridged while back of the hands move pads.',1,'2021-06-27 13:39:40',NULL,NULL,0),(528,547,'Lean torso toward positioned arm if stretch is not yet felt.',1,'2021-06-27 13:39:40',NULL,NULL,0),(529,548,'None.',1,'2021-06-27 13:39:40',NULL,NULL,0),(530,549,'Keep back straight.',1,'2021-06-27 13:39:40',NULL,NULL,0),(531,550,'None.',1,'2021-06-27 13:39:40',NULL,NULL,0),(532,551,'None.',1,'2021-06-27 13:39:40',NULL,NULL,0),(533,552,'A very upright position (ie: very light resistance) with one foot positioned back slightly (see \'Easier\') is typically required for proper execution. Take care to maintain tension on suspension trainer near top of movement. Dismounting can be achieved by walking backward until body is upright or stepping out at top of movement. This exercise can be performed on TRXⓇ style suspension trainer or adjustable length gymnastics rings.',1,'2021-06-27 13:39:40',NULL,NULL,0),(534,553,'Torso can lean back slightly allowing for fuller range of motion at the bottom of movement. In which case, forearm does not need to travel any closer than vertical toward body. Elbow can be held with opposite hand for additional support.',1,'2021-06-27 13:39:40',NULL,NULL,0),(535,554,'Maintain elbow against side and fixed elbow position throughout exercise. Exercise may be performed seated if medium high / adjustable pulley is not availble.',1,'2021-06-27 13:39:40',NULL,NULL,0),(536,555,'Maintain elbow\'s bend and position at edge of bench against side of body throughout exercise. Elbow can be held with opposite hand for additional support.',1,'2021-06-27 13:39:40',NULL,NULL,0),(537,556,'Adjust lever and body orientation to achieve full range of motion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(538,559,'Bent knees slightly so stretch is not limited by hamstring flexibility and to keep shoulder from being pushed forward.',1,'2021-06-27 13:39:40',NULL,NULL,0),(539,558,'Those with shorter forearms whose wrists do not make contact with pad would utilize Wrist Flexors as stabilizer to keep wrists ridged while hands move pads.',1,'2021-06-27 13:39:40',NULL,NULL,0),(540,557,'Maintain elbow against side and fixed elbow position throughout exercise. Exercise may be performed standing with medium high / adjustable pulley',1,'2021-06-27 13:39:40',NULL,NULL,0),(541,560,'None.',1,'2021-06-27 13:39:40',NULL,NULL,0),(542,561,'Turn seat facing inward at 45° if external rotation ROM of shoulder is limited. Consequently placing the upper arm in this plane limits internal rotation ROM of shoulder and Supraspinatus will assist slightly in interal rotation.',1,'2021-06-27 13:39:40',NULL,NULL,0),(543,562,'See mount and dismount. Some assisted machines require you to kneel on platform instead of standing on bar. Also see Assisted Triceps Dip.',1,'2021-06-27 13:39:40',NULL,NULL,0),(544,563,'See mount and dismount. Some assisted machines require you to standing on bar. Also see Assisted Triceps Dip.',1,'2021-06-27 13:39:40',NULL,NULL,0),(545,564,'Instead of assistant holding bench board, it can be strapped to torso, as shown. Boards of varying thicknesses (1, 2, or 3) can be used. Board Press develops strength in middle range of motion for Bench Press. Gluteus Maximus, Erector Spinae, Quadriceps, and other muscles may be considered significant stabilizers during actual powerlift.',1,'2021-06-27 13:39:40',NULL,NULL,0),(546,565,'Upper arm travels in perpendicular path to torso to minimize anterior deltoid involvement and mimics upper arm positioning of Chest Flies. The oblique grip (hand positioned with palm diagonal on bar) allows elbows to be more easily turned outward to each side. Also see Bench Press Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(547,566,'Competitive lifting requires bar to make contact with chest above bottom of the sternum with momentary pause. Gluteus Maximus, Erector Spinae, Quadriceps, and other muscles may be considered significant stabilizers during actual powerlift.',1,'2021-06-27 13:39:40',NULL,NULL,0),(548,567,'Range of motion will be compromised if grip is too wide.',1,'2021-06-27 13:39:40',NULL,NULL,0),(549,568,'Floor Presses are also said to build explosive strength by breaking eccentric/concentric chain (AKA: stretch-shortening cycle) normally activated at bottom of standard Bench Press.',1,'2021-06-27 13:39:40',NULL,NULL,0),(550,569,'Range of motion will be compromised if grip is too wide. Latissimus Dorsi involvement is l\n\n\now on Decline Bench Press (Barnett 1995). Also see Bench Press Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(551,570,'The animation depicts dip bar placed in front of low pull cable. If cable dip machine is available, attach hip harness and step up to dip bar. Also see Cable Triceps Dip.',1,'2021-06-27 13:39:40',NULL,NULL,0),(552,571,'Since incline of bench does not actually affect angle of pull as with dumbbells, similar effect can be achieved on flat bench if cable stirrups are brought together above upper abdomen instead of chest.\n\n\nKeep shoulders internally rotated so elbows point downward at bottom position and outward at top position. Keep elbows at fixed angle, only slightly bent. Anterior Deltoid will no longer act as synergist in steep decline bench position.',1,'2021-06-27 13:39:40',NULL,NULL,0),(553,572,'Chains provide increasing resistance as barbell moves away from floor. Chains can be used during either Powerlift-style Bench Press or Standard-style Bench Press. Also see Bench Press Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(554,573,'Shoulders are kept internally rotated so elbows are pointing back\n\n\nand out to sides.',1,'2021-06-27 13:39:40',NULL,NULL,0),(555,574,'Keep shoulders internally rotated so elbows point downward at bottom position and outward at top position. Keep elbows at fixed angle, only slightly bent.',1,'2021-06-27 13:39:40',NULL,NULL,0),(556,575,'Stirrup should follow slight arch pattern, above upper arm between elbow and chest at bottom, traveling inward over each shoulder at t\n\n\nop. Also see Bench Press Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(557,576,'Under greater resistance, positioning torso at lower angle downward (by bending over at hips), will allow upper body weight to counterbalance upward pull of cables, as opposed to stepping forward and struggling with\n\n\nbackward pull of cables.',1,'2021-06-27 13:39:40',NULL,NULL,0),(558,577,'Also see exercise performed with twisting movement. Pectoralis Minor and Serratus Anterior act as stabilizers if torso is not against back support as shown.',1,'2021-06-27 13:39:40',NULL,NULL,0),(559,578,'Cable pulleys should be relatively close together, narrower than width of arms extended out to sides (but not too close), closer than what is typically found on standard cable cross over setup. Range of motion will be compromised if grip is too wide.',1,'2021-06-27 13:39:40',NULL,NULL,0),(560,579,'The effective range of motion of Pectoralis Major is only about half of what it is in non-twisting movement.',1,'2021-06-27 13:39:40',NULL,NULL,0),(561,580,'Range of motion will be compromised if grip is too wide. Also see Bench Press Analysis and Cable Bar Standing Bench Press.',1,'2021-06-27 13:39:40',NULL,NULL,0),(562,582,'Stirrup should follow slight arch pattern as hands travel closer together toward extension. Cable pulleys should be relatively close together, narrower than width of arms extended out to sides (but not too close), closer than what is typically found on standard cable cross over setup.',1,'2021-06-27 13:39:40',NULL,NULL,0),(563,581,'Stirrup should follow slight arch pattern, in front of upper arm between elbow and chest in stretched position, traveling inward in front of each shoulder at extended position.',1,'2021-06-27 13:39:40',NULL,NULL,0),(564,583,'Dumbbells should follow slight arch pattern, above upper arm between elbow and chest at bottom, traveling inward over each shoulder at top. No need to drop weights - see suggested mount and dismount techniques: standard or advanced. Also see mount & dismount from special machine rack and\n\n\nBench Press Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(565,584,'Stirrup should follow slight arch pattern, in front of upper arm between elbow and chest in stretched position, traveling inward and slightly downward just below each shoulder at ex\n\n\ntended position. Latissimus Dorsi involvement is low on Decline Bench Press (Barnett 1995).',1,'2021-06-27 13:39:40',NULL,NULL,0),(566,585,'Stirrup should follow slight arch pattern, in front of upper arm between elbow and chest in stretched position, traveling inward in front shoulder at contracted position.',1,'2021-06-27 13:39:40',NULL,NULL,0),(567,586,'Stirrup should follow slight arch pattern as hands travel closer together toward extension. Cable pulleys should be relatively close together, narrower than width of arms extended out to sides (but not too close), closer than what is typically found on standard cable cross over setup.',1,'2021-06-27 13:39:40',NULL,NULL,0),(568,587,'Cable pulleys should be relatively close together, narrower than width of arms extended out to sides (but not too close), closer than what is typically found on standard cable cross over setup.',1,'2021-06-27 13:39:40',NULL,NULL,0),(569,588,'Stirrup should follow slight arch pattern, above upper arm between elbow and chest at bottom, traveling inward over each shoulder at top. No need to drop weights - see suggested mount and dismount technique. Latissimus Dorsi involv\n\n\nement is low on Decline Bench Press (Barnett 1995). Also see mount & dismount from special machine rack and Bench Press Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(570,589,'Keep elbows at fixed angle, only slightly bent, and pointing outward, opposite direction of upward motion. Anterior Deltoid will no longer act as synergist in steep decline bench position.',1,'2021-06-27 13:39:40',NULL,NULL,0),(571,590,'Avoid hips from raising up significantly. Actual range of motion is dependent upon individual shoulder flexibility. Keep elbows fixed at small bend throughout exercise. See suggested mount & dismount.',1,'2021-06-27 13:39:40',NULL,NULL,0),(572,591,'Keep shoulders internally rotated so elbows point downward at bottom position and outward at top position. Keep elbows at fixed angle, only slightly bent.',1,'2021-06-27 13:39:40',NULL,NULL,0),(573,592,'Lower body extending off of bench acts as counter balance to resistance and keeps upper back fixed on bench. Avoid hips from raising up significantly. Actual range of motion is dependent upon individual shoulder flexibility. Keep elbows fixed at small bend throughout exercise. See suggested mount & dismount.',1,'2021-06-27 13:39:40',NULL,NULL,0),(574,593,'Orientation relative to lever will depend upon height of fulcrum relative to bench. Position body so bar is over shoulders during extension, yet lower on chest in lowest position. Range of motion will be compromised if grip is too wide. Also see Bench Press Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(575,594,'Range of motion will be compromised if grip is too wide. Latissimus Dorsi involvem\n\n\nent is low on Decline Bench Press (Barnett 1995). Also see exercises performed on alternative machine. Also see Bench Press Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(576,595,'Range of motion will be compromised if grip is too wide. Also see Bench Press Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(577,596,'Actual range of motion is dependent upon individual shoulder flexibility. Keep elbows fixed at small bend throughout exercise. See suggested mount & dismount.',1,'2021-06-27 13:39:40',NULL,NULL,0),(578,597,'Range of motion will be compromised if grip is too wide. Also see Bench Press Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(579,598,'Also see Lever Triceps Dip.',1,'2021-06-27 13:39:40',NULL,NULL,0),(580,599,'See Lever Chest Dip on machine facing fulcrum. Also see Lever Triceps Dip.',1,'2021-06-27 13:39:40',NULL,NULL,0),(581,602,'Range of motion will be compromised if grip is too wide. Also see Bench Press Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(582,603,'None.',1,'2021-06-27 13:39:40',NULL,NULL,0),(583,604,'None',1,'2021-06-27 13:39:40',NULL,NULL,0),(584,605,'Height of platform should allow shoulders to be near the same height of fulcrums. Secondary levers compensate somewhat for variations if alignment between points of rotation (lever fulcrum and shoulder girdle articulation). Under greater resistance, height of platform can be increased so torso can be positioned at lower angle downward (by bending over at hips). This will allow upper body weight to counterbalance upward pull of levers. See Lever Seated Iron Cross Fly and Lever Iron Cross for Lats.',1,'2021-06-27 13:39:40',NULL,NULL,0),(585,606,'Shoulders should be internally rotated so elbows are pointing back at beginning of motion and outward at end of motion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(586,608,'Shoulders should be internally rotated so elbows are pointing backwards at beginning of motion and forward at completion of motion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(587,609,'Shoulders are kept internally rotated so elbows are pointing out to sides. Adjust lever arms on machine so slight stretch is felt when weight is lowered. Also see exercises on alternative machine.',1,'2021-06-27 13:39:40',NULL,NULL,0),(588,607,'Under greater resistance, positioning torso at lower angle downward (by bending over at hips), will allow upper body weight to counterbalance upward pull of cables, as opposed to stepping forward and struggling with the backward pull of cables. Also see Bent-over Fly on Standing Iron Cross Machine.',1,'2021-06-27 13:39:40',NULL,NULL,0),(589,611,'Shoulders should be internally rotated so elbows are pointing downward at bottom of motion and outward at top of motion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(590,612,'Range of motion will be compromised if grip is too wide. Also see Bench Press Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(591,613,'Range of motion will be compromised if grip is too wide.',1,'2021-06-27 13:39:40',NULL,NULL,0),(592,615,'Some machines have foot levers to position handles in a more comfortable starting and ending position. If foot lever is available, engage it before grasping handles, release it before performing exercise, and engage it again just before releasing grips.',1,'2021-06-27 13:39:40',NULL,NULL,0),(593,614,'Range of motion will be compromised if grip is too wide. Latissimus Dorsi involvement is low on Decline Bench Press (Barnett 1995). Also see Bench Press Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(594,618,'Some machines have foot levers to position handles in a more comfortable starting and ending position. If foot lever is available, engage it before grasping handles, release it before performing exercise, and engage it again just before releasing grips.',1,'2021-06-27 13:39:40',NULL,NULL,0),(595,619,'Both the machine design and handle orientation are rare. See typical dip machines:',1,'2021-06-27 13:39:40',NULL,NULL,0),(596,617,'Range of motion will be compromised if grip is too wide.',1,'2021-06-27 13:39:40',NULL,NULL,0),(597,621,'Range of motion will be compromised if grip is too wide. Also see Bench Press Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(598,620,'This particular machine design is rare. See typical dip machines:',1,'2021-06-27 13:39:40',NULL,NULL,0),(599,622,'Range of motion will be compromised if grip is too wide. Latissimus Dorsi involvement is low on Decline Bench Press (Barnett 1995). Also see Bench Press Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(600,624,'Also see Triceps Dip.',1,'2021-06-27 13:39:40',NULL,NULL,0),(601,623,'Both upper and lower body must be kept straight throughout movement. Exercise can be performed without additional weight. If additional weight is used, partner will need to add and remove weight, and keep weight from sliding off back. See narrower grip push-up.',1,'2021-06-27 13:39:40',NULL,NULL,0),(602,625,'Also see Band-assisted Triceps Dip.',1,'2021-06-27 13:39:40',NULL,NULL,0),(603,628,'Both upper and lower body must be kept straight throughout movement. See close grip push-up. Also see push-up test calculator.',1,'2021-06-27 13:39:40',NULL,NULL,0),(604,626,'Range of motion will be compromised if grip is too wide. Latissimus Dorsi involvement is low on Decline Bench Press (Barnett 1995). Also see Bench Press Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(605,627,'Both upper and lower body must be kept straight throughout movement. Exercise can be performed without additional weight, without handles, or without platform. Platform compensates for height of handles. If platform is too high, upper chest will be emphasized (see Decline Push-up). If additional weight is used, partner will need to add and remove weight, and keep weight from sliding off back.',1,'2021-06-27 13:39:40',NULL,NULL,0),(606,629,'Added weight can be placed on dip belt or dumbbell can be placed between ankles. Also see Weighted Triceps Dip.',1,'2021-06-27 13:39:40',NULL,NULL,0),(607,630,'In above clip, hands are positioned at ends of main segments of benches with fingers between gaps. On standard benches, hands should be placed near ends of benches. Perform on higher benches if slight stretch is not felt. Also see Triceps Dip (between benches).',1,'2021-06-27 13:39:40',NULL,NULL,0),(608,631,'In above clip, hands are positioned at ends of main segments of benches with fingers between gaps. On standard benches, hands should be placed near ends of benches. Perform on higher benches if slight stretch is not felt. Also see Triceps Dip (between benches).',1,'2021-06-27 13:39:40',NULL,NULL,0),(609,632,'Both upper and lower body must be kept straight throughout movement. Height of bench or platform affects difficulty of movement. See Gravity Vectors for greater understanding how of body angle influences resistance. Also see movement performed on horizontal bar and close grip push-up.',1,'2021-06-27 13:39:40',NULL,NULL,0),(610,633,'To emphasize chest, position body bent over by bending hips. Also see Triceps Dips. This exercise can be performed on adjustable length gymnastics rings or a dual anchored suspension trainer.',1,'2021-06-27 13:39:40',NULL,NULL,0),(611,634,'Both upper and lower body must be kept straight throughout movement. Height of bar affects difficulty of movement. See Gravity Vectors for greater understanding of how body angle influences resistance. Also see movement performed on edge of box or bench and close grip push-up.',1,'2021-06-27 13:39:40',NULL,NULL,0),(612,635,'If lower body is used for assistance, Quadriceps are utilized. Hips are kept straighter and body more upright, as compared to Assisted Triceps Dip. This exercise can be performed on adjustable length gymnastics rings or a dual anchored suspension trainer.',1,'2021-06-27 13:39:40',NULL,NULL,0),(613,636,'See Suspended Chest Press Mount/Dismount . Arms and suspension straps should be perpendicular to body. Both upper and lower body must be kept straight throughout movement. Elbows largely remain behind hands\' line of force. See side view. Angle of body affects difficulty of movement. See Gravity Vectors for greater understanding of body angle influences resistance. This exercise can be performed on TRXⓇ style suspension trainer or adjustable length gymnastics rings.',1,'2021-06-27 13:39:40',NULL,NULL,0),(614,637,'Hands may be clasped. Keep head upright.',1,'2021-06-27 13:39:40',NULL,NULL,0),(615,638,'If lower body is used for assistance, Hip and Knee Extensors muscles are utilized. Hips are bent more and body leans forward more, as compared to Self-assisted Triceps Dip.',1,'2021-06-27 13:39:40',NULL,NULL,0),(616,639,'See Suspended Prone Mount/Dismount. Throughout movement, keep elbows in fixed, slightly bent position and shoulders internally rotated, so elbows are kept pointed outward and high. Arms and suspension straps plane of motion should be perpendicular to body. Both upper and lower body must be kept straight throughout movement. Angle of body affects difficulty of movement. See Gravity Vectors for greater understanding of how body angle influences resistance.',1,'2021-06-27 13:39:40',NULL,NULL,0),(617,640,'Both upper and lower body must be kept straight throughout movement. Forefeet can remain on floor as long as body is pivoting on knees. See close grip push-up. Also see push-up test calculator.',1,'2021-06-27 13:39:40',NULL,NULL,0),(618,641,'Upper chest becomes more stretched with elbow lower. Lower chest and pectoralis minor become more stretched with elbow higher.',1,'2021-06-27 13:39:40',NULL,NULL,0),(619,642,'None',1,'2021-06-27 13:39:40',NULL,NULL,0),(620,643,'Participants hands can be clasped. See PNF stretch techniques. Also see Behind Head Chest Stretch for similar static stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(621,644,'Upper chest becomes more stretched with elbow lower. Lower chest and pectoralis minor become more stretched with elbow higher.',1,'2021-06-27 13:39:40',NULL,NULL,0),(622,645,'Stirrup should follow slight arch pattern, in front/above of upper arm between elbow and chest in stretched position, travelling inward in front/above each shoulder at contracted position.',1,'2021-06-27 13:39:40',NULL,NULL,0),(623,646,'Range of motion will be compromised if grip is too wide.\n\n\nAlso see Bench Press Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(624,647,'Stirrup should follow slight arch pattern, in front/above of upper arm between elbow and chest in stretched position, travelling inward in front/above each shoulder at contracted position. Cable pulleys should be closer together than what is typically found on standard cable cross over setup.',1,'2021-06-27 13:39:40',NULL,NULL,0),(625,650,'Cable pulleys should be closer together than what is typically found on standard cable cross over setup. Range of motion will be compromised if grip is too wide.',1,'2021-06-27 13:39:40',NULL,NULL,0),(626,649,'Stirrup should follow slight arch pattern, above upper arm between elbow and chest at bottom, traveling inward over each shoulder at top.',1,'2021-06-27 13:39:40',NULL,NULL,0),(627,648,'Range of motion will be compromised if grip is too wide. Also see Bench Press Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(628,651,'Keep shoulders internally rotated so elbows point downward at bottom position and outward at top position. Shoulder will likely have less range of motion in lower position as compared to Fly on flat bench.',1,'2021-06-27 13:39:40',NULL,NULL,0),(629,652,'Dumbbell should follow slight arch pattern, above upper arm between elbow and chest at bottom, traveling inward over each shoulder at top. See suggested mount & dismount and mount & dismount from special machine rack. Also see elevated foot leg positioning to decrease arch in back and\n\n\nBench Press Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(630,654,'Stirrup should follow slight arch pattern, in front/above of upper arm between elbow and chest in stretched position, travelling inward in front/above shoulder at contracted position.',1,'2021-06-27 13:39:40',NULL,NULL,0),(631,653,'None',1,'2021-06-27 13:39:40',NULL,NULL,0),(632,655,'Keep shoulders internally rotated so elbows point downward at bottom position and outward at top position. Shoulder will likely have less range of motion in lower position as compared to Fly on flat bench.',1,'2021-06-27 13:39:40',NULL,NULL,0),(633,657,'Range of motion will be compromised if grip is too wide.',1,'2021-06-27 13:39:40',NULL,NULL,0),(634,656,'This exercise is typically performed on Lever Incline Chest Press Machine. Seat alterations and precautions during mounting and dismounting of weight will need to be taken since this apperatus is designed for Lever Military Press. Seat should be positioned so base of handles are approximately arm pit height, higher than what is required for military press. Before initiation of movement, lift lever into lower starting position with elbows positioned slightly low. Once first rep is performed, position elbows slightly further out to sides. At bottom position of each rep, lower levers only as far back to allow slight stretch to be felt in chest or shoulders. Once last rep is performed, lower shoulders slightly before lowering levers to resting position.',1,'2021-06-27 13:39:40',NULL,NULL,0),(635,658,'Orientation relative to lever will depend upon height of fulcrum relative to bench. Position body so bar is over shoulders during extension, yet lower on chest in lowest position. Feet can be placed on bench as shown for more comfortable low back positioning. Range of motion will be compromised if grip is too wide.\n\n\nAlso see Bench Press Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(636,659,'Range of motion will be compromised if grip is too wide. See Lever Incline Bench Press improvised on older equipment and\n\n\nexercise performed with parallel grip. Also see Bench Press Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(637,660,'Seat should be adjusted, so handles are to sides of lower chest. Parallel grip tends to place shoulders in a more stable position, with arms closer to sides, which may be more ideal for those with certain shoulder issues. See exercise on alternative machine. Also see exercise performed with standard grip providing greater emphasis on chest development.\n\n\nAlso see Bench Press Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(638,661,'Range of motion will be compromised if grip is too wide. Also see exercise performed with parallel grip and exercise performed on alternative machine.\n\n\nAlso see Bench Press Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(639,662,'Seat should be adjusted so handles are to sides of lower chest. Parallel grip tends to place shoulders in a more stable position, with arms closer to sides, which may be more ideal for those with certain shoulder issues. Also see exercise performed with standard grip providing greater emphasis on chest development.\n\n\nAlso see Bench Press Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(640,663,'Some machines have foot levers to position handles in a more comfortable starting position. If available, push lever with foot, grasp bar, and release foot lever.',1,'2021-06-27 13:39:40',NULL,NULL,0),(641,665,'Some machines have foot levers to position handles in a more comfortable starting and ending position. If foot lever is available, engage it before releasing grips.',1,'2021-06-27 13:39:40',NULL,NULL,0),(642,664,'Range of motion will be compromised if grip is too wide.',1,'2021-06-27 13:39:40',NULL,NULL,0),(643,668,'Elbows should be pointing downward at bottom of motion and outward on top of motion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(644,666,'Range of motion will be compromised if grip is too wide.\n\n\nAlso see Bench Press Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(645,667,'Range of motion will be compromised if grip is too wide or necked is protracted. Very high elevations may not involve sternal head of pectoralis major. Lower elevations will target sternal head of pectoralis major but still involve clavicular head of pectoralis major as synergist.',1,'2021-06-27 13:39:40',NULL,NULL,0),(646,669,'Pike Push-up (for upper chest) differs from Pike Press (for front delts) in that, feet are further away from hands so body is less inverted in lowest position.',1,'2021-06-27 13:39:40',NULL,NULL,0),(647,670,'Range of motion will be compromised if grip is too wide or necked is protracted. Very high elevations may not involve sternal head of pectoralis major. Lower elevations will target sternal head of pectoralis major, but still involve clavicular head of pectoralis major as synergist.',1,'2021-06-27 13:39:40',NULL,NULL,0),(648,671,'This dynamic shoulder girdle stretch exercises rhomboids and trapezius isometrically while stretching pectoralis minor and major. It can be prescribed for protracted shoulder girdle. Continuously push shoulders and back of arms into floor or mat throughout stretch. Although arms move slowly throughout stretch, shoulder blades, elbows, and wrists are continuously pushing back against floor or mat. Position pelvis back so low back remains on floor or mat. See movement in Wall Shoulder Girdle Stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(649,677,'None.',1,'2021-06-27 13:39:40',NULL,NULL,0),(650,678,'This dynamic shoulder girdle stretch exercises rhomboids and trapezius isometrically while stretching pectoralis minor and major. It can be prescribed for protracted shoulder girdle. Keep lower and upper back against wall. Continuously push shoulders blades and arms into wall throughout stretch. Although arms move slowly throughout stretch, shoulders, elbows, and wrists are continuously pushing back against wall.',1,'2021-06-27 13:39:40',NULL,NULL,0),(651,679,'Keep arms straight throughout execution. For convenience, exercise can be performed immediately after warm up on Lever Incline Chest Press.',1,'2021-06-27 13:39:40',NULL,NULL,0),(652,680,'Keep arms straight throughout execution. For convenience, exercise can be performed immediately after warm up on Barbell Incline Chest Press.',1,'2021-06-27 13:39:40',NULL,NULL,0),(653,681,'Keep arms straight throughout execution. For convenience, exercise can be performed immediately after warm up on Dumbbell Incline Chest Press.',1,'2021-06-27 13:39:40',NULL,NULL,0),(654,685,'None',1,'2021-06-27 13:39:40',NULL,NULL,0),(655,682,'Keep arms straight throughout execution. For convenience, exercise can be performed immediately after warm up on Cable Incline Chest Press.',1,'2021-06-27 13:39:40',NULL,NULL,0),(656,683,'Keep arms straight throughout execution. For convenience, exercise can be performed immediately after warm up on Lever Incline Chest Press. See movment performed on Hammer Front Military Press Machine, which incidentally has favorable position for this movement as compared to Hammer Incline Press.',1,'2021-06-27 13:39:40',NULL,NULL,0),(657,686,'Keep arms straight throughout execution. For convenience, exercise can be performed immediately after warm up on Smith Incline Chest Press.',1,'2021-06-27 13:39:40',NULL,NULL,0),(658,687,'Both upper and lower body must be kept straight throughout movement. See similar Push-up exercises targeting Pectoralis Major.',1,'2021-06-27 13:39:40',NULL,NULL,0),(659,689,'Keep weight above shoulders throughout movement. A standard incline crunch without additional weight should be performed until greater resistance is required. Incline bench shown is designed for chest exercises, not abdominal exercise. Flexible hip flexors are required if bench does not provide for fixed hip flexion. A relatively steep incline is required to adequately position abdominal against load throughout fuller range of motion. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(660,690,'See Spot Reduction Myth. Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. Some individuals may experience low back discomfort if hips are not bent so they must use smaller ball size or lower their hip position on ball.',1,'2021-06-27 13:39:40',NULL,NULL,0),(661,691,'Training partner or trainer may need to assist attaching ankle cuffs to cable. Ankle cuffs may also be attached to cable pulley in lowest position when feet are on floor, but assistance may be needed to raise pulley to bench height. Cable Lying Leg Raise on floor is easier to set up.',1,'2021-06-27 13:39:40',NULL,NULL,0),(662,692,'Keep weight above shoulders throughout movement. Incline can also be elevated to increase resistance. If upper back does not come completely down at end of movement, abdominal muscles may only be isometrically involved in exercise. Pectineus, Adductor Longus, and Brevis do not assist in hip flexion since hips are already initially bent. Knee flexors may be involved as stabilizers if incline is steep and no calf support is used. Incline bench should allow for significant bend in hip as shown. Decline benches designed for chest exercises generally do not offer this positioning. Flexible hip flexors are required if bench does not provide for fixed hip flexion. See Spot Reduction Myth. Also see Dangerous Exercise Essay.',1,'2021-06-27 13:39:40',NULL,NULL,0),(663,693,'See Spot Reduction Myth. Also see movement performed on selectorized apparatus.',1,'2021-06-27 13:39:40',NULL,NULL,0),(664,694,'Movement can also be performed on bench. Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible. See Spot Reduction Myth and Lower Ab Myth. Also see Cable Lying Leg Raise.',1,'2021-06-27 13:39:40',NULL,NULL,0),(665,695,'Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. Waist flexion will occur earlier in lift if legs are straighter or Hamstrings are not that flexible. See Spot Reduction Myth and Lower Ab Myth. Also see Cable Lying Straight Leg Raise.',1,'2021-06-27 13:39:40',NULL,NULL,0),(666,696,'See Spot Reduction Myth. Also see movement performed on dedicated apparatus or plate loaded apparatus.',1,'2021-06-27 13:39:40',NULL,NULL,0),(667,697,'Note movement occurs in waist, not hips. See Spot Reduction Myth. Hyperextension of spine at top of motion is achieved by anterior rotation of pelvis with flexed hips. Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. If two soft stirrups are used instead of rope attachment, grasp stirrups at side of head. Also see alternative technique. Movement can also be performed standing up, see Cable Standing Overhead Crunch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(668,698,'Keep arms fixed in position keeping them close to body throughout movement. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(669,699,'Padded hump should be adjusted to height of low back. See Spot Reduction Myth. Also see Cable Standing Twisting Crunch and Cable Standing Overhead Crunch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(670,700,'Keep weight above shoulders throughout movement. A standard incline crunch without additional weight should be performed until greater resistance is required. Incline bench shown is designed for chest exercises, not abdominal exercise. Flexible hip flexors are required if bench does not provide for fixed hip flexion. A relatively steep incline is required to adequately position abdominal against load throughout fuller range of motion. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(671,701,'Lever fulcrum should be aligned with waist, not hips. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(672,702,'Note movement occurs in waist, not hips. Hyperextension of spine at top of motion is achieved by anterior rotation of pelvis with flexed hips. See Spot Reduction Myth. Two soft stirrups or triceps rope can also be substituted for multi-purpose bar. Also see similar exercises:',1,'2021-06-27 13:39:40',NULL,NULL,0),(673,703,'Note movement occurs in waist, not hips. Hyperextension of spine at top of motion is achieved by anterior rotation of pelvis with flexed hips. See Spot Reduction Myth. Two soft stirrups or multi-exercise bar can be substituted for rope. If two soft stirrups are used, grasp stirrups at side of head. Also see similar exercises:',1,'2021-06-27 13:39:40',NULL,NULL,0),(674,704,'Keep weight above shoulders throughout movement. Incline can also be elevated to increase resistance. If upper back does not come completely down at end of movement, abdominal muscles may only be isometrically involved in exercise. Pectineus, Adductor Longus, and Brevis do not assist in hip flexion since hips are already initially bent. Knee flexors may be involved as stabilizers if incline is steep and no calf support is used. Incline bench should allow for significant bend in hip as shown. Decline benches designed for chest exercises generally do not offer this positioning. Flexible hip flexors are required if bench does not provide for fixed hip flexion. See Spot Reduction Myth. Also see Dangerous Exercise Essay.',1,'2021-06-27 13:39:40',NULL,NULL,0),(675,707,'See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(676,705,'Lever fulcrum should be aligned with waist, not hips. Some lever lying crunch machines have handles to sides. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(677,708,'Exercise is typically performed without added resistance. Rectus Abdominis and Obliques only dynamically contract only if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only isometrically contract to stabilize pelvis and waist during hip flexion; see Lever Vertical Leg Raise. Waist flexion will occur earlier in lift if legs are straighter or Hamstrings are not that flexible. See Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(678,706,'Rectus Abdominis and Obliques dynamically contract only if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only isometrically contract to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible. See Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(679,709,'Weight plates added to upper segment adds resistance, whereas weight plates added to lower segment decreases resistance. Seat can also be turned to either side to emphasize obliques. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(680,710,'See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(681,711,'On some models, feet can be positioned behind pad under seat. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(682,712,'Foot bar should be adjusted to allow for slight bend in knees as hips are forcefully being pushed against hip pad. Throughout exercise, keep arms straight and hips securely pushed back against hip pad. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(683,713,'Maintain shoulders fixed at 90º or greater so upper arm and upper back are close to perpendicular. Men should keep chest close to padded lever. Women may choose to position chest as close as possible without making contact with inside of lever. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(684,714,'If low back does flex near top of motion, abdominal muscles may only be isometrically involved in exercise. Pectineus, Adductor Longus, and Brevis do not assist in hip flexion since hips are already initially bent. Sled pad can be turned to either side to emphasize Obliques. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(685,716,'Taller individuals will place feet on floor, whereas shorter individuals will place feet on feet bars. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(686,715,'See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(687,717,'See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(688,718,'Exercise can be performed without added weight until more resistance is needed. Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. See Arm Position During Waist Exercises and Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(689,719,'Exercise can be performed without added weight until more resistance is needed. Leg elevation keeps pelvis tilted back keeping low back on mat. See Arm Position During Waist Exercises and Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(690,720,'Exercise can be performed without added weight until more resistance is needed. Elevate incline to increase resistance. See Arm Position During Waist Exercises. If no knee support is built in to incline board, ball can be placed under legs as illustrated. Hip and knee flexors may be involved as stabilizers if incline is steep and no calf support is used. See advanced technique and Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(691,721,'Exercise can be performed without added weight until more resistance is needed. Elevate incline to increase resistance. Elbows can also raise up over knees during each Sit-up to increase range of motion. Also see Arm Position During Waist Exercises. If no knee support is built in to incline board, ball can be placed under legs as illustrated. If upper back does not come completely down at end of movement, abdominal muscles may only be isometrically involved in exercise. Pectineus, Adductor Longus, and Brevis do not assist in hip flexion since hips are already initially bent. Knee flexors may be involved as stabilizers if incline is steep and no calf support is used. See Spot Reduction Myth. Also see Dangerous Exercise Essay.',1,'2021-06-27 13:39:40',NULL,NULL,0),(692,722,'Exercise can be performed without added weight until more resistance is needed. Incline can also be elevated to increase resistance. See Arm Position During Waist Exercises. Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. If upper back does not come completely down at end of movement, abdominal muscles may only be isometrically involved in exercise. Pectineus, Adductor Longus, and Brevis do not assist in hip flexion since hips are already initially bent. Knee flexors may be involved as stabilizers if incline is steep and no calf support is used. See Spot Reduction Myth. Also see Dangerous Exercise Essay.',1,'2021-06-27 13:39:40',NULL,NULL,0),(693,723,'If ball is positioned lower than upper chest (eg: over waist), effective resistance dramatically diminishes. See how length of lever arm affects resistance. Movement can be made easier by positioning hips low on ball. In contrast, exercise can be made more challenging by using positioning ball lower on back and hips higher. Some individuals may experience low back discomfort if hips are not bent so they must use smaller ball size or lower their hip position on ball. See Arm Position During Waist Exercises and Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(694,724,'Exercise can be performed without added weight until more resistance is needed. Elevate incline to increase resistance. See Arm Position During Waist Exercises. Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. Hip and knee flexors may be involved as stabilizers if incline is steep and no calf support is used. Also see intermediate technique. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(695,726,'Intensity can be increased by using heavier medicine ball,\nby performing movement faster, using\noverhead throwing motion. If upper back does not come completely down\nat end of movement, abdominal muscles may only be\nisometrically\ninvolved in exercise. See similar plyometric movement: Medicine Ball Situp (with partner). See Spot Reduction Myth and Dangerous Exercise Essay.',1,'2021-06-27 13:39:40',NULL,NULL,0),(696,725,'Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. Exercise can be performed without added weight until more resistance is needed. Movement can be made easier by positioning hips low on ball. In contrast, exercise can be made more challenging by using positioning ball lower on back and hips higher. Some individuals may experience low back discomfort if hips are not bent so they must use smaller ball size or lower their hip position on ball. See Arm Position During Waist Exercises and Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(697,727,'Feet can be held down by partner instead of foot bar. Exercise can be performed without added weight until more resistance is needed. Exercise can be performed on incline board to increase resistance or decline board to decrease resistance. See Arm Position During Waist Exercises. Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. If upper back does not come completely down at end of movement, abdominal muscles may only be isometrically involved in exercise. Pectineus, Adductor Longus, and Brevis do not assist in hip flexion since hips are already initially bent. See Spot Reduction Myth. Also see Dangerous Exercise Essay.',1,'2021-06-27 13:39:40',NULL,NULL,0),(698,728,'If feet are close to hips, bent arms can be lifted above knees, allowing for complete range of motion resulting in a more bell shaped resistance curve (ie: lessened resistance at top of movement) due to more varying force vectors against gravity. The same can be accomplished by placing feet slightly further away from hips, requiring no need to lift arms above knees (as shown).',1,'2021-06-27 13:39:40',NULL,NULL,0),(699,729,'Intensity can be increased by using heavier medicine ball or by performing movement faster. Movement can be made easier by using chest throw motion. If upper back does not come completely down at end of movement, abdominal muscles may only be isometrically involved in exercise. See similar plyometric movement: Medicine Ball Situp (with partner). See Spot Reduction Myth and Dangerous Exercise Essay.',1,'2021-06-27 13:39:40',NULL,NULL,0),(700,730,'Exercise can be performed without added weight until more resistance is needed. Rectus Abdominis and Obliques dynamically contract only if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only isometrically contract to stabilize pelvis and waist during hip flexion; see Weighted Vertical Leg Raise. It may be necessary to completely flex hips before waist flexion is possible. See Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(701,731,'Exercise can be performed without added weight until more resistance is needed. Rectus Abdominis and Obliques dynamically contract only if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only isometrically contract to stabilize pelvis and waist during hip flexion; see Weighted Vertical Leg Raise. It may be necessary to completely flex hips before waist flexion is possible. See Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(702,732,'This exercise is alternative to Vertical Leg-hip Raise when apparatus is not available, or Hanging Leg-hip Raise when high bar is not available or too low to allow for adequate leg clearance. Exercise can be performed without added weight until more resistance is needed. Rectus Abdominis and Obliques dynamically contract only if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only isometrically contract to stabilize pelvis and waist during hip flexion; see Weighted Vertical Leg Raise on parallel bars. It may be necessary to completely flex hips before waist flexion is possible. See Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(703,733,'Exercise can be performed without added weight until more resistance is needed. When raising hips, keep knees fully flexed, so as not to throw weight of lower legs over head. Rectus Abdominis and Obliques dynamically contract only if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only isometrically contract to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible. See Spot Reduction Myth and Lower Ab Myth. Also see Weighted Incline Leg Raise.',1,'2021-06-27 13:39:40',NULL,NULL,0),(704,734,'Exercise can be performed without added weight until more resistance is needed. Also see Hanging Leg Hip Raise with Ab Straps. Rectus Abdominis and Obliques dynamically contract only if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only isometrically contract to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible. See Spot Reduction Myth and Lower Ab Myth. Also Weighted Hanging Leg Raise.',1,'2021-06-27 13:39:40',NULL,NULL,0),(705,735,'Exercise can be performed without added weight until more resistance is needed. Certain individuals ma\n\n\ny need to keep their neck in neutral position with space between their chin and sternum. See Spot Reduction Myth and Arm Position During Waist Exercises.',1,'2021-06-27 13:39:40',NULL,NULL,0),(706,736,'Exercise can be performed without added weight until more resistance is needed. See Arm Position During Waist Exercises. Elevate incline to increase resistance. If no knee support is built in to incline board, ball can be placed under legs as illustrated.',1,'2021-06-27 13:39:40',NULL,NULL,0),(707,737,'To allow for full range of motion, grip height on strap should not allow weight to bottom out (weights touching stack) when shoulders are back. Padded hump should be adjusted to height of low back. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(708,738,'Seat can also be locked straight or to one side. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(709,739,'Exercise can be performed without added weight until more resistance is needed. Elevate incline to increase resistance. When raising hips, keep knees fully flexed, so as not to throw weight of lower legs over head.',1,'2021-06-27 13:39:40',NULL,NULL,0),(710,740,'Exercise can be performed without added weight until more resistance is needed. Elevate incline to increase resistance. See Arm Position During Waist Exercises. Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. If upper back does not come completely down at end of movement, abdominal muscles may only be isometrically involved in exercise. Pectineus, Adductor Longus, and Brevis do not assist in hip flexion since hips are already initially bent. Knee flexors may be involved as stabilizers if incline is steep and no calf support is used. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(711,741,'If weight is held behind head, position head hanging off bench. See Spot Reduction Myth. Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. See Arm Position During Waist Exercises.',1,'2021-06-27 13:39:40',NULL,NULL,0),(712,742,'Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. Exercise can be performed without added weight until more resistance is needed. Movement can also be made easier by po\n\n\nsitioning hip low on ball or by using no added weight. In contrast, exercise can be made more challenging by positioning hip higher on ball. In which case, feet may be placed against base of wall for stability. Also see Spot Reduction Myth and Arm Position During Waist Exercises.',1,'2021-06-27 13:39:40',NULL,NULL,0),(713,743,'Crossed arms can also be brought up above knees at top to increase range of motion. Exercise can be performed without added weight until more resistance is needed. Elevate incline to increase resistance. See Arm Position During Waist Exercises. If no knee support is built in to incline board, ball can be placed under legs as illustrated. Elbows can be raised over opposing knees for fuller range of motion. If upper back does not come completely down at end of movement, abdominal muscles may only be isometrically involved in exercise. Pectineus, Adductor Longus, and Brevis do not assist in hip flexion since hips are already initially bent. Knee flexors may be involved as stabilizers if incline is steep and no calf support is used. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(714,744,'Certain individuals may need to keep their neck in neutral position with space between their chin and sternum, particularly if hands are placed behind head. See Spot Reduction Myth. Also see Curl-up / Half Sit-up Test.',1,'2021-06-27 13:39:40',NULL,NULL,0),(715,746,'Feet can be held down by partner instead of foot bar. Exercise can be performed without added weight until more resistance is needed. Add more weight or perform on incline board to increase resistance. Also see Arm Position During Waist Exercises. Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. Also see exercise with weight placed on chest. If upper back does not come completely down at end of movement, abdominal muscles may only be isometrically involved in exercise. Pectineus, Adductor Longus, and Brevis do not assist in hip flexion since hips are already initially bent. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(716,745,'Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(717,747,'Leg elevation keeps pelvis tilted back, keeping low back on mat. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(718,748,'Weight can be held behind neck. Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. Exercise can be performed without added weight until more resistance is needed. Movement can be made easier by positioning hips low on ball. In contrast, exercise can be made more challenging by positioning ball lower on back and hips higher. Some individuals may experience low back discomfort if hips are not bent, so they must use smaller ball size or lower their hip position on ball. See Arm Position During Waist Exercises and Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(719,749,'Exercise can be performed without added weight until more resistance is needed. Add more weight or perform on incline board to increase resistance. Also see Arm Position During Waist Exercises and movement with weight placed behind head. If upper back does not come completely down at end of movement, abdominal muscles may only be isometrically involved in exercise. Pectineus, Adductor Longus, and Brevis do not assist in hip flexion since hips are already initially bent. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(720,750,'Hip may move slightly during exercise. Exercise can be performed with added resistance if needed, by holding weight above. Quadriceps were not listed under stabilizers since they are not under significant resistance. Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. See Arm Position During Waist Exercises and Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(721,751,'Begin each repetition with upper back on floor to allow abdominal muscles to work dynamically. The Rectus Abdominis and Obliques dynamically contract only when actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only isometrically contract to stabilize pelvis and waist during hip flexion. See Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(722,752,'If no knee support is built in to incline board, ball can be placed under legs. Hip and knee flexors may be involved as stabilizers if incline is steep and no calf support is used. Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(723,753,'Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. Some individuals may experience low back discomfort if hips are not bent so they must use smaller ball size or lower their hip position on ball. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(724,755,'If no knee support is built in to incline board, ball can be placed under legs. Hip and knee flexors may be involved as stabilizers if incline is steep and no calf support is used. See Spot Reduction Myth .',1,'2021-06-27 13:39:40',NULL,NULL,0),(725,757,'Attempt to decrease shoulder flexion during movement. Rectus Abdominis and Obliques only dynamically contract if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only isometrically contract to stabilize pelvis and waist during hip flexion. Waist flexion will occur earlier in lift if legs are straighter or Hamstrings are not that flexible. Also known as \'Toes-to-Bar\' or \'\n\n\nStrict Toes-to-Bar\'. See Spot Reduction Myth and Lower Ab Myth. Also Weighted Hanging Straight Leg Raise.',1,'2021-06-27 13:39:40',NULL,NULL,0),(726,759,'When raising hips, keep knees fully flexed, so as not to throw weight of lower legs over head. Rectus Abdominis and Obliques dynamically contract only if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only isometrically contract to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible. See Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(727,756,'Exercise can be performed without ab straps just by hanging from bar. Rectus Abdominis and Obliques only dynamically contract if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only isometrically contract to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible. See Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(728,758,'When raising hips, keep knees fully flexed, so as not to throw weight of lower legs over head. Rectus Abdominis and Obliques dynamically contract only if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only isometrically contract to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible. See Spot Reduction Myth and Lower Ab Myth. Also see Incline Leg Raise.',1,'2021-06-27 13:39:40',NULL,NULL,0),(729,754,'Some individuals may experience low back discomfort if hips are not bent so they must use smaller ball size or lower their hip position on ball. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(730,760,'This exercise is alternative to Vertical Leg-hip Raise when apparatus is not available, or Hanging Leg-hip Raise when high bar is not available or too low to allow for adequate leg clearance. Rectus Abdominis and Obliques dynamically contract only if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only isometrically contract to stabilize pelvis and waist during hip flexion; see Weighted Vertical Leg Raise on parallel bars. It may be necessary to completely flex hips before waist flexion is possible. See Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(731,761,'When raising hips, keep knees fully flexed, so as not to throw weight of lower legs over head. Rectus Abdominis and Obliques dynamically contract only if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only isometrically contract to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible. See Spot Reduction Myth and Lower Ab Myth. Also Incline Leg-Hip Raise on incline board.',1,'2021-06-27 13:39:40',NULL,NULL,0),(732,763,'This exercise is alternative to Hanging Straight Leg-Hip Raise when high bar is not available or too low to allow for adequate leg clearance. Rectus Abdominis and Obliques dynamically contract only if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only isometrically contract to stabilize pelvis and waist during hip flexion; see Weighted Vertical Leg Raise on parallel bars. It may be necessary to completely flex hips before waist flexion is possible. Waist flexion will occur earlier in lift if legs are straighter or Hamstrings are not that flexible. See Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(733,765,'Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. If no knee support is built in to incline board, ball can be placed under legs. If upper back does not come completely down at end of movement, abdominal muscles may only be isometrically involved in exercise. Pectineus, Adductor Longus, and Brevis do not assist in hip flexion since hips are already initially bent. Knee flexors may be involved as stabilizers if incline is steep and no calf support is used. See Spot Reduction Myth. Also see Dangerous Exercise Essay.',1,'2021-06-27 13:39:40',NULL,NULL,0),(734,762,'Rectus Abdominis and Obliques dynamically contract only if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only isometrically contract to stabilize pelvis and waist during hip flexion; see Weighted Vertical Leg Raise. It may be necessary to completely flex hips before waist flexion is possible. See Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(735,764,'Rectus Abdominis and Obliques dynamically contract only if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only isometrically contract to stabilize pelvis and waist during hip flexion; see Weighted Vertical Leg Raise. It may be necessary to completely flex hips before waist flexion is possible. See Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(736,766,'If no knee support is built in to incline board, ball can be placed under legs. If upper back does not come completely down at end of movement, abdominal muscles may only be isometrically involved in exercise. Pectineus, Adductor Longus, and Brevis do not assist in hip flexion since hips are already initially bent. Knee flexors may be involved as stabilizers if incline is steep and no calf support is used. See Spot Reduction Myth. Also see Dangerous Exercise Essay.',1,'2021-06-27 13:39:40',NULL,NULL,0),(737,767,'See Arm Position During Waist Exercises.',1,'2021-06-27 13:39:40',NULL,NULL,0),(738,768,'Feet can be held down by partner instead of foot bar. Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. If upper back does not come completely down at end of movement, abdominal muscles may only be isometrically involved in exercise. Pectineus, Adductor Longus, and Brevis do not assist in hip flexion since hips are already initially bent. See Spot Reduction Myth. Also see Dangerous Exercise Essay.',1,'2021-06-27 13:39:40',NULL,NULL,0),(739,769,'If upper back does not come completely down at end of movement, abdominal muscles may only be isometrically involved in exercise. Pectineus, Adductor Longus, and Brevis do not assist in hip flexion since hips are already initially bent. See Spot Reduction Myth. Also see Dangerous Exercise Essay.',1,'2021-06-27 13:39:40',NULL,NULL,0),(740,771,'See Suspended Prone Feet Mount/Dismount. Keep shins close to horizontal and arms straight with shoulders positioned above hands. Dismount by removing straps while kneeling or after sitting on one side of hip before rotating body to seated position. This exercise can be performed on TRXⓇ style suspension trainer.',1,'2021-06-27 13:39:40',NULL,NULL,0),(741,772,'If upper back does not come completely down at end of movement, abdominal muscles may only be isometrically involved in exercise. Pectineus, Adductor Longus, and Brevis do not assist in hip flexion since hips are already initially bent. See Spot Reduction Myth. Also see Dangerous Exercise Essay.',1,'2021-06-27 13:39:40',NULL,NULL,0),(742,775,'None.',1,'2021-06-27 13:39:40',NULL,NULL,0),(743,773,'See Suspended Supine Feet Mount/Dismount. Abdominals are exercised during spinal flexion , whereas, Erector Spinae is exercised during spinal extension. See Spot Reduction Myth and Lower Ab Myth. This exercise can be performed on TRXⓇ style suspension trainer.',1,'2021-06-27 13:39:40',NULL,NULL,0),(744,774,'Keep knees straight throughout movement. Begin each repetition with upper back on floor to allow abdominal muscles to work dynamically. The Rectus Abdominis and Obliques dynamically contract only when actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only isometrically contract to stabilize pelvis and waist during hip flexion. See Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(745,776,'See Suspended Prone Feet Mount/Dismount . Keep shins close to horizontal and arms straight with shoulders positioned above hands. Dismount by removing straps, while kneeling or after sitting on one side of hip before rotating body to seated position. This exercise can be performed on TRXⓇ style suspension trainer.',1,'2021-06-27 13:39:40',NULL,NULL,0),(746,778,'Muscles are exercised isometrically. Exercise can also be performed with straight supporting arms in pushup stance. Also see Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(747,779,'For beginners or those with less flexibility, position forearms on floor. Arms can also be positioned somewhat bent as an intermediate version of this stretch. Also known as Cobra pose in yoga.',1,'2021-06-27 13:39:40',NULL,NULL,0),(748,780,'The lying (supine) stretch may be more appropriate for certain populations than other more advanced abdominal stretches .',1,'2021-06-27 13:39:40',NULL,NULL,0),(749,781,'Pelvis may anteriorly rotate slightly.',1,'2021-06-27 13:39:40',NULL,NULL,0),(750,782,'Exercise is typically performed isometrically but can also be performed dynamically. Exercise can be performed in most any posture, eg: seated, standing, etc.\n\n\nSee Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(751,783,'See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(752,784,'Place feet wide for support, or if straddling bench, slightly squeeze legs on sides of bench to prevent shifting. Upper body stabilizing occurs primarily on far side through isometric shoulder abduction and isometric scapular upward rotation. Upper body stabilization also occurs somewhat on near side through shoulder protraction. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(753,785,'Slightly squeeze legs on sides of bench to prevent shifting. Bench should be far enough away from cable pulley so cable is taut when stirrup is turned back toward cable pulley. See side view and Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(754,787,'Note movement occurs in waist, not hips. See Spot Reduction Myth. Hyperextension of spine at top of motion is achieved by anterior rotation of pelvis with flexed hips. Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. If two soft stirrups are used instead of rope attachment, grasp stirrups at side of head.',1,'2021-06-27 13:39:40',NULL,NULL,0),(755,788,'Keep stirrup attachment near side of shoulder with elbow down to side. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(756,789,'To allow for full range of motion, grip height on strap should not allow weight to bottom out (weights touching stack) when shoulders are back. Padded hump should be adjusted to height of low back. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(757,790,'Both arms should be kept straight and perpendicular to torso. Hips should also be kept nearly straight, only slightly bent. Also see other view.',1,'2021-06-27 13:39:40',NULL,NULL,0),(758,791,'Both arms should be horizontal and straight. This movement arguably involves more hip internal rotation and transverse adduction than spinal rotation. Although it is considered oblique movement, remarkably little rotation actually occurs through spine, although rotators of spine act largely as stabilizers except at very beginning and end of motion where resistance from cable is minimal. A large part of rotational force actually occurs through rotation/transverse adduction of forward hip. Because rear leg is only supported by forefoot, hip of forward leg is utilized much greater than hip of rear leg since forward leg offers more secured base of support. Continued rotation would occur through spine except when cable makes contact with body precluding further movement and resistance would no longer be provided through cable since line of force is no longer perpendicular line of pull. Seated oblique exercises or those exercises where hips are stabilized allow for greater range of movement through spine. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(759,792,'Both arms should be straight following diagonal path upward. Both arms should be horizontal and straight. This movement arguably involves more hip internal rotation and transverse adduction than spinal rotation. Although it is considered oblique movement, remarkably little rotation actually occurs through spine, although rotators of spine act largely as stabilizers except at very beginning and end of motion where resistance from cable is minimal. A large part of rotational force actually occurs through rotation/transverse adduction of forward hip. Because rear leg is only supported by forefoot, hip of forward leg is utilized much greater than hip of rear leg since forward leg offers more secured base of support. Continued rotation would occur through spine except cable when makes contact with body, precluding further movement and resistance would no longer be provided through cable since line of force is no longer perpendicular to line of pull. Seated oblique exercises or those exercises where hips are stabilized allow for greater range of movement through spine. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(760,793,'Both arms should be straight following diagonal path downward. This movement arguably involves more hip internal rotation and transverse adduction than spinal rotation. Although it is considered oblique movement, remarkably little rotation actually occurs through spine, although rotators of spine act largely as stabilizers except at very beginning and end of motion where resistance from cable is minimal. A large part of rotational force actually occurs through rotation/transverse adduction of forward hip. Because rear leg is only supported by forefoot, hip of forward leg is utilized much greater than hip of rear leg since forward leg offers more secured base of support. Continued rotation would occur through spine except when cable would make contact with body precluding further movement and resistance would no longer be provided through cable since line of force is no longer perpendicular line of pull. Seated oblique exercises or those exercises where hips are stabilized allow for greater range of movement through spine. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(761,794,'See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(762,795,'Both arms should be kept straight and perpendicular to torso. Hips should also be kept nearly straight, only slightly bent. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(763,796,'Maintain shoulder fixed at approximately 90º so upper arm and upper back are perpendicular. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(764,797,'Weight plates added to upper segment adds resistance, whereas, weight plates added to lower segment decreases resistance. Seat can also be oriented straight. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(765,800,'See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(766,799,'See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(767,801,'Keep arm holding dumbbell approximately vertical (below shoulder) throughout movement. See Spot Reduction Myth and Arm Position During Waist Exercises.',1,'2021-06-27 13:39:40',NULL,NULL,0),(768,802,'See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(769,803,'Greater surface area of torso resting padded lever supports significantly reduces involvement of upper body stablizing muscles as compared to Lever Seated Twist. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(770,805,'See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(771,806,'If low back does flex near top of motion, abdominal muscles may only be isometrically involved in exercise. Pectineus, Adductor Longus, and Brevis do not assist in hip flexion since hips are already initially bent. See Leg Hip Raise with sled pad can also be positioned straight. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(772,809,'Stand on platform if lever is too high to allow for full range of movement. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(773,808,'Maintain shoulders fixed at approximately 90º so upper arm and upper back are perpendicular. Men should keep chest close to padded lever. Women may choose to position chest as close as possible without making contact with inside of padded bar. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(774,810,'Maintain knee position throughout movement. For less resistance, do not use additional weight (See Bent-knee lying Twist without ball). See Spot Reduction Myth. Also see Lying Twist with exercise ball.',1,'2021-06-27 13:39:40',NULL,NULL,0),(775,812,'See Spot Reduction Myth and Arm Position During Waist Exercises.',1,'2021-06-27 13:39:40',NULL,NULL,0),(776,811,'Maintain knee position throughout movement. For less resistance, bend knees more and/or do not use additional weight. See Spot Reduction Myth. Also see Bent-knee Lying Twist.',1,'2021-06-27 13:39:40',NULL,NULL,0),(777,813,'Both arms should be kept straight and perpendicular to torso. Hips should also be kept nearly straight, only slightly bent. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(778,817,'Exercise can be performed without added weight until more resistance is needed. Movement can also be made easier by positioning hip low on ball. In contrast, exercise can be made more challenging by positioning hip higher on ball. In which case, feet may be placed against base of wall for stability. See alternative form. Also see Spot Reduction Myth and Arm Position During Waist Exercises.',1,'2021-06-27 13:39:40',NULL,NULL,0),(779,828,'One of very few body weight exercises that directly exercises side deltoid in relatively full range of motion. In addition to lateral flexion of spine, lower hip abducts and upper hip adducts. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(780,826,'Begin with very light weight and add additional weight gradually to allow lower back adequate adaptation. Throughout lift, keep weighted arm and knees straight. Do not pause or bounce at bottom of lift or jerk weight from floor. Lower back may bend slightly during full hip flexion or it can be kept straight. Do not lower weight beyond mild stretch throughout hamstrings and low back. Full rang\n\n\ne of motion will vary from person to person depending on flexibility. See Dangerous Exercise Essay and Kettlebell Straight-leg Deadlift.',1,'2021-06-27 13:39:40',NULL,NULL,0),(781,827,'Maintain knee position throughout movement. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(782,829,'Maintain knee position throughout movement. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(783,830,'In addition to lateral flexion of spine, lower hip abducts and upper hip adducts. Exercise can also be performed isometrically, see Side Plank. Also see Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(784,831,'In addition to lateral flexion of spine, lower hip abducts and upper hip adducts. Exercise can also be performed isometrically, see Bent Knee Side Plank. Gracilis of upper leg enters into active insufficiency with hip extended and knee flexed. Also see Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(785,832,'See alternative form. Also see Spot Reduction Myth and Arm Position During Waist Exercises.',1,'2021-06-27 13:39:40',NULL,NULL,0),(786,833,'See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(787,835,'If upper back does not come completely down at end of movement, abdominal muscles may only be isometrically involved in exercise. Pectineus, Adductor Longus, and Brevis do not assist in hip flexion since hips are already initially bent. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(788,834,'Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. If no knee support is built in to incline board, ball can be placed under legs. Hip and knee flexors may be involved as stabilizers if incline is steep and no calf support is used. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(789,836,'Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. If no knee support is built in to incline board, ball can be placed under legs. If upper back does not come completely down at end of movement, abdominal muscles may only be isometrically involved in exercise. Pectineus, Adductor Longus, and Brevis do not assist in hip flexion since hips are already initially bent. Knee flexors may be involved as stabilizers if incline is steep and no calf support is used. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(790,837,'Feet can be held down by partner instead of foot bar. Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. If upper back does not come completely down at end of movement, abdominal muscles may only be isometrically involved in exercise. Pectineus, Adductor Longus, and Brevis do not assist in hip flexion since hips are already initially bent. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(791,838,'If no knee support is built in to incline board, ball can be placed under legs. Hip and knee flexors may be involved as stabilizers if incline is steep and no calf support is used. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(792,839,'Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. If no knee support is built in to incline board, ball can be placed under legs. If upper back does not come completely down at end of movement, abdominal muscles may only be isometrically involved in exercise. Pectineus, Adductor Longus, and Brevis do not assist in hip flexion since hips are already initially bent. Knee flexors may be involved as stabilizers if incline is steep and no calf support is used. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(793,841,'Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(794,840,'Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. Some individuals may experience low back discomfort if hips are not bent, so they must use smaller ball size or lower their hip position on ball. Also Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(795,842,'Suspension handle(s) can also be gripped with both hands together with either one hand over other hand or with interlaced fingers. In addition to lateral flexion of spine, lower hip abducts and upper hip adducts. Also see Spot Reduction Myth. This exercise can be performed on TRXⓇ style suspension trainer or adjustable length gymnastics rings.',1,'2021-06-27 13:39:40',NULL,NULL,0),(796,843,'Leg elevation keeps pelvis tilted back keeping low back on mat. Certain individuals may need to keep their neck in neutral position with space between their chin and sternum, particularly with their hands are behind their heads. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(797,844,'In addition to lateral flexion of spine, lower hip abducts and upper hip adducts. This exercise can be performed on TRXⓇ style suspension trainer. More popular suspension trainers allow limited slippage, so loop around lower leg can be positioned below loop of upper leg once on side (as shown). Other models can be adjusted, so strap on lower leg is slightly longer than strap on upper leg. Also see Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(798,845,'The exercise can also be mounted from top position in fully rotated position facing perpendicular to suspension straps while positioning feet parallel to straps. Exercise can also be executed by alternating sides, rotating from one side to the other. Dismounting can be achieved either at top of movement when body is fully rotated or hanging at bottom position by walking backward until body is upright. This exercise can be performed on TRXⓇ style suspension trainer or adjustable length gymnastics rings.',1,'2021-06-27 13:39:40',NULL,NULL,0),(799,847,'See Suspended Prone Feet Mount/Dismount. Keep arms straight with shoulders positioned above hands. Dismount by removing straps while kneeling or after sitting on one side of hip, before rotating body to seated position. This exercise can be performed on TRXⓇ style suspension trainer.',1,'2021-06-27 13:39:40',NULL,NULL,0),(800,846,'Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. Some individuals may experience low back discomfort if hips are not bent, so they must use smaller ball size or lower their hip position on ball. Also see Spot Reduction Myth and Arm Position During Waist Exercises.',1,'2021-06-27 13:39:40',NULL,NULL,0),(801,848,'Leg elevation keeps pelvis tilted back keeping low back on mat. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(802,849,'Maintain 90° flexion in hip with both shoulders flat on floor.',1,'2021-06-27 13:39:40',NULL,NULL,0),(803,850,'Also see Pretzel Stretch for Hip Abductors for similar exercise which can be performed with this stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(804,851,'Allow foot of top leg to rest on foot of lower leg. Shoulders can turn away from direction of knees for greater stretch if needed.',1,'2021-06-27 13:39:40',NULL,NULL,0),(805,852,'Keep both shoulders on floor or mat. Allow foot of top leg to rest on foot of lower leg. Arms can be extended to sides.',1,'2021-06-27 13:39:40',NULL,NULL,0),(806,853,'Muscles are exercised isometrically. Movement can also be performed dynamically, moving hip up and down, see Side Bridge. Exercise can also be performed with straight supporting arm. Also see Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(807,854,'Muscles are exercised isometrically. Movement can also be performed dynamically, moving hip up and down, see Bent Knee Side Bridge. Gracilis of upper leg is in active insufficiency with hip extended and knee flexed. Also see Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(808,855,'Adjust lower leg brace so pressure is evenly distributed on thigh pad. Begin with body weight and add additional weight gradually to allow lower back adequate adaptation. Maintain barbell\'s position on back of shoulders when upper body is lowered. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch throughout hamstrings and low back. Full range of motion will vary from person to person. Although articulation of waist is emphasized, some hip extension may accommodate movement. Also see Barbell Hyper-extension and Barbell Back Raise.',1,'2021-06-27 13:39:40',NULL,NULL,0),(809,856,'Target muscle is exercised \n\nisometrically\n\n. Begin with very light weight and add additional weight gradually to allow adequate adaptation. Throughout lift, keep back straight. Knees will have to bend more in those with less hamstring flexibility. Knees can be kept bent throughout movement. Also see straight leg Goodmorning, emphasizing Hamstrings.',1,'2021-06-27 13:39:40',NULL,NULL,0),(810,857,'Target muscle is exercised isometrically. Throughout lift, keep hips low, shoulders high, arms and back straight. Knees should point same direction as feet throughout movement. Keep bar close to body to improve mechanical lev erage. Grip strength and strength endurance often limit ability to perform multiple reps at heavy resistances. Gym chalk, wrist straps, grip work, and mixed grip can be used to enhance grip. Mixed grip indicates one hand holding with overhand grip and other hand holding with underhand grip. Lever barbell jack can be used to lift barbell from floor for easier loading and unload of weight plates.',1,'2021-06-27 13:39:40',NULL,NULL,0),(811,858,'Adjust lower leg brace so pressure is evenly distributed on thigh pad. Begin with body weight and add additional weight gradually to allow lower back adequate adaptation. Maintain barbell\'s position on back of shoulders when upper body is lowered. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch throughout hamstrings and low back. Full range of motion will vary from person to person. Also see Barbell Back Extension and Barbell Hip Extension.',1,'2021-06-27 13:39:40',NULL,NULL,0),(812,860,'Position pad high enough to evenly distribute body weight on thigh but not so high that range of motion is limited; abdomen should not press on top side of pad when upper body is lowered. Begin with body weight and add additional weight gradually to allow lower back adequate adaptation. Maintain barbell\'s position on back of shoulders when upper body is lowered. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch throughout hamstrings and low back. Full range of motion will vary from person to person. Also see Barbell Back Extension and Barbell Hip Extension.',1,'2021-06-27 13:39:40',NULL,NULL,0),(813,859,'Target muscle is exercised isometrically. Heavy barbell deadlifts significantly engages Latissmus Dorsi.',1,'2021-06-27 13:39:40',NULL,NULL,0),(814,861,'Position pad high enough to evenly distribute body weight on thigh but not so high that range of motion is limited; abdomen should not press on top side of pad when upper body is lowered. Begin with body weight and add additional weight gradually to allow lower back adequate adaptation. Maintain barbell\'s position on back of shoulders when upper body is lowered. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch throughout hamstrings and low back. Full range of motion will vary from person to person. Although articulation of waist is emphasized, some hip extension may accommodate movement. Also see Barbell Hyperextension and Barbell Back Raise.',1,'2021-06-27 13:39:40',NULL,NULL,0),(815,862,'Throughout lift, keep hips low, shoulders high, arms and back straight. Knees should point same direction as feet throughout movement. Keep bar close to body to improve mechanical leverage. Grip strength and strength endurance often limit ability to perform multiple reps at heavy resistances. Gym chalk, wrist straps, grip work, and mixed grip can be used to enhance grip. Mixed grip indicates one hand holding with overhand grip and other hand holding with underhand grip.',1,'2021-06-27 13:39:40',NULL,NULL,0),(816,864,'Throughout lift, keep hips low, shoulders high, arms and back straight. Knees should point same direction as feet throughout movement. Keep bar close to body to improve mechanical leverage. Grip strength and strength endurance often limit ability to perform multiple reps at heavy resistances. Gym chalk, wrist straps, grip work, and mixed grip can be used to enhance grip. Mixed grip indicates one hand holding with overhand grip and other hand holding with underhand grip. Lever barbell jack can be used to lift barbell from floor for easier loading and unloading of weight plates.',1,'2021-06-27 13:39:40',NULL,NULL,0),(817,863,'Use shoulder width grip since narrower than shoulder width grip will make it more difficult to lockout at top. Throughout lift, keep hips low, shoulders high, arms and back straight, and knees pointed out same direction as feet. Also, keep bar close to body to improve mechanical leverage. With wide stance, push feet out to sides and not down to prevent knees from buckling inward. Pushing knees out will allow hips to travel toward bar more quickly while improving leverage.',1,'2021-06-27 13:39:40',NULL,NULL,0),(818,865,'Throughout lift, keep hips low, shoulders high, arms and back straight. Knees should point same direction as feet throughout movement. Keep bar close to body to improve mechanical leverage. Grip strength and strength endurance often limit ability to perform multiple reps at heavy resistances. Gym chalk, wrist straps, grip work, and mixed grip can be used to enhance grip. Mixed grip indicates one hand holding with overhand grip and other hand holding with underhand grip.',1,'2021-06-27 13:39:40',NULL,NULL,0),(819,866,'Lower back may bend slightly during hip flexion phase. Erector Spinae is exercised isometrically if low back does articulate as with Straight Back Stiff Leg Deadlift (targeting Glutes). Begin with light weight and add additional weight gradually to allow adequate adaptation. Throughout lift, keep arms straight. Knee can be kept bent throughout movement. Do not stand behind pulleys. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch throughout hamstrings and back When finished with set, dismount by lowering weight with knees bent and low back straight. Full range of motion will vary from person to person. Those with less flexibility may have to bend knees more or they may not even need to stand on platform. See Dangerous Exercise Essay. Also see Straight Leg Deadlift.',1,'2021-06-27 13:39:40',NULL,NULL,0),(820,867,'Lower back may bend slightly during full hip flexion. Erector Spinae is exercised isometrically if low back does articulate as with Straight Back Stiff Leg Deadlift (targeting Glutes). Begin with light weight and add additional weight gradually to allow adequate adaptation. Throughout lift keep arms straight. Knee can be kept bent throughout movement. Keep bar over top of feet, close to legs. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch throughout hamstrings. When finished with set, dismount by lowering weight with knees bent and low back straight. Full range of motion will vary from person to person. Those with less flexibility may have to bend knees more or they may not even need to stand on platform. See Dangerous Exercise Essay. Also see Straight Leg Deadlift.',1,'2021-06-27 13:39:40',NULL,NULL,0),(821,868,'Target muscle is exercised isometrically\n\n\n. Throughout lift, keep hips low, shoulders high, arms and back straight.',1,'2021-06-27 13:39:40',NULL,NULL,0),(822,869,'Lower back may bend slightly during full hip flexion. Erector Spinae is exercised isometrically\n\n\nif low back does articulate as with Straight Back Stiff Leg Deadlift (targeting Glutes). Begin with light weight and add additional weight gradually to allow adequate adaptation. Throughout lift, keep arms straight. Knee can be kept bent throughout movement. Keep bar over top of feet, close to legs. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch throughout hamstrings. When finished with set, dismount by lowering weight with knees bent and low back straight. Full range of motion will vary from person to person. Those with less flexibility may have to bend knees more or they may not even need to stand on platform. See Dangerous Exercise Essay. Also see Straight Leg Deadlift.',1,'2021-06-27 13:39:40',NULL,NULL,0),(823,872,'Begin with very light weight and add additional weight gradually to allow lower back adequate adaptation. Throughout lift keep arms and knees straight. Keep dumbbells close to legs. Do not pause or bounce at bottom of lift. Lower back may bend slightly during full hip flexion phase. Do not lower weight beyond mild stretch throughout hamstrings and low back. Full range of motion will vary from person to person depending on flexibility. See Dangerous Exercise Essay.',1,'2021-06-27 13:39:40',NULL,NULL,0),(824,870,'Begin with very light weight and add additional weight gradually to allow lower back adequate adaptation. Throughout lift keep arms and knees straight. Keep bar over top of feet, close to legs. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch throughout hamstrings and low back. Full range of motion will vary from person to person. Choose platform height that allows contact with floor w\n\n \nith slight stretch or set to height that allows bar to be lowered only millimeters from floor during warm up. This small reserve allows additional room to accommodate the hips loosen up and the grip to give slightly but not so much that would increase risk of descending too far down, beyond a slight stretch. Those with less flexibility may not even need to stand on platform. When finished with set, dismount by lowering weight with knees bent and low back straight. See Dangerous Exercise Essay. Also see Straight Back Straight Leg Deadlift.',1,'2021-06-27 13:39:40',NULL,NULL,0),(825,871,'Not all trap bar designs may allow for this movement. A squared open-ended trap bar is used in this demonstration. Begin with very light weight and add additional weight gradually to allow lower back adequate adaptation. Throughout lift, keep arms and knees straight. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch throughout hamstrings and low back. When finished with set, dismount by lowering weight with knees bent and low back straight. Full range of motion will vary from person to person. Those with less flexibility may need lower platform or may not even need to stand on elevated surface. See Dangerous Exercise Essay. Also see Straight Back Straight Leg Deadlift.',1,'2021-06-27 13:39:40',NULL,NULL,0),(826,874,'Begin with very light weight and add additional weight gradually to allow lower back adequate adaptation. Throughout lift, keep arms and knees straight. Do not stand behind pulleys. Do not pause or bounce at bottom of lift. Lower back may bend slightly during full hip flexion phase. Do not lower weight beyond mild stretch throughout hamstrings and low back. Full range of motion will vary from person to person depending on flexibility. See Dangerous Exercise Essay. Also see Straight Back Straight Leg Deadlift.',1,'2021-06-27 13:39:40',NULL,NULL,0),(827,873,'Target muscle is exercised isometrically\n\n\n. Throughout lift, keep hips low, shoulders high, arms and back straight. Exercise can also be performed facing opposite direction toward fulcrum.',1,'2021-06-27 13:39:40',NULL,NULL,0),(828,876,'Apparatus shown does not allow for full spinal flexion, only allowing for last half of spinal extension.',1,'2021-06-27 13:39:40',NULL,NULL,0),(829,877,'To avoid hip movement, push hips back into seat by pushing feet into platform throughout exercise. Position foot platform, so small space remains between edge of seat and back of lower thigh. Use seat belt if it becomes difficult to stabilize hips. See Low Back Debate. Also see exercises on old Nautilus Machine and MedEx Low Back Machine.',1,'2021-06-27 13:39:40',NULL,NULL,0),(830,878,'Lower back may bend slightly during hip flexion phase. Erector Spinae is exercised isometrically if low back does articulate as with Straight Back Stiff Leg Deadlift (targeting Glutes). Begin with light weight and add additional weight gradually to allow adequate adaptation. Throughout lift, keep arms straight. Knee can be kept bent throughout movement. Do not stand behind lever handles. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch throughout hamstrings and back When finished with set, dismount by lowering weight with knees bent and low back straight. Full range of motion will vary from person to person. Those with less flexibility may have to bend knees more or they may not even need to stand on platform. See Dangerous Exercise Essay.',1,'2021-06-27 13:39:40',NULL,NULL,0),(831,879,'Begin with very light weight and add additional weight gradually to allow lower back adequate adaptation. Throughout lift, keep arms and knees straight. Do not stand behind pulleys. Do not pause or bounce at bottom of lift. Lower back may bend slightly during full hip flexion phase. Do not lower weight beyond mild stretch throughout hamstrings and low back. Full range of motion will vary from person to person depending on flexibility. See Dangerous Exercise Essay. Also see Straight Back Straight Leg Deadlift.',1,'2021-06-27 13:39:40',NULL,NULL,0),(832,880,'Throughout lift, keep hips low, shoulders high, arms and back straight. Keep bar close to body to improve mechanical leverage. See Smith Deadlift under Gluteus Maximus. Also see Deadlift Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(833,881,'Lower back may bend slightly during full hip flexion. Erector Spinae is exercised isometrically\n\n\nif low back does articulate as with Straight Back Stiff Leg Deadlift (targeting Glutes). Begin with light weight and add additional weight gradually to allow adequate adaptation. Throughout lift, keep arms straight. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch throughout hamstrings. Full range of motion will vary from person to person. Those with less flexibility may have to bend their knees more or they may not even need to stand on platform. Knee can be kept bent throughout movement. See Dangerous Exercise Essay. Also see Straight Leg Deadlift.',1,'2021-06-27 13:39:40',NULL,NULL,0),(834,884,'Target muscle is exercised isometrically\n\n\n. Begin with light weight and add additional weight gradually to allow adequate adaptation. Throughout lift, keep back straight. Knees will have to bend more with those with less hamstring flexibility. Knees can be kept bent throughout movement. Also see straight leg Goodmorning emphasizing Hamstrings.',1,'2021-06-27 13:39:40',NULL,NULL,0),(835,885,'Begin with very light weight and add additional weight gradually to allow lower back adequate adaptation. Throughout lift, keep arms and knees straight. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch throughout hamstrings and low back. Full range of motion will vary from person to person. Those with less flexibility may not even need to stand on platform. See Dangerous Exercise Essay. Also see Stiff Leg Deadlift.',1,'2021-06-27 13:39:40',NULL,NULL,0),(836,886,'If weight is positioned behind head, neck extensors act as stabilizers:',1,'2021-06-27 13:39:40',NULL,NULL,0),(837,888,'Adjust lower leg brace so pressure is evenly distributed on thigh pad. Begin with body weight and add additional weight gradually to allow lower back adequate adaptation. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch throughout hamstrings and low back. Full range of motion will vary from person to person. Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. See Arm Position During Waist Exercises. Although articulation of waist is emphasized, some hip extension may accommodate movement. If weight is positioned behind head, neck extensors act as stabilizers.',1,'2021-06-27 13:39:40',NULL,NULL,0),(838,889,'If weight is positioned behind head, neck extensors act as stabilizers:',1,'2021-06-27 13:39:40',NULL,NULL,0),(839,890,'Movement can be made easier by using no additional weight or by positioning hips low on ball. In contrast, exercise can be made more challenging by positioning ball lower toward hip. In which case, feet may be placed against base of wall for stability. See Arm Position During Waist Exercises. If weight is positioned behind head, neck extensors act as stabilizers.',1,'2021-06-27 13:39:40',NULL,NULL,0),(840,891,'Position pad high enough to evenly distribute body weight on thigh but not so high that range of motion is limited; abdomen should not press on top side of pad when upper body is lowered. Begin with body weight and add additional weight gradually to allow lower back adequate adaptation. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch throughout hamstrings and low back. Full range of motion will vary from person to person. Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. See Arm Position During Waist Exercises. Although articulation of waist is emphasized, some hip extension may accommodate movement. If weight is positioned behind head, neck extensors act as stabilizers.',1,'2021-06-27 13:39:40',NULL,NULL,0),(841,893,'If no wall is available, hips can be positioned lower on ball and toes can be positioned out wide on floor for balance.',1,'2021-06-27 13:39:40',NULL,NULL,0),(842,892,'If no wall is available, hips can be positioned lower on ball and toes can be positioned out wide on floor for balance.',1,'2021-06-27 13:39:40',NULL,NULL,0),(843,895,'If no wall is available, hips can be positioned lower on ball and toes can be positioned out wide on floor for balance.',1,'2021-06-27 13:39:40',NULL,NULL,0),(844,896,'Lift leg and arm deliberately with no jerking. Also see Alternating Bird Dog.',1,'2021-06-27 13:39:40',NULL,NULL,0),(845,897,'Lift legs and arms deliberately with no jerking. Also see Bird Dog.',1,'2021-06-27 13:39:40',NULL,NULL,0),(846,898,'Platform should be high enough to allow hips to flex without buttocks contacting floor. Full range of motion will vary from person to person. Adductor Magnus may only assist at initial phase hip extension depending on degree of hip flexion at bottom of movement. Also see Hanging Hamstring Bridge for Hamstrings.',1,'2021-06-27 13:39:40',NULL,NULL,0),(847,899,'Lift leg and arm deliberately with no jerking. Also see Bird Dog (on exercise ball).',1,'2021-06-27 13:39:40',NULL,NULL,0),(848,900,'Adjust lower leg brace so pressure is evenly distributed on thigh pad. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch throughout hamstrings and low back. Full range of motion will vary from person to person.',1,'2021-06-27 13:39:40',NULL,NULL,0),(849,901,'Lift leg and arm deliberately with no jerking. Also see Alternating Bird Dog (one exercise ball).',1,'2021-06-27 13:39:40',NULL,NULL,0),(850,902,'Lift legs and upper body slowly with no jerking or fast movements. Also see Contralateral Superman.',1,'2021-06-27 13:39:40',NULL,NULL,0),(851,903,'Lift legs and arms deliberately with no jerking. Also see bilateral movement: Superman.',1,'2021-06-27 13:39:40',NULL,NULL,0),(852,904,'Adjust lower leg brace so pressure is evenly distributed on thigh pad. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch throughout hamstrings and low back. Full range of motion will vary from person to person. Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. If hands are positioned behind head, neck extensors act as stabilizers:',1,'2021-06-27 13:39:40',NULL,NULL,0),(853,905,'Adjust lower leg brace so pressure is evenly distributed on thigh pad. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch throughout hamstrings and low back. Full range of motion will vary from person to person.',1,'2021-06-27 13:39:40',NULL,NULL,0),(854,906,'Also see Cat Movement.',1,'2021-06-27 13:39:40',NULL,NULL,0),(855,907,'Muscles are exercised isometrically.',1,'2021-06-27 13:39:40',NULL,NULL,0),(856,908,'None',1,'2021-06-27 13:39:40',NULL,NULL,0),(857,909,'Also see Cat Stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(858,910,'Upper back can also be lifted off of floor to stretch Splenius and cervical portion of Erector Spinae.',1,'2021-06-27 13:39:40',NULL,NULL,0),(859,911,'Elbows can be lowered to floor.',1,'2021-06-27 13:39:40',NULL,NULL,0),(860,912,'None',1,'2021-06-27 13:39:40',NULL,NULL,0),(861,913,'An alternative mount involves stepping back with suspension handles in hands until arms are pulled forward about 45° (give or take) from resting position. At this point, recline body back, then fold at hips, allowing rear end to fall far back with arms and shoulders stretched forward. Dismounting can be achieved by walking backward until body is upright. This exercise can be performed on TRXⓇ style suspension trainer or adjustable length gymnastics rings.',1,'2021-06-27 13:39:40',NULL,NULL,0),(862,915,'Muscles are exercised isometrically.',1,'2021-06-27 13:39:40',NULL,NULL,0),(863,916,'None',1,'2021-06-27 13:39:40',NULL,NULL,0),(864,917,'Keep knees pointed same direction as toes. The Soleus may be slightly stretched before leaning back.',1,'2021-06-27 13:39:40',NULL,NULL,0),(865,918,'Avoid overstressing neck anteriorly.',1,'2021-06-27 13:39:40',NULL,NULL,0),(866,919,'Begin with very light weight and add additional weight gradually to allow adequate adaptation. Throughout lift, keep back straight. Hamstrings will be emphasized if knees are straight.',1,'2021-06-27 13:39:40',NULL,NULL,0),(867,926,'Throughout lift, keep arms and back straight. Do not lower weight beyond mild stretch throughout hamstrings. Full range of motion will vary from person to person. Those with less flexibility may need to bend knee of supporting leg more so barbell can contact floor. At top of movement, lifted foot can make contact with floor to maintain balance between repetitions.',1,'2021-06-27 13:39:40',NULL,NULL,0),(868,929,'Throughout lift, keep arms and back straight. Do not lower weight beyond mild stretch throughout hamstrings. Full range of motion will vary from person to person. Stand on shallow platform if weight reaches floor before stretch. Those with less flexibility may have to bend knees more. Knees can be kept bent throughout movement. Also see Stiff Leg Deadlift and Romanian Deadlift.',1,'2021-06-27 13:39:40',NULL,NULL,0),(869,930,'Use bench of lower height 16\" to 18\" (40 to 46 cm) allowing torso to be angled approximately 45º. Bench may need to be secured so it does not slide on floor.',1,'2021-06-27 13:39:40',NULL,NULL,0),(870,931,'Keep torso upright during squat; flexible hip flexors are important. Forward knee should point same direction as foot throughout movement. Also known as Bulgarian Squat.',1,'2021-06-27 13:39:40',NULL,NULL,0),(871,933,'Keep torso upright during lunge; flexible hip flexors are important. Forward knee should point same direction as foot throughout lunge. A long lunge emphasizes Gluteus Maximus; short lunge emphasizes Quadriceps.',1,'2021-06-27 13:39:40',NULL,NULL,0),(872,932,'Keep torso upright during lunge; flexible hip flexors are important. Lead knee should point same direction as foot throughout lunge. A long lunge emphasizes Gluteus Maximus; short lunge emphasizes Quadriceps.',1,'2021-06-27 13:39:40',NULL,NULL,0),(873,935,'Keep torso upright during lunge. Flexible hip adductors will allow fuller range of motion. Lead knee should point same direction as foot throughout lunge. A long lunge emphasizes Gluteus Maximus; short lunge emphasizes Quadriceps.',1,'2021-06-27 13:39:40',NULL,NULL,0),(874,934,'Supporting knee should point same direction as foot throughout movement. Range of motion will be improved with greater leg strength and glute flexibility. Significant spinal flexion occurs at bottom of deep single leg squat to maintain center of gravity over foot. Erector Spinae becomes a stabilizer if spine is kept straight.',1,'2021-06-27 13:39:40',NULL,NULL,0),(875,936,'Keep head facing forward, back straight and feet flat on floor; equal distribution of weight through forefoot and heel. Knees should point same direction as feet throughout movement. At bottom of squat, crease at hips must be lower than top of knee cap. Also see:',1,'2021-06-27 13:39:40',NULL,NULL,0),(876,937,'Keep torso upright during lunge; flexible hip flexors are important. Lead knee should point same direction as foot throughout lunge. A long lunge emphasizes Gluteus Maximus; short lunge emphasizes Quadriceps. Tibialis Anterior is exercised eccentrically during landing on heel.',1,'2021-06-27 13:39:40',NULL,NULL,0),(877,938,'Knees should point same direction as feet throughout movement. Heel of rear foot can be kept elevated off floor throughout movement. Keep torso upright during squat; flexible hip flexors are important. With feet further apart: Gluteus Maximus is emphasized, Quadriceps are less emphasized.',1,'2021-06-27 13:39:40',NULL,NULL,0),(878,939,'Keep head facing forward, back straight and feet flat on floor; equal distribution of weight through forefoot and heel. Knees should point same direction as feet throughout movement. Exercise can also be performed holding onto supports or with long handled safety bar. Also see Squat Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(879,940,'Keep head facing forward, back straight and feet flat on floor; equal distribution of weight through forefoot and heel. Knees should point same direction as feet throughout movement. Hip and ankle flexibility is important for both execution and safety in this movement. See Full Squat Flexibility. Certain knee and low back problems may be aggravated by this exercise. See Full Squat Analysis and Deep Squat Test. See spotting technique and spotting assistance.',1,'2021-06-27 13:39:40',NULL,NULL,0),(880,941,'Keep head facing forward, back straight and feet flat on floor; equal distribution of weight through forefoot and heel. Knees should point same direction as feet throughout movement. Exercise can also be performed holding onto supports or with safety bar without bar handles. Also see Squat Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(881,942,'Throughout lift, keep hips low, shoulders high, arms and back straight. Knees should point same direction as feet throughout movement. See flawed demonstration showing depth of hack squat that is NOT sufficient and knees are NOT pointed same angle as feet. Individuals with short arm to torso ratio or protracted shoulder posture, may find this exercise very difficult to perform. See Squat Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(882,943,'Try to keep knees from traveling forward while reaching rear end back onto squat box. Ideally, knees could be behind ankles. In this position, greater stretch reflex can be created through hips (via hamstrings) once torso rocks forward just before squat. However, other hip extensors can engage in stretch-shortening cycle (although to lesser extend in this position) in lieu of hamstrings\' optimized involvement.',1,'2021-06-27 13:39:40',NULL,NULL,0),(883,944,'Turning knuckles up places bar more on Brachioradialis rather than more sensitive crook of elbow. Keep head facing forward, back straight and feet flat on floor; equal distribution of weight through forefoot and heel. Knees should point same direction as feet throughout movement. Also see rear side view.',1,'2021-06-27 13:39:40',NULL,NULL,0),(884,945,'Keep head facing forward, back straight and feet flat on floor; equal distribution of weight through forefoot and heel. Knees should point same direction as feet throughout movement. If handles are not available, horizontal bars on rack can be used for assistance if needed. Exercise can also be performed without holding onto supports. Also see Squat Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(885,946,'An inverted squared open-ended trap bar is used in this demonstration. Keep head facing forward, back straight and feet flat on floor; equal distribution of weight through forefoot and heel. Knees should point same direction as feet throughout movement. See Squat Analysis. Also see Trap Bar Deadlift.',1,'2021-06-27 13:39:40',NULL,NULL,0),(886,947,'Chains provide increasing resistance as barbell moves away from floor. Keep head facing forward, back straight and feet flat on floor; equal distribution of weight through forefoot and heel. Knees should point same direction as feet throughout movement. See spotting technique and spotting assistance. See Squat for targeting Quadriceps and Squat Analysis. Also see Squat Strength Standards.',1,'2021-06-27 13:39:40',NULL,NULL,0),(887,948,'Keep head facing forward, back straight and feet flat on floor; equal distribution of weight through forefoot and heel. Knees should point same direction as feet throughout movement. See Squat Analysis. Also see weightlifting style Front Squat.',1,'2021-06-27 13:39:40',NULL,NULL,0),(888,949,'Keep torso upright during exercise. Stepping knee should point same direction as foot. A modest degree of knee rotation occurs during this movement. See Controversial Exercises and Rotary Force in Squat Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(889,950,'Keep torso upright during lunge; flexible hip flexors are important. Forward knee should point same direction as foot throughout movement. A long lunge emphasizes Gluteus Maximus; short lunge emphasizes Quadriceps. See Cable Rear Step-down Lunge for similar exercise.',1,'2021-06-27 13:39:40',NULL,NULL,0),(890,952,'Keep torso upright during exercise. Forward knee should point same direction as foot throughout movement. Stepping distance from bench emphasizes Gluteus Maximus; stepping close to bench emphasizes Quadriceps.',1,'2021-06-27 13:39:40',NULL,NULL,0),(891,954,'Not all trap bar designs may allow for this movement. A squared open-ended trap bar is used in this demonstration. Throughout lift, keep arms and back straight. Do not lower weight beyond mild stretch throughout hamstrings. Full range of motion will vary from person to person. Those with less flexibility may have to bend knees more. Knees can be kept bent throughout movement.',1,'2021-06-27 13:39:40',NULL,NULL,0),(892,956,'Knees should point same direction as feet throughout movement. Heel of rear foot can be kept elevated off floor throughout movement as shown. Keep torso upright during squat; flexible hip flexors are important. With feet further apart: Gluteus Maximus is emphasized, Quadriceps are less emphasized. Also know as Cable Lunge.',1,'2021-06-27 13:39:40',NULL,NULL,0),(893,957,'Keep torso upright during lunge; flexible hip flexors are important. Forward knee should point same direction as foot throughout lunge. A long lunge emphasizes Gluteus Maximus; short lunge emphasizes Quadriceps.',1,'2021-06-27 13:39:40',NULL,NULL,0),(894,955,'Keep torso upright during squat; flexible hip flexors are important. Forward knee should point same direction as foot throughout movement. May also be referred to as Cable One Arm Bulgarian Squat.',1,'2021-06-27 13:39:40',NULL,NULL,0),(895,958,'Keep torso upright during squat; flexible hip flexors are important. Forward knee should point same direction as foot throughout movement. May also be referred to as Cable Bulgarian Squat.',1,'2021-06-27 13:39:40',NULL,NULL,0),(896,959,'Position height of cable bar so moving weight plates make contact with unused weight stack at bottom of squat when hips are slightly lower or same height as knees. Keep head facing forward, back straight and feet flat on floor; equal distribution of weight through forefoot and heel. Knees should point same direction as feet throughout movement. See Squat Analysis. Also see Cable Squat.',1,'2021-06-27 13:39:40',NULL,NULL,0),(897,960,'Knees should point same direction as feet throughout movement. Heel of rear foot can be kept elevated off floor throughout movement as shown. Keep torso upright during squat; flexible hip flexors are important. With feet further apart: Gluteus Maximus is emphasized, Quadriceps are less emphasized. Also known as One Arm Split Squat.',1,'2021-06-27 13:39:40',NULL,NULL,0),(898,961,'Also see Cable Bent-over Hip Extension for more bent over posture.',1,'2021-06-27 13:39:40',NULL,NULL,0),(899,962,'Keep head facing forward, back straight, chest high, arms straight to sides, and feet flat on platform; equal distribution of weight through forefoot and heel. Knees should point same direction as feet throughout movement. See Squat Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(900,963,'Knees should point same direction as feet throughout movement. Heel of rear foot can be kept elevated off floor throughout movement as shown. Keep torso upright during squat; flexible hip flexors are important. With feet further apart: Gluteus Maximus is emphasized, Quadriceps are less emphasized. Also known as Cable Lunge.',1,'2021-06-27 13:39:40',NULL,NULL,0),(901,965,'Keep head facing forward, back straight, chest high, and feet flat on surface; equal distribution of weight through forefoot and heel. Knees should point same direction as feet throughout movement. When finished, squat or sit and place pin into lightest weight setting. Step off of platform and unclip cable from belt. Also known as Pole Squat. Instead of holding onto pole for balance (as shown), arms can be extended forward without contact with pole. See Squat Analysis. Also see similar exercise: Weighted Belt Squat.',1,'2021-06-27 13:39:40',NULL,NULL,0),(902,966,'Also see Cable Standing Hip Extension for more upright posture.',1,'2021-06-27 13:39:40',NULL,NULL,0),(903,967,'Do not stand behind pulleys. Throughout lift, keep arms and back straight. Do not lower weight beyond mild stretch throughout hamstrings. When finished with set, dismount by lowering weight with knees bent and low back straight. Full range of motion will vary from person to person. Those with less flexibility may have to bend knees more. Knees can be kept bent throughout movement. Also see Stiff Leg Deadlift .',1,'2021-06-27 13:39:40',NULL,NULL,0),(904,968,'Keep torso upright during exercise. Forward knee should point same direction as foot throughout movement. Stepping distance from bench emphasizes Gluteus Maximus; stepping close to bench emphasizes Quadriceps.',1,'2021-06-27 13:39:40',NULL,NULL,0),(905,969,'Keep head facing forward, back straight and feet flat on floor; equal distribution of weight through forefoot and heel. Knees should point same direction as feet throughout movement. See Squat Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(906,970,'Throughout lift, keep arms and back straight. Do not lower weight beyond mild stretch throughout hamstrings. Full range of motion will vary from person to person. Those with less flexibility may need to bend knee of supporting leg more so dumbells can come closer to floor. At top of movement, lifted foot can make contact with floor to maintain balance between repetitions.',1,'2021-06-27 13:39:40',NULL,NULL,0),(907,971,'Keep torso upright during squat; flexible hip flexors are important. Forward knee should point same direction as foot throughout movement. May also be referred to as Dumbbell Bulgarian Squat.',1,'2021-06-27 13:39:40',NULL,NULL,0),(908,972,'Keep torso upright during lunge; flexible hip flexors are important. Forward knee should point same direction as foot throughout lunge. A long lunge emphasizes Gluteus Maximus; short lunge emphasizes Quadriceps.',1,'2021-06-27 13:39:40',NULL,NULL,0),(909,975,'Knees should point same direction as feet throughout movement. Heel of rear foot can be kept elevated off floor throughout movement as shown. Keep torso upright during squat; flexible hip flexors are important. With feet further apart: Gluteus Maximus is emphasized, Quadriceps are less emphasized.',1,'2021-06-27 13:39:40',NULL,NULL,0),(910,974,'Keep torso upright during lunge. Flexible hip adductors will allow fuller range of motion. Lead knee should point same direction as foot throughout lunge. A long lunge emphasizes Gluteus Maximus; short lunge emphasizes Quadriceps. Dumbbells may be positioned - one to front and other to back.',1,'2021-06-27 13:39:40',NULL,NULL,0),(911,973,'Keep torso upright during lunge; flexible hip flexors are important. Lead knee should point same direction as foot throughout lunge. A long lunge emphasizes Gluteus Maximus; short lunge emphasizes Quadriceps.',1,'2021-06-27 13:39:40',NULL,NULL,0),(912,976,'Keep head facing forward, back straight, chest high, and feet flat on floor; equal distribution of weight through forefoot and heel. Knees should point same direction as feet throughout movement. See Squat Analysis. Also see Kettlebell Front Squat.',1,'2021-06-27 13:39:40',NULL,NULL,0),(913,977,'Keep torso upright during lunge; flexible hip flexors are important. Lead knee should point same direction as foot throughout lunge. A long lunge emphasizes Gluteus Maximus; short lunge emphasizes Quadriceps. Tibilalis Anterior is exercised eccentrically during landing on heel.',1,'2021-06-27 13:39:40',NULL,NULL,0),(914,978,'Supporting knee should point same direction as foot throughout movement. Range of motion will be improved with greater leg strength and glute flexibility. Significant spinal flexion occurs at bottom of deep single leg squat to maintain center of gravity over foot. Erector Spinae becomes a stabilizer if spine is kept straight.',1,'2021-06-27 13:39:40',NULL,NULL,0),(915,979,'None',1,'2021-06-27 13:39:40',NULL,NULL,0),(916,981,'Keep torso upright during exercise. Stepping knee should point same direction as foot. A modest degree of knee rotation occurs during this movement. See Controversial Exercises and Rotary Force in Squat Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(917,982,'Keep torso upright during exercise. Knee of exercised leg should point same direction as foot. Exercise can also be performed by placing traveling foot onto and off of bench next to foot of exercised leg. See alternative form.',1,'2021-06-27 13:39:40',NULL,NULL,0),(918,985,'When finished, engage dock lever, and lower seat to starting position. If insufficient hip flexibility forces pelvis to pull away from back pad at lower portions of movement, only lower sled just short of spinal articulation. Keep knees pointed same directions as feet. Do not allow heels to raise off of platform, pushing with both heel and forefoot. Placing feet slightly high on platform emphasize Gluteus Maximus. Placing feet slightly lower on platform emphasize Quadriceps. Also see Sled Hack Press.',1,'2021-06-27 13:39:40',NULL,NULL,0),(919,984,'Keep torso upright during exercise. Forward knee should point same direction as foot throughout movement. Stepping distance from bench emphasizes Gluteus Maximus; stepping close to bench emphasizes Quadriceps.',1,'2021-06-27 13:39:40',NULL,NULL,0),(920,986,'Adjust safety brace and back support to accommodate near full range of motion without forcing hips to bend at waist. Keep knees pointed same directions as feet. Do not allow heels to raise off of platform, pushing with both heel and forefoot. Knees should point same direction as feet throughout movement. Placing feet slightly high on platform emphasize Gluteus Maximus. Placing feet slightly lower on platform emphasize Quadriceps. Also see Locking Out Knees on Leg Press.',1,'2021-06-27 13:39:40',NULL,NULL,0),(921,987,'Do not stand behind handles. Throughout lift, keep arms and back straight. Do not lower weight beyond mild stretch throughout hamstrings. When finished with set, dismount by lowering weight with knees bent and low back straight. Full range of motion will vary from person to person. Those with less flexibility may have to bend knees more. Knees can be kept bent throughout movement.',1,'2021-06-27 13:39:40',NULL,NULL,0),(922,988,'Lower platform enough to achieve full range of motion without forcing pelvis to bend at waist. On exercised leg, keep pointed same direction as foot . Also, do not allow heel to raise off of platform, pushing with both heel and forefoot. For alternative view, see Lever Single Leg 45° Leg Press performed with opposite leg.',1,'2021-06-27 13:39:40',NULL,NULL,0),(923,989,'Adjust machine to accommodate near full range of motion without forcing pelvis to bend at waist. Keep knee pointed same direction as foot. Do not allow heel to raise off of platform, pushing with both heel and forefoot. Unique apparatus is designed and built by Tracey Cheuvront.',1,'2021-06-27 13:39:40',NULL,NULL,0),(924,990,'Adjust shoulder pads to allow full range of motion without forcing hips to rise at waist. Keep knees pointed same directions as feet. Push with both heel and forefoot and do not allow heels to raise off of platform. Placing feet slightly high on platform emphasize Gluteus Maximus. Placing feet slightly lower on platform emphasize Quadriceps.',1,'2021-06-27 13:39:40',NULL,NULL,0),(925,991,'Adjust seat and back support to accommodate near full range of motion without forcing hips to bend at waist. Keep knees pointed same directions as feet. Do not allow heels to raise off of platform, pushing with both heel and forefoot. This exercise may be performed by alternating (as described), simultaneous, or in simultaneous-alternating fashion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(926,993,'Adjust seat and back support to accommodate near full range of motion without forcing hips to bend at waist. Keep knees pointed same directions as feet. Do not allow heels to raise off of platform, pushing with both heel and forefoot. Placing feet slightly high on platform emphasize Gluteus Maximus. Placing feet slightly lower on platform emphasize Quadriceps.',1,'2021-06-27 13:39:40',NULL,NULL,0),(927,992,'Adjust back support back to accommodate near full range of motion without forcing pelvis to bend at waist. Keep knee pointed same direction as foot. Push with both heel and forefoot and do not allow heel to raise off of platform.',1,'2021-06-27 13:39:40',NULL,NULL,0),(928,995,'Adjust yoke position to accommodate near full range of motion without forcing hips to bend at waist. Also see Lever Sprint Machine.',1,'2021-06-27 13:39:40',NULL,NULL,0),(929,996,'Adjust machine to accommodate near full range of motion without forcing hips to rise at waist. Keep knees pointed same directions as feet. Do not allow heels to raise off of platform, pushing with both heel and forefoot. Placing feet slightly high on platform emphasize Gluteus Maximus. Placing feet slightly lower on platform emphasize Quadriceps. Unique apparatus is designed and built by Tracey Cheuvront.',1,'2021-06-27 13:39:40',NULL,NULL,0),(930,994,'Also see Lever Lying Hip Extension on selectorized machine.',1,'2021-06-27 13:39:40',NULL,NULL,0),(931,997,'Keep torso upright during lunge; flexible hip flexors are important. Forward knee should point same direction as foot throughout lunge. A long lunge with feet slightly forward emphasizes Gluteus Maximus; short lunge with feet under the bar emphasizes Quadriceps.',1,'2021-06-27 13:39:40',NULL,NULL,0),(932,998,'Keep torso upright during lunge; flexible hip flexors are important. Forward knee should point same direction as foot throughout lunge. A long lunge emphasizes Gluteus Maximus; short lunge emphasizes Quadriceps. Also see Lever Rear Lunge on apparatus without platform.',1,'2021-06-27 13:39:40',NULL,NULL,0),(933,999,'Keep torso upright during squat; flexible hip flexors are important. Forward knee should point same direction as foot throughout movement. Keep foot flat on floor. Position foot slightly forward to distribute force on hip extensors. May also be referred to as Lever Bulgarian Squat.',1,'2021-06-27 13:39:40',NULL,NULL,0),(934,1000,'Keep torso upright during movement; flexible hip flexors are important. Knees should point same direction as feet throughout movement. A forward foot further forward will emphasizes Gluteus Maximus; forward foot more closer under bar will emphasizes Quadriceps.',1,'2021-06-27 13:39:40',NULL,NULL,0),(935,1001,'Keep torso upright during squat; flexible hip flexors are important. Knees should point same direction as feet throughout movement. Keep foot flat on floor. Position foot slightly forward to distribute force on hip extensors. Also known as Lever Lunge.',1,'2021-06-27 13:39:40',NULL,NULL,0),(936,1002,'Keep torso upright during squat; flexible hip flexors are important. Forward knee should point same direction as foot throughout movement. Keep foot flat on floor. Position foot slightly forward to distribute force on hip extensors. May also be referred to as Lever Barbell Bulgarian Squat.',1,'2021-06-27 13:39:40',NULL,NULL,0),(937,1005,'Range of motion will be improved with greater leg strength and glute flexibility. Base knee should point same direction as foot throughout movement.',1,'2021-06-27 13:39:40',NULL,NULL,0),(938,1003,'Taller individuals may be able to place both legs into strap and position torso on bench without using steps. Some individuals may be able to articulate both through the hips and through the lower back (i.e. lumbar spine), in which case, Erector Spinae also becomes synergist. Movement can be performed without resistance. Lever Reverse Hyper-extension was invented by Louie Simmons of Westside Barbell.',1,'2021-06-27 13:39:40',NULL,NULL,0),(939,1004,'If available, re-engage support lever in extended position before dismounting. Keep head facing forward, back straight and feet flat on floor; equal distribution of weight through forefoot and heel. Knees should point same direction as feet throughout movement. See Squat Analysis.  Also see exercise performed on classic Lever Squat machine.',1,'2021-06-27 13:39:40',NULL,NULL,0),(940,1007,'Keep torso upright during movement; flexible hip flexors are important. Knees should point same direction as feet throughout movement. Keep forward foot flat on stationary platform.',1,'2021-06-27 13:39:40',NULL,NULL,0),(941,1008,'Keep head facing forward, back straight and feet flat on floor; equal distribution of weight through forefoot and heel. Knees should point same direction as feet throughout movement. See Squat Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(942,1009,'Despite apparatus\' similarity to rear kick exercise, it is actually hip extension exercise due to the isolated hip movement which is apparent with lack of knee articulation.',1,'2021-06-27 13:39:40',NULL,NULL,0),(943,1010,'If insufficient hip flexibility forces pelvis to pull away from back pad at lower portions of movement, only lower sled just short of spinal articulation. Keep knees pointed same directions as feet. Do not allow heels to raise off of platform. Push with both heel and forefoot. If available, re-engage dock lever in extended position before dismounting. Placing feet slightly high on platform emphasize Gluteus Maximus. Placing feet slightly lower on platform emphasize Quadriceps. Also see similar exercise Lever V-Squat.',1,'2021-06-27 13:39:40',NULL,NULL,0),(944,1011,'Exercise can be performed alternating between sides.',1,'2021-06-27 13:39:40',NULL,NULL,0),(945,1012,'If available, re-engage support lever in extended position before dismounting. Keep head facing forward, back straight and feet flat on floor; equal distribution of weight through forefoot and heel. Knees should point same direction as feet throughout movement. See Squat Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(946,1014,'None',1,'2021-06-27 13:39:40',NULL,NULL,0),(947,1013,'If available, re-engage support lever in extended position before dismounting. Model shown uses foot pedal near base of platform to reengage support lever. Keep head facing forward, back straight and feet flat on platform; equal distribution of weight through forefoot and heel. Knees should point same direction as feet throughout movement. See Squat Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(948,1015,'Also Lever Lying Hip Extension on plate loaded machine and Lever Alternating Lying Hip Extension on another selectorized machine.',1,'2021-06-27 13:39:40',NULL,NULL,0),(949,1016,'Hamstring remains in active insufficiency through movement since knee is significantly flexed and hip does not flex beyond 90 degrees. Also see Lever Lying Hip Extension on plate loaded machine.',1,'2021-06-27 13:39:40',NULL,NULL,0),(950,1017,'If available, re-engage support lever in extended position before dismounting. If insufficient hip flexibility forces pelvis to pull away from back pad at lower portions of movement, only lower sled just short of spinal articulation. Keep knees pointed same directions as feet. Do not allow heels to raise off of platform. Push with both heel and forefoot. Also see selectorized machine. Placing feet slightly forward on platform emphasize Gluteus Maximus. Placing feet slightly back on platform emphasize Quadriceps.',1,'2021-06-27 13:39:40',NULL,NULL,0),(951,1018,'Exercise can be performed with one leg, then other leg. See Lever Kneeling Hip Extension (roller pad).',1,'2021-06-27 13:39:40',NULL,NULL,0),(952,1019,'Shorter individuals should stand on higher platform and may be bent over more.',1,'2021-06-27 13:39:40',NULL,NULL,0),(953,1020,'None',1,'2021-06-27 13:39:40',NULL,NULL,0),(954,1021,'Adjust back support back to accommodate near full range of motion without forcing pelvis to bend at waist. Keep knee pointed same direction as foot. Do not allow heel to raise off of platform, pushing with both heel and forefoot.',1,'2021-06-27 13:39:40',NULL,NULL,0),(955,1022,'Adjust seat and back support to accommodate near full range of motion without forcing hips to bend at waist. Keep knees pointed same directions as feet. Do not allow heels to raise off of platform, pushing with both heel and forefoot. Placing feet slightly high on platform emphasize Gluteus Maximus. Placing feet slightly lower on platform emphasize Quadriceps.',1,'2021-06-27 13:39:40',NULL,NULL,0),(956,1024,'With greater resistances, more effort is required to pull on handle bars to keep body from rising upward.',1,'2021-06-27 13:39:40',NULL,NULL,0),(957,1027,'Squeeze hand lever at bottom of movement to disengage weight stack. Keep hand lever squeezed until sled is raised and legs are straight. If insufficient hip flexibility forces pelvis to pull away from back pad at lower portions of movement, only lower sled just short of spinal articulation. Keep knees pointed same directions as feet. Do not allow heels to raise off of platform, pushing with both heel and forefoot. Placing feet slightly forward on platform emphasize Gluteus Maximus. Placing feet slightly back on platform emphasize Quadriceps.',1,'2021-06-27 13:39:40',NULL,NULL,0),(958,1025,'None',1,'2021-06-27 13:39:40',NULL,NULL,0),(959,1023,'Lever height should be adjusted to accommodate full range, allowing hips to descend same height or slightly lower than knees. Keep head facing forward, back straight and feet flat on floor; equal distribution of weight through forefoot and heel. Knees should point same direction as feet throughout movement. See Squat Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(960,1026,'Adjust bench to accommodate near full range of motion without forcing hips to bend at waist. Keep knees pointed same directions as feet. Do not allow heels to raise off of platform, pushing with both heel and forefoot. This exercise may be performed by alternating (as described), simultaneous, or in simultaneous-alternating fashion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(961,1028,'Squeeze hand lever at bottom of movement to disengage weight stack. Keep hand lever squeezed until sled is raised and leg is straight. If insufficient hip flexibility forces pelvis to pull away from back pad at lower portions of movement, only lower sled just short of spinal articulation. Keep knee pointed same directions as foot. Do not allow heel to raise off of platform, pushing with both heel and forefoot. Placing feet slightly forward on platform emphasize Gluteus Maximus. Placing feet slightly back on platform emphasize Quadriceps. See manufacturer\'s suggested foot placement for Lever Split V-Squat.',1,'2021-06-27 13:39:40',NULL,NULL,0),(962,1029,'Adjust safety brace and back support to accommodate near full range of motion without forcing pelvis to bend at waist. Keep knee pointed same direction as foot. Do not allow heel to raise off of platform, pushing with both heel and forefoot.',1,'2021-06-27 13:39:40',NULL,NULL,0),(963,1030,'Squeeze hand lever at bottom of movement to disengage weight stack. Keep hand lever squeezed until sled is raised and legs are straight. Keep knees pointed same directions as feet. Do not allow\n\nforward\n\nheel to raise off of platform, pushing with both heel and forefoot.',1,'2021-06-27 13:39:40',NULL,NULL,0),(964,1031,'Adjust safety brace and back support to accommodate near full range of motion without forcing hips to bend at waist. A wide stance may allow for deeper range of motion as shown. Keep knees pointed same directions as feet. Do not allow heels to raise off of platform, pushing with both heel and forefoot. Placing feet slightly high on platform emphasize Gluteus Maximus. Placing feet slightly lower on platform emphasize Quadriceps. See exercise performed on Bilateral Leg Press. Also see Locking Out Knees on Leg Press.',1,'2021-06-27 13:39:40',NULL,NULL,0),(965,1032,'When finished, keep both feet forward and descend lever downward. Squeeze hand lever at bottom of movement to disengage weight stack. Keep hand lever squeezed until sled is raised and legs are straight. Keep knees pointed same directions as feet. Push with both heel and forefoot. Do not allow forward heel to raise off of platform.',1,'2021-06-27 13:39:40',NULL,NULL,0),(966,1033,'Adjust safety brace and back support to accommodate near full range of motion without forcing hips to bend at waist. Wide stance may allow for deeper range of motion. Keep knees pointed same directions as feet. Do not allow heels to raise off of platform, pushing with both heel and forefoot. Placing feet slightly high on platform emphasize Gluteus Maximus. Placing feet slightly lower on platform emphasize Quadriceps. See exercise performed Bilaterally.',1,'2021-06-27 13:39:40',NULL,NULL,0),(967,1035,'If available, re-engage support lever in extended position before dismounting. Allow for full range of motion without forcing hips to rise at waist. Keep knees pointed same directions as feet. Do not allow heels to raise off of platform, pushing with both heel and forefoot. Placing feet slightly high on platform emphasize Gluteus Maximus. Placing feet slightly lower on platform emphasize Quadriceps.',1,'2021-06-27 13:39:40',NULL,NULL,0),(968,1036,'If available, re-engage support lever in extended position before dismounting. Allow for full range of motion without forcing hips to rise at waist. Keep knee pointed same directions as foot. Do not allow heel to raise off of platform, pushing with both heel and forefoot. Placing foot slightly high on platform emphasizes Gluteus Maximus. Placing foot slightly lower on platform emphasizes Quadriceps.',1,'2021-06-27 13:39:40',NULL,NULL,0),(969,1034,'If available, re-engage support lever in extended position before dismounting. If insufficient hip flexibility forces pelvis to pull away from back pad at lower portions of movement, only lower sled just short of spinal articulation. Keep knees pointed same directions as feet. Do not allow heels to raise off of platform, pushing with both heel and forefoot. Placing feet slightly high on platform emphasize Gluteus Maximus. Placing feet slightly lower on platform emphasize Quadriceps.',1,'2021-06-27 13:39:40',NULL,NULL,0),(970,1038,'Allow for full range of motion without forcing hips to bend\nat waist. Keep knee pointed same directions as foot. Do not allow\nheel to raise off of platform, pushing with both heel and forefoot.\nPlacing foot slightly high on platform emphasizes Gluteus Maximus.\nPlacing foot slightly lower on platform emphasizes Quadriceps.',1,'2021-06-27 13:39:40',NULL,NULL,0),(971,1037,'Adjust machine to accommodate near full range of motion without forcing hips to rise at waist. Keep knees pointed same directions as feet. Do not allow heels to raise off of platform, pushing with both heel and forefoot.',1,'2021-06-27 13:39:40',NULL,NULL,0),(972,1039,'None',1,'2021-06-27 13:39:40',NULL,NULL,0),(973,1040,'Adjust seat and back support to accommodate near full range of motion without forcing hips to bend at waist. Keep knees pointed same directions as feet. Do not allow heels to raise off of platform, pushing with both heel and forefoot. Placing feet slightly high on platform emphasize Gluteus Maximus. Placing feet slightly lower on platform emphasize Quadriceps.',1,'2021-06-27 13:39:40',NULL,NULL,0),(974,1041,'Flexible hip flexion is required for fuller range of motion through knee. Lower weight just short of hips, leaving back support. Keep knees pointed same directions as feet. Do not allow heels to raise off of platform, pushing with both heel and forefoot, or center of feet if platform is shorter than length of feet.',1,'2021-06-27 13:39:40',NULL,NULL,0),(975,1042,'Re-engage support lever in extended position before dismounting. Flexible hip flexion is required for fuller range of motion through knee. Lower weight just short of hips, leaving back support. Keep knees pointed same directions as feet. Do not allow heel to raise off of platform, pushing with both heel and forefoot, or center of foot if platform is shorter than length of feet.',1,'2021-06-27 13:39:40',NULL,NULL,0),(976,1043,'If available, re-engage dock lever(s) in extended position before dismounting. Adjust machine to accommodate near full range of motion without forcing pelvis to rise at waist. Keep knee pointed same direction as feet. Do not allow heel to raise off of platform, pushing with both heel and forefoot.',1,'2021-06-27 13:39:40',NULL,NULL,0),(977,1045,'If available, re-engage dock lever(s) in extended position before dismounting. Keep torso upright during lunge; flexible hip flexors are important. Forward knee should point same direction as foot throughout lunge. A long lunge with feet slightly forward emphasizes Gluteus Maximus; short lunge with feet under the bar emphasizes Quadriceps.',1,'2021-06-27 13:39:40',NULL,NULL,0),(978,1046,'On apparatuses with hand or lever lock, return sled to very bottom, disengage weight, return sled to mid-upper position, and re-engage weight before stepping out. Some Sled Squat apparatuses have back pads like the one shown, whereas, Sled Squat apparatuses have no back pad requiring additional recruitment of stabilizer muscles. Keep head facing forward, back straight and feet flat on floor; equal distribution of weight through forefoot and heel. Knees should point same direction as feet throughout movement.',1,'2021-06-27 13:39:40',NULL,NULL,0),(979,1044,'If available, re-engage support lever in extended position before dismounting. If insufficient hip flexibility forces pelvis to pull away from back pad at lower portions of movement, only lower sled just short of spinal articulation. Keep knees pointed same directions as feet. Do not allow heels to raise off of platform, pushing with both heel and forefoot. Placing feet slightly high on platform emphasize Gluteus Maximus. Placing feet slightly lower on platform emphasize Quadriceps.',1,'2021-06-27 13:39:40',NULL,NULL,0),(980,1048,'None',1,'2021-06-27 13:39:40',NULL,NULL,0),(981,1050,'Keep torso upright during squat; flexible hip flexors are important. Forward knee should point same direction as foot throughout movement. Keep foot flat on floor. Position foot slightly forward to distribute force on hip extensors. May also be referred to as Smith Bulgarian Squat.',1,'2021-06-27 13:39:40',NULL,NULL,0),(982,1051,'Throughout lift, keep arms and back straight. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch. Full range of motion will vary from person to person depending on flexibility. Stand on elevated platform if smith machine does not allow full range of motion. Those with less flexibility may have to bend their knees more. Knees can be kept bent throughout movement. Also see Stiff Leg Deadlift.',1,'2021-06-27 13:39:40',NULL,NULL,0),(983,1053,'Keep torso upright during movement; flexible hip flexors are important. Knees should point same direction as feet throughout movement. A forward foot further forward will emphasize Gluteus Maximus; forward foot more closer under bar will emphasize Quadriceps.',1,'2021-06-27 13:39:40',NULL,NULL,0),(984,1055,'Keep torso upright during lunge; flexible hip flexors are important. Forward knee should point same direction as foot throughout lunge. A long lunge with feet slightly forward emphasizes Gluteus Maximus; short lunge with feet under the bar emphasizes Quadriceps.',1,'2021-06-27 13:39:40',NULL,NULL,0),(985,1054,'Keep head facing forward, back straight and foot flat on floor; equal distribution of weight through forefoot and heel. Forward knee should point same direction as foot throughout movement.',1,'2021-06-27 13:39:40',NULL,NULL,0),(986,1056,'Throughout lift, keep hips low, shoulders high, arms and back straight. Knees should point same direction as feet throughout movement. See Smith Squat Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(987,1057,'Keep head facing forward, back straight and feet flat on floor; equal distribution of weight through forefoot and heel. Knees should point same direction as feet throughout movement. See Smith Squat Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(988,1058,'Keep head facing forward, back straight and feet flat on floor; equal distribution of weight through forefeet and heel. Knees should point same direction as feet throughout movement. Also see bodybuilding-style Smith Squat and Smith Squat Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(989,1059,'Keep head facing forward, back straight, chest high, and feet flat on floor; equal distribution of weight through forefoot and heel. Knees should point same direction as feet throughout movement. See Squat Analysis. Also see Kettlebell Goblet Squat.',1,'2021-06-27 13:39:40',NULL,NULL,0),(990,1060,'Supporting knee should point same direction as foot throughout movement. Range of motion will be improved with greater leg strength and glute flexibility. Significant spinal flexion occurs at bottom of deep single leg squat to maintain center of gravity over foot. Erector Spinae becomes a stabilizer if spine is kept straight.',1,'2021-06-27 13:39:40',NULL,NULL,0),(991,1061,'Keep head facing forward, back straight, chest high, and feet flat on surface; equal distribution of weight through forefoot and heel. Knees should point same direction as feet throughout movement. See Squat Analysis. Also see similar exercise Cable Belt Squat.',1,'2021-06-27 13:39:40',NULL,NULL,0),(992,1063,'Keep head facing forward, back straight and feet flat on floor; equal distribution of weight through forefoot and heel. Knees should point same direction as feet throughout movement. See Smith Squat Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(993,1062,'Exercise can be performed without added weight. Some individuals may be able to articulate both through the hips and through the lower back (i.e. lumbar spine), in which case, Erector Spinae also becomes synergist.',1,'2021-06-27 13:39:40',NULL,NULL,0),(994,1064,'Also see Reverse Hyper-extension performed with exercise ball on bench.',1,'2021-06-27 13:39:40',NULL,NULL,0),(995,1065,'Keep torso upright during lunge; flexible hip flexors are important. Lead knee should point same direction as foot throughout lunge. A long lunge emphasizes Gluteus Maximus; short lunge emphasizes Quadriceps.',1,'2021-06-27 13:39:40',NULL,NULL,0),(996,1066,'Hamstring remains in active insufficiency throughout movement since knee is significantly flexed and hip does not flex beyond 90 degrees. Adductor Magnus does not assist since hip extension does not occur in fully flexed position.',1,'2021-06-27 13:39:40',NULL,NULL,0),(997,1067,'Allow torso to angle forward more than shown, particularly as greater depth is achieved with lower bench or box. Range of motion will be improved with greater leg strength. Supporting knee should point same direction as foot throughout movement.',1,'2021-06-27 13:39:40',NULL,NULL,0),(998,1068,'Supporting knee should point same direction as foot throughout movement. Range of motion will be improved with greater leg strength and glute flexibility. Spine can be kept straighter than standard full range single leg squat. Also known as Reclining Pistol Squats.',1,'2021-06-27 13:39:40',NULL,NULL,0),(999,1069,'Since knee is initially bent significantly, hamstrings are not significantly involved. Also see Reverse Hyper-extension performed with exercise ball on bench.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1000,1071,'Supporting knee should point same direction as foot throughout movement. Range of motion will be improved with greater leg strength and glute flexibility. Also known as Pistol Squat.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1001,1070,'Supporting knee should point same direction as foot throughout movement. Range of motion will be improved with greater leg strength and glute flexibility. Quadriceps on raised leg becomes and Synergist if self assistance is provided at bottom of movement.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1002,1072,'Throughout lift, keep arms and back straight. Do not lower weight beyond mild stretch throughout hamstrings. Full range of motion will vary from person to person. Those with less flexibility may need to bend knee of supporting leg more so hands can come closer to floor. At top of movement, lifted foot can make contact with floor to maintain balance between repetitions.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1003,1073,'Knees should point same direction as feet throughout movement. Heel of rear foot can be kept elevated off floor throughout movement as shown. Keep torso upright during squat; flexible hip flexors are important. With feet further apart: Gluteus Maximus is emphasized, Quadriceps are less emphasized.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1004,1074,'Keep torso upright during squat; flexible hip flexors are important. Forward knee should point same direction as foot throughout movement. May also be referred to as Bodyweight Bulgarian Squat.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1005,1075,'Keep head facing forward, back straight, chest high, and feet flat on surface; equal distribution of weight through forefoot and heel. Knees should point same direction as feet throughout movement. Arms positioned forward allows torso to be positioned more upright. See Squat Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1006,1076,'Keep torso upright during exercise. Knee of exercised leg should point same direction as foot. See front view.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1007,1077,'Keep torso upright during exercise. Lead knee should point same direction as foot throughout movement. Stepping distance from bench emphasizes Gluteus Maximus; stepping close to bench emphasizes Quadriceps.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1008,1078,'Supporting knee should point same direction as foot throughout movement. Range of motion will be improved with greater leg strength and glute flexibility. Significant spinal flexion is acceptable form in full range single leg squat. Erector Spinae becomes a stabilizer if spine is kept straight. Also known as Self-assisted Pistol Squats.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1009,1079,'Supporting knee should point same direction as foot throughout movement.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1010,1080,'Keep torso upright during exercise. Stepping knee should point same direction as foot. A modest degree of knee rotation occurs during this movement. See Controversial Exercises and Rotary Force in Squat Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1011,1081,'Keep torso upright during exercise. Knee of exercised leg should point same direction as foot. Exercise can also be performed by placing travelling foot onto and off of bench next to foot of exercised leg (See demo). Park bench, picnic table and other elevated surfaces can also be used instead of a bench. Weighted versions of this exercise would normally be considered auxiliary in context of other basic exercises (ie: Barbell Squat, Sled Leg Press). However, in the context of \'body weight\' only program, this exercise can be considered basic.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1012,1082,'Supporting knee should point same direction as foot throughout movement, yet only extend forward slightly. Range of motion will be improved with greater leg strength and glute flexibility. Spinal flexion near bottom of motion is acceptable form in full range single leg squat. Erector Spinae becomes a stabilizer if spine is kept straight. See Side Rear View. Weighted versions of this exercise would normally be considered auxiliary in context of other basic exercises (ie: Barbell Squat, Sled Leg Press). However, in the context of \'body weight\' only program, this exercise can be considered basic. Also known as Self-assisted Reclining Pistol Squats or Self-assisted Reclining Single Leg Squats. The degree of self-assistance required affects the significance of upper body muscles utilized.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1013,1083,'This exercise can be performed on TRXⓇ style suspension trainer. See Suspended Supine Feet Mount/Dismount. Hamstring enters active insufficiency as hip is raised since knee is flexed and hip does not flex beyond 90 degrees. However, it is used more to stabilize knees in fixed flexed position. Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius, allowing it to assist Hamstrings in maintaining fixed knee flexion. See Knee flexion abduction force vector diagram. Adductor Magnus does not assist since hip extension does not occur in fully flexed position.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1014,1084,'Keep torso upright during exercise. Stepping knee should point same direction as foot. A modest degree of knee rotation occurs during this movement. See Controversial Exercises and Rotary Force in Squat Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1015,1085,'Notice knee extends out to side more than Lying Piriformis Stretch. Also see Lying Glute Stretch for alternative form.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1016,1087,'Keep torso upright during squat; flexible hip flexors are important particularly in lower position. Forward knee should point same direction as foot throughout movement.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1017,1088,'Supporting knee should point same direction as foot throughout movement. Dismounting can be achieved by placing elevated leg down and walking backward until body is upright. This exercise can be performed on TRXⓇ style suspension trainer or adjustable length gymnastics rings. Also known as Suspended Pistol Squat.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1018,1090,'Ankle can be placed on top edge of shin pad if it can not be positioned above knee.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1019,1089,'See PNF stretch techniques. Also see Modified Lying Glute Stretch for similar static stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1020,1091,'None.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1021,1092,'Allow hip to straighten toward floor for additional hip flexor stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1022,1093,'This exercise can be performed if thigh can not be reached or held on to during Lying Glute Stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1023,1094,'Keep torso upright during squat; flexible hip flexors are important. Forward knee should point same direction as foot throughout movement. Exercise can be dismounted by lifting suspended rear foot from loop, allowing it to fall back while placing foot on floor. A training partner can assist with positioning of loop around rear foot.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1024,1095,'Hands may be placed on elevated platform to maintain balance. Spine may be kept straight. Pelvis may be tilted forward to intensify stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1025,1096,'Spine may be kept straight. Pelvis may be tilted forward to intensify stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1026,1097,'Spine may be kept straight. Pelvis may be tilted forward to intensify stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1027,1098,'Spine may be kept straight. Pelvis may be tilted forward to intensify stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1028,1099,'See PNF stretch techniques. The Seated Glute Stretch can also be performed as static stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1029,1100,'Spine may be kept straight. Pelvis may be tilted forward to intensify stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1030,1101,'Spine may be kept straight. Pelvis may be tilted forward to intensify stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1031,1102,'This Dynamic Stretch can performed before athletic event or sports training session.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1032,1103,'This Dynamic Stretch can performed before athletic event or sports training session. Also stretches muscles involved in Foot Eversion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1033,1104,'See ROM Criteria and Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1034,1105,'Height of knee on exercising leg may require subtle adjustment during movement to permit clearance of traveling foot above floor. Gluteus Maximus will be activated as stabilizer on heavier loads when participant pushes stationary foot onto floor, thereby anchoring lower body as hip abductors keep thighs in place.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1035,1106,'Do not allow upper hip to fall behind upper hip throughout movement. See ROM Criteria and Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1036,1107,'See ROM Criteria and Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1037,1108,'Exercise name is somewhat counter-intuitive since direction of rotation is relative to movement of hip, or thigh, not bent leg. For example, in this exercises, internal rotation of hip causes front of thigh to turn inward despite bent leg moving outward. Incidentally, if knee were straight during internal rotation of thigh, foot would move inward.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1038,1110,'See ROM Criteria and Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1039,1109,'See ROM Criteria and Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1040,1111,'Mount machine with leg levers apart. Use lever to position legs together. See ROM Criteria and Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1041,1113,'Do not allow upper hip to fall behind upper hip throughout movement. See ROM Criteria and Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1042,1114,'Keep knees bent throughout exercise. Exercise can be performed on mat or towel or cushioning can be placed under forearm. See ROM Criteria and Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1043,1115,'See Suspended Supine Feet Mount/Dismount. Keep low back straight, maintaining approximate height from floor throughout movement. This exercise can be performed on TRXⓇ style suspension trainer. See ROM Criteria and Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1044,1117,'Keep feet pointed forward. See ROM Criteria and Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1045,1123,'Keep feet pointed forward. Exercise can be performed on mat or towel or cushioning can be placed under forearm. See ROM Criteria and Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1046,1124,'None.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1047,1125,'None.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1048,1126,'Hand nearest foot can be placed be behind on floor so torso can be reclined back slightly.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1049,1127,'Maintain 90° flexion in participant\'s hip while maintaining participant\'s shoulders flat on floor. See PNF stretch techniques. Also see Lying Crossover Stretch for similar static stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1050,1128,'Hand nearest foot can be placed be behind on floor so torso can be reclined back slightly.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1051,1130,'None',1,'2021-06-27 13:39:40',NULL,NULL,0),(1052,1131,'Keep hip of straight leg extended by leaning pelvis slightly forward.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1053,1132,'Also see Pretzel Stretch for Obliques for similar exercise which can be performed with this stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1054,1133,'Alternatively, upper leg maybe extended straight inline with torso.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1055,1134,'Keep hip extended by leaning pelvis slightly forward and contracting Gluteus Maximus.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1056,1135,'None',1,'2021-06-27 13:39:40',NULL,NULL,0),(1057,1136,'Exercise can be performed on bench. Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible; see Cable Lying Leg-Hip Raise. Knees may be kept extended throughout leg raise to increase intensity; see Cable Lying Straight Leg Raise. Also see Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1058,1137,'Training partner or trainer may need to assist attaching ankle cuffs to cable. Ankle cuffs may also be attached to cable pulley in lowest position when feet are on floor, but assistance may be needed to raise pulley to bench height. Cable Lying Leg Raise on floor is easier to set up.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1059,1138,'See Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1060,1139,'Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible; see Cable Lying Leg-Hip Raise. Knees can flex along with hips to decrease intensity; see Cable Lying Leg Raise. Also see Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1061,1140,'Keep elbows straight or nearly straight throughout exercise. Exercise can be performed without assistance. Rectus Abdominis and Obliques practically contract isometrically since little waist flexion occurs under resistance. With no waist flexion, Rectus Abdominis and External Oblique act to stabilize pelvis and waist during hip flexion. See target muscle of rollout question. Also see Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1062,1141,'Machine must be adjusted to align hip with lever fulcrum. Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. Conversely, it may be necessary to completely flex hips before waist flexion is possible, which is not practical with the opposite leg supporting body. See Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1063,1143,'Exercise is typically performed without added resistance. Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. It is necessary to raise legs higher than what is shown before waist flexion occurs; see Lever Vertical Leg-Hip Raise. Also see Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1064,1142,'Since knee of moving leg is straight and waist flexion is impeded by standing leg, range of motion will be limit to hamstring flexibility. See Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1065,1144,'Exercise can be performed without added weight until more resistance is needed. Lower decline to increase resistance. Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. See Arm Position During Waist Exercises and Spot Reduction Myth and Lower Ab Myth. Also see Dangerous Exercise Essay.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1066,1145,'Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. Exercise may be performed with ab straps. It may be necessary to completely flex hips before waist flexion is possible; see Weighted Hanging Leg-Hip Raise. Exercise can be performed without added weight until more resistance is needed. Knees may be kept extended throughout leg raise to increase intensity; see Weighted Hanging Straight Leg Raise. Also see Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1067,1146,'Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. Also see Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1068,1147,'Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible; see Weighted Incline Leg-Hip Raise. Care should be taken not to have weight falling over or thrown onto sensive bodily areas. For this reason increasing incline to increase intensity may be wiser than adding additional weight. Exercise can be performed without added weight on greater incline. Knees can flex along with hips to decrease intensity; see Weighted Incline Leg Raise. Also see Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1069,1148,'Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible; see Weighted Incline Leg-Hip Raise. Exercise can be performed without added weight until more resistance is needed. Elevate incline to increase resistance. Knees may be kept extended throughout leg raise to increase intensity; see Weighted Incline Straight Leg Raise. Also see Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1070,1149,'Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible; see Weighted Incline Leg-Hip Raise. Care should be taken not to have weight falling over or thrown onto sensitive bodily areas. For this reason, increasing incline to increase intensity may be wiser than adding additional weight. Exercise can be performed without added weight on greater incline. Knees can flex along with hips to decrease intensity; see Weighted Incline Leg Raise. Also see Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1071,1151,'Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible; see Weighted Hanging Leg-Hip Raise. Exercise can be performed without added weight until more resistance is needed; see Hanging Straight Leg Raise. Knees can flex along with hips to decrease intensity; see Weighted Hanging Leg Raise. Also see Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1072,1150,'Exercise can be performed without added weight until more resistance is needed (see Lying Leg Raise). Knees may be kept extended throughout leg raise to increase intensity.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1073,1152,'Heels may make contact with floor to maintain balance at bottom of movement. Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible. Exercise can be performed without added weight until more resistance is needed (See Seated Leg Raise without weight). Also see Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1074,1153,'Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible; see Weighted Incline Leg-Hip Raise. Exercise can also be performed on incline board or without added weight until more resistance is needed. Also see Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1075,1154,'This exercise is alternative to Vertical Leg Raise when apparatus is not available, or Hanging Leg Raise when high bar is not available or too low to allow for adequate leg clearance. Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible; see Weighted Vertical Leg-Hip Raise on parallel bars. Exercise can be performed without added weight until more resistance is needed (See Vertical Leg Raise on dip bar). Knees may be kept extended throughout leg raise to increase intensity. Also see Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1076,1155,'Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible; see Weighted Vertical Leg-Hip Raise. Exercise can be performed without added weight until more resistance is needed (See Vertical Leg Raise without weight). Knees may be kept extended throughout leg raise to increase intensity; see Weighted Vertical Straight Leg Raise. Also see Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1077,1156,'Exercise can be performed on standard bench or without added weight. Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. See Arm Position During Waist Exercises and Spot Reduction Myth and Lower Ab Myth. Also see Dangerous Exercise Essay.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1078,1157,'Exercise can be performed with ab straps. Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible, as in leg-hip raise. Also see Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1079,1158,'Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible as in hip leg raise. Also see Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1080,1160,'Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible, as in leg-hip raise. Also see Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1081,1159,'Exercise can be performed without ab straps, by hanging from high bar. Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible, as in leg-hip raise. Also see Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1082,1161,'Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible, as in leg-hip raise. Attempting to perform Incline Straight Leg-Hip Raise at a low incline would not load waist and hip flexors after they travel beyond vertical so that sort of movement would need to be performed on steep incline or vertical position, requiring much greater strength. Also see Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1083,1162,'Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible; see Weighted Vertical Leg-Hip Raise. Exercise can be performed without added weight until more resistance is needed (see Vertical Straight Leg Raise). Knees can flex along with hips to decrease intensity; see Weighted Vertical Leg Raise. Also see Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1084,1163,'Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible; see Weighted Incline Leg-Hip Raise. Exercise can also be performed on incline board. Also see Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1085,1164,'Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible, as in leg-hip raise. Also see Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1086,1165,'Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible, as in leg-hip raise. Attempting to perform Incline Straight Leg-Hip Raise at a low incline would not load waist and hip flexors after they travel beyond vertical so that sort of movement would need to be performed on steep incline or vertical position, requiring much greater strength. Also see Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1087,1166,'Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. Conversely, it may be necessary to completely flex hips before waist flexion is possible, which is not practical with alternating leg movements. Also see Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1088,1167,'This exercise is alternative to Vertical Leg Raise when apparatus is not available, or Hanging Leg Raise when high bar is not available or too low to allow for adequate leg clearance. Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible; see Weighted Vertical Leg-Hip Raise on parallel bars. Also see Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1089,1168,'Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible, as in leg-hip raise. Also see Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1090,1169,'Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible, as in leg-hip raise. Attempting to perform Lying Straight Leg Hip Raise would not load waist and hip flexors after they travel beyond vertical so that sort of movement would need to be performed on steep incline or vertical position, requiring much greater strength. Also see Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1091,1170,'Heels may make contact with floor to maintain balance at bottom of movement. Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible. Typically, the spine is not extended enough in this movement to constitute significant spinal flexion, so it remains classified as a hip flexor movement. Also see Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1092,1171,'Also known as Scissors Kick. Movement involves very short range of motion so greater isometric-like endurance is required. Also see over/under variation.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1093,1172,'Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible. Conversely, it may be necessary to completely flex hips before waist flexion is possible, which is not practical with alternating leg movements. Also see Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1094,1173,'Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible, as in leg-hip raise. Also see Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1095,1174,'Feet must be propped securely to prevent injury. Exercise can also be performed on Roman Chair Sit-up apparatus. Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. See Spot Reduction Myth and Lower Ab Myth. Also see Dangerous Exercise Essay.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1096,1175,'Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible, as in leg-hip raise. Also see Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1097,1176,'Keep arms straight with shoulders positioned above hands. Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique act only to stabilize pelvis and waist during hip flexion. If waist flexion were to occur after complete hip flexion, resistive forces are no longer working against abdominal muscles in this final position when knees and hips are flexed. However, abdominal muscles are activated isometrically to keep spine straight when knees are not under body. Also see Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1098,1177,'Keep arms straight with shoulders positioned above hands. Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique act only to stabilize pelvis and waist during hip flexion. If waist flexion were to occur after complete hip flexion, resistive forces are no longer working against abdominal muscles in this final position when knees and hips are flexed. However, abdominal muscles are activated isometrically to keep spine straight when knees are not under body. Also see Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1099,1178,'Keep arms straight with shoulders positioned above hands. Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique act only to stabilize pelvis and waist during hip flexion. If waist flexion were to occur after complete hip flexion, resistive forces are no longer working against abdominal muscles in this final position when knees and hips are flexed. However, abdominal muscles are activated isometrically to keep spine straight when knees are not under body. Also see Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1100,1179,'Keep arms straight with shoulders positioned above hands. Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique act only to stabilize pelvis and waist during hip flexion. In this movement, even if waist flexion were to occur after complete hip flexion, the abs have endured much more stabilizing forces in their extended position than dynamic forces they could possibly encounter in the flexed position. Also see Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1101,1181,'Position foot further beyond knee if stretch is felt in Adductor Magnus of forward thigh.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1102,1182,'Feet should be far enough apart to keep knee from traveling too far beyond forward foot. Keep torso upright, close to vertical. Keep forward foot flat on floor and rear foot pointed forward. Soleus of opposite leg may be stretched if ankle is fully dorsal flexed.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1103,1183,'Gluteus Maximus and Adductor Magnus may be mildly stretched if hip of forward leg is fully flexed. Soleus of opposite leg may be stretched if ankle is fully dorsal flexed.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1104,1184,'Attempt to straighten hip each stroke, while maintaining approximate height of hips from floor throughout movement. Dismount by removing straps, while kneeling or after sitting on one side of hip before rotating body to seated position. See Suspended Prone Feet Mount/Dismount. This exercise can be performed on TRXⓇ style suspension trainer.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1105,1185,'Keep foot away from fully extended hip to keep emphasis on Iliopsoas. See Lever Quadriceps Stretch for similar movement.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1106,1186,'Keep arms straight with shoulders positioned above hands. Dismount by removing straps while kneeling or after sitting on one side of hip before rotating body to seated position. See Suspended Prone Feet Mount/Dismount. This exercise can be performed on TRXⓇ style suspension trainer.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1107,1190,'Keep torso upright, close to vertical. Soleus of opposite leg may be stretched if foot is positioned forward and ankle is fully dorsal flexed.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1108,1192,'Alternatively, both hands can anchor upper thigh, on hand inside and other on out side of thigh. The leg may also hang from side of bench if body is positioned slightly diagonal. If stretch is not felt, pull upper thigh closer to side of torso with both hands or use taller bench if heal touches floor.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1109,1191,'Torso can be bent slightly forward with forearms on padded podium. If padded lower leg support is angled up, Rectus Femoris may also be stretched.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1110,1194,'Height of knee on exercising leg may require subtle adjustment during movement to permit clearance of traveling foot above floor. Gluteus Maximus will be activated as stabilizer on heavier loads when participant pushes stationary foot onto floor thereby anchoring lower body as hip adductors keep thighs together. Upper body muscles can also assist in keeping thigh of exercising leg along side stationary leg. Exercise name is somewhat counter-intuitive since direction of rotation is relative to movement of hip, or thigh, not bent leg. For example, in this exercises, external rotation of hip causes front of thigh to turn outward despite bent leg moving inward. Incidentally if knee were straight during external rotation of thigh, foot would move outward.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1111,1195,'Body may be reclined with support of arms as demonstrated (lower right). Also see Seated External Rotator Stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1112,1197,'Low back may be stretched if hips raise off of floor significantly. If spinal flexion is not desired, care should be given to keep back of hips on floor by monitoring hips position and pushing downward instead of toward participant\'s chest. See PNF stretch techniques. Also see Lying Piriformis Stretch for similar static stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1113,1199,'Low back may be stretched if hips and low back muscles are tight.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1114,1200,'Low back may be stretched if spine flexes significantly during stretch. Arms can hug and pull upper legs toward torso as shown in lower photo.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1115,1201,'Exercise name is somewhat counter-intuitive since direction of rotation is relative to movement of hip, or thigh, not bent leg. For example, in this exercises, external rotation of hip causes front of thigh to turn outward despite bent leg moving inward. Incidentally if knee were straight during external rotation of thigh, foot would move outward.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1116,1202,'Also see Lying External Rotator Stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1117,1203,'An alternative preparation: set on floor or mat reclining back with support of both arms behind body. Bend knees with feet on floor. Place back of knee on thigh of other leg. Hug both thighs locking both hands together behind knee of lower leg. Lie down supine by rolling to back.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1118,1204,'Notice knee is keep over torso in contrast to Lying Glute Stretch. Also see Lying Piriformis Stretch for alternative form.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1119,1205,'Low back may be stretched if hips and low back muscles are tight.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1120,1206,'See PNF stretch techniques. A static Seated Piriformis Stretch can also be performed without assistance.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1121,1211,'Keep torso upright and knee of lead leg pointed same direction of foot. Flexible hip adductors and stronger legs will allow fuller range of motion. A wider stance emphasizes Gluteus Maximus; slightly narrower straddled stance emphasizes Quadriceps. Do not position feet too close nor too wide.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1122,1217,'Keep head facing forward, back straight and feet flat on floor; equal distribution of weight throughout forefoot and heel. Knees should point same direction as feet throughout movement. See:',1,'2021-06-27 13:39:40',NULL,NULL,0),(1123,1237,'More or less 3/4 squat depth can be achieved depending upon exerciser\'s height, chain length on dip belt, and height of elevated platform. If greater depth can be achieved, descend as low as thighs being parallel to floor. Keep head facing forward, back straight, chest high, arms straight to sides, and feet flat on platform; equal distribution of weight through forefoot and heel. Knees should point same direction as feet throughout movement. See Squat Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1124,1239,'Those with hamstring inflexibility may have difficulty fully extending knee if knee is too high. In which case, knee can be raised forward less than 45°. Pectineus, Adductor Longus, Adductor Brevis do not contribute to hip stabilization since they are only involved in initial range of hip flexion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1125,1243,'Keep lower leg straight throughout movement. Forward knee should point same direction as foot throughout movement. Instead of grasping cable stirrups, dip belt attached to low pulley cable can be placed around waist.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1126,1249,'Stabilizers may be used during heavy resistances to prevent body rising off of seat.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1127,1254,'Stabilizers may be used during heavy resistances to prevent body rising off of seat. Also see exercise perfomed on bilateral machine.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1128,1262,'With greater resistances, more effort is required to pull on handle bars to keep body from rising upward.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1129,1271,'Re-engage support lever before dismounting. Model shown uses foot pedal near base of platform to re-engage support lever. Keep head facing forward, back straight and feet flat on platform; equal distribution of weight through forefoot and heel. Knees should point same direction as feet throughout movement. See Squat Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1130,1279,'Stabilizers may be used during heavy resistances to prevent body rising off of seat.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1131,1281,'Stabilizers may be used during heavy resistances to prevent body from rising off of seat. Also see exercises performed on bilateral machine.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1132,1285,'Stabilizers may be used during heavy resistances to prevent body rising off of seat.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1133,1286,'Adjust bench to accommodate near full range of motion without forcing hips to bend at waist. Keep knees pointed same directions as feet. Do not allow heels to raise off of platform, pushing with both heel and forefoot. This exercise may be performed by alternating (as described), simultaneous, or in simultaneous-alternating fashion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1134,1289,'Re-engage support lever in extended position before dismounting. If insufficient hip flexibility forces pelvis to pull away from back pad at lower portions of movement, only lower sled just short of spinal articulation. Keep knees pointed same directions as feet. Do not allow heels to raise off of platform, pushing with both heel and forefoot. Placing feet slightly high on platform emphasizes Gluteus Maximus. Placing feet slightly lower on platform emphasizes Quadriceps.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1135,1309,'Keep torso upright and foot flat on platform during exercise.\nKnee of exercised leg should point same direction as foot. Extended\nleg can be positioned slight forward.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1136,1317,'Keep waist and hips straight throughout exercise. Knees should point same direction as feet throughout movement. Sissy Squat can be performed without additional weight until additional resistance is required. Also see Weighted Sissy Squat on apparatus.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1137,1323,'Keep chest high and shoulder behind hips, preventing torso to angle forward. If upper pad is too high, it can obstruct range of motion, and possibly create abrupt forward dislocating forces on knee particularly if descent is not controlled. In contrast, inadequate support will be provided if upper pad is too low.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1138,1324,'Keep waist and hips straight throughout exercise. Knees should point same direction as feet throughout movement. Also see Sissy Squat on apparatus.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1139,1329,'Keep chest high and shoulder behind hips, preventing torso to angle forward. If upper pad is too high, it can obstruct range of motion, and possibly create abrupt forward dislocating forces on knee, particularly if descent is not controlled. In contrast, inadequate support will be provided if upper pad is too low.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1140,1332,'Keep torso upright during exercise. Stepping knee should point same direction as foot. A modest degree of knee rotation occurs during this movement. See Controversial Exercises and Rotary Force in Squat Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1141,1466,'None.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1142,1467,'The opposite leg or thick towel can be placed under participant\'s near knee (and above participant\'s far knee) to further stretch Rectus Femoris. Tibialis Anterior can be stretched if ankle is completely plantar flexed. See PNF stretch techniques. Also see Prone Quadriceps Stretch for similar static stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1143,1468,'A thickly folded towel can be placed under upper hip if lumbar spine hyperextension would otherwise be uncomfortable. A thickly folded towel can be placed under knee to further stretch Rectus Femoris.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1144,1469,'Rear knee should be completely flexed to keep emphasis on Quadriceps, particularly Rectus Femoris. See Lever Hip Flexor Stretch for similar movement.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1145,1470,'Alternatively, hip may be initially extended, then ankle can be slowly pulled towards rear end. With either technique, do not allow knee to flare outward to side. If low back is sensitive to hyperextension, hip should be postured in more neutral position than demonstrated. If knee is not completely flexed Iliopsoas may be stretched; Quadriceps will not be stretched significantly. If range of motion permits try Standing Quadriceps Stretch with out towel.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1146,1471,'Alternatively, hip may be initially extended, then ankle can be slowly pulled towards rear end. With either technique, do not allow knee to flare outward to side. If low back is sensitive to hyperextension, hip should be postured in more neutral position than demonstrated. If knee is not completely flexed, Iliopsoas may be stretched; Quadriceps will not be stretched significantly. See Standing Tibialis Anterior Stretch for similar exercise which can be combined with this stretch and performed simultaneously. If range of motion prohibits grasping of ankle or foot try Standing Quadriceps Stretch with towel.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1147,1472,'During stretch, do not allow knee to flare upward away from floor. If knee is not completely flexed, Iliopsoas wil be stretched more than Quadriceps. Bottom hip and knee can be bent 90° thereby decreasing anterior pelvic tilt so upper leg will not need to be pulled back as far during hip extension. See Lying Tibialis Anterior Stretch for similar exercise which can be combined with this stretch and performed simultaneously.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1148,1473,'Do not allow knee to flare outward to side. If low back is sensitive to hyperextension, hip should be postured in more neutral position than demonstrated by positioning shelf lower and bending supporting knee more. If knee is not completely flexed, Iliopsoas may be stretched; Quadriceps will not be stretched significantly. Tibialis Anterior may also be stretched if only top of forefoot is on shelf, as opposed to top of entire foot.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1149,1474,'Pull knee in if it initially flares outward to side. This Dynamic Stretch can performed before athletic event or sports training session.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1150,1476,'Begin with very light weight and add additional weight gradually to allow adequate adaptation. Throughout lift, keep back and knees straight. Do not lower weight beyond mild stretch through hamstrings. Full range of motion will vary from person to person depending on flexibility. Also see Bent Knee Goodmorning emphasizing Glutes.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1151,1478,'Adjust lower leg brace so pressure is evenly distributed on thigh pad. Maintain barbell\'s position on back of shoulders when upper body is lowered. Do not lower weight beyond mild stretch. Full range of motion will vary from person to person. Also known as Barbell Hip Extension. Also see Barbell Hyper-extension and Barbell Back Extension.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1152,1479,'Throughout lift, keep arms, knees, and back straight. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch. Full range of motion will vary from person to person depending on flexibility. Re-rack or deadlift weight back to floor. Also see Straight Leg Deadlift.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1153,1480,'Not all trap bar designs may allow for this movement. A squared, open-ended trap bar is used in this demonstration. Throughout lift, keep arms, knees, and back straight. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch. Full range of motion will vary from person to person depending on flexibility. Deadlift weight back to floor.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1154,1481,'Exercise can be performed without added weight until more resistance is needed.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1155,1483,'This is an advanced exercise performed on Glute Ham Raise Apparatus. This movement is also known as Barbell Hamstring Raise. Exercise can be performed without added weight until more resistance is needed. Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius allowing it to assist in knee flexion. Also see Inverse Leg Curl\n\n\ncomments.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1156,1485,'Position pad high enough to evenly distribute body weight on thigh but not so high that range of motion is limited; abdomen should not press on top side of pad when upper body is lowered. Maintain barbell\'s position on back of shoulders when upper body is lowered. Do not lower weight beyond mild stretch. Full range of motion will vary from person to person. Also known as Barbell 45-degree Hip Extension. Also see Barbell Hyperextension and Barbell Back Extension.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1157,1486,'Throughout lift, keep arms, knees, and back straight. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch. Full range of motion will vary from person to person depending on flexibility. Also see Straight Leg Deadlift.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1158,1487,'Keep torso on bench to reduce hyperextension of lower back. Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius allowing it to assist in knee flexion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1159,1489,'Raise knee very slightly as knee is flexing and return as weight is lowered. Keep hip from sagging or from being pulled forward. Heavier resistances can tear apart standard leather ankle cuffs.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1160,1491,'Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius allowing it to assist in knee flexion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1161,1492,'Keep hip from sagging or from being pulled forward. Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius allowing it to assist in knee flexion. Also see Cable Bent-over Leg Curl.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1162,1493,'Throughout lift, keep arms, knees, and back straight. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch. Full range of motion will vary from person to person depending on flexibility. Also see Straight Leg Deadlift.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1163,1494,'Keep torso on bench to reduce hyperextension of lower back. Most machines are angled at user\'s hip to position hamstring in more favorable mechanical position. If angle is at much greater angle than one illustrated, Rectus Femoris will less likely be involved as Antagonist Stabilizer. Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius allowing it to assist in knee flexion. See Knee flexion abduction force vector diagram.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1164,1495,'Keep torso on bench to reduce hyperextension of lower back. Most machines are angled at user\'s hip to position hamstring in more favorable mechanical position. If angle at hip is significantly bent, Rectus Femoris will less likely be involved as Antagonist Stabilizer. Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius allowing it to assist in knee flexion. See Knee flexion abduction force vector diagram.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1165,1496,'The bent-over posture decreases active insufficiency of three of four heads of hamstring at completion of knee flexion. Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius allowing it to assist in knee flexion. This exercise is variation of Standing Leg Curl but is similar biomechanically to Kneeling Leg Curl.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1166,1497,'Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius, allowing it to assist in knee flexion. See Knee flexion abduction force vector diagram.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1167,1499,'Throughout lift, keep arms, knees, and back straight. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch. Full range of motion will vary from person to person depending on flexibility. Also see Straight Leg Deadlift.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1168,1502,'The bent-over posture decreases active insufficiency of three of four heads of hamstring at completion of knee flexion. Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius allowing it to assist in knee flexion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1169,1503,'Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius allowing it to assist in knee flexion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1170,1500,'Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius allowing it to assist in knee flexion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1171,1504,'Keep torso on bench to reduce hyperextension of lower back. Most machines are angled at user\'s hip to position hamstring in more favorable mechanical position. If this angle is sharp (as shown), Rectus Femoris is less likely involved as Antagonist Stabilizer. Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius allowing it to assist in knee flexion. See Knee flexion abduction force vector diagram.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1172,1505,'Keep torso on bench to reduce hyperextension of lower back. Most machines are angled at user\'s hip to position hamstring in more favorable mechanical position. If angle is at much greater angle than one illustrated, Rectus Femoris will less likely be involved as Antagonist Stabilizer. Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius allowing it to assist in knee flexion. See Knee flexion abduction force vector diagram.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1173,1501,'Allow resting leg on top to ride bar down and up throughout exercise. Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius allowing it to assist in knee flexion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1174,1506,'Some apparatuses allow for a bent over posture potentially further decreasing active insufficiency of three of four heads of hamstring at completion of knee flexion. If hips are not significantly bent (ie: body upright), Rectus Femoris becomes antagonist stabilizers. Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius allowing it to assist in knee flexion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1175,1507,'A leg extension with padded rollers with access to both sides is required. If needed, raise body slightly by raising heel so lever fulcrum closer to knee articulation. Disregard calf as stabilizer if this is not necessary. Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius allowing it to assist in knee flexion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1176,1508,'Taller individuals may only be able to perform this exercise on standard multi-hip machine if adjustments are not sufficient to position knee at same height of fulcrum. If needed, raise body slightly by raising heel for proper knee alignment. Disregard calf as stabilizer if this is not necessary. Maintain knee position to lever throughout exercise. Shorter individuals may find it difficult to position body high enough even with elevation. Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius allowing it to assist in knee flexion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1177,1509,'Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius allowing it to assist in knee flexion. Also see Lever Seated Leg Curl machine with pad below knee.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1178,1510,'Some apparatuses allow for a bent over posture potentially further decreasing active insufficiency of three of four heads of hamstring at completion of knee flexion. If hips are not significantly bent (ie: body upright), Rectus Femoris becomes antagonist stabilizers. Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius allowing it to assist in knee flexion. Similar exercise can also be performed on some multi-hip machines and certain leg extension machines. Also see Bent-over Leg Curl.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1179,1511,'Throughout lift, keep arms, knees, and back straight. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch. Full range of motion will vary from person to person depending on flexibility. Stand on elevated platform if smith machine does not allow full range of motion. Also see Straight Leg Deadlift.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1180,1512,'Begin with very light weight and add additional weight gradually to allow adequate adaptation. Throughout lift, keep back and knees straight. At lower position, forefoot may raise off floor slightly. Do not lower weight beyond mild stretch. Full range of motion will vary from person to person depending on flexibility. Also see Bent Knee Goodmorning emphasizing Glutes.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1181,1514,'Throughout lift, knees straight and back of hips on bench. Hip may tend to raise up when legs are pulled up. Full range of motion will vary from person to person depending on flexibility.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1182,1516,'Exercise can be performed without added weight until more resistance is needed. If weight is positioned behind head, neck extensors act as stabilizers.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1183,1518,'Exercise can be performed without added weight until more resistance is needed. If weight is positioned behind head, neck extensors act as stabilizers',1,'2021-06-27 13:39:40',NULL,NULL,0),(1184,1519,'This is an advanced exercise performed on Glute Ham Raise Apparatus. This movement is also known as Weighted Hamstring Raise. Exercise can be performed without added weight until more resistance is needed. If weight is positioned behind head, neck extensors act as stabilizers.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1185,1520,'Platform should be high enough to allow hip to flex without buttocks contacting floor. Full range of motion will vary from person to person. Adductor Magnus may only assist at initial phase hip extension depending on degree of hip flexion at bottom of movement.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1186,1521,'Platform should be high enough to allow hips to flex without buttocks contacting floor. Full range of motion will vary from person to person. Adductor Magnus may only assist at initial phase hip extension depending on degree of hip flexion at bottom of movement. Also see Hanging Hyperextension for Erector Spinae performed with fuller range of movement.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1187,1522,'Positioned bar so back is slightly above floor once grip is established. Keep low back and hips straight throughout movement. With hips fully extended, Hamstrings enter active insufficiency near complete knee flexion.  Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius, allowing it to assist in knee flexion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1188,1523,'Keep hips straight throughout movement. Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius allowing it to assist in knee flexion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1189,1524,'Keep hips straight throughout movement. With hips fully extended, Hamstrings enter active insufficiency near complete knee flexion. Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius, allowing it to assist in knee flexion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1190,1525,'This is an advanced exercise performed on Glute Ham Raise Apparatus. This movement is also known as Hamstring Raise. Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius allowing it to assist in knee flexion. Also see Inverse Leg Curl comments.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1191,1527,'This movement is also known as Self-assisted Hamstring Raise on Floor. Bar or pad height should be only just high enough to position ankles underneath, allowing room for vertical orientation of feet with toes on floor. To keep exercise challenging, push off only hard enough to minimally assist raising of body with hamstrings. Attempt to keep hips as straight as possible throughout movement.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1192,1528,'This movement is also known as Self-assisted Hamstring Raise. To keep exercise challenging, push off only hard enough to minimally assist raising of body with hamstrings only. Place hands on top of platform when controlled descent can no longer be maintained with hamstring strength alone. Also attempt to keep hips as straight as possible throughout movement',1,'2021-06-27 13:39:40',NULL,NULL,0),(1193,1526,'Positioned bar so back is slightly above floor once grip is established. Keep low back straight, maintaining approximate height from floor throughout movement. Hamstrings seemingly acts as a dynamic stabilizer, since it shortens through knee, while it lengthens through hip. However, net contraction actually appears to occur, since hip flexes only slightly, while knee flexes nearly 100%, allowing hamstrings to remain in a mechanically strong position throughout movement. Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius, allowing it to assist in knee flexion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1194,1530,'This exercise can be performed on TRXⓇ style suspension trainer or adjustable length gymnastics rings. Positioned handles so back is slightly above floor once grip is established. Keep low back straight, maintaining approximate height from floor throughout movement. Hamstrings seemingly acts as a dynamic stabilizer, since it shortens through knee, while it lengthens through hip. However, net contraction actually appears to occur, since hip flexes only about 50%, while knee flexes nearly 100%, allowing hamstrings to remain in a mechanically strong position throughout movement. Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius, allowing it to assist in knee flexion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1195,1531,'This exercise can be performed on TRXⓇ style suspension trainer or adjustable length gymnastics rings. Positioned handles so back is slightly above floor once grip is established. Keep low back and hips straight throughout movement. With hips fully extended, Hamstrings enter active insufficiency near complete knee flexion. Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius, allowing it to assist in knee flexion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1196,1532,'This exercise can be performed on TRXⓇ style suspension trainer. See Suspended Supine Feet Mount/Dismount. Keep hips straight throughout movement. With hips fully extended, Hamstrings enter active insufficiency near complete knee flexion. Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius, allowing it to assist in knee flexion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1197,1533,'Far leg can be bent at knee and hip particularly if hip flexors are tight and greater spinal flexion will not irritate existing lower back injury. Alternative method (pictured low right) involves pulling leg toward chest with knee nearly straight. Also see Lying Hamstring Stretch with towel.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1198,1534,'Keep knee straight throughout stretch. If horizontal foot bar is set so foot is more dorsal flexed, leg angle may not need to be set as high.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1199,1535,'See PNF stretch techniques. Also see Lying Hamstring Stretch for similar static stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1200,1538,'To intensify stretch, hold upper bar. Those with longer upper thigh may need to deliberately keep extended leg straight, position hips further back on seat, or perform alternative stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1201,1536,'This exercise can be performed on TRXⓇ style suspension trainer. See Suspended Supine Feet Mount/Dismount. Keep low back straight, maintaining approximate height from floor throughout movement. On most popular suspension trainers, keep lower body weight equally distributed on each side to prevent slippage. Some makes of suspension trainers do not have this slack in their design, so one leg can relax momentarily in straight position, while bent side bears most of resistance, allowing for a more dynamic contraction in this specific movement.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1202,1537,'This exercise can be performed on TRXⓇ style suspension trainer. See Suspended Supine Feet Mount/Dismount. Keep low back straight, maintaining approximate height from floor throughout movement. Hamstrings seemingly acts as a dynamic stabilizer, since it shortens through knee, while it lengthens through hip. However, net contraction actually appears to occur, since hip flexes only about 50%, while knee flexes nearly 100%, allowing hamstrings to remain in a mechanically strong position throughout movement. Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius, allowing it to assist in knee flexion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1203,1539,'Keep knees straight by tensing Quadriceps. Knees may inadvertently bend if feet are extended off of thick mat. Spine may be kept straight. Pelvis may be tilted forward to intensify stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1204,1540,'Precautions must be taken to prevent sliping off chair. This stretch may be appropriate for those restricted to chair. Keep knees straight by tensing Quadriceps. Spine may be kept straight. Pelvis may be tilted forward to intensify stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1205,1541,'Alternatively, leg not being stretched can be bent so sole of foot is next to stretched thigh. Keep knee of stretched leg straight by tensing Quadriceps. Knees may inadvertently bend if feet are extended off of thick mat or bench. Spine may be kept straight. Pelvis may be tilted forward to intensify stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1206,1542,'Far leg can be straightened keep hip from rolling up or bent for comfort. Also see Lying Hamstring Stretch without towel.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1207,1543,'See PNF stretch techniques. Also see Seated Hamstring Stretch for similar static stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1208,1545,'Keep knees straight by tensing Quadriceps. Spine may be kept straight. Pelvis may be tilted forward to intensify stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1209,1544,'Those with greater than average hamstring flexibility may not find this stretch to be effective. In which case, an alternative stretch would be more suitable.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1210,1546,'Keep knees straight by tensing Quadriceps. The knee may inadvertently bend if foot is extended off edge of bench. Spine may be kept straight. Pelvis may be tilted forward to intensify stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1211,1548,'Keep rear knee straight. If necessary, tense Quadriceps. Spine may be kept straight. Pelvis may be tilted forward to intensify stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1212,1547,'Precautions must be taken to prevent sliping off chair. This stretch may be appropriate for those restricted to chair. Keep knee straight by tensing Quadriceps. Spine may be kept straight. Pelvis may be tilted forward to intensify stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1213,1549,'Rear knee should remain pointed same direction of rear foot. Both hands may be braced just above both knees. Forward knee may also be keep straight by tensing Quadriceps. Spine may be kept straight. Pelvis may be tilted forward to intensify stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1214,1550,'Avoid throwing leg up onto high elevation. Keep forward knee straight by tensing Quadriceps. Spine may be kept straight. Pelvis may be tilted forward to intensify stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1215,1551,'This Dynamic Stretch can performed before athletic event or sports training session. Although this dynamic stretch targets the Hamstrings in the raised leg, Iliopsoas is typically stretched in supporting leg due to posterior rotation of hips as leg is raised.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1216,1552,'This Dynamic Stretch can performed before athletic event or sports training session. Although this dynamic stretch targets the Hamstrings in the raised leg, Iliopsoas is typically stretched in supporting leg due to posterior rotation of hips as leg is raised.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1217,1553,'See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1218,1554,'Mount machine with leg levers together. Use lever to extend legs apart. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1219,1558,'See Spot Reduction Myth and ROM Criteria.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1220,1556,'See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1221,1560,'Notice cable pulley in use is out of view to left. Exerciser is holding on to ballet bar above opposite cable pulley, not in use. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1222,1559,'See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1223,1557,'Mount machine with leg levers together. Use lever to extend legs apart. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1224,1564,'Arms can push legs down if preferred.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1225,1565,'See PNF stretch techniques. Also see Lying Wall Groin Stretch for similar static stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1226,1566,'Push elbow into side of knee for added stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1227,1567,'None.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1228,1569,'Keep back of legs against wall.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1229,1570,'Erector Spinae may be stretched if spine is flexed during stretch. Gluteus Maximus may be stretched if hip is flexed enough.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1230,1571,'emphasizes Adductor Magnus, ischial fibers by flexing hip.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1231,1572,'Keep legs and back straight.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1232,1573,'Administrator may need to kneel down closer to partipants who are more flexible. See PNF stretch techniques. Also see Lying Wall Groin Stretch for similar static stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1233,1574,'Keep feet flat on floor and knees pointed same direction as toes. emphasizes Adductor Magnus, ischial fibers by flexing hip.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1234,1575,'Keep back straight during stretch. Gracilis is stretched on straight leg.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1235,1578,'Abduction stretch is adjusted by turning knob at side. Handles can be adjusted up and down. There is also adjustment that allows knees to bend.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1236,1577,'Adductor Magnus is stretched more as torso is lowered as in Seated Adductor Magnus Stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1237,1576,'Place hands on hips or keep hand on elevated surface or other stable structure for balance.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1238,1579,'Back may be keep straight. Other heads of Hip Adductors can be stretched if legs are positioned out as far as possible.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1239,1580,'Other heads of hip adductors may be stretched if knee of upper leg travels out to side during stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1240,1581,'Back may be keep straight. Other heads of Hip Adductors can be stretched if legs are positioned out as far as possible as in the Seated Groin Stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1241,1582,'None.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1242,1583,'Keeping lower leg straight keeps pelvis from tilting so upper knee does not have to come back as far. Gluteus Maximus is stretched if hips are slightly external rotated. Piriformis and Quadratus Femoris become stretched if hip is slightly transversely adducted (knee toward opposite side of chest).',1,'2021-06-27 13:39:40',NULL,NULL,0),(1243,1584,'Other heads of hip adductors can be stretched if knee of upper leg travels out to side during stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1244,1585,'Position rack just below lowest range of motion. Calf block should be positioned so safety bar is close to but does not make contact with rack. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch. See Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1245,1586,'Notice barbell makes contact with only non-painted surface (plastic or metal surface). Exercise step that will not overturn can be used as calf block. Position rack just below lowest range of motion. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch. See Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1246,1587,'Chain may be used to add length to cable so belt can be more easily attached to cable as long as it is short enough to allow full range of motion. Exercise step that will not overturn can be used as calf block. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch.\n\n\nSee Calf Exercise Analyses. Also see same movement performed on slightly different apparatus, Lever Standing Calf Raise (belt loaded).',1,'2021-06-27 13:39:40',NULL,NULL,0),(1247,1588,'Calf block or exercise step that will not overturn can be used as platform. Keep knee straight throughout exercise or bend knee slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch. See Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1248,1589,'A short chain may be used to add length to cable so belt can be more easily attached to cable as long as it is short enough to allow full range of motion. Calf block or exercise step that will not overturn can be used as platform. A short chain may be used, so belt can be more easily attached to cable as long as it is short enough to allow full range of motion. Keep knee straight throughout exercise or bend knee slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch. See Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1249,1590,'Exercise step that will not overturn can be used as calf block. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knee is bent slightly during stretch. Use lighter load if you need to assist with hands used for support or use both feet. See Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1250,1591,'Exercise step that will not overturn can be used as calf block. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch. If holding heavy dumbbell becomes too difficult, try single leg calf raise. See Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1251,1592,'Reposition stance if feet slip. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch. See Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1252,1593,'Position seat to allow full range of motion. Reposition stance if feet slip. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch. Also known as Rotary Calf Extension. See Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1253,1594,'Position lever just below lowest range of motion. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch. See Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1254,1595,'When finished, place feet back on platform, engage dock lever (if it automatically disengaged), and lower seat to original position. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch.\n\n\nSee Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1255,1596,'Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch. See Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1256,1597,'Position seat back yet not so far that lever bottoms out during stretch. Reposition stance if feet slip. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch. See Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1257,1598,'Position seat to allow full range of motion. Reposition stance if feet slip. Keep knees straight throughout exercise or bend knees slightly only during stretch (as shown). Quadriceps serve as synergists muscle if knees are bent slightly during stretch. See Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1258,1599,'If available, position lever or chain just below lowest range of motion. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch. See Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1259,1600,'When finished, place feet back on platform, engage dock lever (if it automatically disengaged), and lower seat to original position. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch. See Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1260,1601,'Position lever just below lowest range of motion. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch. See Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1261,1603,'Position seat back yet not so far that weight bottoms out (weight stack hits bottom) during stretch. Reposition stance if feet slip. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch. See Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1262,1602,'Position seat to allow full range of motion. Reposition stance if feet slip. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch. See Calf Exercise Analyses. Also see Lever Alternating Bent Knee Calf Extension.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1263,1604,'Position seat to allow full range of motion. Reposition stance if feet slip. Keep knees straight throughout exercise or bend knees slightly only during stretch (as shown). Quadriceps serve as synergists muscle if knees are bent slightly during stretch. See Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1264,1605,'If possible, position lever just below lowest range of motion. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch. See Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1265,1606,'Chain with attachment can be preattached to lever so belt can be more easily attached as long as it is short enough to allow full range of motion. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch.\n\n\nSee Calf Exercise Analyses. Also see same movement performed on slightly different apparatus, Cable Standing Calf Raise.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1266,1607,'Lower weight back into starting position if feet slip. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch. Exercise can also be performed with Simultaneous Extension. See Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1267,1608,'Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch. Also known as Sled Donkey Calf Raise. See Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1268,1609,'Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch. Also known as Sled Donkey Calf Raise. See Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1269,1610,'If possible, position lever just below lowest range of motion. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch. See Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1270,1611,'Position upper pad just below lowest range of motion. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch. See Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1271,1612,'Not all Hack Squat machines have platform with opened lower end allowing for this movement, but some platforms may accommodate calf block, see example. Disengage docking lever if it impedes movements. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergist muscle if knees are bent slightly during stretch. See Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1272,1613,'Position sled back yet not so far that weight bottoms out during stretch. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergist muscle if knees are bent slightly during stretch. See Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1273,1614,'If sled bottoms out on dock lever, disengage it to allow full range of motion. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergist muscle if knees are bent slightly during stretch. See Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1274,1615,'Reposition stance if feet slip. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch. Movement can also be performed on Bilateral 45° Leg Press apparatus. See Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1275,1616,'Position seat back yet not so far that weight bottoms out during stretch. Reposition stance if feet slip. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch. See Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1276,1617,'Reposition stance if feet slip. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch. See Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1277,1618,'Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch. Also see alternative form: Standing Calf Pop-ups involving Quadriceps. See Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1278,1619,'Position smith bar just below lowest range of motion. Weight can be loaded with or without bar catch engaged. In event bar catch obstructs movement mid-set, reach back with one hand and rotate bar to move bar catch out of way. If this is not possible, lower weight, adjust catch, and start again. When set has been completed lower bar to safety catch by bending knees. Make certain both safety catches are secure before each set.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1279,1620,'Position sled just below lowest range of motion. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch. Also see exercise on alternative apparatus with back pad. See Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1280,1621,'Keep knee straight throughout exercise or bend knee slightly only during stretch. Quadriceps serve as synergists muscle if knee is bent slightly during stretch. Use lighter load if you need to assist with hands used for support. See Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1281,1623,'Torso should be approximately parallel to floor. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as Synergists muscle if knees are bent slightly during stretch. Exercise is more challenging with training partner toward hips sitting upright. Also, training partner can hold additional weight in arms. See Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1282,1622,'Sled can be positioned just below lowest range of motion. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch. See Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1283,1624,'Exercise step that will not overturn can be used as calf block. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch. See Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1284,1625,'Keep knee straight throughout exercise or bend knee slightly only during stretch. Quadriceps serve as synergists muscle if knee is bent slightly during stretch. See Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1285,1626,'Although angle of ankles increase as hands travel closer to feet (requiring less ankle/Gastrocnemius flexibility), angle of hips decreases (requiring more hip/Hamstrings flexibility). As hamstrings are stretched through hip, they pull on gastrocnemius due to intertwining contact hamstrings have on gastrocnemius behind knee.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1286,1627,'None.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1287,1628,'Keep knee straight throughout exercise or bend knee slightly only during stretch. Quadriceps serve as synergists muscle if knee is bent slightly during stretch. Clip shows use of pulling assistance from high support. If support is lower, assist by pushing on support.\n\n\nSee Calf Exercise Analyses. Also see technique with assistance from opposite leg.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1288,1629,'Keep knee of exercised leg straight throughout exercise. On assisting leg, keep ankle high and only assist minimal, just enough to raise body in a steady motion. See Calf Exercise Analyses.\n\n\nAlso see technique with assistance from upper body.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1289,1630,'Keep knee of rear leg straight and both feet flat on floor. Keep upper body upright. Experiment with positioning feet further apart so minimum bending of forward knee is required.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1290,1631,'Keep knee straight throughout exercise or bend knee slightly only during stretch. Quadriceps serve as synergists muscle if knee is bent slightly during stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1291,1632,'Soleus may also be stretched in forward bent leg if it is placed far enough back to be sufficiently stretched.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1292,1633,'None.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1293,1634,'None',1,'2021-06-27 13:39:40',NULL,NULL,0),(1294,1635,'Opposite leg may be keep bent or straight off to side.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1295,1636,'This machine design is very rare in comparison to Lever Seated Calf Raise machine. This particular machine was missing its adjustable leg pad so fists were placed between legs and cross bar. Movement is predominately Soleus. Gastrocnemius are in active insufficiency since knees are significantly bent. See Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1296,1637,'Slide forward to edge of bench and rack safety bar when finished. See suggested mount & dismount. Movement is predominately Soleus. Gastrocnemius are in active insufficiency since knees are significantly bent. See Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1297,1638,'Movement is predominately Soleus. Gastrocnemius are in active insufficiency since knees are significantly bent. See Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1298,1639,'Keep both feet flat on floor. Upper body may be keep upright. Experiment with positioning feet further apart so minimum bending of knees are required.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1299,1640,'Keep knee of stretched leg bent.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1300,1642,'Movement is predominately Soleus. Gastrocnemius are in active insufficiency since knees are significantly bent. See Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1301,1641,'Position seat to allow full range of motion. Gastrocnemius act as dynamic stabilizers because when they \'contract\' at ankle they are simultaneously \'stretched\' at knee. It could be argued they also act as synergist since bend at knee could be considered relatively smaller range of motion as compared to ankle articulation resulting in net contraction of Gastrocnemius. See Calf Exercise Analyses. Also see Lever Alternating Seated Calf Extension with straight knee.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1302,1643,'Safety stops can be used to support bar at lowest position, particularly if it is difficult to rack bar to original height. If possible, adjust height of bench or calf block so thigh is close to horizontal. Movement is predominately Soleus. Gastrocnemius are in active insufficiency since knees are significantly bent. See Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1303,1644,'Soleus may also be stretched in forward bent leg if it is placed far enough back to be sufficiently stretched.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1304,1645,'None.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1305,1646,'Movement is predominately Soleus. Gastrocnemius are in active insufficiency since knees are significantly bent. See mount and dismount and\n\n\nCalf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1306,1647,'None.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1307,1648,'Keep foot flat on floor.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1308,1649,'None.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1309,1650,'Opposite leg may be keep bent or straight off to side. Also see similar exercise Seated Plantar Fascia Stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1310,1651,'Opposite leg may be keep bent or straight off to side.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1311,1652,'A short chain may be used to add length to cable so belt can be more easily attached to cable as long as it is short enough to allow full range of motion. Calf block or exercise step that will not overturn can be used as platform. Keep knees and hips straight throughout exercise. The exercise can be made more difficult by positioning heels closer to edge of platform. See Dorsal Flexor Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1312,1653,'Throughout exercise, keep knees and hips straight and support barbell against verticals with both hands to sides. The exercise can be made more difficult by positionin\n\n\ng heels closer to edge of platform. Notice barbell makes contact with only non-painted surface (plastic or metal surface). See Dorsal Flexor Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1313,1654,'Keep knee and hip straight throughout exercise. Exercise can be made more difficult by positioning heels closer to edge of platform. If you need to assist with hands used for support, use lighter load (or no weight), or both feet, or position heels more on platform. See Dorsal Flexor Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1314,1656,'When finished, engage dock lever (if it automatically disengaged), and lower seat to original position. Feet should be place highest position that still allows forefeet to make contact with platform. Keep knees straight throughout exercise. Exercise is performed on apparatus design to perform Hack Press. Also see similar movement performed on Sled Donkey Calf Machine. See Dorsal Flexor Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1315,1655,'Care must be taken to avoid heels from slipping off platform. Begin with very light weight to insure shoes have adequate traction. Keep knees straight throughout exercise. See Dorsal Flexor Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1316,1658,'A short chain may be used to add length to cable so belt can be more easily attached to cable as long as it is short enough to allow full range of motion. Calf block or exercise step that will not overturn can be used as platform. Keep knees and hips straight throughout exercise. The exercise can be made more difficult by positioning heels closer to edge of platform. See Dorsal Flexor Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1317,1657,'Position rack just below lowest range of motion. Calf block should be positioned so safety bar is close to but does not make contact with rack. Keep knees and hips straight throughout exercise. See Dorsal Flexor Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1318,1659,'Keep knees and hips straight throughout exercise. The exercise can be made more difficult by using only one leg or positioning heels closer to edge of platform. If you need to assist with hands used for support, use lighter load (or no weight), or position heels more on platform. See Dorsal Flexor Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1319,1660,'Feet may be moved up higher on platform if bottom of forefoot can still remain on platform with knees straight and back of hips can remain on back pad. The angle of back pad may be lowered back to keep back of hips on lower portion of back pad. Keep knees straight throughout exercise. See Dorsal Flexor Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1320,1661,'Feet may be moved up higher on platform if bottom of forefoot can still contact platform with knees straight. Bring feet no further forward than back half of feet remaining on platform. Keep knees and hips straight throughout exercise. See Dorsal Flexor Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1321,1662,'Keep knees and hips straight throughout exercise. The exercise can be made more difficult by positioning heels closer to edge of platform as well as adding weight. See Dorsal Flexor Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1322,1663,'Care must be taken to avoid heels from slipping off platform. Begin with very light weight to insure shoes have adequate traction. Keep knees straight throughout exercise. See Dorsal Flexor Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1323,1664,'Often bending significantly at hips as shown in Sled Reverse Donkey Calf Raise typically reduces range of motion at ankle during dorsal flexion. Position torso more upright as shown, effectively reduces bend at hip. See Dorsal Flexor Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1324,1665,'Avoid using other muscles to push pedal down with heels as lever is lifted. Insure full range of motion is practiced. In starting lower position, scoot back on bench just slightly until full planter flexion is felt. Establish range of motion criteria for highest position. See Dorsal Flexor Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1325,1667,'Avoid using other muscles to push pedal down with heel as lever is lifted. Insure full range of motion is practiced. In starting lower position, scoot back on bench just slightly until full planter flexion is felt. Establish range of motion criteria for highest position. See Dorsal Flexor Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1326,1666,'Keep knees and hips straight throughout exercise. The exercise can be made more difficult by positioning heels closer to edge of platform. See Dorsal Flexor Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1327,1668,'Keep knees straight throughout exercise. Also known as Sled Donkey Reverse Calf Raise. Also see movement performed on Sled Hack Press. See Dorsal Flexor Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1328,1669,'Avoid pushing pedal down with heel as lever is lifted. Insure full range of motion is practiced. In starting lower position, lean back slightly until full planter flexion is felt. Establish range of motion criteria for highest position. Also see close up view. See Dorsal Flexor Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1329,1671,'Feet may be moved up higher on platform if bottom of forefoot can still remain on platform with knees straight and back of hips can remain on back pad. The angle of back pad may be lowered back to keep back of hips on lower portion of back pad. Keep knees straight throughout exercise. See Dorsal Flexor Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1330,1672,'Feet may be moved up higher on platform if bottom of forefoot can still contact platform with knees straight and back of hips can remain on back pad. The angle of back pad may be lowered back to keep back of hips on lower portion of back pad. Keep knees straight throughout exercise. Also see on alternative machine. See Dorsal Flexor Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1331,1670,'Keep knees straight throughout exercise. Also known as Sled Donkey Reverse Calf Raise. Also see movement performed on Sled Hack Press. See Dorsal Flexor Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1332,1674,'Feet may be moved up higher on platform if bottom of forefoot can still remain on platform with knees straight. Keep knees straight throughout exercise. See Dorsal Flexor Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1333,1673,'Often bending at the hip typically reduces range of motion at ankle during dorsal flexion. Two remedies include: (1) end knees slightly, (2) position torso more upright supported by extended arms, effectively reducing bend at hip as shown with Lever Reverse Donkey Calf Raise. In this last case, Triceps Brachii would act as stabilizer. See Dorsal Flexor Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1334,1675,'Feet should be place highest position that still allows forefeet to make contact with platform. Keep knees straight throughout exercise. Exercise is performed on apparatus design to perform Hack Press. Also see similar movement performed on Sled Donkey Calf Machine. See Dorsal Flexor Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1335,1676,'Feet may be moved up higher on platform if bottom of forefoot can still remain on platform with knees straight. Keep knees straight throughout exercise. Dock levers may not need to be released depending on machine model and body height. See Dorsal Flexor Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1336,1677,'Keep knees and hips straight throughout exercise. The exercise can be made more difficult by positioning heels closer to edge of platform. See Dorsal Flexor Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1337,1680,'Throughout exercise, keep knees and hips straight. The exercise can be made more difficult by positioning heels closer to edge of platform. See Dorsal Flexor Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1338,1678,'If sled bottoms out on dock lever, disengage it to allow full range of motion. Feet may be moved up higher on platform if bottom of forefoot can still remain on platform with knees straight. Keep knees straight throughout exercise. See Dorsal Flexor Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1339,1679,'Keep knees and hips straight throughout exercise. The exercise can be made more difficult by positioning heels closer to edge of platform. See Dorsal Flexor Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1340,1681,'Keep knees and hips straight throughout exercise. See Dorsal Flexor Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1341,1682,'Feet may be moved up higher on platform if bottom of forefoot can still remain on platform with knees straight and back of hips can remain on back pad. The angle of back pad may be lowered back to keep back of hips on lower portion of back pad. See Dorsal Flexor Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1342,1684,'None.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1343,1683,'See Standing Quadriceps Stretch for similar exercise which can be combined with this stretch and performed simultaneously.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1344,1685,'Do not allow feet to wing out and do not sit between ankles. Certain knee problems maybe aggravated by this stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1345,1686,'See Lying (side) Quadriceps Stretch for similar exercise which can be combined with this stretch and performed simultaneously.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1346,1687,'Keep knee and hip straight throughout exercise. Exercise can be made more difficult by positioning heels closer to edge of platform. See Dorsal Flexor Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0); +/*!40000 ALTER TABLE `exercise_comment` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `exercise_related_classification` +-- + +DROP TABLE IF EXISTS `exercise_related_classification`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `exercise_related_classification` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'The ID of exercise related classification.', + `exercise_id` bigint unsigned NOT NULL COMMENT 'The ID of exercise.', + `exercise_classification_id` bigint unsigned NOT NULL COMMENT 'The exercise classification ID.', + `related_classification_type` tinyint NOT NULL COMMENT '1 - Utility, 2 - Mechanics, 3 - Force', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=3809 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Exercise Related Classification.\n\nRelationship:\nOne exercise usually mapping to 3 types of exercise classification.\nAnd one exercise can have more than one specific type of classification.\n\nFor example:\nOne exercise can have 2 records whose types are both Utility.'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `exercise_related_classification` +-- + +LOCK TABLES `exercise_related_classification` WRITE; +/*!40000 ALTER TABLE `exercise_related_classification` DISABLE KEYS */; +INSERT INTO `exercise_related_classification` VALUES (1,4,2,1),(2,4,4,2),(3,4,9,3),(4,1,1,1),(5,1,2,1),(6,1,4,2),(7,1,9,3),(8,3,1,1),(9,3,2,1),(10,3,4,2),(11,3,9,3),(12,2,1,1),(13,2,2,1),(14,2,4,2),(15,2,9,3),(16,5,2,1),(17,5,4,2),(18,5,9,3),(19,6,2,1),(20,6,4,2),(21,6,9,3),(22,7,2,1),(23,7,4,2),(24,7,9,3),(25,8,1,1),(26,8,2,1),(27,8,4,2),(28,8,9,3),(29,9,1,1),(30,9,2,1),(31,9,4,2),(32,9,9,3),(33,10,1,1),(34,10,2,1),(35,10,4,2),(36,10,9,3),(37,11,2,1),(38,11,4,2),(39,11,9,3),(40,13,2,1),(41,13,4,2),(42,13,9,3),(43,15,1,1),(44,15,2,1),(45,15,4,2),(46,15,9,3),(47,16,1,1),(48,16,2,1),(49,16,4,2),(50,16,8,3),(51,16,9,3),(52,17,1,1),(53,17,2,1),(54,17,4,2),(55,17,8,3),(56,17,9,3),(57,18,2,1),(58,18,4,2),(59,18,9,3),(60,19,1,1),(61,19,2,1),(62,19,4,2),(63,19,9,3),(64,20,1,1),(65,20,2,1),(66,20,4,2),(67,20,9,3),(68,21,1,1),(69,21,2,1),(70,21,4,2),(71,21,9,3),(72,22,1,1),(73,22,2,1),(74,22,4,2),(75,22,9,3),(76,23,1,1),(77,23,2,1),(78,23,4,2),(79,23,9,3),(80,26,1,1),(81,26,2,1),(82,26,4,2),(83,26,9,3),(84,25,1,1),(85,25,2,1),(86,25,4,2),(87,25,9,3),(88,24,1,1),(89,24,2,1),(90,24,4,2),(91,24,9,3),(92,27,2,1),(93,27,4,2),(94,27,9,3),(95,29,1,1),(96,29,2,1),(97,29,4,2),(98,29,9,3),(99,32,2,1),(100,32,4,2),(101,32,9,3),(102,33,1,1),(103,33,3,2),(104,33,8,3),(105,34,2,1),(106,34,4,2),(107,34,8,3),(108,35,1,1),(109,35,3,2),(110,35,8,3),(111,36,2,1),(112,36,4,2),(113,36,8,3),(114,37,1,1),(115,37,3,2),(116,37,8,3),(117,38,1,1),(118,38,3,2),(119,38,8,3),(120,40,1,1),(121,40,3,2),(122,40,8,3),(123,39,1,1),(124,39,3,2),(125,39,8,3),(126,42,2,1),(127,42,4,2),(128,42,8,3),(129,41,1,1),(130,41,3,2),(131,41,8,3),(132,43,2,1),(133,43,4,2),(134,43,8,3),(135,44,2,1),(136,44,4,2),(137,44,8,3),(138,45,2,1),(139,45,4,2),(140,45,8,3),(141,47,2,1),(142,47,4,2),(143,47,8,3),(144,46,1,1),(145,46,2,1),(146,46,3,2),(147,46,8,3),(148,48,2,1),(149,48,4,2),(150,48,8,3),(151,49,1,1),(152,49,2,1),(153,49,3,2),(154,49,8,3),(155,50,1,1),(156,50,2,1),(157,50,3,2),(158,50,8,3),(159,51,2,1),(160,51,4,2),(161,51,8,3),(162,52,2,1),(163,52,4,2),(164,52,8,3),(165,53,1,1),(166,53,2,1),(167,53,3,2),(168,53,8,3),(169,54,1,1),(170,54,3,2),(171,54,8,3),(172,55,1,1),(173,55,3,2),(174,55,8,3),(175,56,1,1),(176,56,3,2),(177,56,8,3),(178,57,1,1),(179,57,3,2),(180,57,8,3),(181,59,1,1),(182,59,2,1),(183,59,3,2),(184,59,8,3),(185,58,1,1),(186,58,3,2),(187,58,8,3),(188,60,2,1),(189,60,4,2),(190,60,8,3),(191,61,1,1),(192,61,3,2),(193,61,8,3),(194,62,1,1),(195,62,3,2),(196,62,8,3),(197,63,1,1),(198,63,2,1),(199,63,3,2),(200,63,8,3),(201,64,1,1),(202,64,3,2),(203,64,8,3),(204,65,1,1),(205,65,3,2),(206,65,8,3),(207,66,1,1),(208,66,3,2),(209,66,8,3),(210,67,1,1),(211,67,3,2),(212,67,8,3),(213,68,1,1),(214,68,3,2),(215,68,8,3),(216,69,1,1),(217,69,3,2),(218,69,8,3),(219,70,1,1),(220,70,3,2),(221,70,8,3),(222,71,1,1),(223,71,3,2),(224,71,8,3),(225,72,1,1),(226,72,3,2),(227,72,8,3),(228,73,1,1),(229,73,3,2),(230,73,8,3),(231,77,1,1),(232,77,3,2),(233,77,8,3),(234,78,1,1),(235,78,3,2),(236,78,8,3),(237,79,2,1),(238,79,4,2),(239,79,8,3),(240,81,1,1),(241,81,2,1),(242,81,4,2),(243,81,9,3),(244,82,1,1),(245,82,3,2),(246,82,9,3),(247,83,1,1),(248,83,2,1),(249,83,4,2),(250,83,9,3),(251,84,1,1),(252,84,3,2),(253,84,9,3),(254,86,1,1),(255,86,3,2),(256,86,9,3),(257,87,1,1),(258,87,3,2),(259,87,9,3),(260,85,1,1),(261,85,2,1),(262,85,4,2),(263,85,9,3),(264,88,1,1),(265,88,3,2),(266,88,9,3),(267,89,1,1),(268,89,2,1),(269,89,3,2),(270,89,9,3),(271,90,1,1),(272,90,3,2),(273,90,9,3),(274,91,1,1),(275,91,2,1),(276,91,4,2),(277,91,9,3),(278,92,2,1),(279,92,4,2),(280,92,9,3),(281,93,2,1),(282,93,4,2),(283,93,9,3),(284,95,1,1),(285,95,3,2),(286,95,9,3),(287,94,2,1),(288,94,4,2),(289,94,9,3),(290,96,2,1),(291,96,4,2),(292,96,9,3),(293,97,2,1),(294,97,4,2),(295,97,9,3),(296,98,1,1),(297,98,3,2),(298,98,9,3),(299,99,1,1),(300,99,2,1),(301,99,4,2),(302,99,9,3),(303,100,2,1),(304,100,4,2),(305,100,9,3),(306,101,2,1),(307,101,4,2),(308,101,9,3),(309,102,1,1),(310,102,3,2),(311,102,9,3),(312,103,1,1),(313,103,3,2),(314,103,9,3),(315,104,1,1),(316,104,3,2),(317,104,9,3),(318,105,1,1),(319,105,3,2),(320,105,9,3),(321,106,1,1),(322,106,2,1),(323,106,4,2),(324,106,9,3),(325,107,1,1),(326,107,2,1),(327,107,4,2),(328,107,9,3),(329,108,1,1),(330,108,3,2),(331,108,9,3),(332,109,1,1),(333,109,2,1),(334,109,4,2),(335,109,9,3),(336,110,1,1),(337,110,2,1),(338,110,4,2),(339,110,9,3),(340,114,2,1),(341,114,4,2),(342,114,9,3),(343,115,1,1),(344,115,3,2),(345,115,9,3),(346,116,1,1),(347,116,3,2),(348,116,9,3),(349,117,1,1),(350,117,2,1),(351,117,3,2),(352,117,9,3),(353,118,2,1),(354,118,4,2),(355,118,9,3),(356,119,1,1),(357,119,2,1),(358,119,3,2),(359,119,9,3),(360,120,2,1),(361,120,4,2),(362,120,9,3),(363,121,2,1),(364,121,4,2),(365,121,9,3),(366,122,2,1),(367,122,4,2),(368,122,9,3),(369,123,1,1),(370,123,2,1),(371,123,3,2),(372,123,9,3),(373,124,1,1),(374,124,2,1),(375,124,3,2),(376,124,9,3),(377,125,2,1),(378,125,4,2),(379,125,9,3),(380,126,1,1),(381,126,2,1),(382,126,3,2),(383,126,9,3),(384,127,2,1),(385,127,3,2),(386,127,9,3),(387,128,1,1),(388,128,2,1),(389,128,3,2),(390,128,9,3),(391,129,2,1),(392,129,4,2),(393,129,9,3),(394,130,2,1),(395,130,4,2),(396,130,9,3),(397,131,1,1),(398,131,2,1),(399,131,3,2),(400,131,9,3),(401,132,2,1),(402,132,4,2),(403,132,9,3),(404,133,1,1),(405,133,2,1),(406,133,3,2),(407,133,9,3),(408,134,2,1),(409,134,4,2),(410,134,9,3),(411,135,2,1),(412,135,3,2),(413,135,9,3),(414,136,2,1),(415,136,3,2),(416,136,9,3),(417,137,2,1),(418,137,3,2),(419,137,9,3),(420,138,2,1),(421,138,4,2),(422,138,9,3),(423,139,2,1),(424,139,4,2),(425,139,9,3),(426,140,1,1),(427,140,2,1),(428,140,3,2),(429,140,9,3),(430,141,1,1),(431,141,2,1),(432,141,3,2),(433,141,9,3),(434,142,2,1),(435,142,4,2),(436,142,9,3),(437,144,2,1),(438,144,4,2),(439,144,9,3),(440,145,2,1),(441,145,4,2),(442,145,9,3),(443,143,1,1),(444,143,2,1),(445,143,3,2),(446,143,9,3),(447,147,2,1),(448,147,4,2),(449,147,9,3),(450,148,2,1),(451,148,4,2),(452,148,9,3),(453,149,1,1),(454,149,2,1),(455,149,3,2),(456,149,9,3),(457,151,2,1),(458,151,4,2),(459,151,9,3),(460,150,2,1),(461,150,4,2),(462,150,9,3),(463,152,1,1),(464,152,2,1),(465,152,3,2),(466,152,9,3),(467,155,2,1),(468,155,4,2),(469,155,9,3),(470,153,2,1),(471,153,4,2),(472,153,9,3),(473,154,2,1),(474,154,4,2),(475,154,9,3),(476,156,2,1),(477,156,4,2),(478,156,9,3),(479,157,2,1),(480,157,4,2),(481,157,9,3),(482,158,1,1),(483,158,2,1),(484,158,3,2),(485,158,9,3),(486,159,1,1),(487,159,2,1),(488,159,3,2),(489,159,9,3),(490,160,1,1),(491,160,2,1),(492,160,3,2),(493,160,9,3),(494,162,2,1),(495,162,3,2),(496,162,9,3),(497,163,1,1),(498,163,2,1),(499,163,3,2),(500,163,9,3),(501,167,2,1),(502,167,4,2),(503,167,9,3),(504,168,2,1),(505,168,4,2),(506,168,9,3),(507,169,2,1),(508,169,4,2),(509,169,9,3),(510,170,2,1),(511,170,4,2),(512,170,9,3),(513,171,2,1),(514,171,4,2),(515,171,9,3),(516,172,1,1),(517,172,3,2),(518,172,8,3),(519,173,1,1),(520,173,3,2),(521,173,8,3),(522,174,1,1),(523,174,3,2),(524,174,8,3),(525,175,1,1),(526,175,3,2),(527,175,8,3),(528,176,1,1),(529,176,4,2),(530,176,8,3),(531,177,1,1),(532,177,2,1),(533,177,3,2),(534,177,8,3),(535,179,1,1),(536,179,4,2),(537,179,8,3),(538,178,1,1),(539,178,4,2),(540,178,8,3),(541,180,1,1),(542,180,2,1),(543,180,4,2),(544,180,8,3),(545,181,1,1),(546,181,4,2),(547,181,8,3),(548,182,1,1),(549,182,2,1),(550,182,4,2),(551,182,8,3),(552,183,2,1),(553,183,4,2),(554,183,8,3),(555,184,1,1),(556,184,4,2),(557,184,8,3),(558,185,1,1),(559,185,2,1),(560,185,4,2),(561,185,8,3),(562,186,1,1),(563,186,4,2),(564,186,8,3),(565,187,1,1),(566,187,2,1),(567,187,4,2),(568,187,8,3),(569,188,1,1),(570,188,4,2),(571,188,8,3),(572,189,1,1),(573,189,2,1),(574,189,4,2),(575,189,8,3),(576,190,1,1),(577,190,2,1),(578,190,4,2),(579,190,8,3),(580,191,1,1),(581,191,2,1),(582,191,4,2),(583,191,8,3),(584,192,2,1),(585,192,4,2),(586,192,8,3),(587,193,2,1),(588,193,4,2),(589,193,8,3),(590,194,2,1),(591,194,4,2),(592,194,8,3),(593,195,2,1),(594,195,4,2),(595,195,8,3),(596,196,1,1),(597,196,2,1),(598,196,4,2),(599,196,8,3),(600,197,2,1),(601,197,4,2),(602,197,8,3),(603,198,2,1),(604,198,4,2),(605,198,8,3),(606,200,1,1),(607,200,3,2),(608,200,8,3),(609,199,2,1),(610,199,4,2),(611,199,8,3),(612,201,1,1),(613,201,2,1),(614,201,4,2),(615,201,8,3),(616,202,2,1),(617,202,4,2),(618,202,8,3),(619,203,1,1),(620,203,2,1),(621,203,4,2),(622,203,8,3),(623,204,1,1),(624,204,2,1),(625,204,4,2),(626,204,8,3),(627,205,2,1),(628,205,4,2),(629,205,8,3),(630,206,2,1),(631,206,4,2),(632,206,8,3),(633,207,1,1),(634,207,2,1),(635,207,4,2),(636,207,8,3),(637,208,2,1),(638,208,4,2),(639,208,8,3),(640,209,1,1),(641,209,2,1),(642,209,4,2),(643,209,8,3),(644,210,1,1),(645,210,2,1),(646,210,4,2),(647,210,8,3),(648,211,1,1),(649,211,3,2),(650,211,8,3),(651,212,1,1),(652,212,3,2),(653,212,8,3),(654,213,1,1),(655,213,2,1),(656,213,4,2),(657,213,8,3),(658,214,1,1),(659,214,2,1),(660,214,4,2),(661,214,8,3),(662,215,1,1),(663,215,2,1),(664,215,4,2),(665,215,8,3),(666,216,1,1),(667,216,2,1),(668,216,4,2),(669,216,8,3),(670,217,1,1),(671,217,3,2),(672,217,8,3),(673,218,1,1),(674,218,2,1),(675,218,4,2),(676,218,8,3),(677,219,1,1),(678,219,3,2),(679,219,8,3),(680,220,1,1),(681,220,3,2),(682,220,8,3),(683,222,1,1),(684,222,2,1),(685,222,3,2),(686,222,8,3),(687,223,1,1),(688,223,2,1),(689,223,4,2),(690,223,8,3),(691,224,1,1),(692,224,2,1),(693,224,4,2),(694,224,8,3),(695,225,1,1),(696,225,3,2),(697,225,8,3),(698,226,1,1),(699,226,3,2),(700,226,8,3),(701,228,1,1),(702,228,3,2),(703,228,8,3),(704,229,1,1),(705,229,2,1),(706,229,3,2),(707,229,8,3),(708,230,1,1),(709,230,3,2),(710,230,8,3),(711,231,1,1),(712,231,3,2),(713,231,8,3),(714,232,1,1),(715,232,3,2),(716,232,8,3),(717,233,1,1),(718,233,3,2),(719,233,8,3),(720,234,1,1),(721,234,3,2),(722,234,8,3),(723,235,1,1),(724,235,3,2),(725,235,8,3),(726,236,1,1),(727,236,3,2),(728,236,8,3),(729,237,1,1),(730,237,3,2),(731,237,8,3),(732,238,1,1),(733,238,3,2),(734,238,8,3),(735,240,1,1),(736,240,3,2),(737,240,8,3),(738,241,1,1),(739,241,2,1),(740,241,4,2),(741,241,8,3),(742,242,1,1),(743,242,3,2),(744,242,8,3),(745,243,1,1),(746,243,3,2),(747,243,8,3),(748,244,1,1),(749,244,3,2),(750,244,8,3),(751,245,1,1),(752,245,3,2),(753,245,8,3),(754,247,1,1),(755,247,3,2),(756,247,8,3),(757,246,1,1),(758,246,2,1),(759,246,4,2),(760,246,8,3),(761,252,1,1),(762,252,3,2),(763,252,8,3),(764,253,1,1),(765,253,2,1),(766,253,4,2),(767,253,9,3),(768,254,1,1),(769,254,2,1),(770,254,4,2),(771,254,9,3),(772,255,2,1),(773,255,4,2),(774,255,9,3),(775,256,1,1),(776,256,4,2),(777,256,9,3),(778,257,1,1),(779,257,4,2),(780,257,9,3),(781,259,1,1),(782,259,4,2),(783,259,9,3),(784,258,1,1),(785,258,2,1),(786,258,4,2),(787,258,9,3),(788,260,2,1),(789,260,4,2),(790,260,9,3),(791,261,1,1),(792,261,2,1),(793,261,4,2),(794,261,9,3),(795,262,2,1),(796,262,4,2),(797,262,9,3),(798,263,1,1),(799,263,4,2),(800,263,9,3),(801,264,1,1),(802,264,2,1),(803,264,3,2),(804,264,9,3),(805,265,1,1),(806,265,2,1),(807,265,4,2),(808,265,9,3),(809,266,1,1),(810,266,2,1),(811,266,4,2),(812,266,9,3),(813,269,1,1),(814,269,2,1),(815,269,4,2),(816,269,9,3),(817,270,1,1),(818,270,3,2),(819,270,9,3),(820,271,1,1),(821,271,2,1),(822,271,3,2),(823,271,9,3),(824,275,2,1),(825,275,4,2),(826,275,9,3),(827,276,2,1),(828,276,4,2),(829,276,9,3),(830,277,2,1),(831,277,4,2),(832,277,9,3),(833,281,2,1),(834,281,4,2),(835,281,9,3),(836,280,2,1),(837,280,4,2),(838,280,9,3),(839,278,2,1),(840,278,4,2),(841,278,9,3),(842,279,2,1),(843,279,4,2),(844,279,9,3),(845,283,2,1),(846,283,4,2),(847,283,9,3),(848,282,2,1),(849,282,4,2),(850,282,9,3),(851,284,2,1),(852,284,4,2),(853,284,9,3),(854,285,2,1),(855,285,4,2),(856,285,9,3),(857,286,2,1),(858,286,4,2),(859,286,9,3),(860,287,2,1),(861,287,4,2),(862,287,9,3),(863,288,2,1),(864,288,4,2),(865,288,9,3),(866,289,2,1),(867,289,4,2),(868,289,9,3),(869,290,2,1),(870,290,4,2),(871,290,9,3),(872,291,2,1),(873,291,4,2),(874,291,9,3),(875,292,2,1),(876,292,4,2),(877,292,9,3),(878,293,2,1),(879,293,4,2),(880,293,9,3),(881,294,2,1),(882,294,4,2),(883,294,9,3),(884,295,2,1),(885,295,4,2),(886,295,9,3),(887,296,2,1),(888,296,4,2),(889,296,9,3),(890,297,2,1),(891,297,4,2),(892,297,9,3),(893,298,2,1),(894,298,4,2),(895,298,9,3),(896,299,2,1),(897,299,4,2),(898,299,9,3),(899,300,2,1),(900,300,4,2),(901,300,9,3),(902,301,2,1),(903,301,4,2),(904,301,9,3),(905,302,2,1),(906,302,4,2),(907,302,9,3),(908,303,2,1),(909,303,4,2),(910,303,9,3),(911,304,2,1),(912,304,4,2),(913,304,9,3),(914,306,2,1),(915,306,4,2),(916,306,9,3),(917,305,1,1),(918,305,2,1),(919,305,4,2),(920,305,9,3),(921,307,2,1),(922,307,4,2),(923,307,9,3),(924,309,2,1),(925,309,4,2),(926,309,9,3),(927,308,2,1),(928,308,4,2),(929,308,9,3),(930,311,2,1),(931,311,4,2),(932,311,9,3),(933,312,2,1),(934,312,4,2),(935,312,9,3),(936,313,1,1),(937,313,2,1),(938,313,4,2),(939,313,9,3),(940,314,1,1),(941,314,2,1),(942,314,4,2),(943,314,9,3),(944,315,1,1),(945,315,2,1),(946,315,4,2),(947,315,9,3),(948,316,2,1),(949,316,4,2),(950,316,9,3),(951,317,1,1),(952,317,2,1),(953,317,4,2),(954,317,9,3),(955,319,1,1),(956,319,2,1),(957,319,4,2),(958,319,9,3),(959,318,1,1),(960,318,2,1),(961,318,4,2),(962,318,9,3),(963,320,1,1),(964,320,2,1),(965,320,4,2),(966,320,9,3),(967,321,1,1),(968,321,2,1),(969,321,4,2),(970,321,9,3),(971,322,2,1),(972,322,4,2),(973,322,9,3),(974,323,1,1),(975,323,2,1),(976,323,4,2),(977,323,9,3),(978,324,1,1),(979,324,2,1),(980,324,4,2),(981,324,9,3),(982,325,1,1),(983,325,2,1),(984,325,4,2),(985,325,9,3),(986,326,2,1),(987,326,4,2),(988,326,8,3),(989,332,2,1),(990,332,4,2),(991,332,9,3),(992,328,1,1),(993,328,2,1),(994,328,4,2),(995,328,9,3),(996,333,2,1),(997,333,4,2),(998,333,9,3),(999,334,1,1),(1000,334,2,1),(1001,334,4,2),(1002,334,9,3),(1003,335,1,1),(1004,335,2,1),(1005,335,4,2),(1006,335,9,3),(1007,336,2,1),(1008,336,4,2),(1009,336,9,3),(1010,337,1,1),(1011,337,2,1),(1012,337,4,2),(1013,337,9,3),(1014,338,1,1),(1015,338,2,1),(1016,338,4,2),(1017,338,9,3),(1018,339,1,1),(1019,339,2,1),(1020,339,4,2),(1021,339,9,3),(1022,340,2,1),(1023,340,4,2),(1024,340,9,3),(1025,341,1,1),(1026,341,2,1),(1027,341,4,2),(1028,341,9,3),(1029,342,2,1),(1030,342,4,2),(1031,342,9,3),(1032,346,2,1),(1033,346,4,2),(1034,346,8,3),(1035,345,2,1),(1036,345,4,2),(1037,345,8,3),(1038,347,2,1),(1039,347,4,2),(1040,347,8,3),(1041,348,2,1),(1042,348,4,2),(1043,348,8,3),(1044,349,2,1),(1045,349,4,2),(1046,349,8,3),(1047,350,2,1),(1048,350,4,2),(1049,350,9,3),(1050,351,2,1),(1051,351,4,2),(1052,351,9,3),(1053,352,2,1),(1054,352,4,2),(1055,352,9,3),(1056,353,2,1),(1057,353,4,2),(1058,353,9,3),(1059,354,2,1),(1060,354,4,2),(1061,354,9,3),(1062,355,1,1),(1063,355,2,1),(1064,355,3,2),(1065,355,9,3),(1066,356,1,1),(1067,356,2,1),(1068,356,3,2),(1069,356,9,3),(1070,357,1,1),(1071,357,3,2),(1072,357,9,3),(1073,358,1,1),(1074,358,2,1),(1075,358,3,2),(1076,358,9,3),(1077,359,1,1),(1078,359,3,2),(1079,359,9,3),(1080,360,1,1),(1081,360,2,1),(1082,360,3,2),(1083,360,9,3),(1084,362,1,1),(1085,362,2,1),(1086,362,3,2),(1087,362,9,3),(1088,361,1,1),(1089,361,2,1),(1090,361,3,2),(1091,361,9,3),(1092,363,2,1),(1093,363,3,2),(1094,363,9,3),(1095,364,1,1),(1096,364,2,1),(1097,364,3,2),(1098,364,9,3),(1099,365,1,1),(1100,365,2,1),(1101,365,3,2),(1102,365,9,3),(1103,366,1,1),(1104,366,2,1),(1105,366,3,2),(1106,366,9,3),(1107,367,1,1),(1108,367,3,2),(1109,367,9,3),(1110,368,1,1),(1111,368,2,1),(1112,368,3,2),(1113,368,9,3),(1114,369,1,1),(1115,369,2,1),(1116,369,3,2),(1117,369,9,3),(1118,370,1,1),(1119,370,3,2),(1120,370,9,3),(1121,371,1,1),(1122,371,2,1),(1123,371,3,2),(1124,371,9,3),(1125,372,1,1),(1126,372,2,1),(1127,372,3,2),(1128,372,9,3),(1129,373,1,1),(1130,373,3,2),(1131,373,9,3),(1132,374,1,1),(1133,374,2,1),(1134,374,3,2),(1135,374,9,3),(1136,375,1,1),(1137,375,2,1),(1138,375,3,2),(1139,375,9,3),(1140,376,1,1),(1141,376,3,2),(1142,376,9,3),(1143,377,1,1),(1144,377,2,1),(1145,377,3,2),(1146,377,9,3),(1147,378,1,1),(1148,378,3,2),(1149,378,9,3),(1150,379,2,1),(1151,379,3,2),(1152,379,9,3),(1153,380,1,1),(1154,380,3,2),(1155,380,9,3),(1156,381,1,1),(1157,381,3,2),(1158,381,9,3),(1159,382,1,1),(1160,382,2,1),(1161,382,3,2),(1162,382,9,3),(1163,383,1,1),(1164,383,3,2),(1165,383,9,3),(1166,385,1,1),(1167,385,3,2),(1168,385,9,3),(1169,384,1,1),(1170,384,2,1),(1171,384,3,2),(1172,384,9,3),(1173,386,1,1),(1174,386,2,1),(1175,386,3,2),(1176,386,9,3),(1177,387,1,1),(1178,387,3,2),(1179,387,9,3),(1180,389,1,1),(1181,389,2,1),(1182,389,3,2),(1183,389,9,3),(1184,388,1,1),(1185,388,2,1),(1186,388,3,2),(1187,388,9,3),(1188,391,1,1),(1189,391,3,2),(1190,391,9,3),(1191,390,1,1),(1192,390,3,2),(1193,390,9,3),(1194,392,1,1),(1195,392,3,2),(1196,392,9,3),(1197,393,1,1),(1198,393,3,2),(1199,393,9,3),(1200,394,2,1),(1201,394,3,2),(1202,394,9,3),(1203,395,1,1),(1204,395,3,2),(1205,395,9,3),(1206,396,1,1),(1207,396,3,2),(1208,396,9,3),(1209,398,1,1),(1210,398,3,2),(1211,398,9,3),(1212,399,1,1),(1213,399,2,1),(1214,399,3,2),(1215,399,9,3),(1216,401,1,1),(1217,401,3,2),(1218,401,9,3),(1219,403,1,1),(1220,403,2,1),(1221,403,3,2),(1222,403,9,3),(1223,402,1,1),(1224,402,3,2),(1225,402,9,3),(1226,405,1,1),(1227,405,3,2),(1228,405,9,3),(1229,406,1,1),(1230,406,3,2),(1231,406,9,3),(1232,407,1,1),(1233,407,2,1),(1234,407,3,2),(1235,407,9,3),(1236,408,1,1),(1237,408,3,2),(1238,408,9,3),(1239,410,1,1),(1240,410,3,2),(1241,410,9,3),(1242,411,1,1),(1243,411,3,2),(1244,411,9,3),(1245,413,1,1),(1246,413,3,2),(1247,413,9,3),(1248,414,1,1),(1249,414,2,1),(1250,414,3,2),(1251,414,9,3),(1252,412,1,1),(1253,412,2,1),(1254,412,3,2),(1255,412,9,3),(1256,415,1,1),(1257,415,2,1),(1258,415,3,2),(1259,415,9,3),(1260,417,1,1),(1261,417,2,1),(1262,417,3,2),(1263,417,9,3),(1264,419,1,1),(1265,419,2,1),(1266,419,3,2),(1267,419,9,3),(1268,420,1,1),(1269,420,2,1),(1270,420,3,2),(1271,420,9,3),(1272,422,1,1),(1273,422,2,1),(1274,422,3,2),(1275,422,9,3),(1276,423,1,1),(1277,423,2,1),(1278,423,3,2),(1279,423,9,3),(1280,425,2,1),(1281,425,3,2),(1282,425,9,3),(1283,426,2,1),(1284,426,4,2),(1285,426,9,3),(1286,427,1,1),(1287,427,3,2),(1288,427,9,3),(1289,428,1,1),(1290,428,3,2),(1291,428,9,3),(1292,429,1,1),(1293,429,3,2),(1294,429,9,3),(1295,430,1,1),(1296,430,3,2),(1297,430,9,3),(1298,431,1,1),(1299,431,3,2),(1300,431,9,3),(1301,432,1,1),(1302,432,2,1),(1303,432,3,2),(1304,432,9,3),(1305,433,2,1),(1306,433,4,2),(1307,433,9,3),(1308,434,1,1),(1309,434,3,2),(1310,434,9,3),(1311,435,1,1),(1312,435,3,2),(1313,435,9,3),(1314,436,1,1),(1315,436,2,1),(1316,436,3,2),(1317,436,9,3),(1318,437,1,1),(1319,437,2,1),(1320,437,3,2),(1321,437,9,3),(1322,438,1,1),(1323,438,3,2),(1324,438,9,3),(1325,440,2,1),(1326,440,3,2),(1327,440,9,3),(1328,439,1,1),(1329,439,3,2),(1330,439,9,3),(1331,441,1,1),(1332,441,3,2),(1333,441,9,3),(1334,442,1,1),(1335,442,2,1),(1336,442,3,2),(1337,442,9,3),(1338,443,2,1),(1339,443,4,2),(1340,443,9,3),(1341,444,1,1),(1342,444,3,2),(1343,444,9,3),(1344,445,1,1),(1345,445,3,2),(1346,445,9,3),(1347,446,2,1),(1348,446,4,2),(1349,446,9,3),(1350,447,1,1),(1351,447,3,2),(1352,447,9,3),(1353,448,1,1),(1354,448,3,2),(1355,448,9,3),(1356,449,1,1),(1357,449,3,2),(1358,449,9,3),(1359,450,2,1),(1360,450,4,2),(1361,450,9,3),(1362,451,1,1),(1363,451,3,2),(1364,451,9,3),(1365,452,1,1),(1366,452,3,2),(1367,452,9,3),(1368,453,1,1),(1369,453,3,2),(1370,453,9,3),(1371,454,1,1),(1372,454,3,2),(1373,454,9,3),(1374,455,2,1),(1375,455,3,2),(1376,455,9,3),(1377,456,1,1),(1378,456,3,2),(1379,456,9,3),(1380,457,1,1),(1381,457,3,2),(1382,457,9,3),(1383,458,1,1),(1384,458,3,2),(1385,458,9,3),(1386,459,1,1),(1387,459,3,2),(1388,459,9,3),(1389,460,1,1),(1390,460,3,2),(1391,460,9,3),(1392,463,1,1),(1393,463,3,2),(1394,463,9,3),(1395,462,2,1),(1396,462,4,2),(1397,462,9,3),(1398,464,1,1),(1399,464,3,2),(1400,464,9,3),(1401,465,1,1),(1402,465,3,2),(1403,465,9,3),(1404,467,1,1),(1405,467,3,2),(1406,467,9,3),(1407,468,2,1),(1408,468,4,2),(1409,468,9,3),(1410,470,1,1),(1411,470,3,2),(1412,470,9,3),(1413,471,1,1),(1414,471,3,2),(1415,471,9,3),(1416,473,1,1),(1417,473,3,2),(1418,473,9,3),(1419,474,1,1),(1420,474,3,2),(1421,474,9,3),(1422,476,1,1),(1423,476,3,2),(1424,476,9,3),(1425,475,1,1),(1426,475,3,2),(1427,475,9,3),(1428,477,1,1),(1429,477,3,2),(1430,477,9,3),(1431,478,1,1),(1432,478,3,2),(1433,478,9,3),(1434,479,1,1),(1435,479,3,2),(1436,479,9,3),(1437,480,1,1),(1438,480,3,2),(1439,480,9,3),(1440,481,1,1),(1441,481,3,2),(1442,481,9,3),(1443,483,1,1),(1444,483,3,2),(1445,483,9,3),(1446,484,1,1),(1447,484,3,2),(1448,484,9,3),(1449,485,1,1),(1450,485,3,2),(1451,485,9,3),(1452,486,1,1),(1453,486,3,2),(1454,486,9,3),(1455,487,1,1),(1456,487,3,2),(1457,487,9,3),(1458,488,1,1),(1459,488,3,2),(1460,488,9,3),(1461,489,1,1),(1462,489,3,2),(1463,489,9,3),(1464,490,1,1),(1465,490,3,2),(1466,490,9,3),(1467,491,1,1),(1468,491,3,2),(1469,491,9,3),(1470,492,1,1),(1471,492,3,2),(1472,492,9,3),(1473,493,1,1),(1474,493,3,2),(1475,493,9,3),(1476,494,1,1),(1477,494,3,2),(1478,494,9,3),(1479,495,1,1),(1480,495,3,2),(1481,495,9,3),(1482,496,1,1),(1483,496,3,2),(1484,496,9,3),(1485,497,2,1),(1486,497,4,2),(1487,497,9,3),(1488,498,2,1),(1489,498,4,2),(1490,498,8,3),(1491,499,1,1),(1492,499,3,2),(1493,499,9,3),(1494,501,1,1),(1495,501,3,2),(1496,501,9,3),(1497,503,2,1),(1498,503,4,2),(1499,503,8,3),(1500,511,1,1),(1501,511,2,1),(1502,511,4,2),(1503,511,9,3),(1504,513,1,1),(1505,513,4,2),(1506,513,9,3),(1507,512,1,1),(1508,512,4,2),(1509,512,9,3),(1510,514,1,1),(1511,514,4,2),(1512,514,9,3),(1513,515,1,1),(1514,515,4,2),(1515,515,9,3),(1516,517,1,1),(1517,517,2,1),(1518,517,4,2),(1519,517,9,3),(1520,516,1,1),(1521,516,2,1),(1522,516,4,2),(1523,516,9,3),(1524,518,2,1),(1525,518,4,2),(1526,518,9,3),(1527,519,1,1),(1528,519,4,2),(1529,519,9,3),(1530,520,1,1),(1531,520,2,1),(1532,520,4,2),(1533,520,9,3),(1534,521,2,1),(1535,521,4,2),(1536,521,9,3),(1537,522,1,1),(1538,522,4,2),(1539,522,9,3),(1540,523,1,1),(1541,523,4,2),(1542,523,9,3),(1543,527,1,1),(1544,527,4,2),(1545,527,9,3),(1546,524,2,1),(1547,524,4,2),(1548,524,9,3),(1549,526,1,1),(1550,526,4,2),(1551,526,9,3),(1552,525,1,1),(1553,525,4,2),(1554,525,9,3),(1555,528,1,1),(1556,528,2,1),(1557,528,4,2),(1558,528,9,3),(1559,529,1,1),(1560,529,2,1),(1561,529,4,2),(1562,529,9,3),(1563,530,2,1),(1564,530,4,2),(1565,530,9,3),(1566,531,2,1),(1567,531,4,2),(1568,531,9,3),(1569,533,1,1),(1570,533,2,1),(1571,533,4,2),(1572,533,9,3),(1573,536,2,1),(1574,536,4,2),(1575,536,9,3),(1576,537,2,1),(1577,537,4,2),(1578,537,9,3),(1579,538,2,1),(1580,538,4,2),(1581,538,9,3),(1582,539,2,1),(1583,539,4,2),(1584,539,9,3),(1585,541,2,1),(1586,541,4,2),(1587,541,9,3),(1588,540,2,1),(1589,540,4,2),(1590,540,9,3),(1591,542,2,1),(1592,542,4,2),(1593,542,9,3),(1594,543,2,1),(1595,543,4,2),(1596,543,9,3),(1597,544,2,1),(1598,544,4,2),(1599,544,9,3),(1600,546,2,1),(1601,546,4,2),(1602,546,9,3),(1603,552,2,1),(1604,552,4,2),(1605,552,9,3),(1606,553,2,1),(1607,553,4,2),(1608,553,9,3),(1609,554,2,1),(1610,554,4,2),(1611,554,9,3),(1612,555,2,1),(1613,555,4,2),(1614,555,9,3),(1615,556,2,1),(1616,556,4,2),(1617,556,9,3),(1618,558,2,1),(1619,558,4,2),(1620,558,9,3),(1621,557,2,1),(1622,557,4,2),(1623,557,9,3),(1624,561,2,1),(1625,561,4,2),(1626,561,9,3),(1627,562,1,1),(1628,562,3,2),(1629,562,8,3),(1630,563,1,1),(1631,563,3,2),(1632,563,8,3),(1633,564,2,1),(1634,564,3,2),(1635,564,8,3),(1636,565,2,1),(1637,565,3,2),(1638,565,8,3),(1639,566,1,1),(1640,566,3,2),(1641,566,8,3),(1642,567,1,1),(1643,567,3,2),(1644,567,8,3),(1645,568,2,1),(1646,568,3,2),(1647,568,8,3),(1648,569,1,1),(1649,569,2,1),(1650,569,3,2),(1651,569,8,3),(1652,570,1,1),(1653,570,3,2),(1654,570,8,3),(1655,571,2,1),(1656,571,4,2),(1657,571,8,3),(1658,572,1,1),(1659,572,2,1),(1660,572,3,2),(1661,572,8,3),(1662,573,2,1),(1663,573,4,2),(1664,573,8,3),(1665,574,2,1),(1666,574,4,2),(1667,574,8,3),(1668,575,1,1),(1669,575,2,1),(1670,575,3,2),(1671,575,8,3),(1672,576,2,1),(1673,576,4,2),(1674,576,8,3),(1675,577,2,1),(1676,577,3,2),(1677,577,8,3),(1678,578,2,1),(1679,578,3,2),(1680,578,8,3),(1681,579,2,1),(1682,579,3,2),(1683,579,8,3),(1684,580,1,1),(1685,580,3,2),(1686,580,8,3),(1687,582,2,1),(1688,582,3,2),(1689,582,8,3),(1690,581,1,1),(1691,581,2,1),(1692,581,3,2),(1693,581,8,3),(1694,583,1,1),(1695,583,3,2),(1696,583,8,3),(1697,584,1,1),(1698,584,2,1),(1699,584,3,2),(1700,584,8,3),(1701,585,2,1),(1702,585,3,2),(1703,585,8,3),(1704,586,2,1),(1705,586,3,2),(1706,586,8,3),(1707,587,2,1),(1708,587,3,2),(1709,587,8,3),(1710,588,1,1),(1711,588,2,1),(1712,588,3,2),(1713,588,8,3),(1714,589,2,1),(1715,589,4,2),(1716,589,8,3),(1717,590,2,1),(1718,590,4,2),(1719,590,8,3),(1720,591,2,1),(1721,591,4,2),(1722,591,8,3),(1723,592,2,1),(1724,592,4,2),(1725,592,8,3),(1726,593,1,1),(1727,593,3,2),(1728,593,8,3),(1729,594,1,1),(1730,594,2,1),(1731,594,3,2),(1732,594,8,3),(1733,595,1,1),(1734,595,3,2),(1735,595,8,3),(1736,596,2,1),(1737,596,4,2),(1738,596,8,3),(1739,597,1,1),(1740,597,3,2),(1741,597,8,3),(1742,598,1,1),(1743,598,3,2),(1744,598,8,3),(1745,599,1,1),(1746,599,3,2),(1747,599,8,3),(1748,602,1,1),(1749,602,3,2),(1750,602,8,3),(1751,603,2,1),(1752,603,4,2),(1753,603,8,3),(1754,604,2,1),(1755,604,4,2),(1756,604,8,3),(1757,605,2,1),(1758,605,4,2),(1759,605,8,3),(1760,606,2,1),(1761,606,4,2),(1762,606,8,3),(1763,608,2,1),(1764,608,4,2),(1765,608,8,3),(1766,609,2,1),(1767,609,4,2),(1768,609,8,3),(1769,607,2,1),(1770,607,4,2),(1771,607,8,3),(1772,611,2,1),(1773,611,4,2),(1774,611,8,3),(1775,612,1,1),(1776,612,3,2),(1777,612,8,3),(1778,613,1,1),(1779,613,2,1),(1780,613,3,2),(1781,613,8,3),(1782,615,1,1),(1783,615,3,2),(1784,615,8,3),(1785,614,1,1),(1786,614,2,1),(1787,614,3,2),(1788,614,8,3),(1789,619,1,1),(1790,619,3,2),(1791,619,8,3),(1792,618,1,1),(1793,618,3,2),(1794,618,8,3),(1795,617,1,1),(1796,617,2,1),(1797,617,3,2),(1798,617,8,3),(1799,621,1,1),(1800,621,3,2),(1801,621,8,3),(1802,620,1,1),(1803,620,3,2),(1804,620,8,3),(1805,622,1,1),(1806,622,2,1),(1807,622,3,2),(1808,622,8,3),(1809,624,1,1),(1810,624,3,2),(1811,624,8,3),(1812,623,1,1),(1813,623,2,1),(1814,623,3,2),(1815,623,8,3),(1816,625,1,1),(1817,625,3,2),(1818,625,8,3),(1819,628,1,1),(1820,628,2,1),(1821,628,3,2),(1822,628,8,3),(1823,626,1,1),(1824,626,2,1),(1825,626,3,2),(1826,626,8,3),(1827,627,1,1),(1828,627,2,1),(1829,627,3,2),(1830,627,8,3),(1831,629,1,1),(1832,629,3,2),(1833,629,8,3),(1834,630,1,1),(1835,630,3,2),(1836,630,8,3),(1837,631,1,1),(1838,631,3,2),(1839,631,8,3),(1840,632,1,1),(1841,632,2,1),(1842,632,3,2),(1843,632,8,3),(1844,633,1,1),(1845,633,3,2),(1846,633,8,3),(1847,634,1,1),(1848,634,2,1),(1849,634,3,2),(1850,634,8,3),(1851,635,1,1),(1852,635,3,2),(1853,635,8,3),(1854,636,1,1),(1855,636,2,1),(1856,636,3,2),(1857,636,8,3),(1858,638,1,1),(1859,638,3,2),(1860,638,8,3),(1861,639,2,1),(1862,639,4,2),(1863,639,8,3),(1864,640,1,1),(1865,640,2,1),(1866,640,3,2),(1867,640,8,3),(1868,645,1,1),(1869,645,2,1),(1870,645,3,2),(1871,645,8,3),(1872,646,1,1),(1873,646,2,1),(1874,646,3,2),(1875,646,8,3),(1876,647,2,1),(1877,647,3,2),(1878,647,8,3),(1879,649,1,1),(1880,649,2,1),(1881,649,3,2),(1882,649,8,3),(1883,650,2,1),(1884,650,3,2),(1885,650,8,3),(1886,648,1,1),(1887,648,2,1),(1888,648,3,2),(1889,648,8,3),(1890,651,2,1),(1891,651,4,2),(1892,651,8,3),(1893,652,1,1),(1894,652,2,1),(1895,652,3,2),(1896,652,8,3),(1897,653,2,1),(1898,653,4,2),(1899,653,8,3),(1900,654,2,1),(1901,654,3,2),(1902,654,8,3),(1903,655,2,1),(1904,655,4,2),(1905,655,8,3),(1906,656,1,1),(1907,656,2,1),(1908,656,3,2),(1909,656,8,3),(1910,657,1,1),(1911,657,2,1),(1912,657,3,2),(1913,657,8,3),(1914,658,1,1),(1915,658,2,1),(1916,658,3,2),(1917,658,8,3),(1918,659,1,1),(1919,659,2,1),(1920,659,3,2),(1921,659,8,3),(1922,660,1,1),(1923,660,2,1),(1924,660,3,2),(1925,660,8,3),(1926,661,1,1),(1927,661,2,1),(1928,661,3,2),(1929,661,8,3),(1930,662,1,1),(1931,662,2,1),(1932,662,3,2),(1933,662,8,3),(1934,663,1,1),(1935,663,2,1),(1936,663,3,2),(1937,663,8,3),(1938,665,1,1),(1939,665,2,1),(1940,665,3,2),(1941,665,8,3),(1942,664,1,1),(1943,664,2,1),(1944,664,3,2),(1945,664,8,3),(1946,668,2,1),(1947,668,3,2),(1948,668,8,3),(1949,666,1,1),(1950,666,2,1),(1951,666,3,2),(1952,666,8,3),(1953,667,1,1),(1954,667,2,1),(1955,667,3,2),(1956,667,8,3),(1957,670,1,1),(1958,670,2,1),(1959,670,3,2),(1960,670,8,3),(1961,669,1,1),(1962,669,2,1),(1963,669,3,2),(1964,669,8,3),(1965,679,2,1),(1966,679,4,2),(1967,679,8,3),(1968,680,2,1),(1969,680,4,2),(1970,680,8,3),(1971,681,2,1),(1972,681,4,2),(1973,681,8,3),(1974,682,2,1),(1975,682,4,2),(1976,682,8,3),(1977,685,2,1),(1978,685,3,2),(1979,685,8,3),(1980,683,2,1),(1981,683,4,2),(1982,683,8,3),(1983,686,2,1),(1984,686,4,2),(1985,686,8,3),(1986,687,2,1),(1987,687,3,2),(1988,687,8,3),(1989,689,2,1),(1990,689,4,2),(1991,689,8,3),(1992,690,2,1),(1993,690,4,2),(1994,690,9,3),(1995,691,1,1),(1996,691,3,2),(1997,691,9,3),(1998,692,1,1),(1999,692,3,2),(2000,692,8,3),(2001,693,2,1),(2002,693,4,2),(2003,693,9,3),(2004,694,1,1),(2005,694,3,2),(2006,694,9,3),(2007,695,1,1),(2008,695,3,2),(2009,695,9,3),(2010,696,2,1),(2011,696,4,2),(2012,696,9,3),(2013,697,2,1),(2014,697,4,2),(2015,697,9,3),(2016,698,2,1),(2017,698,4,2),(2018,698,9,3),(2019,699,2,1),(2020,699,4,2),(2021,699,9,3),(2022,700,2,1),(2023,700,4,2),(2024,700,8,3),(2025,701,2,1),(2026,701,4,2),(2027,701,9,3),(2028,702,2,1),(2029,702,4,2),(2030,702,9,3),(2031,703,2,1),(2032,703,4,2),(2033,703,9,3),(2034,704,1,1),(2035,704,3,2),(2036,704,8,3),(2037,705,2,1),(2038,705,4,2),(2039,705,9,3),(2040,707,2,1),(2041,707,4,2),(2042,707,9,3),(2043,708,1,1),(2044,708,3,2),(2045,708,9,3),(2046,706,1,1),(2047,706,3,2),(2048,706,9,3),(2049,709,2,1),(2050,709,4,2),(2051,709,9,3),(2052,710,2,1),(2053,710,4,2),(2054,710,9,3),(2055,711,2,1),(2056,711,4,2),(2057,711,9,3),(2058,711,8,3),(2059,712,2,1),(2060,712,4,2),(2061,712,8,3),(2062,713,2,1),(2063,713,4,2),(2064,713,9,3),(2065,713,8,3),(2066,714,2,1),(2067,714,4,2),(2068,714,9,3),(2069,716,2,1),(2070,716,4,2),(2071,716,9,3),(2072,715,2,1),(2073,715,4,2),(2074,715,9,3),(2075,717,2,1),(2076,717,1,1),(2077,717,4,2),(2078,717,9,3),(2079,718,2,1),(2080,718,4,2),(2081,718,9,3),(2082,719,2,1),(2083,719,4,2),(2084,719,9,3),(2085,720,2,1),(2086,720,4,2),(2087,720,9,3),(2088,721,1,1),(2089,721,3,2),(2090,721,9,3),(2091,722,1,1),(2092,722,3,2),(2093,722,9,3),(2094,723,2,1),(2095,723,4,2),(2096,723,9,3),(2097,724,2,1),(2098,724,4,2),(2099,724,9,3),(2100,726,1,1),(2101,726,3,2),(2102,726,9,3),(2103,725,2,1),(2104,725,4,2),(2105,725,9,3),(2106,727,1,1),(2107,727,3,2),(2108,727,9,3),(2109,728,1,1),(2110,728,3,2),(2111,728,9,3),(2112,729,1,1),(2113,729,3,2),(2114,729,9,3),(2115,730,1,1),(2116,730,3,2),(2117,730,9,3),(2118,731,1,1),(2119,731,3,2),(2120,731,9,3),(2121,732,1,1),(2122,732,3,2),(2123,732,9,3),(2124,733,1,1),(2125,733,3,2),(2126,733,9,3),(2127,734,1,1),(2128,734,3,2),(2129,734,9,3),(2130,735,2,1),(2131,735,4,2),(2132,735,9,3),(2133,736,2,1),(2134,736,4,2),(2135,736,9,3),(2136,737,2,1),(2137,737,4,2),(2138,737,9,3),(2139,738,2,1),(2140,738,4,2),(2141,738,9,3),(2142,739,1,1),(2143,739,3,2),(2144,739,9,3),(2145,741,2,1),(2146,741,4,2),(2147,741,9,3),(2148,740,1,1),(2149,740,3,2),(2150,740,9,3),(2151,742,2,1),(2152,742,4,2),(2153,742,9,3),(2154,743,1,1),(2155,743,3,2),(2156,743,9,3),(2157,744,2,1),(2158,744,4,2),(2159,744,9,3),(2160,745,2,1),(2161,745,4,2),(2162,745,9,3),(2163,746,1,1),(2164,746,3,2),(2165,746,9,3),(2166,747,2,1),(2167,747,4,2),(2168,747,9,3),(2169,748,2,1),(2170,748,4,2),(2171,748,9,3),(2172,749,1,1),(2173,749,3,2),(2174,749,9,3),(2175,750,2,1),(2176,750,4,2),(2177,750,9,3),(2178,751,1,1),(2179,751,3,2),(2180,751,9,3),(2181,752,2,1),(2182,752,4,2),(2183,752,9,3),(2184,754,2,1),(2185,754,4,2),(2186,754,9,3),(2187,753,2,1),(2188,753,4,2),(2189,753,9,3),(2190,755,2,1),(2191,755,4,2),(2192,755,9,3),(2193,757,1,1),(2194,757,3,2),(2195,757,9,3),(2196,759,1,1),(2197,759,3,2),(2198,759,9,3),(2199,756,1,1),(2200,756,3,2),(2201,756,9,3),(2202,758,1,1),(2203,758,3,2),(2204,758,9,3),(2205,760,1,1),(2206,760,3,2),(2207,760,9,3),(2208,761,1,1),(2209,761,3,2),(2210,761,9,3),(2211,763,1,1),(2212,763,3,2),(2213,763,9,3),(2214,765,1,1),(2215,765,3,2),(2216,765,9,3),(2217,762,1,1),(2218,762,3,2),(2219,762,9,3),(2220,764,1,1),(2221,764,3,2),(2222,764,9,3),(2223,766,1,1),(2224,766,3,2),(2225,766,9,3),(2226,767,1,1),(2227,767,3,2),(2228,767,9,3),(2229,768,1,1),(2230,768,3,2),(2231,768,9,3),(2232,769,1,1),(2233,769,3,2),(2234,769,9,3),(2235,771,1,1),(2236,771,2,1),(2237,771,3,2),(2238,771,9,3),(2239,772,1,1),(2240,772,3,2),(2241,772,9,3),(2242,773,2,1),(2243,773,3,2),(2244,773,9,3),(2245,774,1,1),(2246,774,3,2),(2247,774,9,3),(2248,776,1,1),(2249,776,2,1),(2250,776,3,2),(2251,776,9,3),(2252,778,2,1),(2253,778,4,2),(2254,778,8,3),(2255,782,2,1),(2256,782,4,2),(2257,782,9,3),(2258,783,2,1),(2259,783,4,2),(2260,783,9,3),(2261,784,2,1),(2262,784,4,2),(2263,784,9,3),(2264,785,2,1),(2265,785,4,2),(2266,785,9,3),(2267,787,2,1),(2268,787,4,2),(2269,787,9,3),(2270,788,2,1),(2271,788,4,2),(2272,788,9,3),(2273,789,2,1),(2274,789,4,2),(2275,789,9,3),(2276,790,2,1),(2277,790,4,2),(2278,790,9,3),(2279,791,2,1),(2280,791,4,2),(2281,791,9,3),(2282,792,2,1),(2283,792,4,2),(2284,792,9,3),(2285,793,2,1),(2286,793,4,2),(2287,793,9,3),(2288,794,2,1),(2289,794,4,2),(2290,794,9,3),(2291,795,2,1),(2292,795,4,2),(2293,795,9,3),(2294,796,2,1),(2295,796,4,2),(2296,796,9,3),(2297,797,2,1),(2298,797,4,2),(2299,797,9,3),(2300,800,2,1),(2301,800,4,2),(2302,800,9,3),(2303,799,2,1),(2304,799,4,2),(2305,799,9,3),(2306,801,2,1),(2307,801,4,2),(2308,801,9,3),(2309,802,2,1),(2310,802,4,2),(2311,802,9,3),(2312,803,2,1),(2313,803,4,2),(2314,803,9,3),(2315,805,2,1),(2316,805,4,2),(2317,805,9,3),(2318,806,2,1),(2319,806,4,2),(2320,806,9,3),(2321,809,2,1),(2322,809,4,2),(2323,809,9,3),(2324,808,2,1),(2325,808,4,2),(2326,808,9,3),(2327,810,2,1),(2328,810,4,2),(2329,810,9,3),(2330,812,2,1),(2331,812,4,2),(2332,812,9,3),(2333,811,2,1),(2334,811,4,2),(2335,811,9,3),(2336,813,2,1),(2337,813,4,2),(2338,813,9,3),(2339,817,2,1),(2340,817,4,2),(2341,817,9,3),(2342,826,1,1),(2343,826,2,1),(2344,826,3,2),(2345,826,9,3),(2346,828,2,1),(2347,828,4,2),(2348,828,8,3),(2349,827,2,1),(2350,827,4,2),(2351,827,9,3),(2352,829,2,1),(2353,829,4,2),(2354,829,9,3),(2355,830,2,1),(2356,830,4,2),(2357,830,8,3),(2358,831,2,1),(2359,831,4,2),(2360,831,8,3),(2361,832,2,1),(2362,832,4,2),(2363,832,9,3),(2364,833,2,1),(2365,833,4,2),(2366,833,9,3),(2367,834,2,1),(2368,834,4,2),(2369,834,9,3),(2370,835,1,1),(2371,835,3,2),(2372,835,9,3),(2373,836,1,1),(2374,836,3,2),(2375,836,9,3),(2376,837,1,1),(2377,837,3,2),(2378,837,9,3),(2379,838,2,1),(2380,838,4,2),(2381,838,9,3),(2382,839,1,1),(2383,839,3,2),(2384,839,9,3),(2385,841,2,1),(2386,841,4,2),(2387,841,9,3),(2388,840,2,1),(2389,840,4,2),(2390,840,9,3),(2391,842,2,1),(2392,842,4,2),(2393,842,9,3),(2394,843,2,1),(2395,843,4,2),(2396,843,9,3),(2397,844,2,1),(2398,844,4,2),(2399,844,8,3),(2400,845,2,1),(2401,845,4,2),(2402,845,9,3),(2403,847,1,1),(2404,847,2,1),(2405,847,3,2),(2406,847,9,3),(2407,846,2,1),(2408,846,4,2),(2409,846,9,3),(2410,848,2,1),(2411,848,4,2),(2412,848,9,3),(2413,853,2,1),(2414,853,4,2),(2415,853,8,3),(2416,854,2,1),(2417,854,4,2),(2418,854,8,3),(2419,855,2,1),(2420,855,4,2),(2421,855,9,3),(2422,856,1,1),(2423,856,2,1),(2424,856,4,2),(2425,856,9,3),(2426,857,1,1),(2427,857,3,2),(2428,857,9,3),(2429,858,1,1),(2430,858,2,1),(2431,858,3,2),(2432,858,9,3),(2433,859,1,1),(2434,859,3,2),(2435,859,9,3),(2436,860,1,1),(2437,860,2,1),(2438,860,3,2),(2439,860,9,3),(2440,861,2,1),(2441,861,4,2),(2442,861,9,3),(2443,862,1,1),(2444,862,2,1),(2445,862,3,2),(2446,862,9,3),(2447,864,1,1),(2448,864,2,1),(2449,864,3,2),(2450,864,9,3),(2451,863,1,1),(2452,863,2,1),(2453,863,3,2),(2454,863,9,3),(2455,865,1,1),(2456,865,2,1),(2457,865,3,2),(2458,865,9,3),(2459,866,1,1),(2460,866,2,1),(2461,866,3,2),(2462,866,9,3),(2463,867,1,1),(2464,867,2,1),(2465,867,3,2),(2466,867,9,3),(2467,868,1,1),(2468,868,3,2),(2469,868,9,3),(2470,869,1,1),(2471,869,2,1),(2472,869,3,2),(2473,869,9,3),(2474,872,1,1),(2475,872,3,2),(2476,872,9,3),(2477,870,1,1),(2478,870,3,2),(2479,870,9,3),(2480,871,1,1),(2481,871,3,2),(2482,871,9,3),(2483,874,1,1),(2484,874,3,2),(2485,874,9,3),(2486,873,1,1),(2487,873,3,2),(2488,873,9,3),(2489,876,2,1),(2490,876,4,2),(2491,876,9,3),(2492,877,2,1),(2493,877,4,2),(2494,877,9,3),(2495,878,1,1),(2496,878,2,1),(2497,878,3,2),(2498,878,9,3),(2499,879,1,1),(2500,879,3,2),(2501,879,9,3),(2502,880,1,1),(2503,880,3,2),(2504,880,9,3),(2505,881,1,1),(2506,881,2,1),(2507,881,3,2),(2508,881,9,3),(2509,884,1,1),(2510,884,2,1),(2511,884,4,2),(2512,884,9,3),(2513,885,1,1),(2514,885,3,2),(2515,885,9,3),(2516,886,1,1),(2517,886,2,1),(2518,886,3,2),(2519,886,9,3),(2520,888,2,1),(2521,888,4,2),(2522,888,9,3),(2523,889,1,1),(2524,889,2,1),(2525,889,3,2),(2526,889,9,3),(2527,890,2,1),(2528,890,4,2),(2529,890,9,3),(2530,891,2,1),(2531,891,4,2),(2532,891,9,3),(2533,892,2,1),(2534,892,4,2),(2535,892,9,3),(2536,893,2,1),(2537,893,4,2),(2538,893,9,3),(2539,895,2,1),(2540,895,4,2),(2541,895,9,3),(2542,896,2,1),(2543,896,4,2),(2544,896,9,3),(2545,897,2,1),(2546,897,4,2),(2547,897,9,3),(2548,898,1,1),(2549,898,2,1),(2550,898,3,2),(2551,898,9,3),(2552,899,2,1),(2553,899,4,2),(2554,899,9,3),(2555,900,1,1),(2556,900,2,1),(2557,900,3,2),(2558,900,9,3),(2559,901,2,1),(2560,901,4,2),(2561,901,9,3),(2562,902,2,1),(2563,902,4,2),(2564,902,9,3),(2565,903,2,1),(2566,903,4,2),(2567,903,9,3),(2568,904,1,1),(2569,904,2,1),(2570,904,3,2),(2571,904,9,3),(2572,905,1,1),(2573,905,2,1),(2574,905,3,2),(2575,905,9,3),(2576,907,2,1),(2577,907,4,2),(2578,907,8,3),(2579,913,1,1),(2580,913,2,1),(2581,913,3,2),(2582,913,9,3),(2583,915,2,1),(2584,915,4,2),(2585,915,8,3),(2586,919,2,1),(2587,919,4,2),(2588,919,9,3),(2589,926,2,1),(2590,926,4,2),(2591,926,9,3),(2592,929,2,1),(2593,929,4,2),(2594,929,9,3),(2595,930,2,1),(2596,930,4,2),(2597,930,8,3),(2598,931,2,1),(2599,931,3,2),(2600,931,8,3),(2601,932,2,1),(2602,932,3,2),(2603,932,8,3),(2604,933,2,1),(2605,933,3,2),(2606,933,8,3),(2607,935,2,1),(2608,935,3,2),(2609,935,8,3),(2610,934,2,1),(2611,934,3,2),(2612,934,8,3),(2613,936,1,1),(2614,936,3,2),(2615,936,8,3),(2616,937,2,1),(2617,937,3,2),(2618,937,8,3),(2619,938,2,1),(2620,938,3,2),(2621,938,8,3),(2622,939,1,1),(2623,939,3,2),(2624,939,8,3),(2625,940,1,1),(2626,940,3,2),(2627,940,8,3),(2628,941,1,1),(2629,941,3,2),(2630,941,8,3),(2631,942,2,1),(2632,942,3,2),(2633,942,8,3),(2634,943,1,1),(2635,943,2,1),(2636,943,3,2),(2637,943,8,3),(2638,944,1,1),(2639,944,2,1),(2640,944,3,2),(2641,944,8,3),(2642,945,1,1),(2643,945,3,2),(2644,945,8,3),(2645,946,1,1),(2646,946,2,1),(2647,946,3,2),(2648,946,8,3),(2649,947,1,1),(2650,947,2,1),(2651,947,3,2),(2652,947,8,3),(2653,948,2,1),(2654,948,3,2),(2655,948,8,3),(2656,949,2,1),(2657,949,3,2),(2658,949,8,3),(2659,950,2,1),(2660,950,3,2),(2661,950,8,3),(2662,952,1,1),(2663,952,2,1),(2664,952,3,2),(2665,952,8,3),(2666,954,2,1),(2667,954,4,2),(2668,954,9,3),(2669,956,2,1),(2670,956,3,2),(2671,956,8,3),(2672,957,2,1),(2673,957,3,2),(2674,957,8,3),(2675,955,2,1),(2676,955,3,2),(2677,955,8,3),(2678,958,2,1),(2679,958,3,2),(2680,958,8,3),(2681,959,1,1),(2682,959,3,2),(2683,959,8,3),(2684,960,2,1),(2685,960,3,2),(2686,960,8,3),(2687,961,2,1),(2688,961,4,2),(2689,961,8,3),(2690,962,1,1),(2691,962,2,1),(2692,962,3,2),(2693,962,8,3),(2694,963,2,1),(2695,963,3,2),(2696,963,8,3),(2697,965,1,1),(2698,965,2,1),(2699,965,3,2),(2700,965,8,3),(2701,966,2,1),(2702,966,4,2),(2703,966,8,3),(2704,967,2,1),(2705,967,4,2),(2706,967,9,3),(2707,968,1,1),(2708,968,2,1),(2709,968,3,2),(2710,968,8,3),(2711,969,1,1),(2712,969,2,1),(2713,969,3,2),(2714,969,8,3),(2715,970,2,1),(2716,970,4,2),(2717,970,9,3),(2718,971,2,1),(2719,971,3,2),(2720,971,8,3),(2721,972,2,1),(2722,972,3,2),(2723,972,8,3),(2724,975,2,1),(2725,975,3,2),(2726,975,8,3),(2727,974,2,1),(2728,974,3,2),(2729,974,8,3),(2730,973,2,1),(2731,973,3,2),(2732,973,8,3),(2733,976,1,1),(2734,976,2,1),(2735,976,3,2),(2736,976,8,3),(2737,977,2,1),(2738,977,3,2),(2739,977,8,3),(2740,978,2,1),(2741,978,3,2),(2742,978,8,3),(2743,979,2,1),(2744,979,3,2),(2745,979,8,3),(2746,981,2,1),(2747,981,3,2),(2748,981,8,3),(2749,982,2,1),(2750,982,3,2),(2751,982,8,3),(2752,985,1,1),(2753,985,2,1),(2754,985,3,2),(2755,985,8,3),(2756,984,1,1),(2757,984,2,1),(2758,984,3,2),(2759,984,8,3),(2760,987,2,1),(2761,987,4,2),(2762,987,9,3),(2763,986,1,1),(2764,986,3,2),(2765,986,8,3),(2766,988,2,1),(2767,988,3,2),(2768,988,8,3),(2769,989,2,1),(2770,989,3,2),(2771,989,8,3),(2772,990,1,1),(2773,990,3,2),(2774,990,8,3),(2775,991,1,1),(2776,991,2,1),(2777,991,3,2),(2778,991,8,3),(2779,993,1,1),(2780,993,3,2),(2781,993,8,3),(2782,992,2,1),(2783,992,3,2),(2784,992,8,3),(2785,995,2,1),(2786,995,3,2),(2787,995,8,3),(2788,996,1,1),(2789,996,3,2),(2790,996,8,3),(2791,994,2,1),(2792,994,4,2),(2793,994,8,3),(2794,997,2,1),(2795,997,3,2),(2796,997,8,3),(2797,998,2,1),(2798,998,3,2),(2799,998,8,3),(2800,999,2,1),(2801,999,3,2),(2802,999,8,3),(2803,1000,2,1),(2804,1000,3,2),(2805,1000,8,3),(2806,1001,2,1),(2807,1001,3,2),(2808,1001,8,3),(2809,1002,2,1),(2810,1002,3,2),(2811,1002,8,3),(2812,1003,2,1),(2813,1003,4,2),(2814,1003,8,3),(2815,1005,2,1),(2816,1005,3,2),(2817,1005,8,3),(2818,1004,1,1),(2819,1004,3,2),(2820,1004,8,3),(2821,1007,2,1),(2822,1007,3,2),(2823,1007,8,3),(2824,1008,1,1),(2825,1008,3,2),(2826,1008,8,3),(2827,1009,2,1),(2828,1009,4,2),(2829,1009,8,3),(2830,1010,1,1),(2831,1010,2,1),(2832,1010,3,2),(2833,1010,8,3),(2834,1011,2,1),(2835,1011,4,2),(2836,1011,8,3),(2837,1012,1,1),(2838,1012,3,2),(2839,1012,8,3),(2840,1014,2,1),(2841,1014,4,2),(2842,1014,8,3),(2843,1015,2,1),(2844,1015,4,2),(2845,1015,8,3),(2846,1013,1,1),(2847,1013,3,2),(2848,1013,8,3),(2849,1016,2,1),(2850,1016,4,2),(2851,1016,8,3),(2852,1017,1,1),(2853,1017,2,1),(2854,1017,3,2),(2855,1017,8,3),(2856,1018,2,1),(2857,1018,4,2),(2858,1018,8,3),(2859,1019,2,1),(2860,1019,4,2),(2861,1019,8,3),(2862,1020,2,1),(2863,1020,3,2),(2864,1020,8,3),(2865,1021,2,1),(2866,1021,3,2),(2867,1021,8,3),(2868,1022,1,1),(2869,1022,3,2),(2870,1022,8,3),(2871,1024,2,1),(2872,1024,3,2),(2873,1024,8,3),(2874,1023,1,1),(2875,1023,3,2),(2876,1023,8,3),(2877,1027,1,1),(2878,1027,2,1),(2879,1027,3,2),(2880,1027,8,3),(2881,1025,2,1),(2882,1025,3,2),(2883,1025,8,3),(2884,1026,1,1),(2885,1026,2,1),(2886,1026,3,2),(2887,1026,8,3),(2888,1028,2,1),(2889,1028,3,2),(2890,1028,8,3),(2891,1029,2,1),(2892,1029,3,2),(2893,1029,8,3),(2894,1030,2,1),(2895,1030,3,2),(2896,1030,8,3),(2897,1031,1,1),(2898,1031,3,2),(2899,1031,8,3),(2900,1032,2,1),(2901,1032,3,2),(2902,1032,8,3),(2903,1033,1,1),(2904,1033,2,1),(2905,1033,3,2),(2906,1033,8,3),(2907,1035,1,1),(2908,1035,3,2),(2909,1035,8,3),(2910,1036,2,1),(2911,1036,3,2),(2912,1036,8,3),(2913,1034,1,1),(2914,1034,2,1),(2915,1034,3,2),(2916,1034,8,3),(2917,1038,2,1),(2918,1038,3,2),(2919,1038,8,3),(2920,1037,1,1),(2921,1037,3,2),(2922,1037,8,3),(2923,1039,2,1),(2924,1039,3,2),(2925,1039,8,3),(2926,1040,1,1),(2927,1040,3,2),(2928,1040,8,3),(2929,1041,1,1),(2930,1041,3,2),(2931,1041,8,3),(2932,1042,2,1),(2933,1042,3,2),(2934,1042,8,3),(2935,1043,2,1),(2936,1043,3,2),(2937,1043,8,3),(2938,1045,2,1),(2939,1045,3,2),(2940,1045,8,3),(2941,1044,1,1),(2942,1044,2,1),(2943,1044,3,2),(2944,1044,8,3),(2945,1046,1,1),(2946,1046,3,2),(2947,1046,8,3),(2948,1048,2,1),(2949,1048,3,2),(2950,1048,8,3),(2951,1050,2,1),(2952,1050,3,2),(2953,1050,8,3),(2954,1051,2,1),(2955,1051,4,2),(2956,1051,9,3),(2957,1053,2,1),(2958,1053,3,2),(2959,1053,8,3),(2960,1055,2,1),(2961,1055,3,2),(2962,1055,8,3),(2963,1054,2,1),(2964,1054,3,2),(2965,1054,8,3),(2966,1056,2,1),(2967,1056,3,2),(2968,1056,8,3),(2969,1057,1,1),(2970,1057,3,2),(2971,1057,8,3),(2972,1058,2,1),(2973,1058,3,2),(2974,1058,8,3),(2975,1059,2,1),(2976,1059,3,2),(2977,1059,8,3),(2978,1060,2,1),(2979,1060,3,2),(2980,1060,8,3),(2981,1061,1,1),(2982,1061,2,1),(2983,1061,3,2),(2984,1061,8,3),(2985,1063,1,1),(2986,1063,3,2),(2987,1063,8,3),(2988,1064,2,1),(2989,1064,4,2),(2990,1064,8,3),(2991,1062,2,1),(2992,1062,4,2),(2993,1062,8,3),(2994,1065,1,1),(2995,1065,2,1),(2996,1065,3,2),(2997,1065,8,3),(2998,1066,2,1),(2999,1066,4,2),(3000,1066,8,3),(3001,1067,1,1),(3002,1067,2,1),(3003,1067,3,2),(3004,1067,8,3),(3005,1068,1,1),(3006,1068,2,1),(3007,1068,3,2),(3008,1068,8,3),(3009,1069,2,1),(3010,1069,4,2),(3011,1069,8,3),(3012,1071,1,1),(3013,1071,2,1),(3014,1071,3,2),(3015,1071,8,3),(3016,1070,1,1),(3017,1070,2,1),(3018,1070,3,2),(3019,1070,8,3),(3020,1072,2,1),(3021,1072,4,2),(3022,1072,9,3),(3023,1073,1,1),(3024,1073,2,1),(3025,1073,3,2),(3026,1073,8,3),(3027,1074,1,1),(3028,1074,2,1),(3029,1074,3,2),(3030,1074,8,3),(3031,1075,1,1),(3032,1075,3,2),(3033,1075,8,3),(3034,1076,1,1),(3035,1076,2,1),(3036,1076,3,2),(3037,1076,8,3),(3038,1077,1,1),(3039,1077,2,1),(3040,1077,3,2),(3041,1077,8,3),(3042,1078,1,1),(3043,1078,2,1),(3044,1078,3,2),(3045,1078,8,3),(3046,1079,1,1),(3047,1079,2,1),(3048,1079,3,2),(3049,1079,8,3),(3050,1080,2,1),(3051,1080,3,2),(3052,1080,8,3),(3053,1081,1,1),(3054,1081,2,1),(3055,1081,3,2),(3056,1081,8,3),(3057,1082,1,1),(3058,1082,2,1),(3059,1082,3,2),(3060,1082,8,3),(3061,1083,2,1),(3062,1083,4,2),(3063,1083,8,3),(3064,1084,2,1),(3065,1084,3,2),(3066,1084,8,3),(3067,1087,1,1),(3068,1087,2,1),(3069,1087,3,2),(3070,1087,8,3),(3071,1088,1,1),(3072,1088,2,1),(3073,1088,3,2),(3074,1088,8,3),(3075,1094,1,1),(3076,1094,2,1),(3077,1094,3,2),(3078,1094,8,3),(3079,1104,2,1),(3080,1104,4,2),(3081,1104,8,3),(3082,1105,2,1),(3083,1105,4,2),(3084,1105,9,3),(3085,1106,2,1),(3086,1106,4,2),(3087,1106,8,3),(3088,1107,2,1),(3089,1107,4,2),(3090,1107,8,3),(3091,1108,2,1),(3092,1108,4,2),(3093,1108,9,3),(3094,1109,2,1),(3095,1109,4,2),(3096,1109,8,3),(3097,1110,2,1),(3098,1110,4,2),(3099,1110,8,3),(3100,1111,2,1),(3101,1111,4,2),(3102,1111,8,3),(3103,1113,2,1),(3104,1113,4,2),(3105,1113,8,3),(3106,1114,2,1),(3107,1114,4,2),(3108,1114,8,3),(3109,1115,2,1),(3110,1115,4,2),(3111,1115,8,3),(3112,1117,2,1),(3113,1117,4,2),(3114,1117,8,3),(3115,1123,2,1),(3116,1123,4,2),(3117,1123,8,3),(3118,1136,2,1),(3119,1136,4,2),(3120,1136,9,3),(3121,1137,2,1),(3122,1137,4,2),(3123,1137,9,3),(3124,1138,2,1),(3125,1138,4,2),(3126,1138,9,3),(3127,1139,2,1),(3128,1139,4,2),(3129,1139,9,3),(3130,1140,2,1),(3131,1140,4,2),(3132,1140,9,3),(3133,1141,2,1),(3134,1141,4,2),(3135,1141,9,3),(3136,1142,2,1),(3137,1142,4,2),(3138,1142,9,3),(3139,1143,2,1),(3140,1143,4,2),(3141,1143,9,3),(3142,1144,1,1),(3143,1144,2,1),(3144,1144,4,2),(3145,1144,9,3),(3146,1145,2,1),(3147,1145,4,2),(3148,1145,9,3),(3149,1146,2,1),(3150,1146,4,2),(3151,1146,9,3),(3152,1147,2,1),(3153,1147,4,2),(3154,1147,9,3),(3155,1148,2,1),(3156,1148,4,2),(3157,1148,9,3),(3158,1149,2,1),(3159,1149,4,2),(3160,1149,9,3),(3161,1151,2,1),(3162,1151,4,2),(3163,1151,9,3),(3164,1150,2,1),(3165,1150,4,2),(3166,1150,9,3),(3167,1152,2,1),(3168,1152,4,2),(3169,1152,9,3),(3170,1153,2,1),(3171,1153,4,2),(3172,1153,9,3),(3173,1154,2,1),(3174,1154,4,2),(3175,1154,9,3),(3176,1155,2,1),(3177,1155,4,2),(3178,1155,9,3),(3179,1156,1,1),(3180,1156,2,1),(3181,1156,4,2),(3182,1156,9,3),(3183,1157,2,1),(3184,1157,4,2),(3185,1157,9,3),(3186,1158,2,1),(3187,1158,4,2),(3188,1158,9,3),(3189,1160,2,1),(3190,1160,4,2),(3191,1160,9,3),(3192,1159,2,1),(3193,1159,4,2),(3194,1159,9,3),(3195,1161,2,1),(3196,1161,4,2),(3197,1161,9,3),(3198,1162,2,1),(3199,1162,4,2),(3200,1162,9,3),(3201,1163,2,1),(3202,1163,4,2),(3203,1163,9,3),(3204,1164,2,1),(3205,1164,4,2),(3206,1164,9,3),(3207,1165,2,1),(3208,1165,4,2),(3209,1165,9,3),(3210,1166,2,1),(3211,1166,4,2),(3212,1166,9,3),(3213,1167,2,1),(3214,1167,4,2),(3215,1167,9,3),(3216,1168,2,1),(3217,1168,4,2),(3218,1168,9,3),(3219,1169,2,1),(3220,1169,4,2),(3221,1169,9,3),(3222,1170,2,1),(3223,1170,4,2),(3224,1170,9,3),(3225,1171,2,1),(3226,1171,4,2),(3227,1171,9,3),(3228,1172,2,1),(3229,1172,4,2),(3230,1172,9,3),(3231,1173,2,1),(3232,1173,4,2),(3233,1173,9,3),(3234,1174,2,1),(3235,1174,4,2),(3236,1174,9,3),(3237,1175,2,1),(3238,1175,4,2),(3239,1175,9,3),(3240,1176,2,1),(3241,1176,4,2),(3242,1176,9,3),(3243,1177,2,1),(3244,1177,4,2),(3245,1177,9,3),(3246,1178,2,1),(3247,1178,4,2),(3248,1178,9,3),(3249,1179,2,1),(3250,1179,4,2),(3251,1179,9,3),(3252,1184,2,1),(3253,1184,3,2),(3254,1184,9,3),(3255,1186,2,1),(3256,1186,4,2),(3257,1186,9,3),(3258,1194,2,1),(3259,1194,4,2),(3260,1194,9,3),(3261,1201,2,1),(3262,1201,4,2),(3263,1201,9,3),(3264,1211,2,1),(3265,1211,3,2),(3266,1211,8,3),(3267,1217,1,1),(3268,1217,3,2),(3269,1217,8,3),(3270,1237,1,1),(3271,1237,2,1),(3272,1237,3,2),(3273,1237,8,3),(3274,1239,2,1),(3275,1239,4,2),(3276,1239,8,3),(3277,1243,2,1),(3278,1243,3,2),(3279,1243,8,3),(3280,1249,2,1),(3281,1249,4,2),(3282,1249,8,3),(3283,1254,2,1),(3284,1254,4,2),(3285,1254,8,3),(3286,1262,2,1),(3287,1262,3,2),(3288,1262,8,3),(3289,1271,1,1),(3290,1271,3,2),(3291,1271,8,3),(3292,1279,2,1),(3293,1279,4,2),(3294,1279,8,3),(3295,1281,2,1),(3296,1281,4,2),(3297,1281,8,3),(3298,1285,2,1),(3299,1285,4,2),(3300,1285,8,3),(3301,1286,1,1),(3302,1286,2,1),(3303,1286,3,2),(3304,1286,8,3),(3305,1289,1,1),(3306,1289,2,1),(3307,1289,3,2),(3308,1289,8,3),(3309,1309,2,1),(3310,1309,3,2),(3311,1309,8,3),(3312,1317,2,1),(3313,1317,4,2),(3314,1317,8,3),(3315,1323,2,1),(3316,1323,4,2),(3317,1323,8,3),(3318,1324,2,1),(3319,1324,4,2),(3320,1324,8,3),(3321,1329,2,1),(3322,1329,4,2),(3323,1329,8,3),(3324,1332,2,1),(3325,1332,3,2),(3326,1332,8,3),(3327,1476,1,1),(3328,1476,2,1),(3329,1476,4,2),(3330,1476,9,3),(3331,1478,2,1),(3332,1478,4,2),(3333,1478,9,3),(3334,1479,1,1),(3335,1479,2,1),(3336,1479,4,2),(3337,1479,9,3),(3338,1480,1,1),(3339,1480,2,1),(3340,1480,4,2),(3341,1480,9,3),(3342,1481,1,1),(3343,1481,2,1),(3344,1481,4,2),(3345,1481,9,3),(3346,1483,1,1),(3347,1483,4,2),(3348,1483,9,3),(3349,1485,2,1),(3350,1485,4,2),(3351,1485,9,3),(3352,1486,1,1),(3353,1486,2,1),(3354,1486,4,2),(3355,1486,9,3),(3356,1487,1,1),(3357,1487,4,2),(3358,1487,9,3),(3359,1489,1,1),(3360,1489,2,1),(3361,1489,3,2),(3362,1489,9,3),(3363,1491,1,1),(3364,1491,4,2),(3365,1491,9,3),(3366,1492,1,1),(3367,1492,2,1),(3368,1492,3,2),(3369,1492,9,3),(3370,1493,1,1),(3371,1493,2,1),(3372,1493,4,2),(3373,1493,9,3),(3374,1494,1,1),(3375,1494,4,2),(3376,1494,9,3),(3377,1495,2,1),(3378,1495,4,2),(3379,1495,9,3),(3380,1496,1,1),(3381,1496,4,2),(3382,1496,9,3),(3383,1497,1,1),(3384,1497,4,2),(3385,1497,9,3),(3386,1499,1,1),(3387,1499,2,1),(3388,1499,4,2),(3389,1499,9,3),(3390,1502,1,1),(3391,1502,2,1),(3392,1502,4,2),(3393,1502,9,3),(3394,1503,1,1),(3395,1503,4,2),(3396,1503,9,3),(3397,1500,1,1),(3398,1500,4,2),(3399,1500,9,3),(3400,1504,1,1),(3401,1504,4,2),(3402,1504,9,3),(3403,1505,1,1),(3404,1505,2,1),(3405,1505,4,2),(3406,1505,9,3),(3407,1501,1,1),(3408,1501,2,1),(3409,1501,4,2),(3410,1501,9,3),(3411,1506,1,1),(3412,1506,2,1),(3413,1506,4,2),(3414,1506,9,3),(3415,1507,1,1),(3416,1507,2,1),(3417,1507,4,2),(3418,1507,9,3),(3419,1508,1,1),(3420,1508,2,1),(3421,1508,4,2),(3422,1508,9,3),(3423,1509,1,1),(3424,1509,4,2),(3425,1509,9,3),(3426,1511,1,1),(3427,1511,2,1),(3428,1511,4,2),(3429,1511,9,3),(3430,1510,1,1),(3431,1510,2,1),(3432,1510,4,2),(3433,1510,9,3),(3434,1512,1,1),(3435,1512,2,1),(3436,1512,4,2),(3437,1512,9,3),(3438,1514,2,1),(3439,1514,4,2),(3440,1514,9,3),(3441,1516,2,1),(3442,1516,4,2),(3443,1516,9,3),(3444,1518,2,1),(3445,1518,4,2),(3446,1518,9,3),(3447,1519,1,1),(3448,1519,4,2),(3449,1519,9,3),(3450,1520,1,1),(3451,1520,2,1),(3452,1520,3,2),(3453,1520,9,3),(3454,1521,1,1),(3455,1521,2,1),(3456,1521,4,2),(3457,1521,9,3),(3458,1522,1,1),(3459,1522,2,1),(3460,1522,4,2),(3461,1522,9,3),(3462,1523,1,1),(3463,1523,2,1),(3464,1523,4,2),(3465,1523,9,3),(3466,1524,1,1),(3467,1524,2,1),(3468,1524,4,2),(3469,1524,9,3),(3470,1525,1,1),(3471,1525,4,2),(3472,1525,9,3),(3473,1528,1,1),(3474,1528,4,2),(3475,1528,9,3),(3476,1527,1,1),(3477,1527,4,2),(3478,1527,9,3),(3479,1526,1,1),(3480,1526,2,1),(3481,1526,4,2),(3482,1526,9,3),(3483,1530,1,1),(3484,1530,2,1),(3485,1530,4,2),(3486,1530,9,3),(3487,1531,1,1),(3488,1531,2,1),(3489,1531,4,2),(3490,1531,9,3),(3491,1532,1,1),(3492,1532,2,1),(3493,1532,4,2),(3494,1532,9,3),(3495,1536,1,1),(3496,1536,2,1),(3497,1536,4,2),(3498,1536,9,3),(3499,1537,1,1),(3500,1537,2,1),(3501,1537,4,2),(3502,1537,9,3),(3503,1553,2,1),(3504,1553,4,2),(3505,1553,9,3),(3506,1554,2,1),(3507,1554,4,2),(3508,1554,9,3),(3509,1558,2,1),(3510,1558,4,2),(3511,1558,9,3),(3512,1556,2,1),(3513,1556,4,2),(3514,1556,9,3),(3515,1560,2,1),(3516,1560,4,2),(3517,1560,9,3),(3518,1559,2,1),(3519,1559,4,2),(3520,1559,9,3),(3521,1557,2,1),(3522,1557,4,2),(3523,1557,9,3),(3524,1585,1,1),(3525,1585,4,2),(3526,1585,8,3),(3527,1586,1,1),(3528,1586,4,2),(3529,1586,8,3),(3530,1587,1,1),(3531,1587,4,2),(3532,1587,8,3),(3533,1588,1,1),(3534,1588,2,1),(3535,1588,4,2),(3536,1588,8,3),(3537,1589,1,1),(3538,1589,2,1),(3539,1589,4,2),(3540,1589,8,3),(3541,1590,1,1),(3542,1590,2,1),(3543,1590,4,2),(3544,1590,8,3),(3545,1591,1,1),(3546,1591,4,2),(3547,1591,8,3),(3548,1592,1,1),(3549,1592,4,2),(3550,1592,8,3),(3551,1593,1,1),(3552,1593,4,2),(3553,1593,8,3),(3554,1594,1,1),(3555,1594,4,2),(3556,1594,8,3),(3557,1595,1,1),(3558,1595,4,2),(3559,1595,8,3),(3560,1596,1,1),(3561,1596,4,2),(3562,1596,8,3),(3563,1597,1,1),(3564,1597,4,2),(3565,1597,8,3),(3566,1598,1,1),(3567,1598,4,2),(3568,1598,8,3),(3569,1599,1,1),(3570,1599,4,2),(3571,1599,8,3),(3572,1600,1,1),(3573,1600,4,2),(3574,1600,8,3),(3575,1601,1,1),(3576,1601,4,2),(3577,1601,8,3),(3578,1603,1,1),(3579,1603,4,2),(3580,1603,8,3),(3581,1602,1,1),(3582,1602,2,1),(3583,1602,4,2),(3584,1602,8,3),(3585,1604,1,1),(3586,1604,4,2),(3587,1604,8,3),(3588,1605,1,1),(3589,1605,4,2),(3590,1605,8,3),(3591,1606,1,1),(3592,1606,4,2),(3593,1606,8,3),(3594,1607,1,1),(3595,1607,2,1),(3596,1607,4,2),(3597,1607,8,3),(3598,1608,1,1),(3599,1608,4,2),(3600,1608,8,3),(3601,1609,1,1),(3602,1609,4,2),(3603,1609,8,3),(3604,1610,1,1),(3605,1610,4,2),(3606,1610,8,3),(3607,1611,1,1),(3608,1611,4,2),(3609,1611,8,3),(3610,1612,1,1),(3611,1612,4,2),(3612,1612,8,3),(3613,1613,1,1),(3614,1613,4,2),(3615,1613,8,3),(3616,1614,1,1),(3617,1614,4,2),(3618,1614,8,3),(3619,1615,1,1),(3620,1615,4,2),(3621,1615,8,3),(3622,1616,1,1),(3623,1616,4,2),(3624,1616,8,3),(3625,1617,1,1),(3626,1617,4,2),(3627,1617,8,3),(3628,1618,1,1),(3629,1618,4,2),(3630,1618,8,3),(3631,1619,1,1),(3632,1619,4,2),(3633,1619,8,3),(3634,1620,1,1),(3635,1620,4,2),(3636,1620,8,3),(3637,1621,1,1),(3638,1621,2,1),(3639,1621,4,2),(3640,1621,8,3),(3641,1623,1,1),(3642,1623,4,2),(3643,1623,8,3),(3644,1622,1,1),(3645,1622,4,2),(3646,1622,8,3),(3647,1624,1,1),(3648,1624,4,2),(3649,1624,8,3),(3650,1625,1,1),(3651,1625,2,1),(3652,1625,4,2),(3653,1625,8,3),(3654,1628,1,1),(3655,1628,2,1),(3656,1628,4,2),(3657,1628,8,3),(3658,1629,1,1),(3659,1629,2,1),(3660,1629,4,2),(3661,1629,8,3),(3662,1631,1,1),(3663,1631,2,1),(3664,1631,4,2),(3665,1631,8,3),(3666,1636,2,1),(3667,1636,4,2),(3668,1636,8,3),(3669,1637,2,1),(3670,1637,4,2),(3671,1637,8,3),(3672,1638,2,1),(3673,1638,4,2),(3674,1638,8,3),(3675,1641,2,1),(3676,1641,4,2),(3677,1641,8,3),(3678,1642,2,1),(3679,1642,4,2),(3680,1642,8,3),(3681,1643,2,1),(3682,1643,4,2),(3683,1643,8,3),(3684,1646,2,1),(3685,1646,4,2),(3686,1646,8,3),(3687,1652,2,1),(3688,1652,4,2),(3689,1652,9,3),(3690,1653,1,1),(3691,1653,2,1),(3692,1653,4,2),(3693,1653,9,3),(3694,1654,2,1),(3695,1654,4,2),(3696,1654,9,3),(3697,1656,1,1),(3698,1656,2,1),(3699,1656,4,2),(3700,1656,9,3),(3701,1655,1,1),(3702,1655,2,1),(3703,1655,4,2),(3704,1655,9,3),(3705,1657,1,1),(3706,1657,2,1),(3707,1657,4,2),(3708,1657,9,3),(3709,1658,1,1),(3710,1658,2,1),(3711,1658,4,2),(3712,1658,9,3),(3713,1659,1,1),(3714,1659,2,1),(3715,1659,4,2),(3716,1659,9,3),(3717,1660,1,1),(3718,1660,2,1),(3719,1660,4,2),(3720,1660,9,3),(3721,1661,1,1),(3722,1661,2,1),(3723,1661,4,2),(3724,1661,9,3),(3725,1662,1,1),(3726,1662,2,1),(3727,1662,4,2),(3728,1662,9,3),(3729,1663,1,1),(3730,1663,2,1),(3731,1663,4,2),(3732,1663,9,3),(3733,1664,1,1),(3734,1664,2,1),(3735,1664,4,2),(3736,1664,9,3),(3737,1665,2,1),(3738,1665,4,2),(3739,1665,9,3),(3740,1666,1,1),(3741,1666,2,1),(3742,1666,4,2),(3743,1666,9,3),(3744,1667,2,1),(3745,1667,4,2),(3746,1667,9,3),(3747,1668,1,1),(3748,1668,2,1),(3749,1668,4,2),(3750,1668,9,3),(3751,1669,2,1),(3752,1669,4,2),(3753,1669,9,3),(3754,1671,1,1),(3755,1671,2,1),(3756,1671,4,2),(3757,1671,9,3),(3758,1672,1,1),(3759,1672,2,1),(3760,1672,4,2),(3761,1672,9,3),(3762,1670,1,1),(3763,1670,2,1),(3764,1670,4,2),(3765,1670,9,3),(3766,1673,1,1),(3767,1673,2,1),(3768,1673,4,2),(3769,1673,9,3),(3770,1674,1,1),(3771,1674,2,1),(3772,1674,4,2),(3773,1674,9,3),(3774,1675,1,1),(3775,1675,2,1),(3776,1675,4,2),(3777,1675,9,3),(3778,1676,1,1),(3779,1676,2,1),(3780,1676,4,2),(3781,1676,9,3),(3782,1677,1,1),(3783,1677,2,1),(3784,1677,4,2),(3785,1677,9,3),(3786,1680,1,1),(3787,1680,2,1),(3788,1680,4,2),(3789,1680,9,3),(3790,1678,1,1),(3791,1678,2,1),(3792,1678,4,2),(3793,1678,9,3),(3794,1679,1,1),(3795,1679,2,1),(3796,1679,4,2),(3797,1679,9,3),(3798,1681,1,1),(3799,1681,2,1),(3800,1681,4,2),(3801,1681,9,3),(3802,1682,1,1),(3803,1682,2,1),(3804,1682,4,2),(3805,1682,9,3),(3806,1687,2,1),(3807,1687,4,2),(3808,1687,9,3); +/*!40000 ALTER TABLE `exercise_related_classification` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `exercise_related_muscle` +-- + +DROP TABLE IF EXISTS `exercise_related_muscle`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `exercise_related_muscle` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'The ID of exercise related muscle.', + `exercise_id` bigint unsigned NOT NULL COMMENT 'The ID of exercise.', + `muscle_id` bigint unsigned NOT NULL COMMENT 'The ID of muscle.', + `related_muscle_type` tinyint NOT NULL COMMENT 'Related muscle type. Muscle movement classification.\n\n1 - Agonist\n2 - Antagonist\n3 - Target\n4 - Synergist\n5 - Stabilizer\n6 - Dynamic Stabilizer\n7 - Antagonist Stabilizer\n\nhttps://exrx.net/Kinesiology/Glossary#MuscleMovClass', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=6163 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Exercise Related Muscle.\n\nRelationship:\nOne exercise can have 3 (or more) different types of related muscle.\nAnd one exercise can have more than one specific type of related muscles.'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `exercise_related_muscle` +-- + +LOCK TABLES `exercise_related_muscle` WRITE; +/*!40000 ALTER TABLE `exercise_related_muscle` DISABLE KEYS */; +INSERT INTO `exercise_related_muscle` VALUES (1,1,50,3),(2,1,22,5),(3,2,50,3),(4,2,22,5),(5,3,50,3),(6,3,8,5),(7,3,45,5),(8,3,22,5),(9,4,50,3),(10,4,49,4),(11,4,22,4),(12,4,28,4),(13,4,22,5),(14,4,28,5),(15,5,50,3),(16,5,49,4),(17,5,22,4),(18,5,28,4),(19,5,22,5),(20,5,28,5),(21,5,29,5),(22,6,50,3),(23,6,49,4),(24,6,22,4),(25,6,28,4),(26,6,22,5),(27,6,28,5),(28,8,50,3),(29,8,8,5),(30,8,45,5),(31,8,22,5),(32,9,50,3),(33,9,22,5),(34,10,50,3),(35,10,22,5),(36,7,50,3),(37,7,49,4),(38,7,22,4),(39,7,28,4),(40,7,22,5),(41,7,28,5),(42,7,29,5),(43,11,50,3),(44,11,49,4),(45,12,50,3),(46,13,50,3),(47,13,49,4),(48,13,22,4),(49,13,28,4),(50,13,12,5),(51,13,12,5),(52,15,50,3),(53,15,22,5),(54,15,43,5),(55,16,50,3),(56,16,49,4),(57,16,43,5),(58,16,22,5),(59,16,18,5),(60,16,46,5),(61,16,11,5),(62,16,48,5),(63,17,50,3),(64,17,49,4),(65,17,22,5),(66,17,43,5),(67,18,50,3),(68,18,49,4),(69,18,22,4),(70,18,28,4),(71,18,12,4),(72,18,12,4),(73,18,22,5),(74,18,28,5),(75,18,12,5),(76,18,12,5),(77,19,49,3),(78,19,8,4),(79,19,29,5),(80,19,45,5),(81,20,49,3),(82,20,8,4),(83,20,29,5),(84,20,6,5),(85,20,6,5),(86,21,49,3),(87,21,8,4),(88,21,29,5),(89,21,6,5),(90,21,6,5),(91,22,49,3),(92,22,8,4),(93,26,49,3),(94,26,8,4),(95,23,49,3),(96,23,8,4),(97,25,49,3),(98,25,8,4),(99,28,49,3),(100,28,8,4),(101,28,43,4),(102,28,12,5),(103,27,49,3),(104,24,22,2),(105,24,49,3),(106,24,8,4),(107,24,29,5),(108,24,45,5),(109,24,12,5),(110,24,22,5),(111,24,22,7),(112,29,49,3),(113,29,8,4),(114,29,12,4),(115,29,43,4),(116,30,49,3),(117,31,22,2),(118,31,49,3),(119,31,8,4),(120,31,12,5),(121,31,17,5),(122,31,22,5),(123,31,22,7),(124,32,49,3),(125,33,6,3),(126,33,7,4),(127,33,52,4),(128,34,6,3),(129,34,7,4),(130,34,6,5),(131,34,38,5),(132,35,6,3),(133,35,7,4),(134,37,6,3),(135,37,7,4),(136,37,52,4),(137,36,6,3),(138,36,7,4),(139,36,38,5),(140,40,6,3),(141,40,7,4),(142,40,52,4),(143,38,6,3),(144,38,7,4),(145,38,52,4),(146,39,6,3),(147,39,7,4),(148,42,6,3),(149,42,7,4),(150,42,38,5),(151,41,6,3),(152,41,7,4),(153,41,52,4),(154,43,6,3),(155,43,7,4),(156,43,38,5),(157,44,6,3),(158,44,7,4),(159,44,38,5),(160,45,6,3),(161,45,7,4),(162,45,38,5),(163,46,6,3),(164,46,7,4),(165,46,52,4),(166,48,6,3),(167,48,7,4),(168,48,6,5),(169,48,38,5),(170,47,6,3),(171,47,7,4),(172,47,38,5),(173,51,6,3),(174,51,7,4),(175,51,38,5),(176,50,6,3),(177,50,7,4),(178,50,52,4),(179,52,6,3),(180,52,7,4),(181,52,38,5),(182,53,6,3),(183,53,7,4),(184,53,52,4),(185,49,6,3),(186,49,7,4),(187,49,52,4),(188,49,12,4),(189,49,43,4),(190,49,48,4),(191,49,22,4),(192,49,28,4),(193,49,12,4),(194,49,17,5),(195,49,11,5),(196,49,22,5),(197,49,17,6),(198,49,11,6),(199,54,6,3),(200,54,7,4),(201,54,52,4),(202,55,6,3),(203,55,7,4),(204,55,52,4),(205,56,6,3),(206,56,7,4),(207,56,52,4),(208,57,6,3),(209,57,7,4),(210,57,52,4),(211,60,6,3),(212,60,7,4),(213,60,38,5),(214,58,6,3),(215,58,7,4),(216,59,6,3),(217,59,7,4),(218,59,52,4),(219,59,22,4),(220,59,28,4),(221,61,6,3),(222,61,7,4),(223,62,6,3),(224,62,7,4),(225,63,6,3),(226,63,52,4),(227,63,22,5),(228,63,28,5),(229,64,6,3),(230,64,7,4),(231,64,52,4),(232,65,6,3),(233,65,7,4),(234,66,6,3),(235,66,7,4),(236,66,52,4),(237,67,6,3),(238,67,7,4),(239,67,52,4),(240,68,6,3),(241,68,7,4),(242,71,6,3),(243,71,7,4),(244,69,6,3),(245,69,7,4),(246,69,52,4),(247,72,6,3),(248,72,7,4),(249,72,52,4),(250,70,6,3),(251,70,7,4),(252,73,6,3),(253,73,7,4),(254,74,6,3),(255,75,6,3),(256,76,6,3),(257,77,6,3),(258,77,7,4),(259,77,43,5),(260,77,18,5),(261,77,46,5),(262,77,22,5),(263,78,6,3),(264,78,7,4),(265,78,43,5),(266,78,18,5),(267,78,46,5),(268,78,22,5),(269,79,22,2),(270,79,6,3),(271,79,7,4),(272,79,12,5),(273,79,17,5),(274,79,38,5),(275,79,22,5),(276,79,22,7),(277,80,6,3),(278,81,7,3),(279,81,6,4),(280,81,52,4),(281,81,38,5),(282,82,7,3),(283,82,6,4),(284,82,52,4),(285,82,3,4),(286,82,4,4),(287,82,19,4),(288,82,29,4),(289,84,7,3),(290,84,6,4),(291,84,52,4),(292,84,3,4),(293,84,4,4),(294,84,19,4),(295,84,29,4),(296,83,7,3),(297,83,6,4),(298,83,52,4),(299,83,38,5),(300,85,7,3),(301,85,6,4),(302,85,52,4),(303,85,38,5),(304,86,7,3),(305,86,6,4),(306,86,52,4),(307,86,3,4),(308,86,4,4),(309,86,19,4),(310,86,29,4),(311,87,7,3),(312,87,6,4),(313,87,52,4),(314,87,3,4),(315,87,4,4),(316,87,19,4),(317,87,29,4),(318,88,7,3),(319,88,6,4),(320,88,52,4),(321,88,3,4),(322,88,4,4),(323,88,19,4),(324,88,29,4),(325,89,7,3),(326,89,6,4),(327,89,52,4),(328,89,3,4),(329,89,4,4),(330,89,19,4),(331,89,29,4),(332,90,7,3),(333,90,6,4),(334,90,52,4),(335,90,3,4),(336,90,4,4),(337,90,19,4),(338,90,29,4),(339,91,7,3),(340,91,6,4),(341,91,52,4),(342,91,38,5),(343,92,7,3),(344,92,52,4),(345,92,29,4),(346,92,19,4),(347,92,6,4),(348,92,8,4),(349,92,38,5),(350,92,17,5),(351,92,12,5),(352,93,7,3),(353,93,52,4),(354,93,29,4),(355,93,19,4),(356,93,6,4),(357,93,8,4),(358,93,38,5),(359,94,7,3),(360,94,6,4),(361,94,52,4),(362,94,38,5),(363,95,7,3),(364,95,6,4),(365,95,52,4),(366,95,3,4),(367,95,4,4),(368,95,19,4),(369,95,29,4),(370,96,7,3),(371,96,8,4),(372,96,52,4),(373,96,38,5),(374,97,7,3),(375,97,52,4),(376,97,29,4),(377,97,19,4),(378,97,6,4),(379,97,8,4),(380,97,38,5),(381,97,17,5),(382,97,12,5),(383,99,7,3),(384,99,6,4),(385,99,52,4),(386,99,38,5),(387,98,7,3),(388,98,6,4),(389,98,52,4),(390,98,3,4),(391,98,4,4),(392,98,19,4),(393,98,29,4),(394,100,7,3),(395,100,8,4),(396,100,52,4),(397,100,38,5),(398,101,7,3),(399,101,6,4),(400,101,52,4),(401,101,38,5),(402,102,7,3),(403,102,6,4),(404,102,52,4),(405,102,3,4),(406,102,4,4),(407,102,19,4),(408,102,29,4),(409,103,7,3),(410,103,8,4),(411,103,52,4),(412,103,3,4),(413,103,4,4),(414,103,19,4),(415,103,29,4),(416,105,7,3),(417,105,6,4),(418,105,52,4),(419,105,3,4),(420,105,4,4),(421,105,19,4),(422,105,29,4),(423,104,7,3),(424,104,6,4),(425,104,52,4),(426,104,3,4),(427,104,4,4),(428,104,19,4),(429,104,29,4),(430,107,7,3),(431,107,6,4),(432,107,52,4),(433,106,7,3),(434,106,6,4),(435,106,52,4),(436,109,7,3),(437,109,6,4),(438,109,52,4),(439,109,38,5),(440,108,7,3),(441,108,6,4),(442,108,52,4),(443,108,3,4),(444,108,4,4),(445,108,19,4),(446,108,29,4),(447,110,7,3),(448,110,6,4),(449,110,52,4),(450,110,38,5),(451,112,7,3),(452,113,7,3),(453,114,22,2),(454,114,7,3),(455,114,6,4),(456,114,52,4),(457,114,29,4),(458,114,19,4),(459,114,12,5),(460,114,17,5),(461,114,38,5),(462,114,22,5),(463,114,22,7),(464,115,7,3),(465,115,6,4),(466,115,52,4),(467,115,3,4),(468,115,4,4),(469,115,19,4),(470,115,29,4),(471,116,7,3),(472,116,6,4),(473,116,52,4),(474,116,3,4),(475,116,4,4),(476,116,19,4),(477,116,29,4),(478,117,8,3),(479,117,19,4),(480,117,29,4),(481,117,7,4),(482,117,45,4),(483,117,3,4),(484,117,4,4),(485,118,8,3),(486,118,7,4),(487,118,19,4),(488,118,29,4),(489,118,45,4),(490,118,38,5),(491,119,8,3),(492,119,19,4),(493,119,29,4),(494,119,7,4),(495,119,45,4),(496,119,3,4),(497,119,4,4),(498,120,8,3),(499,120,7,4),(500,120,19,4),(501,120,29,4),(502,120,45,4),(503,120,38,5),(504,122,8,3),(505,122,7,4),(506,122,19,4),(507,122,29,4),(508,122,45,4),(509,122,38,5),(510,121,8,3),(511,121,7,4),(512,121,3,4),(513,121,4,4),(514,121,39,4),(515,121,29,5),(516,123,8,3),(517,123,19,4),(518,123,29,4),(519,123,7,4),(520,123,45,4),(521,123,3,4),(522,123,4,4),(523,123,17,5),(524,123,12,5),(525,124,8,3),(526,124,19,4),(527,124,29,4),(528,124,7,4),(529,124,45,4),(530,124,3,4),(531,124,4,4),(532,124,17,5),(533,124,12,5),(534,124,43,5),(535,125,8,3),(536,125,7,4),(537,125,19,4),(538,125,29,4),(539,125,45,4),(540,125,38,5),(541,125,22,5),(542,126,8,3),(543,126,19,4),(544,126,29,4),(545,126,7,4),(546,126,45,4),(547,126,3,4),(548,126,4,4),(549,126,17,5),(550,126,12,5),(551,127,8,3),(552,127,19,4),(553,127,29,4),(554,127,7,4),(555,127,45,4),(556,127,3,4),(557,127,4,4),(558,127,17,5),(559,127,12,5),(560,128,8,3),(561,128,19,4),(562,128,29,4),(563,128,7,4),(564,128,45,4),(565,128,3,4),(566,128,4,4),(567,128,12,5),(568,129,8,3),(569,129,19,4),(570,129,29,4),(571,129,7,4),(572,129,45,4),(573,129,38,5),(574,130,8,3),(575,130,7,4),(576,130,19,4),(577,130,29,4),(578,130,45,4),(579,130,38,5),(580,130,17,5),(581,130,12,5),(582,131,8,3),(583,131,19,4),(584,131,29,4),(585,131,7,4),(586,131,45,4),(587,131,3,4),(588,131,4,4),(589,133,8,3),(590,133,19,4),(591,133,29,4),(592,133,7,4),(593,133,45,4),(594,133,3,4),(595,133,4,4),(596,132,8,3),(597,132,19,4),(598,132,29,4),(599,132,7,4),(600,132,45,4),(601,132,38,5),(602,135,8,3),(603,135,19,4),(604,135,29,4),(605,135,7,4),(606,135,45,4),(607,135,3,4),(608,135,4,4),(609,134,8,3),(610,134,7,4),(611,134,19,4),(612,134,29,4),(613,134,45,4),(614,134,38,5),(615,134,17,5),(616,134,12,5),(617,134,43,5),(618,137,8,3),(619,137,19,4),(620,137,29,4),(621,137,7,4),(622,137,45,4),(623,136,8,3),(624,136,19,4),(625,136,29,4),(626,136,7,4),(627,136,45,4),(628,136,3,4),(629,136,4,4),(630,136,22,5),(631,138,8,3),(632,138,19,4),(633,138,29,4),(634,138,7,4),(635,138,45,4),(636,138,38,5),(637,138,17,5),(638,138,12,5),(639,138,43,5),(640,139,8,3),(641,139,19,4),(642,139,29,4),(643,139,52,4),(644,139,7,4),(645,139,45,4),(646,140,8,3),(647,140,19,4),(648,140,29,4),(649,140,7,4),(650,140,3,4),(651,140,4,4),(652,140,45,4),(653,141,8,3),(654,141,19,4),(655,141,29,4),(656,141,45,4),(657,141,3,4),(658,141,4,4),(659,141,7,5),(660,142,8,3),(661,142,19,4),(662,142,29,4),(663,142,45,4),(664,145,8,3),(665,145,7,4),(666,145,3,4),(667,145,4,4),(668,145,29,5),(669,144,8,3),(670,144,19,4),(671,144,29,4),(672,144,7,4),(673,144,45,4),(674,143,8,3),(675,143,19,4),(676,143,29,4),(677,143,45,4),(678,143,3,4),(679,143,4,4),(680,143,7,5),(681,147,8,3),(682,147,19,4),(683,147,29,4),(684,147,7,4),(685,147,45,4),(686,147,38,5),(687,148,8,3),(688,148,19,4),(689,148,29,4),(690,148,45,4),(691,148,17,5),(692,148,12,5),(693,148,38,5),(694,149,8,3),(695,149,19,4),(696,149,29,4),(697,149,45,4),(698,149,3,4),(699,149,4,4),(700,149,7,5),(701,150,8,3),(702,150,19,4),(703,150,29,4),(704,150,7,4),(705,150,45,4),(706,150,38,5),(707,151,8,3),(708,151,19,4),(709,151,29,4),(710,151,45,4),(711,151,17,5),(712,151,12,5),(713,151,43,5),(714,153,8,3),(715,153,19,4),(716,153,29,4),(717,153,45,4),(718,157,8,3),(719,157,19,4),(720,157,29,4),(721,157,45,4),(722,157,12,5),(723,157,43,5),(724,154,8,3),(725,154,19,4),(726,154,29,4),(727,154,45,4),(728,156,8,3),(729,156,19,4),(730,156,29,4),(731,156,7,4),(732,156,45,4),(733,156,38,5),(734,155,8,3),(735,155,19,4),(736,155,29,4),(737,155,7,4),(738,155,45,4),(739,155,38,5),(740,152,8,3),(741,152,19,4),(742,152,29,4),(743,152,7,4),(744,152,3,4),(745,152,4,4),(746,152,45,4),(747,152,17,5),(748,152,12,5),(749,152,43,5),(750,158,22,2),(751,158,8,3),(752,158,19,4),(753,158,29,4),(754,158,45,4),(755,158,3,4),(756,158,4,4),(757,158,17,5),(758,158,12,5),(759,158,7,5),(760,158,22,5),(761,158,22,7),(762,159,22,2),(763,159,8,3),(764,159,19,4),(765,159,29,4),(766,159,45,4),(767,159,3,4),(768,159,4,4),(769,159,17,5),(770,159,12,5),(771,159,7,5),(772,159,22,5),(773,159,22,7),(774,160,8,3),(775,160,19,4),(776,160,29,4),(777,160,7,4),(778,160,3,4),(779,160,4,4),(780,160,45,4),(781,160,17,5),(782,160,12,5),(783,160,43,5),(784,163,22,2),(785,163,8,3),(786,163,19,4),(787,163,29,4),(788,163,45,4),(789,163,3,4),(790,163,4,4),(791,163,17,5),(792,163,12,5),(793,163,7,5),(794,163,22,5),(795,163,22,7),(796,165,8,3),(797,164,8,3),(798,162,22,2),(799,162,8,3),(800,162,19,4),(801,162,29,4),(802,162,45,4),(803,162,17,5),(804,162,12,5),(805,162,7,5),(806,162,22,5),(807,162,22,7),(808,168,52,3),(809,168,7,4),(810,168,6,4),(811,168,6,4),(812,168,38,5),(813,167,52,3),(814,167,7,4),(815,167,6,4),(816,167,6,4),(817,167,38,5),(818,169,52,3),(819,169,7,4),(820,169,6,4),(821,169,6,4),(822,169,38,5),(823,170,52,3),(824,170,7,4),(825,170,6,4),(826,170,6,4),(827,170,38,5),(828,171,52,3),(829,171,7,4),(830,171,6,4),(831,171,6,4),(832,171,38,5),(833,172,6,4),(834,173,6,4),(835,173,29,4),(836,173,45,4),(837,174,6,4),(838,174,39,5),(839,175,6,4),(840,175,29,4),(841,175,45,4),(842,177,6,4),(843,176,6,5),(844,176,28,5),(845,176,8,5),(846,176,39,5),(847,179,6,5),(848,179,28,5),(849,179,8,5),(850,179,39,5),(851,178,6,5),(852,178,28,5),(853,178,8,5),(854,178,39,5),(855,180,6,5),(856,180,39,5),(857,181,6,5),(858,181,28,5),(859,181,8,5),(860,181,39,5),(861,182,6,5),(862,182,39,5),(863,182,22,5),(864,184,6,5),(865,184,28,5),(866,184,8,5),(867,184,39,5),(868,183,28,5),(869,183,6,5),(870,183,8,5),(871,183,29,5),(872,183,22,5),(873,183,38,5),(874,185,6,5),(875,185,22,5),(876,186,6,5),(877,186,28,5),(878,186,8,5),(879,186,39,5),(880,187,39,5),(881,188,6,5),(882,188,28,5),(883,188,8,5),(884,188,39,5),(885,189,28,4),(886,189,8,4),(887,189,29,4),(888,189,28,5),(889,189,8,5),(890,189,29,5),(891,189,22,5),(892,189,39,5),(893,190,28,5),(894,190,8,5),(895,190,29,5),(896,190,22,5),(897,190,39,5),(898,191,28,5),(899,191,8,5),(900,191,29,5),(901,191,22,5),(902,191,39,5),(903,192,28,5),(904,192,8,5),(905,192,29,5),(906,192,39,5),(907,193,28,5),(908,193,8,5),(909,193,29,5),(910,193,22,5),(911,193,39,5),(912,194,28,5),(913,194,29,5),(914,194,22,5),(915,194,28,5),(916,194,38,5),(917,195,28,5),(918,195,8,5),(919,195,29,5),(920,195,22,5),(921,195,39,5),(922,196,28,5),(923,196,8,5),(924,196,29,5),(925,196,22,5),(926,196,39,5),(927,197,28,5),(928,197,8,5),(929,197,29,5),(930,197,22,5),(931,197,38,5),(932,200,6,4),(933,200,29,4),(934,200,45,4),(935,199,38,5),(936,198,28,5),(937,198,8,5),(938,198,29,5),(939,198,39,5),(940,201,6,5),(941,201,39,5),(942,202,39,5),(943,203,38,5),(944,204,6,5),(945,204,28,5),(946,204,8,5),(947,205,8,5),(948,205,45,5),(949,206,6,5),(950,206,28,5),(951,206,8,5),(952,207,6,5),(953,207,39,5),(954,208,6,5),(955,208,28,5),(956,208,8,5),(957,209,6,5),(958,209,39,5),(959,210,38,5),(960,211,6,4),(961,212,6,4),(962,213,6,5),(963,213,39,5),(964,214,39,5),(965,215,8,5),(966,215,28,5),(967,215,29,5),(968,216,8,5),(969,216,28,5),(970,216,29,5),(971,216,39,5),(972,217,6,4),(973,217,29,4),(974,217,45,4),(975,218,8,5),(976,218,28,5),(977,218,29,5),(978,220,6,4),(979,219,6,4),(980,219,29,4),(981,219,45,4),(982,222,6,4),(983,223,8,5),(984,223,28,5),(985,223,29,5),(986,224,8,5),(987,224,28,5),(988,224,29,5),(989,225,6,4),(990,225,29,4),(991,225,45,4),(992,226,6,4),(993,228,6,4),(994,228,29,4),(995,228,45,4),(996,229,6,4),(997,231,6,4),(998,231,29,4),(999,231,45,4),(1000,230,6,4),(1001,230,29,4),(1002,230,45,4),(1003,232,6,4),(1004,232,22,5),(1005,232,43,5),(1006,233,6,4),(1007,233,22,5),(1008,234,6,4),(1009,234,29,4),(1010,234,45,4),(1011,235,6,4),(1012,235,22,5),(1013,235,43,5),(1014,236,6,4),(1015,236,29,4),(1016,236,45,4),(1017,237,6,4),(1018,237,29,4),(1019,237,45,4),(1020,238,6,4),(1021,238,29,4),(1022,238,45,4),(1023,240,6,4),(1024,240,29,4),(1025,240,45,4),(1026,242,6,4),(1027,242,22,5),(1028,242,43,5),(1029,242,11,5),(1030,242,48,5),(1031,241,29,5),(1032,241,8,5),(1033,241,29,5),(1034,241,6,5),(1035,241,22,5),(1036,241,43,5),(1037,241,11,5),(1038,243,6,4),(1039,243,29,4),(1040,243,45,4),(1041,244,6,4),(1042,244,29,4),(1043,244,45,4),(1044,245,6,4),(1045,245,29,4),(1046,245,45,4),(1047,247,6,4),(1048,247,29,4),(1049,247,45,4),(1050,246,29,5),(1051,246,8,5),(1052,246,29,5),(1053,246,6,5),(1054,246,22,5),(1055,246,43,5),(1056,246,11,5),(1057,246,39,5),(1058,252,6,4),(1059,252,29,4),(1060,252,45,4),(1061,253,3,4),(1062,253,4,4),(1063,253,39,5),(1064,254,3,4),(1065,254,4,4),(1066,254,39,5),(1067,255,3,4),(1068,255,4,4),(1069,255,8,4),(1070,255,6,4),(1071,255,39,5),(1072,256,3,4),(1073,256,4,4),(1074,256,6,5),(1075,256,39,5),(1076,257,3,4),(1077,257,4,4),(1078,257,6,5),(1079,257,39,5),(1080,258,3,4),(1081,258,4,4),(1082,258,39,5),(1083,259,3,4),(1084,259,4,4),(1085,259,6,5),(1086,259,39,5),(1087,260,3,4),(1088,260,4,4),(1089,260,6,5),(1090,260,39,5),(1091,262,3,4),(1092,262,4,4),(1093,262,6,5),(1094,262,39,5),(1095,261,3,4),(1096,261,4,4),(1097,261,39,5),(1098,263,3,4),(1099,263,4,4),(1100,263,6,5),(1101,263,39,5),(1102,264,22,2),(1103,264,45,4),(1104,264,28,4),(1105,264,8,4),(1106,264,19,4),(1107,264,29,4),(1108,264,3,4),(1109,264,4,4),(1110,264,17,5),(1111,264,12,5),(1112,264,22,7),(1113,265,3,4),(1114,265,4,4),(1115,265,39,5),(1116,266,3,4),(1117,266,4,4),(1118,266,39,5),(1119,269,3,4),(1120,269,4,4),(1121,269,6,5),(1122,269,39,5),(1123,270,3,4),(1124,270,4,4),(1125,270,28,4),(1126,270,8,4),(1127,270,45,4),(1128,270,29,4),(1129,271,22,2),(1130,271,45,4),(1131,271,28,4),(1132,271,8,4),(1133,271,19,4),(1134,271,29,4),(1135,271,3,4),(1136,271,4,4),(1137,271,17,5),(1138,271,12,5),(1139,271,22,5),(1140,271,22,7),(1141,275,3,3),(1142,275,4,4),(1143,275,39,5),(1144,276,3,3),(1145,276,4,4),(1146,276,39,5),(1147,277,3,3),(1148,277,4,4),(1149,277,22,5),(1150,277,39,5),(1151,278,3,3),(1152,278,4,4),(1153,278,39,5),(1154,281,3,3),(1155,281,4,4),(1156,281,39,5),(1157,279,3,3),(1158,279,4,4),(1159,279,39,5),(1160,280,3,3),(1161,280,4,4),(1162,280,39,5),(1163,280,45,5),(1164,282,3,3),(1165,282,4,4),(1166,282,39,5),(1167,283,3,3),(1168,283,4,4),(1169,283,39,5),(1170,284,3,3),(1171,284,4,4),(1172,284,39,5),(1173,284,45,5),(1174,285,3,3),(1175,285,4,4),(1176,285,39,5),(1177,286,3,3),(1178,286,4,4),(1179,286,39,5),(1180,287,3,3),(1181,287,4,4),(1182,287,22,5),(1183,287,39,5),(1184,290,3,3),(1185,290,4,4),(1186,290,39,5),(1187,290,45,5),(1188,288,3,3),(1189,288,4,4),(1190,288,39,5),(1191,289,3,3),(1192,289,4,4),(1193,289,39,5),(1194,291,3,3),(1195,291,4,4),(1196,291,39,5),(1197,292,3,3),(1198,292,4,4),(1199,292,39,5),(1200,293,3,3),(1201,293,4,4),(1202,293,39,5),(1203,295,3,3),(1204,295,4,4),(1205,295,39,5),(1206,294,3,3),(1207,294,4,4),(1208,294,39,5),(1209,296,3,3),(1210,296,4,4),(1211,296,39,5),(1212,297,22,2),(1213,297,3,3),(1214,297,4,4),(1215,297,12,5),(1216,297,17,5),(1217,297,39,5),(1218,297,45,5),(1219,297,22,5),(1220,297,22,7),(1221,298,3,3),(1222,298,4,4),(1223,298,39,5),(1224,299,4,3),(1225,299,3,4),(1226,299,38,5),(1227,300,4,3),(1228,300,3,4),(1229,300,6,5),(1230,301,4,3),(1231,301,3,4),(1232,301,6,5),(1233,301,38,5),(1234,302,4,3),(1235,302,3,4),(1236,302,6,5),(1237,302,38,5),(1238,303,4,3),(1239,303,3,4),(1240,303,6,5),(1241,303,38,5),(1242,304,4,3),(1243,304,3,4),(1244,304,6,5),(1245,305,3,4),(1246,305,4,4),(1247,305,6,5),(1248,305,39,5),(1249,307,4,3),(1250,307,3,4),(1251,307,38,5),(1252,306,4,3),(1253,306,3,4),(1254,306,6,5),(1255,309,4,3),(1256,309,3,4),(1257,309,38,5),(1258,308,4,3),(1259,308,3,4),(1260,308,38,5),(1261,310,4,3),(1262,311,4,3),(1263,311,3,4),(1264,311,38,5),(1265,312,39,3),(1266,312,4,5),(1267,312,3,5),(1268,312,6,5),(1269,312,38,5),(1270,313,39,3),(1271,314,39,3),(1272,315,39,3),(1273,317,39,3),(1274,319,39,3),(1275,318,39,3),(1276,320,39,3),(1277,321,39,3),(1278,323,39,3),(1279,324,39,3),(1280,325,39,3),(1281,326,39,3),(1282,327,39,3),(1283,330,39,3),(1284,329,39,3),(1285,331,39,3),(1286,328,39,3),(1287,334,38,3),(1288,335,38,3),(1289,338,38,3),(1290,337,38,3),(1291,339,38,3),(1292,340,38,3),(1293,340,4,5),(1294,340,3,5),(1295,340,6,5),(1296,340,39,5),(1297,341,38,3),(1298,343,38,3),(1299,344,38,3),(1300,355,22,2),(1301,355,28,4),(1302,355,8,4),(1303,355,45,4),(1304,355,19,4),(1305,355,29,4),(1306,355,3,4),(1307,355,4,4),(1308,355,17,5),(1309,355,12,5),(1310,355,43,5),(1311,355,22,5),(1312,355,22,7),(1313,357,45,4),(1314,357,28,4),(1315,357,8,4),(1316,357,19,4),(1317,357,29,4),(1318,357,3,4),(1319,357,4,4),(1320,356,45,4),(1321,356,28,4),(1322,356,8,4),(1323,356,19,4),(1324,356,29,4),(1325,356,3,4),(1326,356,4,4),(1327,356,17,5),(1328,356,12,5),(1329,358,22,2),(1330,358,45,4),(1331,358,28,4),(1332,358,8,4),(1333,358,19,4),(1334,358,29,4),(1335,358,3,4),(1336,358,4,4),(1337,358,17,5),(1338,358,12,5),(1339,358,22,5),(1340,358,22,7),(1341,362,45,4),(1342,362,28,4),(1343,362,8,4),(1344,362,19,4),(1345,362,29,4),(1346,362,3,4),(1347,362,4,4),(1348,359,22,2),(1349,359,45,4),(1350,359,28,4),(1351,359,8,4),(1352,359,19,4),(1353,359,29,4),(1354,359,3,4),(1355,359,4,4),(1356,359,17,5),(1357,359,12,5),(1358,359,43,5),(1359,359,22,5),(1360,359,22,7),(1361,361,45,4),(1362,361,28,4),(1363,361,8,4),(1364,361,19,4),(1365,361,29,4),(1366,361,3,4),(1367,361,4,4),(1368,363,45,4),(1369,363,28,4),(1370,363,8,4),(1371,363,19,4),(1372,363,29,4),(1373,363,3,4),(1374,363,4,4),(1375,363,22,5),(1376,363,17,5),(1377,363,12,5),(1378,360,22,2),(1379,360,28,4),(1380,360,8,4),(1381,360,45,4),(1382,360,19,4),(1383,360,29,4),(1384,360,3,4),(1385,360,4,4),(1386,360,17,5),(1387,360,12,5),(1388,360,43,5),(1389,360,22,7),(1390,364,45,4),(1391,364,28,4),(1392,364,8,4),(1393,364,19,4),(1394,364,29,4),(1395,364,3,4),(1396,364,4,4),(1397,364,22,5),(1398,364,17,5),(1399,364,12,5),(1400,365,45,4),(1401,365,28,4),(1402,365,8,4),(1403,365,19,4),(1404,365,29,4),(1405,365,3,4),(1406,365,4,4),(1407,365,22,4),(1408,365,28,4),(1409,365,17,5),(1410,365,12,5),(1411,366,45,4),(1412,366,28,4),(1413,366,8,4),(1414,366,19,4),(1415,366,29,4),(1416,366,3,4),(1417,366,4,4),(1418,366,17,5),(1419,366,12,5),(1420,366,22,5),(1421,367,45,4),(1422,367,28,4),(1423,367,8,4),(1424,367,19,4),(1425,367,29,4),(1426,367,3,4),(1427,367,4,4),(1428,367,17,5),(1429,367,12,5),(1430,368,45,4),(1431,368,28,4),(1432,368,8,4),(1433,368,19,4),(1434,368,29,4),(1435,368,3,4),(1436,368,4,4),(1437,368,22,4),(1438,368,28,4),(1439,369,22,2),(1440,369,45,4),(1441,369,28,4),(1442,369,8,4),(1443,369,19,4),(1444,369,29,4),(1445,369,3,4),(1446,369,4,4),(1447,369,22,4),(1448,369,22,7),(1449,370,45,4),(1450,370,28,4),(1451,370,8,4),(1452,370,19,4),(1453,370,29,4),(1454,370,3,4),(1455,370,4,4),(1456,370,17,5),(1457,370,12,5),(1458,371,45,4),(1459,371,28,4),(1460,371,8,4),(1461,371,19,4),(1462,371,29,4),(1463,371,3,4),(1464,371,4,4),(1465,371,22,5),(1466,374,22,2),(1467,374,45,4),(1468,374,28,4),(1469,374,8,4),(1470,374,19,4),(1471,374,29,4),(1472,374,3,4),(1473,374,4,4),(1474,374,17,5),(1475,374,12,5),(1476,374,22,5),(1477,374,22,7),(1478,372,45,4),(1479,372,28,4),(1480,372,8,4),(1481,372,19,4),(1482,372,29,4),(1483,372,3,4),(1484,372,4,4),(1485,372,17,5),(1486,372,12,5),(1487,373,22,2),(1488,373,45,4),(1489,373,28,4),(1490,373,8,4),(1491,373,19,4),(1492,373,29,4),(1493,373,3,4),(1494,373,4,4),(1495,373,17,5),(1496,373,12,5),(1497,373,22,5),(1498,373,22,7),(1499,375,45,4),(1500,375,28,4),(1501,375,8,4),(1502,375,19,4),(1503,375,29,4),(1504,375,3,4),(1505,375,4,4),(1506,376,45,4),(1507,376,28,4),(1508,376,8,4),(1509,376,19,4),(1510,376,29,4),(1511,376,3,4),(1512,376,4,4),(1513,377,45,4),(1514,377,28,4),(1515,377,8,4),(1516,377,19,4),(1517,377,29,4),(1518,377,3,4),(1519,377,4,4),(1520,378,45,4),(1521,378,28,4),(1522,378,8,4),(1523,378,19,4),(1524,378,29,4),(1525,378,3,4),(1526,378,4,4),(1527,379,45,4),(1528,379,28,4),(1529,379,8,4),(1530,379,19,4),(1531,379,29,4),(1532,379,3,4),(1533,379,4,4),(1534,379,22,4),(1535,379,28,4),(1536,380,22,2),(1537,380,45,4),(1538,380,28,4),(1539,380,8,4),(1540,380,19,4),(1541,380,29,4),(1542,380,3,4),(1543,380,4,4),(1544,380,17,5),(1545,380,12,5),(1546,380,43,5),(1547,380,22,5),(1548,380,22,7),(1549,383,45,4),(1550,383,28,4),(1551,383,8,4),(1552,383,19,4),(1553,383,29,4),(1554,383,3,4),(1555,383,4,4),(1556,382,22,2),(1557,382,45,4),(1558,382,28,4),(1559,382,8,4),(1560,382,19,4),(1561,382,29,4),(1562,382,3,4),(1563,382,4,4),(1564,382,17,5),(1565,382,12,5),(1566,382,43,5),(1567,382,22,5),(1568,382,22,7),(1569,385,45,4),(1570,385,28,4),(1571,385,8,4),(1572,385,19,4),(1573,385,29,4),(1574,385,3,4),(1575,385,4,4),(1576,384,45,4),(1577,384,28,4),(1578,384,8,4),(1579,384,19,4),(1580,384,29,4),(1581,384,3,4),(1582,384,4,4),(1583,381,22,2),(1584,381,45,4),(1585,381,28,4),(1586,381,8,4),(1587,381,19,4),(1588,381,29,4),(1589,381,3,4),(1590,381,4,4),(1591,381,17,5),(1592,381,12,5),(1593,381,43,5),(1594,381,22,5),(1595,381,22,7),(1596,386,45,4),(1597,386,28,4),(1598,386,8,4),(1599,386,19,4),(1600,386,29,4),(1601,386,3,4),(1602,386,4,4),(1603,386,22,4),(1604,387,45,4),(1605,387,28,4),(1606,387,8,4),(1607,387,19,4),(1608,387,29,4),(1609,387,3,4),(1610,387,4,4),(1611,388,45,4),(1612,388,28,4),(1613,388,8,4),(1614,388,19,4),(1615,388,29,4),(1616,388,3,4),(1617,388,4,4),(1618,389,45,4),(1619,389,28,4),(1620,389,8,4),(1621,389,19,4),(1622,389,29,4),(1623,389,3,4),(1624,389,4,4),(1625,392,45,4),(1626,392,28,4),(1627,392,8,4),(1628,392,19,4),(1629,392,29,4),(1630,392,3,4),(1631,392,4,4),(1632,391,45,4),(1633,391,28,4),(1634,391,8,4),(1635,391,19,4),(1636,391,29,4),(1637,391,3,4),(1638,391,4,4),(1639,390,45,4),(1640,390,28,4),(1641,390,8,4),(1642,390,19,4),(1643,390,29,4),(1644,390,3,4),(1645,390,4,4),(1646,393,22,2),(1647,393,45,4),(1648,393,28,4),(1649,393,8,4),(1650,393,19,4),(1651,393,29,4),(1652,393,3,4),(1653,393,4,4),(1654,393,17,5),(1655,393,12,5),(1656,393,22,5),(1657,393,22,7),(1658,394,45,4),(1659,394,28,4),(1660,394,8,4),(1661,394,19,4),(1662,394,29,4),(1663,394,3,4),(1664,394,4,4),(1665,395,45,4),(1666,395,28,4),(1667,395,8,4),(1668,395,19,4),(1669,395,29,4),(1670,395,3,4),(1671,395,4,4),(1672,395,17,5),(1673,395,12,5),(1674,396,22,2),(1675,396,45,4),(1676,396,28,4),(1677,396,8,4),(1678,396,19,4),(1679,396,29,4),(1680,396,3,4),(1681,396,4,4),(1682,396,17,5),(1683,396,12,5),(1684,396,43,5),(1685,396,22,5),(1686,396,22,7),(1687,398,22,2),(1688,398,45,4),(1689,398,28,4),(1690,398,8,4),(1691,398,19,4),(1692,398,29,4),(1693,398,3,4),(1694,398,4,4),(1695,398,17,5),(1696,398,12,5),(1697,398,43,5),(1698,398,22,5),(1699,398,22,7),(1700,399,45,4),(1701,399,28,4),(1702,399,8,4),(1703,399,19,4),(1704,399,29,4),(1705,399,3,4),(1706,399,4,4),(1707,402,45,4),(1708,402,28,4),(1709,402,8,4),(1710,402,19,4),(1711,402,29,4),(1712,402,3,4),(1713,402,4,4),(1714,401,45,4),(1715,401,28,4),(1716,401,8,4),(1717,401,19,4),(1718,401,29,4),(1719,401,3,4),(1720,401,4,4),(1721,403,45,4),(1722,403,28,4),(1723,403,8,4),(1724,403,19,4),(1725,403,29,4),(1726,403,3,4),(1727,403,4,4),(1728,405,45,4),(1729,405,28,4),(1730,405,8,4),(1731,405,19,4),(1732,405,29,4),(1733,405,3,4),(1734,405,4,4),(1735,406,45,4),(1736,406,28,4),(1737,406,8,4),(1738,406,19,4),(1739,406,29,4),(1740,406,3,4),(1741,406,4,4),(1742,407,45,4),(1743,407,28,4),(1744,407,8,4),(1745,407,19,4),(1746,407,29,4),(1747,407,3,4),(1748,407,4,4),(1749,408,45,4),(1750,408,28,4),(1751,408,8,4),(1752,408,19,4),(1753,408,29,4),(1754,408,3,4),(1755,408,4,4),(1756,410,45,4),(1757,410,28,4),(1758,410,8,4),(1759,410,19,4),(1760,410,29,4),(1761,410,3,4),(1762,410,4,4),(1763,410,17,5),(1764,410,12,5),(1765,411,22,2),(1766,411,45,4),(1767,411,28,4),(1768,411,8,4),(1769,411,19,4),(1770,411,29,4),(1771,411,3,4),(1772,411,4,4),(1773,411,17,5),(1774,411,12,5),(1775,411,22,5),(1776,411,22,7),(1777,414,22,2),(1778,414,45,4),(1779,414,28,4),(1780,414,8,4),(1781,414,19,4),(1782,414,29,4),(1783,414,3,4),(1784,414,4,4),(1785,414,17,5),(1786,414,12,5),(1787,414,22,5),(1788,414,22,7),(1789,412,22,2),(1790,412,45,4),(1791,412,28,4),(1792,412,8,4),(1793,412,19,4),(1794,412,29,4),(1795,412,3,4),(1796,412,4,4),(1797,412,17,5),(1798,412,12,5),(1799,412,22,5),(1800,412,22,7),(1801,413,22,2),(1802,413,45,4),(1803,413,28,4),(1804,413,8,4),(1805,413,19,4),(1806,413,29,4),(1807,413,3,4),(1808,413,4,4),(1809,413,17,5),(1810,413,12,5),(1811,413,43,5),(1812,413,22,5),(1813,413,22,7),(1814,415,22,2),(1815,415,45,4),(1816,415,28,4),(1817,415,8,4),(1818,415,19,4),(1819,415,29,4),(1820,415,3,4),(1821,415,4,4),(1822,415,12,5),(1823,415,17,5),(1824,415,22,5),(1825,415,22,7),(1826,417,22,2),(1827,417,45,4),(1828,417,28,4),(1829,417,8,4),(1830,417,19,4),(1831,417,29,4),(1832,417,3,4),(1833,417,4,4),(1834,417,22,5),(1835,417,22,7),(1836,419,22,2),(1837,419,45,4),(1838,419,28,4),(1839,419,8,4),(1840,419,19,4),(1841,419,29,4),(1842,419,3,4),(1843,419,4,4),(1844,419,17,5),(1845,419,12,5),(1846,419,22,5),(1847,419,22,7),(1848,420,22,2),(1849,420,45,4),(1850,420,28,4),(1851,420,8,4),(1852,420,19,4),(1853,420,29,4),(1854,420,3,4),(1855,420,4,4),(1856,420,12,5),(1857,420,17,5),(1858,420,22,5),(1859,420,22,7),(1860,422,22,2),(1861,422,45,4),(1862,422,28,4),(1863,422,8,4),(1864,422,19,4),(1865,422,29,4),(1866,422,3,4),(1867,422,4,4),(1868,422,12,5),(1869,422,17,5),(1870,422,22,5),(1871,422,22,7),(1872,423,22,2),(1873,423,45,4),(1874,423,28,4),(1875,423,8,4),(1876,423,19,4),(1877,423,29,4),(1878,423,3,4),(1879,423,4,4),(1880,423,12,5),(1881,423,22,5),(1882,423,22,7),(1883,425,45,4),(1884,425,28,4),(1885,425,8,4),(1886,425,19,4),(1887,425,29,4),(1888,425,3,4),(1889,425,4,4),(1890,425,22,4),(1891,425,28,4),(1892,425,12,5),(1893,425,17,5),(1894,426,28,4),(1895,426,8,4),(1896,426,45,4),(1897,426,29,4),(1898,426,6,5),(1899,426,39,5),(1900,427,3,4),(1901,427,4,4),(1902,427,28,4),(1903,427,45,4),(1904,427,29,4),(1905,428,3,4),(1906,428,4,4),(1907,428,28,4),(1908,428,8,4),(1909,428,45,4),(1910,428,29,4),(1911,430,3,4),(1912,430,4,4),(1913,430,28,4),(1914,430,45,4),(1915,430,29,4),(1916,429,3,4),(1917,429,4,4),(1918,429,28,4),(1919,429,8,4),(1920,429,19,4),(1921,429,29,4),(1922,429,45,4),(1923,429,29,4),(1924,431,3,4),(1925,431,4,4),(1926,431,28,4),(1927,431,8,4),(1928,431,45,4),(1929,431,29,4),(1930,432,3,4),(1931,432,4,4),(1932,432,28,4),(1933,432,8,4),(1934,432,45,4),(1935,432,29,4),(1936,433,28,4),(1937,433,8,4),(1938,433,45,4),(1939,433,29,4),(1940,433,6,5),(1941,433,39,5),(1942,434,3,4),(1943,434,4,4),(1944,434,28,4),(1945,434,8,4),(1946,434,45,4),(1947,434,29,4),(1948,435,3,4),(1949,435,4,4),(1950,435,28,4),(1951,435,8,4),(1952,435,45,4),(1953,435,29,4),(1954,436,3,4),(1955,436,4,4),(1956,436,28,4),(1957,436,8,4),(1958,436,45,4),(1959,436,29,4),(1960,437,3,4),(1961,437,4,4),(1962,437,28,4),(1963,437,8,4),(1964,437,45,4),(1965,437,29,4),(1966,438,3,4),(1967,438,4,4),(1968,438,28,4),(1969,438,8,4),(1970,438,19,4),(1971,438,29,4),(1972,438,45,4),(1973,438,29,4),(1974,440,28,4),(1975,440,8,4),(1976,440,45,4),(1977,440,29,4),(1978,440,3,4),(1979,440,4,4),(1980,440,22,5),(1981,439,3,4),(1982,439,4,4),(1983,439,28,4),(1984,439,8,4),(1985,439,45,4),(1986,439,29,4),(1987,441,3,4),(1988,441,4,4),(1989,441,28,4),(1990,441,8,4),(1991,441,45,4),(1992,441,29,4),(1993,442,3,4),(1994,442,4,4),(1995,442,28,4),(1996,442,8,4),(1997,442,19,4),(1998,442,29,4),(1999,442,45,4),(2000,442,29,4),(2001,443,28,4),(2002,443,8,4),(2003,443,45,4),(2004,443,29,4),(2005,443,6,5),(2006,443,39,5),(2007,444,3,4),(2008,444,4,4),(2009,444,28,4),(2010,444,8,4),(2011,444,19,4),(2012,444,29,4),(2013,444,45,4),(2014,444,29,4),(2015,445,3,4),(2016,445,4,4),(2017,445,28,4),(2018,445,8,4),(2019,445,19,4),(2020,445,29,4),(2021,445,45,4),(2022,445,29,4),(2023,446,28,4),(2024,446,8,4),(2025,446,45,4),(2026,446,29,4),(2027,446,22,5),(2028,446,39,5),(2029,447,3,4),(2030,447,4,4),(2031,447,28,4),(2032,447,8,4),(2033,447,45,4),(2034,447,29,4),(2035,448,3,4),(2036,448,4,4),(2037,448,28,4),(2038,448,8,4),(2039,448,45,4),(2040,448,29,4),(2041,450,28,4),(2042,450,8,4),(2043,450,45,4),(2044,450,29,4),(2045,450,39,5),(2046,449,3,4),(2047,449,4,4),(2048,449,28,4),(2049,449,8,4),(2050,449,45,4),(2051,449,29,4),(2052,451,3,4),(2053,451,4,4),(2054,451,28,4),(2055,451,29,4),(2056,451,45,4),(2057,452,3,4),(2058,452,4,4),(2059,452,28,4),(2060,452,8,4),(2061,452,19,4),(2062,452,29,4),(2063,452,45,4),(2064,452,29,4),(2065,453,3,4),(2066,453,4,4),(2067,453,28,4),(2068,453,29,4),(2069,453,45,4),(2070,454,3,4),(2071,454,4,4),(2072,454,28,4),(2073,454,8,4),(2074,454,45,4),(2075,454,29,4),(2076,455,3,4),(2077,455,4,4),(2078,455,28,4),(2079,455,8,4),(2080,455,45,4),(2081,455,29,4),(2082,455,22,4),(2083,455,28,4),(2084,456,3,4),(2085,456,4,4),(2086,456,28,4),(2087,456,8,4),(2088,456,45,4),(2089,456,29,4),(2090,457,3,4),(2091,457,4,4),(2092,457,28,4),(2093,457,29,4),(2094,457,45,4),(2095,458,3,4),(2096,458,4,4),(2097,458,28,4),(2098,458,45,4),(2099,458,29,4),(2100,459,3,4),(2101,459,4,4),(2102,459,28,4),(2103,459,8,4),(2104,459,45,4),(2105,459,29,4),(2106,460,3,4),(2107,460,4,4),(2108,460,28,4),(2109,460,8,4),(2110,460,19,4),(2111,460,29,4),(2112,460,45,4),(2113,460,29,4),(2114,462,29,4),(2115,462,28,4),(2116,462,8,4),(2117,462,45,4),(2118,463,3,4),(2119,463,4,4),(2120,463,28,4),(2121,463,8,4),(2122,463,45,4),(2123,463,29,4),(2124,464,3,4),(2125,464,4,4),(2126,464,28,4),(2127,464,8,4),(2128,464,19,4),(2129,464,29,4),(2130,464,45,4),(2131,464,29,4),(2132,465,28,4),(2133,465,29,4),(2134,465,45,4),(2135,467,3,4),(2136,467,4,4),(2137,467,28,4),(2138,467,8,4),(2139,467,45,4),(2140,467,29,4),(2141,468,29,4),(2142,468,28,4),(2143,468,8,4),(2144,468,45,4),(2145,470,3,4),(2146,470,4,4),(2147,470,28,4),(2148,470,45,4),(2149,470,29,4),(2150,471,3,4),(2151,471,4,4),(2152,471,28,4),(2153,471,45,4),(2154,471,29,4),(2155,473,3,4),(2156,473,4,4),(2157,473,28,4),(2158,473,8,4),(2159,473,45,4),(2160,473,29,4),(2161,474,3,4),(2162,474,4,4),(2163,474,28,4),(2164,474,8,4),(2165,474,45,4),(2166,474,29,4),(2167,475,3,4),(2168,475,4,4),(2169,475,28,4),(2170,475,8,4),(2171,475,45,4),(2172,475,29,4),(2173,476,3,4),(2174,476,4,4),(2175,476,28,4),(2176,476,8,4),(2177,476,19,4),(2178,476,29,4),(2179,476,45,4),(2180,476,29,4),(2181,477,3,4),(2182,477,4,4),(2183,477,28,4),(2184,477,8,4),(2185,477,19,4),(2186,477,29,4),(2187,477,45,4),(2188,477,29,4),(2189,478,3,4),(2190,478,4,4),(2191,478,28,4),(2192,478,45,4),(2193,478,29,4),(2194,479,3,4),(2195,479,4,4),(2196,479,28,4),(2197,479,8,4),(2198,479,45,4),(2199,479,29,4),(2200,481,3,4),(2201,481,4,4),(2202,481,28,4),(2203,481,8,4),(2204,481,45,4),(2205,481,29,4),(2206,483,3,4),(2207,483,4,4),(2208,483,28,4),(2209,483,45,4),(2210,483,29,4),(2211,480,3,4),(2212,480,4,4),(2213,480,28,4),(2214,480,29,4),(2215,480,45,4),(2216,484,3,4),(2217,484,4,4),(2218,484,28,4),(2219,484,45,4),(2220,484,29,4),(2221,485,3,4),(2222,485,4,4),(2223,485,28,4),(2224,485,8,4),(2225,485,45,4),(2226,485,29,4),(2227,486,3,4),(2228,486,4,4),(2229,486,28,4),(2230,486,29,4),(2231,486,45,4),(2232,487,3,4),(2233,487,4,4),(2234,487,28,4),(2235,487,8,4),(2236,487,19,4),(2237,487,29,4),(2238,487,45,4),(2239,487,29,4),(2240,488,3,4),(2241,488,4,4),(2242,488,28,4),(2243,488,29,4),(2244,488,45,4),(2245,489,3,4),(2246,489,4,4),(2247,489,28,4),(2248,489,45,4),(2249,489,29,4),(2250,490,3,4),(2251,490,4,4),(2252,490,28,4),(2253,490,45,4),(2254,490,29,4),(2255,491,3,4),(2256,491,4,4),(2257,491,28,4),(2258,491,29,4),(2259,491,45,4),(2260,492,3,4),(2261,492,4,4),(2262,492,28,4),(2263,492,8,4),(2264,492,45,4),(2265,492,29,4),(2266,494,3,4),(2267,494,4,4),(2268,494,28,4),(2269,494,29,4),(2270,494,45,4),(2271,493,3,4),(2272,493,4,4),(2273,493,28,4),(2274,493,8,4),(2275,493,19,4),(2276,493,29,4),(2277,493,45,4),(2278,493,29,4),(2279,495,3,4),(2280,495,4,4),(2281,495,28,4),(2282,495,8,4),(2283,495,19,4),(2284,495,29,4),(2285,495,45,4),(2286,495,29,4),(2287,496,3,4),(2288,496,4,4),(2289,496,28,4),(2290,496,8,4),(2291,496,45,4),(2292,496,29,4),(2293,497,18,3),(2294,497,46,4),(2295,497,28,4),(2296,497,29,4),(2297,497,8,4),(2298,497,45,4),(2299,497,22,5),(2300,497,39,5),(2301,498,28,4),(2302,498,29,4),(2303,498,8,4),(2304,498,45,4),(2305,498,22,5),(2306,498,18,5),(2307,498,46,5),(2308,498,39,5),(2309,499,3,4),(2310,499,4,4),(2311,499,28,4),(2312,499,8,4),(2313,499,19,4),(2314,499,29,4),(2315,499,45,4),(2316,499,29,4),(2317,501,3,4),(2318,501,4,4),(2319,501,28,4),(2320,501,45,4),(2321,501,29,4),(2322,503,28,4),(2323,503,29,4),(2324,503,8,4),(2325,503,45,4),(2326,503,22,5),(2327,503,18,5),(2328,503,46,5),(2329,503,39,5),(2330,518,22,5),(2331,534,45,3),(2332,535,45,3),(2333,536,29,3),(2334,536,19,4),(2335,536,8,4),(2336,536,38,5),(2337,538,19,3),(2338,538,29,4),(2339,538,8,4),(2340,538,45,5),(2341,538,38,5),(2342,537,19,3),(2343,537,29,4),(2344,537,8,4),(2345,537,45,5),(2346,537,7,5),(2347,537,38,5),(2348,539,19,3),(2349,539,29,4),(2350,539,8,4),(2351,539,45,5),(2352,539,38,5),(2353,542,19,3),(2354,542,29,4),(2355,542,8,4),(2356,542,45,5),(2357,542,7,5),(2358,542,38,5),(2359,541,29,3),(2360,541,19,4),(2361,541,8,4),(2362,541,52,4),(2363,541,7,5),(2364,541,6,5),(2365,541,6,5),(2366,541,38,5),(2367,543,19,3),(2368,543,29,4),(2369,543,8,4),(2370,543,38,5),(2371,544,29,3),(2372,544,19,4),(2373,544,8,4),(2374,544,52,4),(2375,544,6,5),(2376,544,38,5),(2377,540,29,3),(2378,540,19,4),(2379,540,8,4),(2380,540,52,4),(2381,540,45,5),(2382,540,6,5),(2383,540,38,5),(2384,545,29,3),(2385,545,19,4),(2386,545,8,4),(2387,545,52,4),(2388,545,6,5),(2389,545,38,5),(2390,546,29,3),(2391,546,19,4),(2392,546,8,4),(2393,546,52,4),(2394,546,6,5),(2395,547,19,3),(2396,549,19,3),(2397,548,19,3),(2398,550,29,3),(2399,551,29,3),(2400,552,22,2),(2401,552,19,3),(2402,552,29,4),(2403,552,8,4),(2404,552,45,4),(2405,552,12,5),(2406,552,17,5),(2407,552,28,5),(2408,552,45,5),(2409,552,38,5),(2410,552,22,5),(2411,552,22,7),(2412,553,51,3),(2413,553,28,4),(2414,553,6,4),(2415,553,39,5),(2416,554,51,3),(2417,554,28,4),(2418,554,6,4),(2419,554,29,5),(2420,554,45,5),(2421,554,39,5),(2422,555,51,3),(2423,555,28,4),(2424,555,6,4),(2425,555,39,5),(2426,559,51,3),(2427,556,51,3),(2428,556,28,4),(2429,556,6,4),(2430,556,39,5),(2431,558,51,3),(2432,558,28,4),(2433,558,6,5),(2434,557,51,3),(2435,557,28,4),(2436,557,6,4),(2437,557,29,5),(2438,557,45,5),(2439,557,39,5),(2440,560,51,3),(2441,561,51,3),(2442,561,28,4),(2443,561,6,5),(2444,561,39,5),(2445,562,6,4),(2446,562,29,4),(2447,562,45,4),(2448,562,28,4),(2449,563,6,4),(2450,563,29,4),(2451,563,45,4),(2452,563,28,4),(2453,564,6,4),(2454,564,12,5),(2455,565,6,4),(2456,567,6,4),(2457,566,6,4),(2458,566,12,5),(2459,568,6,4),(2460,569,6,4),(2461,570,6,4),(2462,570,29,4),(2463,570,45,4),(2464,570,28,4),(2465,571,6,4),(2466,571,3,5),(2467,571,39,5),(2468,572,6,4),(2469,573,6,4),(2470,573,3,5),(2471,573,39,5),(2472,574,6,4),(2473,574,3,5),(2474,574,39,5),(2475,575,6,4),(2476,576,29,4),(2477,576,45,4),(2478,576,3,5),(2479,576,39,5),(2480,576,22,5),(2481,577,6,4),(2482,578,6,4),(2483,578,29,4),(2484,579,6,4),(2485,579,22,4),(2486,579,6,4),(2487,580,6,4),(2488,582,6,4),(2489,582,29,5),(2490,582,6,5),(2491,581,6,4),(2492,583,6,4),(2493,584,6,4),(2494,585,6,4),(2495,585,6,4),(2496,585,22,4),(2497,585,28,4),(2498,585,12,4),(2499,585,6,4),(2500,586,6,4),(2501,586,29,4),(2502,587,6,4),(2503,587,29,4),(2504,588,6,4),(2505,589,6,4),(2506,589,3,5),(2507,589,39,5),(2508,590,28,4),(2509,590,8,4),(2510,590,29,4),(2511,590,45,4),(2512,590,6,5),(2513,590,39,5),(2514,591,6,4),(2515,591,3,5),(2516,591,39,5),(2517,592,28,4),(2518,592,8,4),(2519,592,29,4),(2520,592,45,4),(2521,592,6,5),(2522,592,39,5),(2523,593,6,4),(2524,594,6,4),(2525,595,6,4),(2526,596,28,4),(2527,596,8,4),(2528,596,29,4),(2529,596,45,4),(2530,596,6,5),(2531,596,39,5),(2532,597,6,4),(2533,599,6,4),(2534,599,29,4),(2535,599,45,4),(2536,599,28,4),(2537,598,6,4),(2538,598,29,4),(2539,598,45,4),(2540,598,28,4),(2541,602,6,4),(2542,603,29,4),(2543,604,29,4),(2544,604,6,4),(2545,606,29,4),(2546,605,29,4),(2547,605,3,5),(2548,605,39,5),(2549,605,22,5),(2550,608,29,4),(2551,608,6,4),(2552,608,6,4),(2553,609,29,4),(2554,609,6,4),(2555,609,6,4),(2556,609,3,5),(2557,607,29,4),(2558,607,45,4),(2559,607,3,5),(2560,607,39,5),(2561,607,22,5),(2562,611,29,4),(2563,611,6,4),(2564,611,6,4),(2565,612,6,4),(2566,613,6,4),(2567,615,6,4),(2568,614,6,4),(2569,618,6,4),(2570,617,6,4),(2571,619,6,4),(2572,619,29,4),(2573,619,45,4),(2574,619,28,4),(2575,621,6,4),(2576,620,6,4),(2577,620,29,4),(2578,620,45,4),(2579,620,28,4),(2580,622,6,4),(2581,624,6,4),(2582,624,29,4),(2583,624,45,4),(2584,624,28,4),(2585,623,6,4),(2586,623,22,5),(2587,623,43,5),(2588,623,29,5),(2589,623,6,5),(2590,628,6,4),(2591,628,22,5),(2592,628,43,5),(2593,626,6,4),(2594,627,6,4),(2595,627,22,5),(2596,627,43,5),(2597,627,29,5),(2598,627,6,5),(2599,625,6,4),(2600,625,29,4),(2601,625,45,4),(2602,625,28,4),(2603,629,6,4),(2604,629,29,4),(2605,629,45,4),(2606,629,28,4),(2607,630,6,4),(2608,630,29,4),(2609,630,45,4),(2610,630,28,4),(2611,631,6,4),(2612,631,29,4),(2613,631,45,4),(2614,631,28,4),(2615,632,6,4),(2616,632,22,5),(2617,632,29,5),(2618,632,6,5),(2619,632,43,5),(2620,632,11,5),(2621,632,48,5),(2622,633,6,4),(2623,633,29,4),(2624,633,45,4),(2625,633,28,4),(2626,634,6,4),(2627,634,22,5),(2628,634,29,5),(2629,634,6,5),(2630,634,43,5),(2631,634,11,5),(2632,634,48,5),(2633,635,6,4),(2634,635,29,4),(2635,635,45,4),(2636,635,28,4),(2637,636,6,4),(2638,636,22,5),(2639,636,29,5),(2640,636,6,5),(2641,636,43,5),(2642,636,11,5),(2643,636,48,5),(2644,638,6,4),(2645,638,29,4),(2646,638,45,4),(2647,638,28,4),(2648,639,6,4),(2649,639,22,5),(2650,639,29,5),(2651,639,6,5),(2652,639,43,5),(2653,639,11,5),(2654,639,48,5),(2655,639,3,5),(2656,639,39,5),(2657,640,6,4),(2658,640,22,5),(2659,642,29,3),(2660,645,6,4),(2661,646,6,4),(2662,649,6,4),(2663,648,6,4),(2664,647,6,4),(2665,647,6,4),(2666,647,22,5),(2667,650,6,4),(2668,650,6,4),(2669,650,22,5),(2670,651,6,4),(2671,651,3,5),(2672,651,39,5),(2673,652,6,4),(2674,655,6,4),(2675,655,3,5),(2676,655,39,5),(2677,653,6,4),(2678,653,3,5),(2679,653,39,5),(2680,653,22,5),(2681,654,6,4),(2682,654,6,4),(2683,654,22,4),(2684,654,28,4),(2685,654,12,4),(2686,654,6,4),(2687,656,6,4),(2688,657,6,4),(2689,658,6,4),(2690,659,6,4),(2691,661,6,4),(2692,662,6,4),(2693,663,6,4),(2694,660,6,4),(2695,665,6,4),(2696,664,6,4),(2697,668,6,4),(2698,666,6,4),(2699,667,6,4),(2700,669,6,4),(2701,670,6,4),(2702,671,29,3),(2703,671,45,3),(2704,677,29,3),(2705,678,29,3),(2706,678,45,3),(2707,679,6,3),(2708,679,6,5),(2709,680,6,3),(2710,680,6,5),(2711,681,6,3),(2712,681,6,5),(2713,685,6,3),(2714,685,6,4),(2715,685,22,4),(2716,682,6,3),(2717,682,6,5),(2718,683,6,3),(2719,683,6,5),(2720,686,6,3),(2721,686,6,5),(2722,687,6,3),(2723,687,29,4),(2724,687,6,4),(2725,687,22,5),(2726,687,43,5),(2727,689,22,4),(2728,689,29,5),(2729,689,6,5),(2730,690,22,4),(2731,690,28,5),(2732,690,8,5),(2733,690,45,5),(2734,690,29,5),(2735,690,6,5),(2736,691,18,4),(2737,691,46,4),(2738,691,22,4),(2739,693,22,4),(2740,692,18,4),(2741,692,46,4),(2742,692,22,4),(2743,692,6,5),(2744,692,6,5),(2745,692,7,5),(2746,692,29,5),(2747,692,6,5),(2748,694,18,4),(2749,694,46,4),(2750,694,22,4),(2751,695,18,4),(2752,695,46,4),(2753,695,22,4),(2754,696,22,4),(2755,698,22,4),(2756,698,8,5),(2757,698,45,5),(2758,698,28,5),(2759,698,29,5),(2760,699,22,4),(2761,697,22,4),(2762,697,18,5),(2763,697,46,5),(2764,697,28,5),(2765,697,8,5),(2766,697,45,5),(2767,697,29,5),(2768,697,6,5),(2769,700,22,4),(2770,700,29,5),(2771,700,6,5),(2772,701,22,4),(2773,701,28,5),(2774,701,8,5),(2775,702,22,4),(2776,702,18,5),(2777,702,46,5),(2778,702,28,5),(2779,702,8,5),(2780,702,45,5),(2781,702,29,5),(2782,702,6,5),(2783,703,22,4),(2784,703,18,5),(2785,703,46,5),(2786,703,28,5),(2787,703,8,5),(2788,703,45,5),(2789,703,29,5),(2790,703,6,5),(2791,704,18,4),(2792,704,46,4),(2793,704,22,4),(2794,704,6,5),(2795,704,6,5),(2796,704,7,5),(2797,704,29,5),(2798,704,6,5),(2799,705,22,4),(2800,705,28,5),(2801,705,8,5),(2802,707,22,4),(2803,707,46,4),(2804,707,28,5),(2805,707,8,5),(2806,708,18,4),(2807,708,46,4),(2808,708,22,4),(2809,708,29,5),(2810,708,6,5),(2811,706,18,4),(2812,706,46,4),(2813,706,22,4),(2814,706,43,5),(2815,706,28,5),(2816,706,8,5),(2817,709,22,4),(2818,709,46,5),(2819,709,28,5),(2820,709,8,5),(2821,711,22,4),(2822,710,22,4),(2823,710,46,5),(2824,710,28,5),(2825,710,8,5),(2826,712,22,4),(2827,712,29,5),(2828,712,6,5),(2829,712,43,5),(2830,712,12,5),(2831,713,22,4),(2832,713,28,5),(2833,713,8,5),(2834,716,22,4),(2835,716,28,5),(2836,716,8,5),(2837,715,22,4),(2838,715,28,5),(2839,715,8,5),(2840,714,18,4),(2841,714,46,4),(2842,714,22,4),(2843,714,28,5),(2844,714,8,5),(2845,717,22,4),(2846,717,46,4),(2847,717,17,5),(2848,717,28,5),(2849,717,8,5),(2850,718,22,4),(2851,719,22,4),(2852,720,22,4),(2853,720,6,5),(2854,721,18,4),(2855,721,46,4),(2856,721,22,4),(2857,721,6,5),(2858,722,18,4),(2859,722,46,4),(2860,722,22,4),(2861,722,6,5),(2862,723,22,4),(2863,724,22,4),(2864,724,6,5),(2865,725,22,4),(2866,727,18,4),(2867,727,46,4),(2868,727,22,4),(2869,727,6,5),(2870,728,18,4),(2871,728,46,4),(2872,728,22,4),(2873,728,6,5),(2874,726,18,4),(2875,726,46,4),(2876,726,22,4),(2877,726,6,4),(2878,726,6,5),(2879,729,18,4),(2880,729,46,4),(2881,729,22,4),(2882,729,28,4),(2883,729,8,4),(2884,729,45,4),(2885,729,29,4),(2886,729,6,5),(2887,730,18,4),(2888,730,46,4),(2889,730,22,4),(2890,730,29,5),(2891,731,18,4),(2892,731,46,4),(2893,731,22,4),(2894,731,29,5),(2895,733,18,4),(2896,733,46,4),(2897,733,22,4),(2898,733,43,5),(2899,733,28,5),(2900,733,8,5),(2901,732,18,4),(2902,732,46,4),(2903,732,22,4),(2904,732,8,5),(2905,732,29,5),(2906,732,6,5),(2907,735,22,3),(2908,736,22,3),(2909,736,28,4),(2910,736,6,5),(2911,734,18,4),(2912,734,46,4),(2913,734,22,4),(2914,737,22,3),(2915,737,28,4),(2916,738,22,3),(2917,738,46,5),(2918,738,28,5),(2919,738,8,5),(2920,739,18,4),(2921,739,46,4),(2922,739,22,4),(2923,739,43,5),(2924,739,28,5),(2925,739,8,5),(2926,741,22,3),(2927,741,28,4),(2928,740,22,3),(2929,740,18,4),(2930,740,46,4),(2931,740,6,5),(2932,742,22,3),(2933,744,22,4),(2934,745,22,4),(2935,743,22,3),(2936,743,18,4),(2937,743,46,4),(2938,743,6,5),(2939,746,22,3),(2940,746,18,4),(2941,746,46,4),(2942,746,6,5),(2943,748,22,3),(2944,747,22,4),(2945,749,22,3),(2946,749,18,4),(2947,749,46,4),(2948,749,6,5),(2949,750,22,4),(2950,750,39,5),(2951,751,18,4),(2952,751,46,4),(2953,751,22,4),(2954,752,22,4),(2955,752,6,5),(2956,753,22,4),(2957,755,22,4),(2958,755,6,5),(2959,757,18,4),(2960,757,46,4),(2961,757,22,4),(2962,757,43,4),(2963,756,18,4),(2964,756,46,4),(2965,756,22,4),(2966,754,22,4),(2967,759,18,4),(2968,759,46,4),(2969,759,22,4),(2970,759,43,5),(2971,759,28,5),(2972,759,8,5),(2973,758,18,4),(2974,758,46,4),(2975,758,22,4),(2976,758,43,5),(2977,758,28,5),(2978,758,8,5),(2979,760,18,4),(2980,760,46,4),(2981,760,22,4),(2982,760,8,5),(2983,760,29,5),(2984,760,6,5),(2985,761,18,4),(2986,761,46,4),(2987,761,22,4),(2988,761,43,5),(2989,761,28,5),(2990,761,8,5),(2991,765,18,4),(2992,765,46,4),(2993,765,22,4),(2994,765,6,5),(2995,762,18,4),(2996,762,46,4),(2997,762,22,4),(2998,762,29,5),(2999,766,18,4),(3000,766,46,4),(3001,766,22,4),(3002,766,6,5),(3003,763,18,4),(3004,763,46,4),(3005,763,22,4),(3006,763,43,4),(3007,763,8,5),(3008,763,29,5),(3009,763,6,5),(3010,764,18,4),(3011,764,46,4),(3012,764,22,4),(3013,764,29,5),(3014,767,18,4),(3015,767,46,4),(3016,767,22,4),(3017,768,18,4),(3018,768,46,4),(3019,768,22,4),(3020,768,6,5),(3021,769,18,4),(3022,769,46,4),(3023,769,22,4),(3024,769,6,5),(3025,771,45,2),(3026,771,22,4),(3027,771,18,4),(3028,771,46,4),(3029,771,28,5),(3030,771,6,5),(3031,771,6,5),(3032,771,43,5),(3033,771,45,5),(3034,771,45,7),(3035,772,18,4),(3036,772,46,4),(3037,772,22,4),(3038,772,6,5),(3039,774,18,4),(3040,774,46,4),(3041,774,22,4),(3042,773,22,2),(3043,773,22,4),(3044,773,18,4),(3045,773,46,4),(3046,773,12,4),(3047,773,17,4),(3048,773,29,5),(3049,773,28,5),(3050,773,6,5),(3051,773,45,5),(3052,773,22,5),(3053,773,22,7),(3054,776,45,2),(3055,776,22,4),(3056,776,18,4),(3057,776,46,4),(3058,776,43,5),(3059,776,28,5),(3060,776,6,5),(3061,776,6,5),(3062,776,45,5),(3063,776,45,7),(3064,778,45,2),(3065,778,22,5),(3066,778,18,5),(3067,778,43,5),(3068,778,46,5),(3069,778,28,5),(3070,778,6,5),(3071,778,45,5),(3072,778,45,7),(3073,783,22,3),(3074,783,28,4),(3075,783,12,5),(3076,783,12,5),(3077,784,22,3),(3078,784,28,4),(3079,784,45,5),(3080,784,6,5),(3081,784,8,5),(3082,784,29,5),(3083,784,28,5),(3084,789,22,3),(3085,789,28,4),(3086,787,22,3),(3087,787,18,5),(3088,787,46,5),(3089,787,28,5),(3090,787,8,5),(3091,787,45,5),(3092,787,29,5),(3093,787,6,5),(3094,785,22,3),(3095,785,28,4),(3096,785,29,5),(3097,785,6,5),(3098,785,45,5),(3099,785,7,5),(3100,785,8,5),(3101,788,22,3),(3102,788,28,4),(3103,788,28,5),(3104,788,29,5),(3105,788,45,5),(3106,788,3,5),(3107,788,4,5),(3108,790,22,3),(3109,790,28,4),(3110,790,12,5),(3111,790,29,5),(3112,790,45,5),(3113,790,7,5),(3114,790,8,5),(3115,791,22,3),(3116,791,12,4),(3117,791,6,4),(3118,791,28,4),(3119,791,29,5),(3120,791,45,5),(3121,791,7,5),(3122,791,8,5),(3123,793,22,3),(3124,793,12,4),(3125,793,6,4),(3126,793,28,4),(3127,793,29,5),(3128,793,45,5),(3129,793,8,5),(3130,793,28,5),(3131,792,22,3),(3132,792,12,4),(3133,792,6,4),(3134,792,28,4),(3135,792,6,5),(3136,792,45,5),(3137,792,8,5),(3138,792,7,5),(3139,792,52,5),(3140,792,43,5),(3141,792,12,5),(3142,792,11,5),(3143,792,48,5),(3144,794,22,3),(3145,794,28,4),(3146,794,12,5),(3147,794,12,5),(3148,795,22,3),(3149,795,28,4),(3150,795,12,5),(3151,795,29,5),(3152,795,45,5),(3153,795,7,5),(3154,795,8,5),(3155,796,22,3),(3156,796,28,4),(3157,796,28,5),(3158,796,45,5),(3159,800,22,3),(3160,800,28,4),(3161,800,12,5),(3162,800,12,5),(3163,797,22,3),(3164,797,46,5),(3165,797,28,5),(3166,797,8,5),(3167,801,22,3),(3168,801,28,4),(3169,801,12,5),(3170,801,12,5),(3171,802,22,3),(3172,802,28,4),(3173,802,29,5),(3174,802,6,5),(3175,802,45,5),(3176,802,8,5),(3177,803,22,3),(3178,803,28,4),(3179,799,22,3),(3180,799,28,4),(3181,799,29,5),(3182,799,6,5),(3183,799,45,5),(3184,799,8,5),(3185,799,12,5),(3186,805,22,3),(3187,805,28,4),(3188,805,29,5),(3189,805,6,5),(3190,806,22,3),(3191,806,18,4),(3192,806,46,4),(3193,806,28,5),(3194,806,8,5),(3195,808,22,3),(3196,808,28,5),(3197,808,8,5),(3198,809,22,3),(3199,809,28,4),(3200,809,12,5),(3201,809,12,5),(3202,812,22,3),(3203,812,28,4),(3204,812,12,5),(3205,812,12,5),(3206,810,22,3),(3207,810,28,4),(3208,810,45,5),(3209,810,8,5),(3210,811,22,3),(3211,811,28,4),(3212,811,45,5),(3213,811,8,5),(3214,813,22,3),(3215,813,28,4),(3216,813,12,5),(3217,813,29,5),(3218,813,45,5),(3219,813,7,5),(3220,813,8,5),(3221,817,22,3),(3222,817,28,4),(3223,826,22,4),(3224,826,17,4),(3225,826,12,4),(3226,826,45,5),(3227,827,22,3),(3228,827,28,4),(3229,827,45,5),(3230,827,8,5),(3231,829,22,3),(3232,829,28,4),(3233,829,45,5),(3234,829,8,5),(3235,828,22,3),(3236,828,12,4),(3237,828,12,4),(3238,828,28,4),(3239,828,16,4),(3240,828,12,4),(3241,828,7,4),(3242,828,52,4),(3243,828,28,5),(3244,828,29,5),(3245,830,22,3),(3246,830,12,4),(3247,830,12,4),(3248,830,28,4),(3249,830,16,4),(3250,830,12,4),(3251,830,7,4),(3252,830,52,4),(3253,830,28,5),(3254,830,29,5),(3255,831,22,3),(3256,831,12,4),(3257,831,12,4),(3258,831,28,4),(3259,831,12,4),(3260,831,7,4),(3261,831,52,4),(3262,831,28,5),(3263,831,29,5),(3264,832,22,3),(3265,832,28,4),(3266,834,22,3),(3267,834,28,4),(3268,834,6,5),(3269,835,22,3),(3270,835,18,4),(3271,835,46,4),(3272,835,6,5),(3273,836,22,3),(3274,836,18,4),(3275,836,46,4),(3276,836,6,5),(3277,833,22,3),(3278,833,28,4),(3279,833,6,5),(3280,833,6,5),(3281,833,43,5),(3282,833,18,5),(3283,833,46,5),(3284,838,22,3),(3285,838,28,4),(3286,838,6,5),(3287,837,22,3),(3288,837,18,4),(3289,837,46,4),(3290,837,6,5),(3291,839,22,3),(3292,839,18,4),(3293,839,46,4),(3294,839,6,5),(3295,841,22,3),(3296,840,22,3),(3297,842,22,3),(3298,842,28,4),(3299,842,12,4),(3300,842,12,4),(3301,842,16,4),(3302,842,12,4),(3303,842,6,5),(3304,842,7,5),(3305,842,52,5),(3306,842,3,5),(3307,842,4,5),(3308,842,39,5),(3309,842,28,5),(3310,842,45,5),(3311,843,22,3),(3312,843,28,4),(3313,844,22,3),(3314,844,12,4),(3315,844,12,4),(3316,844,28,4),(3317,844,16,4),(3318,844,12,4),(3319,844,7,4),(3320,844,52,4),(3321,844,28,5),(3322,844,29,5),(3323,845,22,2),(3324,845,22,3),(3325,845,28,4),(3326,845,12,4),(3327,845,12,4),(3328,845,12,5),(3329,845,17,5),(3330,845,29,5),(3331,845,45,5),(3332,845,7,5),(3333,845,8,5),(3334,845,22,5),(3335,845,22,7),(3336,846,22,3),(3337,847,45,2),(3338,847,22,3),(3339,847,18,4),(3340,847,46,4),(3341,847,28,5),(3342,847,6,5),(3343,847,6,5),(3344,847,43,5),(3345,847,45,5),(3346,847,45,7),(3347,848,22,3),(3348,848,28,4),(3349,849,22,3),(3350,850,22,3),(3351,851,22,3),(3352,852,22,3),(3353,853,22,2),(3354,853,22,3),(3355,853,12,5),(3356,853,12,5),(3357,853,28,5),(3358,853,16,5),(3359,853,12,5),(3360,853,28,5),(3361,853,29,5),(3362,853,22,5),(3363,853,22,7),(3364,854,22,2),(3365,854,22,3),(3366,854,12,5),(3367,854,12,5),(3368,854,28,5),(3369,854,12,5),(3370,854,28,5),(3371,854,29,5),(3372,854,22,5),(3373,854,22,7),(3374,855,12,4),(3375,855,17,4),(3376,855,28,5),(3377,855,8,5),(3378,855,3,5),(3379,855,4,5),(3380,855,29,5),(3381,855,45,5),(3382,856,22,2),(3383,856,12,4),(3384,856,17,4),(3385,856,43,5),(3386,856,22,5),(3387,856,22,7),(3388,857,22,2),(3389,857,12,4),(3390,857,43,4),(3391,857,17,4),(3392,857,48,4),(3393,857,17,5),(3394,857,11,5),(3395,857,45,5),(3396,857,22,5),(3397,857,17,6),(3398,857,11,6),(3399,857,22,7),(3400,860,12,4),(3401,860,17,4),(3402,860,28,5),(3403,860,8,5),(3404,860,3,5),(3405,860,4,5),(3406,860,29,5),(3407,860,45,5),(3408,859,22,2),(3409,859,12,4),(3410,859,43,4),(3411,859,48,4),(3412,859,17,5),(3413,859,11,5),(3414,859,45,5),(3415,859,22,5),(3416,859,17,6),(3417,859,11,6),(3418,859,22,7),(3419,858,12,4),(3420,858,17,4),(3421,858,28,5),(3422,858,8,5),(3423,858,3,5),(3424,858,4,5),(3425,858,29,5),(3426,858,45,5),(3427,861,12,4),(3428,861,17,4),(3429,861,28,5),(3430,861,8,5),(3431,861,3,5),(3432,861,4,5),(3433,861,29,5),(3434,861,45,5),(3435,862,22,2),(3436,862,12,4),(3437,862,43,4),(3438,862,17,4),(3439,862,48,4),(3440,862,17,5),(3441,862,11,5),(3442,862,45,5),(3443,862,22,5),(3444,862,17,6),(3445,862,11,6),(3446,862,22,7),(3447,864,22,2),(3448,864,12,4),(3449,864,43,4),(3450,864,17,4),(3451,864,48,4),(3452,864,17,5),(3453,864,11,5),(3454,864,45,5),(3455,864,22,5),(3456,864,17,6),(3457,864,11,6),(3458,864,22,7),(3459,863,22,2),(3460,863,12,4),(3461,863,43,4),(3462,863,48,4),(3463,863,17,5),(3464,863,11,5),(3465,863,45,5),(3466,863,22,5),(3467,863,17,6),(3468,863,11,6),(3469,863,22,7),(3470,865,22,2),(3471,865,12,4),(3472,865,43,4),(3473,865,17,4),(3474,865,48,4),(3475,865,17,5),(3476,865,11,5),(3477,865,45,5),(3478,865,22,5),(3479,865,17,6),(3480,865,11,6),(3481,865,22,7),(3482,866,22,2),(3483,866,12,4),(3484,866,17,4),(3485,866,43,5),(3486,866,45,5),(3487,866,22,5),(3488,866,22,7),(3489,867,22,2),(3490,867,12,4),(3491,867,17,4),(3492,867,43,5),(3493,867,45,5),(3494,867,22,7),(3495,868,22,2),(3496,868,22,2),(3497,868,12,4),(3498,868,43,4),(3499,868,48,4),(3500,868,17,5),(3501,868,11,5),(3502,868,45,5),(3503,868,22,5),(3504,868,22,5),(3505,868,17,6),(3506,868,11,6),(3507,868,22,7),(3508,868,22,7),(3509,869,22,2),(3510,869,12,4),(3511,869,17,4),(3512,869,43,5),(3513,869,45,5),(3514,869,22,5),(3515,869,22,7),(3516,872,22,2),(3517,872,17,4),(3518,872,12,4),(3519,872,45,5),(3520,872,22,7),(3521,870,22,2),(3522,870,17,4),(3523,870,12,4),(3524,870,45,5),(3525,870,22,5),(3526,870,22,7),(3527,871,22,2),(3528,871,17,4),(3529,871,12,4),(3530,871,45,5),(3531,871,22,5),(3532,871,22,7),(3533,874,22,2),(3534,874,17,4),(3535,874,12,4),(3536,874,45,5),(3537,874,22,5),(3538,874,22,7),(3539,873,22,2),(3540,873,12,4),(3541,873,43,4),(3542,873,48,4),(3543,873,17,5),(3544,873,11,5),(3545,873,45,5),(3546,873,22,5),(3547,873,17,6),(3548,873,11,6),(3549,873,22,7),(3550,876,12,5),(3551,877,43,5),(3552,877,12,5),(3553,877,17,5),(3554,878,22,2),(3555,878,12,4),(3556,878,17,4),(3557,878,43,5),(3558,878,45,5),(3559,878,22,5),(3560,878,22,7),(3561,879,22,2),(3562,879,17,4),(3563,879,12,4),(3564,879,45,5),(3565,879,22,5),(3566,879,22,7),(3567,880,22,2),(3568,880,12,4),(3569,880,43,4),(3570,880,17,4),(3571,880,48,4),(3572,880,17,5),(3573,880,11,5),(3574,880,45,5),(3575,880,22,5),(3576,880,17,6),(3577,880,11,6),(3578,880,22,7),(3579,881,22,2),(3580,881,12,4),(3581,881,17,4),(3582,881,43,5),(3583,881,45,5),(3584,881,22,5),(3585,881,22,7),(3586,884,22,2),(3587,884,12,4),(3588,884,17,4),(3589,884,43,5),(3590,884,22,5),(3591,884,22,7),(3592,885,22,2),(3593,885,17,4),(3594,885,12,4),(3595,885,45,5),(3596,885,22,5),(3597,885,22,7),(3598,886,12,4),(3599,886,17,4),(3600,888,12,4),(3601,888,17,4),(3602,889,12,4),(3603,889,17,4),(3604,891,12,4),(3605,891,17,4),(3606,892,49,5),(3607,893,6,5),(3608,893,7,5),(3609,893,49,5),(3610,895,49,5),(3611,896,22,2),(3612,896,12,4),(3613,896,6,4),(3614,896,7,4),(3615,896,17,5),(3616,896,12,5),(3617,896,12,5),(3618,896,6,5),(3619,896,22,5),(3620,896,17,6),(3621,896,22,7),(3622,897,22,2),(3623,897,12,4),(3624,897,6,4),(3625,897,7,4),(3626,897,12,5),(3627,897,12,5),(3628,897,6,5),(3629,897,22,5),(3630,897,17,6),(3631,897,22,7),(3632,898,17,4),(3633,898,12,4),(3634,898,28,4),(3635,898,8,4),(3636,898,45,4),(3637,898,29,4),(3638,898,45,5),(3639,900,12,4),(3640,900,17,4),(3641,899,22,2),(3642,899,12,4),(3643,899,6,4),(3644,899,7,4),(3645,899,17,4),(3646,899,6,5),(3647,899,22,7),(3648,901,22,2),(3649,901,12,4),(3650,901,6,4),(3651,901,7,4),(3652,901,17,4),(3653,901,6,5),(3654,901,22,7),(3655,904,12,4),(3656,904,17,4),(3657,903,12,4),(3658,903,17,4),(3659,903,6,5),(3660,903,7,5),(3661,903,49,5),(3662,902,12,4),(3663,902,17,4),(3664,902,6,5),(3665,902,7,5),(3666,902,49,5),(3667,905,12,4),(3668,905,17,4),(3669,907,22,2),(3670,907,12,5),(3671,907,17,5),(3672,907,45,5),(3673,907,22,5),(3674,907,22,7),(3675,912,45,3),(3676,915,22,2),(3677,915,12,5),(3678,915,43,5),(3679,915,22,7),(3680,913,22,2),(3681,913,17,4),(3682,913,12,4),(3683,913,6,5),(3684,913,7,5),(3685,913,52,5),(3686,913,6,5),(3687,913,22,5),(3688,913,22,7),(3689,919,22,2),(3690,919,12,3),(3691,919,17,4),(3692,919,22,5),(3693,919,22,7),(3694,926,22,2),(3695,926,12,3),(3696,926,17,4),(3697,926,43,5),(3698,926,45,5),(3699,926,12,5),(3700,926,12,5),(3701,926,22,5),(3702,926,12,5),(3703,926,22,5),(3704,926,22,7),(3705,929,22,2),(3706,929,12,3),(3707,929,17,4),(3708,929,43,5),(3709,929,45,5),(3710,929,22,5),(3711,929,22,7),(3712,930,22,2),(3713,930,12,3),(3714,930,43,4),(3715,930,17,5),(3716,930,22,5),(3717,930,17,6),(3718,930,22,7),(3719,931,12,3),(3720,931,43,4),(3721,931,48,4),(3722,931,17,5),(3723,931,11,5),(3724,931,12,5),(3725,931,12,5),(3726,931,17,6),(3727,931,11,6),(3728,933,12,3),(3729,933,43,4),(3730,933,48,4),(3731,933,12,5),(3732,933,12,5),(3733,933,22,5),(3734,933,17,6),(3735,933,11,6),(3736,932,12,3),(3737,932,43,4),(3738,932,48,4),(3739,932,17,5),(3740,932,11,5),(3741,932,6,5),(3742,932,12,5),(3743,932,12,5),(3744,932,22,5),(3745,932,17,6),(3746,932,11,6),(3747,934,12,3),(3748,934,43,4),(3749,934,48,4),(3750,934,17,5),(3751,934,11,5),(3752,934,12,5),(3753,934,12,5),(3754,934,22,5),(3755,934,17,6),(3756,934,11,6),(3757,936,22,2),(3758,936,12,3),(3759,936,43,4),(3760,936,48,4),(3761,936,17,5),(3762,936,11,5),(3763,936,22,5),(3764,936,17,6),(3765,936,11,6),(3766,936,22,7),(3767,935,12,3),(3768,935,43,4),(3769,935,1,4),(3770,935,48,4),(3771,935,17,5),(3772,935,11,5),(3773,935,6,5),(3774,935,12,5),(3775,935,12,5),(3776,935,22,5),(3777,935,17,6),(3778,935,11,6),(3779,937,12,3),(3780,937,43,4),(3781,937,48,4),(3782,937,17,5),(3783,937,11,5),(3784,937,6,5),(3785,937,12,5),(3786,937,12,5),(3787,937,22,5),(3788,937,17,6),(3789,937,11,6),(3790,938,12,3),(3791,938,43,4),(3792,938,48,4),(3793,938,12,5),(3794,938,12,5),(3795,938,17,6),(3796,938,11,6),(3797,939,22,2),(3798,939,12,3),(3799,939,43,4),(3800,939,48,4),(3801,939,17,5),(3802,939,11,5),(3803,939,22,5),(3804,939,17,6),(3805,939,11,6),(3806,939,22,7),(3807,940,22,2),(3808,940,12,3),(3809,940,43,4),(3810,940,48,4),(3811,940,17,5),(3812,940,11,5),(3813,940,22,5),(3814,940,17,6),(3815,940,11,6),(3816,940,22,7),(3817,941,22,2),(3818,941,12,3),(3819,941,43,4),(3820,941,48,4),(3821,941,17,5),(3822,941,11,5),(3823,941,22,5),(3824,941,17,6),(3825,941,11,6),(3826,941,22,7),(3827,942,22,2),(3828,942,12,3),(3829,942,43,4),(3830,942,48,4),(3831,942,17,5),(3832,942,11,5),(3833,942,22,5),(3834,942,17,6),(3835,942,11,6),(3836,942,22,7),(3837,943,22,2),(3838,943,12,3),(3839,943,43,4),(3840,943,48,4),(3841,943,17,5),(3842,943,11,5),(3843,943,22,5),(3844,943,17,6),(3845,943,11,6),(3846,943,22,7),(3847,945,22,2),(3848,945,12,3),(3849,945,43,4),(3850,945,48,4),(3851,945,17,5),(3852,945,11,5),(3853,945,22,5),(3854,945,17,6),(3855,945,11,6),(3856,945,22,7),(3857,944,22,2),(3858,944,12,3),(3859,944,43,4),(3860,944,48,4),(3861,944,17,5),(3862,944,11,5),(3863,944,6,5),(3864,944,7,5),(3865,944,52,5),(3866,944,6,5),(3867,944,3,5),(3868,944,4,5),(3869,944,22,5),(3870,944,17,6),(3871,944,11,6),(3872,944,22,7),(3873,946,22,2),(3874,946,12,3),(3875,946,43,4),(3876,946,48,4),(3877,946,17,5),(3878,946,11,5),(3879,946,22,5),(3880,946,17,6),(3881,946,11,6),(3882,946,22,7),(3883,947,22,2),(3884,947,12,3),(3885,947,43,4),(3886,947,48,4),(3887,947,17,5),(3888,947,11,5),(3889,947,22,5),(3890,947,17,6),(3891,947,11,6),(3892,947,22,7),(3893,948,22,2),(3894,948,12,3),(3895,948,43,4),(3896,948,48,4),(3897,948,17,5),(3898,948,11,5),(3899,948,6,5),(3900,948,7,5),(3901,948,52,5),(3902,948,6,5),(3903,948,22,5),(3904,948,17,6),(3905,948,11,6),(3906,948,22,7),(3907,949,22,2),(3908,949,12,3),(3909,949,43,4),(3910,949,48,4),(3911,949,11,4),(3912,949,17,5),(3913,949,11,5),(3914,949,12,5),(3915,949,12,5),(3916,949,22,5),(3917,949,22,5),(3918,949,17,6),(3919,949,11,6),(3920,949,22,7),(3921,950,12,3),(3922,950,43,4),(3923,950,48,4),(3924,950,12,5),(3925,950,12,5),(3926,950,22,5),(3927,950,17,6),(3928,950,11,6),(3929,952,22,2),(3930,952,12,3),(3931,952,43,4),(3932,952,48,4),(3933,952,11,4),(3934,952,12,5),(3935,952,12,5),(3936,952,22,5),(3937,952,17,6),(3938,952,11,6),(3939,952,22,7),(3940,956,12,3),(3941,956,43,4),(3942,956,48,4),(3943,956,17,5),(3944,956,11,5),(3945,956,17,6),(3946,956,11,6),(3947,957,12,3),(3948,957,43,4),(3949,957,48,4),(3950,957,12,5),(3951,957,12,5),(3952,957,22,5),(3953,957,17,6),(3954,957,11,6),(3955,955,12,3),(3956,955,43,4),(3957,955,48,4),(3958,955,22,5),(3959,955,12,5),(3960,955,12,5),(3961,955,17,6),(3962,955,11,6),(3963,954,22,2),(3964,954,12,3),(3965,954,17,4),(3966,954,43,5),(3967,954,45,5),(3968,954,22,5),(3969,954,22,7),(3970,958,12,3),(3971,958,43,4),(3972,958,48,4),(3973,958,17,5),(3974,958,11,5),(3975,958,12,5),(3976,958,12,5),(3977,958,17,6),(3978,958,11,6),(3979,959,22,2),(3980,959,12,3),(3981,959,43,4),(3982,959,48,4),(3983,959,17,5),(3984,959,11,5),(3985,959,22,5),(3986,959,17,6),(3987,959,11,6),(3988,959,22,7),(3989,960,12,3),(3990,960,43,4),(3991,960,48,4),(3992,960,22,5),(3993,960,17,6),(3994,960,11,6),(3995,961,12,3),(3996,961,17,4),(3997,961,22,5),(3998,961,12,5),(3999,961,12,5),(4000,962,22,2),(4001,962,12,3),(4002,962,43,4),(4003,962,48,4),(4004,962,17,5),(4005,962,11,5),(4006,962,22,5),(4007,962,17,6),(4008,962,11,6),(4009,962,22,7),(4010,965,12,3),(4011,965,43,4),(4012,965,48,4),(4013,965,17,5),(4014,965,11,5),(4015,965,17,6),(4016,965,11,6),(4017,963,12,3),(4018,963,43,4),(4019,963,48,4),(4020,963,22,5),(4021,963,17,6),(4022,963,11,6),(4023,966,12,3),(4024,966,17,4),(4025,966,22,5),(4026,966,12,5),(4027,966,12,5),(4028,967,22,2),(4029,967,12,3),(4030,967,17,4),(4031,967,43,5),(4032,967,45,5),(4033,967,22,5),(4034,967,22,7),(4035,968,22,2),(4036,968,12,3),(4037,968,43,4),(4038,968,48,4),(4039,968,11,4),(4040,968,17,5),(4041,968,11,5),(4042,968,12,5),(4043,968,12,5),(4044,968,22,5),(4045,968,22,5),(4046,968,17,6),(4047,968,11,6),(4048,968,22,7),(4049,969,22,2),(4050,969,12,3),(4051,969,43,4),(4052,969,48,4),(4053,969,17,5),(4054,969,11,5),(4055,969,22,5),(4056,969,17,6),(4057,969,11,6),(4058,969,22,7),(4059,970,22,2),(4060,970,12,3),(4061,970,17,4),(4062,970,43,5),(4063,970,45,5),(4064,970,12,5),(4065,970,12,5),(4066,970,22,5),(4067,970,12,5),(4068,970,22,5),(4069,970,22,7),(4070,971,12,3),(4071,971,43,4),(4072,971,48,4),(4073,971,12,5),(4074,971,12,5),(4075,971,17,6),(4076,971,11,6),(4077,975,12,3),(4078,975,43,4),(4079,975,48,4),(4080,975,12,5),(4081,975,12,5),(4082,975,17,6),(4083,975,11,6),(4084,972,12,3),(4085,972,43,4),(4086,972,48,4),(4087,972,12,5),(4088,972,12,5),(4089,972,22,5),(4090,972,17,6),(4091,972,11,6),(4092,974,12,3),(4093,974,43,4),(4094,974,1,4),(4095,974,48,4),(4096,974,6,5),(4097,974,12,5),(4098,974,12,5),(4099,974,22,5),(4100,974,17,6),(4101,974,11,6),(4102,976,22,2),(4103,976,12,3),(4104,976,43,4),(4105,976,48,4),(4106,976,17,5),(4107,976,11,5),(4108,976,22,5),(4109,976,17,6),(4110,976,11,6),(4111,976,22,7),(4112,973,12,3),(4113,973,43,4),(4114,973,48,4),(4115,973,6,5),(4116,973,12,5),(4117,973,12,5),(4118,973,22,5),(4119,973,17,6),(4120,973,11,6),(4121,977,12,3),(4122,977,43,4),(4123,977,48,4),(4124,977,6,5),(4125,977,12,5),(4126,977,12,5),(4127,977,22,5),(4128,977,17,6),(4129,977,11,6),(4130,978,12,3),(4131,978,43,4),(4132,978,48,4),(4133,978,17,5),(4134,978,11,5),(4135,978,12,5),(4136,978,12,5),(4137,978,22,5),(4138,978,17,6),(4139,978,11,6),(4140,979,17,2),(4141,979,12,3),(4142,979,22,5),(4143,979,12,5),(4144,979,12,5),(4145,979,17,5),(4146,979,17,7),(4147,981,22,2),(4148,981,12,3),(4149,981,43,4),(4150,981,48,4),(4151,981,11,4),(4152,981,12,5),(4153,981,12,5),(4154,981,22,5),(4155,981,17,6),(4156,981,11,6),(4157,981,22,7),(4158,982,22,2),(4159,982,12,3),(4160,982,43,4),(4161,982,48,4),(4162,982,11,4),(4163,982,17,5),(4164,982,11,5),(4165,982,12,5),(4166,982,12,5),(4167,982,22,5),(4168,982,22,5),(4169,982,17,6),(4170,982,11,6),(4171,982,22,7),(4172,985,12,3),(4173,985,43,4),(4174,985,48,4),(4175,985,17,5),(4176,985,11,5),(4177,985,17,6),(4178,985,11,6),(4179,986,12,3),(4180,986,43,4),(4181,986,48,4),(4182,986,17,5),(4183,986,11,5),(4184,986,17,6),(4185,986,11,6),(4186,984,22,2),(4187,984,12,3),(4188,984,43,4),(4189,984,48,4),(4190,984,11,4),(4191,984,17,5),(4192,984,11,5),(4193,984,12,5),(4194,984,12,5),(4195,984,22,5),(4196,984,22,5),(4197,984,17,6),(4198,984,11,6),(4199,984,22,7),(4200,987,22,2),(4201,987,12,3),(4202,987,17,4),(4203,987,43,5),(4204,987,45,5),(4205,987,22,5),(4206,987,22,7),(4207,988,12,3),(4208,988,43,4),(4209,988,48,4),(4210,988,17,5),(4211,988,11,5),(4212,988,17,6),(4213,988,11,6),(4214,989,12,3),(4215,989,43,4),(4216,989,48,4),(4217,989,17,5),(4218,989,11,5),(4219,989,17,6),(4220,989,11,6),(4221,990,12,3),(4222,990,43,4),(4223,990,48,4),(4224,990,17,5),(4225,990,11,5),(4226,990,17,6),(4227,990,11,6),(4228,991,12,3),(4229,991,43,4),(4230,991,48,4),(4231,991,17,5),(4232,991,11,5),(4233,991,17,6),(4234,991,11,6),(4235,993,12,3),(4236,993,43,4),(4237,993,48,4),(4238,993,17,5),(4239,993,11,5),(4240,993,17,6),(4241,993,11,6),(4242,992,12,3),(4243,992,43,4),(4244,992,48,4),(4245,992,17,5),(4246,992,11,5),(4247,992,17,6),(4248,992,11,6),(4249,994,12,3),(4250,994,17,5),(4251,994,17,6),(4252,996,12,3),(4253,996,43,4),(4254,996,48,4),(4255,996,17,5),(4256,996,11,5),(4257,996,17,6),(4258,996,11,6),(4259,995,12,3),(4260,995,43,4),(4261,995,48,4),(4262,995,17,5),(4263,995,11,5),(4264,995,17,6),(4265,995,11,6),(4266,997,12,3),(4267,997,43,4),(4268,997,48,4),(4269,997,12,5),(4270,997,12,5),(4271,997,22,5),(4272,997,17,6),(4273,997,11,6),(4274,998,12,3),(4275,998,43,4),(4276,998,48,4),(4277,998,17,5),(4278,998,11,5),(4279,998,12,5),(4280,998,12,5),(4281,998,22,5),(4282,998,17,6),(4283,998,11,6),(4284,999,12,3),(4285,999,43,4),(4286,999,48,4),(4287,999,12,5),(4288,999,12,5),(4289,999,17,6),(4290,999,11,6),(4291,1000,12,3),(4292,1000,43,4),(4293,1000,48,4),(4294,1000,17,6),(4295,1000,11,6),(4296,1001,12,3),(4297,1001,43,4),(4298,1001,48,4),(4299,1001,12,5),(4300,1001,12,5),(4301,1001,17,6),(4302,1001,11,6),(4303,1002,12,3),(4304,1002,43,4),(4305,1002,48,4),(4306,1002,12,5),(4307,1002,12,5),(4308,1002,17,6),(4309,1002,11,6),(4310,1003,22,2),(4311,1003,12,3),(4312,1003,17,4),(4313,1003,22,5),(4314,1003,22,7),(4315,1005,12,3),(4316,1005,43,4),(4317,1005,48,4),(4318,1005,12,5),(4319,1005,12,5),(4320,1005,22,5),(4321,1005,17,6),(4322,1005,11,6),(4323,1007,12,3),(4324,1007,43,4),(4325,1007,48,4),(4326,1007,12,5),(4327,1007,12,5),(4328,1007,43,5),(4329,1007,17,6),(4330,1007,11,6),(4331,1008,22,2),(4332,1008,12,3),(4333,1008,43,4),(4334,1008,48,4),(4335,1008,17,5),(4336,1008,11,5),(4337,1008,22,5),(4338,1008,17,6),(4339,1008,11,6),(4340,1008,22,7),(4341,1004,22,2),(4342,1004,12,3),(4343,1004,43,4),(4344,1004,48,4),(4345,1004,17,5),(4346,1004,11,5),(4347,1004,22,5),(4348,1004,17,6),(4349,1004,11,6),(4350,1004,22,7),(4351,1009,17,2),(4352,1009,12,3),(4353,1009,22,5),(4354,1009,12,5),(4355,1009,12,5),(4356,1009,17,5),(4357,1009,17,7),(4358,1010,12,3),(4359,1010,43,4),(4360,1010,48,4),(4361,1010,17,5),(4362,1010,11,5),(4363,1010,17,6),(4364,1010,11,6),(4365,1011,17,2),(4366,1011,12,3),(4367,1011,22,5),(4368,1011,12,5),(4369,1011,12,5),(4370,1011,17,5),(4371,1011,17,7),(4372,1012,22,2),(4373,1012,12,3),(4374,1012,43,4),(4375,1012,48,4),(4376,1012,17,5),(4377,1012,11,5),(4378,1012,22,5),(4379,1012,17,6),(4380,1012,11,6),(4381,1012,22,7),(4382,1016,12,3),(4383,1016,22,5),(4384,1015,12,3),(4385,1014,12,3),(4386,1014,17,4),(4387,1014,22,5),(4388,1014,12,5),(4389,1014,12,5),(4390,1013,22,2),(4391,1013,12,3),(4392,1013,43,4),(4393,1013,48,4),(4394,1013,17,5),(4395,1013,11,5),(4396,1013,22,5),(4397,1013,17,6),(4398,1013,11,6),(4399,1013,22,7),(4400,1017,12,3),(4401,1017,43,4),(4402,1017,48,4),(4403,1017,17,5),(4404,1017,11,5),(4405,1017,17,6),(4406,1017,11,6),(4407,1018,17,2),(4408,1018,12,3),(4409,1018,22,5),(4410,1018,12,5),(4411,1018,12,5),(4412,1018,17,5),(4413,1018,17,7),(4414,1019,12,3),(4415,1019,22,5),(4416,1019,12,5),(4417,1019,12,5),(4418,1019,17,6),(4419,1020,17,2),(4420,1020,12,3),(4421,1020,22,5),(4422,1020,12,5),(4423,1020,12,5),(4424,1020,17,5),(4425,1020,17,7),(4426,1021,12,3),(4427,1021,43,4),(4428,1021,48,4),(4429,1021,17,5),(4430,1021,11,5),(4431,1021,17,6),(4432,1021,11,6),(4433,1022,12,3),(4434,1022,43,4),(4435,1022,48,4),(4436,1022,17,5),(4437,1022,11,5),(4438,1022,17,6),(4439,1022,11,6),(4440,1024,17,2),(4441,1024,12,3),(4442,1024,43,4),(4443,1024,22,5),(4444,1024,12,5),(4445,1024,12,5),(4446,1024,17,5),(4447,1024,17,7),(4448,1027,12,3),(4449,1027,43,4),(4450,1027,48,4),(4451,1027,17,5),(4452,1027,11,5),(4453,1027,17,6),(4454,1027,11,6),(4455,1025,17,2),(4456,1025,12,3),(4457,1025,22,5),(4458,1025,12,5),(4459,1025,12,5),(4460,1025,17,5),(4461,1025,17,7),(4462,1026,12,3),(4463,1026,43,4),(4464,1026,48,4),(4465,1026,17,5),(4466,1026,11,5),(4467,1026,17,6),(4468,1026,11,6),(4469,1023,22,2),(4470,1023,12,3),(4471,1023,43,4),(4472,1023,48,4),(4473,1023,17,5),(4474,1023,11,5),(4475,1023,22,5),(4476,1023,17,6),(4477,1023,11,6),(4478,1023,22,7),(4479,1028,12,3),(4480,1028,43,4),(4481,1028,48,4),(4482,1028,17,5),(4483,1028,11,5),(4484,1028,12,5),(4485,1028,12,5),(4486,1028,22,5),(4487,1028,17,6),(4488,1028,11,6),(4489,1029,12,3),(4490,1029,43,4),(4491,1029,48,4),(4492,1029,17,5),(4493,1029,11,5),(4494,1029,17,6),(4495,1029,11,6),(4496,1030,12,3),(4497,1030,43,4),(4498,1030,48,4),(4499,1030,17,5),(4500,1030,11,5),(4501,1030,12,5),(4502,1030,12,5),(4503,1030,22,5),(4504,1030,17,6),(4505,1030,11,6),(4506,1031,12,3),(4507,1031,43,4),(4508,1031,48,4),(4509,1031,17,5),(4510,1031,11,5),(4511,1031,17,6),(4512,1031,11,6),(4513,1032,12,3),(4514,1032,43,4),(4515,1032,48,4),(4516,1032,17,5),(4517,1032,11,5),(4518,1032,12,5),(4519,1032,12,5),(4520,1032,22,5),(4521,1032,17,6),(4522,1032,11,6),(4523,1035,12,3),(4524,1035,43,4),(4525,1035,48,4),(4526,1035,17,5),(4527,1035,11,5),(4528,1035,17,6),(4529,1035,11,6),(4530,1033,12,3),(4531,1033,43,4),(4532,1033,48,4),(4533,1033,17,5),(4534,1033,11,5),(4535,1033,17,6),(4536,1033,11,6),(4537,1036,12,3),(4538,1036,43,4),(4539,1036,48,4),(4540,1036,17,5),(4541,1036,11,5),(4542,1036,12,5),(4543,1036,12,5),(4544,1036,22,5),(4545,1036,17,6),(4546,1036,11,6),(4547,1034,12,3),(4548,1034,43,4),(4549,1034,48,4),(4550,1034,17,5),(4551,1034,11,5),(4552,1034,17,6),(4553,1034,11,6),(4554,1037,12,3),(4555,1037,43,4),(4556,1037,48,4),(4557,1037,17,5),(4558,1037,11,5),(4559,1037,17,6),(4560,1037,11,6),(4561,1038,12,3),(4562,1038,43,4),(4563,1038,48,4),(4564,1038,17,5),(4565,1038,11,5),(4566,1038,12,5),(4567,1038,12,5),(4568,1038,22,5),(4569,1039,17,2),(4570,1039,12,3),(4571,1039,43,4),(4572,1039,22,5),(4573,1039,12,5),(4574,1039,12,5),(4575,1039,17,5),(4576,1039,17,7),(4577,1040,12,3),(4578,1040,43,4),(4579,1040,48,4),(4580,1040,17,5),(4581,1040,11,5),(4582,1040,17,6),(4583,1040,11,6),(4584,1041,12,3),(4585,1041,43,4),(4586,1041,48,4),(4587,1041,17,5),(4588,1041,11,5),(4589,1041,17,6),(4590,1041,11,6),(4591,1042,12,3),(4592,1042,43,4),(4593,1042,48,4),(4594,1042,17,5),(4595,1042,11,5),(4596,1042,17,6),(4597,1042,11,6),(4598,1043,12,3),(4599,1043,43,4),(4600,1043,48,4),(4601,1043,17,5),(4602,1043,11,5),(4603,1043,12,5),(4604,1043,12,5),(4605,1043,22,5),(4606,1043,17,6),(4607,1043,11,6),(4608,1044,12,3),(4609,1044,43,4),(4610,1044,48,4),(4611,1044,17,5),(4612,1044,11,5),(4613,1044,17,6),(4614,1044,11,6),(4615,1045,12,3),(4616,1045,43,4),(4617,1045,48,4),(4618,1045,17,5),(4619,1045,11,5),(4620,1045,12,5),(4621,1045,12,5),(4622,1045,22,5),(4623,1045,17,6),(4624,1045,11,6),(4625,1046,12,3),(4626,1046,43,4),(4627,1046,48,4),(4628,1046,17,5),(4629,1046,11,5),(4630,1046,17,6),(4631,1046,11,6),(4632,1048,17,2),(4633,1048,12,3),(4634,1048,22,5),(4635,1048,12,5),(4636,1048,12,5),(4637,1048,17,5),(4638,1048,17,7),(4639,1050,12,3),(4640,1050,43,4),(4641,1050,48,4),(4642,1050,12,5),(4643,1050,12,5),(4644,1050,17,6),(4645,1050,11,6),(4646,1051,22,2),(4647,1051,12,3),(4648,1051,17,4),(4649,1051,43,5),(4650,1051,45,5),(4651,1051,22,5),(4652,1051,22,7),(4653,1053,12,3),(4654,1053,43,4),(4655,1053,48,4),(4656,1053,17,5),(4657,1053,11,5),(4658,1053,17,6),(4659,1053,11,6),(4660,1057,22,2),(4661,1057,12,3),(4662,1057,43,4),(4663,1057,48,4),(4664,1057,17,5),(4665,1057,11,5),(4666,1057,22,5),(4667,1057,17,6),(4668,1057,11,6),(4669,1057,22,7),(4670,1055,12,3),(4671,1055,43,4),(4672,1055,48,4),(4673,1055,17,5),(4674,1055,11,5),(4675,1055,12,5),(4676,1055,12,5),(4677,1055,22,5),(4678,1055,17,6),(4679,1055,11,6),(4680,1054,22,2),(4681,1054,12,3),(4682,1054,43,4),(4683,1054,48,4),(4684,1054,17,5),(4685,1054,11,5),(4686,1054,12,5),(4687,1054,12,5),(4688,1054,22,5),(4689,1054,22,5),(4690,1054,17,6),(4691,1054,11,6),(4692,1054,22,7),(4693,1056,22,2),(4694,1056,12,3),(4695,1056,43,4),(4696,1056,48,4),(4697,1056,17,5),(4698,1056,11,5),(4699,1056,22,5),(4700,1056,17,6),(4701,1056,11,6),(4702,1056,22,7),(4703,1058,22,2),(4704,1058,12,3),(4705,1058,43,4),(4706,1058,48,4),(4707,1058,17,5),(4708,1058,11,5),(4709,1058,6,5),(4710,1058,7,5),(4711,1058,6,5),(4712,1058,22,5),(4713,1058,17,6),(4714,1058,11,6),(4715,1058,22,7),(4716,1059,22,2),(4717,1059,12,3),(4718,1059,43,4),(4719,1059,48,4),(4720,1059,17,5),(4721,1059,11,5),(4722,1059,6,5),(4723,1059,7,5),(4724,1059,52,5),(4725,1059,6,5),(4726,1059,4,5),(4727,1059,3,5),(4728,1059,22,5),(4729,1059,17,6),(4730,1059,11,6),(4731,1059,22,7),(4732,1060,12,3),(4733,1060,43,4),(4734,1060,48,4),(4735,1060,17,5),(4736,1060,11,5),(4737,1060,12,5),(4738,1060,12,5),(4739,1060,22,5),(4740,1060,17,6),(4741,1060,11,6),(4742,1061,12,3),(4743,1061,43,4),(4744,1061,48,4),(4745,1061,17,5),(4746,1061,11,5),(4747,1061,17,6),(4748,1061,11,6),(4749,1062,22,2),(4750,1062,12,3),(4751,1062,17,4),(4752,1062,22,5),(4753,1062,22,7),(4754,1063,22,2),(4755,1063,12,3),(4756,1063,43,4),(4757,1063,48,4),(4758,1063,17,5),(4759,1063,11,5),(4760,1063,22,5),(4761,1063,17,6),(4762,1063,11,6),(4763,1063,22,7),(4764,1064,22,2),(4765,1064,12,3),(4766,1064,17,4),(4767,1064,22,5),(4768,1064,22,7),(4769,1065,12,3),(4770,1065,43,4),(4771,1065,48,4),(4772,1065,17,5),(4773,1065,11,5),(4774,1065,6,5),(4775,1065,12,5),(4776,1065,12,5),(4777,1065,22,5),(4778,1065,17,6),(4779,1065,11,6),(4780,1066,12,3),(4781,1066,22,5),(4782,1066,18,5),(4783,1066,46,5),(4784,1066,43,5),(4785,1067,22,2),(4786,1067,12,3),(4787,1067,43,4),(4788,1067,48,4),(4789,1067,17,5),(4790,1067,11,5),(4791,1067,12,5),(4792,1067,12,5),(4793,1067,22,5),(4794,1067,22,5),(4795,1067,17,6),(4796,1067,11,6),(4797,1067,22,7),(4798,1069,22,2),(4799,1069,12,3),(4800,1069,22,5),(4801,1069,22,7),(4802,1068,43,3),(4803,1068,12,4),(4804,1068,48,4),(4805,1068,28,4),(4806,1068,8,4),(4807,1068,17,5),(4808,1068,11,5),(4809,1068,12,5),(4810,1068,12,5),(4811,1068,22,5),(4812,1068,45,5),(4813,1068,17,6),(4814,1068,11,6),(4815,1070,22,2),(4816,1070,12,3),(4817,1070,43,4),(4818,1070,48,4),(4819,1070,17,5),(4820,1070,11,5),(4821,1070,12,5),(4822,1070,12,5),(4823,1070,22,5),(4824,1070,22,5),(4825,1070,17,6),(4826,1070,11,6),(4827,1070,22,7),(4828,1071,22,2),(4829,1071,12,3),(4830,1071,43,4),(4831,1071,48,4),(4832,1071,17,5),(4833,1071,11,5),(4834,1071,12,5),(4835,1071,12,5),(4836,1071,22,5),(4837,1071,22,5),(4838,1071,17,6),(4839,1071,11,6),(4840,1071,22,7),(4841,1073,12,3),(4842,1073,43,4),(4843,1073,48,4),(4844,1073,17,5),(4845,1073,11,5),(4846,1073,12,5),(4847,1073,12,5),(4848,1073,17,6),(4849,1073,11,6),(4850,1072,22,2),(4851,1072,12,3),(4852,1072,17,4),(4853,1072,43,5),(4854,1072,12,5),(4855,1072,12,5),(4856,1072,22,5),(4857,1072,12,5),(4858,1072,22,5),(4859,1072,22,7),(4860,1074,12,3),(4861,1074,43,4),(4862,1074,48,4),(4863,1074,12,5),(4864,1074,12,5),(4865,1074,17,6),(4866,1074,11,6),(4867,1075,12,3),(4868,1075,43,4),(4869,1075,48,4),(4870,1075,17,5),(4871,1075,11,5),(4872,1075,17,6),(4873,1075,11,6),(4874,1076,22,2),(4875,1076,12,3),(4876,1076,43,4),(4877,1076,48,4),(4878,1076,11,4),(4879,1076,17,5),(4880,1076,11,5),(4881,1076,12,5),(4882,1076,12,5),(4883,1076,22,5),(4884,1076,22,5),(4885,1076,17,6),(4886,1076,11,6),(4887,1076,22,7),(4888,1077,22,2),(4889,1077,12,3),(4890,1077,43,4),(4891,1077,48,4),(4892,1077,11,4),(4893,1077,17,5),(4894,1077,11,5),(4895,1077,12,5),(4896,1077,12,5),(4897,1077,22,5),(4898,1077,22,5),(4899,1077,17,6),(4900,1077,11,6),(4901,1077,22,7),(4902,1078,12,3),(4903,1078,43,4),(4904,1078,48,4),(4905,1078,17,5),(4906,1078,11,5),(4907,1078,12,5),(4908,1078,12,5),(4909,1078,22,5),(4910,1078,17,6),(4911,1078,11,6),(4912,1079,12,3),(4913,1079,43,4),(4914,1079,48,4),(4915,1079,17,5),(4916,1079,11,5),(4917,1079,12,5),(4918,1079,12,5),(4919,1079,22,5),(4920,1079,17,6),(4921,1079,11,6),(4922,1081,22,2),(4923,1081,12,3),(4924,1081,43,4),(4925,1081,48,4),(4926,1081,11,4),(4927,1081,17,5),(4928,1081,11,5),(4929,1081,12,5),(4930,1081,12,5),(4931,1081,22,5),(4932,1081,22,5),(4933,1081,17,6),(4934,1081,11,6),(4935,1081,22,7),(4936,1080,22,2),(4937,1080,12,3),(4938,1080,43,4),(4939,1080,48,4),(4940,1080,11,4),(4941,1080,17,5),(4942,1080,11,5),(4943,1080,12,5),(4944,1080,12,5),(4945,1080,22,5),(4946,1080,22,5),(4947,1080,17,6),(4948,1080,11,6),(4949,1080,22,7),(4950,1083,22,2),(4951,1083,6,2),(4952,1083,12,3),(4953,1083,17,5),(4954,1083,46,5),(4955,1083,41,5),(4956,1083,11,5),(4957,1083,22,5),(4958,1083,6,5),(4959,1083,22,7),(4960,1083,6,7),(4961,1082,12,3),(4962,1082,43,4),(4963,1082,48,4),(4964,1082,17,5),(4965,1082,11,5),(4966,1082,12,5),(4967,1082,12,5),(4968,1082,22,5),(4969,1082,17,6),(4970,1082,11,6),(4971,1084,22,2),(4972,1084,12,3),(4973,1084,43,4),(4974,1084,48,4),(4975,1084,11,4),(4976,1084,17,5),(4977,1084,11,5),(4978,1084,12,5),(4979,1084,12,5),(4980,1084,22,5),(4981,1084,22,5),(4982,1084,17,6),(4983,1084,11,6),(4984,1084,22,7),(4985,1085,12,3),(4986,1087,12,3),(4987,1087,43,4),(4988,1087,48,4),(4989,1087,17,5),(4990,1087,11,5),(4991,1087,12,5),(4992,1087,12,5),(4993,1087,17,6),(4994,1087,11,6),(4995,1090,12,3),(4996,1089,12,3),(4997,1091,12,3),(4998,1093,12,3),(4999,1092,12,3),(5000,1092,18,3),(5001,1088,12,3),(5002,1088,43,4),(5003,1088,48,4),(5004,1088,17,5),(5005,1088,11,5),(5006,1088,12,5),(5007,1088,12,5),(5008,1088,22,5),(5009,1088,45,5),(5010,1088,17,6),(5011,1088,11,6),(5012,1094,12,3),(5013,1094,43,4),(5014,1094,48,4),(5015,1094,17,5),(5016,1094,11,5),(5017,1094,12,5),(5018,1094,12,5),(5019,1094,17,6),(5020,1094,11,6),(5021,1095,12,3),(5022,1096,12,3),(5023,1097,12,3),(5024,1098,12,3),(5025,1099,12,3),(5026,1100,12,3),(5027,1101,12,3),(5028,1102,12,3),(5029,1103,12,3),(5030,1104,12,4),(5031,1104,12,4),(5032,1105,12,4),(5033,1105,12,4),(5034,1105,16,5),(5035,1105,12,5),(5036,1106,12,4),(5037,1106,12,4),(5038,1107,12,4),(5039,1107,12,4),(5040,1108,12,4),(5041,1108,12,4),(5042,1108,22,5),(5043,1109,12,4),(5044,1109,12,4),(5045,1110,12,4),(5046,1110,12,4),(5047,1110,12,4),(5048,1111,12,4),(5049,1111,12,4),(5050,1111,12,4),(5051,1113,12,4),(5052,1113,12,4),(5053,1114,12,3),(5054,1114,12,3),(5055,1114,22,4),(5056,1114,28,4),(5057,1114,29,5),(5058,1115,12,4),(5059,1115,12,4),(5060,1115,12,5),(5061,1115,17,5),(5062,1117,12,3),(5063,1117,12,3),(5064,1117,22,4),(5065,1117,28,4),(5066,1117,7,4),(5067,1117,29,5),(5068,1123,12,3),(5069,1123,12,3),(5070,1123,22,4),(5071,1123,28,4),(5072,1123,29,5),(5073,1124,12,3),(5074,1124,6,3),(5075,1125,12,3),(5076,1125,12,3),(5077,1126,12,3),(5078,1126,6,3),(5079,1127,12,3),(5080,1127,12,3),(5081,1128,12,3),(5082,1128,6,3),(5083,1132,12,3),(5084,1132,12,3),(5085,1133,12,3),(5086,1133,12,3),(5087,1136,18,3),(5088,1136,46,4),(5089,1136,22,5),(5090,1137,18,3),(5091,1137,46,4),(5092,1137,22,5),(5093,1138,18,3),(5094,1138,46,4),(5095,1138,22,5),(5096,1138,12,5),(5097,1138,12,5),(5098,1139,18,3),(5099,1139,46,4),(5100,1139,22,5),(5101,1141,18,3),(5102,1141,46,4),(5103,1141,22,5),(5104,1141,12,5),(5105,1141,12,5),(5106,1140,18,3),(5107,1140,46,4),(5108,1140,28,4),(5109,1140,29,4),(5110,1140,8,4),(5111,1140,45,4),(5112,1140,22,5),(5113,1140,39,5),(5114,1144,18,3),(5115,1144,46,4),(5116,1144,22,5),(5117,1142,18,3),(5118,1142,46,4),(5119,1142,22,5),(5120,1142,12,5),(5121,1142,12,5),(5122,1145,18,3),(5123,1145,46,4),(5124,1145,22,5),(5125,1143,18,3),(5126,1143,46,4),(5127,1143,22,5),(5128,1143,29,5),(5129,1143,6,5),(5130,1146,18,3),(5131,1146,46,4),(5132,1146,22,5),(5133,1146,43,5),(5134,1147,18,3),(5135,1147,46,4),(5136,1147,22,5),(5137,1147,43,5),(5138,1147,28,5),(5139,1147,8,5),(5140,1148,18,3),(5141,1148,46,4),(5142,1148,22,5),(5143,1148,43,5),(5144,1148,28,5),(5145,1148,8,5),(5146,1149,18,3),(5147,1149,46,4),(5148,1149,22,5),(5149,1149,43,5),(5150,1149,29,5),(5151,1152,18,3),(5152,1152,46,4),(5153,1152,22,5),(5154,1151,18,3),(5155,1151,46,4),(5156,1151,22,5),(5157,1151,43,5),(5158,1150,18,3),(5159,1150,46,4),(5160,1150,22,5),(5161,1150,43,5),(5162,1153,18,3),(5163,1153,46,4),(5164,1153,22,5),(5165,1153,43,5),(5166,1153,29,5),(5167,1155,18,3),(5168,1155,46,4),(5169,1155,22,5),(5170,1155,29,5),(5171,1154,18,3),(5172,1154,46,4),(5173,1154,22,5),(5174,1154,8,5),(5175,1154,29,5),(5176,1154,6,5),(5177,1156,18,3),(5178,1156,46,4),(5179,1156,22,5),(5180,1157,18,3),(5181,1157,46,4),(5182,1157,22,5),(5183,1158,18,3),(5184,1158,46,4),(5185,1158,22,5),(5186,1158,43,5),(5187,1159,18,3),(5188,1159,46,4),(5189,1159,22,5),(5190,1160,18,3),(5191,1160,46,4),(5192,1160,22,5),(5193,1160,28,5),(5194,1160,8,5),(5195,1162,18,3),(5196,1162,46,4),(5197,1162,22,5),(5198,1162,43,5),(5199,1162,29,5),(5200,1163,18,3),(5201,1163,46,4),(5202,1163,22,5),(5203,1163,43,5),(5204,1163,29,5),(5205,1164,18,3),(5206,1164,46,4),(5207,1164,22,5),(5208,1164,43,5),(5209,1161,18,3),(5210,1161,46,4),(5211,1161,22,5),(5212,1161,43,5),(5213,1161,29,5),(5214,1165,18,3),(5215,1165,46,4),(5216,1165,22,5),(5217,1165,43,5),(5218,1165,28,5),(5219,1165,8,5),(5220,1166,18,3),(5221,1166,46,4),(5222,1166,22,5),(5223,1166,43,5),(5224,1168,18,3),(5225,1168,46,4),(5226,1168,22,5),(5227,1168,29,5),(5228,1167,18,3),(5229,1167,46,4),(5230,1167,22,5),(5231,1167,8,5),(5232,1167,29,5),(5233,1167,6,5),(5234,1169,18,3),(5235,1169,46,4),(5236,1169,22,5),(5237,1169,43,5),(5238,1170,18,3),(5239,1170,46,4),(5240,1170,22,5),(5241,1171,18,3),(5242,1171,46,4),(5243,1171,22,5),(5244,1171,43,5),(5245,1172,18,3),(5246,1172,46,4),(5247,1172,22,5),(5248,1172,43,5),(5249,1173,18,3),(5250,1173,46,4),(5251,1173,22,5),(5252,1173,43,5),(5253,1174,18,3),(5254,1174,46,4),(5255,1174,22,5),(5256,1175,18,3),(5257,1175,46,4),(5258,1175,22,5),(5259,1175,43,5),(5260,1175,29,5),(5261,1176,45,2),(5262,1176,18,3),(5263,1176,46,4),(5264,1176,12,4),(5265,1176,22,5),(5266,1176,6,5),(5267,1176,6,5),(5268,1176,43,5),(5269,1176,17,5),(5270,1176,45,5),(5271,1176,17,6),(5272,1176,45,7),(5273,1177,18,3),(5274,1177,46,4),(5275,1177,22,5),(5276,1177,29,5),(5277,1177,6,5),(5278,1177,6,5),(5279,1177,43,5),(5280,1178,18,3),(5281,1178,46,4),(5282,1178,22,5),(5283,1178,29,5),(5284,1178,6,5),(5285,1178,6,5),(5286,1178,43,5),(5287,1179,18,3),(5288,1179,46,4),(5289,1179,12,4),(5290,1179,22,5),(5291,1179,6,5),(5292,1179,6,5),(5293,1179,43,5),(5294,1179,17,5),(5295,1179,17,6),(5296,1181,18,3),(5297,1182,18,3),(5298,1183,18,3),(5299,1185,18,3),(5300,1184,45,2),(5301,1184,18,3),(5302,1184,46,4),(5303,1184,22,5),(5304,1184,43,5),(5305,1184,28,5),(5306,1184,6,5),(5307,1184,45,5),(5308,1184,45,7),(5309,1186,45,2),(5310,1186,18,3),(5311,1186,46,4),(5312,1186,22,5),(5313,1186,43,5),(5314,1186,28,5),(5315,1186,6,5),(5316,1186,6,5),(5317,1186,45,5),(5318,1186,45,7),(5319,1190,18,3),(5320,1191,18,3),(5321,1192,18,3),(5322,1194,12,5),(5323,1194,12,5),(5324,1194,12,5),(5325,1194,12,5),(5326,1201,22,5),(5327,1211,43,3),(5328,1211,12,4),(5329,1211,1,4),(5330,1211,48,4),(5331,1211,12,5),(5332,1211,12,5),(5333,1211,17,6),(5334,1211,11,6),(5335,1217,22,2),(5336,1217,43,3),(5337,1217,12,4),(5338,1217,48,4),(5339,1217,17,5),(5340,1217,11,5),(5341,1217,22,5),(5342,1217,17,6),(5343,1217,11,6),(5344,1217,22,7),(5345,1237,22,2),(5346,1237,43,3),(5347,1237,12,4),(5348,1237,48,4),(5349,1237,17,5),(5350,1237,11,5),(5351,1237,22,5),(5352,1237,17,6),(5353,1237,11,6),(5354,1237,22,7),(5355,1239,43,3),(5356,1239,18,4),(5357,1239,46,4),(5358,1239,22,5),(5359,1239,12,5),(5360,1239,12,5),(5361,1243,43,3),(5362,1243,12,4),(5363,1243,48,4),(5364,1243,17,5),(5365,1243,11,5),(5366,1243,12,5),(5367,1243,12,5),(5368,1243,22,5),(5369,1243,17,6),(5370,1243,11,6),(5371,1249,43,3),(5372,1254,43,3),(5373,1262,17,2),(5374,1262,43,3),(5375,1262,12,4),(5376,1262,22,5),(5377,1262,12,5),(5378,1262,12,5),(5379,1262,17,7),(5380,1271,22,2),(5381,1271,43,3),(5382,1271,12,4),(5383,1271,48,4),(5384,1271,17,5),(5385,1271,11,5),(5386,1271,22,5),(5387,1271,17,6),(5388,1271,11,6),(5389,1271,22,7),(5390,1279,43,3),(5391,1281,43,3),(5392,1285,43,3),(5393,1285,4,5),(5394,1285,3,5),(5395,1286,43,3),(5396,1286,12,4),(5397,1286,48,4),(5398,1286,17,5),(5399,1286,11,5),(5400,1286,17,6),(5401,1286,11,6),(5402,1289,43,3),(5403,1289,12,4),(5404,1289,48,4),(5405,1289,17,5),(5406,1289,11,5),(5407,1289,17,6),(5408,1289,11,6),(5409,1309,22,2),(5410,1309,43,3),(5411,1309,12,4),(5412,1309,48,4),(5413,1309,17,5),(5414,1309,11,5),(5415,1309,12,5),(5416,1309,12,5),(5417,1309,22,5),(5418,1309,22,5),(5419,1317,43,3),(5420,1317,12,5),(5421,1317,48,5),(5422,1317,11,5),(5423,1317,22,5),(5424,1323,43,3),(5425,1323,12,4),(5426,1323,22,5),(5427,1323,18,5),(5428,1323,46,5),(5429,1323,17,6),(5430,1324,43,3),(5431,1324,12,5),(5432,1324,48,5),(5433,1324,11,5),(5434,1324,22,5),(5435,1329,43,3),(5436,1329,12,4),(5437,1329,22,5),(5438,1329,18,5),(5439,1329,46,5),(5440,1329,17,6),(5441,1332,22,2),(5442,1332,43,3),(5443,1332,12,4),(5444,1332,48,4),(5445,1332,11,4),(5446,1332,17,5),(5447,1332,11,5),(5448,1332,12,5),(5449,1332,12,5),(5450,1332,22,5),(5451,1332,22,5),(5452,1332,17,6),(5453,1332,11,6),(5454,1332,22,7),(5455,1476,22,2),(5456,1476,17,3),(5457,1476,12,4),(5458,1476,22,5),(5459,1476,22,7),(5460,1478,22,2),(5461,1478,17,3),(5462,1478,12,4),(5463,1478,28,5),(5464,1478,8,5),(5465,1478,3,5),(5466,1478,4,5),(5467,1478,45,5),(5468,1478,22,7),(5469,1479,22,2),(5470,1479,17,3),(5471,1479,12,4),(5472,1479,45,5),(5473,1479,22,5),(5474,1479,22,7),(5475,1480,22,2),(5476,1480,17,3),(5477,1480,12,4),(5478,1480,45,5),(5479,1480,22,5),(5480,1480,22,7),(5481,1481,22,2),(5482,1481,6,2),(5483,1481,17,3),(5484,1481,12,4),(5485,1481,11,4),(5486,1481,46,4),(5487,1481,16,4),(5488,1481,41,4),(5489,1481,22,5),(5490,1481,6,5),(5491,1481,22,7),(5492,1481,6,7),(5493,1483,22,2),(5494,1483,6,2),(5495,1483,17,3),(5496,1483,11,4),(5497,1483,16,4),(5498,1483,46,4),(5499,1483,41,4),(5500,1483,12,5),(5501,1483,22,5),(5502,1483,6,5),(5503,1483,22,7),(5504,1483,6,7),(5505,1485,22,2),(5506,1485,17,3),(5507,1485,12,4),(5508,1485,28,5),(5509,1485,8,5),(5510,1485,3,5),(5511,1485,4,5),(5512,1485,45,5),(5513,1485,22,5),(5514,1485,22,7),(5515,1486,22,2),(5516,1486,17,3),(5517,1486,12,4),(5518,1486,45,5),(5519,1486,22,5),(5520,1486,22,7),(5521,1487,6,2),(5522,1487,17,3),(5523,1487,11,4),(5524,1487,46,4),(5525,1487,16,4),(5526,1487,41,4),(5527,1487,6,5),(5528,1487,6,7),(5529,1489,6,2),(5530,1489,17,3),(5531,1489,11,4),(5532,1489,16,4),(5533,1489,46,4),(5534,1489,18,4),(5535,1489,41,4),(5536,1489,12,5),(5537,1489,12,5),(5538,1489,6,5),(5539,1489,6,7),(5540,1491,6,2),(5541,1491,17,3),(5542,1491,11,4),(5543,1491,16,4),(5544,1491,46,4),(5545,1491,41,4),(5546,1491,12,5),(5547,1491,12,5),(5548,1491,6,7),(5549,1492,6,2),(5550,1492,17,3),(5551,1492,11,4),(5552,1492,16,4),(5553,1492,46,4),(5554,1492,41,4),(5555,1492,12,5),(5556,1492,12,5),(5557,1492,22,5),(5558,1492,6,5),(5559,1492,6,7),(5560,1494,6,2),(5561,1494,17,3),(5562,1494,11,4),(5563,1494,46,4),(5564,1494,16,4),(5565,1494,41,4),(5566,1494,6,5),(5567,1494,6,7),(5568,1495,6,2),(5569,1495,17,3),(5570,1495,11,4),(5571,1495,46,4),(5572,1495,16,4),(5573,1495,41,4),(5574,1495,6,5),(5575,1495,6,7),(5576,1493,22,2),(5577,1493,17,3),(5578,1493,12,4),(5579,1493,45,5),(5580,1493,22,5),(5581,1493,22,7),(5582,1497,6,2),(5583,1497,17,3),(5584,1497,11,4),(5585,1497,46,4),(5586,1497,16,4),(5587,1497,41,4),(5588,1497,6,5),(5589,1497,6,7),(5590,1496,6,2),(5591,1496,17,3),(5592,1496,11,4),(5593,1496,46,4),(5594,1496,16,4),(5595,1496,12,5),(5596,1496,12,5),(5597,1496,6,7),(5598,1499,22,2),(5599,1499,17,3),(5600,1499,12,4),(5601,1499,45,5),(5602,1499,22,5),(5603,1499,22,7),(5604,1502,6,2),(5605,1502,17,3),(5606,1502,11,4),(5607,1502,46,4),(5608,1502,16,4),(5609,1502,12,5),(5610,1502,12,5),(5611,1502,6,7),(5612,1503,6,2),(5613,1503,17,3),(5614,1503,11,4),(5615,1503,16,4),(5616,1503,46,4),(5617,1503,41,4),(5618,1503,12,5),(5619,1503,12,5),(5620,1503,6,7),(5621,1504,6,2),(5622,1504,17,3),(5623,1504,11,4),(5624,1504,46,4),(5625,1504,16,4),(5626,1504,41,4),(5627,1504,6,5),(5628,1504,6,7),(5629,1501,6,2),(5630,1501,17,3),(5631,1501,11,4),(5632,1501,16,4),(5633,1501,46,4),(5634,1501,41,4),(5635,1501,6,5),(5636,1501,6,7),(5637,1500,6,2),(5638,1500,17,3),(5639,1500,11,4),(5640,1500,16,4),(5641,1500,46,4),(5642,1500,41,4),(5643,1500,6,5),(5644,1500,6,7),(5645,1505,6,2),(5646,1505,17,3),(5647,1505,11,4),(5648,1505,46,4),(5649,1505,16,4),(5650,1505,41,4),(5651,1505,6,5),(5652,1505,6,7),(5653,1506,6,2),(5654,1506,17,3),(5655,1506,11,4),(5656,1506,46,4),(5657,1506,16,4),(5658,1506,12,5),(5659,1506,12,5),(5660,1506,6,7),(5661,1507,6,2),(5662,1507,17,3),(5663,1507,11,4),(5664,1507,16,4),(5665,1507,46,4),(5666,1507,41,4),(5667,1507,12,5),(5668,1507,12,5),(5669,1507,11,5),(5670,1507,48,5),(5671,1507,6,5),(5672,1507,6,7),(5673,1509,6,2),(5674,1509,17,3),(5675,1509,11,4),(5676,1509,16,4),(5677,1509,46,4),(5678,1509,41,4),(5679,1509,6,5),(5680,1509,6,7),(5681,1508,6,2),(5682,1508,17,3),(5683,1508,11,4),(5684,1508,16,4),(5685,1508,46,4),(5686,1508,41,4),(5687,1508,12,5),(5688,1508,12,5),(5689,1508,12,5),(5690,1508,11,5),(5691,1508,48,5),(5692,1508,6,5),(5693,1508,6,7),(5694,1512,22,2),(5695,1512,17,3),(5696,1512,12,4),(5697,1512,22,5),(5698,1512,22,7),(5699,1510,6,2),(5700,1510,17,3),(5701,1510,11,4),(5702,1510,46,4),(5703,1510,16,4),(5704,1510,12,5),(5705,1510,12,5),(5706,1510,6,7),(5707,1511,22,2),(5708,1511,17,3),(5709,1511,12,4),(5710,1511,45,5),(5711,1511,22,5),(5712,1511,22,7),(5713,1514,22,2),(5714,1514,17,3),(5715,1514,12,4),(5716,1514,45,5),(5717,1514,22,5),(5718,1514,22,7),(5719,1516,22,2),(5720,1516,17,3),(5721,1516,12,4),(5722,1516,28,5),(5723,1516,8,5),(5724,1516,3,5),(5725,1516,4,5),(5726,1516,45,5),(5727,1516,22,5),(5728,1516,22,7),(5729,1519,22,2),(5730,1519,6,2),(5731,1519,17,3),(5732,1519,11,4),(5733,1519,16,4),(5734,1519,46,4),(5735,1519,41,4),(5736,1519,12,5),(5737,1519,22,5),(5738,1519,6,5),(5739,1519,22,7),(5740,1519,6,7),(5741,1518,22,2),(5742,1518,17,3),(5743,1518,12,4),(5744,1518,28,5),(5745,1518,8,5),(5746,1518,3,5),(5747,1518,4,5),(5748,1518,45,5),(5749,1518,22,5),(5750,1518,22,7),(5751,1520,17,4),(5752,1520,12,4),(5753,1520,28,4),(5754,1520,8,4),(5755,1520,45,4),(5756,1520,29,4),(5757,1520,45,5),(5758,1521,22,2),(5759,1521,17,3),(5760,1521,12,4),(5761,1521,28,4),(5762,1521,8,4),(5763,1521,45,4),(5764,1521,29,4),(5765,1521,45,5),(5766,1521,22,5),(5767,1521,22,7),(5768,1522,6,2),(5769,1522,22,2),(5770,1522,17,3),(5771,1522,11,4),(5772,1522,46,4),(5773,1522,16,4),(5774,1522,41,4),(5775,1522,12,5),(5776,1522,45,5),(5777,1522,6,5),(5778,1522,22,5),(5779,1522,6,7),(5780,1522,22,7),(5781,1523,6,2),(5782,1523,22,2),(5783,1523,17,3),(5784,1523,11,4),(5785,1523,46,4),(5786,1523,16,4),(5787,1523,41,4),(5788,1523,12,5),(5789,1523,6,5),(5790,1523,22,5),(5791,1523,6,7),(5792,1523,22,7),(5793,1524,6,2),(5794,1524,22,2),(5795,1524,17,3),(5796,1524,11,4),(5797,1524,46,4),(5798,1524,16,4),(5799,1524,41,4),(5800,1524,12,5),(5801,1524,6,5),(5802,1524,22,5),(5803,1524,6,7),(5804,1524,22,7),(5805,1525,22,2),(5806,1525,6,2),(5807,1525,17,3),(5808,1525,11,4),(5809,1525,16,4),(5810,1525,46,4),(5811,1525,41,4),(5812,1525,12,5),(5813,1525,22,5),(5814,1525,6,5),(5815,1525,22,7),(5816,1525,6,7),(5817,1528,22,2),(5818,1528,6,2),(5819,1528,17,3),(5820,1528,11,4),(5821,1528,16,4),(5822,1528,46,4),(5823,1528,41,4),(5824,1528,6,4),(5825,1528,39,4),(5826,1528,12,5),(5827,1528,22,5),(5828,1528,6,5),(5829,1528,22,7),(5830,1528,6,7),(5831,1526,6,2),(5832,1526,22,2),(5833,1526,17,3),(5834,1526,11,4),(5835,1526,46,4),(5836,1526,16,4),(5837,1526,41,4),(5838,1526,12,5),(5839,1526,45,5),(5840,1526,6,5),(5841,1526,22,5),(5842,1526,6,7),(5843,1526,22,7),(5844,1527,22,2),(5845,1527,6,2),(5846,1527,17,3),(5847,1527,11,4),(5848,1527,16,4),(5849,1527,46,4),(5850,1527,41,4),(5851,1527,6,4),(5852,1527,3,4),(5853,1527,39,4),(5854,1527,12,5),(5855,1527,22,5),(5856,1527,6,5),(5857,1527,22,7),(5858,1527,6,7),(5859,1530,6,2),(5860,1530,22,2),(5861,1530,17,3),(5862,1530,11,4),(5863,1530,46,4),(5864,1530,16,4),(5865,1530,41,4),(5866,1530,12,5),(5867,1530,45,5),(5868,1530,6,5),(5869,1530,22,5),(5870,1530,6,7),(5871,1530,22,7),(5872,1534,17,3),(5873,1533,17,3),(5874,1532,6,2),(5875,1532,22,2),(5876,1532,17,3),(5877,1532,11,4),(5878,1532,46,4),(5879,1532,16,4),(5880,1532,41,4),(5881,1532,12,5),(5882,1532,6,5),(5883,1532,22,5),(5884,1532,6,7),(5885,1532,22,7),(5886,1531,6,2),(5887,1531,22,2),(5888,1531,17,3),(5889,1531,11,4),(5890,1531,46,4),(5891,1531,16,4),(5892,1531,41,4),(5893,1531,12,5),(5894,1531,45,5),(5895,1531,6,5),(5896,1531,22,5),(5897,1531,6,7),(5898,1531,22,7),(5899,1535,17,3),(5900,1538,17,3),(5901,1537,6,2),(5902,1537,22,2),(5903,1537,17,3),(5904,1537,11,4),(5905,1537,46,4),(5906,1537,16,4),(5907,1537,41,4),(5908,1537,12,5),(5909,1537,6,5),(5910,1537,22,5),(5911,1537,6,7),(5912,1537,22,7),(5913,1536,6,2),(5914,1536,22,2),(5915,1536,17,3),(5916,1536,11,4),(5917,1536,46,4),(5918,1536,16,4),(5919,1536,41,4),(5920,1536,12,5),(5921,1536,6,5),(5922,1536,22,5),(5923,1536,6,7),(5924,1536,22,7),(5925,1539,17,3),(5926,1540,17,3),(5927,1541,17,3),(5928,1542,17,3),(5929,1543,17,3),(5930,1545,17,3),(5931,1544,17,3),(5932,1546,17,3),(5933,1548,17,3),(5934,1547,17,3),(5935,1549,17,3),(5936,1550,17,3),(5937,1551,17,3),(5938,1552,17,3),(5939,1553,16,4),(5940,1553,12,4),(5941,1554,16,4),(5942,1558,16,4),(5943,1558,12,4),(5944,1560,16,4),(5945,1560,12,4),(5946,1559,16,4),(5947,1556,16,4),(5948,1556,18,5),(5949,1556,46,5),(5950,1556,22,5),(5951,1557,16,4),(5952,1557,12,4),(5953,1585,11,3),(5954,1585,48,4),(5955,1586,11,3),(5956,1586,48,4),(5957,1587,11,3),(5958,1587,48,4),(5959,1588,11,3),(5960,1588,48,4),(5961,1588,12,5),(5962,1588,12,5),(5963,1588,22,5),(5964,1589,11,3),(5965,1589,48,4),(5966,1589,12,5),(5967,1589,12,5),(5968,1589,22,5),(5969,1590,11,3),(5970,1590,48,4),(5971,1590,12,5),(5972,1590,12,5),(5973,1590,22,5),(5974,1591,11,3),(5975,1591,48,4),(5976,1591,12,5),(5977,1591,12,5),(5978,1592,11,3),(5979,1592,48,4),(5980,1593,11,3),(5981,1593,48,4),(5982,1595,11,3),(5983,1595,48,4),(5984,1594,11,3),(5985,1594,48,4),(5986,1594,6,5),(5987,1594,29,5),(5988,1596,11,3),(5989,1596,48,4),(5990,1597,11,3),(5991,1597,48,4),(5992,1598,11,3),(5993,1598,48,4),(5994,1599,11,3),(5995,1599,48,4),(5996,1600,11,3),(5997,1600,48,4),(5998,1601,11,3),(5999,1601,48,4),(6000,1601,6,5),(6001,1601,29,5),(6002,1603,11,3),(6003,1603,48,4),(6004,1604,11,3),(6005,1604,48,4),(6006,1602,11,3),(6007,1602,48,4),(6008,1605,11,3),(6009,1605,48,4),(6010,1606,11,3),(6011,1606,48,4),(6012,1607,11,3),(6013,1607,48,4),(6014,1608,11,3),(6015,1608,48,4),(6016,1609,11,3),(6017,1609,48,4),(6018,1610,11,3),(6019,1610,48,4),(6020,1611,11,3),(6021,1611,48,4),(6022,1611,6,5),(6023,1611,29,5),(6024,1612,11,3),(6025,1612,48,4),(6026,1613,11,3),(6027,1613,48,4),(6028,1614,11,3),(6029,1614,48,4),(6030,1615,11,3),(6031,1615,48,4),(6032,1616,11,3),(6033,1616,48,4),(6034,1617,11,3),(6035,1617,48,4),(6036,1618,11,3),(6037,1618,48,4),(6038,1619,11,3),(6039,1619,48,4),(6040,1619,6,5),(6041,1619,29,5),(6042,1620,11,3),(6043,1620,48,4),(6044,1621,11,3),(6045,1621,48,4),(6046,1621,12,5),(6047,1621,12,5),(6048,1621,22,5),(6049,1622,11,3),(6050,1622,48,4),(6051,1623,11,3),(6052,1623,48,4),(6053,1623,6,5),(6054,1623,29,5),(6055,1624,11,3),(6056,1624,48,4),(6057,1625,11,3),(6058,1625,48,4),(6059,1625,12,5),(6060,1625,12,5),(6061,1625,22,5),(6062,1626,11,3),(6063,1627,11,3),(6064,1628,11,3),(6065,1628,48,4),(6066,1628,12,5),(6067,1628,12,5),(6068,1628,22,5),(6069,1629,11,3),(6070,1629,48,4),(6071,1629,43,4),(6072,1629,12,4),(6073,1629,12,5),(6074,1629,12,5),(6075,1629,22,5),(6076,1630,11,3),(6077,1632,11,3),(6078,1633,11,3),(6079,1635,11,3),(6080,1634,11,3),(6081,1631,11,3),(6082,1631,48,4),(6083,1631,12,5),(6084,1631,12,5),(6085,1631,22,5),(6086,1631,29,5),(6087,1631,6,5),(6088,1636,48,3),(6089,1636,11,4),(6090,1637,48,3),(6091,1637,11,4),(6092,1638,48,3),(6093,1638,11,4),(6094,1638,43,5),(6095,1638,12,5),(6096,1639,48,3),(6097,1640,48,3),(6098,1643,48,3),(6099,1643,11,4),(6100,1642,48,3),(6101,1642,11,4),(6102,1641,48,3),(6103,1641,43,4),(6104,1641,12,4),(6105,1641,11,5),(6106,1641,17,5),(6107,1641,11,6),(6108,1641,17,6),(6109,1644,48,3),(6110,1645,48,3),(6111,1646,48,3),(6112,1646,11,4),(6113,1647,48,3),(6114,1648,48,3),(6115,1649,48,3),(6116,1650,48,3),(6117,1651,48,3),(6118,1652,6,3),(6119,1653,6,3),(6120,1654,6,3),(6121,1654,12,5),(6122,1654,12,5),(6123,1655,6,3),(6124,1656,6,3),(6125,1658,6,3),(6126,1659,6,3),(6127,1657,6,3),(6128,1660,6,3),(6129,1661,6,3),(6130,1662,6,3),(6131,1663,6,3),(6132,1664,6,3),(6133,1664,6,5),(6134,1664,29,5),(6135,1665,6,3),(6136,1667,6,3),(6137,1666,6,3),(6138,1668,6,3),(6139,1669,6,3),(6140,1671,6,3),(6141,1672,6,3),(6142,1670,6,3),(6143,1674,6,3),(6144,1673,6,3),(6145,1673,6,5),(6146,1673,29,5),(6147,1675,6,3),(6148,1676,6,3),(6149,1677,6,3),(6150,1678,6,3),(6151,1679,6,3),(6152,1680,6,3),(6153,1681,6,3),(6154,1682,6,3),(6155,1684,6,3),(6156,1685,6,3),(6157,1683,6,3),(6158,1686,6,3),(6159,1687,6,3),(6160,1687,12,5),(6161,1687,12,5),(6162,1687,22,5); +/*!40000 ALTER TABLE `exercise_related_muscle` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `kinesiology_glossary` +-- + +DROP TABLE IF EXISTS `kinesiology_glossary`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `kinesiology_glossary` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'The ID of kinesiology glossary.', + `name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'The name kinesiology glossary.', + `description` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'The description of kinesiology glossary.', + `parent_id` bigint unsigned DEFAULT NULL COMMENT 'The parent ID of kinesiology glossary.', + `created_by` bigint unsigned NOT NULL DEFAULT '1' COMMENT 'Created by', + `created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Created time', + `modified_by` bigint unsigned DEFAULT NULL COMMENT 'Modified by', + `modified_time` datetime DEFAULT NULL COMMENT 'Modified time', + `deleted` tinyint NOT NULL DEFAULT '0' COMMENT 'Deleted', + PRIMARY KEY (`id`), + UNIQUE KEY `kinesiology_glossary_name_uindex` (`name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Kinesiology Glossary.\n\nhttps://exrx.net/Kinesiology/Glossary'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `kinesiology_glossary` +-- + +LOCK TABLES `kinesiology_glossary` WRITE; +/*!40000 ALTER TABLE `kinesiology_glossary` DISABLE KEYS */; +/*!40000 ALTER TABLE `kinesiology_glossary` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `muscle` +-- + +DROP TABLE IF EXISTS `muscle`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `muscle` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'The ID of muscle.', + `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'The name of muscle.', + `other_names` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'The muslce''s other names.', + `parent_id` bigint unsigned DEFAULT NULL COMMENT 'The parent ID of muscle.', + `body_part_id` bigint unsigned NOT NULL COMMENT 'Related body part ID.', + `created_by` bigint unsigned NOT NULL DEFAULT '1' COMMENT 'Created by', + `created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Created time', + `modified_by` bigint unsigned DEFAULT NULL COMMENT 'Modified by', + `modified_time` datetime DEFAULT NULL COMMENT 'Modified time', + `deleted` tinyint NOT NULL DEFAULT '0' COMMENT 'Deleted', + PRIMARY KEY (`id`), + UNIQUE KEY `muscle_name_uindex` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=54 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Muscle.\n\nhttps://exrx.net/Lists/Muscle'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `muscle` +-- + +LOCK TABLES `muscle` WRITE; +/*!40000 ALTER TABLE `muscle` DISABLE KEYS */; +INSERT INTO `muscle` VALUES (1,'Adductors','Inner Thigh',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(2,'Biceps Brachii','Arm (Front),Biceps,Biceps Cubiti',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(3,'Brachialis','Arm (Side),Lower Biceps',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(4,'Brachioradialis','Forearm (Upper-outer),Supinator longus (out dated)',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(5,'Deltoid',NULL,NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(6,'Anterior','Shoulder (Front),Front Delts',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(7,'Lateral','Shoulder (Side),Side Delts',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(8,'Posterior','Shoulder (Rear),Rear Delts',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(9,'Deep Hip External Rotators','Six Deep Lateral Rotator Hip Muscles',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(10,'Erector Spinae','Lower Back',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(11,'Gastrocnemius','Calf',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(12,'Gluteus',NULL,NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(13,'Maximus','Butt,Hips (Rear),Glutes',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(14,'Medius','Hip,Hip Abductor',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(15,'Minimus','Hip,Hip Abductor',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(16,'Gracilis','Inner Thigh,Hip Adductor',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(17,'Hamstrings','Thigh (Rear)',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(18,'Iliopsoas','Hip,Hip Flexors',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(19,'Infraspinatus','Rotatory Cuff,Back',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(20,'Latissimus Dorsi','Back (Middle, Outer),Lats',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(21,'Levator Scapulae','Shoulder (Upper),Neck (Rear)',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(22,'Obliques','Hips (Upper),Waist (Sides),Obliques',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(23,'Pectineous','Thigh (upper),Hip Flexors',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(24,'Pectoralis Major',NULL,NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(25,'Clavicular Head','Chest (Upper),Upper Pecs',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(26,'Sternal Head','Chest,Lower Pecs',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(27,'Teres',NULL,NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(28,'Major','Back (Outer),Lats little helper',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(29,'Minor','Rotatory Cuff,Back',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(30,'Tibialis Anterior','Shin,Tibias,Tibialis Anticus',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(31,'Transverse Abdominus','Transverse Abs',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(32,'Trapezius',NULL,NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(33,'Lower Fibers','Back (Middle),Lower Traps',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(34,'Middle Fibers','Back (Upper),Traps',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(35,'Upper Fibers','Shoulder (Upper),Upper Traps',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(36,'Triceps Brachii','Arm (Rear),Triceps',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(37,'Wrist',NULL,NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(38,'Extensors','Forearm (outer or back),Hand Extensors',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(39,'Flexors','Forearm (Inner),Hand Flexors',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(40,'Pectoralis Minor','Chest,Shoulder',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(41,'Popliteus','Knee flexor',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(42,'Quadratus Lumborum','Deep Low Back Lateral Flexor',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(43,'Quadriceps','Thigh (Front),Quads',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(44,'Rectus Abdominis','Waist (Belly),Abdominal,Abs',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(45,'Rhomboids','Back (Middle)',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(46,'Sartorius','Thigh (Inner),Tailor\'s muscle,Longest muscle in body',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(47,'Serratus Anterior','Serratus Magnus,Boxer\'s Muscle',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(48,'Soleus','Calf,Soleus',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(49,'Splenius','Neck (Rear),Neck Extensors',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(50,'Sternocleidomastoid','Sterno-mastoid,Neck (Front / Sides),Neck Flexors',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(51,'Subscapularis','Rotator Cuff,Back',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(52,'Supraspinatus','Rotatory Cuff,Shoulder',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(53,'Tensor Fasciae Latae','Hip,Hip Abductor/Flexor,Tensor Fasciae Femoris',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0); +/*!40000 ALTER TABLE `muscle` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `muscle_image` +-- + +DROP TABLE IF EXISTS `muscle_image`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `muscle_image` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'The ID of muscle image.', + `muscle_id` bigint unsigned NOT NULL COMMENT 'The ID of muslce.', + `image_path` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'The image path of muscle image.', + `alternative_text` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'A textual description of the image.', + `created_by` bigint unsigned NOT NULL DEFAULT '1' COMMENT 'Created by', + `created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Created time', + `modified_by` bigint unsigned DEFAULT NULL COMMENT 'Modified by', + `modified_time` datetime DEFAULT NULL COMMENT 'Modified time', + `deleted` tinyint NOT NULL DEFAULT '0' COMMENT 'Deleted', + PRIMARY KEY (`id`), + UNIQUE KEY `muscle_image_image_path_uindex` (`image_path`) +) ENGINE=InnoDB AUTO_INCREMENT=61 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Muscle Image.\n\nThe relationship:\nOne muscle to one or more muscle image.'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `muscle_image` +-- + +LOCK TABLES `muscle_image` WRITE; +/*!40000 ALTER TABLE `muscle_image` DISABLE KEYS */; +INSERT INTO `muscle_image` VALUES (1,1,'upload/muscle-picture/adductors/AdductorAnteriorSmall.png','Adductors',1,'2021-06-27 13:54:16',NULL,NULL,0),(2,1,'upload/muscle-picture/adductors/AdductorPosteriorSmall.png','Adductors',1,'2021-06-27 13:54:16',NULL,NULL,0),(3,2,'upload/muscle-picture/biceps-brachii/BicepsInsideSmall.gif','Biceps Brachii',1,'2021-06-27 13:54:16',NULL,NULL,0),(4,3,'upload/muscle-picture/brachialis/BrachialisInsideSmall.gif','Brachialis',1,'2021-06-27 13:54:16',NULL,NULL,0),(5,3,'upload/muscle-picture/brachialis/BrachialisUpperArmSegmentSmall.gif','Brachialis',1,'2021-06-27 13:54:16',NULL,NULL,0),(6,4,'upload/muscle-picture/brachioradialis/BrachioradialisoutsideSmall.png','Brachioradialis',1,'2021-06-27 13:54:16',NULL,NULL,0),(7,6,'upload/muscle-picture/anterior/DeltoidAnteriorFront.gif','Anterior',1,'2021-06-27 13:54:16',NULL,NULL,0),(8,7,'upload/muscle-picture/lateral/DeltoidLateralBack.gif','Lateral',1,'2021-06-27 13:54:16',NULL,NULL,0),(9,8,'upload/muscle-picture/posterior/DeltoidPosteriorBack.gif','Posterior',1,'2021-06-27 13:54:16',NULL,NULL,0),(10,9,'upload/muscle-picture/deep-hip-external-rotators/DeepHipRotators.gif','Deep Hip External Rotators',1,'2021-06-27 13:54:16',NULL,NULL,0),(11,10,'upload/muscle-picture/erector-spinae/96a0e9eeb4ad8418eff179a9c59bc713.png','Erector Spinae',1,'2021-06-27 13:54:16',NULL,NULL,0),(12,10,'upload/muscle-picture/erector-spinae/ErectorSpinaeCrossSection.gif','Erector Spinae',1,'2021-06-27 13:54:16',NULL,NULL,0),(13,11,'upload/muscle-picture/gastrocnemius/GastrocnemiusLateral.gif','Gastrocnemius',1,'2021-06-27 13:54:16',NULL,NULL,0),(14,13,'upload/muscle-picture/maximus/80a4754b254e159c4cd5474b063d096e.png','Maximus',1,'2021-06-27 13:54:16',NULL,NULL,0),(15,14,'upload/muscle-picture/medius/GluteusMediusPosterior.gif','Medius',1,'2021-06-27 13:54:16',NULL,NULL,0),(16,15,'upload/muscle-picture/minimus/bf94c6ef8b7ca1c02323779e1fe3b837.png','Minimus',1,'2021-06-27 13:54:16',NULL,NULL,0),(17,15,'upload/muscle-picture/minimus/GluteusMinimusSide.gif','Minimus',1,'2021-06-27 13:54:16',NULL,NULL,0),(18,16,'upload/muscle-picture/gracilis/69c90b7fb98b9c863015a90b3ff3173c.png','Gracilis',1,'2021-06-27 13:54:16',NULL,NULL,0),(19,17,'upload/muscle-picture/hamstrings/1c94da8f4db345d0343c3db475d2d84d.png','Hamstrings',1,'2021-06-27 13:54:16',NULL,NULL,0),(20,18,'upload/muscle-picture/iliopsoas/99beae51baa19dc3d8ef62c04b469133.png','Iliopsoas',1,'2021-06-27 13:54:16',NULL,NULL,0),(21,18,'upload/muscle-picture/iliopsoas/ed4205586bfaf0b1603ad8e70dae6706.png','Iliopsoas',1,'2021-06-27 13:54:16',NULL,NULL,0),(22,19,'upload/muscle-picture/infraspinatus/3e3d3ded3335c56a7f932c6e38a3ed53.png','Infraspinatus',1,'2021-06-27 13:54:16',NULL,NULL,0),(23,20,'upload/muscle-picture/latissimus-dorsi/67f687e9482a2a6bca9a38544e45d31c.png','Latissimus Dorsi',1,'2021-06-27 13:54:16',NULL,NULL,0),(24,20,'upload/muscle-picture/latissimus-dorsi/LatSmall.png','Latissimus Dorsi',1,'2021-06-27 13:54:16',NULL,NULL,0),(25,21,'upload/muscle-picture/levator-scapulae/5083bc6f81d7a598832a5cb53340fb4a.png','Levator Scapulae',1,'2021-06-27 13:54:16',NULL,NULL,0),(26,22,'upload/muscle-picture/obliques/1d421470bb1b8650b68a055d15704abe.png','Obliques',1,'2021-06-27 13:54:16',NULL,NULL,0),(27,22,'upload/muscle-picture/obliques/ObliqueCrossSection.gif','Obliques',1,'2021-06-27 13:54:16',NULL,NULL,0),(28,23,'upload/muscle-picture/pectineous/52d884ea5ad22f197b0335468e4ca6e7.png','Pectineous',1,'2021-06-27 13:54:16',NULL,NULL,0),(29,25,'upload/muscle-picture/clavicular-head/11a9ea1af4fa3e206ec2eecc7e60100e.png','Clavicular Head',1,'2021-06-27 13:54:16',NULL,NULL,0),(30,25,'upload/muscle-picture/clavicular-head/0e1ed54440e102b3ec973207ea371964.png','Clavicular Head',1,'2021-06-27 13:54:16',NULL,NULL,0),(31,26,'upload/muscle-picture/sternal-head/5a6b344e7b8a52c715adf8b091461f7d.png','Sternal Head',1,'2021-06-27 13:54:16',NULL,NULL,0),(32,26,'upload/muscle-picture/sternal-head/PectoralAttachmentSmall.png','Sternal Head',1,'2021-06-27 13:54:16',NULL,NULL,0),(33,28,'upload/muscle-picture/major/TeresMajorSmall.png','Major',1,'2021-06-27 13:54:16',NULL,NULL,0),(34,29,'upload/muscle-picture/minor/TeresMinorSmall.png','Minor',1,'2021-06-27 13:54:16',NULL,NULL,0),(35,30,'upload/muscle-picture/tibialis-anterior/TibialisAnteriorSmall.png','Tibialis Anterior',1,'2021-06-27 13:54:16',NULL,NULL,0),(36,31,'upload/muscle-picture/transverse-abdominus/TransverseAbdominisCrossSectionNew.jpg','Transverse Abdominus',1,'2021-06-27 13:54:16',NULL,NULL,0),(37,33,'upload/muscle-picture/lower-fibers/TrapLowerHalfSmall.png','Lower Fibers',1,'2021-06-27 13:54:16',NULL,NULL,0),(38,34,'upload/muscle-picture/middle-fibers/TrapMiddleHalfSmall.png','Middle Fibers',1,'2021-06-27 13:54:16',NULL,NULL,0),(39,35,'upload/muscle-picture/upper-fibers/TrapUpperHalfSmall.png','Upper Fibers',1,'2021-06-27 13:54:16',NULL,NULL,0),(40,36,'upload/muscle-picture/triceps-brachii/TricepsOutsideSmall.gif','Triceps Brachii',1,'2021-06-27 13:54:16',NULL,NULL,0),(41,38,'upload/muscle-picture/extensors/WristExtensorsSupSmall.gif','Extensors',1,'2021-06-27 13:54:16',NULL,NULL,0),(42,39,'upload/muscle-picture/flexors/WristFlexorNeutSmall.gif','Flexors',1,'2021-06-27 13:54:16',NULL,NULL,0),(43,40,'upload/muscle-picture/pectoralis-minor/e7cda9218a2e2c84a31a7ca32e98c3a9.png','Pectoralis Minor',1,'2021-06-27 13:54:16',NULL,NULL,0),(44,41,'upload/muscle-picture/popliteus/PopliteusSmall.png','Popliteus',1,'2021-06-27 13:54:16',NULL,NULL,0),(45,42,'upload/muscle-picture/quadratus-lumborum/QuadratusLumborumSmall.png','Quadratus Lumborum',1,'2021-06-27 13:54:16',NULL,NULL,0),(46,43,'upload/muscle-picture/quadriceps/QuadricepsAnteriorSmall.png','Quadriceps',1,'2021-06-27 13:54:16',NULL,NULL,0),(47,44,'upload/muscle-picture/rectus-abdominis/RectusAbdominisWaistSmall.png','Rectus Abdominis',1,'2021-06-27 13:54:16',NULL,NULL,0),(48,44,'upload/muscle-picture/rectus-abdominis/RectusAbdominalCrossSectionNew.jpg','Rectus Abdominis',1,'2021-06-27 13:54:16',NULL,NULL,0),(49,45,'upload/muscle-picture/rhomboids/RhomboidsHalfSmall.png','Rhomboids',1,'2021-06-27 13:54:16',NULL,NULL,0),(50,46,'upload/muscle-picture/sartorius/SartoriusAnteriorSmall.png','Sartorius',1,'2021-06-27 13:54:16',NULL,NULL,0),(51,47,'upload/muscle-picture/serratus-anterior/SerratusAnteriorSideSmall.png','Serratus Anterior',1,'2021-06-27 13:54:16',NULL,NULL,0),(52,47,'upload/muscle-picture/serratus-anterior/SerratusAnteriorPullSmall.png','Serratus Anterior',1,'2021-06-27 13:54:16',NULL,NULL,0),(53,47,'upload/muscle-picture/serratus-anterior/SerratusScapulaTransverseCu.gif','Serratus Anterior',1,'2021-06-27 13:54:16',NULL,NULL,0),(54,48,'upload/muscle-picture/soleus/SoleusLateralSmall.png','Soleus',1,'2021-06-27 13:54:16',NULL,NULL,0),(55,49,'upload/muscle-picture/splenius/SpleniusSpineSmall.png','Splenius',1,'2021-06-27 13:54:16',NULL,NULL,0),(56,49,'upload/muscle-picture/splenius/SpeniusHalfSmall.png','Splenius',1,'2021-06-27 13:54:16',NULL,NULL,0),(57,50,'upload/muscle-picture/sternocleidomastoid/SternoSideSmall.png','Sternocleidomastoid',1,'2021-06-27 13:54:16',NULL,NULL,0),(58,51,'upload/muscle-picture/subscapularis/SubscapularisSmall.png','Subscapularis',1,'2021-06-27 13:54:16',NULL,NULL,0),(59,52,'upload/muscle-picture/supraspinatus/SupraspinatusBackSmall.png','Supraspinatus',1,'2021-06-27 13:54:16',NULL,NULL,0),(60,53,'upload/muscle-picture/tensor-fasciae-latae/TensorFasciaeLataeASmall.png','Tensor Fasciae Latae',1,'2021-06-27 13:54:16',NULL,NULL,0); +/*!40000 ALTER TABLE `muscle_image` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `permission` +-- + +DROP TABLE IF EXISTS `permission`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `permission` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'Primary key', + `url` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'URL. If type of record is page (1), URL stands for route; if type of record is button (2), URL stands for API', + `description` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'Permission description', + `type` tinyint NOT NULL COMMENT 'Permission type. 1 - page; 2 - button', + `permission_expression` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'Permission expression', + `method` enum('GET','HEAD','POST','PUT','DELETE','CONNECT','OPTIONS','TRACE','PATCH') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'HTTP method of API', + `sort` int NOT NULL DEFAULT '0' COMMENT 'Sort number', + `parent_id` bigint DEFAULT '0' COMMENT 'Primary key of parent', + `created_by` bigint unsigned NOT NULL DEFAULT '1' COMMENT 'Created by', + `created_time` datetime NOT NULL COMMENT 'Created time', + `modified_by` bigint unsigned DEFAULT NULL COMMENT 'Modified by', + `modified_time` datetime DEFAULT NULL COMMENT 'Modified time', + `deleted` tinyint NOT NULL DEFAULT '0' COMMENT 'Deleted flag', + PRIMARY KEY (`id`), + UNIQUE KEY `permission_expression_UNIQUE` (`permission_expression`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Permission.'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `permission` +-- + +LOCK TABLES `permission` WRITE; +/*!40000 ALTER TABLE `permission` DISABLE KEYS */; +/*!40000 ALTER TABLE `permission` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `related_muscle` +-- + +DROP TABLE IF EXISTS `related_muscle`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `related_muscle` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'The ID of related muscle.', + `muscle_id` bigint unsigned NOT NULL COMMENT 'The ID of muscle.', + `related_muscle_id` bigint unsigned NOT NULL COMMENT 'Related muscle''s ID.', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=56 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Muscle''s related muscles.'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `related_muscle` +-- + +LOCK TABLES `related_muscle` WRITE; +/*!40000 ALTER TABLE `related_muscle` DISABLE KEYS */; +INSERT INTO `related_muscle` VALUES (1,1,16),(2,2,3),(3,2,4),(4,3,2),(5,3,4),(6,4,3),(7,4,2),(8,10,49),(9,10,42),(10,11,48),(11,16,1),(12,16,17),(13,17,11),(14,17,46),(15,17,16),(16,18,46),(17,18,53),(18,21,45),(19,22,42),(20,22,44),(21,23,1),(22,23,18),(23,23,46),(24,23,53),(25,25,40),(26,26,40),(27,28,20),(28,29,19),(29,31,44),(30,31,22),(31,33,45),(32,34,45),(33,35,21),(34,40,47),(35,41,17),(36,42,22),(37,42,10),(38,43,18),(39,43,46),(40,43,53),(41,44,22),(42,45,32),(43,45,21),(44,45,47),(45,46,18),(46,46,53),(47,46,17),(48,47,40),(49,47,45),(50,48,11),(51,49,50),(52,49,10),(53,50,49),(54,53,18),(55,53,46); +/*!40000 ALTER TABLE `related_muscle` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `role` +-- + +DROP TABLE IF EXISTS `role`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `role` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'Primary key', + `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'Role name', + `description` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'Role description', + `created_by` bigint unsigned NOT NULL DEFAULT '1' COMMENT 'Created by', + `created_time` datetime NOT NULL COMMENT 'Created time', + `modified_by` bigint unsigned DEFAULT NULL COMMENT 'Modified by', + `modified_time` datetime DEFAULT NULL COMMENT 'Modified time', + `deleted` tinyint NOT NULL DEFAULT '0' COMMENT 'Deleted flag.', + PRIMARY KEY (`id`), + UNIQUE KEY `name_UNIQUE` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Role.'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `role` +-- + +LOCK TABLES `role` WRITE; +/*!40000 ALTER TABLE `role` DISABLE KEYS */; +INSERT INTO `role` VALUES (1,'admin','M&F system admin',1,'2020-05-09 16:18:51',1,'2020-05-09 16:18:45',0),(2,'guest','Guest for the system',1,'2021-06-29 11:37:33',NULL,NULL,0); +/*!40000 ALTER TABLE `role` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `role_permission` +-- + +DROP TABLE IF EXISTS `role_permission`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `role_permission` ( + `role_id` bigint NOT NULL COMMENT 'Primary key of role', + `permission_id` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'Primary key of permission', + PRIMARY KEY (`role_id`,`permission_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Role-permission Relation.'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `role_permission` +-- + +LOCK TABLES `role_permission` WRITE; +/*!40000 ALTER TABLE `role_permission` DISABLE KEYS */; +/*!40000 ALTER TABLE `role_permission` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `user` +-- + +DROP TABLE IF EXISTS `user`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `user` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'Primary key of user', + `username` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'Username', + `email` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'Email', + `cellphone` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'Cellphone number', + `password` varchar(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'Password', + `full_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'Full name', + `birthday` date DEFAULT NULL COMMENT 'Birthday', + `gender` enum('Agender','Androgyne','Bigender','Cisgender','Cisgender Female','Cisgender Male','Female to Male','Gender Fluid','Gender Nonconforming','Gender Questioning','Gender Variant','Genderqueer','Intersex','Male to Female','Neither','Neutrois','Non-binary','Other','Pangender','Transfeminine','Transgender','Transgender Female','Transgender Male','Transgender Person','Transmasculine','Two-Spirit') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '26 gender options', + `avatar` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'User avatar full path on SFTP server', + `status` tinyint NOT NULL DEFAULT '1' COMMENT 'Status. 1 - enabled, 2 - disabled', + `created_by` bigint unsigned NOT NULL DEFAULT '1' COMMENT 'Created by', + `created_time` datetime NOT NULL COMMENT 'Created time', + `modified_by` bigint unsigned DEFAULT NULL COMMENT 'Modified by', + `modified_time` datetime DEFAULT NULL COMMENT 'Modified time', + `deleted` tinyint NOT NULL DEFAULT '0' COMMENT 'Delete flag.', + PRIMARY KEY (`id`), + UNIQUE KEY `email_UNIQUE` (`email`), + UNIQUE KEY `username_UNIQUE` (`username`), + UNIQUE KEY `cellphone_UNIQUE` (`cellphone`), + KEY `user_username_email_cellphone_index` (`username`,`email`,`cellphone`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='User.'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `user` +-- + +LOCK TABLES `user` WRITE; +/*!40000 ALTER TABLE `user` DISABLE KEYS */; +INSERT INTO `user` VALUES (1,'ijohnnymiller','ijohnnymiller@icloud.com','13100959832','$2a$10$2wDrBjRykjsFoUZfKgogyOm0LxIg6EdH42uR3sQ8fHOQcKg5/Mvsm','Johnny Miller','1996-04-29','Cisgender Male',NULL,1,1,'2020-05-09 16:26:23',NULL,'2020-05-09 15:13:19',0),(2,'test1','test1@email.com',NULL,'$2a$10$Ft5LsGrnMoW2DNeboV.QV.w9r.meesdzwEOw1WMMUn/6zH.R9IW/K',NULL,NULL,NULL,NULL,1,1,'2021-06-27 11:21:38',NULL,'2021-06-27 11:21:38',0); +/*!40000 ALTER TABLE `user` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `user_role` +-- + +DROP TABLE IF EXISTS `user_role`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `user_role` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'The primary key', + `user_id` bigint unsigned NOT NULL COMMENT 'The primary key of user', + `role_id` bigint unsigned NOT NULL COMMENT 'The primary key of role', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='User-role Relation. Roles that users have.'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `user_role` +-- + +LOCK TABLES `user_role` WRITE; +/*!40000 ALTER TABLE `user_role` DISABLE KEYS */; +INSERT INTO `user_role` VALUES (1,1,1),(2,2,2); +/*!40000 ALTER TABLE `user_role` ENABLE KEYS */; +UNLOCK TABLES; +SET @@SESSION.SQL_LOG_BIN = @MYSQLDUMP_TEMP_LOG_BIN; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +-- Dump completed on 2021-07-04 15:21:59 diff --git a/docker/script/mysql-server-master/3_quartz_tables_mysql_innodb.sql b/docker/script/mysql-server-master/3_quartz_tables_mysql_innodb.sql new file mode 100644 index 00000000..d57295d1 --- /dev/null +++ b/docker/script/mysql-server-master/3_quartz_tables_mysql_innodb.sql @@ -0,0 +1,183 @@ +# +# In your Quartz properties file, you'll need to set +# org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate +# +# +# By: Ron Cordell - roncordell +# I didn't see this anywhere, so I thought I'd post it here. This is the script from Quartz to create the tables in a MySQL database, modified to use INNODB instead of MYISAM. + +DROP DATABASE IF EXISTS QUARTZ_DB; +CREATE DATABASE QUARTZ_DB; +USE QUARTZ_DB; + +DROP TABLE IF EXISTS QRTZ_FIRED_TRIGGERS; +DROP TABLE IF EXISTS QRTZ_PAUSED_TRIGGER_GRPS; +DROP TABLE IF EXISTS QRTZ_SCHEDULER_STATE; +DROP TABLE IF EXISTS QRTZ_LOCKS; +DROP TABLE IF EXISTS QRTZ_SIMPLE_TRIGGERS; +DROP TABLE IF EXISTS QRTZ_SIMPROP_TRIGGERS; +DROP TABLE IF EXISTS QRTZ_CRON_TRIGGERS; +DROP TABLE IF EXISTS QRTZ_BLOB_TRIGGERS; +DROP TABLE IF EXISTS QRTZ_TRIGGERS; +DROP TABLE IF EXISTS QRTZ_JOB_DETAILS; +DROP TABLE IF EXISTS QRTZ_CALENDARS; + +CREATE TABLE QRTZ_JOB_DETAILS( +SCHED_NAME VARCHAR(120) NOT NULL, +JOB_NAME VARCHAR(190) NOT NULL, +JOB_GROUP VARCHAR(190) NOT NULL, +DESCRIPTION VARCHAR(250) NULL, +JOB_CLASS_NAME VARCHAR(250) NOT NULL, +IS_DURABLE VARCHAR(1) NOT NULL, +IS_NONCONCURRENT VARCHAR(1) NOT NULL, +IS_UPDATE_DATA VARCHAR(1) NOT NULL, +REQUESTS_RECOVERY VARCHAR(1) NOT NULL, +JOB_DATA BLOB NULL, +PRIMARY KEY (SCHED_NAME,JOB_NAME,JOB_GROUP)) +ENGINE=InnoDB; + +CREATE TABLE QRTZ_TRIGGERS ( +SCHED_NAME VARCHAR(120) NOT NULL, +TRIGGER_NAME VARCHAR(190) NOT NULL, +TRIGGER_GROUP VARCHAR(190) NOT NULL, +JOB_NAME VARCHAR(190) NOT NULL, +JOB_GROUP VARCHAR(190) NOT NULL, +DESCRIPTION VARCHAR(250) NULL, +NEXT_FIRE_TIME BIGINT(13) NULL, +PREV_FIRE_TIME BIGINT(13) NULL, +PRIORITY INTEGER NULL, +TRIGGER_STATE VARCHAR(16) NOT NULL, +TRIGGER_TYPE VARCHAR(8) NOT NULL, +START_TIME BIGINT(13) NOT NULL, +END_TIME BIGINT(13) NULL, +CALENDAR_NAME VARCHAR(190) NULL, +MISFIRE_INSTR SMALLINT(2) NULL, +JOB_DATA BLOB NULL, +PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP), +FOREIGN KEY (SCHED_NAME,JOB_NAME,JOB_GROUP) +REFERENCES QRTZ_JOB_DETAILS(SCHED_NAME,JOB_NAME,JOB_GROUP)) +ENGINE=InnoDB; + +CREATE TABLE QRTZ_SIMPLE_TRIGGERS ( +SCHED_NAME VARCHAR(120) NOT NULL, +TRIGGER_NAME VARCHAR(190) NOT NULL, +TRIGGER_GROUP VARCHAR(190) NOT NULL, +REPEAT_COUNT BIGINT(7) NOT NULL, +REPEAT_INTERVAL BIGINT(12) NOT NULL, +TIMES_TRIGGERED BIGINT(10) NOT NULL, +PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP), +FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) +REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)) +ENGINE=InnoDB; + +CREATE TABLE QRTZ_CRON_TRIGGERS ( +SCHED_NAME VARCHAR(120) NOT NULL, +TRIGGER_NAME VARCHAR(190) NOT NULL, +TRIGGER_GROUP VARCHAR(190) NOT NULL, +CRON_EXPRESSION VARCHAR(120) NOT NULL, +TIME_ZONE_ID VARCHAR(80), +PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP), +FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) +REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)) +ENGINE=InnoDB; + +CREATE TABLE QRTZ_SIMPROP_TRIGGERS + ( + SCHED_NAME VARCHAR(120) NOT NULL, + TRIGGER_NAME VARCHAR(190) NOT NULL, + TRIGGER_GROUP VARCHAR(190) NOT NULL, + STR_PROP_1 VARCHAR(512) NULL, + STR_PROP_2 VARCHAR(512) NULL, + STR_PROP_3 VARCHAR(512) NULL, + INT_PROP_1 INT NULL, + INT_PROP_2 INT NULL, + LONG_PROP_1 BIGINT NULL, + LONG_PROP_2 BIGINT NULL, + DEC_PROP_1 NUMERIC(13,4) NULL, + DEC_PROP_2 NUMERIC(13,4) NULL, + BOOL_PROP_1 VARCHAR(1) NULL, + BOOL_PROP_2 VARCHAR(1) NULL, + PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP), + FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) + REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)) +ENGINE=InnoDB; + +CREATE TABLE QRTZ_BLOB_TRIGGERS ( +SCHED_NAME VARCHAR(120) NOT NULL, +TRIGGER_NAME VARCHAR(190) NOT NULL, +TRIGGER_GROUP VARCHAR(190) NOT NULL, +BLOB_DATA BLOB NULL, +PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP), +INDEX (SCHED_NAME,TRIGGER_NAME, TRIGGER_GROUP), +FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) +REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)) +ENGINE=InnoDB; + +CREATE TABLE QRTZ_CALENDARS ( +SCHED_NAME VARCHAR(120) NOT NULL, +CALENDAR_NAME VARCHAR(190) NOT NULL, +CALENDAR BLOB NOT NULL, +PRIMARY KEY (SCHED_NAME,CALENDAR_NAME)) +ENGINE=InnoDB; + +CREATE TABLE QRTZ_PAUSED_TRIGGER_GRPS ( +SCHED_NAME VARCHAR(120) NOT NULL, +TRIGGER_GROUP VARCHAR(190) NOT NULL, +PRIMARY KEY (SCHED_NAME,TRIGGER_GROUP)) +ENGINE=InnoDB; + +CREATE TABLE QRTZ_FIRED_TRIGGERS ( +SCHED_NAME VARCHAR(120) NOT NULL, +ENTRY_ID VARCHAR(95) NOT NULL, +TRIGGER_NAME VARCHAR(190) NOT NULL, +TRIGGER_GROUP VARCHAR(190) NOT NULL, +INSTANCE_NAME VARCHAR(190) NOT NULL, +FIRED_TIME BIGINT(13) NOT NULL, +SCHED_TIME BIGINT(13) NOT NULL, +PRIORITY INTEGER NOT NULL, +STATE VARCHAR(16) NOT NULL, +JOB_NAME VARCHAR(190) NULL, +JOB_GROUP VARCHAR(190) NULL, +IS_NONCONCURRENT VARCHAR(1) NULL, +REQUESTS_RECOVERY VARCHAR(1) NULL, +PRIMARY KEY (SCHED_NAME,ENTRY_ID)) +ENGINE=InnoDB; + +CREATE TABLE QRTZ_SCHEDULER_STATE ( +SCHED_NAME VARCHAR(120) NOT NULL, +INSTANCE_NAME VARCHAR(190) NOT NULL, +LAST_CHECKIN_TIME BIGINT(13) NOT NULL, +CHECKIN_INTERVAL BIGINT(13) NOT NULL, +PRIMARY KEY (SCHED_NAME,INSTANCE_NAME)) +ENGINE=InnoDB; + +CREATE TABLE QRTZ_LOCKS ( +SCHED_NAME VARCHAR(120) NOT NULL, +LOCK_NAME VARCHAR(40) NOT NULL, +PRIMARY KEY (SCHED_NAME,LOCK_NAME)) +ENGINE=InnoDB; + +CREATE INDEX IDX_QRTZ_J_REQ_RECOVERY ON QRTZ_JOB_DETAILS(SCHED_NAME,REQUESTS_RECOVERY); +CREATE INDEX IDX_QRTZ_J_GRP ON QRTZ_JOB_DETAILS(SCHED_NAME,JOB_GROUP); + +CREATE INDEX IDX_QRTZ_T_J ON QRTZ_TRIGGERS(SCHED_NAME,JOB_NAME,JOB_GROUP); +CREATE INDEX IDX_QRTZ_T_JG ON QRTZ_TRIGGERS(SCHED_NAME,JOB_GROUP); +CREATE INDEX IDX_QRTZ_T_C ON QRTZ_TRIGGERS(SCHED_NAME,CALENDAR_NAME); +CREATE INDEX IDX_QRTZ_T_G ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_GROUP); +CREATE INDEX IDX_QRTZ_T_STATE ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_STATE); +CREATE INDEX IDX_QRTZ_T_N_STATE ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP,TRIGGER_STATE); +CREATE INDEX IDX_QRTZ_T_N_G_STATE ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_GROUP,TRIGGER_STATE); +CREATE INDEX IDX_QRTZ_T_NEXT_FIRE_TIME ON QRTZ_TRIGGERS(SCHED_NAME,NEXT_FIRE_TIME); +CREATE INDEX IDX_QRTZ_T_NFT_ST ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_STATE,NEXT_FIRE_TIME); +CREATE INDEX IDX_QRTZ_T_NFT_MISFIRE ON QRTZ_TRIGGERS(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME); +CREATE INDEX IDX_QRTZ_T_NFT_ST_MISFIRE ON QRTZ_TRIGGERS(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME,TRIGGER_STATE); +CREATE INDEX IDX_QRTZ_T_NFT_ST_MISFIRE_GRP ON QRTZ_TRIGGERS(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME,TRIGGER_GROUP,TRIGGER_STATE); + +CREATE INDEX IDX_QRTZ_FT_TRIG_INST_NAME ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,INSTANCE_NAME); +CREATE INDEX IDX_QRTZ_FT_INST_JOB_REQ_RCVRY ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,INSTANCE_NAME,REQUESTS_RECOVERY); +CREATE INDEX IDX_QRTZ_FT_J_G ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,JOB_NAME,JOB_GROUP); +CREATE INDEX IDX_QRTZ_FT_JG ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,JOB_GROUP); +CREATE INDEX IDX_QRTZ_FT_T_G ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP); +CREATE INDEX IDX_QRTZ_FT_TG ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,TRIGGER_GROUP); + +commit; diff --git a/docker/script/mysql-server-slave/1_init_user.sql b/docker/script/mysql-server-slave/1_init_user.sql new file mode 100644 index 00000000..06711c28 --- /dev/null +++ b/docker/script/mysql-server-slave/1_init_user.sql @@ -0,0 +1,2 @@ +CREATE USER 'maf_mysql_r'@'%' IDENTIFIED BY 'maf@mysql'; +GRANT SELECT ON *.* TO 'maf_mysql_r'@'%'; diff --git a/docker/script/mysql-server-slave/2_Dump20210704.sql b/docker/script/mysql-server-slave/2_Dump20210704.sql new file mode 100644 index 00000000..0175ccfd --- /dev/null +++ b/docker/script/mysql-server-slave/2_Dump20210704.sql @@ -0,0 +1,512 @@ +-- MySQL dump 10.13 Distrib 8.0.23, for Win64 (x86_64) +-- +-- Host: 127.0.0.1 Database: muscle_and_fitness +-- ------------------------------------------------------ +-- Server version 8.0.23 + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!50503 SET NAMES utf8 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; +SET @MYSQLDUMP_TEMP_LOG_BIN = @@SESSION.SQL_LOG_BIN; +SET @@SESSION.SQL_LOG_BIN= 0; + +-- +-- Table structure for table `body_part` +-- + +DROP TABLE IF EXISTS `body_part`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `body_part` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'The ID of body part.', + `name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'The name of body part.', + `created_by` bigint unsigned NOT NULL DEFAULT '1' COMMENT 'Created by.', + `created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Created time', + `modified_by` bigint unsigned DEFAULT NULL COMMENT 'Modified by', + `modified_time` datetime DEFAULT NULL COMMENT 'Modified time', + `deleted` tinyint NOT NULL DEFAULT '0' COMMENT 'Deleted', + PRIMARY KEY (`id`), + UNIQUE KEY `body_part_name_uindex` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Human Body Part.'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `body_part` +-- + +LOCK TABLES `body_part` WRITE; +/*!40000 ALTER TABLE `body_part` DISABLE KEYS */; +INSERT INTO `body_part` VALUES (1,'Neck',1,'2021-06-27 13:31:48',NULL,NULL,0),(2,'Shoulders',1,'2021-06-27 13:31:48',NULL,NULL,0),(3,'Upper Arms',1,'2021-06-27 13:31:48',NULL,NULL,0),(4,'Forearms',1,'2021-06-27 13:31:48',NULL,NULL,0),(5,'Back',1,'2021-06-27 13:31:48',NULL,NULL,0),(6,'Chest',1,'2021-06-27 13:31:48',NULL,NULL,0),(7,'Waist',1,'2021-06-27 13:31:48',NULL,NULL,0),(8,'Hips',1,'2021-06-27 13:31:48',NULL,NULL,0),(9,'Thighs',1,'2021-06-27 13:31:48',NULL,NULL,0),(10,'Calves',1,'2021-06-27 13:31:48',NULL,NULL,0),(11,'Other Exercises',1,'2021-06-27 13:31:48',NULL,NULL,0); +/*!40000 ALTER TABLE `body_part` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `equipment` +-- + +DROP TABLE IF EXISTS `equipment`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `equipment` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'The ID of exercise equipment.', + `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'The name of equipment.', + `created_by` bigint unsigned NOT NULL DEFAULT '1' COMMENT 'Created by', + `created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Created time', + `modified_by` bigint unsigned DEFAULT NULL COMMENT 'Modified by', + `modified_time` datetime DEFAULT NULL COMMENT 'Modified time', + `deleted` tinyint NOT NULL DEFAULT '0' COMMENT 'Deleted', + PRIMARY KEY (`id`), + UNIQUE KEY `equipment_name_uindex` (`name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Exercise Equipment.'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `equipment` +-- + +LOCK TABLES `equipment` WRITE; +/*!40000 ALTER TABLE `equipment` DISABLE KEYS */; +/*!40000 ALTER TABLE `equipment` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `exercise` +-- + +DROP TABLE IF EXISTS `exercise`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `exercise` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'The ID of exercise.', + `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'The name of exercise.', + `preparation` varchar(800) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'Exercise preparation description.', + `execution` varchar(800) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'Exercise execution description.', + `exercise_gif_path` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'Exercise GIF image path.', + `created_by` bigint unsigned NOT NULL DEFAULT '1' COMMENT 'Created by', + `created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Created time', + `modified_by` bigint unsigned DEFAULT NULL COMMENT 'Modified by', + `modified_time` datetime DEFAULT NULL COMMENT 'Modified time', + `deleted` tinyint NOT NULL DEFAULT '0' COMMENT 'Deleted', + PRIMARY KEY (`id`), + UNIQUE KEY `exercise_name_uindex` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=1692 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Exercise.\n\nhttps://exrx.net/Lists/Directory'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `exercise` +-- + +LOCK TABLES `exercise` WRITE; +/*!40000 ALTER TABLE `exercise` DISABLE KEYS */; +INSERT INTO `exercise` VALUES (1,'Cable Neck Flexion (with belt)','Attach belt on low pulley cable by attaching carabiner on belt buckle. Grasp attached belt, face away from pulley, and place head in belt loop. With belt above ears, clamp belt snugly around head by tightly gripping ends close to back of mid-head. With neck braced and assistance of arm, lunge forward to angle torso forward with feet staggered. Place hand on lower thigh for support.','Pull head forward and down by flexing neck until chin touches upper chest. Return by hyperextending neck until head is angled upward. Repeat.','upload/exercise-picture/CBNeckFlexionBelt.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(2,'Cable Neck Flexion','Sit on bench facing away from middle pulley. Place neck in harness cable attachment. Place arms on lower thighs for support.','Move head away from pulley by bending neck forward until chin touches upper chest. Return head by hyperextending neck and repeat.','upload/exercise-picture/CBNeckFlexion.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(3,'Lever Neck Flexion (plate loaded)','Sit on seat in machine. Position padded lever on face. Position body so neck is in line with lever axis. Grasp handles for support.','Move head forward by flexing neck until chin touches upper chest. Return head by hyperextending neck and repeat.','upload/exercise-picture/LVNeckFlexionH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(4,'Cable Neck Rotation (with belt)','Place workout chair or bench with vertical back support facing to one side near adjustable height cable pulley. Adjust pulley approximately height of head when seated. Attach belt on low pulley cable by attaching carabiner on belt buckle. Sit on bench, grasp attached belt from side. Face toward cable pulley and place head in belt loop. With belt above ears, clamp belt snugly around head by tightly gripping ends close forehead. Position torso upright with feet wide apart and hand nearest cable pulley on lower thigh for added support.','Turn head away from pulley cable by rotating head away from pulley. Turn head back toward cable pulley and repeat. Turn seat the opposite direction or attach belt to pulley on opposite side and continue with other side.','upload/exercise-picture/CBNeckRotationBelt.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(5,'Lever Lateral Neck Flexion','Sit on seat in machine with feet apart. Position side of head on padded lever. Center body so neck is in line with lever axis. Grasp handles for support.','Move head down to side by laterally flexing neck. Return head to opposite side and repeat. Sit in machine backwards and continue with opposite side.','upload/exercise-picture/LVNeckLateralFlexion.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(6,'Cable Lateral Neck Flexion (with belt)','Adjust pulley approximately height of neck or head when seated. Attach belt on low pulley cable by attaching carabiner on belt buckle. Sit on bench with pulley to one side and feet apart. Place head in belt loop. With belt above ears, clamp belt snugly around head by tightly gripping ends close to side of head. Pull torso upright by bracing opposite hand on far side of bench.','Pull head away from pulley cable by laterally flexing neck. Tilt head back toward cable pulley and repeat. Sit on bench the opposite direction and continue with other side.','upload/exercise-picture/CBLateralNeckFlexionBelt.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(7,'Lever Lateral Neck Flexion (plate loaded)','Sit on seat in machine with feet apart\n\n\n. Position padded lever on side of head. Center body so neck is in line with lever axis. Grasp handles for support.','Move head down to side by laterally flexing neck. Return head to opposite side and repeat. Sit in machine backwards and continue with opposite side.','upload/exercise-picture/LVLateralNeckFlexionH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(8,'Lever Neck Flexion','Sit on seat in machine. Position padded lever on face. Position body so neck is in line with lever axis. Grasp handles for support.','Move head forward by flexing neck until chin touches upper chest. Return head by hyperextending neck and repeat.','upload/exercise-picture/LVNeckFlexion.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(9,'Weighted Lying Neck Flexion','Place folded towel on weight plate(s). Lie supine on bench, head extending off of end of bench. Place plates on forehead with towel placed in between for comfort.','Move head up by flexing neck until chin touches upper chest. Return by hyperextending neck and repeat.','upload/exercise-picture/WtNeckFlexion.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(10,'Weighted Neck Flexion','Place folded towel on weight plate. Lie supine perpendicular on bench with low back and hips extending off and feet on floor. Place weight and towel on forehead. Place plates on forehead with towel placed in between for comfort.','Move head up by flexing neck until chin touches upper chest. Return by hyperextending neck and repeat.','upload/exercise-picture/WTNeckFlexionCrossBench.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(11,'Weighted Lateral Neck Flexion','Place folded towel on weight plate. Lie on bench on side with knees and hips bent and arm hanging over edge. Position weight and towel on side of upper head. Hold weight on side of head with hand of upper arm. Place hand of lower arm on floor for support.','Move head up to side by laterally flexing neck. Lower head to opposite side and repeat. Lie on other side and continue.','upload/exercise-picture/WTLateralNeckFlexion.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(12,'Neck Rotation Stretch','Stand or sit.','Turn head over shoulder to one side. Hold stretch. Repeat to other side.','upload/exercise-picture/2fbe7e69b265b483d2414574acf6142e.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(13,'Wall Side Neck Bridge','Place small or folded cushioned mat on column or at end of wall approximately shoulder height. With hands supporting mat, stand with side toward mat. Step far to side so feet are away from wall or column forward. Place side of head on mat with shoulder extending over end of adjacent side of column or wall so body leans to side. Fold hands behind low back or hips.','Push side of head into mat and roll onto top of head moving body away from mat. Return to original position by rolling back down to side of head while bringing shoulder back over end of column or wall. Repeat.','upload/exercise-picture/BWWallSideNeckBridge.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(14,'Neck Retraction Stretch','Stand or sit.','Pull head back as far possible while looking slightly down and hold stretch.','upload/exercise-picture/360cb46b3b96821a6d08e84228e08c07.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(15,'Suspended Neck Flexion','Place belt or strap around end of suspension trainer. Face away from suspension trainer with belt in hand. Place belt around head above ears and clamp belt snugly around head by tightly gripping ends close to back of mid-head. Step forward until suspension trainer is taut. Lean forward at angle against support of belt and suspension trainer by stepping back slightly while keeping head and body straight.','Increase angle of body by bowing head until chin touches upper chest. Lower angle of body by raising head. Repeat.','upload/exercise-picture/STNeckFlexion.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(16,'Front Neck Bridge','Kneel on all fours on well cushioned mat. Place head on mat between hands. Rise and straighten knees. Fold hands behind low back or hips.','Roll back onto forehead until nose touches mat. Roll forward onto top of head until chin touches upper chest. Repeat.','upload/exercise-picture/BWFrontNeckBridge.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(17,'Wall Front Neck Bridge','Place small or folded cushioned mat on wall or column approximately chest height. With hands supporting mat on each side stand back so feet are away from wall or column with body leaning forward. Place top of forehead on mat. Fold hands behind low back or hips.','Roll down onto forehead until nose touches mat. Roll up onto top of head until chin touches upper chest. Repeat.','upload/exercise-picture/BWWallFrontNeckBridge.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(18,'Suspended Lateral Neck Flexion','Place belt or strap around end of suspension trainer. Hold belt in hand and stand away from suspension trainer so it hangs to one side. Place belt around head above ears and clamp belt snugly around head by tightly gripping ends close to head above ear closest to suspension trainer. Step further away from suspension trainer until it is taut. Lean away at angle against support of belt and suspension trainer by positioning feet closer to side of suspension trainer while keeping head and body straight.','Lower angle of body by tilting head to side of suspension trainer. Increase angle of body by tilting head away from side of suspension trainer. Repeat and continue in opposite position.','upload/exercise-picture/STNeckLateralExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(19,'Cable Neck Extension','Sit on bench facing pulley. Place neck in harness cable attachment. Place forearms on lower thighs for support.','Move head away from pulley by hyperextending neck. Return by bending neck forward until chin touches upper chest. Repeat.','upload/exercise-picture/CBNeckExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(20,'Lever Neck Extension','Sit on seat in machine. Place back of head under padded lever. Position body so neck is in line with lever axis. Grasp handles for support.','Move head back by hyperextending neck. Return by bending neck forward until chin touches upper chest. Repeat.','upload/exercise-picture/LVNeckExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(21,'Lever Neck Extension (plate loaded)','Sit on seat in machine. Place back of head under padded lever. Position body so neck is in line with lever axis. Grasp handles for support.','Move head back by hyperextending neck. Return by bending neck forward until chin touches upper chest. Repeat.','upload/exercise-picture/LVNeckExtensionH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(22,'Weighted Lying Neck Extension','Lie prone on bench with head extended off of end and folded towel and weight plate(s) on floor. With both hands, place plate(s) on back of head with towel placed in between for comfort.','Move head up by hyperextending neck up as high as possible. Return by bending neck down until chin touches upper chest. Repeat.','upload/exercise-picture/WTLyingNeckExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(23,'Weighted Neck Extension','Kneel on side of bench with weight plates on end of bench. With both hands, hold weight plate(s) cushioned with towel. Position upper body prone and perpendicular on bench with head and arms extending off of side. With both hands, place weight plate(s) on back of head with towel placed in between for comfort.','Move head up by hyperextending neck up as high as possible. Return by bending neck down until chin touches upper chest. Repeat.','upload/exercise-picture/WTNeckExtensionCrossBench.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(24,'Cable Neck Extension (with belt)','Sit on bench facing low pulley. Attach belt on low pulley cable by attaching carabiner on belt buckle. Place head in belt loop. With belt above ears, clamp belt snugly around head by tightly gripping ends close to forehead. Place other hand or forearm on lower thighs for support.','Pull head up and back by hyperextending neck. Return by bending neck forward until chin touches upper chest. Repeat.','upload/exercise-picture/CBNeckExtensionBelt.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(25,'Weighted Neck Harness Extension','Sit on bench with weighted neck harness on head. Allow weight to dangle in front by bending over.','Move head up by hyperextending neck. Return by bending neck down until chin touches upper chest. Repeat.','upload/exercise-picture/WTNeckExtensionHarness.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(26,'Weighted Seated Neck Extension','Place folded towel on weight plate. On bench or stool, sit bent over on thighs. With both hands, place plate(s) on back of head with towel placed in between for comfort.','Move head up by hyperextending neck up as high as possible. Return by bending neck down until chin touches upper chest. Repeat.','upload/exercise-picture/WtNeckExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(27,'Band Resistive Neck Retraction','Execution\nPush back of neck into band by retracting head. Returning head to neutral postion and repeat.','Comments','upload/exercise-picture/BRNeckRetraction.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(28,'Wall Rear Neck Bridge','Hold small or folded cushioned mat behind head. Facing away from wall or column position head and back of shoulders low on wall or column with mat between. Stand with feet far away from wall or column so body is angled back. Position hips and back straight and bend knees just slightly. Place arms to side or hold hands on abdomen.','Push head back into mat and roll head upward. Arch spine and straighten knees. Hyperextend neck so head is facing up. Return to origianl position by rolling head down while allowing low back to straighten and knees to bend slightly. Continue down until back of head and shoulders make contact with mat. Repeat.','upload/exercise-picture/BWWallRearNeckBridge.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(29,'Rear Neck Bridge','Lying supine on well cushioned mat. Position feet very close to hips. Raise buttocks and low back slightly off of floor and fold hands on abdomen.','Extend hips and knees while pushing head back into floor. Roll back on head while arching spine high off of floor. Hyperextend neck back in attempt to bring forehead toward mat. Return body to close to mat until back of head and shoulders make contact with mat. Repeat.','upload/exercise-picture/BWRearNeckBridge.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(30,'Neck Extensor Stretch','Bow head forward with jaw shut. Depress chin into top of sternum.','Slightly turn head to one side. Hold stretch. Repeat to other side.','upload/exercise-picture/0b4142cf0100659361840fb8e05756e4.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(31,'Suspended Neck Extension','Place belt or strap around end of suspension trainer. Place belt around head above ears and clamp belt snugly around head by tightly gripping ends close to forehead. Step back facing direction of suspension trainer until it is taut. Lean back at angle against support of belt and suspension trainer by stepping forward slightly while keeping head and body straight.','Lower angle of body by bowing head until chin is near upper chest. Increase angle of body by raising head. Repeat.','upload/exercise-picture/STNeckExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(32,'Lying Neck Retraction Isometric','Execution\nPush head into mat and hold position. Relax and repeat.','Comments','upload/exercise-picture/IsometricNeckRetraction.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(33,'Barbell Behind Neck Press','Grasp barbell with overhand grip from rack or clean from floor. Position bar behind neck.','Press bar upward until arms are extended overhead. Return behind neck and repeat.','upload/exercise-picture/BBSeatedBehindNeckPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(34,'Barbell Incline Front Raise','Grasp barbell with shoulder width overhand grip. Lie supine on upper portion of 45 degree incline bench with legs straight. Position barbell on top of upper thighs.','With elbows straight or slightly bent, raise barbell up and over shoulders until uppers arm are vertical. Lower barbell to upper thigh and repeat.','upload/exercise-picture/BBInclineFrontRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(35,'Barbell Military Press','Grasp barbell from rack or clean barbell from floor with overhand grip, slightly wider than shoulder width. Position bar in front of neck.','Press bar upward until arms are extended overhead. Lower to front of neck and repeat.','upload/exercise-picture/BBMilitaryPressBentLeg.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(36,'Barbell Front Raise','Grasp barbell with overhand grip with elbows straight or slightly bent.','Raise barbell forward and upward until upper arms are above horizontal. Lower and repeat.','upload/exercise-picture/BBFrontRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(37,'Barbell Shoulder Press','Grasp barbell with slightly wider than shoulder width overhand grip from rack. Position bar near upper chest.','Press bar upward until arms are extended overhead. Return to upper chest and repeat.','upload/exercise-picture/BBShoulderPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(38,'Cable Bar Behind Neck Press','Stand facing cable bar, mounted on each side to upper waist height narrow double pulley cables. Grasp cable bar with wide overhand grip upper chest height. Stand directly between both cable pulleys with one foot forward and other foot back. Push cable bar over head and position cable bar behind neck or rest on shoulders.','Press cable bar upward until arms are extended overhead. Return behind neck and repeat.','upload/exercise-picture/CBBarBehindNeckPressSide.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(39,'Cable Bar Military Press','Stand facing cable bar, mounted on each side to upper waist height narrow double pulley cables. Grasp cable bar with overhand grip, slightly wider than shoulder width. Position cable bar upper chest height. Stand directly between both cable pulleys with one foot forward and other foot back.','Press cable bar upward until arms are extended overhead. Return to upper chest and repeat.','upload/exercise-picture/CBBarMilitaryPressSide.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(40,'Cable Bar Shoulder Press','Stand facing cable bar mounted on each side to upper waist height narrow double pulley cables. Grasp cable bar with wide overhand grip and position upper chest height. Stand directly between both cable pulleys with one foot forward and other foot back.','Press cable bar upward until arms are extended overhead. Return to upper chest and repeat.','upload/exercise-picture/CBBarMilitaryPressSide.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(41,'Barbell Seated Military Press','Grasp barbell with slightly wider than shoulder width overhand grip from rack. Position bar near upper chest.','Press bar upward until arms are extended overhead. Return to upper chest and repeat.','upload/exercise-picture/BBSeatedMilitaryPressFF.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(42,'Cable Seated Front Raise','Sit on seat above twin cable pulleys. Grasp stirrups on each side. Sit upright with arms straight down to each side with palms facing back.','Raise stirrups forward and upward until upper arms are well above horizontal. Lower and repeat.','upload/exercise-picture/CBSeatedFrontRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(43,'Cable Alternating Front Raise','Stand with low double pulleys behind. Grasp stirrup attachments, one in each hand. Stand away from pulley slightly with arms back somewhat at side and elbows straight or slightly bent.','Raise one stirrup forward and upward until upper arm is well above horizontal. Lower and repeat with opposite arm, alternating between arms.','upload/exercise-picture/CBAlternatingFrontLateralRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(44,'Cable Alternating Seated Front Raise','Sit on seat above twin cable pulleys. Grasp stirrups on each side. Sit upright with arms straight down to each side with palms facing back.','Raise one stirrup forward and upward until upper arm is well above horizontal. Lower and repeat with opposite arm. Continue by alternating raises between sides.','upload/exercise-picture/CBAlternatingSeatedFrontRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(45,'Cable One Arm Front Raise (with rope)','Grasp end of Triceps Rope Cable attachment with one hand so that protruding end is in contact with side of hand (thumb and index finger). Stand away from\n\n\npulley with arm back at side and elbow straight.','Raise stirrup forward and upward until arm is well above horizontal or cable makes contact with underside of upper arm. Lower and repeat. Repeat with opposite arm.','upload/exercise-picture/CBFrontRaiseRope.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(46,'Cable Shoulder Press','Sit on seat and grasp stirrups from low to medium low position from each side. Position stirrups to each side of shoulders with elbows down to sides and stirrups above or slightly narrower than elbows.','Push stirrups upward until arms are extended overhead. Return stirrups to sides of shoulders and repeat.','upload/exercise-picture/CBShoulderPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(47,'Cable One Arm Front Raise','Grasp stirrup attachment. Stand away from pulley slightly with arm back somewhat at side and elbow straight or slightly bent.','Raise stirrup forward and upward until upper arm is well above horizontal. Lower and repeat. Repeat with opposite arm.','upload/exercise-picture/CBFrontRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(48,'Dumbbell Alternating Incline Front Raise','Grasp dumbbells and lie supine on upper portion of 45 degree incline bench with legs straight. Position dumbbells downward below each shoulder.','With elbows straight or slightly bent, raise one dumbbell forward, up and over shoulder until upper arm is vertical. Lower dumbbell down to starting position. Repeat raise with other arm, alternating between sides.','upload/exercise-picture/DBAlternInclineFrontRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(49,'Cable Twisting Overhead Press','Stand beside low to medium height pulley. Grasp cable stirrup. Position stirrup to front of shoulder with elbow down to side. Place opposite hand on hip. With feet wide apart, squat down slightly.','Rotate body away from pulley and straighten legs while pushing stirrup diagonally upward toward opposite side of body. Return to original position and repeat.','upload/exercise-picture/CBTwistingOverheadPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(50,'Cable Standing Shoulder Press','Stand between two low to medium height pulleys. Grasp cable stirrups from each side. Position stirrups to each side of shoulders with elbows down to sides and stirrups above or slightly narrower than elbows.','Push stirrups upward until arms are extended overhead. Return stirrups to sides of shoulders and repeat.','upload/exercise-picture/CBStandingShoulderPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(51,'Dumbbell Front Raise','Grasp dumbbells in both hands. Position dumbbells in front of upper legs with elbows straight or slightly bent.','Raise dumbbells forward and upward until upper arms are above horizontal. Lower and repeat.','upload/exercise-picture/DBFrontRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(52,'Dumbbell Alternating Front Raise','Grasp dumbbells in both hands. Position dumbbells in front of upper legs with elbows straight or slightly bent.','Raise one dumbbell forward and upward with until upper arm is above horizontal. Lower and repeat with opposite arm, alternating between arms.','upload/exercise-picture/DBAlternatingFrontRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(53,'Dumbbell Arnold Press','Stand with two dumbbells position in front of shoulders, palms facing body and elbows under wrists.','Initiate movement by bringing elbows out to sides. Continue to raise elbows outward while pressing dumbbells overhead until arms are straight. Lower to front of shoulders in opposite pattern and repeat.','upload/exercise-picture/DBArnoldPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(54,'Dumbbell Shoulder Press','Position dumbbells to each side of shoulders with elbows below wrists.','Press dumbbells upward until arms are extended overhead. Lower to sides of shoulders and repeat.','upload/exercise-picture/DBShoulderPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(55,'Lever Reclined Shoulder Press (plate loaded)','Lie on back pad facing up. Grasp lever handles on each side with overhand grip.','Press lever until arms are extended. Lower and repeat.','upload/exercise-picture/LVReclinedShoulderPressPL.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(56,'Lever Behind Neck Press (plate loaded)','Sit back on seat. Grasp lever bars to each side with overhand grip.','Press levers upward until arms are extended overhead. Lower and repeat.','upload/exercise-picture/LVBehindNeckShoulderPressH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(57,'Lever Barbell Behind Neck Press (plate loaded)','Sit on bench with bar positioned behind shoulders, also facing away from fulcrum. Grasp bar with wide overhand grip. Disengage bar by rotating bar back.','Press bar upward until arms are extended overhead. Lower bar behind neck and repeat.','upload/exercise-picture/LVSMSeatedBehindNeckPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(58,'Lever Military Press (plate loaded)','Set and grasp lever handles to each side with overhand grip.','Press lever until arms are extended upward. Lower and repeat.','upload/exercise-picture/LVMilitaryInclinePressH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(59,'Dumbbell One Arm Shoulder Press','Stand with dumbbells positioned near shoulder with elbow below wrists.','Press dumbbell upward until arm is extended overhead. Lower to side of shoulder and repeat.','upload/exercise-picture/DBOneArmShoulderPressLean.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(60,'Lever One Arm Front Raise','Stand with lever to side, fulcrum approximately shoulder height and handle just below hip. Grasp lever handle with elbow straight or slightly bent.','Raise lever handle forward and upward until upper arm is well above horizontal. Lower and repeat. Repeat with opposite arm.','upload/exercise-picture/LVOneArmFrontRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(61,'Lever Shoulder Press (plate loaded)','Set and grasp lever handles to each side with overhand grip.','Press lever upward until arms are extended overhead. Lower and repeat.','upload/exercise-picture/LVShoulderPressH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(62,'Lever Barbell Shoulder Press (plate loaded)','Sit on bench with bar positioned in front of shoulders. Grasp bar with wide overhand grip. Disengage bar by rotating bar back.','Press bar upward until arms are extended overhead. Lower bar to front of shoulders and repeat.','upload/exercise-picture/LVSMSeatedShoulderPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(63,'Lever One Arm Shoulder Press (plate loaded)','Stand to one side, near loaded end of barbell, opposite of landmine lever. Lift end of barbell and position near shoulder with underhand grip. Stand with feet far apart (leg on same side of loaded arm is back and opposite leg is forward and bent).','Press end of barbell upward and forward until arm is extended. Lower to shoulder and repeat. Repeat with opposite side.','upload/exercise-picture/LVOneArmShoulderPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(64,'Lever Reclined Shoulder Press','Lie on back pad facing up. Grasp lever handles to each side with overhand grip.','Press lever until arms are extended. Lower and repeat.','upload/exercise-picture/LVReclinedShoulderPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(65,'Lever Reclined Parallel Grip Shoulder Press','Lie on back pad facing up. Grasp parallel lever handles on each side.','Press lever until arms are extended. Lower and repeat.','upload/exercise-picture/LVReclinedShoulderPressParGrip.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(66,'Sled Shoulder Press','Set and grasp lever handles to each side with overhand grip.','Press handles upward until arms are extended overhead. Lower and repeat.','upload/exercise-picture/SLShoulderPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(67,'Lever Shoulder Press','Set and grasp lever handles to each side with overhand grip.','Press lever upward until arms are extended overhead. Lower and repeat.','upload/exercise-picture/LVShoulderPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(68,'Sled Shoulder Press (parallel grip)','Sit on seat and grasp parallel bar grips to front of shoulders on each side.','Press handles upward until arms are extended overhead. Lower and repeat.','upload/exercise-picture/SLShoulderPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(69,'Lever Alternating Shoulder Press','Set and grasp lever handles to each side with overhand grip.','Press one lever upward until arm is extended overhead. Lower to original position. Repeat with opposite arm. Continue by alternating movement between arms.','upload/exercise-picture/LVAlternatingShoulderPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(70,'Lever Shoulder Press (parallel grip)','Sit on seat and grasp parallel bar grips in front of shoulders on each side.','Press lever upward until arms are extended overhead. Lower and repeat.','upload/exercise-picture/LVClosWidParGripShouldPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(71,'Smith Shoulder Press','Sit on bench with bar positioned in front of shoulders. Grasp bar with wide overhand grip. Disengage bar by rotating bar back.','Press bar upward until arms are extended overhead. Lower bar to front of shoulders and repeat.','upload/exercise-picture/SMShoulderPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(72,'Smith Behind Neck Press','Sit on bench with bar positioned behind shoulders. Grasp bar with wide overhand grip. Disengage bar by rotating bar back.','Press bar upward until arms are extended overhead. Lower bar behind neck and repeat.','upload/exercise-picture/SMBehindNeckPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(73,'Handstand Shoulder Press (between benches)','Stand facing wall between two benches positioned side by side, slightly apart, and slightly away and perpendicular to wall. Place hands on ends of benches closest to wall. Place forefeet on bench and kick lower body up to handstand position with arms and legs straight. Maintain balance with lower body against wall.','Lower head between ends of benches by bending arms. Push body back up to original position by extending arms. Repeat.','upload/exercise-picture/BWHandstandPressBenches.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(74,'Lying Front Deltoid Stretch','Sit on floor or mat. Lean back and place hands flat on floor behind body slightly wider than shoulder width with fingers positioned away from body.','Scoot hips forward away from hands. Hold stretch.','upload/exercise-picture/55ab2c829aa0fcebd5d58d00c31dd5cb.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(75,'PNF Seated Front Deltoid Stretch','Instruct participant to sit on floor or bench and place arms to behind hips. From behind, grasp participant\'s wrists, positioning them wider than shoulder width.','Continue to raise participant\'s arms upward behind their body, out to sides. Hold stretch.','upload/exercise-picture/653009242a6a02fb25ad40c66eb2737b.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(76,'Doorway Front Deltoid Stretch','Stand at end of wall or in doorway facing perpendicular to wall. Position palm on surface of wall slightly lower than shoulder. Bend elbow slightly.','Turn body away from positioned arm. Hold stretch. Repeat with opposite arm.','upload/exercise-picture/5616f45948903873fa68bfd777cf1388.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(77,'Pike Press','Kneel on two benches positioned side by side slightly apart at end nearest head. Place hands on ends of benches. With forefeet on opposite ends of bench, raise rear end high up with arms, back, and knees straight. Adjust feet so they are somewhat close to hands while keeping back and legs straight.','Lower head between ends of benches by bending arms. Push body back up to original position by extending arms. Repeat.','upload/exercise-picture/BWPikePress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(78,'Decline Pike Press','Stand between two incline benches positioned side by side slightly apart at end nearest head. Place hands on ends of benches and straighten arms. Position forefeet on opposite ends of bench. Raise rear end high up with arms, back, and knees straight.','Lower head between ends of benches by bending arms. Push body back up to original position by extending arms. Repeat.','upload/exercise-picture/BWPikePressDeclined.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(79,'Suspended Front Raise','Grasp suspension handles and momentarily step back until arms are extended forward and straight. While keeping arms straight and shoulders back, step forward so body reclines back behind suspension handles. Position body and legs straight at desired angle, hanging from handles with arms straight and palms facing downward.','Raise arms upward over head by flexing shoulders with arms straight. Return and lower body back until arms are extended straight forward in original position. Repeat.','upload/exercise-picture/STFrontRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(80,'Wall Front Deltoid Stretch','Face away from wall. Bend over and place hands slightly wider than shoulder width as high as possible on wall with fingers positioned upward.','Bring rear end and back toward wall and squat down. Hold stretch for 20 seconds.','upload/exercise-picture/ff15584ed4d354bd3c44c8e22fae9f77.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(81,'Cable Lateral Raise','With low pulleys to each side, grasp left stirrup with right hand and right stirrup with left hand. Stand upright.','With elbows slightly bent, raise arms to sides\n\n\nuntil elbows are shoulder height. Lower and repeat.','upload/exercise-picture/CBLateralRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(82,'Barbell Wide Grip Upright Row','Grasp bar with wide overhand grip.','Pull bar to neck with elbows leading. Allow wrists to flex\nas bar rises. Lower and repeat.','upload/exercise-picture/BBWideGripUprightRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(83,'Cable One Arm Lateral Raise','Grasp stirrup cable attachment. Stand facing with side of resting arm toward low pulley. Grasp ballet bar if available.','With elbow slightly bent, raise arm to side away from low pulley until elbow is shoulder height. Lower and repeat.','upload/exercise-picture/CBOneArmLateralRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(84,'Barbell Upright Row','Grasp bar with shoulder width or slightly narrower overhand grip.','Pull bar to neck with elbows leading. Allow wrists to flex as bar rises. Lower and repeat.','upload/exercise-picture/BBUprightRowM.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(85,'Cable Seated Lateral Raise','Sit on seat above twin cable pulleys. Grasp stirrups on each side. Sit upright with arms nearly straight down to each side.','With elbows slightly bent, raise arms to side until elbows are shoulder height. Lower and repeat.','upload/exercise-picture/CBSeatedLateralRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(86,'Cable Upright Row','Grasp cable bar with shoulder width or slightly narrower overhand grip. Stand close to pulley.','Pull bar to neck with elbows leading. Allow wrists to flex as bar rises. Lower and repeat.','upload/exercise-picture/CBUprightRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(87,'Cable Bar Upright Row','Grasp cable bar with shoulder width or slightly narrower overhand grip. Stand close to cable bar.','Pull bar to neck with elbows leading. Allow wrists to flex as bar rises. Lower and repeat.','upload/exercise-picture/CBBarUprightRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(88,'Cable Upright Row (dual pulley)','Stand between low dual pulleys. Grasp handles with opposite hands - right hand holds left stirrup and left hand holds right stirrup. Stand upright with arms straight and palms facing back (overhand grip), one stirrup in front of other.','Pull handles up to front of shoulders with elbows leading and cables crossed. Allow wrists to flex as stirrups are lifted. Lower and repeat.','upload/exercise-picture/CBUprightRowDoublePulley.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(89,'Cable One Arm Upright Row','Grasp stirrup on low pulley with overhand grip. Stand with side of arm with stirup away from pulley machine, arm against front of body. Place other hand on ballet bar or side of pulley column for support.','Pull stirup to front side of shoulder with elbow leading. Allow wrist to flex as stirrup is lifted. Lower and repeat.','upload/exercise-picture/CBOneArmUprightRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(90,'Cable Upright Row (with rope attachment)','Grasp each side of rope with overhand grip, just under rope\nends. Stand close to pulley.','Pull rope ends to front of shoulders with elbows leading.\nAllow wrists to flex as stirrups are lifted. Lower and repeat.','upload/exercise-picture/CBUprightRowRope.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(91,'Cable Lateral Raise (pulleys close)','Stand facing two low pulleys positioned side by side. Grasp stirrups with each hand. Stand upright with arms staight down to each side.','With elbows slightly bent, raise arms to side until elbows are shoulder height. Lower and repeat.','upload/exercise-picture/CBLateralRaiseClose.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(92,'Cable Seated Y Raise (with rope attachment)','Sit slightly forward on seat or bench and grasp ends of rope attachment with hand. Place feet on vertical platform. Slide hips back so knees are slightly bent.','With torso upright pull rope upward over head until elbows are approximately lateral to each ear. Lower stirrups forward and downward until arms are extended straight in front of body. Repeat.','upload/exercise-picture/CBSeatedYRowRope.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(93,'Cable Y Raise','Stand facing between low pulleys medium width apart, grasp left stirrup with right hand and right stirrup with left hand. Step back slightly away from pulleys and stand upright with cables crossed in front of hips.','With elbows slightly bent, raise arms upward and outward to sides in Y configuration until elbows are approximately lateral to each ear. Lower stirrups forward and downward in reverse pattern. Repeat.','upload/exercise-picture/CBYRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(94,'Dumbbell One Arm Lateral Raise','Position dumbbell in front of pelvis with elbow slightly bent. Grasp stationary object with other hand for support. Bend over with hips and knees bent slightly.','Raise upper arm to side until elbow is shoulder height. Maintain elbow\'s height above or equal to wrist. Lower and repeat. Continue with opposite arm.','upload/exercise-picture/DBOneArmLateralRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(95,'Cable Wide Grip Upright Row','Grasp cable bar with wide overhand grip. Stand close to pulley.','Pull bar to neck with elbows leading. Allow wrists to flex\nas bar rises. Lower and repeat.','upload/exercise-picture/CBWideGripUprightRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(96,'Dumbbell Incline Lateral Raise','Grasp dumbbell in one hand. Lie on 30° to 45° incline bench with opposite side of body on incline, arm over top of bench, lower leg positioned on front side of seat, and upper leg on back side of seat. Position dumbbell inside of lower leg, just in front of upper leg.','Raise dumbbell from until upper arm is perpendicular to torso. Maintain slight fixed bend in elbow throughout exercise. Lower dumbbell to front of upper leg and repeat.','upload/exercise-picture/DBInclineLateralRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(97,'Cable Seated Y Raise','On dual pulley seated row machine, sit slightly forward on seat or bench in order to grasp both cable attachments. Place feet on vertical platform. Position torso upright and slide hips back so knees are slightly bent.','Raise arms upward and outward to sides in Y configuration while allowing elbows to partially bend. Pull back until elbows are approximately lateral to each ear. Lower stirrups forward and downward until arms are extended straight in front of body. Repeat.','upload/exercise-picture/CBSeatedYRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(98,'Cable Upright Row (stirrup attachments)','Grasp handles of both stirrups with overhand grip. Stand close to pulley.','Pull handles to front of shoulders with elbows leading. Allow wrists to flex as stirrups are lifted. Lower and repeat.','upload/exercise-picture/CBUprightRowStirrups.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(99,'Dumbbell Lateral Raise','Grasp dumbbells in front of thighs with elbows slightly bent. Bend over slightly with hips and knees bent slightly.','Raise upper arms to sides until elbows are shoulder height. Maintain elbows\' height above or equal to wrists. Lower and repeat.','upload/exercise-picture/DBLateralRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(100,'Dumbbell Lying Lateral Raise','Lie on side with legs separated for support. Grasp dumbbell in front of thigh.','Raise dumbbell from floor until arm is vertical. Maintain fixed elbow position (10° to 30° angle) throughout exercise. Lower and repeat.','upload/exercise-picture/DBLyingLateralRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(101,'Dumbbell One Arm Seated Lateral Raise','Sit on stool or end of bench with legs together. Position dumbbell to side with elbow slightly bent. Angle torso slightly forward and place free hand on end of thigh for support.','Raise upper arm to side until elbow is shoulder height. Maintain elbow\'s height above or equal to wrist. Lower and repeat. Continue with opposite arm.','upload/exercise-picture/DBOneArmSeatedLateralRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(102,'Lever Barbell Upright Row (plate loaded)','Stand behind bar mid-thigh height, facing away from from fulcrum. Grasp bar with shoulder width or slightly narrower overhand grip. Disengage bar by rotating bar back and stand upright.','Pull bar to neck with elbows leading. Allow wrists to flex as bar rises. Lower and repeat.','upload/exercise-picture/LVSMUprightRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(103,'Dumbbell Raise','Stand and grasp dumbbells with arms to side, palms facing sides of thighs.','Pull dumbbells up to sides of ribs with elbows out to sides. Lower and repeat.','upload/exercise-picture/DBRaise8.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(104,'Dumbbell Upright Row','Grasp dumbbells and stand with palms facing front of thighs.','Pull dumbbells to front of shoulder with elbows leading out to sides. Allow wrists to flex as dumbbells rise upward. Lower and repeat.','upload/exercise-picture/DBUprightRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(105,'Dumbbell One Arm Upright Row','Grasp dumbbells with palms facing front of thighs. Position other hand for support.','Pull dumbbell to front of shoulder with elbow leading. Allow wrist to flex as dumbbell rises upward. Lower and repeat. Continue with opposite arm.','upload/exercise-picture/DBOneArmUprightRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(106,'Lever Lateral Raise','Sit in machine. Situate bent arms between padded lever and sides of body. Grasp handles if available.','Raise arms to sides until upper arms are horizontal. Return and repeat.','upload/exercise-picture/LVLateralRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(107,'Lever Lateral Raise (plate loaded)','Sit in machine. Situate bent arms between padded lever and sides of body.','Raise arms to sides until upper arms are horizontal. Return and repeat.','upload/exercise-picture/LVLateralRaiseH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(108,'Dumbbell Seated Upright Row','Sit on end of bench with legs far apart. Grasp dumbbell between legs with arm vertical under shoulder. Position torso slightly forward with hand on knee for support.','Pull dumbbell to front of shoulder with elbow leading out to side. Allow wrists to flex as dumbbell rises upward. Lower and repeat.','upload/exercise-picture/DBOneArmSeatedUprightRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(109,'Lever Extended Arm Lateral Raise','Stand facing machine and grasp lever handles to each side with elbows straight or slightly bent.','Raise lever handles to sides until elbows are shoulder height. Maintain elbows\' height above or equal to wrists. Lower and repeat.','upload/exercise-picture/LVExtendedArmLateralRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(110,'Lever Extended Arm Kneeling Lateral Raise','Kneel on shin pads facing machine and grasp lever handles to each side with elbows straight or slightly bent.','Raise lever handles to sides until elbows are shoulder height. Maintain elbows\' height above or equal to wrists. Lower and repeat.','upload/exercise-picture/LVExtendedArmKneelingLateralRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(112,'Side Deltoid Stretch','Position arm across chest. Place opposite hand on elbow.','Push elbow toward chest. Hold stretch. Repeat with opposite arm.','upload/exercise-picture/217101e410d8d1d25cfc6478d0115ad1.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(113,'Fixed Bar Side Deltoid Stretch','Face stationary bar. Grasp stationary bar with one hand approximately chest height. Rotate body so upper arm is positioned across chest.','Turn body into upper arm. Hold stretch. Repeat with opposite arm.','upload/exercise-picture/d9fca31f579fd29d33241749ea84f365.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(114,'Suspended Y Lateral Raise','Grasp suspension handles and momentarily step back until arms are extended forward and straight. While keeping arms straight and shoulders back, step forward so body reclines back behind suspension handles. Position body and legs straight at desired angle hanging from handles with arms straight and palms angled inward.','Raise arms upward and outward in shape of a Y while keeping arms straight. Return and lower body back in opposite motion until arms are extended straight forward in original position. Repeat.','upload/exercise-picture/STYShoulderRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(115,'Smith Wide Grip Upright Row','Stand behind bar mid-thigh height. Grasp bar with wide grip\noverhand grip. Disengage bar by rotating bar back and stand upright.','Pull bar to neck with elbows leading. Allow wrists to flex\nas bar rises. Lower and repeat.','upload/exercise-picture/SMWideGripUprightRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(116,'Smith Upright Row','Stand behind bar mid-thigh height. Grasp bar with shoulder width or slightly narrower overhand grip. Disengage bar by rotating bar back and stand upright.','Pull bar to neck with elbows leading. Allow wrists to flex as bar rises. Lower and repeat.','upload/exercise-picture/SMUprightRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(117,'Barbell Lying Rear Delt Row','Lie chest down on elevated bench. Grasp bar with wide overhand grip.','Keeping upper arm perpendicular to torso, pull barbell up toward upper chest until upper arms are just beyond parallel to floor. Return and repeat.','upload/exercise-picture/BBLyingRearDeltRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(118,'Cable Reverse Fly','Stand facing twin pulley cables positioned close together and approximately shoulder height. Grasp stirrup cable attachment in each hand. Step back away from machine so cable is taut. Stand with feet staggered. Point elbows outward with arms straight or slightly bent.','Pull stirrups out to sides, maintaining stiff elbow position throughout exercise. Return to original position and repeat.','upload/exercise-picture/CBStandingRearDeltFly.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(119,'Cable Standing Rear Delt Row (with rope)','Stand facing rope attachment on high pulley cable. Grasp\neach end of rope just above enlarged ends. Step back with one\nfoot so arms and shoulders are positioned straight forward with\ncable taut. Point elbows outward.','Pull rope to upper chest or neck, keeping elbows at shoulder\nheight until elbows travel slightly behind back. Keep upper arms\nperpendicular to trunk. Return until arms are extended forward.\nRepeat.','upload/exercise-picture/CBStandingRearDeltRowRope.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(120,'Cable Supine Reverse Fly','With bench between two high pulleys to each side, grasp left stirrup with right hand and right stirrup with left hand. Lie on bench with pulleys to each side of shoulders. Arms should be crossed above upper chest with elbows slightly bent.','Pull upper arms down to sides until elbows are shoulder height. Maintain upper arms perpendicular to torso and fixed elbow position (just slightly bent) as arms are pulled down to sides. Return arms to original position and repeat.','upload/exercise-picture/CBSupineRearLateralPull_.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(121,'Barbell Rear Delt Raise','Stand holding barbell behind thighs or hips with arms straight down to sides.','Pull barbell behind hips and low back up as far as possible allowing elbows to travel up behind body to each side. Flex wrists near top of movement so bar can be raised higher. Lower until arms and wrists are straight. Repeat.','upload/exercise-picture/BBRearDeltRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(122,'Cable Seated Reverse Fly','Sit on seat facing twin pulley cables positioned approximately shoulder height. Grasp stirrup cable attachment in each hand. Straighten lower back upright so cable is taut. Point elbows outward with arms slightly bent.','Keeping elbows pointed high, pull stirrups out to sides, maintaining slightly bent elbow position throughout exercise. Return to original position and repeat.','upload/exercise-picture/CBSeatedRearDeltPull.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(123,'Cable Rear Delt Row','Sit slightly forward on bench or platform in order to grasp cable bar attachment. With elbow width overhand grip, straighten torso upright and slide hips back until knees are only\n\n\nslightly bent.','Pull cable attachment toward upper chest, just below neck, with elbows up out to sides until elbows travel slightly behind back. Keep upper arms horizontal, perpendicular to trunk. Return until arms are extended and shoulders are stretched forward. Repeat.','upload/exercise-picture/CBRearDeltRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(124,'Barbell Rear Delt Row','Bend knees slightly and bend over bar with back straight, approximately horizontal. Grasp bar with wide overhand grip.','Keeping upper arm perpendicular to torso, pull barbell up toward upper chest until upper arms are just beyond horizontal. Return and repeat.','upload/exercise-picture/BBRearDeltRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(125,'Cable One Arm Reverse Fly','Stand with side to shoulder height cable pulley. Grasp stirrup cable attachment with hand furthest from pulley. Position arm across neck with elbow bent 30° to 45° outward.','Keeping elbows pointed high, pull stirrup out to side, maintaining fixed elbow position throughout exercise. Return to original position and repeat. Repeat with other arm.','upload/exercise-picture/CBRearDeltPull.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(126,'Cable Rear Delt Row (stirrups)','On dual pulley seated row machine, sit slightly forward on seat or bench in order to grasp both cable attachments. Place feet on vertical platform. Position torso upright and slide hips back until knees are only slightly bent and cable taut. Point elbows outward.','Pull stirrups out to sides, keeping elbows at shoulder height until elbows travel slightly behind back. Allow wrists to follow elbows. Keep upper arms horizontal, perpendicular to trunk. Return until arms are extended and shoulders are stretched forward. Repeat.','upload/exercise-picture/CBRearDeltRowStirrups.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(127,'Cable One Arm Rear Delt Row','Sit slightly forward on bench or platform in order to grasp stirrup cable attachment with one hand. Straighten torso upright and slide hips back until knees are only slightly bent. Point elbow out to side.','Pull stirrup out to side, elbows up shoulder height until elbows travel slightly behind back. Allow wrist to follow elbow. Keep upper arm horizontal, perpendicular to trunk. Return until arm is extended and shoulder is stretched forward. Repeat.','upload/exercise-picture/CBOneArmRearDeltRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(128,'Cable Seated Rear Delt Row (stirrups)','Sit on seat facing twin pulley cables positioned shoulder height. Grasp stirrup cable attachment in each hand. Straighten lower back upright so arms and shoulders are positioned straight forward with cable taut. Point elbows outward.','Pull stirrups out to sides, keeping elbows at shoulder height until elbows travel slightly behind back. Allow wrists to follow elbows. Keep upper arms horizontal, perpendicular to trunk. Return until arms are extended and shoulders are stretched forward. Repeat.','upload/exercise-picture/CBSeatedRearDeltRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(129,'Cable Seated Rear Lateral Raise','Sit at edge of bench with feet of floor ahead of knees. Rest torso on thighs. Reach under legs and grasp stirrup cable attachments, right hand holding left stirrup, left hand holding right stirrup.','Pull stirrups out to sides until elbows are shoulder height. Maintain upper arms perpendicular to torso and fixed elbow position (10° to 30° angle) throughout exercise. Lower until arms contact sides of legs. Repeat.','upload/exercise-picture/CBSeatedRearLateralRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(130,'Cable One Arm Rear Lateral Raise','Stand with side to low pulley. Grasp stirrup attachment with hand furthest from pulley. Bend knees slightly and bend over with resting arm to side of low pulley.','Raise arm to side until elbow is shoulder height. Maintain upper arm perpendicular to torso and fixed elbow position (10° to 30° angle) throughout exercise. Lower and repeat. Repeat with other arm.','upload/exercise-picture/CBRearLateralRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(131,'Cable Standing Rear Delt Row (stirrups)','Stand facing twin pulley cables positioned shoulder height. Grasp stirrup cable attachment in each hand. Step back with one foot so arms and shoulders are positioned straight forward with cable taut. Point elbows outward.','Pull stirrups out to sides, keeping elbows at shoulder height until elbows travel slightly behind back. Allow wrists to follow elbows. Keep upper arms horizontal, perpendicular to trunk. Return until arms are extended and shoulders are stretched forward. Repeat.','upload/exercise-picture/CBStandingRearDeltRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(132,'Dumbbell Lying Rear Lateral Raise','Lie chest down on elevated bench. Grasp dumbbells below to each side.','Raise upper arms to sides until elbows are shoulder height. Maintain upper arms perpendicular to torso and fixed elbow position (10° to 30° angle) throughout exercise. Maintain height of elbows above wrists by raising \"pinkie\" side up. Lower and repeat.','upload/exercise-picture/DBLyingRearLateralRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(133,'Dumbbell Lying Rear Delt Row','Lie chest down on elevated bench. Grasp dumbbells below.','Keeping upper arm perpendicular to torso and dumbbells just below elbows, pull dumbbells up until elbows are just above shoulders. Return and repeat.','upload/exercise-picture/DBLyingRearDeltRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(134,'Cable Rear Lateral Raise','Stand with cable columns to each side. Grasp left stirrup with right hand and right stirrup with left hand. Bend knees and bend over at hips, so torso is approximately horizontal with back straight. Point elbows outward with arms slightly bent.','Raise upper arms to sides until elbows are shoulder height. Maintain upper arms perpendicular to torso and slight bend in elbows as arms are raised to sides. Lower and repeat.','upload/exercise-picture/CableBentOverLateralRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(135,'Cable Standing Cross Row','Stand between two shoulder-high cable pulleys (adjustable cross-over machine). Grasp right stirrup with left hand and left stirrup with right hand. Step back until cables are angled back 30° to 45°. Position both elbows at height of shoulders, one over other.','Pull both cable attachments by moving elbows back to sides. Keep upper arms horizontal, perpendicular to trunk. Return and repeat.','upload/exercise-picture/CBStandingCrossRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(136,'Cable One Arm Standing Cross Row','Facing shoulder height cable pulley, grasp stirrup cable attachment with one hand, palm orientated down. Step back and turn body inward about 30° to 45° to face extended arm about. Stand back just enough to allow arm to be fully extended with weight raised up slightly.','Pull stirrup back with elbow up at shoulder height until elbow travels just behind shoulder. Keep upper arm horizontal, perpendicular to trunk. Return until arm is fully extended. Repeat.','upload/exercise-picture/CBOneArmCrossRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(137,'Dumbbell Side Lying Rear Delt Raise','Lie on side with legs separated for support. Grasp dumbbell in front of chest, palm facing down, arm extended forward with slight bend.','Raise dumbbell from floor until it travels above shoulder. Return dumbbell to floor at original position. Repeat.','upload/exercise-picture/DBLyingRearDeltRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(138,'Dumbbell Rear Lateral Raise','Grasp dumbbells to each side. Bend knees and bend over through hips with back flat, close to horizontal. Position elbows with slight bend and palms facing together.','Raise upper arms to sides until elbows are shoulder height. Maintain upper arms perpendicular to torso and fixed elbow position (10° to 30° angle) throughout exercise. Maintain height of elbows above wrists by raising \"pinkie finger\" side up. Lower and repeat.','upload/exercise-picture/DBRearLateralRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(139,'Dumbbell Lying One Arm Rear Lateral Raise','With dumbbell in one hand, lie chest down on elevated bench. Position palm forward (thumb up) with elbow straight or slightly bent.','Raise upper arm to side until elbow is shoulder height. Maintain upper arms perpendicular to torso with elbow straight throughout exercise. Maintain palm forward position. Lower and repeat.','upload/exercise-picture/DBOneArmLyingLateralRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(140,'Dumbbell Rear Delt Row','Kneel over side of bench with arm and leg to side. Grasp dumbbell.','Pull dumbbell up out to side with upper arm perpendicular to trunk until upper arm is just beyond horizontal. Lower and repeat.','upload/exercise-picture/DBRearDeltRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(141,'Lever Incline Rear Delt Row (plate loaded)','Lie chest low on inclined platform and grasp forward lever handles with wide overhand grip.','Pull lever with elbows\n\nforward\n\nout to sides until upper arms are just beyond parallel, keeping upper arm perpendicular to torso. Return and repeat.','upload/exercise-picture/LVInclineRearDeltRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(142,'Lever Lying Rear Lateral Raise (plate loaded)','Lie on machine with chest against padding. Position arms between padded lever arms with elbows below shoulders.','Pull arms up until elbows are beyond back. Return and repeat.','upload/exercise-picture/LVLyingRearDeltRaiseH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(143,'Lever Seated Rear Delt Row (plate loaded)','Place seat at low position. Sit on seat with chest against pad and grasp upper handles.','Pull lever with elbows up out to sides until upper arms are just beyond parallel, keeping upper arm horizontal, perpendicular to torso. Return and repeat.','upload/exercise-picture/LVRearDeltRowH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(144,'Dumbbell Seated Rear Lateral Raise','Sit on edge of bench with feet placed beyond knees. Bend over and rest torso on thighs. Grasp dumbbells with each hand under legs. Position elbows with slight bend with palms facing together behind ankles (as shown) or just to sides of ankles.','Raise upper arms to sides until elbows are shoulder height. Maintain upper arms perpendicular to torso and fixed elbow position (10° to 30° angle) throughout exercise. Maintain elbows height above wrists by raising \"pinkie finger\" side up. Lower and repeat.','upload/exercise-picture/DBSeatedRearLateralRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(145,'Lever Rear Delt Raise (plate loaded)','Stand between lever handles facing away from machine. Squat down and grasp lever handles to each side. Stand up with arms straight to sides.','Pull lever up as far as possible allowing elbows to travel up behind body to each side. Lower until arms are straight and repeat.','upload/exercise-picture/LVRearRaiseH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(147,'Lever Seated Rear Lateral Raise (plate loaded)','Sit on seat with feet placed on platform ahead of knees. Rest torso on thighs. Reach under legs and grasp lever handles on each side.','Pull lever handles out to sides until elbows are shoulder height. Maintain upper arms perpendicular to torso and fixed elbow position (10° to 30° angle) throughout exercise. Lower and repeat.','upload/exercise-picture/LVSeatedRearLateralRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(148,'Lever Rear Lateral Raise (on extended arm kneeling lateral raise machine)','Stand on platform facing lateral raise machine. Bend knees and bend over at hips with back flat close to horizontal. With arms straight or slightly bent, grasp lever handles with each hand.','Maintaining torso position, raise handles to sides until upper arm is shoulder height. Lower and repeat.','upload/exercise-picture/LVBentOverExtArmLateralRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(149,'Lever Seated Rear Delt Row','Place seat at low position. Sit on seat with chest against pad and grasp upper handles.','Pull lever with elbows up out to sides until upper arms are just beyond parallel, keeping upper arm horizontal, perpendicular to torso. Return and repeat.','upload/exercise-picture/LVSeatedRearDeltRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(150,'Lever Seated Reverse Fly (parallel grip)','Sit on machine with chest against pad. Grasp parallel handles with thumbs up at shoulder height. Slightly bend elbows and internally rotate shoulders so elbows are also at height of shoulders.','Keeping elbows pointed high, pull handles apart and to rear until elbows are just behind back. Return and repeat.','upload/exercise-picture/LVSeatedReverseFlyParallelGrip.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(151,'Lever Rear Lateral Raise (on lateral raise machine)','Stand on platform facing lateral raise machine. Bend knees and bend over at hips with back flat close to horizontal. With elbows bent under shoulders, position back of upper arms against arm pads.','Maintaining torso position, raise upper arms to sides until elbows are shoulder height. Lower and repeat.','upload/exercise-picture/LVRearLateralRaiseOnLatRsMch.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(152,'Lever T-Bar Rear Delt Row (plate loaded)','Straddle lever bar facing handles. Bend knees slightly and bend over handles with back straight. Grasp wide grip handles with overhand grip. With arms extended, position torso just high enough to allow weight to make contact with floor.','With elbows out to sides, pull bar up toward upper chest until elbows are same height as shoulders or just beyond, keeping upper arm perpendicular to torso. Return and repeat.','upload/exercise-picture/LVTBarRearDeltRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(153,'Lever Lying Rear Lateral Raise','Lie on machine with chest against padding. Position arms between padded lever arms with elbows below shoulders.','Pull arms up until elbows are beyond back. Lower and repeat.','upload/exercise-picture/LVLyingRearLateralRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(154,'Lever Seated Reverse Fly (on pec deck)','Sit on machine with chest against vertical pad. Position arms against padded lever arms at height of shoulders.','Pull arms back until elbows are beyond back. Return and repeat.','upload/exercise-picture/LVSeatedRearDeltFlyOnPecDeck.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(155,'Lever Seated Reverse Fly (overhand grip)','Sit on machine with chest against pad. Grasp horizontal handles with overhand grip at shoulder height. Internally rotate shoulders so elbows are also at height of shoulders.','Keeping elbows pointed high, pull handles apart and to rear until elbows are just behind back Return and repeat.','upload/exercise-picture/LVRearDeltFlyOverhandGrip.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(156,'Lever Seated Reverse Fly (pronated parallel grip)','Sit in machine with chest against pad. Grasp parallel handles from inside with thumbs down at shoulder height.','Keeping elbows pointed high, pull handles apart and to rear until elbows are just behind back. Return and repeat.','upload/exercise-picture/LVSeatedRearDeltFlyInsideParallelGrip.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(157,'Lever Seated Reverse Fly (gripless)','Sit on machine with back against vertical pad and roller pads in front of body. Place feet forward on foot bars. Cross both arms in front of body situated between roller pads. Position arms one on top of another, shoulder height.','Pull arms apart and back until elbows are slightly beyond back. Return to starting position and repeat.','upload/exercise-picture/LVSeatedRearDeltFly.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(158,'Rear Delt Inverted Row (high bar)','Stand facing lower to upper chest height horizontal bar. Step toward bar so chest makes contact. Grasp bar with wide overhand grip. Turn elbows outward to sides. Position feet forward on floor so body is reclined back with legs, hips and spine straight. Position forearms perpendicular to body, orientated forward. Also, position upper arms perpendicular to body, orientated to each side.','Lower body back until arms are extended straight while keeping body straight and elbows high (upper arm perpendicular to torso). Pull body toward bar until upper arms are just beyond parallel to one another. Return and repeat.','upload/exercise-picture/BWRearDeltInvertedRowHigh.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(159,'Rear Delt Inverted Row','Stand facing waist to lower chest height horizontal bar. Grasp bar with wide overhand grip. Turn elbows outward to sides. Walk forward under bar while pulling upper chest close to bar. With heels on floor, position body at angle under bar with legs, hips and spine straight. Position forearms perpendicular to body, orientated forward. Also, position upper arms perpendicular to body, orientated to each side.','Lower body downward until arms are extended straight while keeping body straight and elbows high (upper arm perpendicular to torso). Pull body toward bar until upper arms are just beyond parallel to one another. Return and repeat.','upload/exercise-picture/BWRearDeltInvertedRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(160,'Smith Rear Delt Row','Stand near low smith bar. Bend knees and bend over bar with back straight. Grasp bar with wide\n\n\noverhand grip. Disengage bar by rotating bar back.','Keeping upper arm perpendicular to torso, pull bar up toward upper chest until upper arms are just beyond parallel to floor. Return and repeat.','upload/exercise-picture/SMBentoverRearDeltRowSideView.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(162,'Suspended Reverse Fly','Grasp suspension handles and momentarily step back until arms are extended forward and straight. While keeping arms straight and shoulders back, step forward so body reclines back behind suspension handles. Position body and legs straight at desired angle hanging from handles with arms straight. Internally rotate shoulders so elbows are positioned directly outwards with arms straight or slightly bent. Shoulder should be positioned approximately 90° relative to torso position.','Pull handles out to sides while keeping stiff elbow position and maintaining shoulder at 90° plane to torso throughout exercise. Raise up until upper arms are in-line to one another. Return to original position in same plane and repeat.','upload/exercise-picture/STReverseFlyStaggered.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(163,'Suspended Rear Delt Row','Grasp suspension handles and momentarily step back until arms are extended forward and straight. While keeping arms straight and shoulders back, step forward so body reclines back behind suspension handles.\nPosition body and legs straight at desired angle hanging from handles with arms straight. Internally rotate shoulders so elbows are positioned directly outwards.','Pull body up while keeping elbows pointed directly out to each side and body and legs straight. Pull until elbows are directly lateral to each side without allowing elbows to drop. Return until arms are extended straight and shoulders are stretched forward, maintaining high elbow position. Repeat.','upload/exercise-picture/STRearDeltRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(164,'Rear Deltoid Stretch','Position arm across neck. Place opposite hand on elbow.','Push elbow toward neck. Hold stretch. Repeat with opposite arm.','upload/exercise-picture/e804bc162a98017991aec45287ea60f3.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(165,'Fixed Bar Rear Deltoid Stretch','Face stationary bar. Grasp stationary bar with one hand approximately face height. Rotate body so upper arm is positioned across neck.','Turn body into upper arm. Hold stretch. Repeat with opposite arm.','upload/exercise-picture/277fbfe41e0114de998ccabb0af995e7.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(167,'Dumbbell Seated Front Lateral Raise','Sit on stool or end of bench with dumbbell. Position dumbbell down to side with arm straight. Turn pinkie finger side outward.','Raise arms to side, slightly in front until shoulder height or slightly higher. Lower and repeat. Continue with opposite arm.','upload/exercise-picture/DBOneArmSeatedFrontLateralRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(168,'Dumbbell Front Lateral Raise','Grasp dumbbell and position in front of thigh with arm straight. Turn pinkie finger side outward.','Raise arms to side, slightly to front until shoulder height or slightly higher. Lower and repeat. Continue with opposite arm.','upload/exercise-picture/DBFrontLateralRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(169,'Dumbbell Full Can Lateral Raise','Grasp dumbbells with each hand with palms facing forward.','Raise arms to side with thumb side up. Lower and repeat.','upload/exercise-picture/DBFullCanLateralRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(170,'Cable Front Lateral Raise','Grasp dumbbell cable attachment. Stand facing side with resting arm toward low pulley. Grasp ballet bar if available for support. Internally rotate shoulders so elbows point out to sides.','With elbow straight or slightly bent, raise upper arm away from low pulley to side, slightly to front (30°) until upper arm is shoulder height. Lower and repeat. Continue with opposite arm.','upload/exercise-picture/CBFrontLateralRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(171,'Cable Seated Front Lateral Raise','Sit on seat above twin cable pulleys. Grasp stirrups on each side. Sit upright with arms nearly straight down to each side. Internally rotate shoulders so elbows point out to sides.','With elbows straight or slightly bent, raise upper arm away from low pulley to side, slightly to front (30° to 45°) until upper arm is shoulder height or slightly higher. Lower and repeat.','upload/exercise-picture/CBSeatedFrontLateralRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(172,'Barbell Close Grip Bench Press','Lie on bench and grasp barbell from rack with shoulder width grip.','Lower weight to chest with elbows close to body. Push barbell back up until arms are straight. Repeat.','upload/exercise-picture/BBCloseGripBenchPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(173,'Machine-assisted Triceps Dip','Mount shoulder width dip bar, arms straight with shoulders above hands. Step down onto assistance lever. Keep hips and knees straight.','Lower body until slight stretch is felt in shoulders. Push body up until arms are straight. Repeat.','upload/exercise-picture/ASTricepsDip.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(174,'Barbell JM Bench Press','Lie on bench with back flat on bench and grasp barbell from rack with shoulder width or slightly narrower grip.','Lower in straight line toward neck while keeping elbows relatively high and bending them out to sides, approximately 45° from midline of body. Flex wrists slightly as bar is lowered as to keep weight of bar on base of palms. Pause when forearms mak\n\n\ne solid contact with biceps. Push barbell back up until arms are straight. Repeat.','upload/exercise-picture/BBJMPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(175,'Machine-assisted Triceps Dip (kneeling)','Mount shoulder width dip bar, arms straight with shoulders above hands. Kneel on padded platform, lowering it down slightly so hips are slightly bent.','Lower body until slight stretch is felt in shoulders. Push body up until arms are straight. Repeat.','upload/exercise-picture/ASTricepsDipKneeling.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(176,'Barbell Lying Triceps Extension','Lie on bench with narrow overhand grip on barbell. Position barbell over forehead with arms extended.','Lower bar by bending elbows. As bar nears head, move elbows slightly back just enough to allow bar to clear around curvature of head. Extend arms. As bar clears head, reposition elbows to their former position until arms are fully extended. Repeat.','upload/exercise-picture/BBLyingTricepsExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(177,'Barbell Close Grip Incline Bench Press','Lie on bench with bar above chest. Grasp bar from rack with shoulder width or slightly narrower grip. Disengage bar by rotating bar back.','Lower weight to chest with elbows close to body. Push barbell up until arms are straight. Repeat.','upload/exercise-picture/BBCloseGripInclineBenchPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(178,'Barbell Lying Triceps Extension \"Skull Crusher\"','Lie on bench with narrow overhand grip on barbell. Position barbell over shoulders with arms extended.','Lower bar to forehead by bending elbows. Extend arms and repeat.','upload/exercise-picture/BBLyingTricepsExtensionSC.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(179,'Barbell Incline Triceps Extension','Lie on slightly incline bench with narrow overhand grip on barbell. Position barbell over shoulders with arms extended.','Lower bar by bending elbows. As bar nears head, move elbows slightly back just enough to allow bar to clear around curvature of head. Extend arms. As bar clears head, reposition elbows to their former position until arms are fully extended. Repeat.','upload/exercise-picture/BBInclineTricepsExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(180,'Barbell Triceps Extension','Position barbell overhead with narrow overhand grip.','Lower forearm behind upper arm with elbows remaining overhead. Extend forearm overhead. Lower and repeat.','upload/exercise-picture/BBSeatedTricepsExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(181,'Barbell Decline Triceps Extension','Lie on decline bench with narrow overhand grip on barbell. Position barbell over shoulders with arms extended.','Lower bar by bending elbows. As bar nears head, move elbows slightly back just enough to allow bar to clear around curvature of head. Extend arms. As bar clears head, reposition elbows to its former position until arms are fully extended. Repeat.','upload/exercise-picture/BBDeclineTricepsExt.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(182,'Cable Bent-over Triceps Extension','Grasp cable bar from medium high pulley with narrow or shoulder width overhand grip. Turn body away from pulley apparatus and position turned cable bar behind neck. Bend over downward with cable bar positioned behind neck, gripped at each side. Lunge forward with one leg. Allow elbows to be pulled back under cable resistance.','Extend forearms forward until elbows are straight. Allow cable bar to return back over neck. Repeat.','upload/exercise-picture/CBOverheadTricepsExt.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(183,'Cable Forward Triceps Extension','Grasp stirrup from medium high pulley. Turn body away from pulley apparatus and position stirrup over shoulder with palms down. Step forward with one foot so cable is taut. Position elbow forward about shoulder height.','Push stirrup forward by extending forearm until elbow is straight. Allow stirrup to return back over shoulder. Repeat and repeat. Continue with opposite arm.','upload/exercise-picture/CBOneArmForwardTricepsExt.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(184,'Cable Incline Triceps Extension','Grasp cable bar from behind with narrow overhand grip. Position elbows overhead.','Extend forearm overhead until elbows are straight. Lower until forearms are against upper arms. Repeat.','upload/exercise-picture/CBInclineTricepsExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(185,'Cable Bent-over Triceps Extension (with rope attachment)','Grasp rope attachment from medium high pulley. Turn body away from pulley apparatus and position turned rope attachment behind neck. Bend over downward with rope attachment positioned behind neck gripped at each side. Lunge forward with one leg. Allow elbows to be pulled back under cable resistance.','Extend forearms forward until elbows are straight. Allow cable bar to return back over neck. Repeat.','upload/exercise-picture/CBOverheadTricepsExtRope.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(186,'Cable Lying Triceps Extension','Lie on bench and grasp bar with narrow overhand grip. With arms extended, position bar over forehead.','Lower bar by bending elbow. As bar nears head, move elbows slightly back just enough to allow bar to clear around curvature of head. Extend arm. As bar clears head, reposition elbows to its former position until arm is fully extended. Repeat.','upload/exercise-picture/CBLyingTricepsExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(187,'Cable Kneeling Triceps Extension','Grasp cable bar from middle pulley with narrow or shoulder width overhand grip. Turn body away from pulley apparatus with cable bar above head. Kneel before bench, bend over and place elbows on edge of bench. Maintain upper arms parallel with shoulders as low as possible.','Extend forearms over head until elbow are fully extended. Return and repeat.','upload/exercise-picture/CBKneelingTricepsExt.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(188,'Cable Decline Triceps Extension','Position legs under lower leg pad and lie back on bench. Grasp bar with narrow overhand grip. Position bar near forehead or top of head.','Extend elbows to raise bar attachment until arms are straight. As arms extended, position them vertically. Lower bar by bending elbows. As bar nears head, reposition elbows back just enough to allow bar to clear around curvature of head. Repeat.','upload/exercise-picture/CBDeclineTricepsExt.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(189,'Cable Pushdown (forward leaning)','Face high pulley and grasp revolving bar cable attachment with overhand grip. Position one leg back and bend forward leg with body leaning forward. Position revolving bar down in front of face with forearms nearing vertical.','Push cable bar downward by extending arms until elbows are straight. Return to front of face until forearms are nearly vertical and close to upper arm. Repeat.','upload/exercise-picture/CBForwardLeaningPushdown.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(190,'Cable Bar Pushdown','Position adjustable pulleys slightly above head. Face cable bar and grasp with overhand narrow grip. Position elbows to side.','Extend arms down. Return until forearm is close to upper arm. Repeat.','upload/exercise-picture/CBBarPushdown.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(191,'Cable Pushdown','Face high pulley and grasp cable attachment with narrow overhand grip. Position elbows to side.','Extend arms down. Return until forearm is close to upper arm. Repeat.','upload/exercise-picture/CBPushdown.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(192,'Cable Alternating Seated Pushdown','Sit on seat or bench in font of two close high pulleys. Grasp stirrup with each hand (over or underhand grip). Position elbows to side.','Push one stirrup down by extending elbow until arm is straight. Return until forearm returns to original positon, keeping elbow close to side. Repeat with opposite arm and alternate.','upload/exercise-picture/CBAlternatingSeatedPushdown.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(193,'Cable Pushdown (with V-bar)','Face high pulley and grasp V-bar attachment with narrow overhand grip. Position elbows to side.','Extend arms down. Return until forearm is close to upper arm. Repeat.','upload/exercise-picture/CBPushdownV.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(194,'Cable Side Triceps Extension','Grasp stirrup from medium high pulley. Turn body so pulley is to side of free arm while lifting stirrup over head. Step forward, just slightly to allow stirrup to be placed behind head, just over shoulder. Place elbow just slightly higher than shoulder height and position palm down.','Push stirrup out to side by extending forearm until elbow is straight. Allow stirrup to return back over shoulder. Repeat and repeat. Continue with opposite arm.','upload/exercise-picture/CBOneArmSideTricepsExt.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(195,'Cable Pushdown (with rope attachment)','Face high pulley and grasp rope attachment with clinched hands side by side (palms in). Position elbows to side.','Extend arms down. Turn palms down at bottom. Return until forearm is close to upper arm and hands are in original position. Repeat.','upload/exercise-picture/CBPushdownRope.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(196,'Cable Pushdown (with back support)','Place back against vertical back support. Grasp cable attachment from high pulley with narrow overhand grip. Position elbows to side.','Extend arms down. Return until forearm is close to upper arm. Repeat.','upload/exercise-picture/CBStandingTricepsExtensionBackSupport.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(197,'Cable One Arm Pushdown','Grasp dumbbell cable attachment with underhand grip. Position elbow to side.','Extend arm down. Return until forearm is close to upper arm. Repeat. Continue with opposite arm.','upload/exercise-picture/CBOneArmPushdown.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(198,'Cable Incline Pushdown','Lie on incline bench facing away from high pulley. Grasp cable attachment overhead with overhand narrow grip. Position elbow to sides, slightly up.','Extend arms with elbows stationary. Return until forearm is close to upper arm. Repeat.','upload/exercise-picture/CBInclinePushdown.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(199,'Cable One Arm Triceps Extension (supinated grip)','Grasp stirrup cable attachment from behind. Place hand with cable behind neck; palm toward neck and elbow positioned upward.','Extend arm upward. Return and repeat. Continue with opposite arm.','upload/exercise-picture/CBSeatedTricepsExtSupGrip.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(200,'Cable Triceps Dip','Step between shoulder width dip bars with dip belt around waist. Kneel as close to low pulley and attach cable to dip belt. Stand up and mount dip bar, arms straight with shoulders above hands. Keep hips straight.','Lower body by bending arms until slight stretch is felt in shoulders. Push body up until arms are straight. Repeat.','upload/exercise-picture/CBTricepsDip.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(201,'Cable Triceps Extension','Stand or sit on bench or seat with back support just below shoulders. Position cable bar behind neck or shoulders with narrow overhand grip. Position elbows over head.','Extend forearm overhead until arms are straight. Lower until forearms are against upper arms. Repeat.','upload/exercise-picture/CBSeatedTricepsExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(202,'Cable One Arm Triceps Extension (pronated grip)','Grasp stirrup cable attachment from behind. Place hand with cable behind neck; palm toward neck and elbow positioned upward.','Extend arm upward. Return and repeat. Continue with opposite arm.','upload/exercise-picture/CBOneArmTricepsExtensionPronated.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(203,'Dumbbell One Arm Triceps Extension','Sit on seat with back support just below shoulder height. Position dumbbell over head with arm straight up or slightly back.','Lower dumbbell behind neck or shoulder while maintaining upper arm\'s vertical position throughout exercise. Extend arm until straight. Return and repeat. Continue with opposite arm.','upload/exercise-picture/DBSeatedTricepsExtBackSupport.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(204,'Dumbbell Lying Triceps Extension','Lie on bench and position dumbbells over head with arms extended.','Lower dumbbells by bending elbow until they are to sides of head. Extend arm. Repeat.','upload/exercise-picture/DBLyingTricepsExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(205,'Dumbbell Kickback','Kneel over bench with arm supporting body. Grasp dumbbell. Position upper arm parallel to floor.','Extend arm until it is straight. Return and repeat. Continue with opposite arm.','upload/exercise-picture/DBKickback.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(206,'Dumbbell Decline Triceps Extension','Lie on decline bench and position dumbbells over shoulders with arms extended.','Lower dumbbells by bending elbow until they are to sides of head; dumbbells touch shoulder. Extend arm. Repeat.','upload/exercise-picture/DBDeclineTricepsExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(207,'Cable Triceps Extension (with rope)','From low pulley cable, grasp ends of rope attachment just\nunder enlarged ends. Raise one arm over head while turning body\naway from pulley. Face away from pulley with feet staggered.\nPosition ends of ropes behind head or neck and elbows upward\nover head.','Raise ends of rope overhead by extending forearms until arms\nare straight. Lower rope attachment until forearms are against\nupper arms. Repeat.','upload/exercise-picture/CBTricepsExtensionRope.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(208,'Dumbbell Incline Triceps Extension','Lie supine on incline bench with back of head on upper corner of bench. Position dumbbells over head with arms extended.','Lower dumbbells by bending elbow until they are to sides of head. Extend arm and repeat.','upload/exercise-picture/DBInclineTricepsExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(209,'Dumbbell Triceps Extension','Position one dumbbell over head with both hands under inner plate (heart shaped grip).','With elbows over head, lower forearm behind upper arm by flexing elbows. Flex wrists at bottom to avoid hitting dumbbell on back of neck. Raise dumbbell over head by extending elbows while hyperextending wrists. Return and repeat.','upload/exercise-picture/DBTricepsExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(210,'Dumbbell One Arm Triceps Extension (on bench)','Position dumbbell behind neck with elbow positioned upward.','Extend arm until straight while maintaining upper arm\'s vertical position throughout exercise. Return until dumbbell is behind neck or shoulder and repeat. Continue with opposite arm.','upload/exercise-picture/DBOneArmTricepsExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(211,'Lever Close Grip Bench Press (plate loaded)','Lie on bench with lever handles above sides of chest. Grasp handles with narrow overhand grip just above each side of chest.','Press lever up until arms are extended. Return weights down to starting position. Repeat.','upload/exercise-picture/LVCloseGripBenchPressH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(212,'Lever Barbell Close Grip Bench Press (plate loaded)','Lie on bench with bar above chest and grasp bar with shoulder width or slightly narrower grip. Disengage bar by rotating bar back.','Lower weight to chest with elbows close to body. Push barbell back up until arms are straight. Repeat.','upload/exercise-picture/LVSMCloseGripBenchPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(213,'Lever Overhead Triceps Extension','Sit on seat. Push foot lever down with foot and grasp lever handles from behind. With lever handles behind neck, place both feet on support or floor.','Push lever handles up over head until arms are fully extended. Return and repeat.','upload/exercise-picture/LVOverheadTricepsExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(214,'Lever Incline Triceps Extension','Sit on seat and lie back on back support. Push foot lever down with foot and grasp lever handles from behind. With lever handles behind head, place both feet on support or floor.','Push lever handles up over head until arms are fully extended. Return and repeat.','upload/exercise-picture/LVInclineTricepsExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(215,'Lever Pushdown','Sit on seat and grasp handles by shoulders. Position elbows to sides.','Push lever down beyond hips until arm is fully extended. Return and repeat.','upload/exercise-picture/LVPushdown.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(216,'Lever Triceps Extension (no seat, plate loaded)','Stand behind arm pad facing lever handles. Place one foot forward under arm pad and opposite foot back on foot bar. Grasp handles with narrow overhand grip. Squat down and position chest up against side of pad and back of upper arms on upper angled padded surface.','Push lever down until arms are fully extended. Return and repeat.','upload/exercise-picture/LVTricepsExtensionNoSeatPL.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(217,'Lever Triceps Dip (plate loaded)','Sit upright on seat. If possible, place handles in narrow position. Grasp handles.','Push levers down with elbows pointing back. Allow lever bar to raise until shoulders are slightly stretched. Repeat.','upload/exercise-picture/LVTricepsDipH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(218,'Lever Triceps Extension (plate loaded)','Sit on seat. Place forearms on lever pad and back of upper arms, parallel on padding with elbows in line with lever\'s fulcrum.','Push lever down until arms are fully extended. Return and repeat.','upload/exercise-picture/LVTriExtGripless.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(219,'Lever Triceps Dip','If possible, place handles in narrow position. Sit on seat with legs under pads. Grasp handles and position elbows back.','Push levers down by straightening arms downward. Allow lever bar to raise with elbows pointing back until shoulders are slightly stretched. Repeat.','upload/exercise-picture/LVTricepsDip2.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(220,'Lever Seated Close Grip Press','Sit on seat with chest at height of handles. Grasp handles with shoulder width or slightly narrower overhand grip, just against sides of chest; elbows somewhat down to sides.','Press lever until arms are extended. Return weight until forearm is against upper arm. Repeat.','upload/exercise-picture/LVCloseGripChestPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(222,'Lever Close Grip Incline Bench Press','Lie on incline bench with parallel lever bars close to sides of chest. Grasp handles with shoulder width grip.','Press lever until arms are ext\n\n\nended. Return weight until wrists are at side of chest. Repeat.','upload/exercise-picture/LVCloseGripInclineBenchPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(223,'Lever Alternating Triceps Extension','Sit on seat. Grasp handles and place back of upper arms on padding.','Push one lever out and down until arm is fully extended. Return until forearm contacts upper arm. Repeat with opposite arm. Continue alternating movement between arms.','upload/exercise-picture/LVAlternatingTricepsExtensionS.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(224,'Lever Triceps Extension','Sit on seat. Grasp handles and place back of upper arms parallel on padding with elbows approximately in line with lever\'s fulcrum.','Push lever down until arms are fully extended. Return until forearms contact upper arms. Repeat.','upload/exercise-picture/LVTricepsExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(225,'Sled Standing Triceps Dip','Stand between handles facing machine. Grasp parallel handles and position elbows back. Squat down slightly by bending hips and knees, just enough to raise selected weight up from remaining weight stack.','Push levers down by straightening arms downward. Allow lever bar to raise with elbows pointing back until slight stretch is felt in shoulders. Repeat.','upload/exercise-picture/SLStandingTricepsDip.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(226,'Smith Close Grip Bench Press','Lie on bench with bar above chest and grasp bar with shoulder width or slightly narrower grip. Disengage bar by rotating bar back.','Lower weight to chest with elbows close to body. Push bar back up until arms are straight. Repeat.','upload/exercise-picture/SMCloseGripBenchPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(228,'Lever Overhand Triceps Dip','Sit on seat with back against pad. Gra\n\n\nsp end of handles with overhand grip and position elbows back.','Push levers down by straightening arms downward. Allow lever bar to raise with elbows pointing back until shoulders are slightly stretched. Repeat.','upload/exercise-picture/LVTricepsDipOverhand.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(229,'Smith Close Grip Incline Bench Press','Lie on incline bench with bar above chest and grasp bar with shoulder width or slightly narrower grip. Disengage bar by rotating bar back.','Lower weight to chest with elbows close to body. Push bar back up until arms are straight. Repeat.','upload/exercise-picture/SMCloseGripInclineBenchPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(230,'Weighted Bench Dip','Sit on inside of one of two benches placed parallel, slightly less than leg\'s length away. Place hands on edge of bench. Straighten arms, slide rear end off of edge of bench and position heels on adjacent bench with legs straight. Have assistant place weight on lap near hips.','Lower body by bending arms until slight stretch is felt in chest or shoulder, or rear end touches floor. Raise body and repeat.','upload/exercise-picture/WTBenchDip.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(231,'Weighted Triceps Dip','Place weight on dip belt around waist or place dumbbell between lower legs just above feet. Mount shoulder width dip bar, arms straight with shoulders above hands. Keep hips straight.','Lower body until slight stretch is felt in shoulders. Push body up until arms are straight. Repeat.','upload/exercise-picture/WtTricepsDip.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(232,'Weighted Close Grip Push-up','Lie prone on floor with hands under shoulders or slightly narrower. Position body up off floor with extended arms and body straight. Partner can place weight plate(s) on back if needed.','Keeping body straight, lower body to floor by bending arms. Push body up until arms are extended. Repeat.','upload/exercise-picture/WTCloseGripPushUp.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(233,'Close Grip Push-up (on knees)','Lie prone on floor with hands under shoulders or slightly narrower. Position body up off floor with extended arms and body straight.','Keeping body straight, lower body to floor by bending arms. Push body up until arms are extended. Repeat.','upload/exercise-picture/BWCloseGripPushUpKnees.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(234,'Bench Dip','Sit on inside of one of two benches placed parallel, slightly less than leg\'s length away. Place hands on edge of bench, straighten arms, slide rear end off of bench, and position heels on adjacent bench with legs straight.','Lower body by bending arms until slight stretch is felt in chest or shoulder, or rear end touches floor. Raise body and repeat.','upload/exercise-picture/BWBenchDipLegsElevated.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(235,'Close Grip Push-up','Lie prone on floor with hands under shoulders or slightly narrower. Position body up off floor with extended arms and body straight.','Keeping body straight, lower body to floor by bending arms. Push body up until arms are extended. Repeat.','upload/exercise-picture/BWCloseGripPush.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(236,'Bench Dip (heels on floor)','Sit on side of bench. Place hands on edge of bench. Position feet away from bench. Straighten arms, slide rear end off of edge of bench, and rest heels on floor with legs straight.','Lower body by bending arms until slight stretch is felt in chest or shoulder, or rear end touches floor. Raise body and repeat.','upload/exercise-picture/BWBenchDipFloor.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(237,'Band-assisted Triceps Dip','Place one foot on middle of exercise band with ends looped on shoulder width dip bars. Push band down partially by extending leg. Mount dip bar with arms straight and shoulders above hands. Place other foot on exercise band next to other foot. Keep hips straight.','Lower body until slight stretch is felt in shoulders. Push body up until arms are straight. Repeat.','upload/exercise-picture/ASTricepsDipFootBand.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(238,'Bench Dip (knees bent)','Sit on side of bench. Place hands on edge of bench. Place feet on floor away from bench. Straighten arms, slide rear end off of edge of bench, and position feet on floor with knees bent.','Lower body by bending arms until slight stretch is felt in chest or shoulder, or rear end touches floor. Raise body and repeat.','upload/exercise-picture/BWBenchDipBentKnee.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(240,'Triceps Dip','Mount shoulder width dip bar, arms straight with shoulders above hands. Keep hips straight.','Lower body until slight stretch is felt in shoulders. Push body up until arms are straight. Repeat.','upload/exercise-picture/BWTricepsDip.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(241,'Suspended Triceps Extension (with rope)','Grasp triceps rope hanging from secured bar (chest height or lower). Position forefeet on floor, back from bar with body straight. Elbows can be either be completely bent or straight during mount with upper arms somewhat perpendicular with body.','Keeping body straight, raise body up and back up until arms are extended. Lower body by bending elbows, allowing head to travel between ends of rope. Repeat.','upload/exercise-picture/BWSuspendedTricepsExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(242,'Close Grip Incline Push-up (on bar)','Grasp horizontal bar (lower than chest height) with hands shoulder width or slightly narrower. Position forefeet back from bar with arms and body straight. Arms should be perpendicular to body.','Keeping body straight, lower chest to bar by bending arms. Push body up until arms are extended. Repeat.','upload/exercise-picture/BWCloseGripInclinePushUpOnBar.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(243,'Triceps Dip (between benches)','Stand between ends of two benches. Place hands on ends of benches with fingers off end of benches. Grip should be somewhat narrow. Position feet out in front with legs straight, heels on floor, and torso upright.','Lower body by bending arms, allowing elbows to point back. When slight stretch is felt in chest or shoulders, push body up until arms are straight. Repeat.','upload/exercise-picture/BWDoubleBenchDipsTriceps.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(244,'Suspended Self-assisted Triceps Dip','Stand between two suspension handles, approximately mid-thigh height. Grasp handles on each side and straighten arms with shoulders above hands. Holding position firmly and place bodyweight on handles. Place toes on floor behind with knees bent and feet back.','Lower body by bending arms back. If necessary, use minimal assistance of lower body to control descent, allowing knees to bend, keeping toes in contact with floor. When slight stretch is felt in chest or shoulders, push body up back up until arms are straight. Repeat with minimal assistance from legs.','upload/exercise-picture/STSelfAssistedDipOnToes.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(245,'Triceps Dip (bent knees between benches)','Stand between ends of two benches. Place hands on ends of benches with fingers off ends of benches. Grip should be somewhat narrow. Position feet in front with legs bent and torso upright.','Lower body by bending arms, allowing elbows to point back. When slight stretch is felt in chest or shoulders, push body up until arms are straight. Repeat.','upload/exercise-picture/BWDoubleBenchDipBentKneeTriceps.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(246,'Suspended Triceps Extension','Grasp handles and step forward between suspension trainers. Position arms downward and slightly forward, nearly parallel with suspension straps. Lean forward, placing upper body weight onto handles with arms straight, while stepping back onto forefeet so body is leaning forward at desired angle. Straighten body, so torso is in-line with legs.','Lower body by bending elbows, allowing head to travel between suspension handles. Raise body up and back up until arms are extended. Repeat.','upload/exercise-picture/STTricepsExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(247,'Suspended Triceps Dip','Stand between two suspension handles and grasp handles on each side of torso. Hold position firmly and lift feet from floor.','Push body up until arms are straight. Lower body until slight stretch is felt in shoulders. Repeat.','upload/exercise-picture/STDip.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(249,'Towel Triceps Stretch','Grasp near end of towel or rope. Position towel behind head so towel dangles down behind body. Reach behind back or waist with opposite hand and grasp opposite end of towel. Position upper arm close to back side of head.','Pull towel downward with lower arm. Hold stretch. Repeat with opposite arm.','upload/exercise-picture/3799ed8a83c8eac5efb901d9b10cdba5.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(250,'Overhead Triceps Stretch','Put one arm overhead. Position forearm as close as possible to upper arm. Grasp elbow overhead with other hand.','Pull elbow back and toward head. Hold stretch. Repeat with opposite arm.','upload/exercise-picture/edeae1cee9ffa6dc4c5e5fed632f9bba.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(251,'PNF Overhead Triceps Stretch','Instruct participant to stand or sit on floor, chair, or bench and place arm overhead. Standing behind participant, grasp their wrist and position their forearm against upper arm.','Pull participant\'s elbow behind their head while keeping forearm against upperarm. Hold stretch. Repeat with opposite arm.','upload/exercise-picture/389b7b9e3728a886909b6b7a5f9a6e8a.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(252,'Self-assisted Triceps Dip','Stand on bench or elevation between parallel bars. Mount shoulder width dip bar, arms straight with shoulders above hands. Bend knees and place toes on bench or elevation behind and below body.','Lower body by bending arms back. If necessary, use minimal assistance of lower body to control descent, allowing knees to bend, keeping toes in contact with bench or elevation. When slight stretch is felt in chest or shoulders push body up until arms are straight. Repeat with minimal assistance from legs.','upload/exercise-picture/ASTricepsDipSelf.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(253,'Cable Alternating Seated Curl','Sit on seat situated between two low pulleys down to each side. Grasp stirrups in each hand, palms facing forward.','Pull one stirrup up toward shoulder while keeping elbow stationary. Return until arm is fully extended. Repeat with other arm, alternating between sides.','upload/exercise-picture/CBSeatedAlternatingCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(254,'Cable Alternating Curl','Stand between or facing double low pulleys. Grasp stirrups to each side, palms facing forward.','Pull one stirrup up forward and upward toward shoulder while keeping elbow stationary. Return until arm is fully extended. Repeat on other arm, alternating between sides.','upload/exercise-picture/CBAlternatingCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(255,'Barbell Drag Curl','Grasp bar with shoulder width underhand grip.','Raise barbell straight up so elbows travel back as elbows flex. Follow contour of hips and waist. As elbows continues to flex, begin bringing elbows forward when forearms rises past horizontal position. Continue upward over chest until forearms are perpendicular. Lower until arms are fully extended. Repeat.','upload/exercise-picture/BBDragCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(256,'Barbell Curl','Grasp bar with shoulder width underhand grip.','With elbows to side, raise bar until forearms are vertical. Lower until arms are fully extended. Repeat.','upload/exercise-picture/BBCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(257,'Cable Curl','Grasp low pulley cable bar with shoulder width underhand grip. Stand close to pulley.','With elbows to side, raise bar until forearms are vertical. Lower until arms are fully extended. Repeat.','upload/exercise-picture/CBCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(258,'Cable Seated Curl','Sit on seat situated between two low pulleys down to each side. Grasp stirrups in each hand, palms facing forward.','Pull both stirrups up toward shoulders while keeping elbows stationary. Return until arms are fully extended and repeat.','upload/exercise-picture/CBSeatedCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(259,'Cable Bar Curl','Grasp low cable bar with shoulder width underhand grip. Stand close to cable bar.','With elbows to side, raise bar until forearms are vertical. Lower until arms are fully extended. Repeat.','upload/exercise-picture/CBBarCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(260,'Cable One Arm Curl','Face low pulley and grasp stirrup cable attachment to one side with underhand grip.','With elbow to side, raise bar until forearms are vertical. Lower until arms are fully extended. Repeat. Continue with opposite arm.','upload/exercise-picture/CBOneArmCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(261,'Cable Curl (with stirrups)','Stand between or facing double low pulleys. Grasp stirrups to each side, palms facing forward.','Pull stirrups forward and upward toward shoulders while keeping elbows stationary. Return until arms are fully extended. Repeat.','upload/exercise-picture/CBCurlStirrups.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(262,'Cable Supine Curl','Sit on floor with feet or heels against pulley machine. Grasp low pulley cable bar with shoulder width underhand grip. Lie back on floor with arms to sides.','With elbows to side, pull bar until elbows are flexed. Lower until arms are fully extended. Repeat.','upload/exercise-picture/CBSupineArmCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(263,'Dumbbell Curl','Position two dumbbells to sides, palms facing in, arms straight.','With elbows to sides, raise one dumbbell and rotate forearm until forearm is vertical and palm faces shoulder. Lower to original position and repeat with opposite arm. Continue to alternate between sides.','upload/exercise-picture/DBCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(264,'Underhand Inverted Row (high bar)','Stand facing arms length away from waist to head height horizontal bar. Grasp bar with shoulder width underhand grip. Position body under bar with legs, hips and spine straight. Arms should be straight, approximately perpendicular to body. Heels should make contact with floor with feet about perpendicular to legs.','Keeping body straight, pull body up to bar. Return until arms are extended and shoulders are stretched forward. Repeat.','upload/exercise-picture/BWSupineRowUnderhandHigh.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(265,'Lever Alternating Curl','Sit on seat and grasp handles with underhand grip.','Raise lever on handle until elbow is fully flexed with back of upper arm remaining on pad. Lower handle until arm is fully extended. Repeat with opposite arm. Continue to alternate movement between sides.','upload/exercise-picture/LVAlternatingCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(266,'Lever Curl','Sit on seat and grasp handles with underhand grip.','Raise lever handles until elbows are fully flexed with back of upper arm remaining on pad. Lower handles until arm is fully extended. Repeat.','upload/exercise-picture/LVCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(267,'Doorway Biceps Stretch','Stand at end of wall or in doorway facing perpendicular to wall. Position front of straight arm and palm on surface of wall. Situate arm around same height of shoulder with elbow positioned away from wall.','Turn body away from positioned arm. Hold stretch. Repeat with opposite arm.','upload/exercise-picture/43d668452405c4e4fc3558c7198e186a.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(268,'Seated Biceps Stretch','Sit on floor or mat. Lean back and place hands flat on floor close together behind body with fingers positioned away from body.','Scoot hips forward away from hands. Hold stretch.','upload/exercise-picture/055a2e3f70a4c9da644902025b37f71d.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(269,'Dumbbell Incline Curl','Sit back on 45-60 degree incline bench. With arms hanging down straight, position two dumbbells with palms facing inward.','With elbows back to sides, raise one dumbbell and rotate forearm until forearm is vertical and palm faces shoulder. Lower to original position and repeat with opposite arm. Continue to alternate between sides.','upload/exercise-picture/DBInclineCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(270,'Chin-up','Step up and grasp bar with underhand shoulder width grip.','Pull body up until elbows are to sides. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/BWUnderhandChinup.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(271,'Underhand Inverted Row','Lay on back under fixed horizontal bar. Grasp bar with shoulder width underhand grip.','Keeping body straight, pull body up to bar. Return until arms are extended and shoulders are stretched forward. Repeat.','upload/exercise-picture/BWSupineRowUnderhand.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(272,'Standing Biceps Stretch','Clasp hands behind back with palms together. Straighten arms and rotate arms (inside down) so palm turn downward.','Raise arms away from body. Hold stretch.','upload/exercise-picture/6cb903dd82c279b928786e7c041a8650.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(273,'PNF Seated Biceps Stretch','Instruct participant to sit on floor or bench and place arms to behind hips. From behind, grasp participant\'s wrists, positioning them downward and close together.','Continue to raise participant\'s arms upward behind their body. Hold stretch.','upload/exercise-picture/7fb262891ac5c6933385580cfca31e8d.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(274,'Wall Biceps Stretch','Face away from wall. Bend over and place hands close together as high as possible on wall with fingers positioned upward.','Bring rear end and back toward wall and squat down. Hold stretch for 20 seconds.','upload/exercise-picture/e56394f43d421e81a3dcd5db1bc18917.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(275,'Cable Preacher Curl','Sit on preacher bench placing back of arms on pad. Grasp cable bar with shoulder width underhand grip.','Raise cable bar toward shoulders. Lower cable bar until arms are fully extended. Repeat.','upload/exercise-picture/CBPreacherCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(276,'Cable Alternating Preacher Curl','Grasp cable stirrups with each hand. Sit on preacher bench placing back of arms on pad with palms up.','Raise one stirrup upward toward shoulder of same arm. Lower stirrup until arm is fully extended. Repeat with opposite arm. Continue alternating between arms.','upload/exercise-picture/CBAlternatingPreacherCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(277,'Cable Concentration Curl','Facing low pulley cable, sit on seat or bench with legs apart to each side. Grasp stirrup attachment. Place upper arm against inner thigh.','Pull stirrup to front of shoulder until elbow is completely flexed. Lower stirrup until arm is fully extended. Repeat. Continue with opposite arm.','upload/exercise-picture/CBConcentrationCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(278,'Cable Preacher Curl (stirrups)','Grasp cable stirrups with each hand. Sit on preacher bench placing back of arms on pad with palms up.','Raise both stirrups upward toward shoulders. Lower stirrups until arm is fully extended. Repeat.','upload/exercise-picture/CBPreacherCurlStirrups.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(279,'Cable One Arm Standing Preacher Curl','Standing behind standing preacher bench and grasp cable stirrup.\nPlace back of arm on pad with palm up.','Raise stirrup upward toward shoulder of same arm. Lower stirrup\nuntil arm is fully extended. Repeat.','upload/exercise-picture/CBOneArmStandingPreacherCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(280,'Barbell Prone Incline Curl','Lie prone on incline bench with shoulders near top of incline. Knees can rest on seat or legs can be straddled to sides. From low rack or partner, grasp curl bar with shoulder width underhand grip.','Raise bar until arms are flexed. Lower barbell until arms are fully extended. Repeat.','upload/exercise-picture/BBProneInclineCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(281,'Cable Standing Preacher Curl','Stand behind preacher bench. Grasp cable bar with shoulder\nwidth underhand grip. Position back of arms on pad.','Raise cable bar toward shoulders. Lower cable bar until arms\nare fully extended. Repeat.','upload/exercise-picture/CBStandingPreacherCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(282,'Barbell Standing Preacher Curl','Placing back of arms on pad with one foot forward, grasp curl bar with shoulder width underhand grip.','Raise bar until forearms are vertical. Lower barbell until arms are fully extended. Repeat.','upload/exercise-picture/BBStandingPreacherCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(283,'Barbell Preacher Curl','Sit on preacher bench placing back of arms on pad. Grasp curl bar with shoulder width underhand grip.','Raise bar until forearms are vertical. Lower barbell until arms are fully extended. Repeat.','upload/exercise-picture/BBPreacherCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(284,'Cable Prone Incline Curl','Lie prone on incline bench with shoulders near top of incline. Knees can rest on seat or legs can be straddled to sides. Grasp cable attachment with shoulder width underhand grip.','Raise bar until arms are flexed. Lower barbell until arms are fully extended. Repeat.','upload/exercise-picture/CBProneInclineCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(285,'Cable One Arm Preacher Curl','Grasp cable stirrup. Sit on preacher bench placing back of arm on pad with palm up.','Raise stirrup upward toward shoulder of same arm. Lower stirrup until arm is fully extended. Repeat.','upload/exercise-picture/CBOneArmPreacherCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(286,'Dumbbell Preacher Curl','Grasp dumbbell and sit on preacher bench. With arm bent and palm facing shoulder, place back of arm down on pad.','Lower dumbbell until arm is fully extended. Raise dumbbell until forearm is vertical. Repeat. Continue with opposite arm.','upload/exercise-picture/DBPreacherCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(287,'Dumbbell Concentration Curl','Sit on bench. Grasp dumbbell between feet. Place back of upper arm to inner thigh. Lean into leg to raise elbow slightly.','Raise dumbbell to front of shoulder. Lower dumbbell until arm is fully extended. Repeat. Continue with opposite arm.','upload/exercise-picture/DBConcentrationCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(288,'Lever Preacher Curl (plate loaded)','Sit on curl machine placing back of arms on pad. Grasp lever handles with underhand grip. Align elbows at same pivot point as fulcrum of lever.','Raise lever handles toward shoulders. Lower handles until arms are fully extended. Repeat.','upload/exercise-picture/LVPreacherCurlH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(289,'Lever Preacher Curl (arms high, plate loaded)','Sit on curl machine. Grasp lever handles with underhand grip. Align elbows at same pivot point as fulcrum of lever while placing back of arms up on pads.','Pull lever handles toward shoulders. Return handles until arms are fully extended. Repeat.','upload/exercise-picture/LVHighPreacherCurlArmsHighPL.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(290,'Dumbbell Prone Incline Curl','Lie prone on incline bench with shoulders near top of incline. Knees can rest on seat or legs can be straddled to sides. From elevated platform or partner, grasp dumbbell and position palms forward.','Raise dumbbells until arms are flexed. Lower dumbbells until arms are fully extended. Repeat.','upload/exercise-picture/DBProneInclineCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(291,'Dumbbell Standing Preacher Curl','With dummbell in hand, arm bent, and palm facing shoulder, place back of arm on pad.','Lower dumbbell until arm is fully extended. Raise dumbbell until forearm is vertical. Repeat. Continue with opposite arm.','upload/exercise-picture/DBStandingOneArmPreacherCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(292,'Lever Alternating Preacher Curl (arms high, plate loaded)','Sit on curl machine. Grasp lever handles with underhand grip. Align elbows at same pivot point as fulcrum of lever while placing back of arms up on pads.','Pull one lever handle toward shoulder. Return handle until arm is fully extended. Repeat with opposite arm. Continue alternating movement between arms.','upload/exercise-picture/LVAlternatingHighPreacherCurlArmsHighPL.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(293,'Lever Preacher Curl (no seat, plate loaded)','Stand behind arm pad and face lever handles on opposite side. Place one foot forward under arm pad and opposite foot back on foot bar. Lean over arm pads and grasp handles with slightly narrower than shoulder width underhand grip. Squat down and position back of upper arms on arm pads.','Raise lever handles toward shoulders. Lower handles until arms are fully extended. Repeat.','upload/exercise-picture/LVStandingPreacherCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(294,'Lever Preacher Curl (arms high)','Sit on curl machine. Grasp lever handles with underhand grip. Align elbows at same pivot point as fulcrum of lever while placing back of arms up on pads.','Pull lever handles toward shoulders. Return handles until arms are fully extended. Repeat.','upload/exercise-picture/LVHighPreacherCurlS.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(295,'Lever Preacher Curl','Sit on curl machine placing back of arms on pad. Grasp lever handles with underhand grip. Align elbows at same pivot point as fulcrum of lever.','Raise lever handles toward shoulders. Lower handles until arms are fully extended. Repeat.','upload/exercise-picture/LVPreacherCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(296,'Lever Alternating Preacher Curl (arms high)','Sit on curl machine. Grasp lever handles with underhand grip. Align elbows at same pivot point as fulcrum of lever while placing back of arms up on pads.','Pull one lever handle toward shoulder. Return handle until arm is fully extended. Repeat with opposite arm. Continue alternating movement between arms.','upload/exercise-picture/LVAlternatingHighPreacherCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(297,'Suspension Arm Curl','Grasp suspension handles and momentarily step back until arms are extended forward and straight. While keeping arms straight and shoulders back, step forward so body is reclined back. Position palms up or slightly inward.','Bring handles toward shoulders by flexing arms, while keeping elbows pointed forward. Return by straightening arms and repeat.','upload/exercise-picture/STArmCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(298,'Lever Preacher Curl (no seat)','Stand behind arm pad and face lever handles on opposite side. Place one foot forward under arm pad and opposite foot back on foot bar. Lean over arm pads and grasp\n\n\nhandles with slightly narrower than shoulder width underhand grip. Squat down and position back of upper arms on arm pads.','Raise lever handles toward shoulders. Lower handles until arms are fully extended. Repeat.','upload/exercise-picture/LVPreacherCurlSeatless.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(299,'Barbell Standing Reverse Preacher Curl','Place back of arms on pad with one foot forward. Grasp curl bar with shoulder width underhand grip.','Raise bar until forearms are vertical. Lower barbell until arm is fully extended. Repeat.','upload/exercise-picture/BBStandingReversePreacherCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(300,'Cable Hammer Curl','Grasp cable rope with palms facing inward. Stand upright with arms straight down to sides.','With elbows to side, raise rope forward and upward with both arms until forearms are vertical. Lower until arms are fully extended. Repeat.','upload/exercise-picture/CBHammerCurlRope.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(301,'Barbell Reverse Curl','Grasp bar with shoulder width overhand grip.','With elbows to side, raise bar until forearms are vertical. Lower until arms are fully extended. Repeat.','upload/exercise-picture/BBReverseCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(302,'Cable Reverse Curl','Grasp cable bar with shoulder width overhand grip.','With elbows to side, raise bar until forearms are vertical. Lower until arms are fully extended. Repeat.','upload/exercise-picture/CBReverseCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(303,'Cable Bar Reverse Curl','Grasp cable bar with shoulder width overhand grip. Stand close to cable bar.','With elbows to side, raise bar until forearms are vertical. Lower until arms are fully extended. Repeat.','upload/exercise-picture/CBBarReverseCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(304,'Dumbbell Hammer Curl','Position two dumbbells to sides, palms facing in, arms straight.','With elbows to sides, raise one dumbbell until forearm is vertical and thumb faces shoulder. Lower to original position and repeat with alternative arm.','upload/exercise-picture/DBHammerCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(305,'Lever Reverse Curl','Sit on seat and grasp handles with overhand grip. Position elbows to sides so they are in line with lever\'s fulcrum.','Raise lever handles until elbows are fully flexed with back of upper arm remaining on pad. Lower handles until arm is fully extended. Repeat.','upload/exercise-picture/LVReverseCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(306,'Lever Hammer Preacher Curl','Sit on curl machine placing back of arms on pad. Grasp lever handles and position grips with thumb side up. Align elbows at near same pivot point as fulcrum of lever.','Raise lever handles toward shoulders, maintaining palms in grip. Lower handles until arm is fully extended. Repeat.','upload/exercise-picture/LVHammerPreacherCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(307,'Cable Standing Reverse Preacher Curl','Stand behind preacher bench. Grasp cable bar with shoulder\nwidth overhand grip. Position back of arms on pad.','Raise cable bar toward shoulders. Lower cable bar until arm\nis fully extended. Repeat.','upload/exercise-picture/CBStandingReversePreacherCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(308,'Barbell Reverse Preacher Curl','Sit on preacher bench placing back of arms on pad. Grasp curl bar with shoulder width overhand grip.','Raise bar until forearms are vertical. Lower barbell until arm is fully extended. Repeat.','upload/exercise-picture/BBReversePreacherCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(309,'Cable Reverse Preacher Curl','Sit on preacher bench placing back of arms on pad. Grasp cable bar with shoulder width overhand grip.','Raise cable bar toward shoulders. Lower cable bar until arm is fully extended. Repeat.','upload/exercise-picture/CBReversePreacherCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(310,'Standing Brachioradialis Stretch','Cross wrists, point thumbs downward, and clasp hands.','Straighten arms and externally rotate shoulders by back. Hold stretch.','upload/exercise-picture/e5de318835474e554b63aa69f6b28291.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(311,'Lever Reverse Preacher Curl','Sit on curl machine placing back of arms on pad. Grasp lever handles with overhand grip. Align elbows at near same pivot point as fulcrum of lever.','Raise lever handles toward shoulders. Lower handles until arm is fully extended. Repeat.','upload/exercise-picture/LVReversePreacherCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(312,'Cable Roller Wrist Flexion','Stand behind weight plate(s) on floor and grasp wrist roller handle with both hands; over hand grip.','With left hand gripping handle, relax grip of right hand and slide grip behind handle (by hypexending wrist) and regrip. Relax grip of left hand and flex right wrist. Repeat sequence with opposite hands, alternating back and forth until weight plate has raised up near hands. Lower weight steadily with opposite movement.','upload/exercise-picture/CableRollerWristFlexion.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(313,'Lever Wrist Curl (plate loaded)','Grasp bar with underhand grip. Place forearm on padded platform.','Raise bar up until wrist is fully flexed. Lower and repeat.','upload/exercise-picture/LVWristCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(314,'Cable One Arm Wrist Curl','Sit and grasp cable stirrup. Rest forearm on thigh with palm up and wrist just beyond knees.','Allow cable bar to roll out of palms down to fingers. Raise cable bar back up by gripping and pointing knuckles up as high as possible. Lower and repeat.','upload/exercise-picture/CBOneArmWristCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(315,'Barbell Wrist Curl','Sit and grasp bar with narrow to shoulder width underhand grip. Rest forearms on thighs with wrists just beyond knees.','Allow barbell to roll out of palms down to fingers. Raise barbell back up by gripping and pointing knuckles up as high as possible. Lower and repeat.','upload/exercise-picture/BBWristCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(316,'Dumbbell Ulnar Deviation','Grasp half loaded dumbbell with plate on pinkie side. Position arm down to side.','Bend wrist so weighted side is pulled upward. Lower until weighted side is pointing downward. Repeat.','upload/exercise-picture/DBUlnarFlexion.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(317,'Cable Wrist Curl','Sit and grasp cable bar with narrow to shoulder width underhand grip. Rest forearms on thighs with wrists just beyond knees.','Allow cable bar to roll out of palms down to fingers. Raise cable bar back up by gripping and pointing knuckles up as high as possible. Lower and repeat.','upload/exercise-picture/CBWristCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(318,'Dumbbell Wrist Curl','Sit and grasp dumbbell with underhand grip. Rest forearm on thigh with wrist just beyond knee.','Allow dumbbell to roll out of palm down to fingers. Raise dumbbell back up by gripping and pointing knuckles up as high as possible. Lower and repeat.','upload/exercise-picture/DBWristCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(319,'Lever Grip (plate loaded)','Sit on seat, straddling apparatus. Grasp lever handles on each side; fingers around lever handles and base of thumbs around stationary bars.','Squeeze bars together with both hands until lower lever makes contact with upper bars. Lower to original position and repeat.','upload/exercise-picture/LVGripper.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(320,'Lever Grip','Sit on seat. Grasp lever handles on each side; fingers around lever handles and base of thumbs around stationary bars.','Squeeze bars together with both hands until lever makes contact with stationary bars. Lower to original position and repeat.','upload/exercise-picture/LVSeatedGripper.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(321,'Lever Wrist Curl','Grasp bar with underhand grip to each side. Place forearms on arm pads.','Raise handles up until wrist is fully flexed. Lower handles until wrists are full hyperextended. Repeat.','upload/exercise-picture/LVSeatedWristCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(322,'Lever Ulnar Deviation','Rotate handle over and under so handle is in slightly downward position toward thighs. Grasp handle with thumb ups grip so fist is pulled up under resistance.','Bend wrist so pinky side of fist is pulled down. Return to starting position and repeat.','upload/exercise-picture/LVUlnarDeviation.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(323,'Sled One Hand Grip','Stand in front of apparatus. Grasp bar grips with one hand; fingers around far bar and base of thumb around near stationary bar.','Squeeze bar grips together until far bar makes contact with nearest bar. Release to original position and repeat.','upload/exercise-picture/SLGripper.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(324,'Sled One Hand Pinch Grip (plate loaded)','Place hand around horizontal surfaces; fingers along lower surface and thumb on upper surface.','Pinch surfaces together until lower part makes contact with upper part. Release to original position or just before surfaces become too far apart. Repeat.','upload/exercise-picture/SLOneHandGripPinchPL.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(325,'Sled Grip (plate loaded)','Bend over and grasp bar grips with both hands; fingers under lower bar and base of thumbs over top stationary bar.','Squeeze bar grips together until lower bar makes contact with upper bar. Release to original position and repeat.','upload/exercise-picture/SLGripPL.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(326,'Lever Roller Wrist Flexion','Grasp wrist roller handles with both hands; over hand grip.','With left hand gripping handle, relax grip of right hand and slide grip behind handle (by hypexending wrist) and regrip. Relax grip of left hand and flex right wrist. Repeat sequence with opposite hands, alternating back and forth until weight plate has raised up near hands. Lower weight steadily with opposite movement or loosen grip slightly to control descent of weight stack. Repeat.','upload/exercise-picture/LVRollerAlternatingWristFlexion.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(327,'Praying Wrist Flexor Stretch','Place palms together in front of body. Point fingers toward neck.','Pushing hands together, lower away from body until wrists separate. Hold stretch. Repeat with opposite arm.','upload/exercise-picture/687f3c5f65553be7ab1ce1453499fdf2.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(328,'Sled One Hand Grip (plate loaded)','Bend over and grasp bar grips with one hand; fingers under lower bar and base of thumb over top stationary bar.','Squeeze bar grips together until lower bar makes contact with upper bar. Release to original position and repeat.','upload/exercise-picture/SLOneHandGripPL.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(329,'Seated Wrist Flexor Stretch','Sit on floor. Place palms on floor to sides, behind hips with fingers pointing to back.','Lean back with arms straight. Hold stretch.','upload/exercise-picture/0e6c9ab24bc1acaa9bbb811fa0f0f70a.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(330,'Single Arm Wrist Flexor Stretch','With palm facing downward, grasp underside of fingers with other hand and straighten elbow.','Pull finger and wrist upward and back toward forearm. Hold stretch. Repeat with opposite arm.','upload/exercise-picture/87d4e6a3bad34ced76d50c60a6b2fbf8.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(331,'Kneeling Wrist Flexor Stretch','Kneel on floor or mat. Place palms of hand on floor with fingers pointing toward knees.','Shift body back with elbows straight. Hold stretch.','upload/exercise-picture/f4b4e6a42d8874f9e70106cf09e141d9.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(332,'Lever Roller Ulnar Deviation','Place hands on knobs at each end of roller.','With left hand gripping knob, relax grip of right hand and slide grip upward so fingers are more over knob (by radial deviation) and regrip. Relax grip of left hand and rotate knob with right hand so thumb travels away from body (by ulnar deviation). Repeat sequence with opposite hands, alternating back and forth until weight plate has raised up near hands. Lower weight steadily with opposite movement or loosen grip slightly to control descent of weight stack.','upload/exercise-picture/LVWristRollerUlnarFlexion.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(333,'Dumbbell Radial Deviation','Grasp half loaded dumbbell with plate on thumb side. Position arm down to side.','Bend wrist so weighted side is pulled upward. Lower until weighted side is pointing downward. Repeat.','upload/exercise-picture/DBRadialDeviation.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(334,'Cable Reverse Wrist Curl','Sit and grasp cable bar with narrow to shoulder width overhand grip. Rest forearms on thighs with wrists just beyond knees.','Raise stirrup by pointing knuckles upward as high as possible. Return until knuckles are pointing downward as far as possible. Repeat.','upload/exercise-picture/CBReverseWristCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(335,'Dumbbell Reverse Wrist Curl','Sit and grip dumbbell with overhand grip. Rest forearm on thigh with wrist just beyond knee.','Raise dummbell by pointing knuckles upward as high as possible. Return until knuckles are pointing downward as far as possible. Repeat.','upload/exercise-picture/DBReverseWristCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(336,'Lever Radial Deviation','Rotate handle under and over so handle is in slightly upward position toward head. Grasp handle with thumb ups grip so thumb side of fist is pulled away under resistance.','Bend wrist so thumb side of fist is pulled up. Return to starting position and repeat.','upload/exercise-picture/LVRadialDeviation.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(337,'Cable One Arm Reverse Wrist Curl','Sit and grasp cable stirrup. Rest forearm on thigh with palm facing down and with wrist just beyond knee.','Raise stirrup by pointing knuckles upward as high as possible. Return until knuckles are pointing downward as far as possible. Repeat.','upload/exercise-picture/CBOneArmReverseWristCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(338,'Barbell Reverse Wrist Curl','Sit and grasp bar with narrow to shoulder width overhand grip. Rest forearms on thighs with wrists just beyond knees.','Raise barbell by pointing knuckles upward as high as possible. Return until knuckles are pointing downward as far as possible. Repeat.','upload/exercise-picture/BBReverseWristCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(339,'Lever Reverse Wrist Curl (plate loaded)','Grasp bar with overhand grip. Place forearm on padded platform.','Raise bar until wrist is fully hyperextended and return until wrist is fully flexed. Repeat.','upload/exercise-picture/LVReverseWristCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(340,'Cable Roller Wrist Extension','Stand behind weight plate(s) on floor and grasp wrist roller handle with both hands; over hand grip.','With left hand gripping handle, relax grip of right hand and slide grip in front of handle (by flexing wrist) and regrip. Relax grip of left hand and hyperextend right wrist. Repeat sequence with opposite hands, alternating back and forth until weight plate has raised up near hands. Lower weight steadily with opposite movement.','upload/exercise-picture/CableRollerWristExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(341,'Lever Reverse Wrist Curl','Grasp handles with overhand grip to each side. Place forearms on arm pads.','Raise handles until wrist is fully hyperextended. Lower handles until wrists are fully flexed. Repeat.','upload/exercise-picture/LVSeatedReverseWristCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(342,'Lever Roller Radial Deviation','Place hands on knobs at each end of roller.','With left hand gripping knob, relax grip of right hand and slide grip downward so fingers are under bottom of knob (by ulnar deviation) and regrip. Relax grip of left hand and rotate knob with right hand so thumb travels closer to body (by radial deviation). Repeat sequence with opposite hands, alternating back and forth until weight plate has raised up near hands. Lower weight steadily with opposite movement or loosen grip slightly to control descent of weight stack.','upload/exercise-picture/LVWristRollerRadialFlexion.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(343,'Single Arm Wrist Extensor Stretch','With palm facing downward, pull wrist and fingers downward toward forearm.','Extend or straighten elbow. Hold stretch. Repeat with opposite arm.','upload/exercise-picture/1ef1476e3bcaf5b7a89a2cbfcc3bdd8f.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(344,'Kneeling Wrist Extensor Stretch','Kneel on floor or mat. Flex wrists and place tops of hand on floor with fingers pointing toward knees.','Lean against floor with elbows straight. Hold stretch for 20 seconds.','upload/exercise-picture/KneelingWristExtensor.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(345,'Dumbbell Lying Pronation (arm up)','Lie on bench or mat. With hand of upper arm, grasp unilaterally loaded dumbbell; pinkie positioned near weighted side. Bend elbow approximately 90-degrees and place arm on hip or side of waist. Position thumb upward (supinated).','Rotate dumbbell so thumb turns downward (pronation). Return and repeat.','upload/exercise-picture/DBPronationUp.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(346,'Dumbbell Seated Pronation','Sit next to elevated surface, approximately arm pit height. With hand of upper arm, grasp unilaterally loaded dumbbell; pinkie positioned near weighted side. Bend elbow approximately 90-degrees and place upperarm on elevated surface. Position thumb upward (supinated).','Rotate dumbbell so thumb turns downward (pronation). Return and repeat.','upload/exercise-picture/DBSeatedPronation.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(347,'Lever Seated Forearm Pronation','Sit on seat. Grasp rotating handles with underhand grip on each side and place forearms on pads.','Rotate shafts by turning palm downward. Return and repeat.','upload/exercise-picture/LVSeatedPronation.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(348,'Lever Standing Forearm Pronation','Grasp open handle at end of shaft with underhand grip.','Rotate shaft by turning palm downward. Return and repeat.','upload/exercise-picture/LVWristPronation.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(349,'Dumbbell Lying Pronation (arm down)','Grasp unilaterally loaded dumbbell with thumb next to weighted side. Lie on bench on side with weight and position arm with \"half dumbbell\" on bench. Bend elbow approximately 90-degrees and tucked bent elbow under body. Position thumb down (supinated).','Rotate dumbbell so thumb turns upward (pronation). Return and repeat.','upload/exercise-picture/DBPronationDown.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(350,'Lever Standing Forearm Supination','Grasp open handle at end of shaft with overhand grip.','Rotate shaft by turning palm upward. Return and repeat.','upload/exercise-picture/LVForearmSupination.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(351,'Dumbbell Lying Supination (arm down)','Grasp unilaterally loaded dumbbell with pinkie finger next to weight side. Lie on bench on side with weight and position arm with \"half dumbbell\" on bench. Bend elbow approximately 90-degrees and tuck bent elbow under body. Position thumb up (pronated).','Rotate dumbbell so thumb turns downward (supinated). Return and repeat.','upload/exercise-picture/DBSupinateDown.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(352,'Dumbbell Lying Supination','Lie on bench or mat. With hand of upper arm, grasp unilaterally loaded dumbbell; thumb next to side with weight. Bend elbow approximately 90-degrees and place forearm on hip, or side of waist. Position thumb downward (pronated).','Rotate dumbbell so thumb turns upward (supination). Return and repeat.','upload/exercise-picture/DBSupinationUp.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(353,'Dumbbell Seated Supination','Sit next to elevated surface, approximately arm pit height. With hand of arm next to elevated surface, grasp unilaterally loaded dumbbell; thumb next to side with weight. Bend elbow approximately 90-degrees and place upperarm on elevated surface. Position thumb downward (pronated).','Rotate dumbbell so thumb turns upward (supination). Return and repeat.','upload/exercise-picture/DBSeatedSupination.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(354,'Lever Seated Forearm Supination','Sit on seat. Grasp rotating handles with overhand grip on each side and place forearms on pads.','Rotate shafts by turning palm upward. Return and repeat.','upload/exercise-picture/LVSeatedSupination.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(355,'Barbell Close Grip Bent-over Row','Bend knees slightly and bend over bar with back straight. Grasp bar with shoulder width overhand grip.','Pull bar to waist. Return until arms are extended and shoulders are stretched forward. Repeat.','upload/exercise-picture/BBBentOverRowClose.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(356,'Cable Incline Row','Sit on incline and place feet on lower bar, or foot platform. Slide hips down by bending knees. Bend over and grasp cable attachment. Slide hips back, positioning knees with slight bend.','Pull cable attachment to waist while straightening back upright. Pull shoulders back and push chest forward while arching back. Return until arms are extended, shoulders are stretched forward, and lower back is flexed forward. Repeat.','upload/exercise-picture/CBInclineRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(357,'Cambered Barbell Lying Row','Lie chest down on elevated bench. Grasp cambered barbell below with overhand grip.','Pull bar to upper waist or lower chest. Return until arms are extended and shoulders are stretched downward. Repeat.','upload/exercise-picture/CMBLyingRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(358,'Cable Straight Back Incline Row','Sit on incline and place feet on lower bar, or foot platform. Slide hips down by bending knees. Bend over and grasp cable attachment. Slide hips back, positioning knees with slight bend. Straighten lower back so it is approximately perpendicular to incline.','Pull cable attachment to waist. Pull shoulders back and lift chest by arching back. Return until arms are extended, back is straight and perpendicular to incline, and shoulders are stretched forward. Repeat.','upload/exercise-picture/CBStraightBackInclineRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(359,'Barbell Bent-over Row','Bend knees slightly and bend over bar with back straight. Grasp bar with wide overhand grip.','Pull bar to upper waist. Return until arms are extended and shoulders are stretched downward. Repeat.','upload/exercise-picture/BBBentOverRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(360,'Barbell Underhand Bent-over Row','Bend knees slightly and bend over bar with back straight. Grasp bar with underhand grip.','Pull bar to waist. Return until arms are extended and shoulders are stretched downward. Repeat.','upload/exercise-picture/BBUnderhandBentOverRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(361,'Cable Kneeling Row','Place right knee on lower pad (positioned to right side) with foot of other leg slightly back out to side and knee slightly bent. Place right forearm on right side of upper pad and grasp handle. Grasp cable stirrup below with left hand. Allow left shoulder to be pulled forward without spinal rotation.','Pull stirrup up to side until elbow travels beyond surface of back. Return until arm is extended and shoulder is stretched downward. Repeat and continue with opposite side.','upload/exercise-picture/CBOneArmKneelingRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(362,'Cable Lying Row','Straddle head of bench and grasp stirrups on two high pulley cables. Lie on bench with stirrups in each hand and arms extended upward.','Pull stirrups down to each side of chest until elbows are behind back and shoulders are pulled back. Return until arms are extended and shoulders are stretched upward. Repeat.','upload/exercise-picture/CBLyingRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(363,'Cable One Arm Bent-over Row','Grasp cable stirrup. Step back away from pulley, with foot on same side as exercising arm, positioned out to side well behind forward foot. Bend over with hand on nearby bar or above knee for support. Keep back straight and knees slightly bent. Allow shoulder with stirrup to be pulled forward.','Pull cable attachment to side of torso, pulling shoulder back. Return until arm is extended and shoulder is stretched forward. Repeat. Continue with opposite arm.','upload/exercise-picture/CBOneArmBentOverRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(364,'Cable One Arm Seated Row','Sit slightly forward on platform or secured bench in order to grasp cable stirrup with one hand. Position hips back with knees slightly bent\n\n\n. Allow shoulder with stirrup to be pulled forward.','Pull cable attachment to side of torso, slightly twisting through waist. Pull shoulder back and push chest forward during contraction. Return until arm is extended and shoulder is stretched forward. Repeat. Continue with opposite arm.','upload/exercise-picture/CBOneArmRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(365,'Cable Twisting Seated Row','Sit slightly forward on platform or secured bench close to cable attachment. Bend forward and grasp cable stirrup with one hand. Slide hips back by positioning knees with slight bend. Allow shoulder with stirrup to be pulled forward with forward bend and twist through waist.','Pull cable attachment to side, extending and twisting through waist. Pull shoulders back and sit upright while pushing chest forward during contraction. Return until arm is extended and shoulder is stretched forward. Repeat and perform exercise with opposite arm.','upload/exercise-picture/CBOneArmTwistingRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(366,'Cable One Arm Seated High Row','Sit slightly forward on platform or secured bench close to cable attachment. Bend forward and grasp cable stirrup with one hand. Slide hips back by positioning knees with slight bend. Allow arm, shoulder, and torso to be pulled forward under weight on cable.','Pull cable attachment to side of torso, straightening back and leaning back slightly. Pull shoulder back and push chest forward during contraction. Return until arm is extended and torso is pulled forward. Repeat. Continue with opposite arm.','upload/exercise-picture/CBOneArmHighRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(367,'Cable Seated High Row','Sit slightly forward on bench or platform in order to\n\n\ngrasp cable attachment. Place feet on vertical platform. Slide hips back positioning knees with slight bend. Allow weight on cable to pull torso forward while stretching arms and shoulders upward.','Pull cable attachment to waist and lean back slightly. Pull shoulders back and push chest forward while arching back. Return until torso, arms, and shoulders pulled forward. Repeat.','upload/exercise-picture/CBHighRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(368,'Cable Twisting Seated High Row','Sit on seat or bench. Bend forward and grasp cable stirrup with one hand. Allow shoulder with stirrup to be pulled forward with twist through waist.','Pull cable attachment to side of torso while twisting though waist in opposite direction. Pull shoulder back and push chest forward. Return until arm is extended and shoulder is pulled forward. Repeat. Continue with opposite arm.','upload/exercise-picture/CBOneArmTwistingHighRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(369,'Cable Alternating Seated High Row','Sit and grasp cable stirrups one with each hand. Lean back slightly allowing arms, shoulders, and torso to be pulled forward under weight on cables.','Pull one cable stirrup to side. Pull shoulder back, push chest forward, and rotate body slightly toward pulling arm. Return until arm is extended and torso faces forward. Pull with opposite arm alternating between each side. Repeat.','upload/exercise-picture/CBAlternatingHighRowLeanBack.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(370,'Cable Seated Row','Sit slightly forward on seat or bench in order to grasp cable attachment. Place feet on vertical platform. Slide hips back positioning knees with slight bend.','Pull cable attachment to waist while straightening lower back. Pull shoulders back and push chest forward while arching back. Return until arms are extended, shoulders are stretched forward, and lower back is flexed forward. Repeat.','upload/exercise-picture/CBSeatedRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(371,'Cable One Arm Straight Back Seated High Row','Sit on seat or bench. Bend forward and grasp cable stirrup with one hand. Position torso upright allowing shoulder to be pulled forward under weight on cable.','Pull cable attachment to side of torso while pulling shoulder back, arching spine, and pushing chest forward. Return until arm is extended and shoulder is pulled forward. Repeat. Continue with opposite arm.','upload/exercise-picture/CBOneArmStrBackHighRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(372,'Cable Wide Grip Seated Row','Sit slightly forward on platform in order to grasp cable attachment. With awider than shoulder width grip, slide hips back positioning knees with slight bend.','Pull cable attachment to waist while pulling torso upright. Pull shoulders back and push chest forward while arching back. Return until arms are extended, shoulders are stretched forward, and lower back is flexed forward. Repeat.','upload/exercise-picture/CBWideGripSeatedRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(373,'Cable Straight Back Seated Row','Sit slightly forward on bench with feet on foot bar or vertical platform. Grasp close grip cable attachment. Straighten torso\n\n\nupright and slide hips back so knees are slightly bent.','Pull cable attachment to waist. Pull shoulders back and lift chest by arching back. Return until arms are extended, back is straight, and shoulders are stretched forward. Repeat.','upload/exercise-picture/CBSeatedRowStraightBack.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(374,'Cable Wide Grip Straight Back Seated Row','Sit slightly forward on bench or platform in order to grasp cable bar attachment. With wider than shoulder width overhand grip, straighten torso upright and slide hips back until knees are only\n\n\nslightly bent.','Pull cable attachment to waist. Pull shoulders back and lift chest by arching back. Return until arms are extended, back is straight, and shoulders are stretched forward. Repeat.','upload/exercise-picture/CBSeatedRowWideGripStrBack.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(375,'Cable Standing Row','Stand to side of medium height, rotating pulley. Place hand shoulder height or slightly lower on support bar with arm straight. Place foot nearest supporting arm forward with knee slightly bent and opposite foot back. Grasp cable stirrup with one hand, allowing shoulder to be pulled forward under weight on cable.','Pull cable attachment to side of torso while pulling shoulder back, arching spine, and pushing chest forward. Return until arm is extended and shoulder is pulled forward. Repeat. Continue with opposite arm.','upload/exercise-picture/CBOneArmStandingRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(376,'Dumbbell Bent-over Row','Kneel over side of bench by placing knee and hand of supporting arm on bench. Position foot of opposite leg slightly back to side. Grasp dumbbell from floor.','Pull dumbbell to up to side until it makes contact with ribs or until upper arm is just beyond horizontal. Return until arm is extended and shoulder is stretched downward. Repeat and continue with opposite arm.','upload/exercise-picture/DBBentoverRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(377,'Cable Standing Low Row','Stand to side of low pulley. Place hand on support bar with arm straight. Place foot nearest supporting arm forward with knee slightly bent and opposite foot back. Grasp cable stirrup with one hand, allowing shoulder to be pulled forward under weight on cable.','Pull cable attachment to side of torso while pulling shoulder back, arching spine, and pushing chest forward. Return until arm is extended and shoulder is pulled forward. Repeat. Continue with opposite arm.','upload/exercise-picture/CBStandingLowRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(378,'Dumbbell Lying Row','Lie chest down on elevated bench. Grasp dumbbells below.','Pull dumbbells to sides until upper arm is just beyond horizontal or height of back. Return until arms are extended and shoulders are stretched downward. Repeat.','upload/exercise-picture/DBLyingRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(379,'Cable Twisting Standing High Row','Stand facing high pulley positioned slightly above head level. Grasp stirrup with one hand and step back so arm is straight. With leg of opposite side as loaded arm, plant forefoot far back on floor. Slightly bend knee of forward leg, same direction as foot. Allow shoulder with stirrup to be pulled forward with twist through waist.','Pull cable attachment to side of torso and rotate body toward side of pulling arm. Pull shoulder back and push chest forward. Return until arm is extended and shoulder is pulled forward. Repeat. Continue with opposite arm.','upload/exercise-picture/CBStandingTwistingRowOpStance.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(380,'Lever Bent-over Row (plate loaded)','With lever handles to sides, bend knees slightly and bend over with back straight. Grasp lower handles.','Pull lever handles up to sides. Return until arms are extended and shoulders are stretched downward. Repeat.','upload/exercise-picture/LVBentOverRowH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(381,'Lever Wide Grip Bent-over Row (plate loaded)','With lever handles to sides, bend knees slightly and bend over with back straight. Grasp wider handles.','Pull lever handles up to sides. Return until arms are extended and shoulders are stretched downward. Repeat.','upload/exercise-picture/LVWideGripBentOverRowH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(382,'Lever Barbell Bent-over Row (plate loaded)','Stand with toes under bar facing fulcrum. Bend knees slightly and bend over bar with back straight. Grasp bar with wide overhand grip.','Pull bar to waist. Return until arms are extended and shoulders are stretched downward. Repeat.','upload/exercise-picture/LVSMBentoverRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(383,'Lever Incline Row (plate loaded)','Lie chest on inclined platform and grasp lever handles with overhand grip.','Pull lever up as high as possible. Return until arms are extended and shoulders are stretched downward. Repeat.','upload/exercise-picture/LVInclineRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(384,'Lever One Arm Bent-over Row (plate loaded)','Kneel over side of bench facing loaded side of lever bar by placing knee and hand of supporting arm on bench. Position foot of opposite leg slightly back to side, straddling bar. Grasp bar from floor, several inches under barbell plates.','Pull lever bar up to side until bar contacts shoulder or just until elbow travels behind height of back. Return until arm is extended and shoulder is stretched downward. Repeat and continue with opposite arm.','upload/exercise-picture/LVOneArmBentOverRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(385,'Lever Close Grip Incline Row (plate loaded)','Lie chest on inclined platform and grasp lever close grip handles.','Pull lever up as high as possible. Return until arms are extended and shoulders are stretched downward. Repeat.','upload/exercise-picture/LVCloseGripInclineRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(386,'Lever One Arm Standing Row (plate loaded)','Place hand on support bar and grasp lever far forward. Place foot on side of moving arm on foot support and position opposite foot behind.','Pull lever to side while twisting torso toward opposite side. Pull shoulder back and push chest forward during contraction. Return until arm is extended and torso is pulled toward original direction. Repeat. Continue with opposite arm.','upload/exercise-picture/LVOneArmStandingRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(387,'Lever Narrow Grip Seated Row (plate loaded)','Sit on seat and position chest against pad. Grasp lever handles with underhand grip.','Pull levers back until elbows are behind back and shoulders are pulled back. Return until arms are extended and shoulders are stretched forward. Repeat.','upload/exercise-picture/LVSeatedRowLowNarrowH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(388,'Lever Alternating Wide Grip Seated Row (plate loaded)','Sit on seat and position chest against pad. Grasp lever handles with underhand grip.','Pull one lever back until elbow is behind back and shoulder is pulled back. Return until arm is extended and shoulder is stretched forward. Repeat with opposite arm, alternating between sides.','upload/exercise-picture/LVAlternatingWideGripSeatedRowH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(389,'Lever Alternating Narrow Grip Seated Row (plate loaded)','Sit on seat and position chest against pad. Grasp lever handles with underhand grip.','Pull one lever back until elbow is behind back and shoulder is pulled back. Return until arm is extended and shoulder is stretched forward. Repeat with opposite arm, alternating between sides.','upload/exercise-picture/LVSeatedRowAlternatingNarrowH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(390,'Lever Wide Grip Seated Row (high bar, plate loaded)','Sit on seat and position chest against pad. Grasp lever handles with underhand grip.','Pull levers back until elbows are behind back and shoulders are pulled back. Return until arms are extended and shoulders are stretched forward. Repeat.','upload/exercise-picture/LVWideGripSeatedRowH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(391,'Lever Wide Grip Seated Row (plate loaded)','Sit on seat and position chest against pad. Grasp lever handles with underhand grip.','Pull levers back until elbows are behind back and shoulders are pulled back. Return until arms are extended and shoulders are stretched forward. Repeat.','upload/exercise-picture/LVSeatedRowWideH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(392,'Lever Seated High Row (plate loaded)','Sit on seat and position chest against pad. Grasp lever handles with overhand grip.','Pull lever back until elbows are behind back and shoulders are pulled back. Return until arms are extended and shoulders are stretched forward. Repeat.','upload/exercise-picture/LVSeatedHighRowH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(393,'Lever Straight Back Seated Row (no chest pad, plate loaded)','Sit on seat with feet positioned on foot bar or platform. Grasp handles with each hand. Position torso upright with knees bent slightly.','Pull handles to body. Pull shoulders back and lift chest by arching back. Return until arms are extended, back is straight, and shoulders are stretched forward. Repeat.','upload/exercise-picture/LVStrBackSeatedRowNoPadPL.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(394,'Lever Seated Low Row (plate loaded)','Sit on seat and position chest against pad. Grasp lever handles with overhand/neutral grip.','Pull levers back until elbows are behind back and shoulders are pulled back. Return until arms are extended and shoulders are stretched forward. Repeat.','upload/exercise-picture/LVSeatedLowRowH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(395,'Lever Seated Row (no chest pad, plate loaded)','Sit on seat and grasp handles with each hand. Place feet on vertically angled platform. Slide hips back with knees slightly bent.','Pull handles to waist while straightening torso upright. Pull shoulders back and push chest forward while arching back. Return until arms are extended, shoulders are stretched forward, and lower back is flexed forward. Repeat.','upload/exercise-picture/LVSeatedRowNoPadPL.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(396,'Lever Close Grip T-bar Row (plate loaded)','Bend knees slightly and bend over lever handles with back straight. Grasp parallel lever handles.','Pull handles up to waist. Return until arms are extended and shoulders are stretched downward. Repeat.','upload/exercise-picture/LVCloseGripTBarRowPL.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(398,'Lever T-bar Row (plate loaded)','Bend knees slightly and bend over lever handles with back straight. Grasp lever handles with shoulder width to wide overhand grip.','Pull lever up to torso. Return until arms are extended and shoulders are stretched downward. Repeat.','upload/exercise-picture/LVBentOverRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(399,'Lever Alternating Underhand Seated Row (plate loaded)','Sit on seat and position chest against pad. Grasp lever handles with underhand grip.','Pull one lever back until elbow is behind back and shoulder is pulled back. Return until arm is extended and shoulder is stretched forward. Repeat with opposite arm, alternating between sides.','upload/exercise-picture/LVAlternatingSeatedUnderhandRowH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(401,'Lever Seated High Row','Sit on seat and position thighs under pad. Lean\n\nforward\n\nand grasp lever handles above.','Pull lever down while leaning back slightly. As elbows travel to sides, lift chest slightly and pull shoulders and elbows back. Return until arms are extended and body and shoulders are stretched forward. Repeat.','upload/exercise-picture/LVHighRowB.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(402,'Lever Seated Row','Sit on seat and position chest against pad. Push foot lever if available. Grasp narrower parallel grip handles.','Pull lever back until elbows are behind back and shoulders are pulled back. Return until arms are extended and shoulders are stretched forward. Repeat.','upload/exercise-picture/LVSeatedRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(403,'Lever Alternating Seated High Row','Sit on seat and position chest against pad. Grasp lever handles with overhand grip.','Pull one lever handle back until elbow is behind back and shoulder is pulled back. Return until arm is extended and shoulder is stretched forward. Repeat with opposite arm, alternating between sides.','upload/exercise-picture/LVAlternatingHighRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(405,'Lever Underhand Seated Row (plate loaded)','Sit on seat and position chest against pad. Grasp lever handles with underhand grip.','Pull levers back until elbows are behind back and shoulders are pulled back. Return until arms are extended and shoulders are stretched forward. Repeat.','upload/exercise-picture/LVSeatedUnderhandRowH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(406,'Lever Wide Grip Seated Row','Sit on seat and position chest against pad. Grasp outer lever handles with overhand grip.','Pull lever back until elbows are behind back and shoulders are pulled back. Return until arms are extended and shoulders are stretched forward. Repeat.','upload/exercise-picture/LVWideGripSeatedRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(407,'Lever Alternating Underhand Seated Row','Sit on seat and position chest against pad. Grasp lever handles with underhand grip.','Pull one lever handle back until elbow is behind back and shoulder is pulled back. Return until arm is extended and shoulder is stretched forward. Repeat with opposite arm, alternating between sides.','upload/exercise-picture/LVAlternatingUnderhandSeatedRowS.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(408,'Lever Underhand Seated Row','Sit on seat and position chest against pad. Grasp lever handles with underhand grip.','Pull lever handles back until elbows are behind back and shoulders are pulled back. Return until arms are extended and shoulders are stretched forward. Repeat.','upload/exercise-picture/LVUnderhandSeatedRowS.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(410,'Lever Seated Row (no chest pad)','Sit on seat and grasp handles with each hand. Place feet on vertically angled platform. Slide hips back with knees slightly bent.','Pull handles to waist while straightening torso upright. Pull shoulders back and push chest forward while arching back. Return until arms are extended, shoulders are stretched forward, and lower back is flexed forward. Repeat.','upload/exercise-picture/LVSeatedRowNoPad.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(411,'Lever Straight Back Seated Row (no chest pad)','Sit on seat with feet positioned on foot bar or platform. Grasp handles with each hand. Position torso upright with knees bent slightly.','Pull handles to body. Pull shoulders back and lift chest by arching back. Return until arms are extended, back is straight, and shoulders are stretched forward. Repeat.','upload/exercise-picture/LVStraightBackSeatedRowNoPad.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(412,'Inverted Row (feet elevated)','Lay on back under fixed horizontal bar. Grasp bar with wide overhand grip. Place back of heels on elevated surface.','Keeping body straight, pull body up to bar. Return until arms are extended and shoulders are stretched forward. Repeat.','upload/exercise-picture/BWSupineRowFeetElevated.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(413,'Smith Bent-over Row','Bend knees slightly and bend over bar with back straight. Grasp bar with wide overhand grip. Disengage bar by rotating bar back.','Pull bar to upper waist. Return until arms are extended and shoulders are stretched downward. Repeat.','upload/exercise-picture/SMBentoverRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(414,'Inverted Row','Lay on back under fixed horizontal bar. Grasp bar with wide overhand grip.','Keeping body straight, pull body up to bar. Return until arms are extended and shoulders are stretched forward. Repeat.','upload/exercise-picture/BWSupineRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(415,'Weighted Inverted Row','Lay on back under fixed horizontal bar. Grasp bar with wide overhand grip. Place back of heels on elevated surface.','Keeping body straight, pull body up to bar. Return until arms are extended and shoulders are stretched forward. Repeat.','upload/exercise-picture/WTInvertedRowFeetElevated.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(417,'Inverted Row (on hips)','Lay on back with belly under fixed horizontal bar. Bend knees and position feet on floor. Grasp bar with wide overhand grip.','Comments','upload/exercise-picture/BWSupineRowOnHip.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(419,'Inverted Row (high bar)','Stand facing arms length away from waist to head height horizontal bar. Grasp bar with wide overhand grip. Position body under bar with legs, hips and spine straight. Arms should be straight, approximately perpendicular to body. Heels should make contact with floor.','Keeping body straight, pull body up to bar. Return until arms are extended and shoulders are stretched forward. Repeat.','upload/exercise-picture/BWSupineRowHigh.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(420,'Suspended Row','Grasp suspension handles and momentarily step back until arms are extended forward and straight. While keeping arms straight and shoulders back, step forward so body reclines back behind suspension handles. Position body and legs straight at desired angle, hanging from handles with arms straight.','Pull body up so sides of chest make contact with handles while keeping body and legs straight. Return until arms are extended straight and shoulders are stretched forward. Repeat.','upload/exercise-picture/STRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(421,'Fixed Bar Back Stretch','Stand facing stationary bar. Grasp stationary bar with one hand approximately waist height.','Bend over allowing hips to fall back. Slightly lean torso toward stretched arm. Hold stretch. Repeat with opposite side.','upload/exercise-picture/2febe4db68138ccd83658bc2e5387d62.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(422,'Suspended Inverted Row','Position suspension handles higher than arms\' length above floor. Sit on floor and grasp handles. Position body supine hanging from handles with arms straight, shoulders under handles, body straight, and back of heels on floor.','Pull body up so sides of chest make contact with handles while keeping body straight. Return until arms are extended straight and shoulders are stretched forward. Repeat.','upload/exercise-picture/STInvertedRow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(423,'Suspended Bent-knee Inverted Row','Position suspension handles higher than arms\' length above floor. Sit on floor and grasp handles. Hang shoulders under handles with arms straight, back and hips straight, with knees bent and feet flat on floor.','Pull body up so sides of chest make contact with handles while keeping body straight. Return until arms are extended straight and shoulders are stretched forward. Repeat.','upload/exercise-picture/STInvertedRowLowKneesBent.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(424,'Lever Back Stretch','Sit on seat in forward position with lower legs on shin pad, feet on foot rest. Place hands through wrist straps. Hold upper bar with arms crossed, overhand grip.','Push and lower seat back. Hold stretch. Repeat with opposite arm position.','upload/exercise-picture/PCCrosshand8.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(425,'Suspended Power Pull','Grasp suspension handle(s) with one hand. Step back until handle is chest height when held to side of chest. Facing suspension apparatus with feet shoulder width apart, point other arm and its shoulder forward, parallel with angle of strap.','Rotate body and extended arm, reaching outward while lowering body downward by extending arm holding onto handle. Extend arms and shoulders in-line with suspension strap so body is angled back to one side. Return by raising body back upward in opposite motion, reaching outward and toward suspension strap while pulling handle back to side of chest until body is upright and arm parallel with angle of strap. Repeat and continue with opposite side.','upload/exercise-picture/STPowerPull.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(426,'Barbell Pullover','Lie upper back perpendicular on bench. Flex hips slightly. Grasp barbell from behind and position over chest with elbows bent slightly.','With elbows bent slightly, lower bar over and beyond head until shoulders are fully flexed or upper arms are approximately parallel to torso. Return and repeat.','upload/exercise-picture/BBPullover.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(427,'Machine-assisted Pull-up (open-centered bar)','Step up and grasp bar with wide overhand grip. Kneel on padded platform and lower body down with arm extended.','Pull body up until neck reaches height of hands. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/ASPullUpKneelingOpen.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(428,'Machine-assisted Parallel Close Grip Pull-up (standing)','Step up and grasp parallel grips. Step down onto assistance lever or platform.','Pull body up until elbow are to sides. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/AsCloseGripPullup.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(429,'Machine-assisted Pull-up','Step up and grasp bar with wide overhand grip. Kneel on padded platform and lower body down with arm extended.','Pull body up until neck reaches height of hands. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/ASPullupKneeling.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(430,'Machine-assisted Pull-up (open-centered bar, standing)','Step up and grasp bar with wide overhand grip. Step down onto assistance lever or platform.','Pull body up until neck reaches height of hands. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/AsPullup.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(431,'Machine-assisted Chin-up','Step up and grasp bar with underhand shoulder width grip. Kneel onto platform or step onto bar.','Pull body up until elbows are to sides. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/ASUnderhandChinupKneeling.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(432,'Cable One Arm Pulldown','Grasp stirrup in one hand. Sit with thighs under supports.','Pull down cable attachment to side of chest. Return until arm and shoulder is fully extended, allowing shoulder to raise. Repeat and continue with other arm.','upload/exercise-picture/CBOneArmPulldown.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(433,'Barbell Bent Arm Pullover','Lie upper back perpendicular on bench. Flex hips slightly. Grasp barbell from behind and position over chest with elbows bent approximately 90°.','With elbow bent, lower bar over and just behind head until upper arm is approximately parallel to torso. Return and repeat.','upload/exercise-picture/BBBentArmPullover.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(434,'Cable Close Grip Pulldown','Grasp parallel cable attachment. Sit with thighs under supports.','Pull down cable attachment to upper chest. Return until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/CBCloseGripPulldown.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(435,'Machine-assisted Parallel Close Grip Pull-up','Step up and grasp parallel grips. Kneel on padded platform and lower body down with arm extended.','Pull body up until elbows are to sides. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/ASCloseGripPullUpKneeling.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(436,'Cable Alternating Close Grip Pulldown','Grasp stirrups in each hand. Sit with thighs under supports.','Pull down one cable attachment to side of chest. Return until arm and shoulder is fully extended. Repeat with opposite arm, alternating between sides.','upload/exercise-picture/LVAlternatingCloseGripPulldown.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(437,'Cable One Arm Kneeling Pulldown','Grasp stirrup in one hand and kneel on floor.','Pull down cable attachment to side of chest. Return until arm and shoulder is fully extended, allowing shoulder to raise. Repeat and continue with other arm.','upload/exercise-picture/CBOneArmKneelingPulldown.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(438,'Cable Pulldown','Grasp cable bar with wide grip. Sit with thighs under supports.','Pull down cable bar to upper chest. Return until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/CBFrontPulldown.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(439,'Cable Close Grip Pulldown (stirrups)','Grasp stirrups in each hand. Sit with thighs under supports.','Pull down cable attachments to sides of chest. Return until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/CBCloseGripPulldownStirrups.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(440,'Cable Kneeling Bent-over Pulldown','Kneel on mat slightly away from high pulley. Grasp cable rope attachment with both hands. Sit with hips back and bend down by flexing hips so torso is bent over at approximately 30º angle. Allow resistance on cable pulley to pull arms upward with elbows bent.','Pull cable rope down until elbows are back and inside of rope attachment is behind neck. Return attachment over head until shoulder is completely flexed upward. Repeat.','upload/exercise-picture/KneelingBentOverPulldown.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(441,'Cable Parallel Grip Pulldown','Grasp parallel cable attachment. Sit with thighs under supports.','Pull down cable attachment to upper chest. Return until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/CBParallelGripPulldown.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(442,'Cable Alternating Pulldown','Grasp stirrups in each hand. Sit with thighs under supports.','Pull down one cable attachment to front side shoulder. Return until arm and shoulder are fully extended. Repeat with opposite arm, alternating between sides.','upload/exercise-picture/CBAlternatingPulldown.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(443,'Cable Pullover','Lie upper back perpendicular on bench. Flex hips slightly, so hips are slightly lower than torso. Grasp revolving barbell cable attachment from behind. Pull to position cable attachment over chest. Fix elbows with small bend.','Lower cable attachment toward pulley with elbows bent only slightly. Lower until shoulders are fully flexed or upper arms are in-line with upper torso. Raise cable attachment over head and continue toward lower body until cable becomes very close to head. Repeat.','upload/exercise-picture/CBPullover.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(444,'Cable Pulldown (pro lat bar)','Grasp pro lat bar with wide parallel grip. Sit with thighs under supports.','Pull down cable bar to upper chest. Return until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/CBFrontPulldownProBar.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(445,'Cable Pulldown (stirrups)','Grasp stirrups in each hand. Sit with thighs under supports.','Pull down cable attachments to front sides of shoulders. Return until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/CBPulldownStirrups.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(446,'Cable Bent-over Pullover','Face high pulley and grasp revolving cable attachment with arm slightly bent. Place one foot slightly back and bend over at hip until shoulder is fully flexed (upper arms at sides of head).','With elbows fixed approximately 30°, pull cable attachment down until upper arms are to sides. Return attachment overhead. Repeat.','upload/exercise-picture/CBStraightArmPullDown.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(447,'Cable Parallel Close Grip Pull-up','Place dip belt around waist. Kneel as close as possible to low pulley or lever and attach hook to dip belt in front between legs. Step up and grasp close grip p\n\n\narallel bars with hands facing inward. Lift legs off of steps or floor.','Pull body up until elbow are to sides. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/CBParallelCloseGripPullup.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(448,'Cable Chin-up','Place dip belt around waist. Kneel close to low pulley or lever and attach hook to dip belt chains. Step up and grasp bars with shoulder width underhand grip. Lift legs off of steps or floor.','Pull body up until elbow are to sides. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/CBChinup.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(449,'Cable Parallel Grip Pull-up','Place dip belt around waist. Kneel as close as possible to low pulley or lever and attach hook to dip belt in front between legs. Step up and grasp parallel bars with hands facing inward. Lift legs off of steps or floor.','Pull body up until elbow are to sides. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/LVPullup.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(450,'Cable Seated Pullover','Sit on bench facing away from cable pulley apparatus. Grasp revolving cable attachment over head with overhand grip.','With elbows fixed with slight bend, pull cable attachment forward and down as far as possible. Return cable attachment forward and overhead. Repeat.','upload/exercise-picture/CBSeatedStraightArmPulldown.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(451,'Cable Rear Pull-up','Place dip belt around waist. Kneel close to low pulley or lever and attach hook to dip belt. Step up and grasp bars with overhand wide grip. Lift legs off of steps or floor.','Pull body up until bar touches back of neck. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/CBRearPullup.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(452,'Cable Pull-up','Place dip belt around waist. Kneel close to low pulley or lever and attach hook to dip belt. Step up and grasp bars with overhand wide grip. Lift legs off of steps or floor.','Pull body up until chin is above bar. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/CBPullup.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(453,'Cable Rear Pulldown','Grasp cable bar with wide grip. Sit with thighs under supports.','Pull cable bar down behind neck. Return until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/CBRearPulldown.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(454,'Lever Close Grip Pulldown (plate-loaded)','Grasp handles and sit with thighs under padded supports.','Pull down handles to sides of chest while leaning back slightly. Return until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/LVCloseGripPulldownPL.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(455,'Cable Twisting Standing Overhead Pull','Stand facing very high pulley. Grasp stirrup in one hand and step back so arm is straight. With leg of opposite side as loaded arm, plant forefoot far back on floor. Slightly bend knee of forward leg, same direction as foot.','Pull down cable attachment to side of chest and rotate body toward side of pulling arm. Return until arm and shoulder is fully extended, allowing shoulder to raise. Repeat. Continue with opposite arm.','upload/exercise-picture/CBStandTwistPulldownOpStance.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(456,'Cable Underhand Pulldown','Grasp cable bar with underhand grip. Sit with thighs under supports.','Pull down cable bar to upper chest until elbows are to sides. Return until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/CBUnderhandPulldown.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(457,'Lever Rear Pulldown (plate loaded)','Grasp lever bar with wide grip. Sit with thighs under supports.','Pull lever bar down behind neck. Return until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/LVRearPulldownPL.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(458,'Lever Pulldown (plate loaded)','Grasp handles to each side with overhand grip. Sit on seat and position thighs under leg pads.','Pull levers down to sides of shoulders. Return until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/LVPulldownH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(459,'Lever Underhand Pulldown (plate loaded)','Grasp lever handles with underhand grip. Sit with thighs under supports.','Pull down lever handles toward sides until elbows are to sides. Return until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/LVUnderhandPulldownH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(460,'Lever Front Pulldown (plate loaded)','Grasp lever bar with wide grip. Sit with thighs under supports.','Pull down lever bar to upper chest. Return until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/LVFrontPulldownPL.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(462,'Lever Pullover (plate loaded)','Adjust seat height so lever is near shoulder axis. Sit on machine. Place elbows on pads and grasp bar from behind.','Pull lever forward and down until elbows are to sides. Return until shoulders are fully flexed, or upper arms are parallel to torso. Repeat.','upload/exercise-picture/LVPulloverH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(463,'Lever Close Grip Pulldown','Grasp parallel lever bars. Sit with thighs under supports.','Pull down handles to sides of chest while leaning back slightly. Return until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/LVCloseGripPulldown.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(464,'Lever Front Pulldown','Grasp lever handles. Sit with thighs under supports.','Pull down lever to upper chest. Return until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/LVFrontPulldown.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(465,'Lever Iron Cross','Stand on platform and grasp handles to sides with palms down grip.','With arms straight, pull lever handles down below hips. Return lever handles upward just above shoulder high, or just before slight pressure in shoulder is felt. Repeat.','upload/exercise-picture/LVIronCross.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(467,'Lever Underhand Pulldown','Grasp lever handles with underhand grip. Sit with thighs under supports.','Pull down lever handles to sides until elbows are to sides. Return until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/LVBiLateralUnderhandPulldownS.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(468,'Lever Pullover','Adjust seat height so lever is near shoulder axis. Sit on machine and push foot lever. Place elbows on pads and grasp bar from behind. Release foot lever and place feet on platform or to sides.','Pull lever forward and down until elbows are to sides. Return until shoulders are fully flexed, or upper arms are parallel to torso. Repeat.','upload/exercise-picture/LVPullover.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(470,'Lever Pulldown','Sit on seat. Reach up and grasp handles with wide overhand grip.','Pull levers down to sides of shoulders. Return until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/LVPullDown.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(471,'Lever Pulldown (parallel grip)','Sit on seat. Reach up and grasp parallel handles.','Pull levers down to sides of shoulders. Return until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/LVPullDownParallelGrip.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(473,'Weighted Parallel Close Grip Pull-up','Step up and grasp close grip parallel bars.','Pull body up until elbow are to sides. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/WTCloseGripChinup.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(474,'Weighted Chin-up','Step up and grasp bar with underhand shoulder width grip.','Pull body up until elbows are to sides. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/WTChinUpUnderhand.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(475,'Lever Alternating Underhand Pulldown','Grasp lever handles with underhand grip. Sit with thighs under supports.','Pull down one lever handle to side until elbow is down to side. Return until arm and shoulder are fully extended. Repeat with opposite arm. Continue to alternate pulldown between arms.','upload/exercise-picture/LVAlternatingUnderhandPulldownS.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(476,'Weighted Pull-up','Step up and grasp bar with overhand wide grip.','Pull body up until chin is above bar. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/WTChinUp.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(477,'Band-assisted Pull-up','Grab each side of hanging exercise band with both hands. Stretch exercise band down and step onto bottom inside of band with one foot. Stretch band down further by extending leg straight down. Reach up and grasp bar with overhand wide grip while keeping banded leg straight.','Pull body up until chin is above bar. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/ASPullupFootBand.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(478,'Weighted Pull-up (open-centered bar)','Reach up and grasp bar with wide overhand grip.','Pull body up until neck reaches height of hands. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/WTPullUpDB.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(479,'Band-assisted Chin-up','Grab each side of hanging exercise band with both hands. Stretch exercise band down and step onto bottom inside of band with one foot. Stretch band down further by extending leg straight down. Reach up and grasp bar with underhand shoulder width grip while keeping banded leg straight.','Pull body up until elbows are to sides. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/ASChinupFootBand.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(480,'Weighted Rear Pull-up','Step up and grasp bar with overhand wide grip.','Pull body up until bar touches back of neck. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/WTRearPullup.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(481,'Band-assisted Parallel Grip Pull-up','Grab each side of hanging exercise band with both hands. Stretch exercise band down and step onto bottom inside of band with one foot. Stretch band down further by extending leg straight down. Reach up and grasp parallel bars while keeping banded leg straight.','Pull body up until elbow are to sides. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/ASParallelGripPullupFootBand.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(483,'Weighted Pull-up (neutral grip)','Step up and grasp bar with neutral grip.','Pull body up until neck reaches height of hands. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/WTPullUpN.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(484,'Band-assisted Neutral Grip Pull-up','Grab each side of hanging exercise band with both hands. Stretch exercise band down and step onto bottom inside of band with one foot. Stretch band down further by extending leg straight down. Reach up and grasp bar with neutral grip while keeping banded leg straight.','Pull body up until neck reaches height of hands. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/ASNeutralGripPullupFootBand.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(485,'Parallel Close Grip Pull-up','Step up and grasp parallel bars.','Pull body up until elbow are to sides. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/BWCloseGripPullup.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(486,'Band-assisted Rear Pull-up','Grasp middle of hanging exercise band and pull down to side of leg. Lift foot and hook band under heel. Stretch band down further by extending leg straight down. Face perpendicular under pullup bar and position band behind body. Pull band apart and place other foot onto band so both feet are together inside of band. Reach up and grasp pull-up bar with overhand wide grip while keeping legs straight.','Pull body up until bar touches back of neck. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/ASRearPullupFootBand.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(487,'Pull-up','Step up and grasp bar with overhand wide grip.','Pull body up until chin is above bar. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/BWWideGripChinup.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(488,'Partner-assisted Rear Pull-up','Step up and grasp bar with overhand wide grip. Bend knees so partner can assist from behind.','Pull body up until bar touches back of neck. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/AsRearPullupPartner.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(489,'Pull-up (open-centered bar)','Reach up and grasp bar with wide overhand grip.','Pull body up until neck reaches height of hands. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/BWPullUp.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(490,'Pull-up (neutral grip)','Step up and grasp bar with neutral grip.','Pull body up until neck reaches height of hands. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/BWPullUpN.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(491,'Rear Pull-up','Step up and grasp bar with overhand wide grip.','Pull body up until bar touches back of neck. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/BWRearPullup.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(492,'Partner-assisted Chin-up','Step up and grasp bar with underhand shoulder width grip. Bend knees so partner can assist from behind.','Pull body up until elbows are to sides or chin is just above bar. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/AsUnderhandChinupPartner.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(493,'Partner-assisted Pull-up','Step up and grasp bar with wide overhand grip. Bend knees so partner can assist from behind.','Pull body up until chin is just above bar. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/AsChinupPartner.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(494,'Self-assisted Rear Pull-up','Grasp bar with overhand wide grip. Position forefeet on floor just behind low bar or on bench just behind high bar.','Lower body until arms and shoulders are fully extended. If necessary, use minimal assistance of lower body to control descent allowing knees to bend. Pull body up until bar touches back of neck, again with minimal assistance from lower body. Repeat.','upload/exercise-picture/BWRearPullupSelfAssistedRear.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(495,'Self-assisted Pull-up','Stand facing fixed horizontal bar at neck height. Grasp bar with wide overhand grip. Position feet forward on floor, slightly in front of bar.','Lower body under bar until arms and shoulders are fully extended. If necessary, use minimal assistance of lower body to control descent, allowing knees and hips to bend, keeping flat on floor. Pull body up until chin is just above bar, again with minimal assistance from legs. Repeat.','upload/exercise-picture/BWChinupSelfAssistedFront.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(496,'Self-assisted Chin-up','Stand facing fixed horizontal bar at neck height. Grasp bar with underhand grip shoulder width. Position feet forward on floor, slightly in front of bar.','Lower body under bar until arms and shoulders are fully extended. If necessary, use minimal assistance of lower body to control descent, allowing knees and hips to bend, keeping flat on floor. Pull body up until elbows are to sides, again with minimal assistance from lower body. Repeat.','upload/exercise-picture/BWUnderHandChinupSelfAssistedFront.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(497,'Wheel Rollout','Kneel on floor or mat. Grasp handles on wheel to each side with overhand grip. Position wheel near front of knees and lean over wheel with arms extended downward, supporting upper body.','With arms straight, roll wheel out as far as possible. Lower body gently to floor extending arms forward. Raise body back up by flexing hips and pulling arms back to original position. Return until hips are extended. Repeat.','upload/exercise-picture/BWKneelingWheelRollout.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(498,'Suspended Rollout','Kneel on floor or mat and grasp suspension trainer handles. Position body upright with subtle bend through hip. Also, straighten arms in front of body with slight bend.','Lean body forward while maintaining small bend in hip. Allow arms to bend forward to sides of head. Bend over as far as possible. Raise body back up by pulling arms back until kneeling upright in original position. Repeat.','upload/exercise-picture/STKneelingRollout.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(499,'Suspended Self-assisted Pull-up','Stand facing suspension handles placed at neck height. Grasp handles and position feet forward on floor, slightly in front of handles.','Lower body under handles until arms and shoulders are fully extended. If necessary, use minimal assistance of lower body to control descent, allowing knees and hips to bend, keeping flat on floor. Pull body up until chin is just above handles, again with minimal assistance from legs. Repeat.','upload/exercise-picture/STSelfAssistedPullup.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(500,'Bar Lat Stretch','Standing distance facing bar approximately lower chest height. Grasp bar with both hands. Lean body forward so bar is behind/under bar and arms are to sides of head. Feet are keep away from bar.','Allow upper body to hang downward while keeping arms to sides of head. Hold stretch.','upload/exercise-picture/01d980e27b31196413c44429d1bf8e00.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(501,'Suspended Pull-up','Grasp high suspension handles.','Pull body up until neck reaches height of hands. Lower body until arms and shoulders are fully extended. Repeat.','upload/exercise-picture/STPullup.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(502,'Bent-over Lat Stretch (on chair or bench)','Kneel in front of chair on floor or mat. Place inside of crossed arms on end of chair and position head between arms.','Lower torso. Hold stretch.','upload/exercise-picture/Bentover.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(503,'Stability Ball Rollout','Kneel on floor or mat facing stability ball within arm\'s reach. Straighten hips with subtle bend. Also straighten arms with slight bend, down in front of body. Place fists side by side on upper side of ball closest to hips.','Lean forward and roll ridged arms out over ball. Roll forward as far as possible. Raise body back up by pulling arms back until kneeling upright in original position. Repeat.','upload/exercise-picture/BWRolloutBall.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(504,'Lever Lat Stretch','Sit on seat in forward position with lower legs on shin pad, feet on foot rest. Place hands through wrist straps. Hold upper bar with underhand grip.','Push and lower seat back. Hold stretch.','upload/exercise-picture/PCUnderhand8.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(505,'Bent-over Lat Stretch','Kneel on mat or floor. Extend arms well beyond knees and place forearms on floor.','Lower torso as far down as possible and sit back. Hold stretch.','upload/exercise-picture/BentoverFloorLat.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(506,'Overhead Lat Stretch','Put one arm overhead. Grasp elbow or wrist overhead with other hand.','Pull elbow toward head and back or pull arm down toward opposite shoulder. Lean torso to side, away from direction of arm behind head. Hold stretch. Repeat with opposite arm.','upload/exercise-picture/StandingSideBendLat.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(507,'Seated Side Reach Lat Stretch','Sit on bench or floor. Place one arm down to side on bench or floor, slightly behind for support. Put opposite arm overhead.','Lean and reach to side away from raised arm. Hold stretch. Repeat with opposite arm.','upload/exercise-picture/524bb061bc1d45f04e9d210ca87e864b.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(508,'Standing Side Reach Lat Stretch','Stand with feet far apart. Place one arm on side of thigh. Put opposite arm overhead.','Lean and reach to side away from raised arm. Hold stretch. Repeat with opposite arm.','upload/exercise-picture/7926682b1fd64e1118a13f8b734fecef.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(509,'Wall Lat Stretch','Standing toward wall. Bend over and place palms of hands on wall, approximately shoulder width and waist height.','Lower torso. Hold stretch.','upload/exercise-picture/8ba64011570f73050fcd1c3d26fe4b02.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(510,'PNF Overhead Lat Stretch','Instruct participant to stand or sit on floor, chair, or bench and place arm overhead. Standing behind participant, grasp their wrist and position their forearm behind their head.','Pull participant\'s wrist toward back of shoulder. Lean torso to side, away from direction of arm behind head. Hold stretch. Repeat with opposite arm.','upload/exercise-picture/af32125548f8472201151459ae3d6336.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(511,'Cambered Barbell Seated Shrug','Sit on end of bench and grasp cambered bar from beneath with overhand or mixed grip.','Elevate shoulders as high as possible. Lower and repeat.','upload/exercise-picture/CMBSeatedShrug.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(512,'Trap Bar Shrug','Step into trap barbell and stand holding handles of trap bar to sides.','Elevate shoulders as high as possible. Lower and repeat.','upload/exercise-picture/TBShrug.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(513,'Cable Bar Shrug','Position adjustable pulleys at low position. Stand close to cable bar and grasp with shoulder width or slightly wider overhand grip.','Elevate shoulders as high as possible. Lower and repeat.','upload/exercise-picture/CBBarShrug.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(514,'Barbell Shrug','Stand holding barbell with overhand or mixed grip; shoulder width or slightly wider.','Elevate shoulders as high as possible. Lower and repeat.','upload/exercise-picture/BBShrug.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(515,'Trap Bar Shrug (elevated stand)','Step into elevated trap bar stand. Bend down and grasp handles of apparatus to sides. Stand upright.','Elevate shoulders as high as possible. Lower and repeat.','upload/exercise-picture/SBShrugStand.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(516,'Cable Shrug (with stirrups)','Stand between two low pulleys and grasp stirrups to each side. Stand upright with arms straight down to each side.','With arms straight, elevate shoulders as high as possible. Lower and repeat.','upload/exercise-picture/CBShrugStirrups.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(517,'Cable Shrug','Stand facing low pulley and grasp cable bar with shoulder width or slightly wider overhand grip. Stand close to pulley.','With arms straight, elevate shoulders as high as possible. Lower and repeat.','upload/exercise-picture/CBShrug.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(518,'Cable One Arm Shrug','Grasp stirrup with one hand and stand close to low pulley to side.','With arms straight, elevate shoulder as high as possible. Lower and repeat.','upload/exercise-picture/CBOneArmShrug.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(519,'Dumbbell Shrug','Stand holding dumbbells to sides.','Elevate shoulders as high as possible. Lower and repeat.','upload/exercise-picture/DBShrug.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(520,'Cable Shrug (dual pulley)','Stand between two low pulleys and grasp stirrups to each side. Stand upright with arms straight down to each side.','With arms straight, elevate shoulders as high as possible. Lower and repeat.','upload/exercise-picture/CBShrugDualPulley.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(521,'Lever Gripless Shrug (plate loaded)','Stand with shoulders under padded lever.','Elevate shoulders as high as possible. Lower and repeat.','upload/exercise-picture/LVGriplessShrugPL.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(522,'Lever Narrow Grip Shrug (plate loaded)','Stand very near to close lever handles. Bend over and grasp handles with each hand. Stand upright.','Elevate shoulders as high as possible. Lower and repeat.','upload/exercise-picture/LVShrugNarrow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(523,'Lever Shrug (plate loaded)','Stand between lever handles to sides. Squat down with feet flat on floor and grasp upper handles to sides. Stand upright by extending hips and knees to full extension.','Elevate shoulders as high as possible. Lower and repeat.','upload/exercise-picture/LVShrugH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(524,'Lever Seated Gripless Shrug','Sit on seat and place forearms in padded bars.','Elevate shoulders as high as possible. Lower and repeat.','upload/exercise-picture/LVSeatedGriplessShrug.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(525,'Lever Barbell Shrug (plate loaded)','Stand behind bar mid-thigh height. Stand grasping bar with shoulder width or slightly wider overhand grip. Disengage bar by rotating bar back and stand upright.','Elevate shoulders as high as possible. Lower and repeat.','upload/exercise-picture/LVSMShrug.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(526,'Lever Shrug','Stand holding lever bar with shoulder width overhand or mixed grip.','Elevate shoulders as high as possible. Lower and repeat.','upload/exercise-picture/LVShrug.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(527,'Smith Shrug','Stand grasping smith bar with shoulder width or slightly wider overhand grip. Disengage bar by rotating bar back.','Elevate shoulders as high as possible. Lower and repeat.','upload/exercise-picture/SMShrug.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(528,'Lever Seated Shrug (plate loaded)','Sit on bench and grasp lower handles to each side. Sit upright.','Elevate shoulders as high as possible. Lower and repeat.','upload/exercise-picture/LVSeatedShrugH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(529,'Inverted Shrug (on parallel bars)','Stand between parallel bars. Squat down and grasp parallel bars from above. Kick legs up inverting and balancing body upside down. Legs can be kept bent or straight, positioned vertically.','Raise body up a high as possible by pulling shoulders toward ears. Lower body to original position and repeat.','upload/exercise-picture/BWBentKneeInvertedShrug.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(530,'Sled Gripless Shrug','Stand with shoulders under padded bar.','Elevate shoulders as high as possible. Lower and repeat.','upload/exercise-picture/SLGriplessShrug.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(531,'Lever Gripless Shrug','Stand with shoulders under padded lever.','Elevate shoulders as high as possible. Lower and repeat.','upload/exercise-picture/LVGriplessShrug.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(532,'Upper Trapezius Stretch','Grasp wrist or hand from behind and pull arm to opposite side','Tilt head away from lowered shoulder by positioning ear toward front of opposite shoulder. Hold stretch. Repeat to other side.','upload/exercise-picture/90b391614b804836394c8232d1f1bc8b.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(533,'Suspended Inverted Shrug','Grasp gymnastics rings, one in each hand. Sit on mat between parallel bars. Kick legs up inverting and balancing body upside down.','Raise body up a high as possible by pulling shoulders toward ears. Lower body to original position and repeat.','upload/exercise-picture/BWInvertedShrugsRings.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(534,'Fixed Bar Rhomboids Stretch','Stand facing very close to stationary bar. Grasp stationary bar with both hands just below chest height.','Lean back allowing body and hips to fall back and shoulders to be pulled forward. Hold stretch.','upload/exercise-picture/d3bb866a867c108318859f20ac343f44.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(535,'Hugging Stretch','Cross both arms and place both hands behind shoulders of opposite arms.','Bring elbows closer together in front of body. Raise elbows slightly and hold stretch.','upload/exercise-picture/247d61a1ccbd2df25a96521b4a9f1d46.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(536,'Dumbbell Seated Shoulder External Rotation','Sit on bench. Place foot on other side of bench and other foot on floor with knees bent. Place upper elbow on knee with dumbbell positioned above knee.','Lower dumbbell downward toward lower leg by rotating shoulder until slight stretch is felt. Return and repeat. Continue with opposite arm.','upload/exercise-picture/DBSeatedShoulderExternalRotation.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(537,'Cable Seated Shoulder External Rotation','Sit with side to low pulley. Grasp dumbbell cable attachment with far arm. Position elbow against side and forearm across belly.','Pull cable attachment away from body by externally rotating shoulder. Return and repeat. Turn around and continue with opposite arm.','upload/exercise-picture/CBSeatedExternalRotation.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(538,'Dumbbell Lying Shoulder External Rotation','Lie on side with legs separated for support. Grasp dumbbell and position elbow against side and forearm across belly.','Lift dumbbell by rotating shoulder. Return and repeat. Flip over and continue with opposite arm.','upload/exercise-picture/DBLyingExternalRotation.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(539,'Dumbbell Incline Shoulder External Rotation','Lie high up on low incline bench or reverse on decline bench on side with arm pit over leg pad (as demonstrated). Position legs lower on bench for support. Grasp dumbbell and position elbow against side and forearm across belly.','Lift dumbbell upright above elbow by rotating shoulder. Return and repeat. Flip body over and continue with opposite arm.','upload/exercise-picture/DBExternalRotationDecline.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(540,'Cable Upright Shoulder External Rotation','Stand facing low to medium height cable pulley. Grasp stirrup attachment and position bent elbow shoulder height out to side with forearm in line with cable.','Pull stirrup up and back as far as possible. Return by lowering stirrup to original position. Repeat. Continue with opposite arm.','upload/exercise-picture/CBExternalShoulderRotation2.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(541,'Dumbbell Upright Shoulder External Rotation','Stand or sit with dumbbell positioned out to side of head; bend elbow, shoulder height with dumbbell above elbow.','Lower dumbbell forward by rotating shoulder. Return and repeat. Continue with opposite arm.','upload/exercise-picture/DBUprightShoulderExtRotation.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(542,'Cable Standing Shoulder External Rotation','Stand with side to elbow height cable pulley. Grasp stirrup attachment with far arm. Position elbow against side and forearm across belly.','Pull cable attachment away from body as far as possible by externally rotating shoulder. Return and repeat. Turn around and continue with opposite arm.','upload/exercise-picture/CBStandingExternalRotation.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(543,'Lever Shoulder External Rotation','Place elbow on forearm pad and grasp handle with upper arm to side of body and forearm against body.','Pull lever away from body. Return and repeat. Adjust lever to opposite side and repeat with other arm.','upload/exercise-picture/LVShoulderExternalRotation.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(544,'Dumbbell Upright Shoulder External Rotation (with support)','Stand or sit with side against chest height platform. With dumbbell in hand, position upper arm horizontally on platform, elbow bent so forearm is upright.','Lower dumbbell forward by rotating shoulder. Return and repeat. Continue with opposite arm.','upload/exercise-picture/DBStandingExternalRotationSupport.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(545,'Lever Upright Shoulder External Rotation','Lever should be forward with lever handle down. Push elbow pad forward with forearm, grasp handle with overhand grip. Sit on seat with arm pads and lever to side and position in elbow pad at shoulder height. With opposite hand, grasp seat handle if available, for added stability.','Pull lever handle upward and back as far as possible by rotating upper arm. Lower lever to original position. Repeat. Continue with opposite arm.','upload/exercise-picture/LVUprightExternalRotation.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(546,'Lever Shoulder External Rotation (plate loaded)','Lie supine on section of bench nearest pads to each side. Position body so shoulders and elbows are aligned to fulcrum on each side. Place wrists or back of hands on under upper set of pads to each side.','Pull both lever arms back and down as far as possible to each side of head by simultaneously rotating upper arms. Lower lever arms to original position and repeat.','upload/exercise-picture/LVShoulderExternalRotationPL.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(547,'Side Lying Infraspinatus Stretch','Lie supine on mat or floor with knees bent approximately 90 degrees. Position hand under side of waist, palm down.','Allow legs and hips to fall to side of positioned arm. Hold stretch. Repeat on opposite side.','upload/exercise-picture/e83cc4e80c252e68fe01e3d0a4891143.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(548,'Seated Bent-over Infraspinatus Stretch','Sit on bench or chair. Place both hands on waist with thumbs facing forward. Lean over and rest torso on thighs.','Allow elbows to fall downward toward floor. Hold stretch.','upload/exercise-picture/681599629550fe54ecfdc24bff39e6db.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(549,'Bent-over Infraspinatus Stretch','Place both hands on waist with thumbs facing forward. Bend over so torso is parallel to floor.','Allow elbows to fall downward toward floor. Hold stretch .','upload/exercise-picture/af975066da66427c3e87e4ed52c67e18.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(550,'Side Lying Teres Minor Stretch','Lie down on side on mat or floor. Position arm on floor with bent elbow positioned forward on mat and hand above elbow. With other hand, grasp back of wrist.','Keeping elbow bend at a right angle, push forearm downward toward floor. Hold stretch. Repeat on opposite side.','upload/exercise-picture/ae28a6393c675efab53e9fbae0240a63.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(551,'Broom Stick Infraspinatus Stretch','Grasp pole at one end and position overhead with other end of pole behind opposite arm. Grasp other end of pole with hand positioned below elbow. Position elbow at height of shoulder.','Pull upper end of pole forward so shoulder is internally rotated. Hold stretch. Repeat with opposite arm.','upload/exercise-picture/f9fdd43b88238a8e619a6d655b251781.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(552,'Suspended Shoulder External Rotation','Grasp suspension handles and position bent elbows to each sides of waist.','Pull handles apart from each side, while keeping fixed elbow position and body and legs straight throughout movement. Raise forward so handles are to each side of body. Return back until handles come back together in front of body. Repeat.','upload/exercise-picture/STShoulderExternalRotation.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(553,'Dumbbell Shoulder Internal Rotation (on floor)','Hold dumbbell in one hand. Lie on mat with dumbbell in hand. Position upper arm on mat close to body. Bend elbow approximately 90° with dumbbell held upright above elbow.','Maintaining 90° bend in elbow, lower dumbbell toward floor until slight stretch is felt in shoulder. Lift dumbbell toward body by internally rotating shoulder until forearm is vertical and repeat. Continue with opposite arm.','upload/exercise-picture/DBInternalRotationFloor.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(554,'Cable Standing Shoulder Internal Rotation','Stand with side to elbow height cable pulley. Grasp cable stirrup with near arm. Position elbow against side with elbow bent approximately 90°.','Pull cable stirrup toward body by internally rotating shoulder until forearm is across belly. Return and repeat. Continue with opposite arm.','upload/exercise-picture/CBStandingInternalRotation.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(555,'Dumbbell Shoulder Internal Rotation (on bench)','Hold dumbbell in one hand. Lie on bench close to edge on side with dumbbell in hand. Position elbow on edge of bench against side of body with elbow bent approximately 90°. Position legs on bench for support.','Maintaining 90° bend in elbow, lower dumbbell away from body until slight stretch is felt in shoulder. Lift dumbbell toward body by internally rotating shoulder until forearm is across belly. Continue with opposite arm.','upload/exercise-picture/DBInternalRotation.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(556,'Lever Shoulder Internal Rotation','Place elbow on forearm pad and grasp handle with upper arm to side of body and forearm away from body.','Pull lever toward from body. Return and repeat. Adjust lever to opposite side and repeat with other arm.','upload/exercise-picture/LVShoulderInternalRotation.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(557,'Cable Seated Shoulder Internal Rotation','Sit with side to low pulley. Grasp cable stirrup with near arm. Position elbow against side with elbow bent approximately 90°.','Pull cable stirrup toward body by internally rotating shoulder until forearm is across belly. Return and repeat. Continue with opposite arm.','upload/exercise-picture/CBInternalRotation.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(558,'Lever Shoulder Internal Rotation (plate loaded)','Lie supine on section of bench furthest away from pads to each side. Position body so shoulders and elbows are aligned to fulcrum on each side. Place wrists or hands on under lower set of pads to each side of head.','Pull lever arms upward and toward each side of torso as far as possible by simultaneously rotating upper arms. Lower lever arms to original position and repeat.','upload/exercise-picture/LVShoulderInternalRotationPL.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(559,'Doorway Subscapularis Stretch','Stand at end of wall or in doorway facing perpendicular to wall. Bent elbow and place inside of forearm on surface of wall. Position bent elbow just below height of shoulder. Place far leg forward and near leg back.','Bent over at hip while bending knees slightly. Hold stretch . Repeat with opposite arm.','upload/exercise-picture/7e7c92a3099c3dc0c2eb456ebadd0a5e.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(560,'Broom Stick Subscapularis Stretch','Grasp end of pole to side of head with other end of pole behind arm. Bring elbow forward slightly and bend wrist back. Reach around body with opposite arm and grasp lower end of pole. Place pole in middle of back side of upper arm. Position elbow at height of shoulder.','Pull lower end of pole forward so shoulder is externally rotated.. Hold stretch. Repeat with opposite arm.','upload/exercise-picture/04ab06bb0ae4639867ed65834a7aff6a.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(561,'Lever Upright Shoulder Internal Rotation','Primary lever should be positioned back with lever handle resting forward on elbow pad. Lift lever handle and sit on seat with arm pads and lever to side. Place elbow in elbow pads at shoulder height and grip handle with over hand grip so forearm is orientated upward and back. With opposite hand, grasp seat handle if available, for added stability.','Pull lever handle forward and downward as far as possible by rotating upper arm. Allow lever to return to original position. Repeat. Continue with opposite arm.','upload/exercise-picture/LVUprightInternalRotation.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(562,'Machine-assisted Chest Dip','Mount wide dip bar with oblique grip (bar diagonal under palm), arms straight with shoulders above hands. Step down onto assistance lever with hips and knees bent.','Lower body by bending arms, allowing elbows to flare out to sides. When slight stretch is felt in chest or shoulders, push body up until arms are straight. Repeat.','upload/exercise-picture/AsChestDip.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(563,'Machine-assisted Chest Dip (kneeling)','Mount wide dip bar with oblique grip (bar diagonal under palm), arms straight with shoulders above hands. Kneel on padded platform, lowering it down slightly so hips are slightly bent.','Lower body by bending arms, allowing elbows to flare out to sides. When slight stretch is felt in chest or shoulders push body up until arms are straight. Repeat.','upload/exercise-picture/ASChestDipKneeling.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(564,'Barbell Board Press','Lie supine on bench. Grasp bar with overhand and slightly wider than shoulder width grip. Arch back, extend hips, and position feet back flat on floor. Dismount barbell from rack over chest. Have assistant hold board on center of chest.','Lower weight toward lower chest on\n\n\nto board. Press bar upward until arms are extended. Repeat.','upload/exercise-picture/BBBoardPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(565,'Barbell Guillotine Bench Press','Lie supine on bench. Dismount barbell from rack over upper chest using wide oblique overhand grip.','Lower weight to neck to upper chest. Upper arms will be perpendicular to torso. Press bar until arms are extended. Repeat.','upload/exercise-picture/BBBenchPressGuillotine.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(566,'Barbell Bench Press (power lift)','Lie supine on bench. Grasp bar with overhand and slightly wider than shoulder width grip. Arch back, extend hips, and position feet back flat on floor. Dismount barbell from rack over chest.','Lower weight to lower chest. Press bar upward until arms are extended. Repeat.','upload/exercise-picture/BBBenchPressPowerlift.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(567,'Barbell Bench Press','Lie supine on bench. Dismount barbell from rack over upper chest using wide oblique overhand grip.','Lower weight to chest. Press bar upward until arms are extended. Repeat.','upload/exercise-picture/BBBenchPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(568,'Barbell Floor Press','Lie supine on floor at base of power rack. Place feet on floor with knees bent. Grasp bar from rack with overhand and slightly wider than shoulder width grip. Dismount barbell from rack over chest.','Lower weight to lower chest until the triceps are completely on the floor. Relax momentarily, then press bar upward until arms are extended. Repeat.','upload/exercise-picture/BBFloorPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(569,'Barbell Decline Bench Press','Lie supine on decline bench with feet under leg brace. Dismount barbell from rack over chest using wide oblique overhand grip.','Lower weight to chest. Press bar until arms are extended. Repeat.','upload/exercise-picture/BBDeclineBenchPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(570,'Cable Chest Dip','Step between wide dip bars with dip belt around waist. Kneel as close as possible to low pulley and attach cable to dip belt. Stand up and mount dip bar with oblique grip (bar diagonal under palm), arms straight with shoulders above hands. Keep hips and knees bent.','Lower body by bending arms, allowing elbows to flare out to sides. When slight stretch is felt in chest or shoulders, push body up until arms are straight and repeat.','upload/exercise-picture/CBChestDip.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(571,'Cable Decline Fly','Grasp two opposing high pulley dumbbell attachments. Lie supine on decline bench, in middle and perpendicular to both pulleys. Slightly bend elbows and internally rotate shoulders so elbows are back.','Bring cable stirrups together above upper abdomen in hugging motion; elbows in fixed position and shoulders internally rotated so elbows are to sides. Return to starting position until chest is slightly stretched. Repeat.','upload/exercise-picture/CBDeclineFly.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(572,'Barbell Bench Press (with chains)','Lie supine on bench. Grasp barbell loaded with thick chains from each side, with overhand and slightly wider than shoulder width grip. Dismount barbell from rack over chest.','Lower weight to chest. Press bar upward until arms are extended. Repeat.','upload/exercise-picture/BBBenchPressChain.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(573,'Cable Seated Fly','Sit on seat and grasp stirrups to each side. Slightly bend elbows and internally rotate shoulders so elbows are back.','Keeping elbows pointed high, bring cable attachments together in hugging motion with elbows in fixed position. Return to starting position until slight stretch. Repeat.','upload/exercise-picture/CBSeatedFly.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(574,'Cable Lying Fly','Grasp two opposing low pulley stirrup attachments. Lie supine on bench, in middle and perpendicular to both pulleys. Slightly bend elbows and internally rotate shoulders so elbows are back.','Bring cable attachments together in hugging motion with elbows in fixed position and shoulders internally rotated so elbows are to sides. Return to starting position until slight stretch. Repeat.','upload/exercise-picture/CBLyingFly.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(575,'Cable Bench Press','Lie on bench and grasp stirrups attached to low cable pulley on each side. Position stirrups out to each side of chest with bent arm under each wrist.','Push stirrups up over each shoulder until arms are straight and parallel to one another. Return stirrups to original position, until slight stretch is felt in shoulders or chest. Repeat.','upload/exercise-picture/CBBenchPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(576,'Cable Standing Fly','Grasp two opposing high pulley dumbbell attachments. Stand with pulleys to each side. Bend over slightly by flexing hips and knees. Bend elbows slightly and internally rotate shoulders so elbows are back initially.','Bring cable attachments together in hugging motion with elbows in fixed position. Keep shoulders internally rotated so elbows are pointed upward at top and out to sides at bottom. Return to starting position until chest muscles are stretched. Repeat.','upload/exercise-picture/CBStandingFly.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(577,'Cable One Arm Chest Press','Sit on seat and grasp stirrup to one side. Position elbows out to side, slightly lower than shoulder height. Position hand slightly narrower than elbow width in front of upper arm.','Push stirrups out straight in front of shoulder until arm is straight. Return stirrups to original position until slight stretch is felt through shoulder or chest. Repeat.','upload/exercise-picture/CBOneArmChestPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(578,'Cable Bar Standing Chest Press','Stand facing behind cable bar, mounted on each side to shoulder height narrow double pulley cables. Grasp cable bar with wide overhand grip. Position bar chest height with elbows angled behind. Lean and step forward with one foot in front, bending forward leg.','Push cable bar forward until arms are straight. Return cable bar to original position until slight stretch is felt in chest or shoulders. Repeat.','upload/exercise-picture/CBBarStandingChestPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(579,'Cable Twisting Chest Press','Sit on seat and grasp stirrup to one side. Position elbow out to side, slightly lower than shoulder height. Position hand slightly narrower than elbow width, in front of upper arm. Lean forward in seat.','Push stirrup out in front of upper chest while turning torso away from pulley. Return stirrup and torso back to original position allowing torso to rotate back until slight stretch is felt through chest, shoulder or waist. Repeat.','upload/exercise-picture/CBTwistingChestPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(580,'Cable Bar Bench Press','Position adjustable pulley higher than intended height but within arms reach from bench. Position bench under cable bar. Lie supine on bench. While lying on bench, reach over and lower each pulley into intended position so that cables are taut in lowest position with bar on chest. Grasp bar with both hands using wide oblique overhand grip.','Press bar upward until arms are extended. Lower bar to chest or until slight stretch is felt in shoulders. Repeat.','upload/exercise-picture/CBBarBenchPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(581,'Cable Chest Press','Sit on seat and grasp stirrups to each side. Position elbows out to sides, slightly lower than shoulder height. Position hands slightly narrower than elbow width in front of upper arms.','Push stirrups out straight until arms are straight and parallel to one another. Return stirrups to original position, until slight stretch is felt in shoulders or chest. Repeat.','upload/exercise-picture/CBChestPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(582,'Cable Standing Chest Press','Stand between two shoulder height pulleys, facing away from cable columns. Grasp cable stirrups from each side. Position stirrups to sides of chest with elbows out to sides. Position forearms horizontally and parallel with hands elbow width. Step forward in lunging posture (one foot in front and other foot behind). Lean and step forward with one foot in front, bending forward leg.','Push stirrups forward until arms are straight and parallel to one another. Return stirrups to original position until slight stretch is felt in chest or shoulders. Repeat.','upload/exercise-picture/CBStandingChestPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(583,'Dumbbell Bench Press','Sit down on bench with dumbbells resting on lower thigh. Kick weights to shoulder and lie back. Position dumbbells to sides of chest with bent arm under each dumbbell.','Press dumbbells up with elbows to sides until arms are extended. Lower weight to sides of chest until slight stretch is felt in chest or shoulder. Repeat.','upload/exercise-picture/DBBenchPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(584,'Cable Decline Chest Press','Sit on seat and grasp stirrups to each side. Position elbows out to sides, slightly lower than shoulder height. Position hands slightly narrower than elbow width in front of upper arms.','Push stirrups forward and slightly downward until arms are straight and parallel to one another. Return stirrups to original position, until slight stretch is felt in shoulders or chest. Repeat.','upload/exercise-picture/CBDeclineChestPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(585,'Cable Twisting Standing Chest Press','Grasp cable stirrup from chest height pulley. Turn body away from pulley. Position elbow of loaded arm out to side, lower chest height. Position loaded hand back approximately shoulder height and elbow width. Step far forward with foot of opposite side of loaded arm. Bend knees and position heel off rear foot off floor.','Push stirrups away from body, horizontally until arm is straight and inline with cable. Return stirrups to original position until slight stretch is felt in chest or shoulder. Repeat. Continue with opposite arm.','upload/exercise-picture/CBStandingTwistingChestPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(586,'Cable Standing Decline Chest Press','Stand between two high pulleys, facing away from cable columns. Grasp cable stirrups from each side. Position stirrups down to sides of lower chest with elbows high out to sides. Angle forearms downward with hands elbow width or slightly narrower. Lean and step forward with forward leg bent or stand feet side by side with both legs slightly bent (as shown).','Push stirrups at forward/downward angle until arms are straight and parallel to one another. Return stirrups to original position until slight stretch is felt in chest or shoulders. Repeat.','upload/exercise-picture/CBStandingDeclinePress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(587,'Cable Bar Standing Decline Chest Press','Stand facing behind cable bar mounted on each side to shoulder height narrow double pulley cables. Grasp cable bar with wide overhand grip. Position bar\n\n\nchest height with elbows angled behind and above. Lean and step forward with one foot in front, bending forward knee.','Push cable bar forward and downward until bar is about hip height and arms are straight. Return cable bar to original position until slight stretch is felt in chest or shoulders. Repeat.','upload/exercise-picture/CBBarStandingDeclineChestPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(588,'Dumbbell Decline Bench Press','Sit down on decline bench with feet under leg brace and dumbbells resting on thigh. Lie back with dumbbells. Position dumbbells to sides of chest with bent arm under each dumbbell.','Press dumbbells up with elbows to sides until arms are extended. Lower weight to sides of chest until slight stretch is felt in chest or shoulder. Repeat.','upload/exercise-picture/DBDeclineBenchPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(589,'Dumbbell Decline Fly','Grasp two dumbbells. Lie supine on decline bench. Support dumbbells above upper abdomen with arms fixed in slightly bent position. Internally rotate shoulders so elbows are to sides.','Lower dumbbells to sides until chest muscles are stretched with elbows fixed. Bring dumbbells together in wide hugging motion until dumbbells are nearly together. Repeat.','upload/exercise-picture/DBDeclineFly.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(590,'Dumbbell Pullover (on apparatus)','Sit on lower pad with back against upper pad, facing dumbbell in rack. Position feet under padded bars. Grasp dumbbell by handle with both hands. Pull top of dumbbell to chest. Push dumbbell up over chest with both hands under inner plate of dumbbell. Raise hips up from pad and recline torso back so chest faces upward. Keep hips and elbows slightly bent.','Keeping elbows slightly bent throughout movement, lower dumbbell over and beyond head until upper arms are in-line with torso. Pull dumbbell up and over chest. Repeat.','upload/exercise-picture/DBPulloverBench.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(591,'Dumbbell Fly','Grasp two dumbbells. Lie supine on bench. Support dumbbells above chest with arms fixed in slightly bent position. Internally rotate shoulders so elbows point out to sides.','Lower dumbbells to sides until chest muscles are stretched with elbows fixed in slightly bent position. Bring dumbbells together in wide hugging motion until dumbbells are nearly together. Repeat.','upload/exercise-picture/DBFly.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(592,'Dumbbell Pullover','Lie on upper back perpendicular to bench. Flex hips slightly. Grasp one dumbbell from behind or from side with both hands under inner plate of dumbbell. Position dumbbell over chest with elbows slightly bent.','Keeping elbows slightly bent throughout movement, lower dumbbell over and beyond head until upper arms are in-line with torso. Pull dumbbell up and over chest. Repeat.','upload/exercise-picture/DBPullover.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(593,'Lever Barbell Bench Press (plate loaded)','Lie supine on bench with upper chest under bar. Grasp bar with wide oblique overhand grip. Disengage bar by rotating bar.','Lower weight to chest. Press bar until arms are extended. Repeat.','upload/exercise-picture/LVSMBenchPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(594,'Lever Decline Chest Press (plate loaded)','Sit on seat with handles lower chest height. Grasp handle with wide overhand grip; elbows out to sides just below shoulders.','Press lever until arms are extended. Return weight until chest muscles are slightly stretched. Repeat.','upload/exercise-picture/LVDeclineChestPressHighH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(595,'Lever Chest Press (plate loaded)','Sit on seat with chest approximately height of handles. Grasp handles with wide overhand grip; elbows out to sides just below shoulders.','Press levers until arms are extended. Return weight until chest muscles are slightly stretched. Repeat.','upload/exercise-picture/LVChestPressH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(596,'Dumbbell Pullover (on arched bench)','Sit on seat of arched bench with dumbbell on lower thigh. Kick dumbbell up to shoulder while lying back on bench. Grasp both hands under inner plate of dumbbell. Position dumbbell over chest with elbows slightly bent.','Keeping elbows slightly bent throughout movement, lower dumbbell over and beyond head until upper arms are in-line with torso. Pull dumbbell up and over chest. Repeat.','upload/exercise-picture/DBPulloverArchedBench.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(597,'Lever Bench Press (plate loaded)','Lie supine on bench with chest under lever bar. Grasp lever bar with wide oblique overhand grip.','Press bar until arms are extended. Lower weight to upper chest. Repeat.','upload/exercise-picture/LVBenchPressH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(598,'Lever Chest Dip (plate loaded)','Sit on seat and grasp handles with oblique grip. If possible, place handles in wide position. Lean forward slightly.','Push lever down with elbows away from body. Return until chest is slightly stretched. Repeat.','upload/exercise-picture/LVChestDipH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(599,'Lever Chest Dip','If possible, place handles in wide position. Sit on seat and grasp handles with oblique grip. Lean forward slightly and allow elbows to flare out.','Push lever down by straightening arms. Return lever up with elbows flaring out until chest is slightly stretched. Repeat.','upload/exercise-picture/LVChestDip.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(602,'Lever Wide Grip Chest Press (plate loaded)','Sit on seat with chest approximately height of handles. Grasp handles with wide overhand grip and elbows out to sides.','Press lever until arms are extended. Return weight until chest muscles are slightly stretched. Repeat.','upload/exercise-picture/LVWideGripChestPressSeatLowH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(603,'Lever Decline Pec Deck Fly','Sit on machine with back on pad. If available, push foot lever until padded lever moves forward. Place forearms on padded lever. Position upper arms approximately parallel. Release foot lever.','Push levers together. Return until chest muscles are stretched. Repeat.','upload/exercise-picture/LVDeclineFly.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(604,'Lever Pec Deck Fly','Sit on machine with back on pad. If available, push foot lever until padded lever moves forward. Place forearms on padded lever. Position upper arms approximately parallel. Release foot lever.','Push levers together. Return until chest muscles are stretched. Repeat.','upload/exercise-picture/LVFly.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(605,'Lever Bent-over Fly (on iron cross machine)','Stand on platform in front of Lever Iron Cross Machine. Grasp handles to each side. Bend over at hips with knees and elbows bent slightly. Internally rotate shoulders so elbows are pointing upward.','Bring lever handles together in hugging motion with elbows in fixed position. Keep shoulders internally rotated so elbows are pointed upward at top and out to sides at bottom. Return to starting position until chest muscles are stretched. Repeat.','upload/exercise-picture/LVBentOverFly.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(606,'Lever Seated Decline Fly (gripless)','Sit on seat with back against seat. Position both arms over back of padded levers. Slightly bend elbows and internally rotate shoulders, wrists are slightly lower than elbows.','Bring padded levers together by pushing pads forward and downward in hugging motion. Return to starting position until chests muscle are stretched. Repeat.','upload/exercise-picture/LVSeatedDeclineFly.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(607,'Lever Seated Iron Cross Fly','Straddle seat with both levers positioned slightly above horizontal. Grasp both lever ends with elbows slightly above levers. Sit down near end of seat with torso leaning\n\nforward\n\nslightly and slightly bent elbows pointing back.','Push levers downward and together in hugging motion. Keep shoulders internally rotated so elbows are pointed slightly upward at top and out to sides at bottom. Return to starting position until chest muscles are stretched. Repeat.','upload/exercise-picture/LVSeatedFlyIronCross.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(608,'Lever Seated Fly (gripless)','Sit on seat with back against pad and feet on foot bar. Position both arms behind padded levers. Slightly bend elbows and internally rotate shoulders so elbows are pointed back.','Bring padded levers forward and together in hugging motion. Return to starting position until stretch in chests or shoulder is felt. Repeat.','upload/exercise-picture/LVSeatedFlyGripless.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(609,'Lever Seated Fly','Sit on machine with back on pad. Grasp handles to both sides, shoulder height. Slightly bend elbows and internally rotate shoulders so elbows are back.','Keeping elbows pointed high, push lever handles forward and together. Return to back toward original position until mild stretch is felt in chest or shoulder. Repeat.','upload/exercise-picture/LVSeatedFly2.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(611,'Lever Lying Fly','Lie supine on bench. Position both arms under padded levers. Slightly bend elbows and internally rotate shoulders so elbows are back.','Bring padded levers upward and together in hugging motion. Return to starting position until chest muscles are stretched. Repeat.','upload/exercise-picture/LVLyingFly.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(612,'Lever Bench Press','Lie supine on bench with chest under lever bar. Grasp lever bar with wide oblique overhand grip.','Press bar until arms are extended. Lower weight to upp\n\n\ner chest. Repeat.','upload/exercise-picture/LVBenchPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(613,'Lever Alternating Chest Press','Sit on seat with lever grips lower chest height. Grasp grips with wide overhand grip; elbows out to sides just below shoulders.','Press one lever until arm is extended. Return lever back until chest muscle is slightly stretched. Repeat with opposite arm, alternating between sides.','upload/exercise-picture/LVAlternatingChestPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(614,'Lever Decline Chest Press','Sit on seat with lever grips lower chest height. Grasp grips with wide overhand grip; elbows out to sides just below shoulders.','Press lever until arms are extended. Return weight until chest muscles are slightly stretched. Repeat.','upload/exercise-picture/LVDeclineChestPress2.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(615,'Lever Chest Press','Sit on seat with chest approximately height of horizontal handles. If available, push foot lever until lever is within grasping range. Grasp handles with wide overhand grip; elbows out to sides just below shoulders. Release foot lever.','Press lever until arms are extended. Return weight until chest muscles are slightly stretched. Repeat.','upload/exercise-picture/LVChestPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(617,'Lever Alternating Decline Chest Press','Sit on seat with lever grips lower chest height. Grasp grips with wide overhand grip; elbows out to sides just below shoulders.','Press one lever until arm is extended. Return lever back until chest muscle is slightly stretched. Repeat with opposite arm, alternating between sides.','upload/exercise-picture/LVAlternatingDeclineChestPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(618,'Lever Parallel Grip Chest Press','Sit on seat with sides of ribs approximately height of parallel handles. If available, push foot lever until handles are within grasping range. Grasp parallel handles. Release foot lever.','Press lever until arms are extended. Return weight until shoulders or chest feels slightly stretched. Repeat.','upload/exercise-picture/LVParallelGripBenchPressB.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(619,'Sled Horizontal Grip Standing Chest Dip','Stand between handles facing machine. Bend forward slightly and grasp transverse handles with overhand grip. Position elbows upward and outward. Bend knees just enough to raise selected weight up from remaining weight stack.','Push lever down by straightening arms. Return lever up with elbows flaring out until chest is slightly stretched. Repeat.','upload/exercise-picture/SLStandingChestDipWideHorizontalGrip.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(620,'Sled Standing Chest Dip','Stand between handles facing machine. Bend forward slightly and grasp parallel handles with oblique grip. Position elbows upward and outward. Bend knees just enough to raise selected weight up from remaining weight stack.','Push lever down by straightening arms. Return lever up with elbows flaring out until chest is slightly stretched. Repeat.','upload/exercise-picture/SLStandingChestDip.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(621,'Smith Bench Press','Lie supine on bench with chest under bar. Grasp bar with wide oblique overhand grip. Disengage bar by rotating bar back.','Lower weight to chest. Press bar until arms are extended. Repeat.','upload/exercise-picture/SMBenchPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(622,'Lever Decline Bench Press','Lie supine on decline bench with feet under leg brace and chest under lever bar. Grasp lever bar with wide oblique overhand grip.','Press bar until arms are extended. Lower weight to chest. Repeat.','upload/exercise-picture/LVDeclineBenchPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(623,'Weighted Push-up','Lie prone on floor with hands slightly wider than shoulder width. Raise body up off floor by extending arms with body straight. Partner can place weight plate(s) on back if needed.','Keeping body straight, lower body to floor by bending arms. Push body up until arms are extended. Repeat.','upload/exercise-picture/WtPushup.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(624,'Chest Dip','Mount wide dip bar with oblique grip (bar diagonal under palm), arms straight with shoulders above hands. Bend knees and hips slightly.','Lower body by bending arms, allowing elbows to flare out to sides. When slight stretch is felt in chest or shoulders, push body up until arms are straight. Repeat.','upload/exercise-picture/BWChestDip.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(625,'Band-assisted Chest Dip','Place one foot on middle of exercise band with ends looped on wide dip bars. Push band down partially by extending leg. Mount dip bar with oblique grip (bar diagonal under palm), arms straight, and shoulders above hands. Place other foot on exercise band next to other foot. Bend knees and hips slightly.','Lower body by bending arms, allowing elbows to flare out to sides. When slight stretch is felt in chest or shoulders, push body up until arms are straight. Repeat.','upload/exercise-picture/ASChestDipFootBand.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(626,'Smith Decline Bench Press','Lie supine on decline bench with feet under leg brace and chest under bar. Grasp bar with wide oblique overhand grip. Disengage bar by rotating bar back.','Lower weight to chest. Press bar until arms are extended. Repeat.','upload/exercise-picture/SMDeclineBenchPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(627,'Weighted Push-up (on handles)','Kneel before two push-up handles placed slightly wider than shoulder width apart. Grasp both handles and place feet back on floor or slightly elevated platform. Position body straight with arms extended. Partner can place weight plate(s) on back if needed.','Keeping body ridged, lower body downward by bending arms until slight stretch is felt in chest or shoulders. Push body back up until arms are extended. Repeat.','upload/exercise-picture/WTPushupHandles.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(628,'Push-up','Lie prone on floor with hands slightly wider than shoulder width. Raise body up off floor by extending arms with body straight.','Keeping body straight, lower body to floor by bending arms. Push body up until arms are extended. Repeat.','upload/exercise-picture/BWPushupWide.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(629,'Weighted Chest Dip','Place weight on dip belt around waist or place dumbbell between lower legs just above feet. Mount wide dip bar with oblique grip (bar diagonal under palm), arms straight with shoulders above hands. Keep hips and knees bent.','Lower body by bending arms, allowing elbows to flare out to sides. When slight stretch is felt in chest or shoulders, push body up until arms are straight. Repeat.','upload/exercise-picture/WTChestDip.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(630,'Chest Dip (between benches)','Stand between ends of two benches. Place hands on ends of benches with fingers off ends of benches. Grip should be somewhat wide. Position feet out in front with legs straight, heels on floor, and torso upright.','Lower body by bending arms, allowing elbows to flare out to sides. When slight stretch is felt in chest or shoulders, push body up until arms are straight. Repeat.','upload/exercise-picture/BWDoubleBenchDips.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(631,'Chest Dip (bent knees between benches)','Stand between ends of two benches. Place hands on ends of benches with fingers off ends of benches. Position feet out in front with legs bent and torso upright.','Lower body by bending arms, allowing elbows to flare out to sides. When slight stretch is felt in chest or shoulders, push body up until arms are straight. Repeat.','upload/exercise-picture/BWDoubleBenchDipsBentKnee.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(632,'Incline Push-up','Stand facing bench or sturdy elevated platform. Place hands on edge of bench or platform, slightly wider than shoulder width. Position forefoot back from bench or platform with arms and body straight. Arms should be perpendicular to body.','Keeping body straight, lower chest to edge of box or platform by bending arms. Push body up until arms are extended. Repeat.','upload/exercise-picture/BWPushupOnBox.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(633,'Suspended Chest Dip','Stand between two suspension handles and grasp handles on each side of torso. Hold position firmly and lift feet from floor.','Push body up until arms are straight. Lower body until slight stretch is felt in shoulders. Repeat.','upload/exercise-picture/STDip.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(634,'Incline Push-up (on bar)','Grasp horizontal bar (lower than chest height) with hands slightly wider than shoulder width. Position forefeet back from bar with arms and body straight. Arms should be perpendicular to body.','Keeping body straight, lower chest to bar by bending arms. Push body up until arms are extended. Repeat.','upload/exercise-picture/BWPushupOnBar.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(635,'Suspended Self-assisted Chest Dip','Stand between two suspension handles, approximately mid-thigh height. Grasp handles on each side and straighten arms with shoulders above hands. Hold position firmly and place portion of body weight on handles.','Lower body by bending arms back. If necessary, use minimal assistance of lower body to control descent, allowing knees to bend, keeping feet in contact with floor. When slight stretch is felt in chest or shoulders, push body up back up until arms are straight. Repeat with minimal assistance from legs.','upload/exercise-picture/STSelfAssistedChestDip.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(636,'Suspended Chest Press','Grasp handles and step forward between suspension trainers. Position arms downward and slightly forward, nearly parallel with suspension straps. Lean forward, placing upper body weight onto handles with arms straight, while stepping back onto forefeet so body is leaning forward at desired angle. Straighten body so torso is in-line with legs.','Lower body by bending arms while keeping body straight. Allow handles to come apart slightly to keep in-line with elbows flaring out. Stop descent once mild stretch is felt through shoulders or chest. Push body up to original position, allowing handles to travel inward to keep in line with elbows converging until arms are fully extended. Repeat.','upload/exercise-picture/STChestPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(637,'Behind Head Chest Stretch','Place hands behind head.','Pull elbows back further behind ears. Hold stretch.','upload/exercise-picture/31a7b461c0ecbd48cc96c1d82724df4e.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(638,'Self-assisted Chest Dip','Stand on bench or elevation between parallel bars. Mount wide dip bar with oblique grip (bar diagonal under palm), arms straight with shoulders above hands. Bend knees and hips slightly and place forefoot on bench or elevation below.','Lower body by bending arms, allowing elbows to flare out to sides. If necessary, use minimal assistance of lower body to control descent, allowing knees and hips to bend, keeping forefeet in contact with bench or elevation. When slight stretch is felt in chest or shoulders, push body up until arms are straight and repeat, again with minimal assistance from legs.','upload/exercise-picture/ASChestDipSelfAssisted.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(639,'Suspended Fly','Grasp handles and step forward between suspension trainer. Position arms downward and slightly forward, nearly parallel with suspension straps. Lean forward, placing upper body weight onto handles with arms straight, while stepping back onto forefeet, so body is leaning forward at desired angle. Straighten body so torso is in-line with legs. Bend elbows slightly and internally rotate shoulders, so elbows are pointed outward to each side.','Lower body by allowing suspension handles to separate outward until mild stretch is felt in chest. Reverse motion by bringing handles back together in hugging motion. Repeat.','upload/exercise-picture/STChestFly.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(640,'Push-up (on knees)','Lie prone on floor with hands slightly wider than shoulder width. Bend knees and raise body up off floor by extending arms with body straight.','Keeping body straight and knees bent, lower body to floor by bending arms. Push body up until arms are extended. Repeat.','upload/exercise-picture/BWPushupWideKnee.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(641,'Straight Arm Chest Stretch','With arm extended, position hand on fixed structure shoulder height.','Turn body away from positioned arm. Hold stretch. Repeat with opposite arm.','upload/exercise-picture/35105281f94e7095770bdd334abaf11b.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(642,'Doorway Modified Chest Stretch','Stand at end of wall or in doorway facing perpendicular to wall. Place front of shoulder and inside of bent arm on surface of wall. Position bent elbow around same height of shoulder. Position both feet back behind original stance.','Lean into wall allowing shoulder to be pushed back. Turn body away from positioned arm. Hold stretch. Repeat with opposite arm.','upload/exercise-picture/9d5fa017ad5d4a4b9ccaad68c16a6db6.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(643,'PNF Behind Head Chest Stretch','Instruct participant to sit on floor or bench and place hands behind head, facing forward. Stand behind participant and position leg behind their head. Place hands on participant\'s elbows.','Pull participant\'s elbows back. Hold stretch.','upload/exercise-picture/fd41223d6c4bf840b668fe7cd1810421.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(644,'Doorway Chest Stretch','Stand at end of wall or in doorway facing perpendicular to wall. Place inside of bent arm on surface of wall. Position bent elbow shoulder height.','Turn body away from positioned arm. Hold stretch. Repeat with opposite arm.','upload/exercise-picture/274cce510915d8b305b711f55c0f015c.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(645,'Cable Incline Chest Press','Sit on seat and grasp stirrups to each side (attached to medium height pulleys). Position elbows out to sides, slightly lower than shoulder height. Position hands back approximately shoulder height and elbow width.','Push stirrups away from body, slightly upward at 30º to 45º until arms are straight and parallel to one another. Return stirrups to original position until slight stretch is felt in chest or shoulders. Repeat.','upload/exercise-picture/CBInclineChestPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(646,'Cable Bar Incline Bench Press','Position adjustable pulley higher than intended height, but within arms reach from incline bench. Position incline bench under cable bar. Lie supine on incline bench. While lying on bench, reach over and lower each pulley into intended position so that cables are taut in lowest position with bar on chest. Grasp bar with both hands using wide oblique overhand grip.','Press bar upward until arms are extended. Lower bar to upper chest or until slight stretch is felt in shoulders. Repeat.','upload/exercise-picture/CBBarInclineBenchPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(647,'Cable Standing Incline Chest Press','Stand between two hip height pulleys, facing away from cable columns. Grasp cable stirrups from each side. Position elbows out to sides, lower chest height. Position hands back approximately shoulder height and elbow width. Lean and step forward with one foot in front bending forward knee.','Push stirrups forward and upward at 30º to 45º angle until arms are straight and parallel to one another. Return stirrups to original position until slight stretch is felt in chest or shoulders. Repeat.','upload/exercise-picture/CBStandingInclinePress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(648,'Barbell Incline Bench Press','Lie supine on incline bench. Dismount barbell from rack over upper chest using wide oblique overhand grip.','Lower weight to upper chest. Press bar until arms are extended. Repeat.','upload/exercise-picture/BBInclineBenchPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(649,'Cable Incline Bench Press','Sit on seat and grasp stirrups to each side (attached to low cable pulleys). Lie back on incline back support. Position stirrups out to each side of chest with bent arm under each wrist.','Push stirrups up over each shoulder until arms are straight and parallel to one another. Return stirrups to original position, until slight stretch is felt in chest or shoulders. Repeat.','upload/exercise-picture/CBInclineBenchPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(650,'Cable Bar Standing Incline Chest Press','Stand facing behind cable bar, mounted on each side to lower chest height narrow double pulley cables. Grasp cable bar with wide overhand grip. Position bar upper mid-chest height with elbows angled behind and downward. Lean and step forward with one foot in front, bending forward knee.','Push cable bar forward and upward at 30º to 45º until arms are straight. Return cable bar to original position until slight stretch is felt in chest or shoulders. Repeat.','upload/exercise-picture/CBBarStandingInclineChestPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(651,'Dumbbell Incline Fly','Grasp two dumbbells. Lie supine on bench. Support dumbbells above upper chest with arms fixed in slightly bent position. Bend elbows slightly and internally rotate shoulders so elbows point out to sides.','Lower dumbbells outward to sides of shoulders. Keep elbows fixed in slightly bent position. When a stretch is felt in chest or shoulders, bring dumbbells back together in hugging motion above upper chest until dumbbells are nearly together. Repeat.','upload/exercise-picture/DBInclineFly.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(652,'Dumbbell Incline Bench Press','Sit down on incline bench with dumbbells resting on lower thigh. Kick weights to shoulders and lean back. Position dumbbells to sides of chest with upper arm under each dumbbell.','Press dumbbells up with elbows to sides until arms are extended. Lower weight to sides of upper chest until slight stretch is felt in chest or shoulder. Repeat.','upload/exercise-picture/DBInclineBenchPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(653,'Cable Standing Incline Fly','Stand between two pulleys position hip height and arms width or slightly wider apart. Grasp stirrups, one in each hand. Extend arms out with elbows slightly bent, pointed back and downward slightly. Step forward until cables are taut or when weights are lifted up slightly. Stand with feet staggered.','Keeping elbows fixed in slightly bent position, bring stirrups together in upwardly arching, hugging motion, at 30º to 45º angle until they meet at top of motion. Lower stirrups to original position in reverse pattern. As soon as stretch is felt in chest or shoulders, repeat motion.','upload/exercise-picture/CBStandingInclineFly.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(654,'Cable One Arm Standing Incline Chest Press','Grasp cable stirrup from hip height pulley. Turn body away from pulley. Position elbow of loaded arm out to side, lower chest height. Position loaded hand back approximately shoulder height and elbow width. Step far forward with foot of opposite side of loaded arm. Bend knees and position heel of rear foot off floor.','Push stirrups forward and upward at 30º to 45º until arm is straight and in-line with cable. Return stirrup to original position until slight stretch is felt in chest or shoulder. Repeat. Continue with opposite arm.','upload/exercise-picture/CBStandTwistInclineChestPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(655,'Cable Incline Fly','Sit on seat with stirrups in each hand (attached to low cable pulleys). Lie back on incline back support. Position stirrups out to each side of chest with bent arm under each wrist. Press stirrups over each shoulder until arms vertical. Bend elbows slightly and internally rotate shoulders so elbows point out to sides.','Lower stirrups outward to sides of shoulders. Keep elbows fixed in slightly bent position. When a stretch is felt in chest or shoulders, bring stirrups back together in hugging motion above upper chest until stirrups are nearly together Repeat.','upload/exercise-picture/CBInclineFly.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(656,'Lever Incline Chest Press (on Hammer military press)','Sit on seat with upper chest just above base of handles on lever. Grasp grips with wide overhand grip. Lift levers into starting position with elbows slightly low.','Press levers until arms are extended. Return weight until chest muscles are slightly stretched with elbows positioned out to sides. Repeat.','upload/exercise-picture/LVInclineChestPressOnHammerMilitaryPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(657,'Lever Incline Chest Press (plate loaded)','Sit on seat with upper chest just above grips on lever. Grasp grips with wide overhand grip and position elbows out to sides.','Press lever until arms are extended. Return weight until chest muscles are slightly stretched. Repeat.','upload/exercise-picture/LVInclineChestPressSeatLowH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(658,'Lever Barbell Incline Bench Press (plate loaded)','Lie supine on incline bench with upper chest under bar. Grasp bar with wide oblique overhand grip. Disengage bar by rotating bar back.','Lower weight to chest. Press bar until arms are extended. Repeat.','upload/exercise-picture/LVSMInclineBenchPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(659,'Lever Incline Bench Press','Lie supine on incline bench with upper chest under lever bar. Grasp lever bar with wide oblique overhand grip.','Press bar until arms are extended. Lower weight to upper chest. Repeat.','upload/exercise-picture/LVInclineBenchPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(660,'Lever Parallel Grip Incline Bench Press (plate loaded)','Lie supine on incline bench with parallel lever bars out to sides of rib cage. Grasp parallel handles.','Press lever bars up until arms are extended. Lower weight toward upper chest. Repeat.','upload/exercise-picture/LVParellelGripInclineBenchPressNPL.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(661,'Lever Incline Bench Press (plate loaded)','Lie supine on incline bench with lever bars out to sides of chest. Grasp handles with wide overhand grip.','Press lever bars up until arms are extended. Lower weight toward upper chest. Repeat.','upload/exercise-picture/LVInclineBenchPressNPL.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(662,'Lever Parallel Grip Incline Bench Press','Lie supine on incline bench with parallel lever bars out to sides of rib cage. Grasp parallel handles.','Press lever bars up until arms are extended. Lower weight toward upper chest. Repeat.','upload/exercise-picture/LVInclineParallelGripBenchPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(663,'Lever Parallel Grip Incline Chest Press','Sit on seat with lower chest at height of parallel handles. If available, push foot lever until handles are within grasping range. Grasp parallel handles.','Press lever bars up until arms are extended. Return weight until shoulders or chest feels slightly stretched. Repeat.','upload/exercise-picture/LVParallelGripInclineChestPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(664,'Lever Alternating Incline Chest Press','Sit on seat with upper chest just above grips on lever. Grasp grips with wide overhand grip and position elbows out to sides.','Press one lever until arm is extended. Return lever back down until chest muscle is slightly stretched. Repeat with opposite arm, alternating between sides.','upload/exercise-picture/LVAlternatingInclineChestPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(665,'Lever Incline Chest Press','Sit on seat with upper chest just above grips on lever. If available, push foot lever until handles are within grasping range. Grasp handles with wide oblique overhand grip and position elbows out to sides. Release foot lever.','Press lever until arms are extended. Return weight until shoulders or chest feels slightly stretched. Repeat.','upload/exercise-picture/LVInclineChestPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(666,'Smith Incline Bench Press','Lie supine on incline bench with upper chest under bar. Grasp bar with wide oblique overhand grip. Disengage bar by rotating bar back.','Lower weight to upper chest. Press bar until arms are extended. Repeat.','upload/exercise-picture/SMInclineBenchPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(667,'Decline Push-up','Kneel on floor with bench or elevation behind body. Position hands on floor slightly wider than shoulder width. Place feet on bench or elevation. Raise body body in plank position with body straight and arms extended.','Keeping body straight, lower upper body to floor by bending arms. To allow for full descent, pull head back slightly without arching back. Push body up until arms are extended. Repeat.','upload/exercise-picture/BWDeclinePushup.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(668,'Lever Incline Fly','Lie supine on bench. Position inside of forearms under roller pads with arms out to each side. Slightly bend elbows and internally rotate shoulders so elbows are back.','Raise lever upward and together in hugging motion. Lower weight until slight stretch is felt in chest or shoulder. Repeat.','upload/exercise-picture/LVInclineFly.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(669,'Pike Push-up','Kneel on two benches positioned side by side slightly apart at end nearest head. Place hands on ends of benches. With forefeet on opposite ends of bench, raise rear end high up with arms, back, and knees straight.','Lower head between ends of benches by bending arms. Push body back up to original position by extending arms. Repeat.','upload/exercise-picture/BWFarPikePress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(670,'Decline Push-up (on stability ball)','Kneel with chest or waist on exercise ball. Dive over top and place hands on floor with arms extended down supporting upper body. While keeping body horizontal, walk hands further away from ball until thighs are positioned on top of ball and hands are slightly wider than shoulder width. Bend knees so feet are up above knees.','Keeping hips straight, lower upper body to floor by bending arms. To allow for full descent, pull head back slightly without arching back. Push body up until arms are extended. Repeat.','upload/exercise-picture/DeclinePushUpOnBall.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(671,'Lying Shoulder Girdle Stretch','Lie supine with soles of feet on floor, hips and knees bent. Bend elbows and position back of arms against floor or mat with elbows to sides.','Push shoulders, forearms, and back of hand into floor or mat and slowly move arms toward sides of head. Still pushing shoulders and back of arms into floor, slowly arms toward sides.','upload/exercise-picture/81c9c6613602c71360e4ca55e904cf66.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(677,'Towel Shoulder Girdle Stretch','Grasp large towel or rope with very wide overhand grip, approximately length of arm to opposite elbow. Raise towel over head.','Pull towel back away from back of head while attempting to pull towel outward on each side.','upload/exercise-picture/fac48a97a71ddfde86c8d863dcbd396d.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(678,'Wall Shoulder Girdle Stretch','Position back against wall. Place feet away from wall, slightly bending hips and knees. Bend elbows and position back of arms against wall with elbows to sides.','Push shoulders and back of arms and hands into wall and slowly raise arms as high as possible. Still pushing shoulders arms, slowly lower arms to starting position.','upload/exercise-picture/WallShoulderGirdle.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(679,'Lever Incline Shoulder Raise','Sit on lever chest press machine with shoulders aligned with lever grips. Grasp lever grips with shoulder width overhand grip. Push weight up so arms are straight.','Raise shoulders toward lever grips as far as possible. Lower shoulders to bench and repeat.','upload/exercise-picture/LVInclineShoulderRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(680,'Barbell Incline Shoulder Raise','Lie supine on incline bench. Dismount barbell from rack with shoulder width overhand grip. Position barbell over upper chest with elbows extended.','Raise shoulders toward bar as high as possible. Lower shoulders to bench and repeat.','upload/exercise-picture/BBInclineShoulderRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(681,'Dumbbell Incline Shoulder Raise','Sit down on incline bench with dumbbells resting on lower thigh. Kick weights to shoulders and lean back. Position dumbbells above shoulders with elbows extended.','Raise shoulders toward dumbbells as high as possible. Lower shoulders to bench and repeat.','upload/exercise-picture/DBInclineShoulderRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(682,'Cable Incline Shoulder Raise','Sit on seat and grasp stirrups to each side. Push stirrups out at 30º to 45º until arms are straight and parallel to one another.','Raise shoulders toward stirrups as high as possible. Lower shoulders down and back and repeat.','upload/exercise-picture/CBShoulderRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(683,'Lever Incline Shoulder Raise (plate loaded)','Sit on lever chest press machine with shoulders aligned with lever grips. Grasp lever grips with shoulder width overhand grip. Push weight up so arms are straight.','Raise shoulders toward lever grips as far as possible. Lower shoulders to bench and repeat.','upload/exercise-picture/LVInclineShoulderRaisePL.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(685,'Cable One Arm Incline Push','Sit on seat and grasp stirrup with one hand. Position elbow out to side, slightly lower than shoulder height. Position hand down, slightly higher than shoulder height, slightly narrower than elbow width.','Push stirrup forward and up at 30º to 45º while rotating torso away allowing shoulder to be extended forward. Return stirrups to original position, until slight stretch, and repeat. Continue with opposite side.','upload/exercise-picture/CBOneArmInclinePush.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(686,'Smith Incline Shoulder Raise','Lie supine on incline bench with shoulders under bar. Grasp bar with shoulder width overhand grip. Extend elbows. Disengage bar by rotating bar back.','Raise shoulders toward bar as high as possible. Lower shoulders to bench and repeat.','upload/exercise-picture/SMInclineShoulderRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(687,'Push-up Plus','Lie prone on floor with hands slightly wider than shoulder width. Raise body up off floor by extending arms with body straight.','Keeping body straight, lower body to floor by bending arms. Push body up until arms are extended. Continue lifting body further up by pushing shoulders infront of chest. Repeat.','upload/exercise-picture/BWPushUpPlus.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(689,'Barbell Push Crunch','Position feet under foot pad and lie supine on steep incline bench. Pull barbell from floor or grasp from rack behind with overhand grip. Position barbell over chest with shoulder width or slightly wider grip.','Flex waist to raise upper torso from bench, keeping low back on bench. Return until back of shoulders contact padded incline board. Repeat.','upload/exercise-picture/BBPushCrunch.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(690,'Cable Lying Crunch (on stability ball)','Sit on stability ball against low pulley column. Roll back away from low pulley column, so back is on ball. Reach back and grasp cable rope attachment with both hands and place inside of wrists on sides of head. Allow weight to hyperextend lower back against stability ball.','With hips stationary, flex waist so elbows travel toward thighs. Return and repeat.','upload/exercise-picture/CBLyingCrunchStabBall.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(691,'Cable Lying Leg-Hip Raise (on bench)','Attach cable ankle straps to both ankles, then attach ankle straps to cable. Lie supine on floor or mat, back far enough so cable is taut. Grasp support behind head.','Raise legs by flexing hips while flexing knees until hips are fully flexed. Raise hips from floor by flexing waist. Return until legs are extended horizontally. Repeat.','upload/exercise-picture/CBLyingLegHipRaiseBench.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(692,'Barbell Push Sit-up','Position feet under foot pad and lie supine on flat or incline bench. Pull barbell from floor or grasp from rack behind with overhand grip. Position barbell over chest with shoulder width or slightly wider grip.','Raise torso from bench as high as possible by bending waist and hips. Keep weight positioned above shoulders. Achieve near upright posture (hip flexibility, incline, and initial hip position permitting). Return to original lying posture with back of shoulders contacting padded incline board. Repeat.','upload/exercise-picture/BBInclineSitup.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(693,'Cable Seated Crunch (plate loaded)','Sit on apparatus with back on back support. Grasp cable rope attachment with both hands and place securely over both shoulders. Allow weight to lift chest up with spine arched back slightly.','With hips stationary, flex waist small of back pushes into back of seat as upper back travels forward. Return and repeat.','upload/exercise-picture/CBInclineCrunch.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(694,'Cable Lying Leg-Hip Raise','Attach cable ankle straps to both ankles then attach ankle straps to cable. Lie supine on floor or mat, back far enough so cable is taut. Grasp support behind head.','Raise legs by flexing hips while flexing knees until hips are fully flexed. Raise hips from floor by flexing waist. Return until waist, hips and knees are extended downward. Repeat.','upload/exercise-picture/CBLyingLegHipRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(695,'Cable Lying Straight Leg-Hip Raise','Attach cable ankle straps to both ankles, then attach ankle straps to cable. Lie supine on floor or mat, back far enough so cable is taut. Grasp support behind head.','Raise legs by flexing hips until fully flexed. Raise hips from floor by flexing waist. Return until waist and hips are extended downward. Repeat.','upload/exercise-picture/CBLyingStraightLegHipRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(696,'Cable Seated Crunch','Seat with back support away from medium high pulley. Grasp cable rope attachment with both hands and place securely over both shoulders. Allow weight to lift chest up with spine arched back slightly.','With hips stationary, flex waist so elbows travel toward hips. Return and repeat.','upload/exercise-picture/CBSeatedCrunch.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(697,'Cable Kneeling Crunch','Kneel below high pulley. Grasp cable rope attachment with both hands. Place wrists against head. Position hips back and flex hips, allowing resistance on cable pulley to lift torso upward so spine is hyperextended.','With hips stationary, flex waist so elbows travel toward middle of thighs. Return and repeat.','upload/exercise-picture/CBKneelingCrunch.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(698,'Cable Overhead Seated Crunch','Sit on bench or seat below two very close high pulleys. Grasp two separate cable stirrups, one with each hand. Pull stirrups down with palms facing back over each shoulder. Holding arms in place, allow weight to pull torso up, hyperextend lower back slightly.','With arms fixed in place, flex waist so shoulders travel forward and downward toward thighs. Return until chest is high and back is hyperextended. Repeat.','upload/exercise-picture/CBOverheadSeatedCrunch.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(699,'Cable Standing Crunch','Position back against back pad with knees slightly bent, shoulders back, and chest high. Position both cable ropes over shoulders, one in each hand. Place hands with cable ropes in front of each shoulder so that cable is taut. If available, place hand in rope slot that allows cable to be taut when hands are in position.','Flex waist so torso pulls ropes forward and downward. Return until back of shoulders return to surface. Repeat alternating twists with opposite sides.','upload/exercise-picture/CBStandingCrunch.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(700,'Dumbbell Push Crunch','With dumbbells in each hand, position feet under foot pad and lie supine on steep incline bench. Position dumbbells straight over shoulders.','Flex waist to raise upper torso from bench, keeping low back on bench. Return until back of shoulders contact padded incline bench. Repeat.','upload/exercise-picture/DBPushCrunch.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(701,'Lever Lying Crunch (plate loaded)','Lie on machine with feet on foot bar. Place forearms on bars at sides or grasp handles above to each side.','With hips stationary, raise upper back pad by flexing waist. Return and repeat.','upload/exercise-picture/LVLyingCrunchArmsSide.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(702,'Cable Standing Overhead Crunch (multi-exercise bar)','Stand below high pulley. Grasp multi-exercise bar cable attachment with parallel grip. Position hands near sides of head. Squat down slightly with hips flexed, allowing resistance on cable pulley to lift torso upward so spine is hyperextended.','With knees and hips stationary, flex waist so elbows travel toward middle of thighs. Return and repeat.','upload/exercise-picture/CBStandingOverheadCrunchMultiBar.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(703,'Cable Standing Overhead Crunch','Stand below high pulley. Grasp cable rope attachment and place wrists against head. Squat down slightly with hips flexed, allowing resistance on cable pulley to lift torso upward so spine is hyperextended.','With knees and hips stationary, flex waist so elbows travel toward middle of thighs. Return and repeat.','upload/exercise-picture/CBStandingOverheadCrunch.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(704,'Dumbbell Push Sit-up','Position feet under foot pad and lie supine on flat or incline bench. Position dumbbells straight over shoulders.','Raise torso from bench as high as possible by bending waist and hips. Keep weight positioned above shoulders. Achieve near upright posture (hip flexibility, incline, and initial hip position permitting). Return to original lying posture with back of shoulders, contacting padded incline board. Repeat.','upload/exercise-picture/DBInclineSitup.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(705,'Lever Lying Crunch','Lie on machine with legs over pads or feet on foot bar. Grasp bars near head at each side.','With hips stationary, raise upper back pad by flexing waist. Return and repeat.','upload/exercise-picture/LVLyingCrunch.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(706,'Lever Lying Leg-Hip Raise (plate loaded)','Lie supine on machine with lower legs between padded bars. Grasp handles on each side.','Pull lower leg bar up by flexing hips toward arms by flexing hips then waist. Continue to raise knees toward shoulders by flexing waist, raising hips from board. Return until waist and hips are extended down to original position. Repeat.','upload/exercise-picture/LVLyingLegHipRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(707,'Lever Lying Leg Raise Crunch (plate loaded)','Lie supine on machine with lower legs between padded bars. Grasp handles on each side.','Pull handles toward legs while pulling lower leg bar toward arms by flexing waist and hips. Return and repeat.','upload/exercise-picture/LVCrunchLegRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(708,'Lever Vertical Leg-Hip Raise (plate loaded)','Grasp handles slightly to front and stand on foot bar with knees slightly bent and hips against pad.','Raise legs as high as possible by flexing hips then waist. Return and repeat.','upload/exercise-picture/LVVerticalLegHipRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(709,'Lever Seated Leg Raise Crunch (plate loaded)','Sit on machine with back against back support and lower legs under padded bar. Grasp handles above to each side.','Pull handles down while pulling lower leg bar up by flexing waist and pelvis. Return and repeat.','upload/exercise-picture/LVSeatedLegRaiseCrunchPL.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(710,'Lever Seated Leg Raise Crunch','Sit on machine with back against back support and lower legs under padded bar. Grasp handles above to each side.','Pull handles down while pulling lower leg bar up by flexing waist and pelvis. Return and repeat.','upload/exercise-picture/LVCrunchHipRaiseN.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(711,'Lever Seated Crunch (chest pad)','Position seat so chest is same height of padded lever. Sit on machine with back of hips against hip pad. Place hands on outside of lever pad.','With hips stationary, flex waist in \"C\" shape so shoulders travel forward and downward. Return and repeat.','upload/exercise-picture/LVCrunchChestPad.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(712,'Lever Push Crunch','Sit on machine with back of hips against hip support. Push hips securely back by pushing feet against foot bar. Grasp handles and push resistance lever until arms are extended in front of body.','Push resistance lever forward by flexing waist. Return by allowing upper body to be pushed back until low back is hyperextended. Repeat.','upload/exercise-picture/LVPushCrunch.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(713,'Lever Seated Crunch (arm pad)','Position seat so shoulders are same height of padded lever. Sit on machine and place arms over lever pad. Push padded lever down slightly until shoulder is fixed at approximately 90º or slightly greater.','With hips stationary, flex waist in \"C\" shape so elbows point downward. Return and repeat.','upload/exercise-picture/LVSeatedCrunchArmPad.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(714,'Sled Leg Hip Raise (ab coaster)','Straddle machine facing handles. Grasp handles on each side and place forearms on pads. Place shins on padded sled with knees forward and feet hanging off of back end. Sit back toward heels without bending over.','Slide forward and up by pulling knees up high. Deliberately attempt to flex waist in a \"C\" shape. Return sled down and back arching spine in opposite direction while keeping hips bent. Repeat.','upload/exercise-picture/SLLegHipRaiseAbCoaster.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(715,'Lever Seated Crunch','Sit on machine with back and hips against back supports. If available, place lower legs under pads or on platform. Grasp handles above and position back of arm against pads to each side.','With hips stationary, flex waist so elbows travel downward. Return and repeat.','upload/exercise-picture/LVSeatedCrunch.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(716,'Lever Seated Crunch (arm bar)','Sit on machine with back and hips against padded supports. Place feet on floor or feet bars so thigh is approximately horizontal. Grasp handles and position forearms on bars or pads.','With hips stationary, flex waist so arms and upper torso travel forward and downward. Return and repeat.','upload/exercise-picture/LVSeatedCrunchArmsForward.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(717,'Lever Side Lying Leg Hip Raise','Lie on side with head on elevated head pad and legs between padded rollers. Flex hips slightly until rear and front of thighs are snugly positioned against pads. Flex knees so back of lower leg is against furthest padded roller. Grasp handles in front of head.','Pull knees toward arms by flexing waist and hips. Return and repeat.','upload/exercise-picture/LVSideLyingLegHipRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(718,'Weighted Crunch','Lie supine on bench with head hanging off and knees and hips bent. Hold plate behind neck.','Flex waist to raise upper torso from bench. Keep low back on bench and raise torso up as high as possible. Return until back of shoulders contact padded incline board. Repeat.','upload/exercise-picture/WTCrunch.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(719,'Weighted Crunch (plate on chest)','Lie supine on mat with lower legs on bench. Hold plate on chest with both hands.','Flex waist to raise upper torso from mat. Keep low back on mat and raise torso up as high as possible. Return until back of shoulders contact mat. Repeat.','upload/exercise-picture/WtCrunchChestX.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(720,'Weighted Incline Crunch (arms crossed)','Hook feet under foot brace and lie supine on incline board with hips bent. Hold plate on chest with both hands or use no weight.','Flex waist to raise upper torso from bench. Keep low back on bench and raise torso up as high as possible. Return until back of shoulders contact padded incline board. Repeat.','upload/exercise-picture/WTInclineCrunchX.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(721,'Weighted Incline Sit-up (arms crossed)','Hook feet under foot brace and lie supine on incline board with hips bent. Hold plate on chest with both hands or use no weight.','Raise torso from bench by bending waist and hips. Return until back of shoulders contact padded incline board. Repeat.','upload/exercise-picture/WTInclineSitupX.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(722,'Weighted Incline Sit-up','Hook feet under support and lie supine on incline bench with hips bent. Hold plate behind neck or clasp hands behind neck with no weight.','Raise torso from bench by bending waist and hips. Return until back of shoulders contact padded incline board. Repeat.','upload/exercise-picture/WtInclineSitUp.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(723,'Weighted Overhead Crunch (on stability ball)','Sit on exercise ball with medicine ball in hands. Walk forward on ball and lie back on ball with shoulders and head hanging off and knees and hips bent. Gently hyperextend back to contour of ball. Position medicine ball over upper chest with arms extended.','Keeping arms extended and medicine ball over upper chest, flex waist to raise upper torso. Return to original position. Repeat.','upload/exercise-picture/WTOverheadBallCrunch.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(724,'Weighted Incline Crunch','Hook feet under support and lie supine on incline bench with hips bent. Hold plate behind neck or clasp hands behind neck with no weight.','Flex waist to raise upper torso from bench. Keep low back on bench and raise torso up as high as possible. Return until back of shoulders contact padded incline board. Repeat.','upload/exercise-picture/WtInclineCrunch.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(725,'Weighted Crunch (on stability ball)','Sit on exercise ball. Walk forward on ball and lie back on ball with shoulders and head hanging off and knees and hips bent. Gently hyperextend back to contour of ball. Hold plate behind neck or on chest with both hands or use no weight.','Flex waist to raise upper torso. Return to original position. Repeat.','upload/exercise-picture/WTBallCrunch.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(726,'Medicine Ball Chest Throw Sit-up (machine)','Position feet under support with knees bent. With two medicine\nballs at bottom of chute, grasp closest medicine ball with both\nhands.','With ball in both hands, lie down onto back support while\nlowering medicine ball to chest. Raise torso from back support\nby bending waist and hips while pushing ball away from chest.\nImmediately throw ball into target and grasp other medicine ball\nat bottom of chute. Repeat movement.','upload/exercise-picture/MBSitupChest.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(727,'Weighted Sit-up','Hook feet under support and lie supine on floor or mat with hips bent. Hold plate behind neck.','Raise torso from floor by bending waist and hips. Return until back of shoulders contact with floor or mat. Repeat.','upload/exercise-picture/WTSitUp.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(728,'Weighted Sit-up (arms on chest)','Hook feet under support and lie supine on floor or mat with hips and knees bent. With both hands, hold plate on chest with forearms crossed or use no weight.','Raise torso from floor by bending waist and hips. Return until back of shoulders contact with floor or mat. Repeat.','upload/exercise-picture/WTSitUpX.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(729,'Medicine Ball Overhead Throw Sit-up (machine)','Position feet under support with knees bent. With two medicine balls at bottom of chute, grasp closest medicine ball with both hands.','With ball in both hands, lie down onto back support while lowering medicine ball behind head. Raise torso from back support by bending waist and hips while raising ball overhead. Immediately throw ball into target and grasp other medicine ball at bottom of chute. Repeat movement.','upload/exercise-picture/Absolo.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(730,'Weighted Vertical Leg-Hip Raise (Bosu support)','Place weight between ankles. Position forearms on padded parallel bars with hands on handles and back on convexed surface.','Raise legs by flexing hips and knees. As hips approach full flexion, lean back. Continue to raise knees toward shoulders by flexing waist and raising hips and low back from convexed surface. Return until waist, hips, and knees are extended. Repeat.','upload/exercise-picture/WTVerticalLegHipRaiseConvex.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(731,'Weighted Vertical Leg-Hip Raise','Place weight between ankles or use no weight. Position forearms on padded parallel bars with hands on handles and back on vertical pad.','Raise legs by flexing hips and knees until hips are fully flexed. Continue to raise knees toward shoulders by flexing waist, raising hips from back board. Return until waist, hips, and knees are extended. Repeat.','upload/exercise-picture/WtVerticalLegHipRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(732,'Weighted Vertical Leg-Hip Raise (on parallel bars)','Place weight between ankles. Stand between parallel bars and grip bar on each side with overhand grip. Lift body off floor and balance body upright with arms straight.','Raise legs by flexing hips and knees until hips are fully flexed. Continue to raise knees toward shoulders by flexing waist. Return until waist, hips, and knees are extended. Repeat.','upload/exercise-picture/WTVerticalLegHipRaiseDipBar.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(733,'Weighted Lying Leg-Hip Raise','Place weight between ankles or use no weight. Lie supine on bench or floor. Grasp sides of bench for support.','Raise legs by flexing hips while flexing knees until hips are fully flexed. Continue to raise knees toward shoulders by flexing waist, raising hips from board. Return until waist, hips and knees are extended. Repeat.','upload/exercise-picture/WTLyingLegHipRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(734,'Weighted Hanging Leg-Hip Raise','Place weight between ankles or use no weight. Grasp and hang from high bar.','Raise legs by flexing hips and knees until hips are fully flexed. Continue to raise knees toward shoulders by flexing waist. Return until waist, hips, and knees are extended. Repeat.','upload/exercise-picture/WTHangingLegHipRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(735,'Weighted Side Crunch','Lie upper back supine on floor or mat. With both legs together, knees and hips bent, position outside of leg down to side. Use no weight or hold weight to opposite side of head or across upper chest.','Flex waist, raising upper torso off surface. Return until back of shoulders return to surface. Repeat and continue with movement in opposite position.','upload/exercise-picture/WTSideCrunch.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(736,'Weighted Incline Twisting Crunch (arms crossed)','Hook feet under padding and lie supine on incline bench with hips bent. Hold plate on upper chest with both hands or use no weight.','Flex and twist waist to raise upper torso from bench to one side. Return until back of shoulders contact padded incline board. Repeat to opposite side alternating twists.','upload/exercise-picture/WTInclineTwistingCrunch.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(737,'Cable Standing Twisting Crunch','Position back against back pad with knees slightly bent, shoulders back, and chest high. Place both cable straps over shoulders, one in each hand. Place hands with cable strap in front of each shoulder so that cable is taut. If available, place hands in strap slots that allow cable to be taut when hands are in position with shoulders back.','Flex and twist spine so torso pulls strap forward and downward while twisting one shoulder to forward center. Return until back of shoulders return to back pad. Repeat alternating twists with opposite sides.','upload/exercise-picture/CBStandingTwistingCrunch.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(738,'Lever Seated Twisting Leg Raise Crunch (plate loaded)','Sit on machine with position back against back support and lower legs under padded bar. Grasp handles above to each side.','Pull handles down while pulling lower leg bar up and over to one side by flexing and twisting waist and pelvis. Return and repeat movement to opposite side. Continue alternating between sides.','upload/exercise-picture/LVSeatedTwistingLegRaiseCrunch.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(739,'Weighted Incline Leg-Hip Raise','Sit on incline board. Place weight between ankles or use no weight. Lie supine on incline board with torso elevated. Grasp feet hooks or sides of board by head for support.','Raise legs by flexing hips while flexing knees until hips are fully flexed. Continue to raise knees toward shoulders by flexing waist, raising hips from board. Return until waist, hips and knees are extended. Repeat.','upload/exercise-picture/WtInclineLegHipRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(740,'Weighted Incline Twisting Situp','Hook feet under foot or ankle brace and lie supine on incline bench with hips and knees bent. Hold plate behind neck with both hands.','Flex and twist waist to one direction while raising torso from bench by bending hips. Return until back of shoulders contact padded incline board. Repeat to opposite side, alternating twists.','upload/exercise-picture/WtInclineTwistingSitUp.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(741,'Weighted Twisting Crunch','Lie supine on floor or bench with knees and hips bent. Hold plate behind neck or on chest with both hands.','Flex and twist waist to raise upper torso off surface to one side. Return until back of shoulders return to surface. Repeat to opposite side alternating twists.','upload/exercise-picture/WTTwistingCrunch.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(742,'Weighted Side Crunch (on stability ball)','Sit on exercise ball. Walk forward on ball and lie back on ball with shoulders and head hanging off. Switch position of feet by positioning bent leg under extended leg so waist is twisted with hip positioned sideways. Gently hyperextend back to contour of ball. Hold plate behind neck or on chest with both hands or use no weight.','Flex waist to raise upper torso. Return to original position and repeat. Position legs in opposite position and continue.','upload/exercise-picture/WTSideCrunchOnBall.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(743,'Weighted Incline Twisting Situp (arms crossed)','Hook feet under foot brace and lie supine on incline board with hips and knees bent. Hold plate on chest with both hands or use no weight.','Flex and twist waist to one direction while raising torso from bench by bending hips. Return until back of shoulders contact padded incline board. Repeat to opposite side alternating twists.','upload/exercise-picture/WtInclineTwistingSitUpChest.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(744,'Crunch (arms down)','Lie supine on mat or bench. Bend knees and hips and place feet on floor. Extend arms down to sides.','Flex waist to raise upper torso from mat or bench. Keep low back on floor or mat and raise torso up as high as possible. Extend hands toward sides of heels. Return until back of shoulders contact mat or bench. Repeat.','upload/exercise-picture/CrunchArmsStraight.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(745,'Crunch','Lie supine on mat with lower legs on bench. Place hands behind neck or head.','Flex waist to raise upper torso from mat. Keep low back on mat and raise torso up as high as possible. Return until back of shoulders contact mat. Repeat.','upload/exercise-picture/BWCrunchHead.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(746,'Weighted Twisting Situp','Place feet under low overhanging stationary object. Lie supine on floor or mat with hips and knees bent. Hold plate behind neck with both hands.','Flex and twist waist to one direction while raising torso from bench by bending hips. Return until back of shoulders contact floor or mat. Repeat to opposite side alternating twists.','upload/exercise-picture/WTTwistingSitUp.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(747,'Crunch (arms crossed)','Lie supine on mat with lower legs on bench. Cross wrists on chest.','Flex waist to raise upper torso from mat. Keep low back on mat and raise torso up as high as possible. Return until back of shoulders contact mat. Repeat.','upload/exercise-picture/BWCrunchX.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(748,'Weighted Twisting Crunch (on stability ball)','Sit on exercise ball. Walk forward on ball and lie back on ball with shoulders and head hanging off and knees and hips bent. Gently hyperextend back to contour of ball. Hold plate behind neck or on chest with both hands or use no weight.','Flex waist to raise upper torso. Return to original position and repeat.','upload/exercise-picture/WTTwistingCrunchOnBall.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(749,'Weighted Twisting Situp (arms crossed)','Place feet under low overhanging stationary object. Lie supine on floor or mat with hips and knees bent. With both hands, hold plate on chest with forearms crossed.','Flex and twist waist to one direction while raising torso from bench by bending hips. Return until back of shoulders contact floor or mat. Repeat to opposite side alternating twists.','upload/exercise-picture/WTTwistingSitUpX.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(750,'Crunch Up','Lie supine on mat or floor with bent leg and arms pointed up.','Flex waist to raise upper torso from floor. Return until back of shoulders contact padded incline board. Repeat.','upload/exercise-picture/CrunchUps.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(751,'Jack-knife Sit-up','Sit on floor or mat. Lie supine with hands to sides.','Simultaneously raise knees and torso until hips and knees are flexed. Return to starting position with waist, hips and knees extended. Repeat.','upload/exercise-picture/WtJacknifeSitUp.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(752,'Incline Crunch','Hook feet under foot brace and lie supine on incline board with hips bent. Place hands behind neck or head.','Flex waist to raise upper torso from bench. Keep low back on bench and raise torso up as high as possible. Return until back of shoulders contact incline board. Repeat.','upload/exercise-picture/BWInclineCrunchHead.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(753,'Ball Crunch (on stability ball)','Sit on exercise ball. Walk forward on ball and lie back on ball with shoulders and head hanging off and knees and hips bent. Gently hyperextend back on contour of ball. Place hands behind neck or beside head.','Flex waist to raise upper torso. Return to original position. Repeat.','upload/exercise-picture/BWBallCrunch.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(754,'Crunch (on stability ball, arms crossed)','Sit on exercise ball. Walk forward on ball and lie back on ball with shoulders and head hanging off and knees and hips bent. Gently hyperextend back on contour of ball. Cross arms on chest.','Flex waist to raise upper torso. Return to original position. Repeat.','upload/exercise-picture/BWCrunchBallX.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(755,'Incline Crunch (arms down)','Hook feet under foot brace and lie supine on incline board with hips bent. Extend arms down to sides or cross arms on chest.','Flex waist to raise upper torso from bench. Keep low back on bench and raise torso up as high as possible. Return until back of shoulders contact incline board. Repeat.','upload/exercise-picture/BWInclineCrunchDown.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(756,'Hanging Leg-Hip Raise','Stand below ab straps hanging from high bar. Place upper arms in straps and grasp straps above.','Raise legs by flexing hips and knees until hips are fully flexed. Continue to raise knees toward shoulders by flexing waist. Return until waist, hips, and knees are extended downward. Repeat.','upload/exercise-picture/BWHangingHipLegRaiseAbStrap.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(757,'Hanging Straight Leg-Hip Raise','Grasp and hang from high bar.','Raise legs by flexing hips until fully flexed. Continue to raise feet toward bar by flexing waist. Return until waist and hips are extended downward. Repeat.','upload/exercise-picture/BWHangingStraightLegHipRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(758,'Incline Leg-Hip Raise','Lie supine on incline board with torso elevated. Grasp feet hooks or sides of board by head for support.','Raise legs by flexing hips and knees until hips are fully flexed. Continue to raise knees toward shoulders by flexing waist, raising hips from board. Return until waist, hips and knees are extended. Repeat.','upload/exercise-picture/BWInclineLegHipRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(759,'Lying Leg-Hip Raise','Lie supine on bench or floor. Grasp sides of bench for support.','Raise legs by flexing hips while flexing knees until hips are fully flexed. Continue to raise knees toward shoulders by flexing waist, raising hips from board. Return until waist, hips and knees are extended. Repeat.','upload/exercise-picture/BWLyingLegHipRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(760,'Vertical Leg-Hip Raise (parallel bars)','Stand between parallel bars and grip bar on each side with overhand grip. Lift body off floor and balance body upright with arms straight.','Raise legs by flexing hips and knees until hips are fully flexed. Continue to raise knees toward shoulders by flexing waist. Return until waist, hips, and knees are extended. Repeat.','upload/exercise-picture/WTVerticalLegHipRaisePB.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(761,'Leg-Hip Raise (on stability ball)','Position ball against sturdy support. Lie with back on ball and heels on floor with legs straight. Grasp sturdy bar(s) near head for support.','Raise legs by flexing hips and knees until hips are fully flexed. Continue to raise knees toward shoulders by flexing waist, raising hips from board. Return until waist, hips and knees are extended. Repeat.','upload/exercise-picture/BWLegHipRaiseExerciseBall.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(762,'Vertical Leg-Hip Raise (Bosu support)','Position forearms on padded parallel bars with hands on handles and back on convexed surface.','Raise legs by flexing hips and knees. As hips approach full flexion, lean back. Continue to raise knees toward shoulders by flexing waist and raising hips and low back from convexed surface. Return until waist, hips, and knees are extended. Repeat.','upload/exercise-picture/BWVerticalLegHipRaiseConvex.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(763,'Vertical Straight Leg-Hip Raise (parallel bars)','Stand between parallel bars and grip bar on each side with overhand grip. Lift body off floor and balance body upright with arms straight.','Raise legs by flexing hips until fully flexed. Continue to raise feet toward bar by flexing waist. Return until waist and hips are extended downward. Repeat.','upload/exercise-picture/BWVertStraightLegHipRaiseDipBar.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(764,'Vertical Leg-Hip Raise','Position forearms on padded parallel bars with hands on handles, and back on vertical pad.','Raise legs by flexing hips and knees until hips are fully flexed. Continue to raise knees toward shoulders by flexing waist, raising hips from back board. Return until waist, hips, and knees are extended. Repeat.','upload/exercise-picture/BWVerticalLegHipRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(765,'Incline Sit-up','Hook feet under support and lie supine on incline bench with hips bent. Place hands behind neck or on side of neck.','Raise torso from bench by bending waist and hips. Return until back of shoulders contact incline board. Repeat.','upload/exercise-picture/BWInclineSitups.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(766,'Incline Sit-up (arms crossed)','Hook feet under foot brace and lie supine on incline board with hips bent. Cross arms on chest.','Raise torso from bench by bending waist and hips. Raise crossed arms over knees at top. Return until back of shoulders contact incline board. Repeat.','upload/exercise-picture/BWInclineSitupX.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(767,'Inverted Sit-up','Hang inverted from high bar with gravity boots on each leg. Lie supine with hands on floor over head.','Raise trunk as high as possible by flexing hips and waist. Return to starting position. Repeat.','upload/exercise-picture/BWInvertedSitup.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(768,'Sit-up','Hook feet under foot brace or secure low overhang. Lie supine on floor or bench with hips bent. Place hands behind neck or on side of neck.','Raise torso from bench by bending waist and hips. Return until back of shoulders contact incline board. Repeat.','upload/exercise-picture/BWSitupNeck.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(769,'Sit-up (arms crossed)','Hook feet under foot brace or secure low overhang. Lie supine on mat or bench with hips bent. Cross arms and place hands in front of shoulders.','Raise torso from mat or bench by bending waist and hips. Raise crossed arms over knees at top. Return until back of shoulders contact mat or bench. Repeat.','upload/exercise-picture/BWSitupShoulder.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(771,'Suspended Jack-knife','Sit on floor facing suspension trainer loops in low position. Place right foot in left lower loop. Cross left leg over right leg placed in right lower loop. Turn body to right and place hands on floor, shoulder width apart. Turn body to kneel on hands and knees. Reposition hands squared with desired distance from suspension trainer, shoulder width or slightly wider. With arms straight, raise knees from ground so body is supported by arms and suspension trainer.','Pull legs under torso by bending hips and knees. Pull knees toward chest hips and knees until completely flexed. Return by extending hips and knees to original position. Repeat.','upload/exercise-picture/STJackknife.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(772,'Sit-up (arms down)','Lie supine on mat or bench with hips bent and feet on floor or bench. Hook feet under foot brace or secure low overhang if required to keep feet down. Extend arms down to sides.','Raise torso from mat or bench by bending waist and hips. Extend hands toward sides of heels. Return until back of shoulders contact mat or bench. Repeat.','upload/exercise-picture/BWSitupArmsSides.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(773,'Suspended Pull Through','Sit on floor with feet under suspension trainer loops in low position. Reach and grasp bottom of loops and lay back supine. Raise legs and place heels in loops with soles contacting handles (or ankles through loops as shown). Extend legs out straight. Sit up and place hands on floor to sides at desired distance from suspension trainer. Raise hips from floor supporting upper body with arms.','Pull hips back while flexing spine in C shape. Raise hips up high by straightening spine and hips until straight.','upload/exercise-picture/STPullThrough.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(774,'V-up','Sit on floor or mat. Lie supine with hands on floor over head.','Simultaneously raise straight legs and torso. Reach toward raised feet. Return to starting position. Repeat.','upload/exercise-picture/BWVup.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(775,'Kneeling Abdominal Stretch','Kneel on floor or mat with hips straight. Place hands on back of hips','Lean torso back by arching back. Hold stretch.','upload/exercise-picture/c3e400f67216ec0dad67111d3c0e6460.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(776,'Suspended Jack-knife Pike','Sit on floor facing suspension trainer loops in low position. Place right foot in left lower loop. Cross left leg over right leg placed in right lower loop. Turn body to right and place hands on floor, shoulder width apart. Turn body to kneel on hands and knees. Reposition hands (shoulder width or slightly wider) at desired distance from suspension trainer so that body is square with suspension trainer straps. With arm straight, raise knees from ground so body is supported by arms and suspension trainer.','Pull knees toward shoulders while raising hips very high. Lower hips by extending body to original straight position, while keeping shins close to horizontal. Repeat.','upload/exercise-picture/STJackknifePike.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(778,'Front Plank','Lie prone on mat. Place forearms on mat, elbows under shoulders. Place legs together with forefeet on floor.','Raise body upward by straightening body in straight line. Hold position.','upload/exercise-picture/FrontPlank.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(779,'Lying (Prone) Abdominal Stretch','Lie prone on mat or floor. Position hands on floor to sides of shoulders.','Push torso up keeping pelvis on floor. Hold stretch.','upload/exercise-picture/8c63d5a850f5767f5c7fde0838087164.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(780,'Lying (supine) Abdominal Stretch','Lie supine on mat or floor with arms extended overhead and legs straight.','Lift chest away from lower body while reach away with arms. Hold stretch.','upload/exercise-picture/31b12e7d0a1eda93f9822786a1ea0687.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(781,'Standing Abdominal Stretch','Stand with arms extended overhead.','Arch back by lift chest up and bringing arms back as far as possible. Hold stretch.','upload/exercise-picture/bd73ab9130ed13b74774ee88fc716f62.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(782,'Abdominal Vacuum','Sit, kneel, lie, or stand.','Pull navel into spine and hold.','upload/exercise-picture/AbdominalVacuum.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(783,'Cable Side Bend','With side to low pulley, grasp stirrup attachment with near arm. Stand with arm straight.','Pull stirrup by bending sideways through waist so torso moves away from pulley. Lower stirrup by leaning torso toward pulley. Repeat. Continue with opposite side.','upload/exercise-picture/CBSideBend.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(784,'Cable Seated Cross Arm Twist','Grasp stirrup from medium height cable pulley with far hand. Sit on stool or straddle bench with lower body facing away from pulley. Allow torso to turn to side of near arm. Place far arm across body onto near arm. Support far elbow with near hand.','Rotate torso through waist to face opposite side until slight stretch if felt. Return to original side until slight stretch is felt. Repeat. Continue with opposite side.','upload/exercise-picture/CBSeatedCrossArmTwist.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(785,'Cable Seated Twist','Grasp stirrup and straddle bench orientated with side facing medium height cable pulley. Sit with feet on floor. Hold onto stirrup with both hands with arms extending out straight toward stirrup.','Keeping arms straight, rotate torso to opposite side until cable makes contact with shoulder. Return to original position and repeat. Continue with opposite side.','upload/exercise-picture/CBSeatedTwistB.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(787,'Cable Kneeling Twisting Crunch','Kneel below high pulley. Grasp cable rope attachment with both hands. Place wrists against head. Position hips back and flex hips, allowing resistance on cable pulley to lift torso upward so spine is hyperextended.','With hips stationary, flex waist to one side so elbow travels toward mid-thigh on opposite side. Return to original position and repeat on opposite side. Continue by alternating between sides.','upload/exercise-picture/CBKneelingTwistingCrunch.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(788,'Cable Side Crunch','With side close to high pulley, grasp stirrup attachment with near hand. Position stirrup at side of shoulder, palm orientated inward, and elbow down to side.','Pull stirrup downward by bending toward cable column through waist so torso moves toward base of cable column. Bend in opposite direction by leaning torso away from cable column, allowing stirrup to rise upward. Repeat. Continue with opposite side.','upload/exercise-picture/CBSideCrunch.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(789,'Cable Standing Twisting Crunch (single side)','Position back against back pad with knees slightly bent, shoulders back, and chest high. Place cable straps over shoulder. Hold against front of body with opposite hand so that cable is taut. If available, place hand in rope slot that allows cable to be taut when hand is in position with shoulders back.','Flex and twist spine so shoulder pulls strap diagonally forward and downward away from pulley. Return until back of shoulder returns to back pad and repeat.','upload/exercise-picture/LVStandingTwistingCrunchSingle.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(790,'Cable Russian Twist (on stability ball)','Grasp stirrup and sit on stability ball with side facing low cable pulley. Roll body down and lie with back on ball, hips nearly straight, and feet apart on floor. Hold onto stirrup with both hands with arms extending straight upward.','Allow resistance from cable to turn torso downward, toward direction of pulley while keeping arms straight and perpendicular to torso throughout movement. Pull stirrup in an arch over shoulders by rotating torso to opposite direction of pulley until cable makes contact with shoulder. Return to original position in opposite direction and repeat. Continue with opposite side.','upload/exercise-picture/CBRussianTwistBall.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(791,'Cable Twist','Grasp stirrup from shoulder height cable pulley with both hands. Step and turn lower body away from pulley until near arm is horizontal and straight. Position feet wide apart facing away from pulley, furthest foot further away from pulley. Raise heel of nearest foot off floor. Bend knees of both legs slightly. Place far hand over other hand or interlace fingers.','Keeping arms straight, rotate torso to opposite side until cable makes contact with shoulder. Return to original position and repeat. Continue with opposite side.','upload/exercise-picture/CBTwist.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(792,'Cable Twist (down up)','Grasp stirrup from low cable pulley. Turn to one side, away from pulley. Position feet wide apart with furthest foot away from pulley and nearest foot close to pulley. Point both feet away from pulley. Raise heel of nearest foot off floor. Bend knees of both legs slightly. Place far hand over other hand or interlace fingers.','Keeping arms straight, pull stirrup diagonally upward around shoulders by rotating torso and raising arms gradually upward until cable makes contact with side of body. Bend knees slightly more as stirrup approaches top. Return to original position and repeat. Continue with opposite side.','upload/exercise-picture/CBDownUpTwist.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(793,'Cable Twist (up down)','Grasp stirrup from shoulder height cable pulley. Turn to one side, away from pulley until near arm is extended straight. Position feet wide apart with furthest foot away from pulley and nearest foot close to pulley. Point both feet away from pulley. Raise heel of nearest foot off floor. Place far hand over other hand or interlace fingers.','Keeping arms straight, pull stirrup diagonally downward around shoulders by rotating torso and gradually lowering arms downward until cable is just above shoulder. Gradually bend knees as stirrup makes its way around body and approaches bottom. Return to original position and repeat. Continue with opposite side.','upload/exercise-picture/CBUpDownTwist.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(794,'Lever Barbell Side Bend (plate loaded)','Stand with side to bar mid-thigh height. Grasp bar and disengage.','Bend waist to opposite side of bar. Lower weight by bending toward side with bar and repeat. Continue with opposite side facing opposite direction.','upload/exercise-picture/LVSMSideBend.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(795,'Dumbbell Russian Twist (on stability ball)','With dumbbell in hand, sit on stability ball. Roll body down and lie with back on ball, hips nearly straight, and feet apart on floor. Hold onto dumbbell with both hands with arms extending straight upward.','Turn torso to one side while keeping arms straight and perpendicular to torso throughout movement. Return dumbbell back over shoulders by rotating torso to original position. Continue lowering dumbbell to opposite side. Repeat.','upload/exercise-picture/DBRussianTwistBall.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(796,'Lever Seated Side Bend','Position seat so shoulders are same height of padded lever. Sit in machine with legs to one side. Place over lever pad. Push padded lever down slightly until shoulder is fixed at approximately 90º; upper arm parallel to floor.','With hips stationary, push down lever by bending to side so elbow points downward. Return and repeat. Position lower body to opposite side and repeat.','upload/exercise-picture/LVSideBend.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(797,'Lever Seated Side Leg Raise Crunch (plate loaded)','Sit on machine with seat turned to one side. Position back against back support and lower legs under padded bar. Grasp handles above to each side.','Pull handles down while pulling lower leg bar up by flexing waist and pelvis. Return and repeat. Turn seat to opposite side and repeat.','upload/exercise-picture/LVSeatedSideLegRaiseCrunchOblique.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(799,'Lever Kneeling Twist','Adjust range of motion setting on machine to one side. Kneel on padded stool with both knees between leg pads. Place torso against upper pads and grasp handles.','Rotate lower body through waist to opposite side. Return and repeat. Adjust range of motion setting to opposite side and repeat in opposite direction.','upload/exercise-picture/LVKneelingTwist.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(800,'Dumbbell Side Bend','Grasp dumbbell with arm straight to side.','Bend waist to opposite side of dumbbell until slight stretch is felt. Lower to opposite side, same distance and repeat. Continue with opposite side.','upload/exercise-picture/DBSideBend.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(801,'Dumbbell 45° Side Bend','Position side of thigh on padding and side of feet on leg padding or platform lip. Hold dumbbell straight downward with lower arm.','Raise torso upward by lateral flexing waist. Lower torso by bending waist downward. Repeat. Position body facing opposite side and continue with opposite side.','upload/exercise-picture/DB45SideBend.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(802,'Lever Seated Twist','Adjust range of motion setting on machine to one side. Sit with legs against padding. Place torso against pad and grasp handles.','Rotate torso through waist to opposite side. Return and repeat. Adjust range of motion setting to opposite side and repeat in opposite direction.','upload/exercise-picture/LVTwist.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(803,'Lever Lying Twist','Lie in machine with hands on handles, head on pad, partition between legs, and feet on foot bars. Disengage hand lever and rotate apparatus to one side until full spinal rotation is felt. Re-engage hand lever.','Rotate torso through waist to opposite side. Return and repeat. Readjust range of motion setting to opposite side and repeat in opposite direction.','upload/exercise-picture/LVLyingTwist.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(805,'Lever Seated Twist (gripless)','Adjust range of motion setting on seat to one side. Sit with legs straddled against padding. Wrap arms behind and under padded bars around each side.','Rotate torso through waist to opposite side. Return and repeat. Adjust range of motion setting to opposite side and repeat in opposite direction.','upload/exercise-picture/LVTwistGripless.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(806,'Sled Side Leg Hip Raise (ab coaster)','Straddle machine facing handles with seat turned to one side. Grasp handles on each side and place forearms on pads. Place shins on padded sled with knees in front of turned seat and feet hanging off of back end. Sit back toward heels without bending over.','Slide forward and up by pulling knees up high. Deliberately attempt to flex waist in a \"C\" shape. Return sled down and back arching spine in opposite direction while keeping hips bent. Repeat. Turn seat to opposite side and repeat.','upload/exercise-picture/SLSideHipRaiseAbCoaster.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(808,'Lever Seated Side Crunch','Position seat so shoulders are same height of padded lever. Sit on machine with legs angled to one side. Place arms over lever pad. Push padded lever down slightly until shoulders are are approximately 90º; upper arm parallel to floor.','With hips stationary, flex waist in \"C\" shape so elbows point downward. Return and repeat. Position lower body to opposite side and repeat.','upload/exercise-picture/LVSideCrunch.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(809,'Lever Standing Side Bend','Stand with side to lever handle and grasp. Stand upright.','Bend waist to opposite side of lever. Lower weight by bending to opposite side and repeat. Continue with opposite side facing opposite direction.','upload/exercise-picture/LVStandingSideBend.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(810,'Weighted Bent-knee Lying Twist','On floor or mat, place medicine ball between bent knees. Lie on back with arms extended out to sides. Raise bent legs so thighs are vertical and lower legs are horizontal.','Lower legs to one side until side of thigh is on floor. Raise and lower legs to opposite side. Repeat.','upload/exercise-picture/WTLyingBentKneeTwist.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(811,'Weighted Lying Twist','On floor or mat, place exercise ball between lower legs. Lie on back with arms extended out to sides. Raise legs upward with knees slightly bent.','Lower legs to one side until side of thigh is on floor. Raise and lower legs to opposite side. Repeat.','upload/exercise-picture/EBLyingTwist.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(812,'Weighted 45° Side Bend','Position side of thigh on padding and side of feet on leg padding or platform lip. Hold weight to chest or behind head.','Raise torso upward by lateral flexing waist. Lower torso by bending waist downward. Repeat. Position body facing opposite side and continue with opposite side.','upload/exercise-picture/Wt45SideBend.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(813,'Weighted Russian Twist (on stability ball)','With weight plate or medicine ball in hand, sit on stability ball. Roll body down and lie with back on ball, hips nearly straight, and feet apart on floor. Hold onto weight with both hands with arms extending straight upward.','Turn torso to one side while keeping arms straight and perpendicular to torso throughout movement. Return weight back over shoulders by rotating torso to original position. Continue lowering weight to opposite side. Repeat.','upload/exercise-picture/MBRussianTwistBall.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(817,'Weighted Side Bend (on stability ball)','Lie on ball on side of torso, waist, and hip. Position legs outward with feet on floor or against floor board. Hold weight behind or above head.','Raise side of torso up by laterally flexing waist. Lower torso back on ball and repeat. Position other side on ball and repeat with opposite side.','upload/exercise-picture/WTSideBendOnBall.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(826,'Dumbbell One Arm Straight Leg Deadlift','Stand with shoulder width or wide stance. Grasp dumbbell to side. Place opposite hand to side or behind low back.','With knees straight, lower dumbbell between feet by bending hips and twisting waist, so shoulder of weighted side is turned forward. Allow hips to fall back and waist to bend as dumbbell approaches floor. Lift dumbbell upward and back to side by extending hips and waist until standing upright. Pull shoulder back if rounded. Repeat. Perform exercise with opposite arm.','upload/exercise-picture/DBOneArmStraightlegDeadlift.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(827,'Bent-knee Lying Twist','Lie on back on floor or mat with arms extended out to sides. Raise bent legs so thighs are vertical and lower legs are horizontal.','Lower legs to one side until side of thigh is on floor. Raise and lower legs to opposite side. Repeat.','upload/exercise-picture/BWLyingBentKneeTwist.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(828,'Angled Side Bridge','Place forearm on padded elevated surface, positioned perpendicular to body. Position feet out away from elevated surface, one foot in front of other with hips and knees straight. Place free hand on upper hip and allow lower hip and waist to bend downward.','Raise hips upward by lateral flexion of spine. Lower to original position and repeat. Repeat with opposite side.','upload/exercise-picture/BWAngledSideBridgeRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(829,'Lying Twist','Lie on back on floor or mat with arms extended out to sides. Raise legs upward with knees slightly bent.','Lower legs to one side until side of thigh is on floor. Raise and lower legs to opposite side. Repeat.','upload/exercise-picture/BWLyingStraightLegTwist1.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(830,'Side Bridge','Lie on side on mat. Place forearm on mat under shoulder perpendicular to body. Place upper leg directly on top of lower leg and straighten knees and hips.','Raise hips upward by lateral flexion of spine. Lower to original position and repeat. Repeat with opposite side.','upload/exercise-picture/BWSideBridgeRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(831,'Bent Knee Side Bridge','Lie on side on mat. Place forearm on mat under shoulder perpendicular to body. Bend knees at a right angle. Place upper leg directly on top of lower leg and straighten hips.','Raise hips upward by lateral flexion of spine. Lower to original position and repeat. Repeat with opposite side.','upload/exercise-picture/BWBentKneeSideBridgeRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(832,'Side Bend (on stability ball)','Lie on ball on side of torso, waist, and hip. Position legs outward with feet on floor or against floor board.','Raise side of torso up by lateral flexing waist. Lower torso back on ball and repeat. Position other side on ball and repeat with opposite side.','upload/exercise-picture/EBSideBend.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(833,'Plank Twist (on stability ball)','Kneel with chest or waist on exercise ball. Dive over top and place hands on floor with arms extended down supporting upper body. While keeping body horizontal, walk hands further away from ball until thighs are positioned on top of ball. Bend knees so feet are up above knees.','Rotate hips so thighs roll over top of ball to one side. Rotate to opposite side and repeat.','upload/exercise-picture/BWExerciseBallPlankTwist.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(834,'Incline Twisting Crunch','Hook feet under foot bar and lie supine on incline bench with hips bent. Place hands behind neck.','Flex and twist waist to raise upper torso from bench to one side. Return until back of shoulders contact padded incline board. Repeat to opposite side alternating twists.','upload/exercise-picture/BWInclineTwistingCrunchNeck.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(835,'Twisting Situp (arms crossed)','Place feet under foot bar or low overhanging stationary object. Lie supine on floor, mat, or sit-up bench with hips and knees bent. Cross arms on chest.','Flex and twist waist to one direction while raising torso from bench by bending hips. Return until back of shoulders contact floor or mat. Repeat to opposite side alternating twists.','upload/exercise-picture/BWTwistingSitupShoulders.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(836,'Incline Twisting Situp (arms crossed)','Hook feet under foot or ankle brace and lie supine on incline bench with hips and knees bent. Cross arms on chest.','Flex and twist waist to one direction while raising torso from bench by bending hips. Raise crossed arm over opposite knees at top. Return until back of shoulders contact padded incline board. Repeat to opposite side alternating twists.','upload/exercise-picture/BWInclineTwistingSitupChest.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(837,'Twisting Situp','Place feet under foot bar or low overhanging stationary object. Lie supine on floor, mat, or sit-up bench with hips and knees bent. Place hands behind neck.','Flex and twist waist to one direction while raising torso from bench by bending hips. Return until back of shoulders contact floor or mat. Repeat to opposite side alternating twists.','upload/exercise-picture/BWTwistingSitupNeck.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(838,'Incline Twisting Crunch (arms crossed)','Hook feet under foot bar and lie supine on incline bench with hips bent. Cross arms on chest.','Flex and twist waist to raise upper torso from bench to one side. Return until back of shoulders contact padded incline board. Repeat to opposite side alternating twists.','upload/exercise-picture/BWInclineTwistingCrunchChest.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(839,'Incline Twisting Situp','Hook feet under foot or ankle brace and lie supine on incline bench with hips and knees bent. Place hands behind neck.','Flex and twist waist to one direction while raising torso from bench by bending hips. Return until back of shoulders contact padded incline board. Repeat to opposite side alternating twists.','upload/exercise-picture/BWTwistingSitupsNeck.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(840,'Twisting Crunch (on stability ball)','Sit on exercise ball. Walk forward on ball and lie back on ball with shoulders and head hanging off, and knees and hips bent. Gently hyperextend back to contour of ball. Hold plate behind neck or on chest with both hands or use no weight.','Flex waist to raise upper torso. Return to original position. Repeat.','upload/exercise-picture/BWTwistingCrunchBallHead.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(841,'Side Crunch','Lie upper back supine on floor or mat. With both legs together, knees and hips bent, position outside of leg down to side. Place one hand base on of neck or place arms across upper chest.','Flex waist, raising upper torso off mat or floor. Return until back of shoulders return to mat or floor. Repeat and continue with movement in opposite position.','upload/exercise-picture/BWSideCrunchOneArm.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(842,'Suspended Side Bend','Grasp handles, step away, and face body to one side of suspension trainer anchor. Hold handles above head with arms bent. Stand far enough away to make suspension trainer straps taut. Step in just enough to achieve desired lean of body, while keeping tension on suspension trainer straps.','Lower hips away from direction of suspension trainer anchor by laterally flexing spine. Return to original upright position and repeat. Reposition body facing opposite direction. Continue with other side.','upload/exercise-picture/STSideBend.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(843,'Twisting Crunch','Lie supine on mat with lower legs on bench. Place hands behind neck or head.','Flex and twist waist to raise upper torso from mat to one side. Return until back of shoulders contact mat. Repeat to opposite side alternating twists.','upload/exercise-picture/BWTwistingCrunchHead.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(844,'Suspended Side Bridge','Sit on floor or mat, facing suspension trainer loops in low position. Grasp bottom of loops, then lay supine. Raise legs and place heels in loops with soles contacting handles. Extend legs out with one leg crossed over other. Turn on side of lower leg so legs are parallel. Place forearm on mat or floor under shoulder perpendicular to body.','Raise hips upward by lateral flexion of spine. Lower to original position and repeat. Reposition to opposite side and continue.','upload/exercise-picture/STSideBridge.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(845,'Suspended Twist','Grasp suspension handle(s) with both hands, together with either one hand over other hand or with interlaced fingers. Momentarily step back until arms are extended forward and straight. While keeping arms straight and shoulders back, step forward so body reclines back behind suspension handle(s). Position body and legs straight at desired angle, hanging from handles with arms straight. Feet can be either shoulder width or as wide as desired.','While keeping arms straight and shoulders fixed, rotate torso up to one side. Twist until upright or slight stretch is felt in waist, whichever comes soonest. Rotate back to starting position and repeat. Continue on opposite side.','upload/exercise-picture/STTwist.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(846,'Side Crunch (on stability ball)','Sit on exercise ball. Walk forward on ball and lie back on ball with shoulders and head hanging off. Switch position of feet by positioning bent leg under extended leg so waist is twisted with hip positioned sideways. Gently hyperextend back to contour of ball. Place hands behind neck or cross arms across chest.','Flex waist to raise upper torso. Return to original position and repeat. Position legs in opposite position and continue.','upload/exercise-picture/BWSideCrunchOnBall.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(847,'Suspended Twisting Jack-knife','Sit on floor facing suspension trainer loops in low position. Place right foot in left lower loop. Cross left leg over right leg placed in right lower loop. Turn body to right and place hands on floor, shoulder width apart. Turn body to kneel on hands and knees. Reposition hands (shoulder width or slightly wider) at desired distance from suspension trainer so that body is square with suspension trainer straps. With arms straight, raise knees from ground so body is supported by arms and suspension trainer.','Pull knees toward one elbow by bending hips a nd knees to one side. Twist legs to one side, until hips and knees are completely flexed. Return by extending hips and knees to original straight position. Perform movement to opposite side. Continue by alternating each side.','upload/exercise-picture/STTwistingJackknife.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(848,'Twisting Crunch (arms crossed)','Lie supine on mat with lower legs on bench. Cross arms on chest.','Flex and twist waist to raise upper torso from mat to one side. Return until back of shoulders contact mat. Repeat to opposite side alternating twists.','upload/exercise-picture/BWTwistingCrunchChest.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(849,'Lying Crossover Stretch','On floor or mat, lie supine with arms extended to sides. Lift one leg straight up.','Lower leg to opposite side toward hand. Hold stretch. Repeat with opposite side.','upload/exercise-picture/f606be3198fbe65c3c1136f9a1c73c4e.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(850,'Pretzel Stretch','Sit on floor or mat with knees straight. Place one foot on floor to outside of other knee. Turn torso toward side of bent knee supporting body with extended arm behind. Place elbow of opposite arm to outside of bent knee.','Turn torso further around by pushing side of knee with elbow. Hold stretch. Repeat with opposite side.','upload/exercise-picture/dad74d1575d3cc3c6a0ba8f858c3a909.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(851,'Seated Bent Leg Oblique Stretch','Sit on floor or mat. Lean back slightly and place arms behind body with hands on floor for support. Bend knees and hips and place feet flat on floor.','Bring both knees and hip to one side. Hold stretch. Repeat with opposite side.','upload/exercise-picture/0431eaab87f7ddf8f7f0806f3a80d345.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(852,'Lying Bent Leg Oblique Stretch','Lie supine on floor or mat. Bend knees and place feet flat on floor.','Bring both knees and hip to one side. Hold stretch. Repeat with opposite side.','upload/exercise-picture/190c5905bcd45a2c9a98a05429b1c8d6.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(853,'Side Plank','Lie on side on mat. Place forearm on mat under shoulder perpendicular to body. Place upper leg directly on top of lower leg and straighten knees and hips.','Raise body upward by straightening waist so body is ridged. Hold position. Repeat with opposite side.','upload/exercise-picture/SidePlankElbow.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(854,'Bent Knee Side Plank','Lie on side on mat. Place forearm on mat under shoulder perpendicular to body. Bend knees at a right angle. Place upper leg directly on top of lower leg and straighten hips.','Raise body upward by straightening waist so hips and waist are ridged. Hold position. Repeat with opposite side.','upload/exercise-picture/SidePlankElbowKnee.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(855,'Barbell Back Extension (on hyperextension apparatus)','Position thighs prone on large pad and lower legs under padded bar. Place barbell on back of shoulders and grasp bar to sides.','Lower body by bending waist until fully flexed. Raise or extend waist until torso is parallel to legs. Repeat.','upload/exercise-picture/BBBackExtention.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(856,'Barbell Bent Knee Good-morning','Position barbell on back of shoulders and grasp bar to sides.','Bend hips to lower torso forward until parallel to floor. Bend knees slightly during descent. Raise torso until hips are extended. Repeat.','upload/exercise-picture/BBBentKneeGoodMorning.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(857,'Barbell Deadlift','With feet flat beneath bar, squat down and grasp bar with shoulder width or slightly wider overhand or mixed grip.','Lift bar by extending hips and knees to full extension. Pull shoulders back at top of lift if rounded. Return and repeat.','upload/exercise-picture/BBDeadlift.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(858,'Barbell Hyperextension','Position thighs prone on large pad and lower legs under padded brace. Place barbell on back of shoulders and grasp bar to sides.','Raise upper body until hips and waist are fully extended. Lower body by bending hips and waist until fully flexed. Repeat.','upload/exercise-picture/BBHyperExtention.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(859,'Barbell Sumo Deadlift','Position feet under bar with very wide stance. Squat down and grasp bar between legs with shoulder width mixed grip. Face forward while positioning shoulders upward with arms straight, chest high, hips low, and back straight.','Pull bar up by driving feet outward while pulling chest up. Extend knees when bar passes knees. At top of lift, when torso is upright, drive shoulders back and chest up. Return weight to floor by bending hips back and knees pointed outward, while keeping chest high and back straight. Repeat.','upload/exercise-picture/BBSumoDeadlift.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(860,'Barbell 45° Hyperextension','Position thighs prone on padding. Hook heels on platform lip or under padded brace. Place barbell on back of shoulders and grasp bar to sides.','Raise upper body until hips and waist are fully extended. Lower body by bending hips and waist until fully flexed. Repeat.','upload/exercise-picture/BBHyperextension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(861,'Barbell 45° Back Extension (on hyperextension apparatus)','Position thighs prone on padding. Hook heels on platform lip or under padded brace. Place barbell on back of shoulders and grasp bar to sides.','Lower body by bending waist until fully flexed. Raise, or extend waist until torso is parallel to legs. Repeat.','upload/exercise-picture/BBBackExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(862,'Barbell Block Pull','With barbell on blocks, position feet shoulder width or slightly narrower beneath bar. Squat down and grasp bar with shoulder width or slightly wider overhand or mixed grip.','Lift bar by extending hips and knees to full extension. Pull shoulders back at top of lift if rounded. Return and repeat.','upload/exercise-picture/BBBlockPull.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(863,'Barbell Sumo Block Pull','With barbell on blocks, position feet under bar with very wide stance. Squat down and grasp bar between legs with shoulder width mixed grip. Face forward while positioning shoulders upward with arms straight, chest high, hips low, and back straight.','Pull bar up by driving feet outward while pulling chest up. Extend knees when bar passes knees. At top of lift, when torso is upright, drive shoulders back and chest up. Return weight to blocks by bending hips back and knees pointed outward, while keeping chest high and back straight. Repeat.','upload/exercise-picture/BBBlockSumoPull.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(864,'Barbell Deficit Deadlift','Stand on weight plate, bumper plate, or shallow elevated platform with loaded bar above feet. Squat down and grasp bar with shoulder width or slightly wider overhand or mixed grip.','Lift bar by extending hips and knees to full extension. Pull shoulders back at top of lift if rounded. Return weights to floor by bending hips back while allowing knees to bend forward, keeping back straight and knees pointed same direction as feet. Repeat.','upload/exercise-picture/BBDeficitDeadlift.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(865,'Barbell Rack Pull','In power rack, with barbell on safety bar in low position, place feet shoulder width or slightly narrower beneath bar. Squat down and grasp bar with shoulder width or slightly wider overhand or mixed grip.','Lift bar by extending hips and knees to full extension. Pull shoulders back at top of lift if rounded. Return and repeat.','upload/exercise-picture/BBRackPullLow.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(866,'Cable Stiff Leg Deadlift','Stand between two very low pulleys with shoulder width or narrower stance. Squat down and grasp stirrup attachments to each side. Stand upright with arms straight down to sides.','Bow forward by bending hips. Bend knees slightly during descent and keep waist straight, flexing low back at bottom. With knees slightly bent, raise torso by extending at waist, then hips, gradually extending knees until standing upright. Pull shoulders back slightly if rounded. Repeat.','upload/exercise-picture/CBStiffLegDeadlift.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(867,'Barbell Stiff Leg Deadlift','Stand with shoulder width or narrower stance on shallow platform with feet flat beneath bar. Bend knees and bend over with lower back straight. Grasp barbell with shoulder width overhand or mixed grip, shoulder width or slightly wider. Lift weight to standing position.','Lower bar to top of feet by bending hips. Bend knees slightly during descent and keep waist straight, flexing only slightly at bottom. With knees bent, lift bar by extending at hips until standing upright. Pull shoulders back slightly if rounded. Extend knees at top if desired. Repeat.','upload/exercise-picture/BBStiffLegDeadlift.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(868,'Trap Bar Deadlift','Stand with feet shoulder width or narrower in trap bar, weight to each side. Squat down with feet flat, low back taut. Grasp handles to sides.','Lift bar by extending hips and knees to full extension. Pull shoulders back at top of lift if rounded. Return and repeat.','upload/exercise-picture/TBDeadlift.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(869,'Trap Bar Stiff Leg Deadlift','Stand on platform under loaded trap bar. Squat down and grasp handles to sides. Squat / Deadlift bar up to standing position.','Lower bar by bending hips. Bend knees slightly during descent and keep waist straight, flexing only slightly at bottom. With knees bent, lift bar by extending at hips until standing upright. Pull shoulders back slightly if rounded. Extend knees at top if desired. Repeat.','upload/exercise-picture/TBStiffLegDeadlift.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(870,'Barbell Straight Leg Deadlift','Stand with shoulder width or narrower stance on shallow platform with feet flat beneath bar. Bend knees and bend over with lower back straight. Grasp barbell with shoulder width overhand or mixed grip, shoulder width or slightly wider. Lift weight to standing position.','With knees straight, lower bar toward top of feet by bending hips and waist. Lift bar by extending waist and hip until standing upright. Pull shoulders back slightly if rounded. Repeat.','upload/exercise-picture/BBStraightLegDeadlift.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(871,'Trap Bar Straight Leg Deadlift','Stand on platform under loaded trap bar. Squat down and grasp handles to sides. Squat / Deadlift bar up to standing position.','With knees straight, lower bar down by bending hips. After hips can no longer flex, bend waist as weights approach floor. Hands should be lowered near sides of ankles. Set weight on floor. Lift bar by extending waist and hip until standing upright. Pull shoulders back slightly if rounded. Repeat.','upload/exercise-picture/TBStraightLegDeadlift.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(872,'Dumbbell Straight Leg Deadlift','Stand with shoulder width or narrower stance. Grasp dumbbells to sides.','With knees straight, lower dumbbells to top or sides of feet by bending hips. Allow hips to fall back and bend waist as dumbbell approaches feet. Lift dumbbells by extending hips and waist until standing upright. Pull shoulders back if rounded. Repeat.','upload/exercise-picture/DBStraightLegDeadlift.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(873,'Lever Deadlift (plate loaded)','Stand in between lever handles. Squat down with feet flat and grasp handles to sides.','Lift lever by extending hips and knees to full extension. Pull shoulders back at top of lift if rounded. Return and repeat.','upload/exercise-picture/LVDeadliftA.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(874,'Cable Straight Leg Deadlift','Stand between two very low pulleys with shoulder width or narrower stance. Squat down and grasp stirrup attachments to each side. Stand upright with arms straight down to sides.','With knees straight, bow forward by bending hips. Bend waist as stirrups approach lowest position. Lift dumbbells by extending hips and waist until standing upright. Pull shoulders back slightly if rounded. Repeat.','upload/exercise-picture/CBStraightLegDeadlift.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(876,'Lever Kneeling Back Extension','Slide back under lever pad and kneel on lower pad. Grasp handles and position feet on foot bars. Make sure knees are against knee pad and hips are against upper thigh pad.','Extend spine until hyperextended. Return and repeat.','upload/exercise-picture/LVKneelingBackExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(877,'Lever Back Extension','Sit on machine with back against padded lever. Push hips back against back of seat by pushing feet against platform. Arch back in \"C\" shape.','Extend spine until hyperextended. Return and repeat.','upload/exercise-picture/LVBackExtensionN.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(878,'Lever Stiff Leg Deadlift (plate loaded)','Stand between lever handles with shoulder width or narrower stance. Squat down and grasp handles to each side. Stand upright with arms straight down to sides.','Bow forward by bending hips. Bend knees slightly during descent and keep waist straight, flexing low back at bottom. With knees slightly bent, raise torso by extending at waist, then hips, gradually extending knees until standing upright. Pull shoulders back slightly if rounded. Repeat.','upload/exercise-picture/LVStiffLegDeadlift.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(879,'Lever Straight Leg Deadlift (plate loaded)','Stand between lever handles with shoulder width or narrower stance. Squat down and grasp handles to each side. Stand upright with arms straight down to sides.','With knees straight, bow forward by bending hips. Bend waist as stirrups approach lowest position. Lift lever by extending hips and waist until standing upright. Pull shoulders back slightly if rounded. Repeat.','upload/exercise-picture/LVStraightLegDeadlift.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(880,'Smith Deadlift','Stand with shoulder width or narrower stance with feet flat beneath bar. Grasp bar with shoulder width or slightly wider mixed grip or slightly wider. Disengage bar by rotating bar back.','Squat down to lower bar by bending hips and knees. Lift bar by extending hips and knees to full extension. Pull shoulders back at top of lift if rounded. Return and repeat.','upload/exercise-picture/SMDeadlift.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(881,'Smith Stiff Leg Deadlift','Stand with shoulder width or narrower stance on elevated platform with thigh against bar. Grasp bar with shoulder width or slightly wider overhand grip. Disengage bar by rotating bar back.','With knees slightly bent, Lower bar toward top of feet by bending hips. Keep waist straight, flexing only slightly at bottom. Lift bar by extending at hips until standing upright. Pull shoulders back slightly if rounded. Extend knees at top if desired. Repeat.','upload/exercise-picture/SMStiffLegDeadlift.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(884,'Smith Bent Knee Good-morning','Position bar on back of shoulders. Grasp bar to sides. Disengage bar by rotating bar back.','Bend hips to lower torso forward until parallel to floor. Bend knees slightly during descent. Raise torso until hips are extended. Repeat.','upload/exercise-picture/SMBentkneeGoodmorning.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(885,'Smith Straight Leg Deadlift','Stand with shoulder width or narrower stance on elevated platform with thigh against bar. Grasp bar with shoulder width or slightly wider overhand grip. Disengage bar by rotating bar back.','With knees straight, lower bar toward top of feet by bending hips. After hips can no longer flex, bend waist as bar approaches top of feet. Lift bar by extending waist and hip until standing upright. Pull shoulders back slightly if rounded. Repeat.','upload/exercise-picture/SMStraightLegDeadlift.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(886,'Weighted Hyperextension','Position thighs prone on large pad and lower legs under padded brace. Hold weight to chest or behind neck.','Raise upper body until hips and waist are fully extended. Lower body by bending hips and waist until fully flexed. Repeat.','upload/exercise-picture/WTHyperExtension3.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(888,'Weighted Back Extension (on hyperextension apparatus)','Position thighs prone on large pad and lower legs under padded brace. Hold weight to chest or behind neck.','Lower body by bending waist until fully flexed. Raise, or extend waist until torso is parallel to legs. Repeat.','upload/exercise-picture/WTBackExtension2.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(889,'Weighted 45° Hyperextension','Position thighs prone on padding. Hook heels on platform lip or under padded brace. Hold weight to chest or behind neck.','Raise upper body until hips and waist are fully extended. Lower body by bending hips and waist until fully flexed. Repeat.','upload/exercise-picture/WtHyperExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(890,'Weighted Back Extension (on stability ball)','Lie prone on ball. Position toes out wide on floor for balance. Hold weight under chin or behind neck.','Raise torso off of ball by hyperextending spine. Return torso to ball and repeat.','upload/exercise-picture/SBHyperextention.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(891,'Weighted 45° Back Extension (on hyperextension apparatus)','Position thighs prone on padding. Hook heels on platform lip or under padded brace. Hold weight to chest or behind neck.','Lower body by bending waist until fully flexed. Raise, or extend waist until torso is parallel to legs. Repeat.','upload/exercise-picture/WTBackExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(892,'Back Extension (on stability ball, arms crossed)','Lie prone on ball, with front of feet apart on floor or with feet against base of wall. Cross arms, hands in front of shoulders.','Raise torso off of ball by hyperextending spine. Return torso to ball and repeat.','upload/exercise-picture/BWHyperextensionBallArmsCrossed.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(893,'Back Extension (on stability ball, arms up)','Lie prone on ball with feet against base of wall. Place arms parallel out over floor beyond head.','Raise torso off of ball and hands over head by hyperextending spine. Return torso to ball and hands toward floor. Repeat.','upload/exercise-picture/BWHyperextensionBallArmsUp.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(895,'Back Extension (on stability ball, arms down)','Lie prone on ball with feet against base of wall. Place arms to sides or clasp hands behind hips.','Raise torso off of ball by hyperextending spine. Return torso to ball and repeat.','upload/exercise-picture/BWHyperextensionBall.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(896,'Bird Dog','Kneel on mat on all fours with legs and hands slightly apart.','Raise arm out straight beside head while raising and extending leg on opposite side up out behind body. Lower arm and leg to floor to original position and repeat. Perform movement with opposite arm and leg.','upload/exercise-picture/BWBirdDog.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(897,'Alternating Bird Dog','Kneel on mat on all fours with legs and hands slightly apart.','Raise left arm out straight beside head while raising and extending right leg up out behind body. Lower arm and leg to floor to original position. Repeat by raising and lowering right arm and left leg in same manner. Repeat by alternating between opposite sides.','upload/exercise-picture/BWAlternatingBirdDog.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(898,'Hanging Hyperextension','Stand behind bar facing elevated platform positioned slightly away on other side of bar. Grasp bar with slightly wider than shoulder width grip. Walk body under bar and position back of heels on elevated platform. With legs extended forward, hang under bar with arms straight and hips bent just above floor.','Raise hips up as high as possible by extending hips and spine. Lower hips to original position just above floor. Repeat.','upload/exercise-picture/BWHangingHyperextension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(899,'Alternating Bird Dog (on exercise ball)','Lay on top of exercise ball with legs and hands slightly apart. Place chest down so torso is wrapped over ball.','Raise left arm and torso upward beside head while raising right leg up behind body. Lower arm, torso, and leg to original position and repeat. Repeat by raising and lowering right arm and left leg in same manner. Repeat by alternating between opposite sides.','upload/exercise-picture/BWAlternBirdDogHyperExBall.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(900,'Hyperextension (arms crossed)','Position thighs prone on large pad and lower legs under padded brace. Cross arms on chest.','Raise upper body until hips and waist are fully extended. Lower body by bending hips and waist until fully flexed. Repeat.','upload/exercise-picture/BWHyperExtensionX.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(901,'Bird Dog (on stability ball)','Lay on top of exercise ball with legs and hands slightly apart. Place chest down so torso is wrapped over ball.','Raise arm and torso upward beside head while raising leg on opposite side up out behind body. Lower arm, torso, and leg to original position and repeat. Perform movement with opposite arm and leg.','upload/exercise-picture/BWBirdDogHyperExBall.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(902,'Superman','Lie prone on mat with legs together and arms extended out on floor approximately parallel.','Slowly raise upper body and legs off floor. Return upper body and legs to floor and repeat.','upload/exercise-picture/Superman.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(903,'Contralateral Superman','Lie prone on mat with legs together and arms extended out on floor approximately parallel.','Raise left arm and shoulder and right leg up off floor. Lower arm and shoulder and leg to floor. Repeat by raising and lowering right arm and shoulder and left leg. Repeat by alternating between opposite sides.','upload/exercise-picture/ContraLateralSuperman.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(904,'Hyperextension','Position thighs prone on large pad and lower legs under padded brace. Place hands behind neck or to sides of head.','Raise upper body until hips and waist are fully extended. Lower body by bending hips and waist until fully flexed. Repeat.','upload/exercise-picture/BWHyperExtensionHead.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(905,'Hyperextension (hands behind hips)','Position thighs prone on large pad and lower legs under padded brace. Clasp hands behind hips.','Raise upper body until hips and waist are fully extended. Lower body by bending hips and waist until fully flexed. Repeat.','upload/exercise-picture/BWHyperExtensionHips.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(906,'Cat Stretch','Kneel on mat or floor. Place hands shoulder width apart.','Flex spine by hunching back up. Hold stretch.','upload/exercise-picture/85a341a1a24012749fe473a1106c6984.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(907,'Rear Incline Bridge','Sit on mat with legs together. Place hands back to sides on floor or mat so torso is reclined back slightly.','Raise hips up off floor until hips are straight. Hold position.','upload/exercise-picture/RearInclineBridge.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(908,'Bent-over Cat Stretch','Bend over with hands just above bent knees.','Flex spine by hunching back up. Hold stretch.','upload/exercise-picture/b5749d48d4c58dbce20b4c492af82004.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(909,'Cat Movement','Kneel on mat or floor. Place hands shoulder width apart.','Flex spine by hunching back up. Extend spine by arching back. Repeat.','upload/exercise-picture/CatMovement.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(910,'Lying Lower Back Stretch','Lie supine on floor or mat. Raise both knees and grasp back of thighs behind knees.','Pull knees toward shoulders allowing hips to be raised further off floor. Hold stretch.','upload/exercise-picture/ef0e66c71170773cedd6aaa015f334af.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(911,'Seated Lower Back Stretch','Sit on floor or mat with feet apart and knees bent approximately 90 degrees.','Reach forward between feet. Hold stretch.','upload/exercise-picture/d852814763a527dc7329c405e0155655.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(912,'Lever Lower Back Stretch','Sit on seat in forward position with lower legs on shin pad, feet on foot rest. Place hands through wrist straps. Hold upper bar with overhand grip.','Push and lower seat back. Hold stretch.','upload/exercise-picture/PCLowBack8.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(913,'Suspended Hyperextension','Grasp suspension handles and momentarily step back until arms are extended forward and straight. While keeping arms straight and shoulders back, step forward so body reclines back behind suspension handles. Fold at hips onto heels, allowing rear end to fall far back with arms and shoulders stretched forward.','Drive hips forward until hips are straight, while keeping arms and shoulders straight. Near top of motion, reach back with arms over head and hyperextend spine. While keeping arms over head, lower body with hips falling back down to starting position and repeat.','upload/exercise-picture/STHyperextension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(915,'Rear Decline Bridge','Lie supine on mat with arms to sides. Place feet flat on floor or mat with knees bent.','Raise hips up off floor until hips are straight. Hold position.','upload/exercise-picture/RearDeclineBridge.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(916,'Seated Bent-over Lower Back Stretch','Sit on chair or bench with feet wide apart. Bend over and position shoulders between knees.','Reach to floor under back of chair. Hold stretch.','upload/exercise-picture/764b4335143f6a5842325004e906a3f8.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(917,'Squatting Lower Back Stretch','Stand facing hip height fixed bar approximately arm length away. Grasp fixed bar.','Keeping feet flat on floor, squat down as low as possible and bend down with arms straight. Lean back slightly and allow shoulders to stretch forward. Hold stretch.','upload/exercise-picture/a1bb91259e95d163254658e3d2d1d6a2.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(918,'Plow Stretch','Lie on back and lift legs and hip overhead.','Allow knees to drop toward floor to sides of head. Hold stretch.','upload/exercise-picture/81ec4b57c0839751142053459f41f27c.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(919,'Barbell Seated Good-morning','Position barbell on back of shoulders and grasp bar to sides. Sit on end of bench or corner of box secured to floor. Position feet apart on floor with knees slightly bent.','Keeping back straight, bend torso forward as low as possible by bending hips. Raise torso until torso is upright. Repeat.','upload/exercise-picture/BBSeatedGoodMorning.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(926,'Barbell Single Leg Stiff-leg Deadlift','Hold barbell down in front, arms straight with shoulder width or slightly wider overhand grip. Stand with feet together. Lift leg slightly so foot is just off floor.','Lower bar to floor while raising lifted leg back behind. Keep back straight and knee of supporting leg slightly bent. Keep hip and knee of lifted leg extended throughout movement. Once stretch is felt or barbell contacts floor, return to original position by raising torso while lowering lifted leg. Straighten knee of supporting leg as torso becomes upright. Repeat.','upload/exercise-picture/BBSingleLegStiffLegDeadlift_.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(929,'Barbell Straight-back Stiff-leg Deadlift','Grasp barbell from rack or deadlift from floor with shoulder width or slightly wider overhand or mixed grip. Stand with shoulder width or narrower stance.','With back straight, lower bar to top of feet by bending hips. Bend knees slightly during descent and keep waist straight. Place weight onto floor. With knees still bent, lift bar by straightening hips until standing upright. Pull shoulders back if rounded. Extend knees at top if desired. Repeat.','upload/exercise-picture/BBStraightBackStiffLegDeadlift.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(930,'Barbell Hip Thrust','Sit on floor with long side of bench behind back. Roll barbell back and center over hips. Position upper back on corner of bench. Place feet on floor approximately shoulder width with knees bent. Grasp bar to each side.','Raise bar upward by extending hips until straight. Lower and repeat.','upload/exercise-picture/BBHipThrust.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(931,'Barbell Single Leg Split Squat','Stand facing away from bench. Position bar on back of shoulders and grasp barbell to sides. Extend leg back and place top of foot on bench.','Squat down by flexing knee and hip of front leg until knee of rear leg is almost in contact with floor. Return to original standing position by extending hip and knee of forward leg. Repeat. Continue with opposite leg.','upload/exercise-picture/BBSingleLegSplitSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(932,'Barbell Lunge','Clean bar from floor or dismount bar from rack. From rack with barbell upper chest height, position bar on back of shoulders and grasp barbell to sides.','Lunge forward with first leg. Land on heel, then forefoot. Lower body by flexing knee and hip of front leg until knee of rear leg is almost in contact with floor. Return to original standing position by forcibly extending hip and knee of forward leg. Repeat by alternating lunge with opposite leg.','upload/exercise-picture/BBLungeGlute.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(933,'Barbell Rear Lunge','From rack with barbell upper chest height, position bar on back of shoulders and grasp barbell to sides. Dismount bar from rack.','Step back with one leg while bending supporting leg. Plant forefoot far back on floor. Lower body by flexing knee and hip of supporting leg until knee of rear leg is almost in contact with floor. Return to original standing position by extending hip and knee of forward supporting leg and return rear leg next to supporting leg. Repeat movement with opposite legs alternating between sides.','upload/exercise-picture/BBRearLunge.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(934,'Barbell Single Leg Squat','Stand with arms extended out in front holding barbell. Balance on one leg with opposite leg extended straight leg forward as high as possible.','Squat down as far as possible while keeping leg elevated off of floor. Keep\n\n\nsupporting knee pointed same direction as foot supporting. Raise body back up to original position until knee and hip of supporting leg is straight. Return and repeat. Continue with opposite leg.','upload/exercise-picture/BBSingleLegSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(935,'Barbell Side Lunge','Clean bar from floor or dismount bar from rack. From rack with barbell upper chest height, position bar on back of shoulders and grasp barbell to sides.','Lunge to one side with first leg. Land on heel, then on forefoot. Lower body by flexing knee and hip of lead leg, keeping knee pointed same direction of foot. Return to original standing position by forcibly extending hip and knee of lead leg. Repeat by alternating lunge with opposite leg.','upload/exercise-picture/BBSideLunge.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(936,'Barbell Squat (low bar)','From rack with barbell at upper chest height, position bar low on back of shoulders. Grasp barbell to sides. Dismount bar from rack and stand with wide stance.','Squat down by bending hips back while allowing knees to bend forward slightly, keeping back straight and knees pointed same direction as feet. Descend until thighs are just past parallel to floor. Extend hips and knees until legs are straight. Return and repeat.','upload/exercise-picture/BBSquatPowerlift.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(937,'Barbell Walking Lunge','Position barbell on back of shoulders and grasp bar to sides.','Step forward with first leg. Land on heel, then forefoot. Lower body by flexing knee and hip of front leg until knee of rear leg is almost in contact with floor. Stand on forward leg with assistance of rear leg. Lunge forward with opposite leg. Repeat by alternating lunge with opposite legs.','upload/exercise-picture/BBWalkingLunge.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(938,'Barbell Split Squat','Position barbell on back of shoulders and grasp barbell to sides. Stand with feet far apart; one foot forward and other foot behind.','Squat down by flexing knee and hip of front leg. Allow heel of rear foot to rise up while knee of rear leg bends slightly until it almost makes contact with floor. Return to original standing position by extending hip and knee of forward leg. Repeat. Continue with opposite leg.','upload/exercise-picture/BBSplitSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(939,'Safety Barbell Squat','Standing facing safety barbell on rack upper chest height. Position head in yoke with padded bar around shoulders. Hands can be placed on ends of yoke (as shown) or on safety bar out to sides. Dismount bar from rack and step back.','Squat down by bending hips back while allowing knees to bend slightly forward, keeping back straight and knees pointed same direction as feet. Descend until thighs are just past parallel to floor. Stand by extending hips and knees until legs are straight. Repeat.','upload/exercise-picture/SBSquatC.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(940,'Barbell Full Squat','From rack with barbell upper chest height, position barbell on back of shoulders and grasp bar to sides. Dismount bar from rack.','Squat down by bending hips back while allowing knees to bend forward, keeping back straight and knees pointed same direction as feet. Descend until knees and hips are fully bent. Extend knees and hips until legs are straight. Return and repeat.','upload/exercise-picture/BBFullSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(941,'Safety Barbell Squat (long handles)','Standing facing safety barbell on rack upper chest height. Position head in yoke with padded bar around shoulders. Grasp ends of handles. Dismount bar from rack and step back.','Squat down by bending hips back while allowing knees to bend slightly forward, keeping back straight and knees pointed same direction as feet. Descend until thighs are just past parallel to floor. Stand with or without assistance of arms, extending knees and hips until legs are straight. Repeat.','upload/exercise-picture/SBSquatHandles.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(942,'Barbell Hack Squat','Position barbell just behind legs. With feet flat on floor, squat down and grasp barbell from behind with overhand grip.','Lift bar by extending hips and knees to full extension. Squat down by bending knees forward while allowing hips to bend back behind, keeping back straight and knees pointed same direction as feet. Descend until thighs are close to parallel to floor and bar is behind lower leg. Repeat.','upload/exercise-picture/BBHackSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(943,'Barbell Box Squat','From rack with barbell at upper chest height, position bar on back of shoulders. Grasp barbell to sides. Dismount bar from rack and back up until contact is made with box immediately behind. Stand with wide stance with feet flared out slightly.','Sit back onto box by bending hips back while bending knees, keeping shins nearly perpendicular or knees slightly behind ankles. Lower rear end back onto box in controlled manner. Rock torso back slightly. Once torso rocks forward, immediately stand back up rapidly by driving hips upward, keeping knees above ankles and chest high until legs are straight. Return and repeat.','upload/exercise-picture/BBBoxSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(944,'Barbell Zercher Squat','From rack with barbell upper waist height position, forearms under bar and in front of bar with elbows shoulder width apart. Cross wrists and pull bar in, close against body. Lift barbell from rack. Step back with wide stance, feet pointing out 20-30°.','Squat down by bending hips back while allowing knees to bend forward, keeping back straight, hands close to body, and knees pointed same direction as feet. Descend until thighs are near parallel. Extend knees and hips until legs are straight. Return and repeat.','upload/exercise-picture/BBZercherSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(945,'Safety Barbell Squat (self-spotting)','Stand facing safety barbell on rack upper chest height. Place hands vertical rack supports. Position head in yoke with padded bar around shoulders. Dismount bar from rack and step back so body is upright at arms length from supports.','Squat down by bending hips back while allowing knees to bend forward slightly, keeping back straight and knees pointed same direction as feet. Descend until thighs are just past parallel to floor. Stand with or without assistance of arms, extending hips and knees until legs are straight. Repeat.','upload/exercise-picture/SBSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(946,'Trap Bar Squat','Stand on platform under loaded trap bar. Squat down until thighs are just past parallel to floor with knees pointed same direction as feet and feet flat on platform. Grasp handles to sides. Posture chest up with back arched tightly.','Lift weight upward by extending knees and hips until straight. Pull shoulders back at top of lift if rounded. Return weight to floor by bending hips back, while allowing knees to bend forward slightly, keeping back straight and knees pointed same direction as feet. Repeat.','upload/exercise-picture/TBSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(947,'Barbell Squat (with chains)','Stand facing barbell, racked upper chest height, with thick chains hanging to floor on each side. Position bar low on back of shoulders. Grasp barbell to sides and position elbows back. Dismount bar from rack and stand with wide stance.','Squat down by bending hips back while allowing knees to bend forward slightly, keeping back straight and knees pointed same direction as feet.\n\n\nDescend until thighs are just past parallel to floor. Extend hips and knees until legs are straight. Return and repeat.','upload/exercise-picture/BBSquatChains.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(948,'Barbell Front Squat','From rack with barbell upper chest height, position bar in front of shoulders. Cross arms and place hands on top of barbell with upper arms parallel to floor. Dismount bar from rack.','Squat down by bending hips back while allowing knees to bend forward, keeping back straight and knees pointed same direction as feet. Descend until thighs are just past parallel. Extend knees and hips until legs are straight. Return and repeat.','upload/exercise-picture/BBFrontSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(949,'Barbell Lateral Step-up','Stand between two benches, one to each side. Position bar on back of shoulders and grasp barbell to sides.','Lift leg and place foot on bench to side and forward of straight knee. Stand on bench by straightening leg and pushing body upward. Step down returning feet to original position. Repeat with opposite leg, alternating between legs.','upload/exercise-picture/BBLateralStepUp.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(950,'Cable Rear Lunge','Stand between two very low pulleys with shoulder width or narrower stance. Squat down and grasp stirrup attachments to each side. Stand upright with arms straight down to sides.','Step back with one leg while bending supporting leg. Plant forefoot far back on floor. Lower body by flexing knee and hip of supporting leg until knee of rear leg is almost in contact with floor. Return to original standing position by extending hip and knee of forward supporting leg and return rear leg next to supporting leg. Repeat movement with opposite legs alternating between sides.','upload/exercise-picture/CBRearLunge.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(952,'Barbell Step-up','Stand facing side of bench. Position bar on back of shoulders and grasp barbell to sides.','Place foot of first leg on bench. Stand on bench by extending hip and knee of first leg and place foot of second leg on bench. Step down with second leg by flexing hip and knee of first leg. Return to original standing position by placing foot of first leg to floor. Repeat first step with opposite leg alternating first steps between legs.','upload/exercise-picture/BBStepUp.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(954,'Trap Bar Straight-back Stiff-leg Deadlift','Stand with feet shoulder width or narrower in trap bar, weight to each side. Squat down with feet flat and grasp handles to sides. Deadlift from floor.','With back straight, lower bar toward floor by bending at hips. Bend knees slightly during descent and keep waist straight. Place weight onto floor. With knees still bent, lift bar by extending at hips until standing upright. Pull shoulders back if rounded. Extend knees at top if desired. Repeat.','upload/exercise-picture/TBStraightBackStiffLegDeadlift.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(955,'Cable One Arm Single Leg Split Squat','Stand between bench and low pulley cable. Grasp cable stirrup with one hand. Facing low pulley, extend leg back and place top of foot or forefoot on bench. Place other hand on hip or support to side.','Squat down by flexing knee and hip of front leg until knee of rear leg is almost in contact with floor. Return to original standing position by extending hip and knee of forward leg. Repeat. Continue with opposite leg.','upload/exercise-picture/CBSingleLegSplitSquatOneArm.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(956,'Cable Split Squat (belt)','Facing low pulley, kneel to attach cable belt or dip belt around waist. Place hand(s) on ballet bar or machine (not on guide rod!) for balance. Stand away from pulley with one leg forward and opposite leg to rear.','Squat down by flexing knee and hip of front leg. Allow heel of rear foot to rise up while knee of rear leg bends slightly until it almost makes contact with floor. Return to original straddle position by extending hip and knee of forward leg. Repeat. Continue with legs in opposite position.','upload/exercise-picture/CBLungeFar.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(957,'Cable Rear Step-down Lunge','Stand on upper platform with stirrups grasped to sides.','Extend one leg back on forefoot. Lower body on other leg by flexing knee and hip of front leg until knee of rear leg is almost in contact with lower platform. Return to original standing position by extending hip and knee of forward leg. Repeat by alternating rear lunge with opposite leg.','upload/exercise-picture/CBRearLunge.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(958,'Cable Single Leg Split Squat','Facing away from bench, stand between two very low pulleys with shoulder width or narrower stance. Squat down and grasp stirrup attachments to each side. Stand upright with arms straight down to sides. Extend leg back and place top of foot on bench.','Squat down by flexing knee and hip of front leg until knee of rear leg is almost in contact with floor. Return to original standing position by extending hip and knee of forward leg. Repeat. Continue with opposite leg.','upload/exercise-picture/CBSingleLegSplitSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(959,'Cable Bar Squat','Adjust cable pulleys to medium low positions. Kneel under attached cable bar while supporting it with both hands. Position body in lower squat position with cable bar on top of shoulders, both feet flat on floor with mid feet in line with both pulleys, knees positioned same direction as feet, back straight and angled forward, and hands grasping bar to each side.','Stand up by extending hips and knees until legs are straight. Squat back down by bending hips back while allowing knees to bend slightly forward, keeping back straight and knees pointed same direction as feet. Descend until thighs are just past parallel to floor. Return and repeat.','upload/exercise-picture/CBBarSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(960,'Cable One Arm Split Squat','Face low pulley and grasp stirrup attachment with one hand. Stand away from pulley with one leg forward and opposite leg to rear. Place other hand on hip or on support to side.','Squat down by flexing knee and hip of front leg. Allow heel of rear foot to rise up while knee of rear leg bends slightly until it almost makes contact with floor. Return to original straddle position by extending hip and knee of forward leg. Repeat. Continue with legs in opposite position.','upload/exercise-picture/CBLungeOneArm.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(961,'Cable Standing Hip Extension','Attach ankle cuff to low pulley. With cuff on one ankle, grasp ballet bar with both hands and step back with other foot. Elbows remain straight. Attached leg is straight and foot is slightly off floor.','Pull cable attachment back by extending hip. Return leg to original position. Repeat. Continue with opposite leg.','upload/exercise-picture/CBStandingHipExtentionFM.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(962,'Cable Squat','Stand with feet shoulder width or slightly wider on platform between very low and close pulley cables. Squat down with knees slightly beyond foot and shoulder above feet. Grasp stirrups to each side with arms straight.','Keeping chest high and back straight, raise stirrups by extending knees and hips until legs are straight. Squat down by bending hips back while allowing knees to bend forward slightly, keeping back straight and knees pointed same direction as feet. Squat down until thighs are just past parallel to floor. Return and repeat.','upload/exercise-picture/CBSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(963,'Cable Split Squat','Stand between two very low cable pulleys. Grasp stirrup attachments with each hand. Place one leg far forward and opposite leg far back to rear.','Squat down by flexing knee and hip of front leg. Allow heel of rear foot to rise up while knee of rear leg bends slightly until it almost makes contact with floor. Return to original straddle position by extending hip and knee of forward leg. Repeat. Continue with legs in opposite position.','upload/exercise-picture/CBLungeGlute.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(965,'Cable Belt Squat','Place pin on lightest weight. Place belt around waist. Pull cable from pulley and attach to front of belt. Step onto platform and grasp pole. Squat or sit on platform and select desired weight. Stand with feet shoulder width or wider to each side of cable. Place both hands on pole at waist height.','Squat down by bending hips back while allowing knees to bend forward slightly, keeping back straight and knees pointed same direction as feet.\n\n\nDescend until thighs are just past parallel to floor. Squat up by extending knees and hips until legs are straight. Return and repeat.','upload/exercise-picture/CBSquatBeltGlute.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(966,'Cable Bent-over Hip Extension','Attach ankle cuff to low pulley. With cuff on one ankle, grasp ballet bar with both hands and step far back with other foot. Elbows remain straight to support body leaning forward. Attached leg is straight and foot is stretched off floor.','Pull cable attachment back by extending hip. Return leg to original position. Repeat. Continue with opposite leg.','upload/exercise-picture/CBStandingHipExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(967,'Cable Straight-back Stiff-leg Deadlift','Stand between two very low pulleys with shoulder width or narrower stance. Squat down and grasp stirrup attachments to each side. Stand upright with arms straight down to sides.','With back straight, bow forward by bending hips and bend knees slightly during descent. Raise torso by extending hips while gradually extending knees until standing upright. Pull shoulders back slightly if rounded. Repeat.','upload/exercise-picture/CBStraightBackStifLegDeadlift.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(968,'Cable Step-up','Stand behind elevated platform and low and close pulley cables to sides. Grasp stirrups at each side of platform. Stand upright with arms straight down at sides.','Place foot of first leg on elevated platform. Stand on elevated platform by extending hip and knee of first leg and place foot of second leg on bench. Step down with second leg by flexing hip and knee of first leg. Return to original standing position by placing foot of first leg to lower position. Repeat first step with opposite leg alternating first steps between legs.','upload/exercise-picture/CBStepUp.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(969,'Dumbbell Squat','Stand with dumbbells grasped to sides.','Squat down by bending hips back while allowing knees to bend forward slightly, keeping back straight and knees pointed same direction as feet.\n\n\nDescend until thighs are just past parallel to floor. Extend knees and hips until legs are straight. Return and repeat.','upload/exercise-picture/DBSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(970,'Dumbell Single Leg Stiff-leg Deadlift','Hold dumbbell in each hand. Position dumbbells down in front of upper thighs with arms straight. Stand with feet together. Lift leg slightly so foot is just off floor.','Lower dumbells to floor while raising lifted leg back behind. Keep back straight and knee of supporting leg slightly bend. Keep hip and knee of lifted leg extended throughout movement. Once stretch is felt or dumbells contacts floor, return to original position by raising torso while lowering lifted leg. Straighten knee of supporting leg as torso becomes upright. Repeat.','upload/exercise-picture/DBSingleLegStiffLegDeadlift.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(971,'Dumbbell Single Leg Split Squat','Stand with dumbbells grasped to sides facing away from bench. Extend leg back and place top of foot on bench.','Squat down by flexing knee and hip of front leg until knee of rear leg is almost in contact with floor. Return to original standing position by extending hip and knee of forward leg. Repeat. Continue with opposite leg.','upload/exercise-picture/DBSingleLegSplitSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(972,'Dumbbell Rear Lunge','Stand with dumbbells grasped to sides.','Step back with one leg while bending supporting leg. Plant forefoot far back on floor. Lower body by flexing knee and hip of supporting leg until knee of rear leg is almost in contact with floor. Return to original standing position by extending hip and knee of forward supporting leg and return rear leg next to supporting leg. Repeat movement with opposite legs alternating between sides.','upload/exercise-picture/DBRearLunge.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(973,'Dumbbell Lunge','Stand with dumbbells grasped to sides.','Lunge forward with first leg. Land on heel then forefoot. Lower body by flexing knee and hip of front leg until knee of rear leg is almost in contact with floor. Return to original standing position by forcibly extending hip and knee of forward leg. Repeat by alternating lunge with opposite leg.','upload/exercise-picture/DBLungeGlute.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(974,'Dumbbell Side Lunge','Stand with dumbbells grasped to sides.','Lunge to one side with first leg. Position closest dumbbell behind thigh and opposite dumbbell to front. Land on heel then forefoot. Lower body by flexing knee and hip of lead leg, keeping knee pointed same direction of foot. Return to original standing position by forcibly extending hip and knee of lead leg. Repeat by alternating lunge with opposite leg.','upload/exercise-picture/DBSideLunge.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(975,'Dumbbell Split Squat','Stand with dumbbells grasped to sides. Stand with feet far apart; one foot forward and other foot behind.','Squat down by flexing knee and hip of front leg. Allow heel of rear foot to rise up while knee of rear leg bends slightly until it almost makes contact with floor. Return to original standing position by extending hip and knee of forward leg. Repeat. Continue with opposite leg.','upload/exercise-picture/DBSplitSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(976,'Dumbbell Front Squat','Stand with dumbbells grasped to sides. Clean dumbbells up to shoulders so side of each dumbbell rests on top of each shoulder. Balance dumbbells on shoulder by holding on to dumbbells with elbows flaring outward. Position feet shoulder width or slightly narrower apart.','Squat down by bending hips back while allowing knees to bend forward slightly, keeping back straight and knees pointed same direction as feet. Descend until thighs are just past parallel to floor. Extend knees and hips until legs are straight. Return and repeat.','upload/exercise-picture/DBFrontSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(977,'Dumbbell Walking Lunge','Stand with dumbbells grasped to sides.','Step forward with first leg. Land on heel then forefoot. Lower body by flexing knee and hip of front leg until knee of rear leg is almost in contact with floor. Stand on forward leg with assistance of rear leg. Lunge forward with opposite leg. Repeat by alternating lunge with opposite legs.','upload/exercise-picture/DBWalkingLunge.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(978,'Dumbbell Single Leg Squat','Stand with dumbbells grasped to sides. Balance on one leg with opposite leg extended straight leg forward as high as possible.','Squat down as far as possible while keeping leg elevated off of floor. Keep\n\n\nsupporting knee pointed same direction as foot supporting. Raise body back up to original position until knee and hip of supporting leg is straight. Return and repeat. Continue with opposite leg.','upload/exercise-picture/DBSingleLegSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(979,'Lever Bent-over Rear Kick (plate loaded)','Lean over wide padded area, place forearms on padded arm rest, and grip handles. Bend knee and position foot against lever platform.','Push platform back by extending leg back. Return leg to original position. Repeat. Continue with opposite leg.','upload/exercise-picture/LVBentOverRearKickPL.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(981,'Dumbbell Lateral Step-up','Stand between two benches, one to each side. Hold dumbbells in each hand down to sides','Lift leg and place foot on bench to side and forward of straight knee. Stand on bench by straightening leg and pushing body upward. Step down returning feet to original position. Repeat with opposite leg alternating between legs.','upload/exercise-picture/DBLateralStepUp.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(982,'Dumbbell Step Down','Hold dumbbells in each hand down to sides and stand with one foot on bench. Position foot on bench to side, forward of straight knee.','Stand on bench by straightening leg and pushing body upward. Step down returning foot off of bench to floor and repeat. Continue with opposite position.','upload/exercise-picture/DBStepDown.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(984,'Dumbbell Step-up','Stand with dumbbells grasped to sides facing side of bench.','Place foot of first leg on bench. Stand on bench by extending hip and knee of first leg and place foot of second leg on bench. Step down with second leg by flexing hip and knee of first leg. Return to original standing position by placing foot of first leg to floor. Repeat first step with opposite leg, alternating first steps between legs.','upload/exercise-picture/DBStepUp.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(985,'Lever Hack Press (plate loaded)','Sit on seat with back of hips against back pad. Place feet on platform shoulder width or slightly wider. Extend hips and knees. Disengage dock lever if it does not automatically disengage.','Lower seat by flex hips and knees until either is near complete flexion. Raise seat by extending knees and hips. Repeat.','upload/exercise-picture/LVHackPressWide.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(986,'Lever 45° Leg Press (plate loaded)','Sit on machine with back on padded support. Place feet slightly high on platform. Extend hips and knees. Release dock lever and grasp handles to sides.','Flex hips and knees to lower lever until hips are completely flexed. Push platform by extending knees and hips. Repeat.','upload/exercise-picture/LV45DegLegPressWide.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(987,'Lever Straight-back Stiff-leg Deadlift (plate loaded)','Stand between lever handles with shoulder width or narrower stance. Squat down and grasp handles to each side. Stand upright with arms straight down to sides.','With back straight, bow forward by bending hips and bend knees slightly during descent. Raise torso by extending hips while gradually extending knees until standing upright. Pull shoulders back slightly if rounded. Repeat.','upload/exercise-picture/LVStraightBackStiffLegDeadlift.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(988,'Lever Single Leg 45° Leg Press','Sit on machine with back on padded support. Place one foot mid height to high up on platform. Place outside of resting foot on lower surface with knee positioned out for greater clearance. Push platform up by extending hip and knee. Release dock lever and grasp handles to sides.','Lower platform by bending leg until knee is just short of complete flexion. Return by extending knee and hip. Repeat. Continue with opposite leg.','upload/exercise-picture/LVSingleLeg45DegLegPressGluteL.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(989,'Lever Single Leg Lying Leg Press (custom - plate loaded)','Lie supine on padded platform. Place hands on bars above head or to sides. Place one foot on platform and other foot on floor below platform.','Push platform away by extending hip and knee. Return by bending leg until knee or hip is just short of complete flexion. Repeat. Continue with opposite leg.','upload/exercise-picture/LVSingleLegLyingLegPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(990,'Lever Lying Leg Press (plate loaded)','Climb up steps to top of machine. Lie supine on horizontal padded platform with shoulders against pad. Place feet equally spaced and slightly high on platform. Grip handles above shoulder pads.','Push lever platform away by extending hips and knees until knees are straight. Return lever platform by flexing hips and knees until knees are just short of complete flexion or until hips are completely flexed. Repeat.','upload/exercise-picture/LVLyingLegPressH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(991,'Lever Alternating Seated Leg Press (plate loaded)','Sit on machine with back on padded support. Place feet on slightly high on platform. Grasp handles to sides.','Push one platform away by extending knee and hip. Return to original position. Repeat with opposite leg. Continue by alternating between sides.','upload/exercise-picture/LVAlternatingLegPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(992,'Lever Single Leg Seated Leg Press (plate loaded)','Sit on machine with back on padded support. Place one foot slightly high on platform and other foot near floor below platform or off to side.','Push platform away by extending hip and knee. Return by bending leg until knee or hip is just short of complete flexion. Repeat. Continue with opposite leg.','upload/exercise-picture/LVSingleLegSeatedLegPress2.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(993,'Lever Seated Leg Press (plate loaded)','Sit on machine with back on padded support. Place feet slightly high on platform. Grasp handles to sides.','Push platform(s) away by extending knees and hips until knees are fully extended. Return until hips are completely flexed. Repeat.','upload/exercise-picture/LVSeatedLegPresWideH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(994,'Lever Lying Hip Extension (plate loaded)','Lie on bench with knees legs over pads. Align hip joints with lever fulcrum. Strap hips down with belt. Grasp handles at each side.','Extend hips and knees until legs are straight. Return to original position by flexing hips and knees. Repeat.','upload/exercise-picture/LVLyingHipExtentionH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(995,'Lever Power Runner (plate loaded)','Place forefeet into pedals. Squat down and position shoulders forward in padded yoke. Grasp handles to sides. Push one pedal back by extending knee and hip so one leg is straight while the other remains forward.','Push forward pedal back by extending leg while allowing other pedal to come forward by bending opposite leg. Continue pedalling by alternating between sides.','upload/exercise-picture/LVPowerRunnerPL.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(996,'Lever Lying Leg Press (custom - plate loaded)','Lie supine on padded platform. Place hands on bars above head or to sides. Place feet flat on lever platform with hips and knees bent.','Push lever platform by extending hips and knees until knees are straight. Lower lever platform by flexing hips and knees until knees are just short of complete flexion. Repeat.','upload/exercise-picture/LVLyingLegPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(997,'Lever Barbell Rear Lunge (plate loaded)','With bar upper chest height, position bar on back of shoulders and grasp bar to sides. Place feet under bar or slightly forward. Straighten legs so weight is lifted. Disengage bar by rotating bar back. Place feet slightly forward.','Step back with one leg while bending supporting leg. Plant forefoot far back on floor. Lower body by flexing knee and hip of supporting leg until knee of rear leg is almost in contact with floor. Return to original standing position by extending hip and knee of forward supporting leg and return rear leg next to supporting leg. Repeat movement with opposite legs alternating between sides.','upload/exercise-picture/LVSMReverseLunge.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(998,'Lever Rear Lunge (plate loaded)','Stand between lever handles to sides. Squat down with feet flat on floor and grasp lower handles to sides. Lift lever by extending hips and knees to full extension. Position both feet slightly forward.','Step back with one leg while bending supporting leg. Plant forefoot far back on floor. Lower body by flexing knee and hip of supporting leg\n\n\nuntil knee of rear leg is almost in contact with floor. Return to original standing position by extending hip and knee of forward supporting leg and return rear leg next to supporting leg. Repeat movement with opposite legs alternating between sides.','upload/exercise-picture/LVRearLunge.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(999,'Lever Single Leg Split Squat (plate loaded)','Stand between lever handles to sides. Extend leg back and place top of foot on cross bar. Squat down and grasp handles to sides.','With chest high, lift lever by extending hips and knees to full extension. Return until knee of rear leg is almost in contact with floor. Repeat. Continue with opposite leg.','upload/exercise-picture/LVSingleLegSplitSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1000,'Lever Barbell Split Squat (plate loaded)','With bar upper chest height, position bar on back of shoulders and grasp bar to sides. Place one foot forward and forefoot of other leg further back. Disengage bar by rotating bar back.','Lower body on other leg by flexing knees and hips of of both legs until knee of rear leg is almost in contact with floor. Return to original straddled position by extending hips and knees of both legs. Repeat. Continue with opposite leg.','upload/exercise-picture/LVSMSingleLegSplitSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1001,'Lever Split Squat (plate loaded)','Stand between lever handles to sides. Place forefoot of one foot on floor to rear and other foot slightly forward. Squat down and grasp handles to sides.','With chest high, lift lever by extending hips and knees to full extension. Return until knee of rear leg is almost in contact with floor and repeat. Continue with opposite leg.','upload/exercise-picture/LVSplitSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1002,'Lever Barbell Single Leg Split Squat (plate loaded)','Place bench behind smith bar. With bar upper chest height, position bar on back of shoulders and grasp bar to sides. Place foot slightly forward under bar. Extend other leg back and place top of foot on bench. Disengage bar by rotating bar back.','Lower body by flexing knee and hip of front leg until knee of rear leg is almost in contact with floor. Return to original standing position by extending hip and knee of forward leg. Repeat. Continue with opposite leg.','upload/exercise-picture/LVSMReverseLunge.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1003,'Lever Reverse Hyper-extension (plate loaded)','Place one leg in strap so it is positioned above ankle. Step up onto step built on side of apparatus with other foot. Lay torso and waist on bench and grasp handles. Place stepping foot inside of strap, just in front of leg already in strap. Position legs side by side. Feet should be above floor with legs hanging straight down.','Raise lever by extending hips as high as possible with legs nearly straight. Lower legs to original position. Repeat.','upload/exercise-picture/LVReverseHyperExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1004,'Lever Squat (plate loaded)','Squat down to place shoulders under padded lever. Place feet shoulder width or marginally wider apart, slightly in front of shoulders. Extend knees and hips until legs are straight. Release support lever.','Squat down by bending hips back while allowing knees to bend forward slightly, keeping back straight and knees pointed same direction as feet. Descend by bending knees and hip until thighs are just past parallel to floor. Lift lever up by extending knees and hips until legs are straight. Repeat.','upload/exercise-picture/LVSquatGlutePL2.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1005,'Lever Single Leg Squat (plate loaded)','Stand between handles facing away from fulcrum. Grasp both handles to sides and stand upright. Cross lower leg above knee of supporting leg.','Bend knee forward slightly while allowing hips to bend back behind, keeping back straight and knee pointed same direction of foot. Squat down as low as possible. Extend knee and hip until leg is straight. Return and repeat. Continue with opposite leg.','upload/exercise-picture/LVSingleLegSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1007,'Lever Sliding Split Squat (plate loaded)','Stand with one foot on stationary platform under foot pad and other foot back on sliding platform. Squat down and grasp handles to sides. Stand upright with arms straight to sides.','Lower lever downward by sliding platform back and squatting down on forward leg. Keep chest high as hips descend to knee height. Lift sliding forward and extending hips and knee to full extension. Repeat and continue with opposite leg.','upload/exercise-picture/LVSlidingSplitSquatPL.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1008,'Lever Barbell Squat (plate loaded)','With bar upper chest height, position bar on back of shoulders and grasp bar to sides. Place feet slightly forward. Disengage bar by rotating bar back.','Squat down by bending hips back while allowing knees to bend forward slightly, keeping back straight and knees pointed same direction as feet.\n\n\nDescend until thighs are just past parallel to floor. Extend knees and hips until legs are straight. Return and repeat.','upload/exercise-picture/LVSMSplitSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1009,'Lever Bent-over Hip Extension','Step up onto platform. Position belly on wide pad, forearms on padded arm rest, and grip handles. Position bottom of foot on foot lever with lower leg under pad.','Push foot lever back by extending hip. Return leg to original position. Repeat. Reposition and continue with opposite leg.','upload/exercise-picture/LVBentOverHipExtention.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1010,'Lever Hack Squat (plate loaded)','Position shoulders under shoulder pad and back on back pad. Place feet slightly high on platform. Extend hips and knees and release dock lever if available.','Lower lever by bending hips and knees, until knees are just short of complete flexion. Raise sled by extending knees and hips. Repeat.','upload/exercise-picture/LVHackSquatGlute.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1011,'Lever Kneeling Hip Extension','Kneel on lowest (shin) pad with roller pad behind lower thighs. Position midsection on middle pad. Place forearms on padded arm rest and grip handles.','Keeping one leg on shin pad, extend hip of other leg and push roller pad back. Raise roller pad up until hip is completely extended. Return leg to original position and repeat. Continue with opposite leg.','upload/exercise-picture/LVKneelingHipExtensionRoller.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1012,'Lever Full Squat (plate loaded)','Squat down to place shoulders under padded lever. Place feet shoulder width apart slightly in front of shoulders. Extend knees and hips until legs are straight. Release support lever.','Squat down by bending hips back while allowing knees to bend forward slightly, keeping back straight and knees pointed same direction as feet. Descend until knees and hips are fully bent. Lift lever up by extending knees and hips until legs are straight. Repeat.','upload/exercise-picture/LVFullSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1013,'Lever Front Squat','Step onto platform facing padded levers. Squat down to place shoulders under padded lever. Place feet shoulder width apart on platform. Extend knees and hips until legs are straight. Release support lever if it does not disengage by itself.','Lower lever by bending hips back while allowing knees to bend forward slightly, keeping back straight and knees pointed same direction as feet. Descend until thighs are just past parallel to floor. Lift lever up by extending knees and hips until legs are straight. Repeat.','upload/exercise-picture/LVFrontSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1014,'Lever Standing Hip Extension','Stand on platform facing to one side and grasp bar for support. Place leg nearest machine on padded roller while standing on other leg.','Lower lever by extending hip. Return until knee is higher than hip. Repeat. Continue with opposite leg.','upload/exercise-picture/LVStandingHipExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1015,'Lever Lying Hip Extension','With leg lever positioned in the lower position, lie supine on machine with legs over padded bar. Align hip joints with lever fulcrum. Strap hips down with belt if available. Release leg lever and adjust until leg lever is in upper position. Grasp handles to sides of head.','Push padded leg bar down until hips are extended. Return and repeat.','upload/exercise-picture/LVLyingHipExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1016,'Lever Alternating Lying Hip Extension','Lie on bench with knees legs over pads. Align hip joints with lever fulcrum. Strap hips down with belt. Extend both hips with feet toward floor.','Raise one knee by flexing hip. Return to original position by extending hip. Repeat with opposite leg, alternating between sides.','upload/exercise-picture/LVLyingHipExtensionN.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1017,'Lever V-Squat (plate loaded)','Position shoulders under shoulder pads with back against back pad. Place feet on platform, shoulder or hip width apart. Extend hips and knees and release lever if available.','Bend knees forward slightly while allowing hips to bend back behind, keeping back straight and knees pointed same direction as feet. Descend until hips are just short of complete flexion. Raise sled by extending knees and hips. Repeat.','upload/exercise-picture/LVVSquatGluteH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1018,'Lever Alternating Kneeling Hip Extension','Kneel on lowest (shin) pad with roller pad behind lower thighs. Position midsection on middle pad. Place forearms on padded arm rest and grip handles.','Keeping one leg on shin pad, extending hip of other leg and push roller pad back. Raise roller pad up until hip is completely extended. Return leg to original position. Repeat with opposite leg. Continue alternating between each side.','upload/exercise-picture/LVAlternatingKneelingHipExtRoller.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1019,'Lever Standing Hip Extension (with abdominal pad)','Stand on platform so front of hips are against edge of abdominal pad. Position flexed leg over padded roller while standing on other leg. Grasp handles with both hands.','Extend lever back by extending hip and straightening leg. Return by flexing hip and knee. Repeat. Continue with opposite leg.','upload/exercise-picture/LVStandingHipExtension2.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1020,'Lever Kneeling Rear Kick','Kneel on machine by placing one knee on lower pad. Rest torso on middle pad, place forearms on padded arm rest, and grip handles. Position other foot of other leg up to lever platform.','Push platform back by extending leg back. Return leg to original position and repeat. Continue with opposite leg.','upload/exercise-picture/LVKneelingHipExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1021,'Lever Single Leg Seated Leg Press','Sit on machine with back on padded support. Place one foot slightly high on platform and other foot on floor below platform.','Push platform away by extending hip and knee. Return by bending leg until knee or hip is just short of complete flexion. Repeat. Continue with opposite leg.','upload/exercise-picture/LVSingleLegPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1022,'Lever Seated Leg Press','Sit on machine with back on padded support. Place feet slightly high on platform. Grasp handles to sides.','Extend knees and hips until knees are fully extended. Return until hips are completely flexed. Repeat.','upload/exercise-picture/LVSeatedLegPressGlute.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1023,'Lever Squat','Squat down to place shoulders under padded lever. Place feet shoulder width apart slightly in front of shoulders.','Raise lever up by extending knees and hips until legs are straight. Squat down by bending hips back while allowing knees to bend forward slightly, keeping back straight and knees pointed same direction as feet. Descend until thighs are just past parallel to floor. Return and repeat.','upload/exercise-picture/LVSquatGlute.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1024,'Lever Standing Rear Kick','Step on left platform with left foot. Grasp handle bars to each side. Place right foot on highest lever platform.','Push platform down by extending leg until straight. Return leg to original position. Repeat. Continue with opposite leg positions.','upload/exercise-picture/LVStandingSingleLegPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1025,'Lever Bent-over Rear Kick','Lean over padded surface and grasp handles. Bend knee and position foot against lever platform or pedal.','Push platform or pedal back by extending leg. Return leg to original position. Repeat. Continue with opposite leg.','upload/exercise-picture/LVBentOverRearKick.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1026,'Lever Alternating Seated Leg Press','Lie on machine with shoulder under pads. Place feet slightly high on individual lever platforms. Grasp handles to sides. Push both lever platforms away by extending knees and hips so knees are straight.','Lower one lever platform toward body by bending knee and hip until weight taps or nearly taps unused portion of weight stack. Push lever platform away by extending knee and hip. Repeat with opposite leg. Continue by alternating between sides.','upload/exercise-picture/LVAlternatingLyingLegPressN.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1027,'Lever V-Squat','Position shoulders under shoulder pads with back against back pad. Place feet on platform, shoulder or hip width apart. Squeeze hand lever. Keeping hand lever squeezed, squat down by bending hips and knees until knees or hips are just short of complete flexion. Release hand lever and raise up on sled just slightly until weight stack is engaged (click is heard).','Raise lever by extending knees and hips until legs are straight. Squat down with knees pointed same direction as feet. Descend until knees or hips are near complete flexion. Repeat.','upload/exercise-picture/LVVSquatGluteFM.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1028,'Lever Split V-Squat','Position shoulders under shoulder pads with back against back pad. Place feet on platform, shoulder or hip width apart, slightly forward. Squeeze hand lever. Keeping hand lever squeezed, squat down by bending hips and knees until knees or hips are just short of complete flexion. Release hand lever and raise up on sled just slightly until weight stack is engaged (click is heard). Raise sled by extending knees and hips until legs are straight. Place one leg back behind platform with toes pointed downward over floor.','Squat down with knee pointed same direction as foot. Allow leg to bend behind with forefoot on floor. Descend until forward hip is near complete flexion. Raise sled by extending knee and hip until leg is straight. Repeat. Continue with other leg.','upload/exercise-picture/LVSingleLegVSquatGlute.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1029,'Sled Single Leg 45° Leg Press','Sit on machine with back on padded support. Place one foot high up on platform and other foot on floor below platform. Extend hip and knee. Release dock lever and grasp handles to sides.','Lower sled by bending leg until knee is just short of complete flexion. Return by extending knee and hip. Repeat. Continue with opposite leg.','upload/exercise-picture/SLSingleLeg45DegreeLegPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1030,'Lever Single Leg Split V-Squat','Position shoulders under shoulder pads with back against back pad. Place one foot forward on platform. Place other foot against rear vertical platform. Squeeze hand lever. Keeping hand lever squeezed, squat down by bending hips and knees until hip or knee is short of complete flexion. Release hand lever and raise up on sled just slightly until weight stack is engaged (click is heard).','Raise lever by extending knees and hips. Lower lever by flexing hips and knees until knee of rear leg is almost in contact with floor. Repeat. Continue with opposite leg positions.','upload/exercise-picture/LVSingleLegSplitVSquatGlute.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1031,'Sled 45° Leg Press','Sit on machine with back on padded support. Place feet slightly high on platform. Extend hips and knees. Release dock lever and grasp handles to sides.','Lower sled by flexing hips and knees until knees are just short of complete flexion or until hips are completely flexed. Return by extending knees and hips. Repeat.','upload/exercise-picture/SL45DegLegPressWide.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1032,'Lever Alternating Single Leg Split V-Squat','Position shoulders under shoulder pads with back against back pad. Place feet slightly forward on platform. Squeeze hand lever. Keeping hand lever squeezed, squat down by bending hips and knees until hip or knee is short of complete flexion. Release hand lever and raise up on sled just slightly until weight stack is engaged (click is heard). Raise lever by extending knees and hips.','Transfer right foot back to inside of rear vertical platform. Lower lever by flexing hips and knees until knee of rear leg is almost in contact with floor. Raise lever by extending knees and hips until knee is straight. Return right foot to original position by other foot. Repeat with opposite leg movement and continue alternating between sides.','upload/exercise-picture/LVAlternatingSingleLegSplitVSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1033,'Sled Alternating 45° Leg Press','Sit on machine with back on padded support. Place feet slightly high on individual platforms. Grasp handles to sides. Push both platforms away by extending knees and hips so knees are straight. Release dock lever and grasp handles to sides.','Lower one platform toward body by bending knee and hip until knees are just short of complete flexion or until hips are completely flexed. Push platform away by extending knee and hip. Repeat with opposite leg. Continue by alternating between sides.','upload/exercise-picture/SLAlternating45LegPressGlute.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1034,'Sled Hack Press','Sit on sled with back of hips against back pad. Place feet on platform shoulder width or slightly wider. Extend hips and knees. Release dock lever(s).','Lower sled by flexing hips and knees until either is near complete flexion. Raise sled by extending knees and hips. Repeat.','upload/exercise-picture/SLSeatedHackPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1035,'Sled Lying Leg Press (plate loaded)','Lie supine on platform with shoulders against pad. Place feet slightly high on platform. Extend hips and knees. Release dock lever and grasp handles to sides.','Bring sled toward platform by flexing hips and knees until knees are just short of complete flexion or until hips are completely flexed. Return by extending knees and hips. Repeat.','upload/exercise-picture/SLLyingLegPressPLGlute.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1036,'Sled Single Leg Lying Leg Press (plate loaded)','Lie supine on platform with shoulders against pad. Place feet slightly high on platform. Prop one leg up, on support if available. Extend hip and knee of leg positioned on platform. Release dock lever and grasp handles to sides if available.','Bring sled toward platform by flexing hip and knee of supporting leg until knee is just short of complete flexion or until hip is completely flexed. Return by extending knee and hip. Repeat. Continue with opposite leg.','upload/exercise-picture/SLLyingSingleLegPressPL.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1037,'Sled Lying Leg Press','Lie supine on platform with shoulders against pad. Place feet slightly high on platform.','Extend hips and knees. Return until hips are completely flexed. Repeat.','upload/exercise-picture/SLLyingLegPressGlute.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1038,'Sled Single Leg Lying Leg Press','Lie supine on platform with shoulders against pad. Place\nfoot slightly high on platform. Position other leg with lower\nleg parallel to platform.','Push platform by extending knee and hip until knee is straight.\nReturn by bending hip and knee of supporting leg until knee is\njust short of complete flexion or until hip is completely flexed.\nRepeat. Continue with opposite leg.','upload/exercise-picture/SLSingleLegLyingLegPressGlute.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1039,'Sled Standing Rear Kick','Straddle sled and place foot on pedal. Place chest on pad and grasp handles.','Push platform back by extending leg\n\n\nback until straight. Return leg to original position. Repeat. Continue with opposite leg.','upload/exercise-picture/SLStandingHipExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1040,'Sled Seated Leg Press','Sit on machine with back on padded support. Place feet slightly high on platform. Grasp handles to sides.','Extend knees and hips until knees are fully extended. Return until hips are completely flexed. Repeat.','upload/exercise-picture/SLSeatedLegPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1041,'Sled Vertical Leg Press','Lie on declined back pad with hips under weighted sled. Place feet on platform. Raise weight by extending hips and knees. Release dock levers and grasp handles to sides.','Lower sled by flexing hips and knees until knees are just short of complete flexion or just before hips raise up from pad. Return by extending knees and hips. Repeat.','upload/exercise-picture/SLVerticalLegPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1042,'Sled Single Leg Vertical Leg Press','Lie on declined back pad with hips under weighted sled. Place both feet on platform. Raise weight by extending hips and knees. Place foot down off of foot platform. Release dock levers and grasp handles to sides.','Lower sled by flexing leg until knees are just short of complete flexion or just before hips raise up from pad. Push weight up by extending knee and hip. Repeat and continue with opposite leg.','upload/exercise-picture/SLVerticalSingleLegPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1043,'Sled Single Leg Hack Squat','Lie supine on platform with shoulders against pad. Place feet high up on platform. Extend hips and knees. Cross lower leg above knee of supporting leg. Release dock lever(s).','Lower sled by flexing hips and knee of supporting leg until knees are just short of complete flexion. Raise sled by extending knee and hips. Repeat. Continue with opposite leg.','upload/exercise-picture/SLSingleLegHackSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1044,'Sled Hack Squat','Lie supine on platform with shoulders against pad. Place feet high up on platform. Extend hips and knees. Release dock levers.','Lower sled by flexing hips and knees until hips are completely flexed. Raise sled by extending knees and hips. Repeat.','upload/exercise-picture/SLHackSquatGlute.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1045,'Sled Rear Lunge','Position shoulders under padded bars handles. Place feet under bar or just slightly forward. Straighten legs so weight is lifted. Disengage dock lever(s) if available. Place feet slightly forward.','Step back with one leg while bending supporting leg. Plant forefoot far back on floor. Lower body by flexing knee and hip of supporting leg until knee of rear leg is almost in contact with floor. Return to original standing position by extending hip and knee of forward supporting leg and return rear leg next to supporting leg. Repeat movement with opposite legs, alternating between sides.','upload/exercise-picture/SLRearLunge.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1046,'Sled Squat','Squat down to place shoulders under padded bars. Lean back against back pad if available. Place feet shoulder width apart, slightly in front of shoulders.','If hand or lever lock is available, disengage weight, squat to lowest position and re-engage lock. Lift sled by extending knees and hips until legs are straight. Lower sled by bending knees forward slightly while allowing hips to bend back behind, keeping back straight and knees pointed same direction as feet. Descend until thighs are just past parallel to floor. Return and repeat.','upload/exercise-picture/SLSquatGlute.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1048,'Sled Kneeling Rear Kick','Kneel on machine by placing knees on lower pad and feet against bars to rear, if available. Place forearms on padded arm rest, and grip handles. Position one foot up so middle of sole is positioned under foot bar.','Push foot bar up by extending leg back as far as possible. Return leg to original position and repeat. Continue with opposite leg.','upload/exercise-picture/SLKneelingHipExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1050,'Smith Single Leg Split Squat','Place bench behind smith bar. With bar upper chest height, position bar on back of shoulders and grasp bar to sides. Place foot slightly forward under bar. Extend other leg back and place top of foot on bench. Disengage bar by rotating bar back.','Lower body by flexing knee and hip of front leg until knee of rear leg is almost in contact with floor. Return to original standing position by extending hip and knee of forward leg. Repeat. Continue with opposite leg.','upload/exercise-picture/SMSingleLegSplitSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1051,'Smith Straight-back Stiff-leg Deadlift','Stand with shoulder width or narrower stance with thigh against bar. Grasp bar with shoulder width or slightly wider overhand grip. Disengage bar by rotating bar back.','With knees bent, lower bar toward top feet by bending hips and keeping waist straight. Lift bar by extending at hips until standing upright. Pull shoulders back slightly if rounded. Extend knees at top if desired. Repeat.','upload/exercise-picture/SMStrBackStiffLegDeadlift.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1053,'Smith Split Squat','With bar upper chest height, position bar on back of shoulders and grasp bar to sides. Place one foot forward and forefoot of other leg further back. Disengage bar by rotating bar back.','Lower body on other leg by flexing knees and hips of both legs until knee of rear leg is almost in contact with floor. Return to original straddled position by extending hips and knees of both legs. Repeat. Continue with opposite leg.','upload/exercise-picture/SMSplitSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1054,'Smith Single Leg Squat','With bar upper chest height, position bar on back of shoulders and grasp bar to sides. Place feet slightly forward and cross lower leg above knee of supporting leg. Disengage bar by rotating bar back.','Bend knee slightly forward while allowing hips to bend, keeping back straight and knee pointed same direction of foot. Descend until thigh of supporting leg is just past parallel to floor. Extend knee and hip until leg is straight. Return and repeat.','upload/exercise-picture/SMSingleLegSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1055,'Smith Rear Lunge','With bar upper chest height, position bar on back of shoulders and grasp bar to sides. Place feet under bar or slightly forward. Straighten legs so weight is lifted. Disengage bar by rotating bar back. Place feet slightly forward.','Step back with one leg while bending supporting leg. Plant forefoot far back on floor. Lower body by flexing knee and hip of supporting leg until knee of rear leg is almost in contact with floor. Return to original standing position by extending hip and knee of forward supporting leg and return rear leg next to supporting leg. Repeat movement with opposite legs, alternating between sides.','upload/exercise-picture/SMRearLunge.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1056,'Smith Hack Squat','Stand with back of thighs or gluteus against bar. Grasp bar from behind with overhand grip. Disengage bar by rotating bar back.','Squat down by bending knees forward while allowing hips to bend back behind, keeping back straight and knees pointed same direction as feet. Descend until thighs are too close to parallel to floor and bar is behind lower leg. Lift bar by extending hips and knees to full extension. Repeat.','upload/exercise-picture/SMHackSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1057,'Smith Squat','With bar upper chest height, position bar on back of shoulders and grasp bar to sides. Place feet slightly forward. Disengage bar by rotating bar back.','Squat down by bending hips back while allowing knees to bend forward slightly, keeping back straight and knees pointed same direction as feet.\n\n\nDescend until thighs are just past parallel to floor. Extend knees and hips until legs are straight. Return and repeat.','upload/exercise-picture/SMSquatGlutes.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1058,'Smith Front Squat','With bar upper chest height, grasp bar with overhand shoulder width grip. Position bar on front of shoulders with elbows forward and wrists hyperextended. Place feet slightly forward. Disengage bar by rotating bar back.','Squat down by bending hips back while allowing knees to bend forward\n\n\n, keeping back straight and knees pointed same direction as feet. Descend until thighs are just past parallel to floor. Extend knees and hips until legs are straight. Return and repeat.','upload/exercise-picture/SMFrontSquatGlute.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1059,'Weighted Front Squat','Stand with feet shoulder width or slightly narrower apart. Holding weight plate upper chest height with both hands.','Squat down by bending hips back while allowing knees to bend forward, keeping back straight and knees pointed same direction as feet. Descend until thighs are just past parallel to floor. Extend knees and hips until legs are straight. Return and repeat.','upload/exercise-picture/WTFrontSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1060,'Weighted Single Leg Squat','Stand with arms extended out in front, holding medicine ball or weight plate. Balance on one leg with opposite leg extended straight leg forward as high as possible.','Squat down as far as possible while keeping leg elevated off of floor. Keep supporting knee pointed same direction as foot supporting. Raise body back up to original position until knee and hip of supporting leg is straight. Return and repeat. Continue with opposite leg.','upload/exercise-picture/WTPistolSquatFarLeg.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1061,'Weighted Belt Squat','Place weight on dip belt around waist. Step up onto boxes or benches spaced apart; foot on each bench. Arms can be extended forward throughout exercise.','Squat down by bending hips back while allowing knees to bend forward slightly, keeping back straight and knees pointed same direction as feet.\n\n\nDescend until thighs are just past parallel to floor. Squat up by extending knees and hips until legs are straight. Return and repeat.','upload/exercise-picture/WTSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1062,'Weighted Reverse Hyper-extension','Place sandbag or medicine ball between ankles. Lay torso and waist on bench and grasp handles. Feet should be above floor with legs straight.','Raise weight by extending hips as high as possible until legs are nearly straight. Lower legs to original position. Repeat.','upload/exercise-picture/WtReverseHyperExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1063,'Smith Wide Squat','With bar upper chest height, position bar on back of shoulders and grasp bar to sides. Place feet wide, pointing outward 45° to 30°. Disengage bar by rotating bar back.','Squat down by bending hips back while allowing knees to bend forward slightly, keeping back straight and knees pointed same direction as feet. Descend until thighs are just past parallel to floor. Extend knees and hips until legs are straight. Return and repeat.','upload/exercise-picture/SMSquatWide.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1064,'Reverse Hyper-extension','Lay torso and waist on bench and grasp handles. Feet should be above floor with legs straight.','Raise legs by extending hips as high as possible until legs are nearly straight. Lower legs to original position. Repeat.','upload/exercise-picture/BWReverseHyperExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1065,'Lunge','Stand with hands on hips or clasped behind neck.','Lunge forward with first leg. Land on heel, then forefoot. Lower body by flexing knee and hip of front leg until knee of rear leg is almost in contact with floor. Return to original standing position by forcibly extending hip and knee of forward leg. Repeat by alternating lunge with opposite leg.','upload/exercise-picture/BWLunge.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1066,'Single Leg Hip Bridge','Lie on floor or mat. Place one leg straight and bend the other leg with foot flat on floor or mat. Place arms down on mat to each side of hips.','Raise body by extending hip of bent leg, keeping extended leg and hip straight. Return to original position by lowering body with extended leg and hip straight. Repeat and continue with opposite sides.','upload/exercise-picture/BWSupineSingleLegHipBridge.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1067,'Single Leg Box Squat','Stand in front of adjustable height bench or box. Extend arms out in front of body. Balance on one leg with opposite leg extended straight leg forward as high as possible.','Squat down while keeping leg elevated off of floor. Keep back straight and supporting knee pointed same direction as foot supporting. Once bottocks makes contact with bench or box, raise body back up to original position until knee and hip of supporting leg is straight. Repeat and continue with opposite leg.','upload/exercise-picture/BWSingleLegBenchSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1068,'Single Leg Reclining Squat (bar)','Stand behind horizontal bar, lower chest to upper waist height. Grasp bar with both hands. Place feet slightly forward and lean back with arms straight. Balance on one leg with opposite leg extended straight leg forward as high as possible.','While reclining back, squat down as far as possible while keeping leg elevated off of floor. Keep back straight and supporting knee pointed same direction as suppor ting foot. Raise body back up to original position until knee and hip of supporting leg is straight. Repeat and continue with opposite leg.','upload/exercise-picture/BWRecliningSingleLegPistolSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1069,'Reverse Hyper-extension (on stability ball)','Lay prone with waist on stability ball. Grasp secure anchor or bar near floor. Feet should be above floor with legs straight.','Holding firmly on anchor, extend legs upward by lifting and straightening leg as high as possible. Lower legs to original position with thighs close to stability ball. Repeat.','upload/exercise-picture/BWReverseHyperExtensionBall.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1070,'Single Leg Squat (with leg back)','Stand with arms extended out in front.','Squat down as far as possible while keeping raised leg from contacting floor as far down as possible. Keep back straight and supporting knee pointed same direction as foot supporting. In lowest position, gently place elevated lower leg on floor. Raise body back up with minimal assistance from raised leg on floor. Stand to original position until knee and hip of supporting leg are straight. Return and repeat. Continue with opposite leg.','upload/exercise-picture/BWSingleLegSquatLegBack.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1071,'Single Leg Squat (pistol)','Stand with arms extended out in front. Balance on one leg with opposite leg extended straight leg forward as high as possible.','Squat down as far as possible while keeping leg elevated off of floor. Keep back as straight as possible and supporting knee pointed same direction as foot supporting. Raise body back up to original position until knee and hip of supporting leg is straight. Repeat and continue with opposite leg.','upload/exercise-picture/BWSingleLegSquatPistol_.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1072,'Single Leg Stiff-leg Deadlift','Stand with feet together and hands just in front of thighs. Lift leg slightly so foot is just off floor.','Lower torso forward and downward while raising lifted leg back behind. Keep back straight and knee of supporting leg slightly bend. Keep hip and knee of lifted leg extended throughout movement. Once stretch is felt or hands contact floor, return to original position by raising torso while lowering lifted leg. Straighten knee of supporting leg as torso becomes upright. Repeat.','upload/exercise-picture/BWSingleLegStiffLegDeadlift_.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1073,'Split Squat','Stand with hands on hips. Position feet far apart; one foot forward and other foot behind.','Squat down by flexing knee and hip of front leg. Allow heel of rear foot to rise up while knee of rear leg bends slightly until it almost makes contact with floor. Return to original standing position by extending hip and knee of forward leg. Repeat. Continue with opposite leg.','upload/exercise-picture/BWSplitSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1074,'Single Leg Split Squat','Stand facing away from bench. Extend leg back and place top of foot on bench.','Squat down by flexing knee and hip of front leg until knee of rear leg is almost in contact with floor. Return to original standing position by extending hip and knee of forward leg and repeat. Continue with opposite leg.','upload/exercise-picture/BWSingleLegSplitSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1075,'Squat','Stand with arms extended forward.','Squat down by bending hips back while allowing knees to bend forward slightly, keeping back straight and knees pointed same direction as feet. Descend until thighs are just past parallel to floor. Squat up by extending knees and hips until legs are straight. Return and repeat.','upload/exercise-picture/BWSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1076,'Step-down','Stand with one foot on bench or elevated surface. Position foot on elevated surface to side, forward of straight knee.','Stand on bench by straightening leg and pushing body upward. Step down returning foot off of bench to floor and repeat. Continue with opposite position.','upload/exercise-picture/BWStepDown.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1077,'Step-up','Stand facing side of bench, step or platform.','Place foot of first leg on bench. Stand on bench by extending hip and knee of first leg and place foot of second leg on bench. Step down with second leg by flexing hip and knee of first leg. Return to original standing position by placing foot of first leg to floor. Repeat first step with opposite leg, alternating first steps between legs.','upload/exercise-picture/BWStepUp.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1078,'Self-assisted Single Leg Squat (bar)','Stand behind horizontal bar, lower chest to waist height. Place finger tips or inside base of thumbs on bar, hold with just enough contact for balance and self-assistance. Balance on one leg with opposite leg extended straight leg forward as high as possible.','Squat down as far as possible while keeping leg elevated off of floor. Keep back straight and supporting knee pointed same direction as supporting foot. Raise body back up to original position until knee and hip of supporting leg is straight. Repeat and continue with opposite leg.','upload/exercise-picture/ASSingleLegSquatPistolSelf.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1079,'Self-assisted Single Leg Squat (leg wrapped)','Stand with hand on hip height elevated surface or other tall, sturdy structure for support. Stand on one leg by wrapping leg around back of supporting leg so top of lifted foot is on outside of supporting leg\'s ankle.','Squat down by bending knee forward and hip back behind. Keep back straight and supporting knee pointed same direction as foot supporting. Descend until thigh is just past parallel to floor. Return to standing position with minimal assistance from wrapped leg. Stand to original position until knee and hip of supporting leg are straight. Return and repeat. Continue with opposite leg.','upload/exercise-picture/BWSingleLegSquatSelfAssistLeg.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1080,'Lateral Step-up','Stand between two benches, one to each side.','Lift leg and place foot on bench to side and forward of straight knee. Stand on bench by straightening leg and pushing body upward. Step down returning feet to original position. Repeat with opposite leg, alternating between legs.','upload/exercise-picture/BWLateralStepUp.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1081,'Self-assisted Step-down','Stand with one foot on bench or elevated surface. Position foot on elevated surface to side and forward of straight knee.','Stand on bench by straightening leg and pushing body upward. Step down returning foot off of bench to floor and repeat. Continue with opposite position.','upload/exercise-picture/ASStepDownSelf.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1082,'Self-assisted Single Leg Reclining Squat (pole)','Stand with feet behind vertical pole. Grasp pole with both hands, waist to hip height. Balance on one leg with opposite leg raised up off of floor to side of pole.','Squat down while keeping leg elevated off of floor. With arms slightly flexed, lean back slightly while only allowing knee to travel slightly forward. Keep back straight and supporting knee pointed same direction as supporting foot. Descend to lowest position. Raise body back up to original position while keeping knee behind bar and arms slightly flexed until knee and hip of supporting leg is straight. Repeat and continue with opposite leg.','upload/exercise-picture/ASVerticalPoleRecliningPistolSquats.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1083,'Suspended Hip Bridge','Sit on floor facing suspension trainer loops in low position. Grasp bottom of loops, then lay supine. Raise legs and place heels in loops with soles contacting handles. Lie down supine on mat so knees and hips are bent with suspension straps hanging vertical. Place arms off to sides.','Raise hips up by extending hips until fully extended. Lower hips until hips and back make contact with mat. Repeat.','upload/exercise-picture/STHipBridge.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1084,'Alternating Step-down','Stand on bench or narrow platform, with feet side by side.','Step down with first foot to side of elevated surface onto floor. Stand back up on elevated surface by straightening upper leg and pushing body upward. Place foot to original position next to opposite foot. Step down and back up with opposite leg in same manner. Repeat by alternating between sides.','upload/exercise-picture/BWAlternatingStepDown.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1085,'Lying Glute Stretch','Lie on floor or mat. Bend knees with feet on floor. Cross lower leg over thigh of other leg. Grasp foot and knee with both hands.','Pull leg toward torso. Hold stretch. Repeat with opposite leg.','upload/exercise-picture/30ef1c4275fd2c4cfaeeeb0d8dd02dc8.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1087,'Suspended Single Leg Split Squat (self-assisted)','Grasp one or both suspension trainer handle(s) in lower position hanging. Stand facing nearby fixed support and hold with one hand for balance. With other hand, secure foot in loop(s) from behind while balancing on one leg. With both hands, hold lightly on fixed support for balance and minimal assistance if needed.','Squat down by flexing knee and hip of front leg until knee of rear leg is almost in contact with floor. Return to original standing position by extending hip and knee of supporting leg. Repeat and continue with opposite leg.','upload/exercise-picture/STSingleLegSplitSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1088,'Suspended Single Leg Squat','Grasp suspension handles and momentarily step back until arms are extended forward and straight. While keeping arms straight and shoulders back, step forward so body reclines back behind suspension handles. Position body and legs straight at desired angle hanging from handles with arms straight. Balance on one leg with opposite leg extended straight forward as high as possible.','Squat down as far as possible while keeping leg elevated off of floor. Keep supporting knee pointed same direction as foot supporting. Raise body back, up to original position until knee and hip of supporting leg is straight. Repeat and continue with opposite leg.','upload/exercise-picture/STPistolSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1089,'PNF Lying Glute Stretch','Instruct participant to lie on floor or mat. Kneel beside participant. Bend participant\'s knee and hip and rotate leg cross wise. Position outside of participant\'s knee on nearest shoulder with participants lower leg extended under arm. Position near ankle on participant\'s opposite lower leg.','Extend or place hands on mat to each side of participant. Push participant\'s leg by leaning toward participant. Repeat with opposite leg.','upload/exercise-picture/601b4db67e8babb5ca963871f631d7d4.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1090,'Lever Glute Stretch','Sit on seat in forward position with lower leg on shin pad, feet on foot rest. Place hands through wrist straps. Hold lower bar with overhand grip. Position ankle on thigh or knee.','Push and lower seat back. Hold stretch. Repeat with opposite leg.','upload/exercise-picture/PCGlute8.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1091,'Lying Wall Glute Stretch','Sit on floor with hip and thigh against wall. Lift back of legs up against wall by pivoting on hips and lying on back. Cross lower leg over thigh of straight leg.','Bend knee of straight leg while lowering heel on wall. Hold stretch. Repeat with opposite leg.','upload/exercise-picture/596a1075c3ba2b462bf9673be6694ae9.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1092,'Prone Glute Stretch','Sit on floor or mat with outside of lower leg bent in front so it is approximately perpendicular to body. Place hands on floor in front and extend opposite leg back on floor so knee is toward floor.','Allow body to ease down toward floor with support of arms. Hold stretch and repeat with opposite leg.','upload/exercise-picture/432530b69b09c56a29da7a22cc0e8d08.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1093,'Towel Lying Glute Stretch','Lasso lower thigh with towel and lie on floor or mat. Bend knees with feet on floor. Cross lower leg over thigh of lassoed leg. Holding each side of towel position towel under knee.','Pull both ends of towel so leg travels toward torso. Hold stretch. Repeat with opposite leg.','upload/exercise-picture/777cefd67a1e210b525426dcbbb4e67d.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1094,'Suspended Single Leg Split Squat','Grasp one or both suspension trainer handle(s) in lower position. Step and face away from suspension trainers. Balance on one leg while raising foot from behind and slipping single foot in loop(s). Release handle with hand and position leg back so it is supported behind body by suspension trainer. Place hands on hips and maintain balance throughout exercise.','Squat down by flexing knee and hip of front leg until knee of rear leg is almost in contact with floor. Return to original standing position by extending hip and knee of forward leg and repeat. Continue with opposite leg.','upload/exercise-picture/STSplitSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1095,'Standing Glute Stretch','Stand facing close to elevated platform. Place outside of foot on bench with knee bent out to side.','Lean down, lowering torso toward thighs. Hold stretch. Repeat with opposite leg.','upload/exercise-picture/9272e1aa7795cd6d69eeec84008ae2bc.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1096,'Seated Glute Stretch','Sit on floor or mat reclining back with support of both arms behind body. Bend knees approximately 90 degrees with feet on floor. Cross lower leg (just above ankle) over thigh of opposite leg.\nSit on floor or mat and cross lower leg over thigh of straight leg. Lean back slightly and bend knee of lower leg with heel on floor. Grasp foot and knee.','Bring torso upright by walking hands closer to hips, keeping arms straight. Lean forward and hold stretch. Repeat with opposite leg.\nLean forward by pulling torso toward legs. Hold stretch. Repeat with opposite leg.','upload/exercise-picture/054db6718469ffb535af273b9a17cc98.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1097,'Seated Glute Stretch (chair)','Sit on chair or bench with ankles positioned below knees. Cross lower leg over thigh of opposite leg.','Lean down, lowering torso toward thighs. Hold stretch. Repeat with opposite leg.','upload/exercise-picture/136d4f4b1a6032c4ea14eea7427436c6.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1098,'Seated Glute Stretch (bench)','Straddle bench and sit. With one foot on floor, place outside of other foot on bench close to pelvis.','Lean down, lowering torso toward thighs. Hold stretch. Repeat with opposite leg.','upload/exercise-picture/58ce4a640c1833fb4a7f4e526d24f68e.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1099,'PNF Seated Glute Stretch','Instruct participant to sit on floor or mat, reclining back with support of both arms behind body, and feet on floor and knees bent. Have them cross their lower leg (just above ankle) over thigh of opposite leg. Position chest on participant\'s back and grasp participant\'s lower knee and upper ankle.','Push participant\'s torso toward legs. Hold stretch. Repeat with legs in opposite position','upload/exercise-picture/accfd2eb6746dc16fab0a4b4236c178f.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1100,'Seated Bent-over Glute Stretch','Sit on floor or mat with outside of lower leg bent in front and inside of opposite lower leg bent to side. Position bottom of forward foot against knee of opposite leg. Place hands on floor in front of forward leg.','Reach or slide forward with support of arms and hold stretch. Repeat with opposite leg.','upload/exercise-picture/66e6dd21450b69f03bbc492bafd6961d.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1101,'Squatting Glute Stretch','Stand toward fixed bar, approximately waist height. Grasp bar with both hands, arms extended. Bend knees and hips slightly. Cross lower leg over lower thigh of opposite leg.','Squat lower and lean forward toward crossed leg. Hold stretch . Repeat with opposite leg.','upload/exercise-picture/9571fa8af0d75d538ce0eaa398a67954.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1102,'Knee Hug','Stand on one leg. Raise knee high and grasp shin below knee with both hands.','Pull knee toward body until stretch is felt in hip. Release and step forward with stretched leg. Repeat with opposite leg. Continue by alternating stretch and step between each leg until specific distance is covered or desired number of repetitions have been completed.','upload/exercise-picture/KneeHug.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1103,'Walking Ankle Grab','Stand on one foot. Grasp foot with both hands by raising inside of foot upward with knee pointing outward; opposite hand grasps heal and near hand grasps shin, just above ankle.','Pull foot and lower leg upward until stretch is felt in hip. Release and step forward with stretched leg. Repeat with opposite leg. Continue by alternating stretch and step between each leg until specific distance is covered or desired number of repetitions have been completed.','upload/exercise-picture/WalkingAnkleGrab.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1104,'Lever Lying Hip Abduction','Sit in machine with heels on bars or legs inside of side pads. Lie back on back pad. Pull in on lever to position legs together. Release lever into position and grasp bars to sides.','Move legs away from one another by abduction hip. Return and repeat.','upload/exercise-picture/LVLyingAbduction.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1105,'Cable Seated Hip Internal Rotation','Sit on bench or chair with low pulley to side. Attach cable ankle cuff to ankle furthest pulley. Place foot of stationary leg just forward of foot attached to cable. Grasp bench and handle bar on cable column if available. Position thighs of both legs side by side, perpendicular to cable. Raise foot attached to cable slightly off of floor.','Keeping knee of attached leg bent approximately 90°, pull cable attachment away from pulley by rotating hip as far as possible. Return foot behind stationary foot and toward pulley. Repeat. Place ankle cuff on opposite leg and continue facing opposite direction.','upload/exercise-picture/CBSeatedHipInternalRotation.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1106,'Dumbbell Lying Hip Abduction','Lie on side on floor or mat. Extend top leg down straight and position lower leg back underneath. Grasping dumbbell with hand of arm furthest from floor, position dumbbell as low as possible on top side of thigh.','Raise weighted leg up off ground as high as possible, keeping dumbbell positioned on side of upper thigh. Return to leg to floor and repeat. Repeat and continue with opposite leg.','upload/exercise-picture/DBLyingHipAbduction.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1107,'Lever Standing Hip Abduction','Adjust platform so lever fulcrum is same height as hip articulation. Adjust roller in low position. Face machine and grasp bars to sides. Place outside of thigh against roller pad and shift body weight to opposite leg.','Raise leg against roller pad to side by abduction hip. Return and repeat. Reposition roller pad lever and continue with opposite leg.','upload/exercise-picture/LVStandingHipAbduction.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1108,'Cable Lying Hip Internal Rotation','Attach cable ankle cuff to ankle, furthest low pulley. Step near foot over cable and lie prone perpendicular to cable. Bend knee 90° so attached ankle crosses over resting straight leg nearest pulley. Adjust positioning of legs slightly away from cable pulley so slight stretch is felt in hip.','Keeping knee of attached leg bent approximately 90°, pull cable attachment away from pulley by rotating hip as far as possible. Return leg to original position toward pulley and repeat. Place ankle cuff on opposite leg and continue lying opposite direction.','upload/exercise-picture/CBLyingInternalHipRotation.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1109,'Cable Hip Abduction','Stand in front of low pulley facing to one side. Attach cable cuff to far ankle. Step out away from stack and grasp ballet bar. Stand on near foot and allow far leg to cross in front.','Move leg to opposite side of low pulley by abduction hip. Return and repeat. Turn around and continue with opposite leg.','upload/exercise-picture/CBHipAbduction.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1110,'Lever Seated Hip Abduction (plate loaded)','Stand near side of apparatus. Place one leg onto far padded lever and sit on seat. Lift other leg onto other padded lever. Lean back onto back pad. Grasp handles to sides.','Move legs away from one another as far as possible. Return and repeat.','upload/exercise-picture/LVSeatedHipAbductionH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1111,'Lever Seated Hip Abduction','Sit on machine with legs inside of side pads. If available, place heels on foot bars. Release and pull lever brace to position legs together. Engage lever into locked position. Lie back and grasp bars to sides.','Move legs apart as far as possible. Return and repeat.','upload/exercise-picture/LVSeatedHipAbduction.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1113,'Weighted Lying Hip Abduction','Sit on floor or mat with bar, plates loaded on one side. Sit on hip with knees bent and place bar on outside of shoe with weight plate(s) positioned beyond foot. Holding on to opposite end of bar, lie on side with weighted leg extended out straight and lower leg bent underneath.','Raise weighted leg up off ground as high as possible. Balance bar on side of foot while holding onto closest side of bar. Return to floor and repeat. Continue with opposite leg.','upload/exercise-picture/WtLyingHipAbductionRear.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1114,'Bent Knee Side Bridge Hip Abduction','Lie on side with legs bent back 90 degrees, one leg on top of the other. Place forearm under shoulder perpendicular to body.','Keeping shank of lower leg on mat or floor, raise hips up off ground while raising upper leg upward away from lower leg. Return to original position and repeat. Continue with opposite leg.','upload/exercise-picture/BWBentKneeSideBridgeHipAbduction.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1115,'Suspended Hip Abduction','Sit on floor facing suspension trainer loops in low position. Grasp bottom of loops, then lay supine. Raise legs and place heels in loops with soles contacting handles. Extend legs out and place arms on floor off to sides. Straighten low back, knees, and hips, raising back and hips off of floor.','Pull legs apart as far as possible. Return by placing legs together and repeat.','upload/exercise-picture/STHipAbduction.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1117,'Angled Side Bridge Hip Abduction','Grasp vertical bar with one hand and turn to side. Position feet out away from vertical bar with arm supporting body extended out to side. Legs should be straight and positioned side by side. Supporting arm should be approximately vertical to body and other arm can be placed on hips. Lower hips downward to floor until slight stretch is felt.','Keeping foot closest to bar on ground, raise hips upward and away from bar while raising leg furthest from bar upward away from lower leg. Return to original position with hips sagging downward and repeat. Continue with opposite leg.','upload/exercise-picture/BWAngledSideBridgeHipAbduction.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1123,'Side Bridge Hip Abduction','Lie on side with legs straight, one leg on top of the other. Place forearm under shoulder perpendicular to body.','Keeping side of bottom foot on ground, raise hips up off ground while raising upper leg upward away from lower leg. Return to original position and repeat. Continue with opposite leg.','upload/exercise-picture/BWSideBridgeHipAbduction.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1124,'Seated Hip Internal Rotator Stretch (chair or bench)','Sit on chair or end of bench and cross legs with outside of ankle on lower thigh.','Push knee toward downward. Hold stretch. Repeat with opposite side.','upload/exercise-picture/44b37e1aab348eb93bafb89080cea192.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1125,'Lying Pretzel Stretch','On floor or mat, lie supine with arms extended to sides. Cross thighs and position foot behind slightly bent leg.','Lower knee to opposite side, twisting waist so hip rolls to side. Hold stretch. Repeat with opposite side.','upload/exercise-picture/dab35e72da31b59d94623a0640b1926c.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1126,'Seated Hip Internal Rotator Stretch','Sit on floor or mat and cross lower leg over thigh of straight leg.','Push knee toward floor. Hold stretch. Repeat with opposite side.','upload/exercise-picture/9b05f865c78abdf92295a759ccbceacd.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1127,'PNF Lying Crossover Stretch','Instruct participant to lie on floor or mat. Kneel beside participant. Bend participant\'s near knee and hip. Place hand on outside of participant\'s near knee and opposite hand on participant\'s shoulder.','Push participant\'s knee to opposite side while backing participant\'s shoulder down. Hold stretch. Repeat with opposite side.','upload/exercise-picture/7a5b64ba949b42e3a72e160f92c2f955.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1128,'Seated Hip Internal Rotator Stretch (bent leg under)','Sit on floor or mat and place extended leg on top of inside of bent lower leg positioned perpendicular.','Straighten extended knee pushing bent knee toward floor. Hold stretch. Repeat with opposite side.','upload/exercise-picture/f66b7fdbd9075369b00d1c2e07a25a7e.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1130,'Lying Iliotibial Stretch','Lie on one side. Position ankle of lower leg over outside of upper thigh. Grasp top ankle or forefoot behind. Reposition side of upper body on floor.','Pull knee of rear leg back by straightening hip. Hold stretch. Repeat with opposite side.','upload/exercise-picture/4d256a130280ed534e17716ef102c5fd.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1131,'Squatting Iliotibial Stretch','Stand with feet together and side toward wall, arm\'s length away. Place hand on wall and opposite hand on hip.','Squat with supporting leg while placing leg nearest wall behind and across supporting leg so foot is positioned away from wall. Hold stretch. Repeat with opposite side.','upload/exercise-picture/9d854b4a82b260b4f3808518acb59a7b.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1132,'Seated Pretzel Stretch','Sit on floor or mat with knees straight. Place one foot on floor to outside of other knee. Turn torso toward side of bent knee supporting body with extended arm behind. Place elbow of opposite arm to outside of bent knee.','Push side of knee with elbow so bent leg further crosses thigh of straight leg. Hold stretch. Repeat with opposite side.','upload/exercise-picture/d82859f560a16796c812d0a3e19e610e.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1133,'Side Pretzel Stretch','Sit on side of thigh on floor or mat with knees bent. Position bent knee of upper leg behind foot of lower leg. Position chest facing floor with both hands on floor; arms somewhat extended and torso nearly inline with upper thigh.','Turn chest and front of pelvis further toward floor. Hold stretch. Repeat with opposite side.','upload/exercise-picture/b579aa254b37411388e062c381fe3de2.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1134,'Wall Iliotibial Stretch','Stand with feet together and side toward wall, slightly greater than arm\'s length away. Place closest hand on wall and opposite hand on hip.','With legs and hip straight, lower hip toward wall. Hold stretch . Repeat with opposite side.','upload/exercise-picture/c16a7f0b42ff96059d3f4ef4fec6107b.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1135,'Standing Iliotibial Stretch','Stand erect with legs crossed, outsides of feet together.','Maintaining complete extension of hip, shift body weight to rear leg allowing hip of leg in front to drop. Hold stretch. Repeat with opposite side.','upload/exercise-picture/8afc9098cde1ca0a010ebc1a6d9df8b8.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1136,'Cable Lying Leg Raise','Attach cable ankle straps to both ankles, then attach ankle straps to cable. Lie supine on floor or mat, back far enough so cable is taut. Grasp support behind head.','Raise legs by flexing hips and knees until thighs are just past perpendicular to torso or before hips raise off of bench. Return until hips and knees are extended. Repeat.','upload/exercise-picture/CBLyingLegRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1137,'Cable Lying Leg Raise (on bench)','Attach cable ankle straps to both ankles. Sit on end of bench facing pulley at bench height. Attach cable to both ankle straps. Lie supine on bench until cable is taut. Grasp sides of bench behind head.','Raise legs by flexing hips and knees until thighs are past perpendicular to torso or before hips raise off of bench. Return until hips and knees are extended. Repeat.','upload/exercise-picture/CBLyingLegRaiseBench.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1138,'Cable Standing Leg Raise','Attach cable ankle cuff to one ankle. Stand facing away from low pulley. Step\n\nforward\n\nwith opposite leg so leg with cuff is pulled back. Grasp lateral bars or other prop for support.','Raise knee by flexing hip while allowing lower leg to bend back under resistance. When thigh is just beyond horizontal, lower leg until hip and knee is extended. Repeat. Continue with opposite leg.','upload/exercise-picture/CBLegRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1139,'Cable Lying Straight Leg Raise','Attach cable ankle straps to both ankles, then attach ankle straps to cable. Lie supine on floor, mat, or bench back far enough so cable is taut. Grasp support behind head.','With knees straight, raise legs by flexing hips until thighs are just past perpendicular to torso or before hips raise off of mat. Return until hips are extended. Repeat.','upload/exercise-picture/CBStraightLegRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1140,'Cable Assisted Wheel Rollout','With ab wheel attached to cable via double looped strap attachment, straddle cable facing away from low pulley. Kneel with both knees on mat. Grasp handles on wheel to each side with overhand grip. Position wheel near front of knees and lean over wheel with arms extended downward, supporting upper body.','With arms straight, roll wheel out as far as possible. Lower body gently to floor extending arms forward. Raise body back up by flexing hips and pulling arms back to original position. Return until hips are extended. Repeat.','upload/exercise-picture/ASKneelingWheelRollout.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1141,'Lever Hip Flexion','Stand on platform facing to one side and grasp bar for support. Position front of leg nearest to machine against padded roller while standing on other leg.','Raise lever by flexing hip until knee is higher than hip. Return until hip is extended. Repeat. Continue with opposite leg.','upload/exercise-picture/LVHipFlexion.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1142,'Cable Standing Straight Leg Raise','Stand facing away from low pulley. Place foot in cable boot or foot harness. Grasp lateral bars or other prop for support. Stand forward on free leg, allowing leg attached to cable to be pulled back.','Raise leg upward by flexing hip while keeping knee straight. Raise leg as high as possible. Lower leg to original starting position. Repeat. Continue with opposite leg.','upload/exercise-picture/CBStandingStraightLegRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1143,'Lever Vertical Leg Raise','Grasp handles slightly to front and stand on foot bar with knees slightly bent and hips against pad.','With back straight, raise legs as high as possible by flexing hips. Return and repeat.','upload/exercise-picture/LVVerticalLegRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1144,'Weighted Decline Sit-up','Sit on apparatus with lower leg secured under padded bar. Hold weight in front of chest (as shown) or behind neck or use no weight.','Lower body back until hips are almost extended. Raise body by flexing hips until torso is upright. Repeat.','upload/exercise-picture/WtDeclineSitUp.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1145,'Weighted Hanging Leg Raise','Place weight between ankles or use no weight. Grasp and hang from high bar.','Raise legs by flexing hips and knees until hips are completely flexed or knees are well above hips. Return until hips and knees are extended. Repeat.','upload/exercise-picture/WTHangingLegRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1146,'Lever Lying Leg Raise','Sit on end of bench with both legs over padded lever and hips aligned with fulcrum. Strap legs onto padded lever. Lie supine on bench. Grasp handles near head.','Raise legs by flexing hips until they are completely flexed. Lower legs until hips are extended. Repeat.','upload/exercise-picture/LVLyingLegRaiseN.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1147,'Weighted Incline Straight Leg Raise','Sit on incline board. Place weight between ankles. Lie supine on incline board with torso elevated. Grasp feet hooks or sides of board for support.','With knees straight, raise legs by flexing hips until thighs are just past perpendicular to torso. Return until hips and knees are extended. Repeat.','upload/exercise-picture/WtInclineStraightLegRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1148,'Weighted Incline Leg Raise','Sit on incline board. Place weight between feet or use no weight. Lie supine on incline board with torso elevated. Grasp feet hooks or sides of board for support.','Raise legs by flexing hips and knees until hips are completely flexed. Return until hips and knees are extended. Repeat.','upload/exercise-picture/WtInclineLegRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1149,'Weighted Incline Straight Leg Raise (arms on pads)','Sit on bottom edge of incline board and place weight between feet. Lie back on incline board. Grasp handles and place forearms on arm pads to each side.','With knees straight, raise legs by flexing hips until hips are flexed. Return until hips and knees are extended. Repeat.','upload/exercise-picture/WTInclineStraightLegRaiseArmPads.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1150,'Weighted Lying Leg Raise','Sit on end of bench. Place weight between feet. Lie supine on bench. Grasp bench on each side behind head for support.','Raise legs by flexing hips and knees until hips are completely flexed. Return until hips and knees are extended. Repeat.','upload/exercise-picture/WtLyingLegRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1151,'Weighted Hanging Straight Leg Raise','Place weight between ankles or use no weight. Grasp and hang from high bar.','With knees straight, raise legs by flexing hips until thighs are just past parallel to floor. Return until hips are extended downward. Repeat.','upload/exercise-picture/WtHangingStraightLegRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1152,'Weighted Seated Leg Raise','Sit on edge of bench with legs extended to floor. Place weight between ankles. Grasp edge of bench. Lean torso back and balance bodyweight on edge of bench.','Raise legs by flexing hips and knees while pulling torso slightly forward to maintain balance. Return by extending hips and knees and lean torso back to counter balance. Repeat.','upload/exercise-picture/WtSeatedLegRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1153,'Weighted Incline Leg Raise (arms on pads)','Sit on bottom edge of incline board and place weight between feet. Lie back on incline board. Grasp handles and place forearms on arm pads to each side.','Raise legs by flexing hips and knees until hips are completely flexed. Return until hips and knees are extended. Repeat.','upload/exercise-picture/WtLegRaiseArmsPads.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1154,'Weighted Vertical Leg Raise (on parallel bars)','Place weight between ankles. Stand between parallel bars and grip bar on each side with overhand grip. Lift body off floor and balance body upright with arms straight.','Raise legs by flexing hips and knees until thighs are just past parallel to floor. Return until hips and knees are extended. Repeat.','upload/exercise-picture/WTVerticalLegRaisePB.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1155,'Weighted Vertical Leg Raise','Place weight between ankles or use no weight. Position forearms on padded parallel bars with hands on handles, and back on vertical pad.','Raise legs by flexing hips and knees until hips are completely flexed or knees are well above hips. Return until hips and knees are extended. Repeat.','upload/exercise-picture/WtVerticalLegRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1156,'Weighted Roman Chair Sit-up','Sit on apparatus with lower leg secured under padded bar. Hold weight to front of chest or behind neck or use no weight.','Lower body back until hips are almost extended. Raise body by flexing hips until torso is upright. Repeat.','upload/exercise-picture/WTRomanChairSitup.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1157,'Hanging Leg Raise','Grasp and hang from high bar with slightly wider than shoulder width overhand grip.','Raise legs by flexing hips and knees until hips are completely flexed or knees are well above hips. Return until hips and knees are extended downward. Repeat.','upload/exercise-picture/BWHangingLegRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1158,'Hanging Straight Leg Raise','Grasp and hang from high bar with slightly wider than shoulder width overhand grip.','With knees straight, raise legs by flexing hips until hips are completely flexed or knees are well above hips. Return until hips are extended downward. Repeat.','upload/exercise-picture/BWHangingStraightLegRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1159,'Hanging Leg Raise (with ab straps)','Stand below ab straps hanging from high bar. Place upper arms in straps and grasp straps above.','Raise legs by flexing hips and knees until hips are completely flexed or knees are well above hips. Return until hips and knees are extended downward. Repeat.','upload/exercise-picture/BWHangingLegRaiseAbStraps.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1160,'Incline Leg Raise','Lie supine on incline board with torso elevated. Grasp feet hooks or sides of board for support.','Raise legs by flexing hips and knees until hips are completely flexed. Return until hips and knees are extended. Repeat.','upload/exercise-picture/BWInclineLegRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1161,'Incline Straight Leg Raise (arms on pads)','Lie back on incline board. Grasp handles and place forearms on arm pads to each side.','With knees straight, raise legs by flexing hips until hips are flexed. Return until hips and knees are extended. Repeat.','upload/exercise-picture/BWInclineStraightLegRaiseArmPads.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1162,'Weighted Vertical Straight Leg Raise','Place weight between ankles or use no weight. Position forearms on padded parallel bars with hands on handles, and back on vertical pad.','With knees straight, raise legs by flexing hips until thighs are just past parallel to floor. Return until hips are extended. Repeat.','upload/exercise-picture/WtVerticalStraightLegRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1163,'Incline Leg Raise (arms on pads)','Lie back on incline board. Grasp handles and place forearms on arm pads to each side.','Raise legs by flexing hips and knees until hips are flexed. Return until hips and knees are extended. Repeat.','upload/exercise-picture/BWLegRaiseArmsPads.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1164,'Lying Leg Raise (on bench)','Lie supine on bench. Place hands under lower buttock on each side to support pelvis.','Raise legs by flexing hips and knees until thighs are completely flexed. Return until hips and knees are extended. Repeat.','upload/exercise-picture/BWLyingLegRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1165,'Incline Straight Leg Raise','Sit on incline board. Lie supine on incline board with torso elevated. Grasp feet rollers or sides of board for support.','With knees straight, raise legs by flexing hips until hips are completely flexed. Return until hips and knees are extended. Repeat.','upload/exercise-picture/BWInclineStraightLegRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1166,'Lying Simultaneous Alternating Leg Raise','Lie supine on bench or mat. Place hands under lower buttock on each side to support pelvis. Raise bent leg up so lower leg is approximately horizonal above hip. If lying on floor, raise other leg slightly off of floor.','Simultaneously change positions of legs, lowering and straightening raised leg down just above floor while raising and bending lower leg to opposite position. Continue alternating leg positions.','upload/exercise-picture/BWSimultaneousAlternatingLegRaises.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1167,'Vertical Leg Raise (on parallel bars)','Stand between parallel bars and grip bar on each side with overhand grip. Lift body off floor and balance body upright with arms straight.','Raise legs by flexing hips and knees until hips are completely flexed. Return until hips and knees are extended. Repeat.','upload/exercise-picture/BWVerticalLegRaisePB.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1168,'Vertical Leg Raise','Position forearms on padded parallel bars with hands on handles, and back on vertical pad.','Raise legs by flexing hips and knees until hips are completely flexed or knees are well above hips. Return until hips and knees are extended. Repeat.','upload/exercise-picture/BWVerticalLegRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1169,'Lying Straight Leg Raise','Lie supine on bench or mat. Place hands under lower buttock on each side to support pelvis.','Keeping knees straight, raise legs by flexing hips until hips are completely flexed. Return until hips and knees are extended. Repeat.','upload/exercise-picture/BWLyingStraightLegRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1170,'Seated Leg Raise','Sit on edge of bench with legs extended to floor. Place weight between ankles or use no weight. Grasp edge of bench. Lean torso back and balance body weight on edge of bench.','Raise legs by flexing hips and knees while pulling torso slightly forward to maintain balance. Return by extending hips and knees and lean torso back to counter balance. Repeat.','upload/exercise-picture/BWSeatedLegRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1171,'Lying Scissor Kick','Lie supine on bench or mat. Place hands under lower buttock on each side to support pelvis. Raise one leg up vertical with knee nearly straight. If lying on floor, raise other leg slightly off of floor.','Keeping knees nearly straight, simultaneously change positions of legs so vertical leg is lowered while lower leg is raised vertically. Continue alternating leg positions.','upload/exercise-picture/BWScissorsKicks.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1172,'Lying Simultaneous Alternating Straight Leg Raise','Lie supine on bench or mat. Place hands under lower buttock on each side to support pelvis. Raise one leg up vertically with knee nearly straight. If lying on floor, raise other leg slightly off of floor.','Keeping knees nearly straight, simultaneously change positions of legs so vertical leg is lowered while lower leg is raised vertically. Continue alternating leg positions.','upload/exercise-picture/BWSimultaneousAltStraightLegRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1173,'Lying Leg Raise (on floor)','Lie supine on mat or floor. Place hands under lower buttock on each side to support pelvis.','Raise legs by flexing hips and knees until thighs are completely flexed. Return until hips and knees are extended. Repeat.','upload/exercise-picture/BWLyingBentLegRaiseFloor.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1174,'Roman Chair Sit-up','Sit on chair or bench with lower leg secured under low over hang or heavy bar. Place hands on waist, chest, neck, or head depending upon desired difficulty.','Lower body back until hips are almost extended. Raise body by flexing hips until torso is upright. Repeat.','upload/exercise-picture/BWRomanChairBench.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1175,'Vertical Straight Leg Raise','Position forearms on padded parallel bars with hands on handles, and back on vertical pad.','With knees straight, raise legs by flexing hips until thighs are just pass parallel to floor. Return until hips are extended. Repeat.','upload/exercise-picture/BWVerticalStraightLegRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1176,'Jack-knife on Ball','Kneel with chest or waist on exercise ball. Dive over top and place hands on floor with arms extended down supporting upper body. While keeping body horizontal, walk hands further away from ball until shins are positioned on top of ball. With arms vertical and straight, support body off of floor with body straight. See suggested mount onto exercise ball.','Bend hips and knees, allowing shins to roll over top of ball. Pull knees toward chest until heels are under or near glutes. Return by extending hips and knees to original position. Repeat.','upload/exercise-picture/BWJackKnifeBall.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1177,'Pike on Power Wheel','With feet strapped to power wheel, kneel on floor. Place hands shoulder width apart on floor. With arms vertical and straight, support body off of floor while rolling power wheel back until body is straight.','From plank position, raise rear end up as high as possible by bending hips. Pull power wheel toward hands while keeping knees straight. Return by extending hips to original position.\n\n\nRepeat.','upload/exercise-picture/BWWheelPike.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1178,'Pike on Discs','Kneel on floor with forefeet on gliding discs. Place hands shoulder width apart on floor. With arms vertical and straight, support body off of floor while sliding gliding discs back until body is straight.','From plank position, raise rear end up as high as possible by bending hips. Pull gliding discs toward hands while keeping knees straight. Return by extending hips to original position. Repeat.','upload/exercise-picture/BWDiscPike.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1179,'Jack-knife on Power Wheel','With feet strapped to power wheel, kneel on floor. Place hands shoulder width apart on floor. With arms vertical and straight, support body off of floor while rolling power wheel back until body is straight.','Bend hips and knees, pulling legs under body. Pull bent knees toward chest, allowing rear end to raise upward. Return by extending hips and knees to original position. Repeat.','upload/exercise-picture/BWWheelJackknife.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1181,'Kneeling Hip Flexor Stretch','Lunge forward with knee on padded mat. Position foot beyond forward knee. Place hands on knee.','Straighten hip of rear leg by pushing hips forward. Hold stretch. Repeat with opposite side.','upload/exercise-picture/5dec96831a3cb85fb04c2c192e699f8c.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1182,'Lunging Hip Flexor Stretch','Lunge with one foot far behind other foot.','Squat down with chest high, straightening hip of rear leg by pushing hips down and forward. Hold stretch. Repeat with opposite side.','upload/exercise-picture/7e0821bc06976b844c669e3e4c5a5b8f.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1183,'Bent-over Lunging Hip Flexor Stretch','Kneel down and position one leg extended behind. Balancing with hands positioned on floor to sides. Rear knee is extended off floor. Body weight is supported on both forefeet.','Straighten hip of rear leg by pushing hips down and forward. Hold stretch. Repeat with opposite side.','upload/exercise-picture/96a7d17ea46181c828f7be181175434e.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1184,'Suspended Mountain Climber','Sit on floor facing suspension trainer loops in low position. Place right foot in left lower loop. Cross left leg over right leg placed in right lower loop. Turn body to right and place hands on floor, shoulder width apart. Turn body to kneel on hands and knees. Reposition hands (shoulder width or slightly wider) at desired distance from suspension trainer so that body is square with suspension trainer straps. With arms straight, raise knees from ground so body is supported by arms and suspension trainer. Bend one leg so knee is pointing down while keeping other leg extended out straight.','Simultaneously alternate leg positions by straightening bent leg behind, while bending straight leg forward. Repeat.','upload/exercise-picture/STMountainClimber.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1185,'Lever Hip Flexor Stretch','Flip seat all way back. Stand facing bar with supporting foot slightly forward under, or near apparatus. Grasp handle bars for support. Place top of other foot back on top edge of shin pad.','Squat down with back straight while straightening hip of rear leg by pushing hips forward. Hold stretch. Repeat with opposite side.','upload/exercise-picture/PCHipFlexors8.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1186,'Suspended Pike','Sit on floor facing suspension trainer loops in low position. Place right foot in left lower loop. Cross left leg over right leg placed in right lower loop. Turn body to right and place hands on floor shoulder width apart. Turn body to kneel on hands and knees. Reposition hands (shoulder width or slightly wider) at desired distance from suspension trainer so that body is square with suspension trainer straps. With arms straight, raise knees from ground, so body is supported by arms and suspension trainer.','Raise rear end up as high as possible by bending hips. Pull feet toward hands, while keeping knees straight. Return by extending hips to original straight body position. Repeat.','upload/exercise-picture/STPike.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1190,'Standing Hip Flexor Stretch','Stand facing bench or elevated platform, approximately legs length away. Place one foot on bench or platform.','Slowly lunge forward by bending forward leg. With chest high, straighten hip of rear leg by pushing hips forward. Hold stretch. Repeat with opposite side.','upload/exercise-picture/99a9392130283de0ac595065ad21a3f0.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1191,'Sled Kneeling Hip Flexor Stretch','Straddle machine and grasp handles for support. Place foot on lower platform under podium and other lower leg on padded support behind.','Squeeze release grips and slide padded leg support back until mild stretch is felt. Hold stretch. Repeat with opposite side.','upload/exercise-picture/1acff9d0c5a6577673d144f23b4eb36e.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1192,'Lying Hip Flexor Stretch','Lie on tall bench with thigh hanging down off end or side of bench. Raise opposite thigh toward side of torso. Hook hand around inside of upper thigh. Grasp elbow with opposite hand and keep arms close to body.','Allow lower thigh to drop toward floor. Hold stretch. Repeat with opposite side.','upload/exercise-picture/80b72e66f678fe1c106d3f51c422d3f3.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1194,'Cable Seated Hip External Rotation','Sit on bench or chair with low pulley to side. Attach cable ankle cuff to ankle, nearest pulley. Place far stationary foot slightly forward. Grasp lower thigh of leg with attached cuff, position it along side thigh of stationary leg while keeping foot slightly above floo\n\n\nr.','Keeping knee of attached leg bent approximately 90°, pull cable attachment under thigh of stationary leg by rotating hip. Return until slight stretch is felt in hip, then repeat. Place ankle cuff on opposite leg and continue facing opposite direction.','upload/exercise-picture/CBSeatedHipExternalRotation.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1195,'Lying Hip External Rotator Stretch','Lie on floor or mat and with one leg straight and other leg bent approximately 90 degrees out to side.','Lower bent knee beside straight leg. Hold stretch. Repeat with opposite side.','upload/exercise-picture/6814ad0e04c771d1ee315fbce56de8fa.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1197,'PNF Lying Piriformis Stretch','Instruct participant to lie on floor or mat with legs bent. Stand near their feet facing them. Assist them crossing their thighs, placing outside of one knee close to top of their other knee. Bend over participant\'s hips, position their foot of closest bent leg on your chest or shoulder while grasping their lower leg, in addition to knee of opposite leg with other hand.','Push your bodyweight down on foot while pushing down on side of participant\'s knee. Hold stretch. Repeat with legs in opposite position.','upload/exercise-picture/c4ab7a481b05c4dc34fc5daa95e2f72d.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1199,'Lever Piriformis Stretch','Sit on seat in forward position with lower leg on shin pad, feet on foot rest. Place hands through wrist straps. Hold upper bar with overhand grip, both hands left of center. Position left leg extended toward right center.','Push and lower seat back. Repeat with opposite leg.','upload/exercise-picture/PCPeriformis8.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1200,'Seated Piriformis Stretch','Sit on floor or mat, reclining back with support of both arms behind body, and feet on floor and knees bent approximately 90 degrees. Cross thighs by placing back of knee on thigh of other leg. Grasp lower leg.','Reposition hands forward with arms straight to place torso closer to legs. Hold stretch. Repeat with opposite leg.','upload/exercise-picture/c49b018ec1b80983d7d0e8c378f751d1.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1201,'Cable Lying Hip External Rotation','Attach cable ankle cuff to ankle, nearest low pulley. Lie prone with legs slightly apart and knee of attached leg bent 90°. Adjust position of legs slightly away from cable pulley so slight stretch is felt in hip.','Keeping knee of attached leg bent approximately 90°, pull cable attachment toward opposite knee by rotating hip. Return until slight stretch is felt in hip, then repeat. Place ankle cuff on opposite leg and continue lying opposite direction.','upload/exercise-picture/CBLyingExternalHipRotation.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1202,'Seated Hip External Rotator Stretch','Sit on floor or mat and with one leg straight and other leg bent approximately 90 degrees out to side.','Lower bent knee beside straight leg. Hold stretch. Repeat with opposite side.','upload/exercise-picture/3bc2bfb10ed4b6ecdd493e2dacf3dcc4.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1203,'Lying Piriformis Stretch','Lie on floor or mat with feet on floor and knees bent approximately 90 degrees. Cross thighs by lacing back of knee on thigh of other leg. Lift legs and hug both thighs locking both hands together behind knee of lower leg.','Pull leg toward torso. Hold stretch. Repeat with opposite leg.','upload/exercise-picture/eb19a49ba33c584eb6e916e0faf87d3b.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1204,'Lying Piriformis Stretch (single leg)','Lie on floor or mat. Lift one leg and grasp ankle and knee with both hands.','Pull thigh toward torso while keeping knee over torso. Hold stretch. Repeat with opposite leg.','upload/exercise-picture/ff6c6e39d18091125b4ce72a9c98d2e9.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1205,'Seated Piriformis Stretch (chair or bench)','Sit on chair of bench with feet on floor and knees bent approximately 90 degrees. Cross thighs by placing back of knee on thigh of other leg. Grasp lower leg.','Lean forward pulling body toward legs. Hold stretch. Repeat with opposite leg.','upload/exercise-picture/b1562667bd54d0e5b91470e22135b530.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1206,'PNF Seated Piriformis Stretch','Instruct participant to sit on floor or mat, reclining back with support of both arms behind body, and feet on floor and knees bent. Have them cross their thighs by placing back of knee on thigh of other leg. Ask them position foot on floor closer to hip. Place your hands on back of participants shoulders or position your chest on participant\'s upper back and your hands under participant\'s lower thighs.','Push participant\'s torso toward legs. Hold stretch. Repeat with legs in opposite position.','upload/exercise-picture/cd0fa842e5cae16357d90b063855ba67.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1211,'Barbell Side Split Squat','Place barbell on back of shoulders and grasp bar on each side. Stand with feet wide apart; foot of lead leg angled out to side.','Lower body toward side of angled foot by bending knee and hip of lead leg while keeping opposite leg only slightly bent. Return to original standing position by extending hip and knee of lead leg. Repeat.','upload/exercise-picture/BBSideSplitSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1217,'Barbell Squat','From rack with barbell at upper chest height, position bar high on back of shoulders and grasp barbell to sides. Dismount bar from rack and stand with shoulder width stance.','Squat down by bending hips back while allowing knees to bend forward, keeping back straight and knees pointed same direction as feet. Descend until thighs are just past parallel to floor. Extend knees and hips until legs are straight. Return and repeat.','upload/exercise-picture/BBSquatHigh.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1237,'Cable Belt Half Squat','Place cable belt or dip belt around waist. Kneel before low pulley and attach it to cable. Stand on elevated platform with feet shoulder width or slightly wider on platform between very low and close pulley cables. Place hand(s) on ballet bar or machine (not on guide rod!) for balance.','Squat down by bending hips back while allowing knees to bend forward, keeping back straight and knees pointed same direction as feet. Descend until weight stack taps or comes very close from making contact. Keeping chest high and back straight, raise back up by extending knees and hips until legs are straight. Repeat.','upload/exercise-picture/CBThreeQuarterSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1239,'Cable Standing Leg Extension','Stand facing away from low pulley. Place foot in cable boot attachment (as shown) or foot harness. Grasp lateral bars or other prop for support. Stand forward on free leg. Raise knee up positioning thigh approximately 45° forward. Allow lower leg attached to cable to be pulled back.','Keeping thigh stationary, extend lower leg forward until leg is straight. Return by lowering lower leg down and back to original position. Repeat.','upload/exercise-picture/CBStandingLegExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1243,'Cable Step Down','Grasp cable stirrup(s) with both hands. Place one foot on elevated platform positioned near or between low pulleys.','Raise body by extending knee and hip on platform until leg is straight. Return until foot of lower leg makes contact with lower platform or floor and repeat. Continue with opposite leg.','upload/exercise-picture/CBStepDown.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1249,'Lever Leg Extension (plate loaded)','Sit on apparatus with back against padded back support. Place front of lower legs under padded lever. Position knee articulation at same axis as lever fulcrum. Grasp handles to sides for support.','Move lever forward and upward by extending knees until legs are straight. Return lever to original position by bending knees. Repeat.','upload/exercise-picture/LVLegExtensionH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1254,'Lever Alternating Leg Extension (plate loaded)','Sit on apparatus with back against padded back support. Place front of lower legs under padded lever. Position knee articulation at same axis as lever fulcrum. Grasp handles to sides for support.','Move one lever forward and upward by extending one knee until leg is straight. Lower to original position. Repeat with opposite side. Continue to alternate between sides.','upload/exercise-picture/LVAlternatingLegExtensionPL.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1262,'Lever Single Leg Standing Leg Press (plate loaded)','Step on left platform with left foot. Grasp handle bars to each side. Place right foot on highest lever platform.','Push platform down by extending hip and knee until straight. Return leg to original position. Repeat. Continue with opposite leg positions.','upload/exercise-picture/LVStandingSingleLegPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1271,'Lever Front Squat (plate loaded)','Step onto platform facing padded levers. Squat down to place shoulders under padded lever. Place feet shoulder width apart on platform. Extend knees and hips until legs are straight. Release support lever if it does not disengage by itself.','Lower lever by bending hips back while allowing knees to bend forward, keeping back straight and knees pointed same direction as feet. Descend until thighs are just past parallel to floor. Lift lever up by extending knees and hips until legs are straight. Repeat.','upload/exercise-picture/LVFrontSquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1279,'Lever Alternating Leg Extension','Sit on apparatus with back against padded back support. Place front of lower legs under padded lever. Position knee articulation at same axis as lever fulcrum. Grasp handles to sides for support.','Move lever forward and upward by extending one knee until leg is straight. Lower to original position. Repeat with opposite leg. Continue to alternate between sides.','upload/exercise-picture/LVAlternatingLegExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1281,'Lever Alternating Leg Extension (unilateral machine)','Sit on apparatus with back against padded back support. Place front of lower legs under padded levers. Position knee articulation at same axis as lever fulcrum. Grasp handles to sides for support.','Move one lever forward and upward by extending one knee until leg is straight. Lower to original position. Repeat with opposite side. Continue to alternate between sides.','upload/exercise-picture/LVAlternatingLegExtensionUnilateral.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1285,'Lever Leg Extension','Sit on apparatus with back against padded back support. Place front of lower legs under padded lever. Position knee articulation at same axis as lever fulcrum. Grasp handles to sides for support.','Move lever forward and upward by extending knees until legs are straight. Return lever to original position by bending knees. Repeat.','upload/exercise-picture/LVLegExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1286,'Lever Alternating Lying Leg Press','Lie on machine with shoulder under pads. Place feet on individual lever platforms. Grasp handles to sides. Push both lever platforms away by extending knees and hips so knees are straight.','Lower one lever platform toward body by bending knee and hip until weight taps or nearly taps unused portion of weight stack. Push lever platform away by extending knee and hip. Repeat with opposite leg. Continue by alternating between sides.','upload/exercise-picture/LVAlternatingLyingLegPressN.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1289,'Sled Hack Press (plate loaded)','Sit on sled with back of hips against back pad. Place feet on platform shoulder width or slightly wider. Extend hips and knees. Release dock lever(s).','Lower sled by flexing hips and knees until either is near complete flexion. Raise sled by extending knees and hips. Repeat.','upload/exercise-picture/SLSeatedHackPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1309,'Smith Step Down','Position smith bar upper chest height with platform under\nbar off to one side. Positioned shoulders under bar and one foot\non platform with other leg extended slightly forward on floor.','Raise bar upward by straightening leg and pushing body upward.\nLower body downward by returning foot off of bench to floor and\nrepeat. Continue with opposite position.','upload/exercise-picture/SMStepDownQuad.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1317,'Weighted Sissy Squat','With shoulder width stance, grasp fixed bar or support at hip level with one arm and secure plate across chest with other arm.','With hips and waist straight, bend knees to allow body to fall backwards as knees come forward. Allow heels to raise from floor. Lower body until knees are almost fully flexed or near floor. Return to original position by extending knees as heels return to floor.','upload/exercise-picture/WTSissySquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1323,'Weighted Sissy Squat (on apparatus)','Place feet under lower padded bar with calves against upper pads. Secure weight plate high on chest with both arms.','Allow body to fall backwards by bending knees. During descent, gradually bend hips, yet keep chest high and don\'t allow torso to angle forward. Lower body until back of thigh is against upper pad. Rise to original position by extending knees and hips while keeping shoulders behind hips. Repeat.','upload/exercise-picture/WTSissySquatAp.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1324,'Sissy Squat','With shoulder width stance, grasp fixed bar or support at hip level with one arm.','With hips and waist straight, bend knees to allow body to fall backwards as knees come forward. Allow heels to raise from floor. Lower body until knees are almost fully flexed or near floor. Return to original position by extending knees as heels return to floor.','upload/exercise-picture/BWSissySquat.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1329,'Sissy Squat (on apparatus)','Place feet under lower padded bar with calves against upper pads. Cross arms and touch shoulders or place arms out straight in front of shoulders.','Allow body to fall backwards by bending knees. During descent, gradually bend hips, yet keep chest high and don\'t allow torso to angle forward. Lower body until back of thigh is against upper pad. Rise to original position by extending knees and hips while keeping shoulders behind hips. Repeat.','upload/exercise-picture/SissySquatAp.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1332,'Alternating Step Down','Stand on bench or narrow platform, with feet side by side.','Step down with first foot to side of elevated surface onto floor. Stand back up on elevated surface by straightening upper leg and pushing body upward. Place foot to original position, next to opposite foot. Step down and back up with opposite leg in same manner. Repeat by alternating between sides.','upload/exercise-picture/BWAlternatingStepDown.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1466,'Kneeling Quadriceps Stretch','Kneel with knee on padded mat and other foot positioned forward. Place hands on knee. Grasp other hand under top of foot.','Drive hip forward and pull foot toward rear end. Hold stretch. Repeat with opposite side.','upload/exercise-picture/59c68250d668fa021bf4756f0d834455.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1467,'PNF Lying (prone) Quadriceps Stretch','Instruct participant to lie prone on mat or floor. Straddle participant facing toward feet. Knee beside participant with leg extended over or just above participant\'s hips. Bend participant\'s near knee and place hand under participant\'s upper leg and opposite hand on ankle.','Lift knee and push ankle down toward hip. Hold stretch. Repeat with opposite side.','upload/exercise-picture/f5d0adea1ef2e6f57ffb075662e5b805.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1468,'Lying (prone) Quadriceps Stretch','Lie prone on mat or floor. Grasp top ankle or forefoot behind.','Pull ankle or forefoot to rear end. Hold stretch. Repeat with opposite side.','upload/exercise-picture/8650332bac4a78ee12233f7f381967a7.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1469,'Lever Quadriceps Stretch','Flip seat all way back. Stand facing bar with supporting foot slightly forward under, or near apparatus. Grasp handle bars for support. Place top of other foot back on top edge of shin pad.','Squat down with back straight and chest up while positioning hip straight close to back of heel. Hold stretch. Repeat with opposite side.','upload/exercise-picture/PCQuadriceps8.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1470,'Standing Quadriceps Stretch (towel)','With foot on bench or floor place towel around ankle. Grasp both ends of towel behind ankle with closest hand. Stand on opposite leg and touch wall or stationary object with other arm for balance. Pull foot to rear end with towel.','Straighten hip by moving knee backward. Hold stretch. Repeat with opposite side.','upload/exercise-picture/2bfdf923775985d2c43a391f4974ac29.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1471,'Standing Quadriceps Stretch','Stand and touch wall or stationary object for balance. Grasp top ankle or forefoot behind. Pull ankle or forefoot to rear end.','Straighten hip by moving knee backward. Hold stretch. Repeat with opposite side.','upload/exercise-picture/9e704875a65e1a3cec886b2d49e7212b.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1472,'Lying (side) Quadriceps Stretch','Lie on one side. Grasp top ankle or forefoot behind. Pull ankle or forefoot to rear end.','Straighten hip by moving knee backward. Hold stretch. Repeat with opposite side.','upload/exercise-picture/98c53b178d92d5e8dd7f7f0de119bc49.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1473,'Standing Quadriceps Stretch (on apparatus)','Stand facing away from adjustable shelf, hip to upper thigh height. Grasp support for balance. With assistance from other hand, bend over slightly and place foot on shelf behind hip. Grasp supports with both hands and stand upright.','Bend supporting knee slightly while driving hip back closer to heel. Hold stretch. Repeat with opposite side.','upload/exercise-picture/ad26b1a7a309d91749d8a2a408dc3bf0.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1474,'Walking Quadriceps Stretch','Stand and step forward with left foot.','Standing on left foot, position right foot behind and grasp it with right hand. Pull right heel toward right glute while pulling right knee down and back. Release right foot, step forward with right foot, and repeat on left side while standing on right foot. Continue by alternating between each side until specific distance is covered or desired number of repetitions have been completed.','upload/exercise-picture/WalkingQuadStretch.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1476,'Barbell Good-morning','Position barbell on back of shoulders and grasp bar to sides.','Keeping back straight, bend hips to lower torso forward until parallel to floor. Raise torso until hips are extended. Repeat.','upload/exercise-picture/BBGoodMorning.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1478,'Barbell Back Raise (on hyperextension apparatus)','Stand in hyper-extension apparatus. Position thighs prone on large pad and lower leg under padded bar. Place barbell on back of shoulders and grasp bar to sides.','Lower body by bending hips until fully flexed. Raise, or extend hips until torso is parallel to legs. Repeat.','upload/exercise-picture/BBHipExtention.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1479,'Barbell Straight-back Straight-leg Deadlift','Grasp barbell from rack or deadlift from floor with shoulder width or slightly wider overhand or mixed grip. Stand with shoulder width or narrower stance.','With knees and back straight, lower bar by bending hips until hamstrings are tight, or just before lower back bends. Lift bar by extending hips until upright. Pull shoulders slightly back at top of lift if rounded. Repeat.','upload/exercise-picture/BBStraightBackStraightLegDeadlift.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1480,'Trap Bar Straight-back Straight-leg Deadlift','Stand with feet shoulder width or narrower in trap bar, weight to each side. Squat down with feet flat and grasp handles to sides. Deadlift from floor.','With knees and back straight, lower bar by bending hips until hamstrings are tight, or just before lower back bends. Lift bar by extending hips until upright. Pull shoulders slightly back at top of lift if rounded. Repeat.','upload/exercise-picture/TBStrtBackStrtLegDeadlift.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1481,'Barbell Glute-Ham Raise','Place ankles between ankle roller pads with feet on vertical platform and position knees on pad with lower thighs against large padded hump. If barbell can safely be placed on horizontal handles, grasp barbell in upright position and place behind shoulders. If barbell is placed on floor, lower torso by extending knees and flexing hips, then position barbell on back of shoulders. Grasp bar to sides.','From lower position, raise torso by extending hips until fully extended. Continue to raise body by flexing knees until body is upright. Lower body by straightening knees until body is horizontal. Continue to lower torso by bending hips until body is upside down. Repeat.','upload/exercise-picture/BBGluteHamRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1483,'Barbell Inverse Leg Curl','Adjust padded supports and kneel upright in apparatus. Position knees against large roller pad or near-upper side of padded hump, ankles between padded supports, and feet on platform. Place barbell on back of shoulders and grasp bar to sides.','Lower body until horizontal by straightening knees. Raise body by flexing knees only allowing hips to bend slightly. Repeat.','upload/exercise-picture/BBHamRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1485,'Barbell 45° Back Raise (on hyperextension apparatus)','Position thighs prone on upper padding of 45-degree hyper-extension apparatus. Hook heels on platform lip or under padded brace. Place barbell on back of shoulders and grasp bar to sides.','Lower body by bending hips until fully flexed. Raise or extend hips until torso is parallel to legs. Repeat.','upload/exercise-picture/BBHipExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1486,'Cable Straight-back Straight-leg Deadlift','Stand between two very low pulleys with shoulder width or narrower stance. Squat down and grasp stirrup attachments to each side. Stand upright with arms straight down to sides.','With knees and back straight, bow forward by bending hips until hamstrings are tight, or just before lower back bends. Raise body upright by extending hips until standing. Pull shoulders back slightly at top of lift if rounded. Repeat.','upload/exercise-picture/CBStraightBackStraightLegDeadlift.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1487,'Cable Lying Leg Curl','Attach two ankle cuffs to low pulley attachment. With cuffs on both ankles lie prone on flat bench with knees just beyond edge of bench. Grip under side or base of bench for support.','Raise ankles to glutes by flexing knees. Lower ankles until knees are straight. Repeat.','upload/exercise-picture/CBLyingLegCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1489,'Cable Bent-over Leg Curl','Attach ankle cuff to low pulley. With cuff on one ankle, grasp ballet bar with both hands and step far back with other foot. Elbows remain straight to support body leaning forward. Attached foot is stretched off floor.','Pull cable attachment back and up slightly by flexing knee. Raise knee slightly by flexing hip until knee is fully flexed. Return by straightening knee and lowering knee slightly to original position. Repeat. Continue with opposite leg.','upload/exercise-picture/CBBentOverLegCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1491,'Lever Kneeling Leg Curl (plate loaded)','Mount machine by placing supporting knee on horizontal pad and other leg under roller pad with knee against vertical pad. Grip handles and place forearm on padded arm rest.','Raise ankle to back of thigh by flexing knee. Lower ankle until knee is straight. Repeat. Continue with opposite leg.','upload/exercise-picture/LVKneelingLegCurlH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1492,'Cable Standing Leg Curl','Attach foot harness to low pulley. With foot harness on one ankle, grasp support bar with both hands and step back with other foot. Elbows remain straight to support body. Attached foot is slightly off floor.','Pull cable attachment back by flexing knee until knee is fully flexed. Return by straightening knee to original position and repeat. Continue with opposite leg.','upload/exercise-picture/CBStandingLegCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1493,'Dumbbell Straight-back Straight-leg Deadlift','Stand with shoulder width or narrower stance. Grasp dumbbells to each side.','With knees straight, lower dumbbells by bending hips until hamstrings are tight, or just before lower back bends. Lift dumbbells by extending hips until straight. Pull shoulders back slightly at top of lift if rounded. Repeat.','upload/exercise-picture/DBStraightBackStraightLegDeadlift.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1494,'Lever Lying Leg Curl (plate loaded)','Facing bench, stand between bench and lever pads. Lie prone on bench with knees just beyond edge of bench and lower legs under lever pads. Grasp handles.','Raise lever pad to back of thighs by flexing knees. Lower lever pads until knees are straight. Repeat.','upload/exercise-picture/LVLyingLegCurlH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1495,'Lever Alternating Lying Leg Curl (plate loaded)','Facing bench, stand between bench and lever pads. Lie prone on bench with knees just beyond edge of bench and lower legs under lever pads. Grasp handles.','Raise one lever pad to back of thigh by flexing knee. Lower lever pad until knee is straight. Raise and lower other leg pad. Continue by alternating legs.','upload/exercise-picture/LVAlternatingLyingLegCurlH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1496,'Lever Bent-over Leg Curl','Stand in machine with lower pads behind lower legs, upper pads in front of thighs, and lever fulcrum between knees. Bend over, placing forearms on pads, and grasp handles. Stand with body weight shifted on foot of resting leg and raise foot of exercising leg slightly off of floor or platform.','Raise lever up by bending knee as high as possible. Return lever until knee is straight. Repeat. Continue with opposite leg.','upload/exercise-picture/LVBentOverLegCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1497,'Lever Lying Leg Curl (on reverse hyper-extension machine, plate loaded)','Place lower legs between pads with feet on bar. Lay torso and waist on bench and grasp handles.','Raise lever back and up by flexing knees. Lower lever until knees are straight. Repeat.','upload/exercise-picture/LVLyingLegCurlRevHyperMachPL.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1499,'Lever Straight-back Straight-leg Deadlift (plate loaded)','Stand between lever handles with shoulder width or narrower stance. Squat down and grasp handles to each side. Stand upright with arms straight down to sides.','With knees and back straight, bow forward by bending hips until hamstrings are tight, or just before lower back bends. Raise body upright by extending hips until standing. Pull shoulders back slightly at top of lift if rounded. Repeat.','upload/exercise-picture/LVStraightBackStraightLegDeadlift.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1500,'Lever Seated Leg Curl (plate loaded)','Sit on apparatus with back against padded back support. Push hand lever to lower leg pads. Place legs in between pads. Release hand lever gradually. Grasp handles to sides with each hand.','Pull lever to back of thighs by flexing knees. Return lever until knees are straight. Repeat.','upload/exercise-picture/LVSeatedLegCurlH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1501,'Lever Single Leg Seated Leg Curl (plate loaded)','Sit on seat with back against padded back support. Push hand lever to lower leg pads. Place one leg in between pads. Place other leg on top of upper most pad bar. Release hand lever gradually. Grasp handles to sides with each hand.','Pull padded lever to back of thighs as far as possible by flexing knee. Return padded lever until knee is straight. Change legs and repeat for opposite leg.','upload/exercise-picture/LVSingleLegSeatedLegCurlH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1502,'Lever Alternating Bent-over Leg Curl','Stand in machine with lower pads behind lower legs, upper pads in front of thighs, and lever fulcrum between knees. Bend over, placing forearms on pads, and grasp handles.','Raise left foot slightly off of floor or platform. Raise lever up with left leg, bending knee as high as possible. Return lever until knee is straight. Shift body weight to left foot and raise right foot slightly off of floor or platform. Raise lever up with right leg, bending knee as high as possible. Continue alternating movement between legs.','upload/exercise-picture/LVAlternatingBentoverLegCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1503,'Lever Kneeling Leg Curl','Mount machine by placing supporting knee on horizontal pad and other leg under roller pad with knee against vertical pad. Grip handles and place forearm on padded arm rest.','Raise ankle to back of thigh by flexing knee. Lower ankle until knee is straight. Repeat. Continue with opposite leg.','upload/exercise-picture/LVKneelingLegCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1504,'Lever Lying Leg Curl','Facing bench, stand between bench and lever pads. Lie prone on bench with knees just beyond edge of bench and lower legs under lever pads. Grasp handles.','Raise lever pad to back of thighs by flexing knees. Lower lever pads until knees are straight. Repeat.','upload/exercise-picture/LVLyingLegCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1505,'Lever Alternating Lying Leg Curl','Facing bench, stand between bench and lever pads. Lie prone on bench with knees just beyond edge of bench and lower legs under lever pads. Grasp handles.','Raise lever pad to back of thighs by flexing one knee. Lower lever pads until knee is straight and repeat with opposite leg. Continue to alternate between sides.','upload/exercise-picture/LVAlternatingLegCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1506,'Lever Alternating Standing Leg Curl','Stand in machine with lower pads behind lower legs, upper pads in front of thighs, and lever fulcrum between knees. Bend over and grasp handles for support if available.','Raise left foot slightly off of floor or platform. Raise lever up with left leg, bending knee as high as possible. Return lever until knee is straight. Shift body weight to left foot and raise right foot slightly off of floor or platform. Raise lever up with right leg, bending knee as high as possible. Continue alternating movement between legs.','upload/exercise-picture/LVAlternatingStandingLegCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1507,'Lever Standing Leg Curl (on leg extension)','Place platform to one side of padded lever. Have additional padded board in hand. Facing machine, stand to one side of padded roller. Place far leg on elevated platform. Position closest leg into apparatus by placing back of lower leg against lever roller. Place extra padded board between knee and edge of seat. Position knee forward securely against padded board and edge of seat. Bend over seat by bending hips and support torso with arms.','Pull lever to back of thigh by flexing knee. Return lever until knee is straight. Repeat. Continue with opposite leg.','upload/exercise-picture/LVStandingLegCurlonExt.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1508,'Lever Standing Leg Curl (on multi-hip machine)','Adjust platform to highest position or lever fulcrum to lowest position so fulcrum is at height of knee. If necessary, place extra elevation near end of platform to stand on, so knee is aligned with fulcrum. Adjust padded roller approximately 45° downward. Step on extra elevation facing padded roller. Place leg closest to lever over roller. Bend over at hips and grasp bar. Slightly extend hip to lower roller so knee maintains alignment with fulcrum.','Pull padded roller to glutes by flexing knee. Lower padded roller until knee is straight. Repeat. Reposition roller pad lever and continue with opposite leg.','upload/exercise-picture/LVStandingLegCurlHipMach.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1509,'Lever Seated Leg Curl','Sit on apparatus with back against padded back support. Place back of lower leg on top of padded lever. Secure lap pad against thigh just above knees. Grasp handles on lap support.','Pull lever to back of thighs by flexing knees. Return lever until knees are straight. Repeat.','upload/exercise-picture/LVSeatedLegCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1510,'Lever Standing Leg Curl','Stand in machine with one or both legs between pads depending upon machine\'s design. Position exercising leg with lever pad behind lower leg and upper pad in front of lower thigh. Bend over and grasp handles for support if available. Stand with body weight shifted on foot of resting leg and raise foot of exercising leg slightly off of floor or platform.','Pull lever up to back of thigh by flexing knee. Return lever until knee is straight. Repeat. Continue with opposite leg.','upload/exercise-picture/LVStandingLegCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1511,'Smith Straight-back Straight-leg Deadlift','Stand with shoulder width or narrower stance with thigh against bar. Grasp bar with shoulder width or slightly wider overhand grip. Disengage bar by rotating bar back.','With knees and back straight, lower bar by bending hips until hamstrings are tight, or just before lower back bends. Lift bar by extending hips until straight. Pull shoulders back slightly if rounded. Repeat.','upload/exercise-picture/SMStrtBackStrtLegDeadlift.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1512,'Smith Good-morning','Position bar on back of shoulders. Grasp bar to sides. Disengage bar by rotating bar back.','Bend hips to lower torso forward until parallel to floor. Raise torso until hips are extended. Repeat.','upload/exercise-picture/SMGoodmorning.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1514,'Lever Straight-leg Lying Hip Extension','Lie on bench and place back of lower legs against leg pad. Position hips in line with fulcrum. Grasp bottom sides of bench to keep body from moving under resistance.','With knees straight, extend lever downward until hips are extended. Return lever to upright position without allowing back of hips to raise up off of bench. Repeat.','upload/exercise-picture/LVStraightLegLyingHipExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1516,'Weighted 45° Back Raise (on hyperextension apparatus)','Position thighs prone on padding of 45-degree hyper-extension apparatus. Hook heels on platform lip or under padded brace. Hold weight to chest or behind neck.','Lower body by bending hips until fully flexed. Raise or extend hips until torso is parallel to legs. Repeat.','upload/exercise-picture/WTHipExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1518,'Weighted Back Raise (on hyperextension apparatus)','Stand in hyper-extension apparatus. Position thighs prone on large pad and lower leg under padded bar. Hold weight to chest or behind neck.','Lower body by bending hips until fully flexed. Raise or extend hips until torso is parallel to legs. Repeat.','upload/exercise-picture/WTHipExtension2.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1519,'Weighted Inverse Leg Curl','Adjust padded supports and kneel upright in apparatus. Position knees against large roller pad or near-upper side of padded hump, ankles between padded supports, and feet on platform. Hold weight to chest or behind neck.','Lower body until horizontal by straightening knees. Raise body by flexing knees, only allowing hips to bend slightly. Repeat.','upload/exercise-picture/WTHamRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1520,'Single Leg Hanging Hamstring Bridge','Stand behind bar facing elevated platform positioned slightly away on other side of bar. Grasp bar with slightly wider than shoulder width grip. Walk body under bar. Position back of heel on elevated platform. Place other foot on or just over floor so leg is bent. Hang under bar with arms straight and hips bent just above floor.','Raise hips up as high as possible by extending hip and spine. Maintain bent position of lower leg allowing it to rise with hips. Lower hips along with bent lower leg to original position and repeat. Continue with legs in opposite position.','upload/exercise-picture/BWSingleLegHangingHamstringBridge.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1521,'Hanging Hamstring Bridge','Stand behind bar facing elevated platform positioned slightly away on other side of bar. Grasp bar with slightly wider than shoulder width grip. Walk body under bar and position back of heels on elevated platform. With legs extended forward, hang under bar with arms straight and hips bent just above floor.','Raise hips up as high as possible by extending hips. Lower hips to original position just above floor. Repeat.','upload/exercise-picture/BWHangingHamstringBridge.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1522,'Hanging Straight Hip Leg Curl','Lay supine under fixed horizontal bar. Grasp bar with wide overhand grip. Straighten and raise body off of floor keeping heels on floor.','Pull body toward feet by bending knees while keeping hips straight. Roll onto feet until knees are fully flexed. Return body to original position by extending knees. Repeat.','upload/exercise-picture/BWHangingStraightHipLegCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1523,'Leg Curl (on stability ball)','Lie supine on floor with lower legs on exercise ball. Extended arms out to sides. Straighten low back, knees, and hips, raising back and hips off of floor.','Keeping hips and low back straight, bend knees, pulling heels toward rear end. Allow feet to rollup on to ball. Lower to original position by straightening knees. Repeat.','upload/exercise-picture/BWBallLegCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1524,'Leg Curl (on power wheel)','Lie supine on floor with feet strapped onto power wheel. Extended arms out to sides. Straighten knees and hips.','Keeping hips and low back straight, bend knees, pulling heels toward rear end. Raise up until lower legs are vertical. Lower to original position by straightening knees. Repeat.','upload/exercise-picture/BWWheelLegCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1525,'Inverse Leg Curl','Adjust padded supports and kneel upright in apparatus. Position knees on near-upper side of padded hump, ankles between padded supports, and feet on platform. Place arms behind back, across chest, or bent beside head depending on desired intensity.','Lower body until horizontal by straightening knees. Raise body by flexing knees only allowing hips to bend slightly. Repeat.','upload/exercise-picture/BWHamRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1526,'Hanging Leg Curl','Lay supine under fixed horizontal bar. Grasp bar with wide overhand grip. Straighten and raise body off of floor keeping heels on floor.','Pull body toward feet by bending knees and hips. Roll onto feet until knees are fully flexed. Return body to original position by extending knees and hips. Repeat.','upload/exercise-picture/BWHangingLegCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1527,'Self-assisted Inverse Leg Curl (on floor)','Kneel on floor. Position ankles under fixed bar or pad and knees on thick dense pad. Kneel upright with hips straight. Extend arms out to sides with elbow pointing back and slightly bent. Position hands slightly forward with palms facing forward or slightly toward floor.','Lower body with hips straight by slowly straightening knees. Control descent only with hamstrings as low as possible. Only when body begins to fall, touch down with tensed finger tips out to each side. Once fingers make contact with floor, control remaining descent with assistance of arms. Allowing chest to come very close to floor, rapidly push off against floor, again just enough to assist hamstrings in raising body upward. Return to upright kneeling position and repeat.','upload/exercise-picture/AsHamstringRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1528,'Self-assisted Inverse Leg Curl','Place elevated platform in front of glute-hamstring apparatus. Adjust padded supports and kneel upright in apparatus. Position knees against large roller pad or near-upper side of padded hump (depending on model), ankles between padded supports, and feet on platform.','Lower body with hips straight by slowly straightening knees. Position hands forward, ready to push body weight back up off of surface. Control descent only with hamstrings as low as possible before catching body by quickly placing hands on elevated platform and rapidly pushing off against platform, just enough to assist hamstrings in raising body upward. Return to upright kneeling position and repeat.','upload/exercise-picture/ASHamstringRaiseSelf.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1530,'Suspended Hanging Leg Curl','Lay supine under suspension trainer and grasp handles. Straighten and raise body off of floor keeping heels on floor.','Pull body toward feet by bending knees and hips. Roll onto feet until knees are fully flexed. Return body to original position by extending knees and hips. Repeat.','upload/exercise-picture/STHangingLegCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1531,'Suspended Hanging Straight Hip Leg Curl','Lay supine under suspension trainer and grasp handles. Straighten and raise body off of floor keeping heels on floor.','Pull body toward feet by bending knees while keeping hips and back straight. Roll onto feet until knees are fully flexed. Return body to original position by extending knees maintaining straight hip position. Repeat.','upload/exercise-picture/STHangingStraightHipLegCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1532,'Suspended Straight Hip Leg Curl','Sit on floor facing suspension trainer loops in low position. Grasp bottom of loops, then lay supine. Raise legs and place heels in loops with soles contacting handles. Extend legs out and place arms on floor off to sides. Straighten low back, knees, and hips, raising back and hips off of floor.','Bend knees, pulling heels toward rear end while keeping hips and low back straight. Raise up until lower legs are vertical or fully flexed. Lower body to original position by straightening knees, maintaining straight hip position. Repeat.','upload/exercise-picture/STLegCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1533,'Lying Hamstring Stretch','Lie on back and lift knee up. Grasp behind thigh near knee with both hands. Pull knee close to chest.','Extend knee while maintaining knee close to chest. Hold stretch. Repeat with opposite leg.','upload/exercise-picture/d343918f30680d3ba702ed5afa8e8f06.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1534,'Lever Lying Hamstring Stretch','Lie on bench with leg on padded lever and foot against horizontal bar.','Pull release lever. Keeping knee straight, pull rail so leg rises upward until mild stretch is felt. Hold stretch. Repeat with opposite leg.','upload/exercise-picture/f2666aa2a800fc2fe6dc36dee892faf1.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1535,'PNF Lying Hamstring Stretch','Instruct participant to lie on floor or mat. Kneel beside participant and extend participant\'s leg upward. Position back of participant\'s lower leg on nearest shoulder. Position near ankle on participant\'s opposite lower leg.','Push participant\'s leg close to participants chest. Place hands on floor with arms extended to control resistance. Repeat with opposite leg.','upload/exercise-picture/ad3b598f490e6b8b995cb1340055bfb4.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1536,'Suspended Hamstring Runner','Sit on floor facing suspension trainer loops in low position. Grasp bottom of loops, then lay supine. Raise legs and place heels in loops with soles contacting handles. Extend one leg out straight, keep other leg bent so knee is pointing up. Place arms on floor off to sides. Lift low back and hips off of floor so one leg is straight with back and other leg bent, so foot of bent leg is close to knee of straight leg.','Simultaneously alternate leg positions by straightening bent leg while bending straight knee. Repeat.','upload/exercise-picture/STHamstringRunner2.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1537,'Suspended Leg Curl','Sit on floor facing suspension trainer loops in low position. Grasp bottom of loops, then lay supine. Raise legs and place heels in loops with soles contacting handles. Extend legs out and place arms on floor off to sides. Straighten low back, knees, and hips, raising back and hips off of floor.','Pull heels toward rear end by bending knees and hips simultaneously. Lower body to original position by straightening knees and hips. Repeat.','upload/exercise-picture/STHamstringCurl.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1538,'Lever Seated Hamstring Stretch','Sit on seat in forward position with lower leg on shin pad, feet on foot rest. Place hands through wrist straps. Hold lower bar with overhand grip.','Push and lower seat back. Hold stretch. Repeat with opposite leg.','upload/exercise-picture/PCHamstring8.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1539,'Seated Hamstring Stretch','Sit on floor or mat with knees straight.','Reach toward or beyond toes or bring torso toward legs. Hold stretch.','upload/exercise-picture/a422b3586f6873533c458303bf5eb3e4.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1540,'Seated Hamstring Stretch (Chair)','Sit on edge of chair or exercise ball. Position heels on floor with knees straight.','Reach toward toes or bring torso toward legs. Hold stretch.','upload/exercise-picture/57dc517f31121e83c57b6105b4a2ed96.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1541,'Seated Single Leg Hamstring Stretch','Sit on floor or mat with legs apart and knees straight.','Reach toward one foot or bring torso toward one leg. Hold stretch for 20 seconds. Repeat with opposite leg.','upload/exercise-picture/5b56995e644b0d712ba1b67b2f8db277.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1542,'Lying Hamstring Stretch (towel)','Sit on mat or floor with knees bent. Position towel under middle of foot with hands grasping towel on both ends. Lie back and raise leg straight above maintaining grip on towel with both hands.','Pull leg back while keeping knee straight. Hold stretch. Repeat with opposite leg.','upload/exercise-picture/7dc8003e4a2f4d121769db944044da4e.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1543,'PNF Seated Hamstring Stretch','Instruct participant to sit with knees straight on floor or mat. Kneel behind participant and position chest on participant\'s back. Place hands just above knees from each side.','Push participant\'s torso toward legs with chest while holding down knees. Hold stretch.','upload/exercise-picture/98bd050fcb0ea0c6998fb6de92b4d2e2.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1544,'Lying Vertical Hamstring Stretch','Lie on floor with one leg extending up onto side of wall or column and other leg bent with foot on floor. One way this can be position can be achieved in a single motion is by sitting on floor with back of one shoulder against end of wall or column. Rotate body 90° onto back while swinging one leg up onto side of wall or column, ending up with back on floor and head positioned away from wall.','Straighten elevated knee until slight stretch is felt in back of thigh. If no stretch is felt, slowly straighten bent leg until slight stretch is felt in back of thigh. Hold stretch. Repeat with opposite leg on opposite side of wall or column.','upload/exercise-picture/LyingVerticalHamstringStretch.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1545,'Standing Hamstring Stretch','Stand and bend over with knees straight.','Reach toward toes or floor or bring torso toward legs. Hold stretch.','upload/exercise-picture/91a7ef2697a2704d3c1a7d86d33aa879.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1546,'Seated Single Leg Hamstring Stretch (Bench)','Sit on bench. Place one leg on bench with knee straight.','Reach toward foot or bring torso toward leg on bench. Hold stretch. Repeat with opposite leg.','upload/exercise-picture/a2bc88ca82564c16bdc1bc7f5d1c5ec0.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1547,'Seated Single Leg Hamstring Stretch (Chair)','Sit on edge of chair or exercise ball. Position heel on floor with knee straight.','Reach toward toe or bring torso toward leg. Hold stretch. Repeat with opposite leg.','upload/exercise-picture/ec248e61d0b6bbd886eeecbf4ef669b5.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1548,'Standing Cross Leg Hamstring Stretch','Stand erect with legs crossed, outsides of feet together. Bend over with rear knee straight.','Reach toward feet or bring torso toward legs. Hold stretch. Repeat with opposite leg.','upload/exercise-picture/983c5c33d55888967b68cf2cb93db26c.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1549,'Standing Single Leg Hamstring Stretch','Sand with on foot forward and rear foot pointing out. Bend over and brace torso by placing hand just above bent rear knee.','Lean down and bend rear knee further. Hold stretch. Repeat with opposite leg.','upload/exercise-picture/2165e6dfac69ea56cf98ac8a23b1ccd7.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1550,'Standing Single Leg Hamstring Stretch (Bench)','Place foot on bench or elevation.','Reach toward foot on bench or bring torso toward leg. Hold stretch. Repeat with opposite leg.','upload/exercise-picture/f3a004d8d78c90f707422c91c7fefcf9.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1551,'Soldier Kick','Stand and step forward with left foot.','Next step, extend left arm forward while swinging right leg up so foot touches or comes close to hand. Lower right leg. Repeat with same sequence on opposite side. Continue by alternating between each side until specific distance is covered or desired number of repetitions have been completed.','upload/exercise-picture/SoldierKick.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1552,'Soldier Kick (intermittent)','Stand and step forward with left foot.','Next step, extend left arm forward while swinging right leg up so foot touches or comes close to hand. Lower right leg, then take two steps, with left and right legs. Repeat with same sequence on opposite side. Continue by alternating between each side followed by double steps until specific distance is covered or desired number of repetitions have been completed.','upload/exercise-picture/SoldierKickIntermittent.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1553,'Lever Standing Hip Adduction','Adjust platform so lever fulcrum is same height as hip articulation. Adjust roller pad to side position. Face machine and grasp bars to sides. Place inside of thigh on roller pad and remain standing on supporting leg.','Move leg toward and across supporting leg Return and repeat. Reposition roller pad lever and continue with opposite leg.','upload/exercise-picture/LVStandingHipAdduction.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1554,'Lever Seated Hip Adduction','Sit in machine with legs outside of vertical center pads. If available, place heels on foot bars. Disengage and pull lever brace to position legs apart until slight stretch is felt. Engage lever into locked position. Lie back and grasp bars to sides.','Move legs together. Return and repeat.','upload/exercise-picture/LVSeatedHipAdduction.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1556,'Cable Lying Hip Adduction','Stand or sit in front of low pulley and attach cable cuff to ankle. Step away from pulley toward opposite pull, pulling weight plates up just far enough get next to opposite cable pulley. Attach other cable cuff to opposite ankle. Sit so hips are between both low pulley cables to each side. Lie down on back and lift legs up vertically.','Lower legs apart out to each side until stretch is felt in inner thigh. Raise legs together. Return and repeat.','upload/exercise-picture/CBLyingHipAdduction.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1557,'Lever Lying Hip Adduction','Sit in machine with legs outside of vertical center pads. If available, place heels on foot bars. Lie back on back pad. Disengage and pull lever brace to position legs apart until slight stretch is felt. Engage lever into locked position. Lie back and grasp bars to sides.','Move legs together. Return and repeat.','upload/exercise-picture/LVLyingAdduction.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1558,'Weighted Lying Hip Adduction','Sit on floor or mat with bar, weight plates loaded on one side. Sit on hip with knees bent and place bar on inside of shoe with weight plate beyond foot. Holding on to opposite end of bar, lie on side with weighted leg extended out straight and upper leg extended behind.','Raise weighted leg up off floor as high as possible while balanciong bar inside of foot and holding onto nearest side of bar. Return to floor and repeat. Repeat and continue with opposite leg.','upload/exercise-picture/WtLyingHipAdduction.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1559,'Lever Seated Hip Adduction (plate loaded)','Sit on seat and lift one leg onto padded lever. Lean back onto back pad. Grasp handles attatched to leg levers. Push handles together and raise other leg onto other padded lever. Release leg lever handles and grasp other handles to each side.','Move legs together until leg levers make contact. Allow legs to seperate far apart until slight stretch and repeat.','upload/exercise-picture/LVHipAdductionH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1560,'Cable Hip Adduction','Stand in front of low pulley facing to one side. Attach cable cuff to near ankle. Step out away from stack with wide stance and grasp ballet bar. Stand on far foot and allow near leg to be Pulled toward low pulley.','Move near leg just in front of far leg by abduction hip. Return and repeat. Turn around and continue with opposite leg.','upload/exercise-picture/CBHipAdduction.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1564,'Lying Groin Stretch','Lie on floor or mat. Place soles of feet together on floor close to body with knees far apart.','Lower knees toward floor. Hold stretch.','upload/exercise-picture/e9193c7fc71f76f33a62c8b12d86ffa6.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1565,'PNF Bent Leg Groin Stretch','Instruct participant to lie on floor or mat. Ask them to place soles of feet together on floor close to body with knees apart. Kneel close to participant and place hands on insides of participant\'s knees.','Spread participant\'s legs down to sides and hold stretch.','upload/exercise-picture/47cbe592bfdf56a5990239826ca76ad7.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1566,'Kneeling Side Lunge Stretch','Kneel on floor or mat. Place one foot pointing out and somewhat perpendicular to opposite kneeling leg.','Shift upright body toward supporting foot. Hold stretch. Repeat on opposite leg.','upload/exercise-picture/d183ca3634ed1a15ce4e86750dc12769.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1567,'Kneeling Groin Stretch','Kneel with feet pointed out to sides. Place forearms and hands on floor.','Spread knees apart and gently lower hips. Hold stretch for 20 seconds.','upload/exercise-picture/c048a0741ded61fa0dda2a92ef77b95c.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1569,'Lying Wall Groin Stretch','Sit on floor with hip and thigh against wall. Lift back of legs up against wall by pivoting on hips and lying on back. Place back of legs against wall.','Spread legs. Hold stretch.','upload/exercise-picture/495b5c75dd3cd406a20b460c59d9554b.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1570,'Seated Groin Stretch','Sit on floor or mat with soles of feet together on floor and close to body. Grasp feet with both hands and position elbows on inside of lower legs.','Press knees toward floor with elbows. Hold stretch.','upload/exercise-picture/2e5747087dc8bafff113bf6b80a668eb.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1571,'Lever Groin Stretch','Sit on seat in forward position. Place hands through wrist straps. Hold lower bar with overhand grip. Position soles of feet together on top edge of shin pad.','Push and lower seat back. Hold stretch.','upload/exercise-picture/PCGroin8.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1572,'Seated Groin Stretch (on apparatus)','Sit on platform facing adjustable handles. Spread legs apart and place inside of legs on outer surface of padded stumps. Straighten knees, grasp handles, and sit upright.','Straighten back and pull legs further apart by pulling on handles. Hold stretch.','upload/exercise-picture/a27b9cca96504dabff67b776873d74e1.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1573,'PNF Straight Leg Groin Stretch','Instruct participant to lie on floor or mat with legs positioned straight up, slightly apart. Grasp participant\'s ankle from inside.','Spread legs down to sides and hold stretch.','upload/exercise-picture/4a953ad380e1760b3e40028a0fdca304.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1574,'Squatting Groin Stretch','Stand with feet pointed approximately 45° outward. Squat down completely with knees pointed outward over toes. Place palms of hands on floor with inside of upper arm positioned against inner thigh.','Pull thighs apart with upper arms. Hold stretch.','upload/exercise-picture/34c9835255b7324f033509782d62fa19.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1575,'Side Lunge Stretch','Stand with feet far apart, toes pointed 45° outward.','Lunge toward one side. Allow foot of straight leg to point upward with heel on floor. Hold stretch. Repeat on opposite leg.','upload/exercise-picture/517f3409f5a115f38d544800a5a1ffad.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1576,'Standing Groin Stretch','Stand next to upper thigh height surface off to side. Hold onto elevated surface or other stable structure for balance and place inner side of nearest bent lower leg on elevated surface.','Lower body slightly by bending knee of base leg until stretch if felt. Repeat on opposite leg.','upload/exercise-picture/e6c0cc8d037dc5ec14ae367e397bf998.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1577,'Seated Groin Stretch (chair or bench)','Sit on end of chair or bench. Place legs as far apart as possible with knees bent approximately 90 degrees and feet flat on floor pointing same direction as knees. Lean over and position upper forearms inside lower thighs near knees.','Lean forward more while pushing thighs apart. Hold stretch.','upload/exercise-picture/079df26ca2d76ff727a699a7a908aeb7.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1578,'Lever Seated Groin Stretch','Sit on apparatus with each leg on adjacent platforms.','Separate legs apart by turning knob. Lean forward slightly and grasp forward bar if available. Hold stretch.','upload/exercise-picture/62c0cef1a94cf836a047d8c587d39a21.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1579,'Seated Adductor Magnus Stretch','Sit on floor or mat with feet far apart and knees bent approximately 90 degrees. Reach forward grasp bottom of feet.','Pull torso forward and hold stretch.','upload/exercise-picture/079df26ca2d76ff727a699a7a908aeb7.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1580,'Kneeling Adductor Magnus Stretch','Kneel with one foot on floor or mat. Position torso to inside of upper thigh with hands on floor.','Lower torso downward. Hold stretch.','upload/exercise-picture/2fb387607233825c08f29be65f8612b2.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1581,'Seated Adductor Magnus Stretch (chair or bench)','Straddle and sit on chair or bench with feet far apart and feet on floor.','Lean forward placing finger tips or hands on floor if possible. Allow torso to be lowered downward and hold stretch.','upload/exercise-picture/95f43547ca7605ef764baea16ba1b9cc.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1582,'Bent-over Adductor Magnus Stretch','Stand with one foot on chair or bench. Bend over.','Reach toward floor. Hold stretch.','upload/exercise-picture/81c5dc1f1d715c1f451f378fe03b9427.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1583,'Lying Adductor Magnus Stretch','Lie supine on floor or mat. Raise knees and grasp back of thighs behind knees.','Pull knee toward shoulders or to side of torso while keeping opposite leg on floor. Hold stretch.','upload/exercise-picture/606b95ba87532c1a4ce991be5c7a6f0a.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1584,'Seated Single Leg Adductor Magnus Stretch','Sit on floor or mat and place outside of flexed leg on floor. Over that leg, position opposite leg with foot flat on floor and back of heel against shin.','Bent torso forward. Hold stretch.','upload/exercise-picture/3e224ee57a9ee6e20edcd66d60ab1f14.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1585,'Safety Barbell Standing Leg Calf Raise','Stand facing safety barbell on rack upper chest height and calf block on floor just below. Position toes and balls of feet on calf block with arches and heels extending off. Place hands on bar to each sides or on vertical rack bars. Position head in yoke with padded bar around shoulders. Dismount bar from rack by standing erect with safety bar, away yet close to rack.','Raise heels by extending ankles as high as possible. Lower heels by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/SFStandingCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1586,'Barbell Standing Leg Calf Raise','Set barbell on power rack upper chest height with calf block under barbell. Position back of shoulders under barbell with both hands to sides. Position toes and balls of feet on calf block with arches and heels extending off. Lean barbell against rack and raise from supports by extending knees and hips. Support barbell against verticals with both hands to sides.','Raise heels by extending ankles as high as possible. Lower heels by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/BBStandingCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1587,'Cable Standing Calf Raise','Place cable belt or dip belt around waist. Kneel before low pulley and attach belt to cable. Stand on calf block and grasp support bar for balance. Position toes and balls of feet on calf block with arches and heels extending off.','Raise heels by extending ankles as high as possible. Lower heels by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/CBStandingCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1588,'Cable One Arm Single Leg Calf Raise','Stand facing low pulley with platform on floor. Bend over and grasp stirrup attachment with one hand. Stand on edge of platform and grasp support bar for balance. Position toes and balls of feet on platform with arches and heels extending off. Lift one leg up off of floor.','Raise heel by extending ankle as high as possible. Lower heel by bending ankle until calf is stretched. Repeat.','upload/exercise-picture/CBSingleLegCalfRaiseStirrup.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1589,'Cable Single Leg Calf Raise','Kneel before low pulley and attach cable belt or dip belt to cable. Stand on edge of platform and grasp support bar for balance. Position toes and balls of feet on platform with arches and heels extending off. Lift one leg up off of floor.','Raise heel by extending ankle as high as possible. Lower heel by bending ankle until calf is stretched. Repeat.','upload/exercise-picture/CBSingleLegCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1590,'Dumbbell Single Leg Calf Raise','Grasp dumbbell in one hand to side. Position toes and balls of feet on calf block with arches and heels extending off. Place hand on support for balance. Lift other leg to rear by bending knee.','Raise heel by extending ankle as high as possible. Lower heel by bending ankle until calf is stretched. Repeat. Continue with opposite leg.','upload/exercise-picture/DBSingleLegCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1591,'Dumbbell Standing Calf Raise','Grasp dumbbell in one hand to side. Position toes and balls of feet on calf block with arches and heels extending off. Place hand on support for balance.','Raise heels by extending ankles as high as possible. Lower heels by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/DBCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1592,'Lever 45° Calf Press (plate loaded)','Sit on seat with back on padded support. Place feet on platform. Grasp handles to sides and extend hips and knees. Place toes and balls of feet on lower portion of platform with heels and arches extending off.','Push platform by extending ankles as far as possible. Return by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/LV45DegCalfPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1593,'Lever Calf Extension (plate loaded)','Sit on seat and position forefeet on lever platform. Grasp handles to sides and straighten knees.','Push lever by extending ankle as far as possible. Return by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/LVSeatedCalfExtensionH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1594,'Lever Donkey Calf Raise (plate loaded)','Position lower back and hips under padded lever. Place forearms on supports. Position toes and balls of feet on calf block with arches and heels extending off. Straighten knees.','Raise heels by extending ankles as high as possible. Lower heels by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/LVDonkeyCalfRaisePL.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1595,'Lever 45° Calf Raise (plate loaded)','Sit on machine with low back against padding and grasp handles to sides. Place feet high on platform and straighten knees. Position toes and balls of feet on lower portion of platform with arches and heels extending off.','Raise heels by extending ankles as high as possible. Lower heels by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/LVCalfRaiseHackPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1596,'Lever Calf Raise (on v-squat machine, plate loaded)','Position shoulders under shoulder pads with back against back pad. Place feet on platform shoulder width apart. Extend hips and knees. Position toes and balls of feet on nearest edge of platform with arches and heels extending off.','Raise heels by extending ankles as high as possible. Lower heels by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/LVVCalfRaisePL.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1597,'Lever Seated Calf Press (plate loaded)','Place seat away from platform. Sit on seat with lower back against back of seat. Place toes and balls of feet on lower portion of platform(s) with heels and arches extending off. Grasp handles to sides and straighten knees.','Push lever platform(s) by extending ankles as far as possible. Return by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/LVSeatedCalfPressH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1598,'Lever Calf Extension','Sit on seat and position forefeet on horizontal foot bar. Grasp handles to sides and straighten knees.','Push lever by extending ankles as far as possible. Return by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/LVSeatedCalfExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1599,'Lever Standing Calf Raise (plate loaded)','Place shoulders under padded lever. Position toes and balls of feet on calf block with arches and heels extending off. Grasp handles or sides of padded lever. Stand erect by extending hips and knees.','Raise heels by extending ankles as high as possible. Lower heels by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/LVStandingCalfRaisePL.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1600,'Lever 45° Calf Raise','Sit on machine with low back against padding and grasp handles to sides. Position toes and balls of feet on lower portion of platform or foot bar with arches and heels extending off. Straighten knees.','Raise heels by extending ankles as high as possible. Lower heels by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/LV45DegreeCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1601,'Lever Donkey Calf Raise','Position lower back and hips under padded lever. Place forearms on supports. Position toes and balls of feet on calf block with arches and heels extending off. Straighten knees.','Raise heels by extending ankles as high as possible. Lower heels by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/LVDonkeyCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1602,'Lever Alternating Calf Extension','Sit on seat and position forefeet on pedals. Grasp handles to sides and straighten knees.','Push left pedal by extending ankle as far as possible while allowing right pedal to return back until calf is stretched. Reverse motion by pushing right pedal and allowing left pedal to return back. Continue to alternate motion.','upload/exercise-picture/LVAlterSeatedCalfExtStrLeg.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1603,'Lever Seated Calf Press','Place seat away from platform. Sit on seat with lower back against back of seat. Place toes and balls of feet on lower portion of platform with heels and arches extending off. Grasp handles to sides and straighten knees.','Push lever by extending ankles as far as possible. Return by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/LVSeatedCalfPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1604,'Lever Calf Extension (bilateral)','Sit on seat and position forefeet on lever platform or foot pedals. Grasp handles to sides and straighten knees.','Push lever by extending ankles as far as possible. Return by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/LVSeatedCalfExtensionBentKnees.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1605,'Lever Standing Calf Raise','Place shoulders under padded lever. Position toes and balls of feet on calf block with arches and heels extending off. Grasp handles or sides of padded lever. Stand erect by extending hips and knees.','Raise heels by extending ankles as high as possible. Lower heels by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/LVStandingCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1606,'Lever Standing Calf Raise (belt loaded)','Place lever belt or dip belt around waist. Kneel before lever and attach belt. Stand on calf block and grasp support bar for balance. Position toes and balls of feet on calf block with arches and heels extending off.','Raise heels by extending ankles as high as possible. Lower heels by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/LVStandingCalfRaiseBelt.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1607,'Sled 45° Alternating Calf Press','Sit on seat with back on padded support. Grasp handles to sides. Place toes and balls of feet on lower portion of platform with heels and arches extending off.','Push sled by extending ankles as far as possible. Return by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/SL45DegAlternCalfPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1608,'Sled 45° Calf Raise','Sit on machine with lower back against padding and grasp handles to sides. Position toes and balls of feet on foot platform with arches and heels extending off. Straighten knees.','Raise heels by extending ankles as high as possible. Lower heels by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/SL45DegreeCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1609,'Sled 45° Calf Raise (plate loaded)','Sit on machine with lower back against padding and grasp handles to sides. Position toes and balls of feet on foot of platform with arches and heels extending off. Straighten knees.','Raise heels by extending ankles as high as possible. Lower heels by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/SL45DegCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1610,'Lever Forward Angled Calf Raise','Place shoulders under padded lever. Position toes and balls of feet on top of calf block with arches and heels extending off. Grasp handles or sides of padded lever. Stand erect by extending hips and knees.','Raise heels by extending ankles as high as possible. Lower heels by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/LVForwardAngledCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1611,'Sled Donkey Calf Raise','Position lower back and hips under upper pad. Place forearms on supports. Position toes and balls of feet on calf block with arches and heels extending off. Straighten knees.','Raise heels by extending ankles as high as possible. Lower heels by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/SLDonkeyCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1612,'Sled Hack Calf Press','Lie supine on sled with shoulders against pad and place feet on platform. Grasp handles to sides and straighten knees. Place toes and balls of feet on lower portion of platform with heels and arches extending off.','Push sled up away from platform by extending ankles as far as possible. Return by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/HackCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1613,'Sled Lying Calf Press','Position sled away from platform. Lie supine on sled with shoulders against pad and place feet on platform. Grasp handles to sides and straighten knees. Place toes and balls of feet on lower portion of platform with heels and arches extending off.','Push sled away from platform by extending ankles as far as possible. Return by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/SLLyingCalfPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1614,'Sled Lying Calf Press (plate loaded)','Position sled away from platform. Lie supine on sled with shoulders against pad and place feet on platform. Grasp handles to sides and straighten knees. Place toes and balls of feet on lower portion of platform with heels and arches extending off.','Push sled away from platform by extending ankles as far as possible. Return by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/SLLyingCalfPressPL.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1615,'Sled 45° Calf Press','Sit on seat with back on padded support. Place feet on platform. Grasp handles to sides and extend hips and knees. Place toes and balls of feet on lower portion of platform with heels and arches extending off.','Push sled by extending ankles as far as possible. Return by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/SL45DegCalfPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1616,'Sled Seated Calf Press','Place seat away from platform. Sit on seat and place feet on platform. Grasp handles to sides and extend hips and knees. Place toes and balls of feet on lower portion of platform with heels and arches extending off.','Push sled by extending ankles as far as possible. Return by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/SLSeatedCalfPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1617,'Sled Vertical Calf Press','Lie on back pad. Place feet on platform. Grasp handles to sides and extend hips and knees. Place toes and balls of feet on platform with heels and arches extending off.','Push sled by extending ankles as far as possible. Return by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/SLVerticalCalfPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1618,'Smith Standing Leg Calf Raise','Position bar on upper chest height and place calf block under bar. Position back of shoulders under bar and grasp bar to sides. Position toes and balls of feet on calf block with arches and heels extending off. Disengage bar by rotating bar back. Stand erect by extending knees and hips.','Raise heels by extending ankles as high as possible. Lower heels by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/SMStandCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1619,'Smith Donkey Calf Raise','Engage both safety stops mid height so bar will be just above in lowest range of motion. Place calf block under bar. Position padded surface of tall bench or Roman Chair in front of smith machine for arm rest. Place stiffly padded board within arms reach. Step on calf block while standing between smith bar and arm rest. Situate padded board on back of hips while bending under smith bar. Arrange smith bar above upper hips or lower waist with padded board in between. Place forearms on supports. Lift bar off of safety stops by straighten knees. Position toes and balls of feet on calf block with arches and heels extending off.','Raise heels by extending ankles as high as possible. Lower heels by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/SMDonkeyCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1620,'Sled Standing Calf Raise','Place shoulders under padded bars. Position toes and balls of feet on calf block with arches and heels extending off. Grasp handles or sides of padded bars. Stand erect by extending hips and knees.','Raise heels by extending ankles as high as possible. Lower heels by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/SLStandingCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1621,'Weighted Single Leg Calf Raise','Hang weight from dip belt around waist. Position toes and ball of foot on calf block end of platform with heel and arch extending off. Place hand or hands on support for balance. Lift other leg to rear by bending knee.','Raise heel by extending ankle as high as possible. Lower heel by bending ankle until calf is stretched. Repeat. Continue with opposite leg.','upload/exercise-picture/WTSingleLegCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1622,'Sled Forward Angled Calf Raise','Lie forward so chest is on pad and shoulders are under padded bars. Position toes and balls of feet on calf block with arches and heels extending off. Grasp handles or sides of padded bars. Stand erect by extending hips and knees. Release lever if available.','Raise heels by extending ankles as high as possible. Lower heels by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/SLFrontCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1623,'Weighted Donkey Calf Raise','Stand on edge of platform, toes and balls of feet on calf block with arches and heels extending off. Bend over and grasp knee high bar (as shown) or place forearms on thigh high surface (see example). Allow training partner to mount hips or lower back from bench.','Raise heels by extending ankles as high as possible. Lower heels by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/WtDonkeyCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1624,'Standing Calf Raise','Position toes and balls of feet on calf block with arches and heels extending off. Place hand on support for balance.','Raise heels by extending ankles as high as possible. Lower heels by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/BWCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1625,'Single Leg Calf Raise','Position toes and balls of feet on calf block or elevation with heels and arches extending off. Place hand or hands on support for balance. Lift one leg to rear by bending knee.','Raise heel by extending ankle as high as possible. Lower heel by bending ankle until calf is stretched. Repeat. Continue with opposite leg.','upload/exercise-picture/BWSingleLegCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1626,'Pike Straight Leg Calf Stretch','There are number of ways to enter into this stretch:','There are number of ways to enter into this stretch:','upload/exercise-picture/2148f0312430e4335a53af5b850a45d7.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1627,'Floor Board Straight Leg Calf Stretch','Face wall with both knees slightly bent. Position fore foot on wall with heel on floor.','Straighten knees and lean body toward wall. Hold stretch . Repeat with opposite leg.','upload/exercise-picture/a0e542a3b6a5a73791a91a9581d07a03.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1628,'Self-assisted Leg Calf Raise','Position toes and balls of feet on calf block with heels and arches extending off. Place hands on support for assistance. Lift one leg to rear by bending knee.','Raise heel by extending ankle as high as possible, assisting with upper body as little as possible. Lower heel by bending ankle until calf is stretched. Repeat. Continue with opposite leg.','upload/exercise-picture/ASSingleLegCalfRaiseSelfPull.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1629,'Self-assisted Single Leg Calf Raise (with opposite leg)','Position toes and ball of foot on calf block with heels and arches extending off. Place hand or hands on support for balance. Raise one ankle by bending knee forward, keeping forefoot on platform.','Raise body upward as high as possible by extending lower ankle while straightening knee of assisting leg. Lower heel by bending ankle while bending knee of assisting leg forward. Repeat. Continue with opposite leg positioning.','upload/exercise-picture/ASSingleLegCalfRaiseSelfFoot.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1630,'Lunging Straight Leg Calf Stretch','Stand with one leg far forward and other leg extended back with knees straight. Both feet are positioned directly forward.','Lower body forward by bending forward knee only. Hold stretch. Repeat with opposite leg.','upload/exercise-picture/72e16e3fd573bcad77e28416da6e9be4.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1631,'Single Leg Forward Angled Calf Raise','Stand facing mid-thigh to hip high vertical bar. Grasp bar with wide overhand grip. Step back so body is angled forward with body straight and arms extended approximately perpendicular to body. Feet should be pointed forward. Lift one leg to rear by bending knee.','Raise heel by extending ankle as high as possible. Allow body to travel forward and upward in same direction as body is orientated. Lower heel allowing foot to come back down flat on floor. Repeat. Continue with opposite leg.','upload/exercise-picture/BWSingleLegForwardAngledCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1632,'Single Leg Pike Straight Leg Calf Stretch','Step forward with one front forward. Bend over and place hands on floor well in front of forward foot with arms straight.','Position rear foot flat on floor while keeping rear knee straight and hold stretch. Repeat with opposite leg position.','upload/exercise-picture/ad4308a843d634d40a8009930853b52c.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1633,'Wall Straight Leg Calf Stretch','Place both hands on wall with arms extended. Lean against wall with one leg bent forward and other leg extended back with knee straight and foot positioned directly forward.','Push rear heal to floor and move hips slightly forward. Hold stretch. Repeat with opposite leg.','upload/exercise-picture/4ce1dd65b26d1b568fad686821e5f401.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1634,'Step Straight Leg Calf Stretch','Position toes and balls of feet on stair step or calf block with arches and heels extending off. Use railing or wall for balance.','With knees straight, shift body weight to one foot. Hold stretch. Repeat with opposite leg.','upload/exercise-picture/c9a754ea29b499f34e3b68b97a279195.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1635,'Towel Straight Leg Calf Stretch','Sit of floor or mat and place towel or band under foot. With both ends of towel or band in each hand, straighten leg with towel under foot.','Pull towel and hold stretch. Repeat with opposite leg.','upload/exercise-picture/0ab540f8815536fe46c029b18f1aee83.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1636,'Lever Seated Calf Extension','With leg pads in upper position, sit on seat and place feet on lever platform with legs under pads. Lower leg pads on legs so they are snuggly adjusted just behind knees. Place hands on top of thigh pads.','Push lever platform down by extending ankles as far as possible. Return by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/LVSeatedCalfRaiseExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1637,'Safety Bar Seated Calf Raise','Place safety bar on rack approximately lower leg height with calf block slightly rear of safety bar. Sit on bench facing safety bar and place toes on lower portion of platform with heels extending off. Scoot forward to edge of bench and position lower thighs under safety bar. Grasp bar to sides and lift bar from rack by pushing heels up. Slide back to center of bench.','Lower heels by bending ankles until calves are stretched. Raise heels by extending ankles as high as possible. Repeat.','upload/exercise-picture/SBSeatedCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1638,'Lever Bent Knee Calf Extension','With seat close to lever platform or foot pedals, sit on seat. Position forefeet on lever platform or foot pedals. Grasp handles to sides. Push feet into lever platform or foot pedals to prevent knees from coming back during lift.','Push lever by extending ankles as far as possible. Return by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/LVBentKneeSeatedCalfExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1639,'Lunging Bent Knee Calf Stretch','Stand with one leg far forward and other leg extended back with knees straight. Both feet are positioned directly forward.','Squat down by flexing both knees just before rear heel raises off floor. Hold stretch. Repeat with opposite leg.','upload/exercise-picture/d2e7c4e33d630b74700bd7539f474b55.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1640,'Floor Board Bent Knee Calf Stretch','Face wall with both knees slightly bent. Position fore foot on wall with heel on floor.','Straighten knee of rear leg and lean body toward wall. Hold stretch. Repeat with opposite leg.','upload/exercise-picture/10fd5c6c923c1b4f5aa350ab1ae994ff.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1641,'Lever Alternating Bent-knee Seated Calf Extension','Sit on seat and position forefeet on pedals. Grasp handles to sides and extend knees but maintain small bend in knees.','Push left pedal by extending ankle knee Simultaneously allow right pedal to return back by relaxing ankle and bending knee more. Reverse motion by pushing right pedal and allowing left pedal to return back by same means. Continue to alternate motion.','upload/exercise-picture/LVAltBentKneeSeatedCalfExt.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1642,'Lever Seated Calf Raise (plate loaded)','Sit on seat facing lever. Place forefeet on platform with heels extending off. Position lower thighs under lever pads. Grasp handles if available or place hands on lever pad. Lift lever slightly by pushing heels up. Release support lever.','Lower heels by bending ankles until calves are stretched. Raise heels by extending ankles as high as possible. Repeat.','upload/exercise-picture/LVSeatedCalfRaiseH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1643,'Smith Seated Calf Raise','Position bar slightly higher than lower leg height. Wrap bar pad around center of bar. Place calf block under bar and bench near bar. Sit on bench facing bar and place toes on lower portion of platform with heels extending off. Grasp bar to sides and extend ankles to raise knees so lower thighs are under padded bar. Push heels further up. Disengage bar by rotating bar back.','Lower heels by bending ankles until calves are stretched. Raise heels by extending ankles as high as possible. Repeat.','upload/exercise-picture/SMSeatedCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1644,'Single Leg Pike Bent Leg Calf Stretch','Step forward with one front forward. Bend over and place hands on floor well in front of forward foot with arms straight. Bend rear leg and place rear foot flat on floor.','Straighten rear knee slightly or lean forward slightly. Hold stretch. Repeat with opposite leg position.','upload/exercise-picture/824cb4509c44d51beaef7d84c2bdd8dc.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1645,'Pike Bent Leg Calf Stretch','There are number of ways to enter into this stretch:','There are number of ways to enter into this stretch:','upload/exercise-picture/9ec26b4ff7c9ddfd683bc06970ad16e7.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1646,'Lever Seated Calf Raise','Sit on seat facing lever. Reach forward and pull hand lever toward body. Place forefeet on platform with heels extending off. Position lower thighs under lever pads. Release hand lever by pushing away from body. Place hands on top of thigh pads.','Raise heels by extending ankles as high as possible. Lower heels by bending ankles until calves are stretched. Repeat.','upload/exercise-picture/LVSeatedCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1647,'Wall Bent Knee Calf Stretch','Place both hands on wall with arms extended. Lean against wall with one leg bent forward and other leg extended back. Bend rear knee slightly, positioned foot directly forward, and place heal to floor.','Lower knee until just before heel raises. Hold stretch for 20 seconds. Repeat with opposite leg.','upload/exercise-picture/a76413823656f25915cf5e643ee9ee78.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1648,'Kneeling Calf Stretch','Kneel on lower leg. Place foot of opposite leg flat on floor.','Lean forward so knee travels beyond toes. Hold stretch . Repeat with opposite leg.','upload/exercise-picture/8102281e325bb7441e79e5f13d306c10.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1649,'Step Bent Knee Calf Stretch','Position toes and balls of feet on stair step or calf block with arches and heels extending off. Place support leg up to higher steps. Use railing or wall for balance. Bend rear knee.','Allow rear heel to lower below step. Hold stretch for 20 seconds. Repeat with opposite leg.','upload/exercise-picture/c779d0bfc0ebedf9c3a06e0392788c32.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1650,'Seated Bent Leg Calf Stretch','Sit of floor or mat. Place heel on floor or mat with bent knee upright. Grasp top of forefoot.','Pull forefoot toward shin. Repeat with opposite leg.','upload/exercise-picture/6735c80e66fbedcb5332915a053127b5.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1651,'Towel Bent Leg Calf Stretch','Sit of floor or mat. With both ends of towel or band in each hand, place towel or band under foot.','With knee bent, pull towel and hold stretch. Repeat with opposite leg.','upload/exercise-picture/9fccaf897f02ea7677d2fd16d72d5716.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1652,'Cable Single Leg Reverse Calf Raise','Place cable belt or dip belt around waist. Kneel before low pulley and attach it to cable. Stand and position heel on forward edge of platform. Raise other leg off block. Grasp support bar for balance.','Pull forefoot up toward body as far as possible. Return by extending feet until toes are pointed downward. Repeat.','upload/exercise-picture/CBSingleLegReverseCalfRaise1.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1653,'Barbell Reverse Calf Raise','Place barbell on power rack upper chest height and calf block under barbell. Position back of shoulders under barbell with both hands to sides. Position heels on forward edge of calf block. Lean barbell against rack and raise from supports by extending knees and hips. Support barbell against verticals with both hands to sides.','Pull forefoot of both feet up toward body as far as possible. Return by extending feet until toes are pointed downward. Repeat.','upload/exercise-picture/BBReverseCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1654,'Dumbbell Single Leg Reverse Calf Raise','Grasp dumbbell in one hand to side. Position one heel on forward edge of platform. Grasp support with other hand for balance. Lift other leg to rear by bending knee.','Pull forefoot up toward body as far as possible. Return by extending foot until toes are pointed downward. Repeat. Continue with opposite leg.','upload/exercise-picture/DBSingleLegReverseCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1655,'Lever Reverse Calf Extension (plate loaded)','Sit on seat and position heels on lever platform with fore feet extended off top. Grasp handles to sides and straighten knees.','Pull forefoot back toward body as far as possible while pushing platform with heels. Return feet down to platform and repeat.','upload/exercise-picture/LVSeatedReverseCalfExtensionH.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1656,'Lever 45° Reverse Calf Raise (plate loaded)','Sit on machine with lower back against padding. Grasp handles to sides and place feet on top portion of platform. Straighten knees and position heels on top edge of platform.','Pull forefoot of both feet up and back toward body as far as possible. Return by extending feet return to platform. Repeat.','upload/exercise-picture/LV45ReverseCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1657,'Safety Bar Reverse Calf Raise','Standing facing safety barbell on rack upper chest height and calf block on floor just below. Position heels on forward edge of calf block. Place hands on bar to each sides or on vertical rack bars. Position head in yoke with padded bar around shoulders. Dismount bar from rack by standing erect with safety bar, away yet close to rack.','Pull forefeet up toward body as far as possible. Return by extending feet until toes are pointed downward. Repeat.','upload/exercise-picture/SBReverseCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1658,'Cable Reverse Calf Raise','Place cable belt or dip belt around waist. Kneel before low pulley and attach it to cable. Stand and position heels on forward edge of platform. Grasp support bar for balance.','Pull forefeet up toward body as far as possible. Return by extending feet until toes are pointed downward. Repeat.','upload/exercise-picture/CBReverseCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1659,'Dumbbell Reverse Calf Raise','Grasp dumbbell in one hand to side. Position heels on forward edge of platform. Grasp support with other hand for balance.','Pull forefoot of both feet up toward body as far as possible. Return by extending feet until toes are pointed downward. Repeat.','upload/exercise-picture/DBReverseCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1660,'Lever 45° Reverse Calf Press (plate loaded)','Sit on seat with back on padded support. Place feet very high on platform, grasp handles to sides, and extend knees.','Pull forefoot back toward body as far as possible while pushing platform with heels. Return feet down to platform and repeat.','upload/exercise-picture/LV45DegReverseCalfPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1661,'Lever Reverse Calf Raise (on v-squat machine, plate loaded)','Position shoulders under shoulder pads with back against back pad. Position feet far forward on platform. Grasp handles or sides of padded lever.','Pull forefeet up toward body as far as possible. Return by extending feet until toes are pointed downward. Repeat.','upload/exercise-picture/LVReverseVCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1662,'Lever Reverse Calf Raise (plate loaded)','Place shoulders under padded lever. Stand erect by extending hips and knees. Position heels on forward edge of platform placed under padded lever. Grasp handles or sides of padded lever.','Pull forefoot of both feet up toward body as far as possible. Return by extending feet until toes are pointed downward. Repeat.','upload/exercise-picture/LVReverseCalfRaisePL.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1663,'Lever Reverse Calf Extension','Sit on seat and position heels on lever platform with fore feet extended off top. Grasp handles to sides and straighten knees.','Pull forefoot back toward body as far as possible while pushing platform with heels. Return feet down to platform and repeat.','upload/exercise-picture/LVReverseCalfExtension.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1664,'Lever Donkey Reverse Calf Raise','Position lower back and hips under upper lever pad. Place forearms on supports. Position heels on forward edge of platform.','Pull forefoot up and toward body as far as possible. Return by extending feet until toes are pointed away from body. Repeat.','upload/exercise-picture/LVDonkeyReverseCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1665,'Lever Seated Tibia Raise (plate loaded)','Sit on bench or stool. Place both feet under padded lever with heels on pedal.','Lift forefeet upward as far as possible. Return by extending feet until toes are pointed downward. Repeat.','upload/exercise-picture/LVSSeatedTibiaRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1666,'Lever Reverse Calf Raise','Place shoulders under padded lever. Stand erect by extending hips and knees. Position heels on forward edge of platform placed under padded lever. Grasp handles or sides of padded lever.','Pull forefoot of both feet up toward body as far as possible. Return by extending feet until toes are pointed downward. Repeat.','upload/exercise-picture/LVReverseCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1667,'Lever Single Leg Seated Tibia Raise (plate loaded)','Sit on bench or stool. Place foot under padded lever with heel on pedal and other foot off to side.','Lift forefoot upward as far as possible. Return by extending foot until toes are pointed downward. Repeat.','upload/exercise-picture/LVSingleLegSeatedTibiaRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1668,'Sled 45° Reverse Calf Raise','Sit on machine with lower back against padding. Grasp handles to sides and place feet on platform. Straighten knees and position heels on top edge of platform.','Pull forefoot of both feet up and back toward body as far as possible. Return by extending feet until toes are pointed away from body. Repeat.','upload/exercise-picture/SL45ReverseCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1669,'Lever Standing Tibia Raise (plate loaded)','Standing behind machine hold on to support for balance. Place foot under padded lever with heel on pedal.','Lift forefoot upward as far as possible. Return by extending foot until toes are pointed downward. Repeat.','upload/exercise-picture/LVStandingTibiaRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1670,'Sled 45° Reverse Calf Raise (plate loaded)','Sit on machine with lower back against padding. Grasp handles to sides and place feet on platform. Straighten knees and position heels on top edge of platform.','Pull forefoot of both feet up and back toward body as far as possible. Return by extending feet until toes are pointed away from body. Repeat.','upload/exercise-picture/SL45DegReverseCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1671,'Sled 45° Reverse Calf Press','Sit on seat with back on padded support. Place feet very high on platform, grasp handles to sides, and extend knees.','Pull forefoot back toward body as far as possible while pushing platform with heels. Return feet down to platform and repeat.','upload/exercise-picture/SL45DegReverseCalfPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1672,'Lever Seated Reverse Calf Press','Place seat away from platform. Sit on seat with lower back against padding and place feet very high on platform. Grasp handles to sides and straighten knees.','Pull forefoot back toward body as far as possible while pushing platform with heels. Return feet down to platform and repeat.','upload/exercise-picture/LVSeatedReverseCalfPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1673,'Sled Reverse Donkey Calf Raise (plate loaded)','Position lower back and hips under upper pad. Place forearms on supports. Position heels on forward edge of platform.','Pull forefoot up and toward body as far as possible. Return by extending feet until toes are pointed away from body. Repeat.','upload/exercise-picture/SLDonkeyReverseCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1674,'Sled Lying Reverse Calf Press','Position sled away from platform. Lie supine on sled with shoulders against pad and place feet very high on platform. Grasp handles to sides and straighten knees.','Pull forefoot back toward body as far as possible while pushing platform with heels. Return feet down to platform and repeat.','upload/exercise-picture/SLLyingReverseCalfPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1675,'Sled 45° Reverse Calf Raise (on hack press)','Sit on machine with lower back against padding. Grasp handles to sides and place feet on top portion of platform. Straighten knees and position heels on top edge of platform.','Pull forefoot of both feet up and back toward body as far as possible. Return by extending feet return to platform. Repeat.','upload/exercise-picture/SL45ReverseCalfRaiseHackPressPL.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1676,'Sled Hack Reverse Calf Raise','Lie supine on back pad with shoulders against pads. Place feet very high on platform. Extend hips and knees. Release dock levers.','Pull forefoot of both feet up toward body as far as possible. Return by extending feet until toes are pointed away from body. Repeat.','upload/exercise-picture/SLHackReverseCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1677,'Sled Reverse Calf Raise (plate loaded)','Place shoulders under padded bars. Stand erect by extending hips and knees. Position heels on forward edge of platform positioned under padded bars. Grasp handles or sides of padded bars.','Pull forefoot of both feet up toward body as far as possible. Return by extending feet until toes are pointed downward. Repeat.','upload/exercise-picture/SLStandingReverseCalfRaisePL.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1678,'Sled Lying Reverse Calf Press (plate loaded)','Position sled away from platform. Lie supine on sled with shoulders against pad and place feet very high on platform. Grasp handles to sides and straighten knees.','Pull forefoot back toward body as far as possible while pushing platform with heels. Return feet down to platform and repeat.','upload/exercise-picture/SLLyingReverseCalfPressPL.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1679,'Sled Standing Reverse Calf Raise','Place shoulders under padded bars. Stand erect by extending hips and knees. Position heels on forward edge of platform positioned under padded bars. Grasp ends or sides of padded bars.','Pull forefoot of both feet up toward body as far as possible. Return by extending feet until toes are pointed downward. Repeat.','upload/exercise-picture/SLStandingReverseCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1680,'Smith Reverse Calf Raise','Position bar upper chest height and place calf block under bar. Position back of shoulders under bar and grasp bar to sides. Position heels on forward edge of calf block. Disengage bar by rotating bar back. Stand erect with knees and hips straight.','Pull forefoot of both feet up toward body as far as possible. Return by extending feet until toes are pointed downward. Repeat.','upload/exercise-picture/SMReverseCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1681,'Reverse Calf Raise','Position heels on forward edge of calf block or platform. Grasp support with other hand for balance.','Pull forefoot of both feet up toward body as far as possible. Return by extending feet until toes are pointed downward. Repeat.','upload/exercise-picture/DBReverseCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1682,'Sled Seated Reverse Calf Press','Sit on seat and place feet very high on platform. Grasp handles to sides and extend knees.','Pull forefoot back toward body as far as possible while pushing platform with heels. Return feet down to platform and repeat.','upload/exercise-picture/SLSeatedReverseCalfPress.gif',1,'2021-06-27 13:36:24',NULL,NULL,0),(1683,'Standing Shin Stretch','Stand and touch wall or stationary object for balance. Grasp forefoot behind.','Pull forefoot to lower back. Hold stretch. Repeat with opposite side.','upload/exercise-picture/6f8914a8ffb2d11f8beb1556ceaeeffb.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1684,'Seated Shin Stretch','Sit on chair or bench and cross lower leg over thigh of opposite leg. Place one hand above ankle and other hand on top of your foot.','Pull forefoot to extend ankle. Hold stretch. Repeat with opposite side.','upload/exercise-picture/5cdf2831c84a57c531f5f6fbd084bcdf.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1685,'Kneeling Shin Stretch','Kneel on both knees with buttocks over both heels and feet extend back.','Sit down on or toward heels. Hold stretch.','upload/exercise-picture/54b780357143690c4f905794962e7e29.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1686,'Lying Shin Stretch','Lie on one side. Grasp top forefoot behind.','Pull forefoot to lower back. Hold stretch. Repeat with opposite foot.','upload/exercise-picture/db4e77e1aa267a1a61f9d75ad4d27030.jpg',1,'2021-06-27 13:36:24',NULL,NULL,0),(1687,'Single Leg Reverse Calf Raise','Position one heel on forward edge of platform. Grasp support with other hand for balance. Lift other leg to rear by bending knee.','Pull forefoot up toward body as far as possible. Return by extending foot until toes are pointed downward. Repeat. Continue with opposite leg.','upload/exercise-picture/BWSingleLegReverseCalfRaise.gif',1,'2021-06-27 13:36:24',NULL,NULL,0); +/*!40000 ALTER TABLE `exercise` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `exercise_classification` +-- + +DROP TABLE IF EXISTS `exercise_classification`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `exercise_classification` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'The ID of exercise classification.', + `name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'The name of exercise classification.', + `description` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'The description of exercise classification.', + `created_by` bigint unsigned NOT NULL DEFAULT '1' COMMENT 'Created by', + `created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Created time', + `modified_by` bigint unsigned DEFAULT NULL COMMENT 'Modified by', + `modified_time` datetime DEFAULT NULL COMMENT 'Modified time', + `deleted` tinyint NOT NULL DEFAULT '0' COMMENT 'Deleted', + PRIMARY KEY (`id`), + UNIQUE KEY `exercise_classification_name_uindex` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Exercise Classification.\n\nhttps://exrx.net/WeightTraining/Glossary'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `exercise_classification` +-- + +LOCK TABLES `exercise_classification` WRITE; +/*!40000 ALTER TABLE `exercise_classification` DISABLE KEYS */; +INSERT INTO `exercise_classification` VALUES (1,'Basic','A principal exercise that can place greater absolute intensity on muscles exercised relative to auxiliary exercises. Basic exercises tend to have more of the following characteristics:\n\ngravity dependent\ninclusion or shift of resistance through multiple muscle group throughout the range of motion\n\ne.g. bench press: front deltoid to pectoralis major to triceps\n\nnatural transfer of torsion force to compression force (e.g., lockout on squat, bench press, etc.) or tension force (e.g. extension of arm curl) to the bone(s) and joint(s) during full range of motion\n\nAlso see angle of pull\n\ngravity dependent',1,'2021-06-27 13:38:55',NULL,NULL,0),(2,'Auxiliary','An optional exercise that may supplement a basic exercise. Auxiliary exercises may place greater relative intensity on a specific muscle or a head of a muscle.Compound',1,'2021-06-27 13:38:55',NULL,NULL,0),(3,'Compound','An exercise that involves two or more joint movements.',1,'2021-06-27 13:38:55',NULL,NULL,0),(4,'Isolated','An exercise that involves just one discernible joint movement.\nPull',1,'2021-06-27 13:38:55',NULL,NULL,0),(5,'Closed Chain','An exercise or movement in which the end segment of the exercised limb is fixed, or the end is supporting the weight. Most compound exercises are closed-chainmovements.',1,'2021-06-27 13:38:55',NULL,NULL,0),(6,'Open Chain','An exercise or movement in which the end segment of the exercised limb is not fixed, or the end is not supporting the weight. Many isolated exercises are open-chain movements.',1,'2021-06-27 13:38:55',NULL,NULL,0),(7,'Functional','An exercise which allows one to gain motor development or strength in a manner in which it is used in the execution of a particular task (eg: specific sport skill, occupational task, or daily activity).',1,'2021-06-27 13:38:55',NULL,NULL,0),(8,'Push','Movement away from center of body during the concentric contraction of the target muscle. Isolated movements are classified by their compound counterparts.',1,'2021-06-27 13:38:55',NULL,NULL,0),(9,'Pull','Movement toward center of body during the concentric contraction of the target muscle. Isolated movements are classified by their compound counterparts.',1,'2021-06-27 13:38:55',NULL,NULL,0); +/*!40000 ALTER TABLE `exercise_classification` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `exercise_comment` +-- + +DROP TABLE IF EXISTS `exercise_comment`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `exercise_comment` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'The ID of exercise comment.', + `exercise_id` bigint unsigned NOT NULL COMMENT 'The ID of exercise.', + `comment` varchar(2500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'The comment.', + `created_by` bigint unsigned NOT NULL DEFAULT '1' COMMENT 'Created by', + `created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Created time', + `modified_by` bigint unsigned DEFAULT NULL COMMENT 'Modified by', + `modified_time` datetime DEFAULT NULL COMMENT 'Modified time', + `deleted` tinyint NOT NULL DEFAULT '0' COMMENT 'Deleted', + PRIMARY KEY (`id`), + UNIQUE KEY `exercise_comment_exercise_id_uindex` (`exercise_id`) +) ENGINE=InnoDB AUTO_INCREMENT=1347 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Exercise Comment.\n\nRelationship:\nOne exercise to one comment.\n\nIf the exercise doen''t have comment,\nthen this table will still store the comment record for it,\nlike { id: 1, exercise_id: 1, comment: ''NONE'' }.'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `exercise_comment` +-- + +LOCK TABLES `exercise_comment` WRITE; +/*!40000 ALTER TABLE `exercise_comment` DISABLE KEYS */; +INSERT INTO `exercise_comment` VALUES (1,1,'Use neck to pull belt rather than allowing hand to assist. Keep clinched grip on belt against back of mid-head throughout movement. Clamping belt higher up further from base of skull will permit torque throughout fuller range of motion, particularly range of motion nearer full flexion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(2,4,'Sit at distance away from pulley so weight does not bottom out at lowest range of motion. Keep clinched grip on belt against side of head throughout movement. Use heads friction on belt to pull belt rather than pushing with the hand used to keep belt tight around head. Keep back against back pad to minimize torso movement, reducing rotation below cervical spine.',1,'2021-06-27 13:39:40',NULL,NULL,0),(3,3,'None',1,'2021-06-27 13:39:40',NULL,NULL,0),(4,2,'Positioning pulley higher will alter tension curve by decreasing effort required near initiation of concentric contraction while increasing effort required near end of concentric contraction. Positioning pulley slightly higher than what is shown will allow greater effort in middle of movement.',1,'2021-06-27 13:39:40',NULL,NULL,0),(5,5,'See all muscle used in Lateral Flexion:',1,'2021-06-27 13:39:40',NULL,NULL,0),(6,6,'Sit at distance away from pulley so weight does not bottom out at lowest range of motion. Keep clinched grip on belt against side of head throughout movement. Woven cotton or cloth belts tend to slip less, particularly on bald heads. If belt slips from head, place small towel between belt and head.',1,'2021-06-27 13:39:40',NULL,NULL,0),(7,7,'See all muscle used in Lateral Flexion:',1,'2021-06-27 13:39:40',NULL,NULL,0),(8,8,'None',1,'2021-06-27 13:39:40',NULL,NULL,0),(9,9,'Balance weight on back of head with both hands throughout movement. Weight plate(s) can be tilted slightly to higher point on head to keep resistance slightly more consistent throughout movement. Tilt weight forward slightly at bottom and back slightly at top. Also see Weighted Neck Flexion positioning body perpendicular on bench.',1,'2021-06-27 13:39:40',NULL,NULL,0),(10,10,'Balance weight on back of head with both hands throughout movement.Weight plate(s) can be tilted slightly to higher point on head to keep resistance slightly more consistent throughout movement. Tilt wei\n\n\nght forward slightly at bottom and back slightly at top. Also see Weighted Lying Neck Flexion lying on bench longwise.',1,'2021-06-27 13:39:40',NULL,NULL,0),(11,11,'See all muscle used in Lateral Flexion:',1,'2021-06-27 13:39:40',NULL,NULL,0),(12,12,'Head can be pulled toward back.',1,'2021-06-27 13:39:40',NULL,NULL,0),(13,13,'Keep body somewhat straight allowing waist to bend outward away from mat slightly at end of lift. See all muscle used in Lateral Flexion:',1,'2021-06-27 13:39:40',NULL,NULL,0),(14,14,'Neck retraction primarily consists of Cervical Flexion (spine) accompanied by subtle Thoracic Flexion (spine) and Neck Flexion (atlanto-occipital joint). Cervical spine has natural lordotic curvature (see diagram of spine). Much of the retraction motion is actually flattening or slight reversing the normal lordosis. The deep neck flexors perform majority of this movement. Slight neck Flexion at the atlanto-occipital joint also occurs to maintain forward head positioning.',1,'2021-06-27 13:39:40',NULL,NULL,0),(15,15,'This exercise can be performed with belt looped on TRXⓇ style suspension trainer or adjustable length gymnastics rings. Throughout movement, keep body straight and maintain tight grip on belt against back of mid-head throughout movement. Use neck to pull belt rather than allowing hand to assist. Clamping belt higher up further from base of skull will permit torque throughout fuller range of motion, particularly range of motion nearer full flexion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(16,16,'Exercise involves neck flexors as well as neck extensors. See controversial exercises.',1,'2021-06-27 13:39:40',NULL,NULL,0),(17,17,'Keep body somewhat straight bending spine and hips slightly as head rolls down. Exercise involves neck flexors as well as neck extensors. See controversial exercises.',1,'2021-06-27 13:39:40',NULL,NULL,0),(18,18,'This exercise can be performed with belt looped on TRXⓇ style suspension trainer or adjustable length gymnastics rings. Throughout movement, keep body straight and maintain tight grip on belt against side of head throughout movement. Use neck to pull belt rather than allowing hand to assist.',1,'2021-06-27 13:39:40',NULL,NULL,0),(19,19,'No comment.',1,'2021-06-27 13:39:40',NULL,NULL,0),(20,20,'None',1,'2021-06-27 13:39:40',NULL,NULL,0),(21,21,'None',1,'2021-06-27 13:39:40',NULL,NULL,0),(22,22,'Balance weight on back of head with both hands throughout movement. Weight plate(s) can be tilted slightly to\n\n\nhigher point on head to keep resistance slightly more consistent throughout movement. Tilt weight forward slightly at top and back slightly at bottom. Also see same movement with body lying perpendicular to bench.',1,'2021-06-27 13:39:40',NULL,NULL,0),(23,26,'Balance weight on back of head with both hands throughout movement. Weight plate(s) can be tilted slightly to\n\n\nhigher point on head to keep resistance slightly more consistent throughout movement. Tilt weight forward slightly at top and back slightly at bottom.',1,'2021-06-27 13:39:40',NULL,NULL,0),(24,25,'Exercise can also be performed by bending over with hands on bent knees.',1,'2021-06-27 13:39:40',NULL,NULL,0),(25,23,'Balance weight on back of head with both hands throughout movement. Weight plate(s) can be tilted slightly to higher point on head to keep resistance slightly more consistent throughout movement. Tilt weight slightly forward at top and back slightly at bottom. Also same see movement with body lying on bench.',1,'2021-06-27 13:39:40',NULL,NULL,0),(26,24,'Use neck to pull belt rather than allowing hand to assist. Keep clinched grip on belt against forehead throughout movement. Woven cotton or cloth belts tend to slip less, particularly on bald head. If belt slips from head, place small towel between belt and head.',1,'2021-06-27 13:39:40',NULL,NULL,0),(27,28,'See controversial exercises.',1,'2021-06-27 13:39:40',NULL,NULL,0),(28,27,'This exercise may be prescribed for functional forward head posture since it strengthens Splenius without neck flexion. Neck retraction primarily consists of Cervical Flexion (spine) accompanied by subtle Thoracic Flexion (spine) and Neck Flexion (atlanto-occipital joint). Cervical spine has natural lordotic curvature (see diagram of spine). Much of the retraction motion is actually flattening or slight reversing the normal lordosis. The deep neck flexors perform majority of movement. Slight neck Flexion at the atlanto-occipital joint also occurs to maintain forward head positioning.',1,'2021-06-27 13:39:40',NULL,NULL,0),(29,29,'Also known as wrestler\'s bridge. See controversial exercises.',1,'2021-06-27 13:39:40',NULL,NULL,0),(30,30,'None.',1,'2021-06-27 13:39:40',NULL,NULL,0),(31,31,'This exercise can be performed with belt looped on TRXⓇ style suspension trainer or adjustable length gymnastics rings. Throughout movement, keep body straight and maintain tight grip on belt against forehead. Use neck to pull belt rather than allowing hand to assist.',1,'2021-06-27 13:39:40',NULL,NULL,0),(32,32,'This exercise may be prescribed for functional forward head posture since it strengthens Splenius without neck flexion. The stretch that occurs during complete neck flexion, may exacerbate forward head posture, particularly if neck flexion is held under load. Neck flexion normally occurs at end of eccentric portion of dynamic Splenius exercises.',1,'2021-06-27 13:39:40',NULL,NULL,0),(33,33,'Exercise may be performed on shoulder press apparatus with rack or off of power rack with seat or without back support. Also see mount and dismount off of special articulating rack.',1,'2021-06-27 13:39:40',NULL,NULL,0),(34,34,'Movement can also be performed on old fashioned incline bench without seat.',1,'2021-06-27 13:39:40',NULL,NULL,0),(35,35,'See unrack and rack technique. Feet may be positioned shoulder width apart or one foot in front of other with forward leg slightly bent (as shown). Upper chest assists (instead of side delts) since grip is slightly narrower and chest is high with low back arched back slightly. Also known as Overhead Press.\n\n\nAlso see Push Press and Press Strength Standards.',1,'2021-06-27 13:39:40',NULL,NULL,0),(36,36,'Absolute height of movement may depend on range of motion. Raise should be limited to height achieved just before tightness is felt in shoulder capsule. Alternatively, height just above horizontal may be considered adequate. Elbows may be kept straight or slightly bent throughout movement.',1,'2021-06-27 13:39:40',NULL,NULL,0),(37,37,'Set barbell on forward rack slightly below shoulder height so bar may be more easily mounted and racked. Position seat so bar does not hit uprights but close enough to easily mount and rack. Range of motion will be compromised if grip is too wide.',1,'2021-06-27 13:39:40',NULL,NULL,0),(38,38,'Exercise may also be performed seated, straddling bench or on weight chair with back support.',1,'2021-06-27 13:39:40',NULL,NULL,0),(39,40,'Exercise may also be performed seated, straddling bench or on weight chair with back support. Range of motion will be compromised if grip is too wide.',1,'2021-06-27 13:39:40',NULL,NULL,0),(40,39,'Feet may be positioned shoulder width apart or one foot in front of other with forward leg slightly bent (as shown). Upper chest assists (instead of side delts) since grip is slightly narrower and chest is high with low back arched back slightly.',1,'2021-06-27 13:39:40',NULL,NULL,0),(41,42,'Absolute height of movement may depend on range of motion or when stirrup or cable makes contact with underside of forearm. Raise should be limited to height achieved just before tightness is felt in shoulder capsule. Alternatively, height just above horizontal may be considered adequate. Elbows may be kept straight or slightly bent throughout movement.',1,'2021-06-27 13:39:40',NULL,NULL,0),(42,41,'Set barbell on forward rack slightly below shoulder height so bar may be more easily unracked and racked. Position seat so bar does not hit uprights but close enough to easily mount and rack. Range of motion will be compromised if grip is too wide. Grip is slightly narrower than shoulder press. Torso is postured more upright than traditional Military Press.',1,'2021-06-27 13:39:40',NULL,NULL,0),(43,43,'Absolute height of movement may depend on range of motion or when stirrup or cable makes contact with underside of forearm. Raise should be limited to height achieved just before tightness is felt in shoulder capsule. Alternatively, height just above horizontal may be considered adequate. Elbows may be kept straight or slightly bent throughout movement.',1,'2021-06-27 13:39:40',NULL,NULL,0),(44,44,'Absolute height of movement may depend on range of motion or when stirrup or cable makes contact with underside of forearm. Raise should be limited to height achieved just before tightness is felt in shoulder capsule. Alternatively, height just above horizontal may be considered adequate. Elbows may be kept straight or slightly bent throughout movement.',1,'2021-06-27 13:39:40',NULL,NULL,0),(45,45,'Absolute height of movement may depend on range of motion or when cable makes contact with underside of forearm. Raise should be limited to height achieved just before tightness is felt in shoulder capsule. Alternatively, height just above horizontal may be considered adequate.',1,'2021-06-27 13:39:40',NULL,NULL,0),(46,47,'Absolute height of movement may depend on range of motion or when stirrup or cable makes contact with underside of forearm. Raise should be limited to height achieved just before tightness is felt in shoulder capsule. Alternatively, height just above horizontal may be considered adequate. Elbows may be kept straight or slightly bent throughout movement.',1,'2021-06-27 13:39:40',NULL,NULL,0),(47,46,'Wrists maintain their approximate position above each elbow throughout movement.',1,'2021-06-27 13:39:40',NULL,NULL,0),(48,48,'Movement can also be performed on old fashion incline bench without seat.',1,'2021-06-27 13:39:40',NULL,NULL,0),(49,49,'Internal rotation of far hip (opposite side with resistance) is much greater than spinal rotation.',1,'2021-06-27 13:39:40',NULL,NULL,0),(50,51,'Absolute height of movement may depend on range of motion. Raise should be limited to height achieved just before tightness is felt in shoulder capsule. Alternatively, height just above horizontal may be considered adequate. Elbows may be kept straight or slightly bent throughout movement. Also see Dumbbell Alternating Front Raise.',1,'2021-06-27 13:39:40',NULL,NULL,0),(51,50,'Wrists maintain their approximate position above each elbow throughout movement. Feet may be positioned apart to each side or one foot back as shown. Cable pulleys should be much closer together than what is typically found on standard cable cross over setup.',1,'2021-06-27 13:39:40',NULL,NULL,0),(52,52,'Absolute height of movement may depend on range of motion. Raise should be limited to height achieved just before tightness is felt in shoulder capsule. Alternatively, height just above horizontal may be considered adequate. Elbows may be kept straight or slightly bent throughout movement. Also see Dumbbell Front Raise.',1,'2021-06-27 13:39:40',NULL,NULL,0),(53,53,'Movement should emphasize shoulder abduction while minimizing forearm pronation as this exercise attempts to combine lateral raise like motion with shoulder press. Lean forward slightly when lifting Dumbbells.',1,'2021-06-27 13:39:40',NULL,NULL,0),(54,54,'See suggested mount and dismount when using heavy dumbbells.',1,'2021-06-27 13:39:40',NULL,NULL,0),(55,55,'Range of motion will be compromised if grip is too wide.',1,'2021-06-27 13:39:40',NULL,NULL,0),(56,56,'Exercise can also be performed on certain lever shoulder presses by facing away from machine. Range of motion will be compromised if grip is too wide.',1,'2021-06-27 13:39:40',NULL,NULL,0),(57,57,'Range of motion will be compromised if grip is too wide.',1,'2021-06-27 13:39:40',NULL,NULL,0),(58,59,'Torso can lean away for balance as shown or torso can maintain upright posture. Also see Kettlebell Press.',1,'2021-06-27 13:39:40',NULL,NULL,0),(59,58,'Range of motion will be compromised if grip is too wide. Movement angle is arguably similar to lever incline press, for upper chest. Seat should be set so only slight stretch is felt in shoulder at bottom of movement.',1,'2021-06-27 13:39:40',NULL,NULL,0),(60,60,'Absolute height of movement may depend on individual range of motion. Raise should be limited to height achieved just before tightness is felt in shoulder capsule. Alternatively, height just above horizontal may be considered adequate. Elbows may be kept straight or slightly bent throughout movement. Exercise is performed on Lever Extended Arm Lateral Raise Machine featuring long lever arms and handles attached to secondary levers as shown.',1,'2021-06-27 13:39:40',NULL,NULL,0),(61,61,'Range of motion will be compromised if grip is too wide.',1,'2021-06-27 13:39:40',NULL,NULL,0),(62,62,'Pull head back slightly so bar does not head. Range of motion will be compromised if grip is too wide.',1,'2021-06-27 13:39:40',NULL,NULL,0),(63,63,'Keep back straight when lifting end of barbell from floor. Also see Lever One Arm Press for power.',1,'2021-06-27 13:39:40',NULL,NULL,0),(64,64,'Range of motion will be compromised if grip is too wide.',1,'2021-06-27 13:39:40',NULL,NULL,0),(65,65,'Range of motion will be compromised if grip is too wide.',1,'2021-06-27 13:39:40',NULL,NULL,0),(66,66,'Range of motion will be compromised if grip is too wide.',1,'2021-06-27 13:39:40',NULL,NULL,0),(67,67,'Range of motion will be compromised if grip is too wide.',1,'2021-06-27 13:39:40',NULL,NULL,0),(68,68,'Parallel grip can be used for variety or when flexibility does not permit standard overhand grip further back.',1,'2021-06-27 13:39:40',NULL,NULL,0),(69,69,'Range of motion will be compromised if grip is too wide.',1,'2021-06-27 13:39:40',NULL,NULL,0),(70,70,'Parallel grip can be used for variety or when flexibility does not permit standard overhand grip further back.',1,'2021-06-27 13:39:40',NULL,NULL,0),(71,71,'Pull head back slightly so bar does not head. Range of motion will be compromised if grip is too wide.',1,'2021-06-27 13:39:40',NULL,NULL,0),(72,72,'Range of motion will be compromised if grip is too wide.',1,'2021-06-27 13:39:40',NULL,NULL,0),(73,73,'Benches must be secured to prevent sliding on floor. Also, each benches\' base of support should be under edge of bench where hand is placed to prevent bench toppling under body weight. Falling from an inverted position may result in very serious injury. Also known as Elevated Handstand Push-up.',1,'2021-06-27 13:39:40',NULL,NULL,0),(74,74,'Instead of scooting hips forward, hands can be eased backwards.',1,'2021-06-27 13:39:40',NULL,NULL,0),(75,75,'See PNF stretch techniques. Also see Seated Front Deltoid Stretch for similar static stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(76,76,'A stationary bar can also be used instead of wall.',1,'2021-06-27 13:39:40',NULL,NULL,0),(77,77,'Pike Press (for front delts) differs from Pike Push-up (for upper chest) in that, feet are at closer distance to hands so body is more inverted in lowest position. Keep knees and back straight. A slight curve (spinal flexion) is acceptable if hamstrings are tight.',1,'2021-06-27 13:39:40',NULL,NULL,0),(78,78,'Keep knees and back straight. A slight curve (spinal flexion) is acceptable if hamstrings are tight.',1,'2021-06-27 13:39:40',NULL,NULL,0),(79,79,'At higher angles, feet can be placed flat on floor. When angled further back, only heels may contact floor with forefeet raising upward. Dismounting can be achieved by walking backward until body is upright. This exercise can be performed on TRXⓇ style suspension trainer or adjustable length gymnastics rings',1,'2021-06-27 13:39:40',NULL,NULL,0),(80,80,'A stationary bar can also be used instead of wall.',1,'2021-06-27 13:39:40',NULL,NULL,0),(81,81,'Maintain fixed slightly bent elbow position throughout exercise. Stirrup is raised by shoulder abduction, not external rotation. Also see Cable Lateral Raise performed with pulleys very close together.',1,'2021-06-27 13:39:40',NULL,NULL,0),(82,82,'Bar can be received from barbell rack, standing behind bar\nmid-thigh height. See\nUpright\nRow Safety.',1,'2021-06-27 13:39:40',NULL,NULL,0),(83,84,'Bar can be recieved from barbell rack, standing behind bar mid-thigh height. See Upright Row Safety.',1,'2021-06-27 13:39:40',NULL,NULL,0),(84,86,'See Upright Row Safety.',1,'2021-06-27 13:39:40',NULL,NULL,0),(85,83,'Maintain fixed elbow position (10° to 30° angle) throughout exercise. Stirrup is raised by shoulder abduction, not external rotation.',1,'2021-06-27 13:39:40',NULL,NULL,0),(86,85,'Maintain fixed slightly bent elbow position throughout exercise. At top of movement, elbows (not necessarily dumbbells) should be directly lateral to shoulders since elbows are slightly bent forward. Stirrup is raised by shoulder abduction, not external rotation. If elbows drop lower than wrists, front deltoids become primary mover instead of lateral deltoids.',1,'2021-06-27 13:39:40',NULL,NULL,0),(87,87,'See Upright Row Safety.',1,'2021-06-27 13:39:40',NULL,NULL,0),(88,88,'To prevent cable parts from catching, stand with body turned very subtly to side of cable behind other. Positioning one cable slightly in front of other cable may result in slight asymmetrical movement. Therefore, alternate opposite arm positions every other workout or set. See Upright Row Safety. Also see Cable Upright Row with two stirrup attachments attached to single pulley cable.',1,'2021-06-27 13:39:40',NULL,NULL,0),(89,89,'See Upright Row Safety.',1,'2021-06-27 13:39:40',NULL,NULL,0),(90,90,'See\nUpright Row Safety.',1,'2021-06-27 13:39:40',NULL,NULL,0),(91,91,'Maintain fixed slightly bent elbow position throughout exercise. Stirrup is raised by shoulder abduction, not external rotation.',1,'2021-06-27 13:39:40',NULL,NULL,0),(92,92,'Keep torso upright while maintaining fixed slightly bent elbow position throughout exercise. Stirrup is raised by combining shoulder abduction and flexion with slight external rotation. Also see Cable Seated Y Raise on dual pulley machine with stirrup attachments.',1,'2021-06-27 13:39:40',NULL,NULL,0),(93,93,'Maintain fixed slightly bent elbow position throughout exercise. Stirrup is raised by combining shoulder abduction and flexion. Slight shoulder external rotation may occur with elbows bent. Front Deltoid assists shoulder flexion if upper arm angle is slightly\n\n\nhigh. Rear Deltoid assists shoulder horizontal abduction if upper arm angle is slightly low. Also see Cable Seated Y Raise on dual pulley Cable Row machine.',1,'2021-06-27 13:39:40',NULL,NULL,0),(94,95,'See Upright\nRow Safety. Also see side view.',1,'2021-06-27 13:39:40',NULL,NULL,0),(95,94,'Maintain fixed elbow position (10° to 30° angle) throughout exercise. At top of movement, elbow (not necessarily dumbbell) should be directly lateral to shoulder since elbow is slightly bent forward. Dumbbell is raised by shoulder abduction, not external rotation. As elbow drops lower than wrist, front deltoid become primary mover instead of lateral deltoid. See Lateral Raise Errors.',1,'2021-06-27 13:39:40',NULL,NULL,0),(96,96,'In order for lateral deltoid to be exercised, dumbbell must be raised by shoulder abduction, not external rotation. Also see exercise Dumbbell Incline Lateral Raise performed on preacher bench.',1,'2021-06-27 13:39:40',NULL,NULL,0),(97,97,'Keep torso upright throughout exercise. Stirrup is raised by combining shoulder abduction and flexion. Slight shoulder external rotation may occur with elbows bent. Front Deltoid assists shoulder flexion if upper arm angle is slightly high. Rear Deltoid assists shoulder horizontal abduction if upper arm angle is slightly low. Also see Cable Seated Y Raise on single pulley machine with rope attachment.',1,'2021-06-27 13:39:40',NULL,NULL,0),(98,98,'Setup requires attaching two stirrup attachments to single pulley cable. Also see Cable Upright Row with dual pulley. See Upright Row Safety.',1,'2021-06-27 13:39:40',NULL,NULL,0),(99,99,'Keep elbows pointed high while maintaining slight bend through elbows (10° to 30° angle) throughout movement. At top of movement, elbows (not necessarily dumbbells) should be directly lateral to shoulders since elbows are slightly bent forward. Dumbbells are raised by shoulder abduction, not external rotation. If elbows drop lower than wrists, front deltoids become primary mover instead of lateral deltoids. To keep resistance targeted to side delt, torso is bent over slightly. See other view and Lateral Raise Errors.',1,'2021-06-27 13:39:40',NULL,NULL,0),(100,100,'Dumbbell is raised by shoulder abduction, not external rotation.',1,'2021-06-27 13:39:40',NULL,NULL,0),(101,101,'Maintain fixed elbow position (10° to 30° angle) throughout exercise. At top of movement, elbow (not necessarily dumbbell) should be directly lateral to shoulder since elbow is slightly bent forward. Dumbbell is raised by shoulder abduction, not external rotation. As elbow drops lower than wrist, front deltoid becomes primary mover instead of lateral deltoid. See Lateral Raise Errors.',1,'2021-06-27 13:39:40',NULL,NULL,0),(102,102,'See Upright Row Safety.',1,'2021-06-27 13:39:40',NULL,NULL,0),(103,103,'When dumbbells are raised, wrist can be flexed, extended, or keep neutral.',1,'2021-06-27 13:39:40',NULL,NULL,0),(104,104,'When dumbbells are raised, wrists should be in front or just below of shoulders; elbows should be to sides, not pointing\n\n\nforward. See Upright Row Safety.',1,'2021-06-27 13:39:40',NULL,NULL,0),(105,105,'See Upright Row Safety. Also see Seated Upright Row.',1,'2021-06-27 13:39:40',NULL,NULL,0),(106,107,'None.',1,'2021-06-27 13:39:40',NULL,NULL,0),(107,108,'When dumbbell is raised, wrist should be in front or just below of shoulder; elbow should be to side, not too pointing forward. See Upright Row Safety. Also see Dumbbell One Arm Upright Row in standing position.',1,'2021-06-27 13:39:40',NULL,NULL,0),(108,106,'If necessary, lean forward slightly to keep elbows directly lateral to body. Also see alternative machine.',1,'2021-06-27 13:39:40',NULL,NULL,0),(109,109,'If elbows drop much lower than wrists, front deltoids become primary mover instead of lateral deltoids. Torso can also lean forward slightly to keep resistance targeted to side delt.',1,'2021-06-27 13:39:40',NULL,NULL,0),(110,110,'If elbows drop much lower than wrists, front deltoids become primary mover instead of lateral deltoids.',1,'2021-06-27 13:39:40',NULL,NULL,0),(111,112,'Positioning arm on upper chest stretches rear deltoid. See Rear Delt Stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(112,113,'None',1,'2021-06-27 13:39:40',NULL,NULL,0),(113,114,'At higher angles, feet can be placed flat on floor. When angled further back, only heels may contact forefeet floor with forefeet raising upward. Dismounting can be achieved by walking backward until body is upright. This exercise can be performed on TRXⓇ style suspension trainer or adjustable length gymnastics rings.',1,'2021-06-27 13:39:40',NULL,NULL,0),(114,115,'See Upright\nRow Safety.',1,'2021-06-27 13:39:40',NULL,NULL,0),(115,116,'See Upright Row Safety.',1,'2021-06-27 13:39:40',NULL,NULL,0),(116,117,'If upper arm travels closer than perpendicular to trunk, latissimus dorsi becomes involved. Elbows should be raised directly lateral to shoulders. Bench should be just high enough to prevent barbell from hitting floor and close to horizontal. Lying at 45° is not sufficient angle to target rear deltoids. Much lighter resistance is required as Cambered Bar Lying Row.',1,'2021-06-27 13:39:40',NULL,NULL,0),(117,118,'Upper arms should travel in horizontal path at shoulder height (not downward) to minimize Latissimus Dorsi involvement.',1,'2021-06-27 13:39:40',NULL,NULL,0),(118,119,'The relatively powerful Latissimus\nDorsi\n becomes involved:',1,'2021-06-27 13:39:40',NULL,NULL,0),(119,120,'Upper arm should travel perpendicular to torso to minimize latissimus dorsi involvement. Elbows may bend slightly at top of movement (as shown) or they may be kept fixed.',1,'2021-06-27 13:39:40',NULL,NULL,0),(120,121,'Flexion of wrist can allow for slightly greater range of movement near top, but this movement optional.',1,'2021-06-27 13:39:40',NULL,NULL,0),(121,122,'Upper arms should travel in horizontal path at shoulder height (not downward) to minimize Latissimus Dorsi involvement.',1,'2021-06-27 13:39:40',NULL,NULL,0),(122,123,'Elbow width is determined when elbows are raised at height of shoulders out to sides. The relatively powerful Latissimus Dorsi becomes involved:',1,'2021-06-27 13:39:40',NULL,NULL,0),(123,124,'If upper arm travels closer than perpendicular to trunk, latissimus dorsi becomes involved. Elbows should be raised directly lateral to shoulders. Positioning torso at 45° is not sufficient angle to target rear deltoids. Keep torso bent over approximately horizontal. Knees are bent in effort to keep low back straight (See Hamstring Inflexibility). If low back becomes rounded due to tight hamstrings, either knees should be bent more or torso may not be positioned as low. If low back is rounded due to poor form, deadlift weight to standing position and lower torso into horizontal position with knees bent and back straight. Much lighter resistance is required as Barbell Bent-over Row.',1,'2021-06-27 13:39:40',NULL,NULL,0),(124,125,'Upper arm should travel in horizontal path at shoulder height (not downward) to minimize Latissimus Dorsi involvement.',1,'2021-06-27 13:39:40',NULL,NULL,0),(125,126,'Dual pulley cables should be positioned approximately shoulder height or not much lower.\n\n\nThe relatively powerful Latissimus Dorsi becomes involved:',1,'2021-06-27 13:39:40',NULL,NULL,0),(126,127,'The relatively powerful Latissimus Dorsi becomes involved:',1,'2021-06-27 13:39:40',NULL,NULL,0),(127,128,'The relatively powerful Latissimus Dorsi becomes involved:',1,'2021-06-27 13:39:40',NULL,NULL,0),(128,129,'Upper arm should travel in perpendicular path to torso to minimize Latissimus Dorsi involvement. If stirrups are not within reach, training partner can hand exercises cable attachments.',1,'2021-06-27 13:39:40',NULL,NULL,0),(129,130,'Upper arm should travel in perpendicular path to torso to minimize Latissimus Dorsi involvement.',1,'2021-06-27 13:39:40',NULL,NULL,0),(130,131,'The relatively powerful Latissimus Dorsi becomes involved:',1,'2021-06-27 13:39:40',NULL,NULL,0),(131,132,'Dumbbells are raised by shoulder transverse abduction, not external rotation, nor extension. Upper arm should travel in perpendicular path to torso to minimize latissimus dorsi involvement. Upper arm should travel in perpendicular path to torso to minimize latissimus dorsi involvement. Bench should be high enough to prevent dumbbells from hitting floor and close to horizontal. Also see exercise performed on Lying Rear Delt Apparatus. Lying at 45° is not sufficient angle to target rear deltoids. Also see Rear Lateral Raise Errors.',1,'2021-06-27 13:39:40',NULL,NULL,0),(132,133,'If upper arm travels closer than perpendicular to trunk, latissimus dorsi becomes involved. Elbows should be raised directly lateral to shoulders. Bench should be just high enough to prevent dumbbells from hitting floor and close to horizontal. Also see exercise performed on Lying Rear Delt Apparatus. Lying at 45° is not sufficient angle to target rear deltoids. Much lighter resistance is required as Dumbbell Lying Row.',1,'2021-06-27 13:39:40',NULL,NULL,0),(133,134,'Upper arm should travel perpendicular to torso to minimize latissimus dorsi involvement. Elbows may bend slightly at bottom of movement (as shown) or they may be kept fixed. If low back cannot be kept straight due to inflexibility of hamstrings, try keeping knees bent more.',1,'2021-06-27 13:39:40',NULL,NULL,0),(134,135,'Latissimus Dorsi becomes involved if elbows drop below shoulders.',1,'2021-06-27 13:39:40',NULL,NULL,0),(135,136,'The relatively powerful Latissimus Dorsi becomes involved:',1,'2021-06-27 13:39:40',NULL,NULL,0),(136,137,'Maintain fixed elbow position straight or slightly bent and keep upper arm perpendicular to trunk throughout exercise.',1,'2021-06-27 13:39:40',NULL,NULL,0),(137,138,'Dumbbells are raised by shoulder transverse abduction, not external rotation, nor extension. Upper arm should travel in perpendicular path to torso to minimize relatively powerful latissimus dorsi involvement. In other words, at top of movement, elbows (not necessarily dumbbells) should be directly lateral to shoulders since elbows are slightly bent forward. To exercise posterior deltoid and not lateral deltoid, keep torso close to horizontal. Positioning torso at 45° is not sufficient angle to target rear deltoids. Knees are bent in effort to keep low back straight (See Hamstring Inflexibility). If low back becomes rounded due to tight hamstrings, either knees should be bent more or torso may not be positioned as low. If low back is rounded due to poor form, slowly lower torso into horizontal position with knees bent and back straight. Also see Rear Lateral Raise Errors.',1,'2021-06-27 13:39:40',NULL,NULL,0),(138,139,'Bench should be horizontal and be high enough to prevent dumbbell from touching floor. Upper arm should travel in perpendicular path to torso to minimize latissimus dorsi involvement. Bench should be high enough to prevent dumbbells from hitting floor and close to horizontal. Lying at 45° is not sufficient angle to target rear deltoids. This exercise AKA \"prone full can\" has been suggested to exercise supraspinatus muscle in rehabilitation settings (Blackburn TA, et al. 1990; Reinold MM, et al. 2007).',1,'2021-06-27 13:39:40',NULL,NULL,0),(139,140,'If upper arm travels closer than perpendicular to trunk, latissimus dorsi becomes involved. Elbow should be raised dire\n\n\nctly lateral to shoulder. Positioning torso at 45° is not sufficient angle to target rear deltoids. Keep torso bent over approximately horizontal. See side view of Dumbbell Rear Delt Row. Much lighter resistance is required as Dumbbell Bent-over Row.',1,'2021-06-27 13:39:40',NULL,NULL,0),(140,141,'If upper arm travels closer than perpendicular to trunk, latissimus dorsi becomes involved. Elbows should be kept on same movement plane as shoulders. Much lighter resistance is required as Lever Incline Row.',1,'2021-06-27 13:39:40',NULL,NULL,0),(141,142,'Upper arm should travel in perpendicular path to torso. At lower portion of exercise, keep elbows pointed outward below shoulders. At upper portion of exercise, keep elbows pointed outward to sides of shoulders. Legs may be kept together, extending off end (as shown), or bent straddling.',1,'2021-06-27 13:39:40',NULL,NULL,0),(142,145,'None.',1,'2021-06-27 13:39:40',NULL,NULL,0),(143,143,'If upper arm travels closer than perpendicular to trunk, latissimus dorsi becomes involved. Elbows should be kept same height as shoulders. Much lighter resistance is required as Lever Seated Row or even Wide Grip Lever Seated Row.',1,'2021-06-27 13:39:40',NULL,NULL,0),(144,144,'Dumbbells are raised by shoulder transverse abduction, not external rotation, nor extension. Upper arm should travel in perpendicular path to torso to minimize relatively powerful latissimus dorsi involvement. This mean at top of movement, elbows (not necessarily dumbbells) should be directly lateral to shoulders since elbows are slightly bent forward. To exercise posterior deltoid and not lateral deltoid, keep upper torso close to horizontal. Positioning upper torso at 45° is not sufficient angle to target rear deltoids. The spine can be flexed to achieve this positioning if thighs can provide sufficient support for torso. Some individuals may not be able to bend sufficiently at hip due to flexibility or girth constraints. Also see Rear Lateral Raise Errors and Low Back Alignment Exceptions.',1,'2021-06-27 13:39:40',NULL,NULL,0),(145,147,'Upper arm should travel in perpendicular path to torso to minimize Latissimus Dorsi involvement.',1,'2021-06-27 13:39:40',NULL,NULL,0),(146,148,'Platform height should allow pivot point of shoulders to be aligned with lever fulcrum. Upper arm should travel in perpendicular path to torso to minimize relatively powerful latissimus dorsi involvement. At top of movement, elbows (not necessarily dumbbells) should be directly lateral to shoulders since elbows are slightly bent forward. To exercise posterior deltoid and not lateral deltoid, keep torso close to horizontal. Positioning torso at 45° is not sufficient angle to target rear deltoids. Knees are bent in effort to keep low back straight (See Hamstring Inflexibility). Apparatus was originally designed to be used for Extended Arm Kneeling Lateral Raise. Also see Rear View Angle.',1,'2021-06-27 13:39:40',NULL,NULL,0),(147,149,'If upper arm travels closer than perpendicular to trunk, latissimus dorsi becomes involved. Elbows should be kept same height as shoulders. Also see exercise performed on alternative lever row machine. Much lighter resistance is required as compared to Lever Seated Row.',1,'2021-06-27 13:39:40',NULL,NULL,0),(148,150,'Keep elbows raised at same height of shoulders to minimize Latissimus Dorsi involvement. Thumbs down grip may be used so shoulders more naturally assume height of shoulders. Some machines allow for a more neutral overhand grip.',1,'2021-06-27 13:39:40',NULL,NULL,0),(149,151,'Platform height should allow pivot point of shoulders to be aligned with lever fulcrum. Upper arm should travel in perpendicular path to torso. At lower portion of exercise, keep elbows pointed outward below shoulders. At upper portion of exercise, keep elbows pointed outward to sides of shoulders. Knees are bent in effort to keep low back straight (See Hamstring Inflexibility).',1,'2021-06-27 13:39:40',NULL,NULL,0),(150,152,'If upper arm travels closer than perpendicular to trunk, latissimus dorsi becomes involved. Elbows should be raised directly lateral to shoulders. Keep torso bent over as far as possible allowing just enough height to fully extend arms. Knees are bent in effort to keep low back straight (See Hamstring Inflexibility). If low back becomes rounded due to tight hamstrings, either knees should be bent more or torso may not be positioned as low. If low back is rounded due to poor form, slowly lower torso into horizontal position with knees bent and back straight. Much lighter resistance is required as Lever T-Bar Row.',1,'2021-06-27 13:39:40',NULL,NULL,0),(151,155,'Keep elbows raised at same height of shoulders to minimize Latissimus Dorsi involvement. Exercise can also be performed with parallel grip, either with thumbs up or thumbs down positioning.',1,'2021-06-27 13:39:40',NULL,NULL,0),(152,153,'Upper arm should travel in perpendicular path to torso. At lower portion of exercise, keep elbows pointed outward below shoulders. At upper portion of exercise, keep elbows pointed outward to sides of shoulders. Legs may be kept together, extending off end, or bent straddling bench as demonstrated.',1,'2021-06-27 13:39:40',NULL,NULL,0),(153,157,'To maintain hips and back against pad during lift, legs must push into foot bar while keeping spine ridged. If apparatus is unavailable, a similar movement can be performed on certain pec deck machines with adequate ranges of motion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(154,156,'Pronated grip will internally rotate shoulders so elbows are kept at height of shoulders. Preventing elbows from dropping below shoulders will minimize Latissimus Dorsi involvement. With thumbs down grip, shoulder must be deliberately internally rotated to keep elbow at proper height. Some machines allow for a more neutral overhand grip.',1,'2021-06-27 13:39:40',NULL,NULL,0),(155,154,'Can be performed on certain pec deck machines as shown if their range of motion and design are adequate, although Gripless Lever Seated Reverse Fly machine is typically better suited for this exercise.',1,'2021-06-27 13:39:40',NULL,NULL,0),(156,158,'If elbows fall so upper arms no longer travels perpendicular to trunk, Latissimus Dorsi becomes involved. Elbows should be positioned directly lateral to shoulders at highest position. Pulling bar to lower chest is not sufficient angle to target rear deltoids. A higher bar (ie: lighter resistance) is required than what is required on Inverted Row. Bar height can be adjusted to vary resistance. See Gravity Vectors for greater understanding of how body angle influences resistance. Also known as Body Row or Supine Row.',1,'2021-06-27 13:39:40',NULL,NULL,0),(157,159,'If elbows fall so upper arms no longer travels perpendicular to trunk, Latissimus Dorsi becomes involved. Elbows should be positioned directly lateral to shoulders at highest position. Pulling bar to lower chest is not sufficient angle to target rear deltoids. A higher bar (ie: lighter resistance) is required than what is required on Inverted Row. Bar height can be adjusted to vary resistance. See Gravity Vectors for greater understanding of how body angle influences resistance. Also known as Body Row or Supine Row.',1,'2021-06-27 13:39:40',NULL,NULL,0),(158,160,'If upper arm travels closer than perpendicular to trunk, latissimus dorsi becomes involved. Elbows should be raised directly lateral to shoulders. Positioning torso at 45° is not sufficient angle to target rear deltoids. Keep torso bent over approximately horizontal. Knees are bent in effort to keep low back straight (See Hamstring Inflexibility). If low back becomes rounded due to tight hamstrings, either knees should be bent more or torso may not be positioned as low. If low back is rounded due to poor form, slowly lower torso into horizontal position with knees bent and back straight. Much lighter resistance is required as Smith Bent-over Row. Also see front angled view.',1,'2021-06-27 13:39:40',NULL,NULL,0),(159,162,'Upper arms should travel in transverse path at shoulder level without allowing elbows to drop to minimize Latissimus Dorsi involvement. A very upright position (ie: very light resistance) with one foot positioned slightly back (see \'Easier\') is typically required for proper execution. Take care to maintain tension on suspension trainer near top of movement. Dismounting can be achieved by walking backward until body is upright or stepping out at top of movement. This exercise can be performed on TRXⓇ style suspension trainer or adjustable length gymnastics rings.',1,'2021-06-27 13:39:40',NULL,NULL,0),(160,163,'If elbows fall so upper arms no longer travels perpendicular to trunk, Latissimus Dorsi becomes involved. Elbows should be positioned directly lateral to shoulders at highest position throughout movement. Executing exercise with elbows dropping lower than shoulders is not sufficient position to target rear deltoids. A more upright position (ie: lighter resistance) is required than what is used on Suspended Row for General B ack. Dismounting can be achieved by walking backward until body is upright.',1,'2021-06-27 13:39:40',NULL,NULL,0),(161,164,'Positioning arm on lower chest stretches side deltoid. See Side Delt Stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(162,165,'None',1,'2021-06-27 13:39:40',NULL,NULL,0),(163,167,'Raise toward 10 o\'clock with left arm and toward 2 o\'clock with right arm. Maintain straight elbow position with elbow pointing outward throughout exercise.',1,'2021-06-27 13:39:40',NULL,NULL,0),(164,168,'Raise toward 10 o\'clock with left arm and toward 2 o\'clock with right arm. Maintain straight elbow position with elbow pointing outward throughout exercise.',1,'2021-06-27 13:39:40',NULL,NULL,0),(165,169,'Maintain straight elbow position throughout exercise. Exercise may also be performed with shoulder traveling up to 30º forward, more inline with plane of scapular.',1,'2021-06-27 13:39:40',NULL,NULL,0),(166,170,'Maintain straight or nearly straight elbow position with elbows pointing outward throughout exercise. If low pulley is fixed, turn slightly away from low pulley.',1,'2021-06-27 13:39:40',NULL,NULL,0),(167,171,'Maintain straight or nearly straight elbow position with elbows pointing outward throughout exercise.',1,'2021-06-27 13:39:40',NULL,NULL,0),(168,172,'Grip can be slightly narrower than shoulder width but not too close. Too close of grip can decrease range of motion, may tend to hyper-adduct wrist joint, and unnecessarily decrease stability of bar.\n\n\nAlso see Bench Press Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(169,173,'See mount and dismount. Some assisted machines require you to kneel on pad. Also see Assisted Chest Dip.',1,'2021-06-27 13:39:40',NULL,NULL,0),(170,174,'Movement is hybrid between Bench Press and Triceps Extension. A false grip or standard thumb opposing grip can be taken, approximately 16\" (40 cm) apart for men. Bar is brought downward anywhere between chin and upper chest. As to minimize shoulder involvement, keep elbows up, allowing elbow to fold upon itself. Range of motion is determined by muscle mass of forearm and biceps. After mastering form and gradually progressing in resistance, push barbell upward more rapidly for greater power development.',1,'2021-06-27 13:39:40',NULL,NULL,0),(171,175,'See mount and dismount. Some assisted machines require you to stand on bar. Also see Assisted Chest Dip.',1,'2021-06-27 13:39:40',NULL,NULL,0),(172,177,'Grip can be slightly narrower than shoulder width but not too close. Also see Bench Press Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(173,176,'With arms fully extended, bar can be brought back over upper chest. Shoulders can be internally rotated between repetitions as needed to allow for relative release of tension in muscles. Barbell can be received from the floor or from rack either situated over abdomen or from behind head. Exercise can also be performed with straight barbell. Movement with cambared bar as shown above is also known as EZ Barbell or EZ Bar Lying Triceps Extension.',1,'2021-06-27 13:39:40',NULL,NULL,0),(174,179,'With arms fully extended, bar can be brought back over shoulders. Shoulders can be internally rotated between repetitions as needed to allow for relative release of tension in muscles. Either straight barbell or EZ barbell can be used.',1,'2021-06-27 13:39:40',NULL,NULL,0),(175,178,'Slow barbell\'s descent as it approaches forehead. Exercise can also be performed with elbow traveling slightly back during extension. With this altered form, barbell essentially moves in straight line, up and down, over forehead. Either straight barbell or EZ barbell can be used. See Lying Triceps Extension Bench with rack.',1,'2021-06-27 13:39:40',NULL,NULL,0),(176,181,'With arms fully extended, bar can be brought back over shoulders. Shoulders can be internally rotated between repetitions as needed to allow for relative release of tension in muscles. Either straight barbell or EZ barbell can be used.',1,'2021-06-27 13:39:40',NULL,NULL,0),(177,180,'Let barbell pull arm back to maintain full shoulder flexion. Exercise may be performed standing or on seat with or without back support. Either straight barbell or EZ barbell can be used.',1,'2021-06-27 13:39:40',NULL,NULL,0),(178,182,'Let cable resistance pull arm back to maintain degree of shoulder flexion, dependent upon flexibility.',1,'2021-06-27 13:39:40',NULL,NULL,0),(179,183,'Keep elbow approximately same position throughout movement.',1,'2021-06-27 13:39:40',NULL,NULL,0),(180,184,'Avoid using shoulders by attempting to press bar over head. If incline is designed to pivot back, lean seat back for mount & dismount.',1,'2021-06-27 13:39:40',NULL,NULL,0),(181,185,'Let cable resistance pull arm back to maintain degree of shoulder flexion, dependent upon flexibility.',1,'2021-06-27 13:39:40',NULL,NULL,0),(182,186,'With arms fully extended, shoulders can be internally rotated between repetitions as needed to allow for relative release of tension in muscles.',1,'2021-06-27 13:39:40',NULL,NULL,0),(183,187,'Let cable attachment pull arm back to maintain full shoulder flexion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(184,188,'A very low pulley and/or high decline is needed to achieve full range of motion at bottom position. With arms fully extended, shoulders can be internally rotated between repetitions as needed to allow for relative release of tension in muscles.',1,'2021-06-27 13:39:40',NULL,NULL,0),(185,189,'Position face close to cable to provide resistance at top of motion. Elbows is brought close to body so arms are vertical at bottom of motion, either at or near the end of full extension, or in one movement as bar is pushed downward.',1,'2021-06-27 13:39:40',NULL,NULL,0),(186,190,'The elbow can travel up slightly at top of motion. Stay close to cable to provide resistance at top of motion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(187,191,'The elbow can travel up slightly at top of motion. Stay close to cable to provide resistance at top of motion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(188,192,'If seat is positioned back behind pulleys as shown, bending forward can provide resistance at top of motion. See Angle of Pull.',1,'2021-06-27 13:39:40',NULL,NULL,0),(189,193,'Wrist can be flexed slightly at top of movement to compensate for hyperextension required at bottom of movement. The elbow can travel up slightly at top of motion. Stay close to cable to provide resistance at top of motion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(190,194,'Stand far enough away from pulley to keep cable taut in lowered position. Keep elbow approximately same position throughout movement.',1,'2021-06-27 13:39:40',NULL,NULL,0),(191,195,'The elbow can travel up slightly at top of motion. Stay close to cable to provide resistance at top of motion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(192,197,'The elbow can travel up few inches at top of motion. Step close to cable to provide resistance at top of motion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(193,196,'Keep back against back pad throughout exercise.',1,'2021-06-27 13:39:40',NULL,NULL,0),(194,198,'If high pulley is adjustable, lower pulley slightly to provide resistance at top of motion. If high pulley is fixed, position bench distance away from cable column. If incline is positioned too high, range of motion at lower position may be compromised.',1,'2021-06-27 13:39:40',NULL,NULL,0),(195,200,'If cable dip machine is not available, A dip bar placed in front of low pully cable. Also see rear view and Cable Chest Dip.',1,'2021-06-27 13:39:40',NULL,NULL,0),(196,199,'Let cable pull arm back to maintain full shoulder flexion. Exercise can also be performed on traditional low pulley setup. Also see exercise with Pronated Grip.',1,'2021-06-27 13:39:40',NULL,NULL,0),(197,201,'Let cable attachment pull arm back to maintain full shoulder flexion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(198,202,'Let cable pull arm back to maintain full shoulder flexion. Also see exercise with Supinated Grip.',1,'2021-06-27 13:39:40',NULL,NULL,0),(199,203,'Let dumbbell pull back arm slightly to maintain full shoulder flexion. Keep elbow in so movement does not turn into overhead press. Back support sho\n\n\nuld not be so high that it interferes with dumbbell being completely lowered (i.e. full range of motion). See rear view. Exercise may be performed on bench without back support.',1,'2021-06-27 13:39:40',NULL,NULL,0),(200,204,'With arms fully extended, dumbbells can be brought to upper chest between repetitions as needed to allow for relative release of tension in muscles.',1,'2021-06-27 13:39:40',NULL,NULL,0),(201,205,'For greater range of motion, upper arm can be positioned with elbow slightly higher than shoulder. Also see Triceps Kickback Errors.',1,'2021-06-27 13:39:40',NULL,NULL,0),(202,206,'Keep elbows pointed up or just slightly back throughout movement.',1,'2021-06-27 13:39:40',NULL,NULL,0),(203,207,'Let cable attachment pull arm back to maintain full shoulder\nflexion.\n\n\nExercise can also\nbe performed seated on bench or seat with back support just below\nshoulders.',1,'2021-06-27 13:39:40',NULL,NULL,0),(204,208,'Movement can also be performed on old fashioned incline bench without seat.',1,'2021-06-27 13:39:40',NULL,NULL,0),(205,209,'Position wrists closer together to keep elbows from pointing out too much. Let dumbbell pull back arm to maintain full shoulder flexion. Consider using seat with back support as illustrated. Back support should not be so high that it interferes with dumbbell being completely lowered (i.e. full range of motion). If shoulder flexion flexibility is not adequate, position hips slightly forward (as illustrated) so elbows are positioned upward. Position body more upright if shoulder flexion flexibility is adequate. See suggested mount & dismount.',1,'2021-06-27 13:39:40',NULL,NULL,0),(206,210,'Let dumbbell pull back arm to maintain full shoulder flexion. Consider using seat with back support.',1,'2021-06-27 13:39:40',NULL,NULL,0),(207,211,'Hands will be closer together at top of movement as compared to Barbell Close Grip Bench Press since lever arms travel inward at top of motion. Also see Bench Press Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(208,212,'Grip can be slightly narrower than shoulder width but not too close. Also see Bench Press Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(209,213,'When finished, push foot lever down, release handles, then release foot lever.',1,'2021-06-27 13:39:40',NULL,NULL,0),(210,214,'When finished, push foot lever down, release handles, then release foot lever.',1,'2021-06-27 13:39:40',NULL,NULL,0),(211,215,'Also see movement performed on alternative machine.',1,'2021-06-27 13:39:40',NULL,NULL,0),(212,216,'In effort to achieve fuller range of motion, head can be positioned down so handles can clear over head. With heavy resistance, back pad will need to be adjusted to keep torso close to arm pad. Position armpit to rest near top of pad. Back of upper arm should remain on pad throughout movement.',1,'2021-06-27 13:39:40',NULL,NULL,0),(213,217,'Also see Lever Chest Dip.',1,'2021-06-27 13:39:40',NULL,NULL,0),(214,218,'With heavy resistance, back pad will need to be adjusted to keep torso close to arm pad. Adjust seat height so back of upper arms rest on padding. If seat is too high, shoulder will need to rise near end of extension to complete final range of motion since forearms will make contact with pad before lockout. If seat is too low, range of motion will be compromised because elbows will not be completely flexed at beginning of movement. Also see Lever Triceps Extension on alternative apparatus.',1,'2021-06-27 13:39:40',NULL,NULL,0),(215,219,'See exercise on alternative machine. Also see Lever Chest Dip on machine facing away from fulcrum and Lever Chest Dip.',1,'2021-06-27 13:39:40',NULL,NULL,0),(216,220,'If lever arms freely move together or apart, keep moderately close grip throughout movement. Triceps will not be as involved in movement if grip is lower than chest. Seat height should be adjusted so bar is at least lower chest height. Also Lever Parallel Grip Bench Press for chest.',1,'2021-06-27 13:39:40',NULL,NULL,0),(217,222,'Also Lever Parallel Grip Incline Bench Press for upper chest.',1,'2021-06-27 13:39:40',NULL,NULL,0),(218,223,'If machine has secondary lever (as shown), elbows do not have to be exactly aligned with primary fulcrum.',1,'2021-06-27 13:39:40',NULL,NULL,0),(219,224,'With heavy resistance, back pad will need to be adjusted to keep torso close to arm pad. Adjust seat height, so back of upper arms rest on padding. If seat is too high, shoulder will need to rise near end of extension to complete final range of motion since forearms will make contact with pad before lockout. If seat is too low, range of motion will be compromised because elbows will not be completely flexed at beginning of movement. If machine has secondary lever (as shown), elbows do not have to be exactly aligned with primary fulcrum. Also see Lever Triceps Extension on alternative apparatus.',1,'2021-06-27 13:39:40',NULL,NULL,0),(220,225,'This particular machine design is rare. See typical dip machines:​​​​',1,'2021-06-27 13:39:40',NULL,NULL,0),(221,226,'Grip can be slightly narrower than shoulder width but not too close. Also see Bench Press Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(222,228,'Also see parallel grip Lever Triceps Dip and Lever Chest Dip.',1,'2021-06-27 13:39:40',NULL,NULL,0),(223,229,'Grip can be slightly narrower than shoulder width but not too close. Also see Bench Press Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(224,230,'Bench height should allow for full range of motion. If assistant is not available, place weight on lap sitting on floor or edge of bench.',1,'2021-06-27 13:39:40',NULL,NULL,0),(225,231,'Also see Weighted Chest Dips.',1,'2021-06-27 13:39:40',NULL,NULL,0),(226,232,'Both upper and lower body must be kept straight throughout movement. Exercise can be performed without additional weight (See Close Grip Pushup without weight). If additional weight is used, partner will need to add and remove weight, and keep weight from sliding off back. See wider grip push-up.',1,'2021-06-27 13:39:40',NULL,NULL,0),(227,233,'Both upper and lower body must be kept straight throughout movement. Forefeet can remain on floor as long as body is pivoting on knees. Also see close grip variation and wider grip push-ups on knees.',1,'2021-06-27 13:39:40',NULL,NULL,0),(228,234,'Bench height should allow for full range of motion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(229,235,'Both upper and lower body must be kept straight throughout movement. See wider grip push-up.',1,'2021-06-27 13:39:40',NULL,NULL,0),(230,236,'Bench height should allow for full range of motion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(231,237,'Also see Band-assisted Chest Dips.',1,'2021-06-27 13:39:40',NULL,NULL,0),(232,238,'Bench height should allow for full range of motion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(233,240,'Also see Chest Dips.',1,'2021-06-27 13:39:40',NULL,NULL,0),(234,241,'Instead of 1 Triceps Rope (as shown), 2 ab slings or 2 nylon/cloth Stirrups with long straps can also be used (see how to loop cable stirrup onto bar) with overhand grip. Both upper and lower body must be kept straight throughout movement. Height of bar affects difficulty of movement. See Gravity Vectors for greater understanding of how body angle influences resistance. Also see Suspended Triceps Extension with Suspension Trainer.',1,'2021-06-27 13:39:40',NULL,NULL,0),(235,242,'Both upper and lower body must be kept straight throughout movement. Height of bar affects difficulty of movement. See Gravity Vectors for greater understanding of how body angle influences resistance. Also see wider grip push-up.',1,'2021-06-27 13:39:40',NULL,NULL,0),(236,243,'In above clip, hands are positioned at ends of main segments of benches with fingers between gaps. On standard benches, hands should be placed near ends of benches. Perform on higher benches if slight stretch is not felt. Also see Bench Dip and Chest Dip (between benches).',1,'2021-06-27 13:39:40',NULL,NULL,0),(237,244,'If lower body is used for assistance, Quadriceps are utilized. Hips are kept straighter and body more upright, as compared to Assisted Chest Dip. This exercise can be performed on adjustable length gymnastics rings or a dual anchored suspension trainer.',1,'2021-06-27 13:39:40',NULL,NULL,0),(238,245,'In above clip, hands are positioned at ends of main segments of benches with fingers between gaps. On standard benches, hands should be placed near ends of benches. Perform on higher benches if slight stretch is not felt. Also see Bench Dip (bent knee) and Chest Dip (bent knees between benches).',1,'2021-06-27 13:39:40',NULL,NULL,0),(239,247,'This exercise can be performed on adjustable length gymnastics rings or a dual anchored suspension trainer. To emphasize triceps, position body more upright than demonstrated by positioning hips straighter. Also see Chest Dips.',1,'2021-06-27 13:39:40',NULL,NULL,0),(240,246,'Both upper and lower body should be kept straight throughout movement. Angle of body affects difficulty of movement. See Gravity Vectors for greater understanding of how body angle influences resistance. Also see Suspended Triceps Extension with Triceps Rope. This exercise can be performed on TRXⓇ style suspension trainer or adjustable length gymnastics rings.',1,'2021-06-27 13:39:40',NULL,NULL,0),(241,249,'None.',1,'2021-06-27 13:39:40',NULL,NULL,0),(242,250,'See Overhead Lat Stretch for similar exercise which can be performed with this stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(243,251,'See PNF Overhead Lat Stretch for similar exercise which can be performed with this stretch. Also see Overhead Triceps Stretch for similar static stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(244,252,'If lower body is used for assistance, Quadriceps are utilized. Hips are kept straighter and body more upright, as compared to Assisted Chest Dip.',1,'2021-06-27 13:39:40',NULL,NULL,0),(245,253,'When elbow is fully flexed, it can travel forward slightly, allowing forearm to be no more than vertical. This additional movement allows for relative release of tension in muscles between repetitions. Pulleys should not be too far apart. Cables can be positioned under shoulders with ad hoc or customized set up. See Cable Seated Curl and movement performed on apparatus facing double low pulleys.\nAlso see mechanical analysis of arm curl and question regarding elbow position.',1,'2021-06-27 13:39:40',NULL,NULL,0),(246,254,'When elbow is fully flexed, it can travel forward slightly, allowing forearm to be no more than vertical. This additional movement allows for relative release of tension in muscles between repetitions. Pulleys should not be too far apart.\nAlso see mechanical analysis of arm curl and question regarding elbow position.',1,'2021-06-27 13:39:40',NULL,NULL,0),(247,255,'Bringing ebows back forward, allowing forearms to be no more than vertical, permits a relative release of tension in muscles between repetitions. Exercise can also be performed with EZ barbell, in which case, making it also known as EZ Barbell or EZ Bar Drag Curl. Also see standard Barbell Curl.',1,'2021-06-27 13:39:40',NULL,NULL,0),(248,256,'When elbows are fully flexed, they can travel forward slightly allowing forearms to be no more than vertical. This additional movement allows for relative release of tension in muscles between repetitions. Exercise can also be performed with straight barbell. Movement with cambered bar as shown above is also known as EZ Barbell Curl or EZ Bar Curl. Also see mechanical analysis of arm curl and question regarding elbow position.',1,'2021-06-27 13:39:40',NULL,NULL,0),(249,257,'When elbows are fully flexed, they can travel forward slightly, allowing forearms to be no more than vertical. This additional movement allows for relative release of tension in muscles between repetitions.',1,'2021-06-27 13:39:40',NULL,NULL,0),(250,259,'When elbows are fully flexed, they can travel slightly forward, allowing forearms to be no more than vertical. This additional movement allows for relative release of tension in muscles between repetitions.',1,'2021-06-27 13:39:40',NULL,NULL,0),(251,258,'When elbows are fully flexed, they can travel forward slightly, allowing forearms to be no more than vertical. This additional movement allows for relative release of tension in muscles between repetitions. Pulleys should not be too far apart. Cables can be positioned under shoulders with ad hoc or customized set up. Also see Cable Alternating Seated Curl.',1,'2021-06-27 13:39:40',NULL,NULL,0),(252,260,'An alternative method is to stand facing with side of exercise arm toward low pulley. When elbow is fully flexed, it can travel forward slightly allowing forearms to be no more than vertical. This additional movement allows for relative release of tension in muscles between repetitions.\nAlso see mechanical analysis of arm curl and question regarding elbow position.',1,'2021-06-27 13:39:40',NULL,NULL,0),(253,261,'When elbow is fully flexed, it can travel forward slightly, allowing forearm to be no more than vertical. This additional movement allows for relative release of tension in muscles between repetitions. Pulleys should not be too far apart.',1,'2021-06-27 13:39:40',NULL,NULL,0),(254,262,'When elbows are fully flexed, they can travel upward, slightly allowing forearms to be no more than horizontal in this lying posture. This additional movement allows for relative release of tension in muscles between repetitions.\nAlso see mechanical analysis of arm curl and question regarding elbow position.',1,'2021-06-27 13:39:40',NULL,NULL,0),(255,263,'Biceps may be exercised alternating (as described), simultaneous, or in simultaneous-alternating fashion. When elbow is fully flexed, it can travel forward slightly, allowing forearms to be no more than vertical. This additional movement allows for relative release of tension in muscles between repetitions. Also see mechanical analysis of arm curl and question regarding elbow position.',1,'2021-06-27 13:39:40',NULL,NULL,0),(256,264,'Bar height can be adjusted to vary resistance. See Gravity Vectors for greater understanding of body angle influences resistance. Also known as Underhand Body Row or Underhand Supine Row.',1,'2021-06-27 13:39:40',NULL,NULL,0),(257,265,'The biceps may be exercised simultaneous. If machine does not provide support for back of arm, keep elbows from traveling back, particularly during initial flexion. Some machines do not offer adequate resistance at initial range of motion. Consider positioning wrists with slight flexion to compensate.',1,'2021-06-27 13:39:40',NULL,NULL,0),(258,267,'A stationary bar can also be used instead of wall.',1,'2021-06-27 13:39:40',NULL,NULL,0),(259,268,'Instead of scooting hips forward, hands can be eased backwards.',1,'2021-06-27 13:39:40',NULL,NULL,0),(260,266,'The biceps may be exercised alternating or simultaneous. If machine does not provide support for back of arm, keep elbows from traveling back, particularly during initial flexion. Some machines do not offer adequate resistance at initial range of motion. Consider positioning wrists with slight flexion to compensate.',1,'2021-06-27 13:39:40',NULL,NULL,0),(261,269,'This exercise may be performed by alternating (as described), simultaneous, or in simultaneous-alternating fashion. When elbow is fully flexed, it can travel forward slightly, allowing forearms to be no more than vertical. This additional movement allows for relative release of tension in muscles between repetitions. Also see mechanical analysis of arm curl and question regarding elbow position.',1,'2021-06-27 13:39:40',NULL,NULL,0),(262,271,'Fixed bar should be just high enough to allow arm to fully extend. See Gravity Vectors for greater understanding of how body angle influences resistance. Also known as Underhand Body Row or Underhand Supine Row.',1,'2021-06-27 13:39:40',NULL,NULL,0),(263,270,'Easier',1,'2021-06-27 13:39:40',NULL,NULL,0),(264,272,'None.',1,'2021-06-27 13:39:40',NULL,NULL,0),(265,273,'Participant\'s wrists must continue to face downward. See PNF stretch techniques. Also see Seated Biceps Stretch for similar static stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(266,274,'A stationary bar can also be used instead of wall.',1,'2021-06-27 13:39:40',NULL,NULL,0),(267,275,'Seat should be adjusted to allow arm pit to rest near top of pad. Back of upper arm should remain on pad throughout movement. The long head (lateral head) of biceps brachii is activated significantly more than short head (medial head) of biceps brachii since short head enters into active insufficiency as it continues to contract. At bottom position, weight stack in use should not make contact with remaining weight stack. Also see movement on horizontal pad.',1,'2021-06-27 13:39:40',NULL,NULL,0),(268,276,'Seat should be adjusted to allow arm pit to rest near top of pad. Back of upper arms should remain on pad throughout movement. The long head (lateral head) of biceps brachii is activated significantly more than short head (medial head) of biceps brachii since short head enters into active insufficiency as it continues to contract. At bottom position, weight stack in use should not make contact with remaining weight stack.',1,'2021-06-27 13:39:40',NULL,NULL,0),(269,277,'The long head (lateral head) of biceps brachii is activated significantly more than short head (medial head) of biceps brachii since short head enters into active insufficiency as it continues to contract.',1,'2021-06-27 13:39:40',NULL,NULL,0),(270,281,'Feet can be staggered and bent slightly (if needed) to allow\narm pit to rest near top of pad.\n\n\nBack\nof upper arm should remain on pad throughout movement. The long\nhead (lateral head) of biceps brachii is activated significantly\nmore than short head (medial head) of biceps brachii since short\nhead enters into\nactive\ninsufficiency\n as it continues to contract. At bottom position,\nweight stack in use should not make contact with remaining weight\nstack. Also see movement on\nhorizontal pad.',1,'2021-06-27 13:39:40',NULL,NULL,0),(271,280,'Also known as Barbell Spider Curl. The long head (lateral head) of biceps brachii is activated significantly more than short head (medial head) of biceps brachii since short head enters into active insufficiency as it continues to contract.',1,'2021-06-27 13:39:40',NULL,NULL,0),(272,278,'Seat should be adjusted to allow arm pit to rest near top of pad. Back of upper arms should remain on pad throughout movement. The long head (lateral head) of biceps brachii is activated significantly more than short head (medial head) of biceps brachii since short head enters into active insufficiency as it continues to contract. At bottom position, weight stack in use should not make contact with remaining weight stack.',1,'2021-06-27 13:39:40',NULL,NULL,0),(273,279,'Stirrup can be hung from one side of rack for easier access.\nFeet can be staggered and bent slightly (if needed) to allow\narm pit to rest near top of pad. Back of upper arm should remain\non pad throughout movement. The long head (lateral head) of biceps\nbrachii is activated significantly more than short head (medial\nhead) of biceps brachii since short head enters into\nactive\ninsufficiency\n as it continues to contract. At bottom position,\nweight stack in use should not make contact with remaining weight\nstack.',1,'2021-06-27 13:39:40',NULL,NULL,0),(274,282,'Body should be positioned to allow arm pit to rest near top of pad. Back of upper arm should remain on pad throughout movement. The long head (lateral head) of biceps brachii is activated significantly more than short head (medial head) of biceps brachii since short head enters into active insufficiency as it continues to contract.',1,'2021-06-27 13:39:40',NULL,NULL,0),(275,283,'Seat should be adjusted to allow arm pit to rest near top of pad. Back of upper arm should remain on pad throughout movement. The long head (lateral head) of biceps brachii is activated significantly more than short head (medial head) of biceps brachii since short head enters into active insufficiency as it continues to contract.',1,'2021-06-27 13:39:40',NULL,NULL,0),(276,284,'Also known as Cable Spider Curl. The long head (lateral head) of biceps brachii is activated significantly more than short head (medial head) of biceps brachii since short head enters into active insufficiency as it continues to contract.',1,'2021-06-27 13:39:40',NULL,NULL,0),(277,285,'Seat should be adjusted to allow arm pit to rest near top of pad. Back of upper arm should remain on pad throughout movement. The long head (lateral head) of biceps brachii is activated significantly more than short head (medial head) of biceps brachii since short head enters into active insufficiency as it continues to contract. At bottom position, weight stack in use should not make contact with remaining weight stack.',1,'2021-06-27 13:39:40',NULL,NULL,0),(278,286,'Seat should be adjusted to allow arm pit to rest near top of pad. Back of upper arm should remain on pad throughout movement. Long head (lateral head) of biceps brachii is activated significantly more than short head (medial head) of biceps brachii since short head enters into active insufficiency as it continues to contract.',1,'2021-06-27 13:39:40',NULL,NULL,0),(279,287,'The long head (lateral head) of biceps brachii is activated significantly more than short head (medial head) of biceps brachii since short head enters into active insufficiency as it continues to contract.',1,'2021-06-27 13:39:40',NULL,NULL,0),(280,288,'Seat should be adjusted to allow arm pit to rest near top of pad. Back of upper arm should remain on pad throughout movement. If no resistance is experienced during initial range of motion, make sure seat is adjusted to allow for back of arm to be positioned flush against arm pad. If resistance is still not experienced, consider keeping wrists in a slight flexed position to compensate. If machine has secondary lever (as shown), it is not as essential to position elbows in-line with the primary fulcrum, as would otherwise be required.',1,'2021-06-27 13:39:40',NULL,NULL,0),(281,289,'Back of upper arms should remain on pad throughout movement. If machine has secondary lever (as shown), it is not as essential to position elbows in-line with the primary fulcrum, as would otherwise be required.',1,'2021-06-27 13:39:40',NULL,NULL,0),(282,290,'Also known as Dumbbell Spider Curl. The long head (lateral head) of biceps brachii is activated significantly more than short head (medial head) of biceps brachii since short head enters into active insufficiency as it continues to contract.',1,'2021-06-27 13:39:40',NULL,NULL,0),(283,291,'Body should be positioned to allow arm pit to rest near top of pad. Back of upper arm should remain on pad throughout movement. Long head (lateral head) of biceps brachii is activated significantly more than short head (medial head) of biceps brachii since short head enters into active insufficiency as it continues to contract.',1,'2021-06-27 13:39:40',NULL,NULL,0),(284,292,'Back of upper arms should remain on pad throughout movement. If machine has secondary lever (as shown), elbows can be positioned further away from primary fulcrum. Long head (lateral head) of biceps brachii is activated significantly more than short head (medial head) of biceps brachii since short head enters into active insufficiency as it continues to contract. Long head of Triceps Brachii is only significantly activated as antagonist stabilizer when it approaches passive insufficiency as elbow nears full flexion. See exercise performed with both arms simultaneously.',1,'2021-06-27 13:39:40',NULL,NULL,0),(285,293,'Position armpit to rest near top of pad. Back of upper arm should remain on pad throughout movement. Notice that this machine has secondary lever so elbows are not aligned with primary fulcrum. Also see movement performed with narrow grip. The particular machine shown doubles as Triceps Extension Machine by placing weight on opposite side of fulcrum.',1,'2021-06-27 13:39:40',NULL,NULL,0),(286,294,'Back of upper arms should remain on pad throughout movement. If machine has secondary lever (as shown), it is not as essential to position elbows in-line with the primary fulcrum, as would otherwise be required.',1,'2021-06-27 13:39:40',NULL,NULL,0),(287,295,'Seat should be adjusted to allow arm pit to rest near top of pad. Back of upper arm should remain on pad throughout movement. If machine has secondary lever (as shown), it is not as essential to position elbows in-line with the primary fulcrum, as would otherwise be required. Long head (lateral head) of biceps brachii is activated significantly more than short head (medial head) of biceps brachii since short head enters into active insufficiency as it continues to contract.',1,'2021-06-27 13:39:40',NULL,NULL,0),(288,296,'Back of upper arms should remain on pad throughout movement. If machine has secondary lever (as shown), elbows can be positioned further away from primary fulcrum. Long head (lateral head) of biceps brachii is activated significantly more than short head (medial head) of biceps brachii since short head enters into active insufficiency as it continues to contract. Long head of Triceps Brachii is only significantly activated as antagonist stabilizer when it approaches passive insufficiency as elbow nears full flexion. See exercise performed with both arms simultaneously.',1,'2021-06-27 13:39:40',NULL,NULL,0),(289,297,'Dismounting can be achieved by walking backward until body is upright. Also known as Suspended Biceps Curl, arguably somewhat of a misnomer. The positioning of arms, with elbows high, places short head (medial head) of Bicep Brachii in active insufficiency as arm continues to flex. The long head of Biceps Brachii (lateral head) and in particular, Brachialis are primary movers in this position.',1,'2021-06-27 13:39:40',NULL,NULL,0),(290,298,'Position armpit to rest near top of pad. Back of upper arm should remain on pad throughout movement. Notice that this machine has secondary lever so elbows are not aligned with primary fulcrum. This particular machine also features a weight pack that can be positioned closer or further away from fulcrum thereby making resistance easier or harder.',1,'2021-06-27 13:39:40',NULL,NULL,0),(291,299,'Body should be positioned to allow arm pit to rest near top of pad. Back of upper arm should remain on pad.',1,'2021-06-27 13:39:40',NULL,NULL,0),(292,300,'When elbows are fully flexed, they can travel forward slightly, allowing forearms to be no more than vertical. This additional movement allows for relative release of tension in muscles between repetitions.',1,'2021-06-27 13:39:40',NULL,NULL,0),(293,301,'When elbows are fully flexed, they can travel forward slightly, allowing forearms to be no more than vertical. This additional movement allows for relative release of tension in muscles between repetitions.',1,'2021-06-27 13:39:40',NULL,NULL,0),(294,302,'When elbows are fully flexed, they can travel forward, slightly allowing forearms to be no more than vertical. This additional movement allows for relative release of tension in muscles between repetitions.',1,'2021-06-27 13:39:40',NULL,NULL,0),(295,303,'When elbows are fully flexed, they can travel slightly forward, allowing forearms to be no more than vertical. This additional movement allows for relative release of tension in muscles between repetitions.',1,'2021-06-27 13:39:40',NULL,NULL,0),(296,304,'The biceps may be exercised alternating (as described), simultaneous, or in simultaneous-alternating fashion. When elbows are fully flexed, they can travel forward slightly allowing forearms to be no more than vertical. This additional movement allows for relative release of tension in muscles between repetitions.',1,'2021-06-27 13:39:40',NULL,NULL,0),(297,306,'Seat should be adjusted to allow arm pit to rest near top of pad. Back of upper arm should remain on pad. If machine has secondary lever, elbows can be positioned further away from primary fulcrum.',1,'2021-06-27 13:39:40',NULL,NULL,0),(298,305,'The biceps may be exercised alternating or simultaneous. If machine does not provide support for back of arm, keep elbows from traveling back, particularly during initial flexion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(299,307,'Feet can be staggered and bent slightly (if needed) to allow\narm pit to rest near top of pad. Back of upper arm should remain\non pad. At bottom position, weight stack in use should not make\ncontact with remaining weight stack.',1,'2021-06-27 13:39:40',NULL,NULL,0),(300,308,'Seat should be adjusted to allow arm pit to rest near top of pad. Back of upper arm should remain on pad.',1,'2021-06-27 13:39:40',NULL,NULL,0),(301,309,'Seat should be adjusted to allow arm pit to rest near top of pad. Back of upper arm should remain on pad. At bottom position, weight stack in use should not make contact with remaining weight stack.',1,'2021-06-27 13:39:40',NULL,NULL,0),(302,310,'Wrist Extensors can also be stretched in this position by flexing forward wrist so hands bend toward side of forward arm. The arm can be crossed to stretch opposite wrist.',1,'2021-06-27 13:39:40',NULL,NULL,0),(303,311,'Seat should be adjusted to allow arm pit to rest near top of pad. Back of upper arm should remain on pad. If machine has secondary lever, elbows can be positioned further away from primary fulcrum.',1,'2021-06-27 13:39:40',NULL,NULL,0),(304,312,'None.',1,'2021-06-27 13:39:40',NULL,NULL,0),(305,313,'Some units, as one illustrated above, may be placed on sturdy table top or on floor. Keep forearm flat on padded platform throughout exercise.',1,'2021-06-27 13:39:40',NULL,NULL,0),(306,314,'Hand may be placed under wrist (as demonstrated) to offer stability and to maintain horizontal orientation of forearm.',1,'2021-06-27 13:39:40',NULL,NULL,0),(307,315,'Keep elbows approximately wrist height to maintain resistance through full range of motion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(308,316,'If half loaded dumbbell is not available, one of two substitutes can be used.',1,'2021-06-27 13:39:40',NULL,NULL,0),(309,317,'None.',1,'2021-06-27 13:39:40',NULL,NULL,0),(310,319,'Also see muscles for finger articulations and thumb articulations.',1,'2021-06-27 13:39:40',NULL,NULL,0),(311,318,'Keep elbow approximately wrist height to maintain resistance through full range of motion. Hand may be placed under wrist to offer stability and to maintain horizontal orientation of forearm.',1,'2021-06-27 13:39:40',NULL,NULL,0),(312,320,'Also see muscles for finger articulations and thumb articulations. See lever grip up close.',1,'2021-06-27 13:39:40',NULL,NULL,0),(313,321,'Keep forearms horizontal, flat on arm pads throughout exercise. See wrist curl up close.',1,'2021-06-27 13:39:40',NULL,NULL,0),(314,322,'None.',1,'2021-06-27 13:39:40',NULL,NULL,0),(315,323,'See sled grip up close. Also see muscles for finger articulations and thumb articulations.',1,'2021-06-27 13:39:40',NULL,NULL,0),(316,324,'Also see muscles for finger articulations and thumb articulations.',1,'2021-06-27 13:39:40',NULL,NULL,0),(317,325,'Also see muscles for finger articulations and thumb articulations.',1,'2021-06-27 13:39:40',NULL,NULL,0),(318,326,'Also see Lever Roller Wrist Extension.',1,'2021-06-27 13:39:40',NULL,NULL,0),(319,327,'None',1,'2021-06-27 13:39:40',NULL,NULL,0),(320,329,'Keep arms straight.',1,'2021-06-27 13:39:40',NULL,NULL,0),(321,330,'None',1,'2021-06-27 13:39:40',NULL,NULL,0),(322,331,'Keep elbows straight.',1,'2021-06-27 13:39:40',NULL,NULL,0),(323,332,'Exercise is performed on specialized piece of equipment which includes knobs at each end of wrist roller.',1,'2021-06-27 13:39:40',NULL,NULL,0),(324,328,'See exercise on alternative machine. Also see muscles for finger articulations and thumb articulations.',1,'2021-06-27 13:39:40',NULL,NULL,0),(325,333,'If half loaded dumbbell is not available, one of two substitutes can be used.',1,'2021-06-27 13:39:40',NULL,NULL,0),(326,334,'Do not allow elbows to rise.',1,'2021-06-27 13:39:40',NULL,NULL,0),(327,335,'Keep elbow approximately wrist height to maintain resistance through full range of motion. Hand may be placed under wrist to offer stability and to maintain horizontal orientation of forearm.',1,'2021-06-27 13:39:40',NULL,NULL,0),(328,336,'None.',1,'2021-06-27 13:39:40',NULL,NULL,0),(329,337,'Do not allow elbow to rise. Hand may be placed under wrist (as demonstrated) to offer stability and to maintain horizontal orientation of forearm.',1,'2021-06-27 13:39:40',NULL,NULL,0),(330,338,'Keep elbows approximately wrist height to maintain resistance through full range of motion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(331,340,'None.',1,'2021-06-27 13:39:40',NULL,NULL,0),(332,339,'Some units, as one illustrated above, may be placed on sturdy table top or on floor. Keep forearm flat on padded platform throughout exercise.',1,'2021-06-27 13:39:40',NULL,NULL,0),(333,341,'Keep forearms horizontal, flat on arm pads throughout exercise. See reverse wrist curl up close.',1,'2021-06-27 13:39:40',NULL,NULL,0),(334,342,'Exercise is performed on specialized piece of equipment which includes knobs at each end of wrist roller.',1,'2021-06-27 13:39:40',NULL,NULL,0),(335,343,'Elbow may be extended first, followed by pulling palm toward forearm. Brachioradialis can also be stretched by positioining downward or back (ie: external rotation of shoulder)',1,'2021-06-27 13:39:40',NULL,NULL,0),(336,344,'Keep elbows straight.',1,'2021-06-27 13:39:40',NULL,NULL,0),(337,346,'If unilaterally loaded dumbbell, or \"half dumbbell\" is not available, grasp conventional dumbbell to one side of handle with thumb against inside surface.',1,'2021-06-27 13:39:40',NULL,NULL,0),(338,347,'Depending on participant\'s range of motion and machine\'s design, handles may need to be prerotated so resistance is present throughout movement, particularly initial phase of rotation. See forearm pronation up close.',1,'2021-06-27 13:39:40',NULL,NULL,0),(339,345,'Pad or firm pillow (ball pictured) may be placed between hip and arm. Elevation of elbow allows resistance during initial range of motion. This exercise can also be performed seated by corner of table higher than shoulder height (See Dumbbell Seated Pronation. If unilaterally loaded dumbbell, or \"half dumbbell\" is not available, grasp conventional dumbbell to one side of handle with thumb against inside surface. Also see Dumbbell Lying Pronation with arm down.',1,'2021-06-27 13:39:40',NULL,NULL,0),(340,348,'Depending on participant\'s range of motion and machine\'s design, handle may need to be prerotated so resistance is present throughout movement, particularly initial phase of rotation.',1,'2021-06-27 13:39:40',NULL,NULL,0),(341,349,'Bench can be flat or slightly incline (0-30 degrees) so resistance occurs during initial range of motion. If unilaterally loaded dumbbell, or \"half dumbbell\" is not available, grasp conventional dumbbell to one side of handle with pinkie against inside surface. Also see conventiontal Dumbbell Lying Pronation.',1,'2021-06-27 13:39:40',NULL,NULL,0),(342,350,'Depending on participant\'s range of motion and machine\'s design, handle may need to be prerotated so resistance is present throughout movement, particularly initial phase of rotation.',1,'2021-06-27 13:39:40',NULL,NULL,0),(343,351,'Bench can be flat or slightly incline (0-30 degrees) so resistance occurs during final range of motion. If unilaterally loaded dumbbell, or \"half dumbbell\" is not available, grasp conventional dumbbell to one side of handle with thumb against inside surface. Also see conventional Dumbbell Lying Supination.',1,'2021-06-27 13:39:40',NULL,NULL,0),(344,352,'Pad or firm pillow may be placed between hip and arm. Elevation of elbow allows resistance during final range of motion. If unilaterally loaded dumbbell, or \"half dumbbell\" is not available, grasp conventional dumbbell to one side of handle with pinkie against inside surface. Also see Dumbbell Lying Supination with arm down. This exercise can also be performed seated by corner of table higher than shoulder height (See Seated Supination).',1,'2021-06-27 13:39:40',NULL,NULL,0),(345,353,'If unilaterally loaded dumbbell, or \"half dumbbell\" is not available, grasp conventional dumbbell to one side of handle with pinkie against inside surface.',1,'2021-06-27 13:39:40',NULL,NULL,0),(346,354,'Depending on participant\'s range of motion and machine\'s design, handles may need to be prerotated so resistance is present throughout movement, particularly initial phase of rotation. See forearm supination up close.',1,'2021-06-27 13:39:40',NULL,NULL,0),(347,355,'Torso may be kept horizontal for strict execution. Knees are bent in effort to keep low back straight (See Hamstring Inflexibility). If low back becomes rounded due to tight hamstrings, either try bending knees more or don\'t position torso as low. Either fix may compromise involvement of Latissimus Dorsi since it forces more shoulder transverse extension and less shoulder extension range of motion. If low back is rounded due to poor form, deadlift weight to standing position and lower torso into horizontal position with knees bent and back straight. A shoulder width or underhand grip can increase lat involvement by emphasizing shoulder extension over transverse extension.',1,'2021-06-27 13:39:40',NULL,NULL,0),(348,356,'Begin with light weight and add additional weight gradually to allow lower back adequate adaptation. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch. Full range of motion through lower back will vary from person to person. See Cable Seated Row Question. Also see Cable Straight Back Incline Row and Dangerous Exercise Essay.',1,'2021-06-27 13:39:40',NULL,NULL,0),(349,357,'Bench should be high enough to allow shoulders to stretch forward without barbell hitting floor.',1,'2021-06-27 13:39:40',NULL,NULL,0),(350,358,'Also see Cable Incline Row.',1,'2021-06-27 13:39:40',NULL,NULL,0),(351,359,'Torso may be kept horizontal for strict execution. Knees are bent in effort to keep low back straight (See Hamstring Inflexibility). If low back becomes rounded due to tight hamstrings, either try bending knees more or don\'t position torso as low. Either fix may compromise involvement of Latissimus Dorsi since it forces more shoulder transverse extension and less shoulder extension range of motion. If low back is rounded due to poor form, deadlift weight to standing position and lower torso into horizontal position with knees bent and back straight. A shoulder width or underhand grip can increase lat involvement by emphasizing shoulder extension over transverse extension. A wide overhand grip involves overall back musculature while slightly emphasizing Rear Delt, Infraspinatus and Teres Minor involvement. Also known as Pendlay Row.',1,'2021-06-27 13:39:40',NULL,NULL,0),(352,362,'Pulleys should not be too far apart, as they are on standard cable crossover machines. Stirrups on pulleys should be high enough to allow shoulders to stretch forward when arms extend. Pull shoulder blades together when completing pull. Other rowing exercises should be considered if resistance required begins to exceed upper body weight since back will begin to raise up off of bench.',1,'2021-06-27 13:39:40',NULL,NULL,0),(353,360,'Torso may be kept horizontal for strict execution. Knees are bent in effort to keep low back straight (See Hamstring Inflexibility). If low back becomes rounded due to tight hamstrings, either try bending knees more or don\'t position torso as low. Either fix may compromise involvement of Latissimus Dorsi since it forces more shoulder transverse extension and less shoulder extension range of motion. If low back is rounded due to poor form, deadlift weight to standing position and lower torso into horizontal position with knees bent and back straight. A shoulder width or underhand grip can increase lat involvement by emphasizing shoulder extension over transverse extension.',1,'2021-06-27 13:39:40',NULL,NULL,0),(354,361,'Allow scapula to articulate, but do not rotate torso.',1,'2021-06-27 13:39:40',NULL,NULL,0),(355,363,'Supporting hand can also be placed on nearby bar, available on some pulley machines. Hamstrings and Gluteus Maximus stabilize near top of movement on forward leg.',1,'2021-06-27 13:39:40',NULL,NULL,0),(356,364,'It is optional to bend lower back forward during stretch and pull it upright during contraction. If low back is kept still, Erector Spinae acts as synergist muscle. Also see Cable One Arm Twisting Seated Row.',1,'2021-06-27 13:39:40',NULL,NULL,0),(357,365,'Also see Cable One Arm Seated Row.',1,'2021-06-27 13:39:40',NULL,NULL,0),(358,366,'It is optional to bend lower back forward during stretch and pull it upright during contraction. If torso does not bend forward, Erector Spinae acts as stabilizer muscle. See straight back form. Quadratus Lumborum and Obliques are involved in spinal rotation if waist is rotated more than demonstrated. Hamstrings and Gluteus Maximus are no longer stabilizers if seated on bench with upper leg support.',1,'2021-06-27 13:39:40',NULL,NULL,0),(359,367,'It is optional to bend lower back forward during stretch and pull it upright during contraction. If low back is kept still, Erector Spinae acts as synergist muscle. Also see exercise on bench and adjustable height pulley.',1,'2021-06-27 13:39:40',NULL,NULL,0),(360,368,'If two high pulleys are available use opposite pulley as exercised arm. If pulley is far enough away, it is optional to bend lower back forward during stretch and pull it upright during contraction. See Cable One Arm Seated High Row. Hamstrings and Gluteus Maximus become stabilizers if seated on bench with feet propped forward with no upper leg support.',1,'2021-06-27 13:39:40',NULL,NULL,0),(361,369,'Rotation of torso as shown is optional. Quadratus Lumborum and Obliques act as stabilizers if waist is not rotated as demonstrated. Hamstrings and Gluteus Maximus act as stabilizers if seat is not available and legs are propped forward.',1,'2021-06-27 13:39:40',NULL,NULL,0),(362,370,'Begin with light weight and add additional weight gradually to allow lower back adequate adaptation. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch. Full range of motion through lower back will vary from person to person. See Cable Seated Row Question. Also see Cable Straight Back Seated Row and Dangerous Exercise Essay.',1,'2021-06-27 13:39:40',NULL,NULL,0),(363,371,'If two high pulleys are available, consider using opposite pulley as arm exercised. If pulley is far away enough, it is optional to bend lower back forward during stretch and pull it upright during contraction. See Cable One Arm Seated High Row. Quadratus Lumborum and Obliques are involved in spinal rotation if waist rotates. Hamstrings and Gluteus Maximus become stabilizers, if seated on bench with feet propped forward with no upper leg support.',1,'2021-06-27 13:39:40',NULL,NULL,0),(364,372,'Begin with light weight and additional weight gradually to allow lower back adequate adaptation. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch. Full range of motion through lower back will vary from person to person. See Cable Seated Row Question. Also see Cable Wide Grip Straight Back Seated Row and Dangerous Exercise Essay.',1,'2021-06-27 13:39:40',NULL,NULL,0),(365,373,'Also see Cable Seated Row.',1,'2021-06-27 13:39:40',NULL,NULL,0),(366,374,'Also see Cable Wide Grip Seated Row.',1,'2021-06-27 13:39:40',NULL,NULL,0),(367,375,'Stirrup handle should be behind supporting bar. Few pulley units have vertical support bar (for supporting hand) far enough back from pulley to allow full range of motion and adequate pulley rotation to allow it to be aligned with line of pull. If pulley unit does not allow for this configuration, consider placing sturdy prop (for supporting hand) in front of pulley, far back enough to allow full range of motion. Also see Cable Standing Low Row.',1,'2021-06-27 13:39:40',NULL,NULL,0),(368,376,'Allow scapula to articulate but do not rotate torso in effort to throw weight up. Torso should be close to horizontal. Positioning supporting knee and/or arm slightly forward or back will allow for proper levelling of torso. Torso may be positioned lower to allow for heavier dumbbell to make contact with floor, if desired.',1,'2021-06-27 13:39:40',NULL,NULL,0),(369,377,'Also see Cable Standing Row with medium height pulley.',1,'2021-06-27 13:39:40',NULL,NULL,0),(370,378,'Bench should be high enough to allow shoulders to stretch forward without dumbbells hitting floor.',1,'2021-06-27 13:39:40',NULL,NULL,0),(371,379,'In standing position, both spinal rotation and hip rotation contribute to body\'s rotation. Because rear leg is only supported by forefoot, hip of forward leg is utilized (hip internal rotation / transverse adduction) much greater than hip of rear leg since forward leg offers more secured base of support.',1,'2021-06-27 13:39:40',NULL,NULL,0),(372,380,'Torso should be kept horizontal if flexibility allows. Knees are bent in effort to keep low back straight (See Hamstring Inflexibility). If low back becomes rounded due to tight hamstrings, try bending knees more. Placing weight plates on higher bar lightens resistance at top where strength lessens, without compromising range of motion. See Gravity Vectors to understand how this positioning, altering direction of load, affects exercise resistance (resistance curve). Also see wide grip form.',1,'2021-06-27 13:39:40',NULL,NULL,0),(373,381,'Torso should be kept as close to horizontal while allowing for full arm extension. Knees are bent in effort to keep low back straight (See Hamstring Inflexibility). If low back becomes rounded due to tight hamstrings, try bending knees more. Placing weight plates on higher bar lightens resistance at top where strength lessens, without compromising range of motion. See Gravity Vectors to understand how this positioning, altering direction of load, affects exercise resistance throughout movement (resistance curve). Also see Lever Bent-over Row.',1,'2021-06-27 13:39:40',NULL,NULL,0),(374,382,'Exact stance from bar will depend upon height of fulcrum and length of lever. Torso may be kept horizontal for strict execution. Knees are bent in effort to keep low back straight (See Hamstring Inflexibility). If low back becomes rounded due to tight hamstrings, either try bending knees more or don\'t position torso as low. Either fix may compromise involvement of Latissimus Dorsi, since it forces more shoulder transverse extension and less shoulder extension range of motion. If low back is rounded due to poor form, grasp bar in standing position and lower torso into horizontal position with knees bent and back straight. A shoulder width or underhand grip can increase lat involvement by emphasizing shoulder extension over transverse extension. A wide overhand grip involves overall back musculature while slightly emphasizing Rear Delt, Infraspinatus and Teres Minor involvement.',1,'2021-06-27 13:39:40',NULL,NULL,0),(375,383,'Near top arch upper back and pull shoulders back as shown. To maximize back involvement, position body on pad or grip so wrists follow elbows. Some Incline Row apparatuses allow feet to be placed on floor, particularly if foot platform cannot be adjusted to accommodate height.',1,'2021-06-27 13:39:40',NULL,NULL,0),(376,385,'Near top arch upper back and pull shoulders back as shown. To maximize back involvement, position body on pad or grip so wrists follow elbows.',1,'2021-06-27 13:39:40',NULL,NULL,0),(377,384,'Allow scapula to articulate but do not rotate torso in effort to throw weight up. Lever base shown attaches to standard Olympic barbell. Improvising by placing barbell in corner may cause excessive wear on floor and floor board, or wall.',1,'2021-06-27 13:39:40',NULL,NULL,0),(378,386,'Unique apparatus designed and built by Tracey Cheuvront.',1,'2021-06-27 13:39:40',NULL,NULL,0),(379,387,'Seat or grip should be adjusted to allow wrists to follow elbows. When completing pull, chest slightly and pull shoulder blades together while keeping lower chest on pad. Let shoulders roll forward when arms extend.',1,'2021-06-27 13:39:40',NULL,NULL,0),(380,389,'None.',1,'2021-06-27 13:39:40',NULL,NULL,0),(381,388,'None.',1,'2021-06-27 13:39:40',NULL,NULL,0),(382,390,'When completing pull, lift chest slightly and pull shoulder blades together while keeping lower chest on pad. Let shoulders roll forward when arms extend.',1,'2021-06-27 13:39:40',NULL,NULL,0),(383,391,'Seat or grip should be adjusted to allow wrists to follow elbows. When completing pull, lift chest slightly and pull shoulder blades together while keeping lower chest on pad. Let shoulders roll forward when arms extend.',1,'2021-06-27 13:39:40',NULL,NULL,0),(384,392,'Chest pad should be adjusted to allow shoulders to stretch forward. The seat or grip should be adjusted to allow wrists to follow elbows. Also see Cybex High Row.',1,'2021-06-27 13:39:40',NULL,NULL,0),(385,393,'Exercise is performed on apparatus with no chest pad, in contrast to standard lever seated row machine. This exercise is more similar to Cable Straight Back Seated Row. Exercise may also be performed with greater low back involvement; see Lever Seated Row (no chest pad).',1,'2021-06-27 13:39:40',NULL,NULL,0),(386,394,'Seat or grip should be adjusted to allow wrists to follow elbows. When completing pull, lift chest slightly and pull shoulder blades together while keeping lower chest on pad. Let shoulders roll forward when arms extend. See exercise on alternative machine.',1,'2021-06-27 13:39:40',NULL,NULL,0),(387,395,'Exercise is performed on apparatus with no chest pad, in contrast to standard lever seated row machine. This exercise is more similar to Cable Seated Row. Begin with light weight and add additional weight gradually to allow lower back adequate adaptation. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch. Full range of motion through lower back will vary from person to person. For even greater hip and low back articulation, hips may be slid back further with knees straighter. See Cable Seated Row Question and Dangerous Exercise Essay. Also see Lever Straight Back Seated Row (no chest pad).',1,'2021-06-27 13:39:40',NULL,NULL,0),(388,396,'Closer grip increases lat involvement by emphasizing shoulder extension over transverse extension. Keep low back straight. Lighten load if torso raises beyond 45 degrees in order to complete repetition. See Gravity Vectors to understand how load would be decreased by positioning torso too high. Also see Lever T-Bar Row.',1,'2021-06-27 13:39:40',NULL,NULL,0),(389,398,'Position torso as low as possible, allowing for full arm extension. Keep low back straight. Lighten load if torso raises beyond 45 degrees in order to complete repetition. See Gravity Vectors to understand how load would be decreased by positioning torso too high. Also see close grip form.',1,'2021-06-27 13:39:40',NULL,NULL,0),(390,399,'Seat or grip should be adjusted to allow wrists to follow elbows.',1,'2021-06-27 13:39:40',NULL,NULL,0),(391,401,'Seat should be adjusted to allow for full range of motion. Also see Lever Seated Hammer High Row.',1,'2021-06-27 13:39:40',NULL,NULL,0),(392,402,'Chest pad should be adjusted to allow shoulders to stretch forward. The seat or grip should be adjusted to allow wrists to follow elbows. When completing pull, lift chest slightly and pull shoulder blades together while keeping lower chest on pad. Let shoulders roll forward when arms extend.',1,'2021-06-27 13:39:40',NULL,NULL,0),(393,403,'Chest pad should be adjusted to allow shoulders to stretch forward. The seat or grip should be adjusted to allow wrists to follow elbows.',1,'2021-06-27 13:39:40',NULL,NULL,0),(394,405,'Seat or grip should be adjusted to allow wrists to follow elbows. When completing pull, lift chest slightly and pull shoulder blades together while keeping lower chest on pad. Let shoulders roll forward when arms extend. Also see front view.',1,'2021-06-27 13:39:40',NULL,NULL,0),(395,406,'Chest pad should be adjusted to allow shoulders to stretch forward. The seat or grip should be adjusted to allow wrists to follow elbows. When completing pull, lift chest slightly and pull shoulder blades together while keeping lower chest on pad. Let shoulders roll forward when arms extend.',1,'2021-06-27 13:39:40',NULL,NULL,0),(396,407,'Seat or grip should be adjusted to allow wrists to follow elbows.',1,'2021-06-27 13:39:40',NULL,NULL,0),(397,408,'Seat or grip should be adjusted to allow wrists to follow elbows.',1,'2021-06-27 13:39:40',NULL,NULL,0),(398,411,'Exercise is performed on apparatus with no chest pad, in contrast to standard lever seated row machine. This exercise is more similar to Cable Straight Back Seated Row. Exercise may also be performed with greater low back involvement; see Lever Seated Row (no chest pad).',1,'2021-06-27 13:39:40',NULL,NULL,0),(399,410,'Exercise is performed on apparatus with no chest pad, in contrast to standard lever seated row machine. This exercise is more similar to Cable Seated Row. Begin with light weight and add additional weight gradually to allow lower back adequate adaptation. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch. Full range of motion through lower back will vary from person to person. For even greater hip and low back articulation, hips may be slid back further with knees straighter. See Cable Seated Row Question and Dangerous Exercise Essay. Also see Lever Straight Back Seated Row (no chest pad).',1,'2021-06-27 13:39:40',NULL,NULL,0),(400,413,'Torso may be kept horizontal for strict execution. Platform (as shown) is only needed if smith machine does not allow bar to be lowered to lowest position. Knees are bent in effort to keep low back straight (See Hamstring Inflexibility ). If low back becomes rounded due to tight hamstrings, either knees should be bent more or torso may not be positioned as low. Either fix may compromise involvement of Latissimus Dorsi since it forces more shoulder transverse extension and less shoulder extension range of motion. If low back is rounded due to poor form, deadlift weight to standing position and lower torso into horizontal position with knees bent and back straight. A shoulder width or underhand grip can increase lat involvement by emphasizing shoulder extension over transverse extension.',1,'2021-06-27 13:39:40',NULL,NULL,0),(401,412,'Fixed bar should be just high enough to allow arm to fully extend. Placing back of heels on elevated surface is optional. This exercise is typically performed without added resistance, although additional weight can be placed on belly or pelvis. Partner can add and remove weight, and keep weight from sliding off belly. Resistance can be reduced by raising bar and positioning heels on floor. See Gravity Vectors for greater understanding of body angle influences resistance. Also known as Body Row or Supine Row.',1,'2021-06-27 13:39:40',NULL,NULL,0),(402,414,'Fixed bar should be just high enough to allow arm to fully extend. See Gravity Vectors for greater understanding of body angle influences resistance. Also known as Body Row or Supine Row.',1,'2021-06-27 13:39:40',NULL,NULL,0),(403,415,'Fixed bar should be just high enough to allow arm to fully extend. Placing back of heels on elevated surface is optional. This exercise is typically performed without added resistance, although a weight vest can be worn or additional weight can be placed on belly or pelvis. Partner can add and remove weight, and keep weight from sliding off belly. Resistance can be further reduced by performing movement from higher bar and/or positioning heels on floor (see Inverted Row on high bar). See Gravity Vectors for greater understanding of how body angle influences resistance. Also known as Weighted Body Row or Weighted Supine Row.',1,'2021-06-27 13:39:40',NULL,NULL,0),(404,417,'Fixed bar should be just high enough to allow arm to fully extend. See Gravity Vectors for greater understanding of how body angle influences resistance. Also known as Body Row on Hips or Supine Row on Hips.',1,'2021-06-27 13:39:40',NULL,NULL,0),(405,419,'Bar height can be adjusted to vary resistance. See Gravity Vectors for greater understanding of how body angle influences resistance. Also known as Body Row or Supine Row.',1,'2021-06-27 13:39:40',NULL,NULL,0),(406,420,'At higher angles, feet can be placed flat on floor. When angled further back, only heels may contact floor with forefeet raising upward. Dismounting can be achieved by walking backward until body is upright.',1,'2021-06-27 13:39:40',NULL,NULL,0),(407,421,'None',1,'2021-06-27 13:39:40',NULL,NULL,0),(408,422,'Fixed bar should be just high enough to allow arm to fully extend. See Gravity Vectors for greater understanding of body angle influences resistance.',1,'2021-06-27 13:39:40',NULL,NULL,0),(409,424,'To intensify stretch, look up or to one side.',1,'2021-06-27 13:39:40',NULL,NULL,0),(410,423,'Handles should be positioned to allow for full arm extension, no lower. Instead of mounting from a seated or lying position, position can be assumed by stepping back with handles grasped in each hand until arms are straight forward. While keeping arms straight and shoulders back, step forward so body reclines back and under suspension handles. Dismounting can be achieved by walking backward until body is upright, minimizing contact with ground. See Gravity Vector for greater understanding of how body angle influences resistance.',1,'2021-06-27 13:39:40',NULL,NULL,0),(411,425,'This exercise can be performed on TRXⓇ style suspension trainer or adjustable length gymnastics rings. Some suspension trainer brands allow independent use of only one handle, whereas, more popular brands require either anchoring unused handle within stirrup of gripped handle or grasping both handles with one hand.',1,'2021-06-27 13:39:40',NULL,NULL,0),(412,426,'Lower body extending off of bench acts as counter balance to resistance and keeps upper back fixed on bench. Avoid hips from raising up significantly. Actual range of motion is dependent upon individual shoulder flexibility. Keep elbows fixed at small bend throughout exercise. Either straight barbell or EZ barbell can be used. Also see Barbell Bent Arm Pullover.',1,'2021-06-27 13:39:40',NULL,NULL,0),(413,427,'See suggested mount and dismount. Some assisted machines require you to stand on bar. If no assisted machine is used, assist as needed by allowing training partner to pull feet up behind legs or push self up with legs on elevation. Range of motion will decrease if grip is too wide.',1,'2021-06-27 13:39:40',NULL,NULL,0),(414,428,'See suggested mount and dismount. Some assisted machines require you to kneel on platform instead of standing on bar. If no assisted machine is used, assist as needed by allowing training partner to pull feet up behind legs or push self up with legs on elevation.',1,'2021-06-27 13:39:40',NULL,NULL,0),(415,429,'See suggested mount and dismount. Some assisted machines require you to stand on bar. If no assisted machine is used, assist as needed by allowing training partner to pull feet up behind legs or push self up with legs on elevation. Range of motion will decrease if grip is too wide.',1,'2021-06-27 13:39:40',NULL,NULL,0),(416,430,'Some assisted machines require you to kneel on platform instead of standing on bar. If no assisted machine is used, assist as needed by allowing training partner to pull feet up behind legs or push self up with legs on elevation. Range of motion will decrease if grip is too wide.',1,'2021-06-27 13:39:40',NULL,NULL,0),(417,431,'See suggested mount and dismount. Some assisted machines require you to stand on platform or bar. If no assisted machine is used, assist as needed by allowing training partner to pull feet up behind legs or push self up with legs on elevation. Also see self-assisted technique without machine.',1,'2021-06-27 13:39:40',NULL,NULL,0),(418,432,'Muscles listed as Stabilizers become Synergists if spinal lateral flexion occurs during exercise.',1,'2021-06-27 13:39:40',NULL,NULL,0),(419,433,'Keep elbows bent approximately 90° throughout exercise. Keep hips from raising up significantly. Either straight barbell or EZ barbell can be used. Also see Barbell Pullover.',1,'2021-06-27 13:39:40',NULL,NULL,0),(420,434,'Exercise can be performed with V-Bar or Multi-exercise Bar.',1,'2021-06-27 13:39:40',NULL,NULL,0),(421,435,'See suggested mount and dismount. Some assisted machines require standing on bar. If no assisted machine is used, assist as needed by allowing training partner to pull feet up behind legs or push self up with legs on elevation.',1,'2021-06-27 13:39:40',NULL,NULL,0),(422,436,'Stirrups are attached to split pulley.',1,'2021-06-27 13:39:40',NULL,NULL,0),(423,437,'Muscles listed as Stabilizers become Synergists if spinal lateral flexion occurs during exercise.',1,'2021-06-27 13:39:40',NULL,NULL,0),(424,438,'Range of motion will be compromised if grip is too wide.',1,'2021-06-27 13:39:40',NULL,NULL,0),(425,440,'Keep hips and torso in same position throughout movement.',1,'2021-06-27 13:39:40',NULL,NULL,0),(426,439,'Stirrups are attached to split pulley.',1,'2021-06-27 13:39:40',NULL,NULL,0),(427,441,'Parallel Grip Cable Attachment is shorter than Pro Lat Bar, yet longer than Close Grip Cable Attachments.',1,'2021-06-27 13:39:40',NULL,NULL,0),(428,442,'Stirrups are attached to split pulley.',1,'2021-06-27 13:39:40',NULL,NULL,0),(429,443,'Lower body extending off of bench acts as counter balance to resistance and keeps upper back fixed on bench. Avoid hips from raising up significantly. Actual range of motion is dependent upon individual shoulder flexibility. Keep elbows fixed at small bend throughout exercise.',1,'2021-06-27 13:39:40',NULL,NULL,0),(430,444,'Range of motion will be compromised if grip is too wide.',1,'2021-06-27 13:39:40',NULL,NULL,0),(431,445,'Stirrups are attached to split pulley.',1,'2021-06-27 13:39:40',NULL,NULL,0),(432,446,'Fix elbows approximately 30° throughout exercise. Also known as Straight Arm Pulldown.',1,'2021-06-27 13:39:40',NULL,NULL,0),(433,447,'If weight bottoms out at bottom of movement, attach cable on chain links nearer ends of dip belt.',1,'2021-06-27 13:39:40',NULL,NULL,0),(434,448,'If weight bottoms out at bottom, attach cable on chain links nearer ends of dip belt.',1,'2021-06-27 13:39:40',NULL,NULL,0),(435,450,'If cable attachment is too high, grasp attachment first, then sit down. Fix elbows approximately 30° throughout exercise. Also known as Cable Seated Straight Arm Pulldown.',1,'2021-06-27 13:39:40',NULL,NULL,0),(436,449,'This particular apparatus could arguably be referred to as lever machine since dip belt attaches to lever arm, although relatively free movement between lever and dip belt offers qualities similar to cable machine. If weight bottoms out at bottom of movement, attach cable on chain links nearer ends of dip belt.',1,'2021-06-27 13:39:40',NULL,NULL,0),(437,451,'If weight bottoms out at bottom of motion, attach cable on chain links nearer ends of dip belt. Range of motion will be compromised if grip is too wide.',1,'2021-06-27 13:39:40',NULL,NULL,0),(438,452,'If weight bottoms out at bottom of movement, attach cable on chain links nearer ends of dip belt. Range of motion will be compromised if grip is too wide.',1,'2021-06-27 13:39:40',NULL,NULL,0),(439,453,'Range of motion will be compromised if grip is too wide.',1,'2021-06-27 13:39:40',NULL,NULL,0),(440,454,'Erector Spinae can become slightly engaged when torso arches back.',1,'2021-06-27 13:39:40',NULL,NULL,0),(441,455,'In standing position, both spinal rotation and hip rotation contribute to body\'s rotation. Because rear leg is only supported by forefoot, hip of forward leg is utilized (hip internal rotation / transverse adduction) much greater than hip of rear leg since forward leg offers more secured base of support.',1,'2021-06-27 13:39:40',NULL,NULL,0),(442,456,'None',1,'2021-06-27 13:39:40',NULL,NULL,0),(443,457,'Range of motion will be compromised if grip is too wide.',1,'2021-06-27 13:39:40',NULL,NULL,0),(444,458,'None',1,'2021-06-27 13:39:40',NULL,NULL,0),(445,459,'See pad kick down on Hammer Machine. Also see movement on alternative machine.',1,'2021-06-27 13:39:40',NULL,NULL,0),(446,460,'Range of motion will be compromised if grip is too wide.',1,'2021-06-27 13:39:40',NULL,NULL,0),(447,462,'Actual range of motion is dependent upon individual shoulder flexibility.',1,'2021-06-27 13:39:40',NULL,NULL,0),(448,463,'Erector Spinae can become slightly engaged when torso arches back.',1,'2021-06-27 13:39:40',NULL,NULL,0),(449,464,'None',1,'2021-06-27 13:39:40',NULL,NULL,0),(450,465,'Platform should be adjusted so shoulder joint and girdle are approximate height as lever fulcrum. Also See Bent-over Fly on Iron Cross\n\n\nMachine.',1,'2021-06-27 13:39:40',NULL,NULL,0),(451,467,'See pad kick down on Hammer Machine. Also see exercise on alternative machine.',1,'2021-06-27 13:39:40',NULL,NULL,0),(452,468,'When finished, push foot lever before releasing arm from lever. Release foot lever after releasing arm from lever. Actual range of motion is dependent upon individual shoulder flexibility.',1,'2021-06-27 13:39:40',NULL,NULL,0),(453,470,'Range of motion will be compromised if grip is too wide. See Lever Pulldown performed on alternative apparatus. Also see exercise with parallel grip.',1,'2021-06-27 13:39:40',NULL,NULL,0),(454,471,'Also see Lever Pulldown.',1,'2021-06-27 13:39:40',NULL,NULL,0),(455,473,'Added weight can be placed on dip belt or dumbbell can be placed between ankles.',1,'2021-06-27 13:39:40',NULL,NULL,0),(456,474,'Added weight can be placed on dip belt or dumbbell can be placed between ankles.',1,'2021-06-27 13:39:40',NULL,NULL,0),(457,476,'Added weight can be placed on dip belt or dumbbell can be placed between ankles as shown. Range of motion will be compromised if grip is too wide.',1,'2021-06-27 13:39:40',NULL,NULL,0),(458,475,'See pad kick down on Hammer Machine.',1,'2021-06-27 13:39:40',NULL,NULL,0),(459,477,'Free foot can be placed on top of foot in band for safety in case band slips from foot. Range of motion will be compromised if grip is too wide.',1,'2021-06-27 13:39:40',NULL,NULL,0),(460,478,'Added weight can be placed on dip belt or dumbbell can be placed between ankles. Also see Pull-up without added weight. Range of motion will be compromised if grip is too wide.',1,'2021-06-27 13:39:40',NULL,NULL,0),(461,479,'Free foot can be placed inside of band (as shown) or on top of foot in band for safety in case band slips from foot. At conclusion of set, step down with free foot at bottom of exercises. Dismount band by grasping each side of exercise band, stretch exercise band down, and step out. Continuing to hold on to each side of band while allowing band to contract to normal length.',1,'2021-06-27 13:39:40',NULL,NULL,0),(462,480,'Added weight can be placed on dip belt (as shown) or dumbbell can be placed between ankles. Range of motion will be compromised if grip is too wide.',1,'2021-06-27 13:39:40',NULL,NULL,0),(463,481,'Free foot can be placed inside of band (as shown) or on top of foot in band for safety in case band slips from foot. At conclusion of set, step down with free foot at bottom of exercises. Dismount band by grasping each side of exercise band, stretch exercise band down, and step out. Continuing to hold on to each side of band while allowing band to contract to normal length.',1,'2021-06-27 13:39:40',NULL,NULL,0),(464,483,'Added weight can be placed on dip belt or dumbbell can be placed between ankles. Special angled pull-up bar assembly is shown. Also see Wide Grip Pull-up and Underhand Chin-up.',1,'2021-06-27 13:39:40',NULL,NULL,0),(465,484,'Special angled pull-up bar assembly is shown. Free foot can be placed on top of foot in band for safety in case band slips from foot.',1,'2021-06-27 13:39:40',NULL,NULL,0),(466,485,'Easier',1,'2021-06-27 13:39:40',NULL,NULL,0),(467,486,'Range of motion will be compromised if grip is too wide. At conclusion of set, step one foot out of band at bottom of exercises. Grasping each side of exercise band from behind and pull down. Transfer body weight onto free leg, bend knee of banded leg, release band from under foot, and step out. Transfer both sides of taut band to one hand behind body. Turn body to side of hand holding band while permitting band to contract to normal length.',1,'2021-06-27 13:39:40',NULL,NULL,0),(468,487,'Range of motion will be compromised if grip is too wide.',1,'2021-06-27 13:39:40',NULL,NULL,0),(469,489,'Range of motion will be compromised if grip is too wide.',1,'2021-06-27 13:39:40',NULL,NULL,0),(470,488,'Partner can assist as needed by pulling ankles or top feet up from behind. Range of motion will be compromised if grip is too wide.',1,'2021-06-27 13:39:40',NULL,NULL,0),(471,490,'Special angled pull-up bar assembly is shown.',1,'2021-06-27 13:39:40',NULL,NULL,0),(472,491,'Range of motion will be compromised if grip is too wide.',1,'2021-06-27 13:39:40',NULL,NULL,0),(473,492,'Partner can assist as needed by pulling ankles or top feet up from behind. Also see self-assisted technique.',1,'2021-06-27 13:39:40',NULL,NULL,0),(474,493,'Partner can assist as needed by pulling ankles or top feet up from behind. Exercise can be used until Pull-ups can be performed. Range of motion will be compromised if grip is too wide .',1,'2021-06-27 13:39:40',NULL,NULL,0),(475,494,'If bar is too low, knees may need to spread apart at bottom of motion (as shown) to achieve full range of motion. Range of motion will be compromised if grip is too wide. If lower body is used for assistance, Quadriceps are utilized.',1,'2021-06-27 13:39:40',NULL,NULL,0),(476,495,'If lower body is used for assistance, Hip and Knee Extensors muscles are utilized. Back extensors may be activated minimally as stabilizer through spine. Range of motion will be compromised if grip is too wide.',1,'2021-06-27 13:39:40',NULL,NULL,0),(477,496,'If lower body is used for assistance, Hip and Knee Extensors muscles are utilized. Back extensors may be activated minimally as stabilizer through spine.',1,'2021-06-27 13:39:40',NULL,NULL,0),(478,497,'Keep elbows straight or nearly straight throughout exercise. Also known as Wheel Kneeling Rollout. Rectus Abdominis and Obliques practically contract isometrically since little waist flexion occurs under resistance. With no waist flexion, Rectus Abdominis and External Oblique act to stabilize pelvis and waist during hip flexion. See target muscle of rollout question. Also see Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(479,498,'Try to keep elbows nearly straight throughout exercise. Target muscle, Rectus Abdominis practically contracts isometrically since only a small degree of waist flexion occurs under resistance and, with the assistance of the External Oblique, act to stabilize spine. See target muscle of rollout question. Also see Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(480,500,'Triceps become more involved if shoulders are keep close to wrists.',1,'2021-06-27 13:39:40',NULL,NULL,0),(481,499,'If lower body is used for assistance, Hip and Knee Extensors muscles are utilized. Back extensors may be activated minimally as stabilizer through spine. Range of motion will be compromised if handles are too wide apart.',1,'2021-06-27 13:39:40',NULL,NULL,0),(482,501,'This exercise can be performed on adjustable length gymnastics rings or a dual anchored suspension trainer where the handles can be placed a short distance apart. Performing this exercise on a TRXⓇ style suspension trainer would require a narrower grip, with the hands closer together.',1,'2021-06-27 13:39:40',NULL,NULL,0),(483,502,'None.',1,'2021-06-27 13:39:40',NULL,NULL,0),(484,504,'To intensify stretch, look up or to one side.',1,'2021-06-27 13:39:40',NULL,NULL,0),(485,503,'Try to keep elbows nearly straight throughout exercise. Also known as Stability Ball Kneeling Rollout.',1,'2021-06-27 13:39:40',NULL,NULL,0),(486,505,'None.',1,'2021-06-27 13:39:40',NULL,NULL,0),(487,506,'Avoid overstressing neck anteriorly. See Overhead Triceps Stretch for similar exercise which can be performed with this stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(488,507,'Allow shoulder to raise toward side of head for greater stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(489,509,'Alternatively, forearms can be placed on wall, parallel with elbows pointed downward.',1,'2021-06-27 13:39:40',NULL,NULL,0),(490,508,'Allow shoulder to raise toward side of head for greater stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(491,510,'Participant can be asked to lean torso away from side with arm behind head. See PNF Overhead Triceps Stretch for similar exercise which can be performed with this stretch. Also see Overhead Lat Stretch for similar static stretch. Long head of triceps is only stretched if elbow nears complete flexion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(492,511,'Since this movement becomes more difficult as full shoulder elevation is achieved, height criteria for shoulder elevation may be needed. For example, raising shoulders until slope of shoulders becomes horizontal may be considered adequate depending upon individual body structure and range of motion with lighter weight. Also see ROM Criteria and Shoulder Shrug Errors.',1,'2021-06-27 13:39:40',NULL,NULL,0),(493,513,'Since this movement becomes more difficult as full shoulder elevation is achieved, height criteria for shoulder elevation may be needed. For example, raising shoulders until slope of shoulders becomes horizontal may be considered adequate, depending upon individual body structure and range of motion with lighter weight. Also see ROM Criteria and Shoulder Shrug Errors.',1,'2021-06-27 13:39:40',NULL,NULL,0),(494,512,'Since this movement becomes more difficult as full shoulder elevation is achieved, height criteria for shoulder elevation may be needed. For example, raising shoulders until slope of shoulders becomes horizontal may be considered adequate depending upon individual body structure and range of motion with lighter weight. Also see ROM Criteria and Shoulder Shrug Errors.',1,'2021-06-27 13:39:40',NULL,NULL,0),(495,514,'Since this movement becomes more difficult as full shoulder elevation is achieved, height criteria for shoulder elevation may be needed. For example, raising shoulders until slope of shoulders becomes horizontal may be considered adequate depending upon individual body structure and range of motion with lighter weight. Also see ROM Criteria and Shoulder Shrug Errors.',1,'2021-06-27 13:39:40',NULL,NULL,0),(496,517,'Since this movement becomes more difficult as full shoulder elevation is achieved, height criteria for shoulder elevation may be needed. For example, raising shoulders until slope of shoulders becomes horizontal may be considered adequate depending upon individual body structure and range of motion with lighter weight. Also see ROM Criteria and Shoulder Shrug Errors.',1,'2021-06-27 13:39:40',NULL,NULL,0),(497,515,'Since this movement becomes more difficult as full shoulder elevation is achieved, height criteria for shoulder elevation may be needed. For example, raising shoulders until slope of shoulders becomes horizontal may be considered adequate, depending upon individual body structure and range of motion with lighter weight. Also see ROM Criteria and Shoulder Shrug Errors.',1,'2021-06-27 13:39:40',NULL,NULL,0),(498,518,'Since this movement becomes more difficult as full shoulder elevation is achieved, height criteria for shoulder elevation may be needed. For example, raising shoulders until slope of shoulders becomes horizontal may be considered adequate depending upon individual body structure and range of motion with lighter weight. Also see ROM Criteria and Shoulder Shrug Errors.',1,'2021-06-27 13:39:40',NULL,NULL,0),(499,516,'Since this movement becomes more difficult as full shoulder elevation is achieved, height criteria for shoulder elevation may be needed. For example, raising shoulders until slope of shoulders becomes horizontal may be considered adequate depending upon individual body structure and range of motion with lighter weight. Also see ROM Criteria and Shoulder Shrug Errors.',1,'2021-06-27 13:39:40',NULL,NULL,0),(500,519,'Exercise may be performed standing perfectly upright or very slightly bent over. Since this movement becomes more difficult as full shoulder elevation is achieved, height criteria for shoulder elevation may be needed. For example, raising shoulders until slope of shoulders becomes horizontal may be considered adequate depending upon individual body structure and range of motion with lighter weight. Also see ROM Criteria and Shoulder Shrug Errors.',1,'2021-06-27 13:39:40',NULL,NULL,0),(501,520,'Since this movement becomes more difficult as full shoulder elevation is achieved, height criteria for shoulder elevation may be needed. For example, raising shoulders until slope of shoulders becomes horizontal may be considered adequate depending upon individual body structure and range of motion with lighter weight. Also see ROM Criteria and Shoulder Shrug Errors.',1,'2021-06-27 13:39:40',NULL,NULL,0),(502,521,'If possible, position lever height high enough so weight will not need to be squat up that high, but not so high that weight stack bottoms out during exercise. Since this movement becomes more difficult as full shoulder elevation is achieved, height criteria for shoulder elevation may be needed. For example, raising shoulders until slope of shoulders becomes horizontal may be considered adequate depending upon individual body structure and range of motion with lighter weight. Also see ROM Criteria.',1,'2021-06-27 13:39:40',NULL,NULL,0),(503,522,'Since this movement becomes more difficult as full shoulder elevation is achieved, height criteria for shoulder elevation may be needed. For example, raising shoulders until slope of shoulders becomes horizontal may be considered adequate depending upon individual body structure and range of motion with lighter weight. Also see ROM Criteria.',1,'2021-06-27 13:39:40',NULL,NULL,0),(504,523,'Since this movement becomes more difficult as full shoulder elevation is achieved, height criteria for shoulder elevation may be needed. For example, raising shoulders until slope of shoulders becomes horizontal may be considered adequate depending upon individual body structure and range of motion with lighter weight. Also see ROM Criteria and Shoulder Shrug Errors.',1,'2021-06-27 13:39:40',NULL,NULL,0),(505,524,'Since this movement becomes more difficult as full shoulder elevation is achieved, height criteria for shoulder elevation may be needed. For example, raising shoulders until slope of shoulders becomes horizontal may be considered adequate depending upon individual body structure and range of motion with lighter weight. Also see ROM Criteria.',1,'2021-06-27 13:39:40',NULL,NULL,0),(506,527,'Since this movement becomes more difficult as full shoulder elevation is achieved, height criteria for shoulder elevation may be needed. For example, raising shoulders until slope of shoulders becomes horizontal may be considered adequate depending upon individual body structure and range of motion with lighter weight. Also see ROM Criteria and Shoulder Shrug Errors.',1,'2021-06-27 13:39:40',NULL,NULL,0),(507,526,'Since this movement becomes more difficult as full shoulder elevation is achieved, height criteria for shoulder elevation may be needed. For example, raising shoulders until slope of shoulders becomes horizontal may be considered adequate depending upon individual body structure and range of motion with lighter weight. Also see ROM Criteria and Shoulder Shrug Errors.',1,'2021-06-27 13:39:40',NULL,NULL,0),(508,528,'Since this movement becomes more difficult as full shoulder elevation is achieved, height criteria for shoulder elevation may be needed. For example, raising shoulders until slope of shoulders becomes horizontal may be considered adequate depending upon individual body structure and range of motion with lighter weight. Also see ROM Criteria.',1,'2021-06-27 13:39:40',NULL,NULL,0),(509,525,'Since this movement becomes more difficult as full shoulder elevation is achieved, height criteria for shoulder elevation may be needed. For example, raising shoulders until slope of shoulders becomes horizontal may be considered adequate depending upon individual body structure and range of motion with lighter weight. Also see ROM Criteria and Shoulder Shrug Errors.',1,'2021-06-27 13:39:40',NULL,NULL,0),(510,529,'Falling from an inverted position or hitting head on structural bar when flipping body may result in very serious injury. Adequate clearance must be allowed for head to clear any obstruction during both inversion and dismount. Exercise can also be performed on gymnastic rings. A safer position would be hanging centimeters above well padded flooring. Since this movement becomes more difficult as full shoulder elevation is achieved, height criteria for shoulder elevation may be needed. For example, raising shoulders until slope of shoulders becomes horizontal may be considered adequate depending upon individual body structure and range of motion with lighter weight. Also see ROM Criteria.',1,'2021-06-27 13:39:40',NULL,NULL,0),(511,530,'If possible, position lever height high enough so weight will not need to be squat up that high, but not so high that weight stack bottoms out during exercise. Since this movement becomes more difficult as full shoulder elevation is achieved, height criteria for shoulder elevation may be needed. For example, raising shoulders until slope of shoulders becomes horizontal may be considered adequate depending upon individual body structure and range of motion with lighter weight. Also see ROM Criteria.',1,'2021-06-27 13:39:40',NULL,NULL,0),(512,531,'If possible, position lever height high enough so weight will not need to be squat up that high, but not so high that weight stack bottoms out during exercise. Since this movement becomes more difficult as full shoulder elevation is achieved, height criteria for shoulder elevation may be needed. For example, raising shoulders until slope of shoulders becomes horizontal may be considered adequate depending upon individual body structure and range of motion with lighter weight. Also see ROM Criteria.',1,'2021-06-27 13:39:40',NULL,NULL,0),(513,532,'None.',1,'2021-06-27 13:39:40',NULL,NULL,0),(514,533,'Falling from an inverted position may result in very serious injury. To decrease potential of injury, position gymnastic rings over well padded surface, only high enough to allow full range of motion. Since this movement becomes more difficult as full shoulder elevation is achieved, height criteria for shoulder elevation may be needed. For example, raising shoulders until slope of shoulders becomes horizontal may be considered adequate, depending upon individual body structure and range of motion with lighter weight. Also see ROM Criteria. This exercise can be performed on adjustable length gymnastics rings or a dual anchored suspension trainer.',1,'2021-06-27 13:39:40',NULL,NULL,0),(515,534,'None',1,'2021-06-27 13:39:40',NULL,NULL,0),(516,535,'None',1,'2021-06-27 13:39:40',NULL,NULL,0),(517,536,'Throughout movement, keep bent elbow (approximately 90°) in front of body, chest or shoulder height.',1,'2021-06-27 13:39:40',NULL,NULL,0),(518,538,'Maintain elbow against side and fixed elbow position (90° angle) throughout exercise. Placing towel roll under arm increase infraspinatus and teres minor EMG signal activity compared to no towel roll (Wilk KE 2002), although subsequent study found no significant difference (Reinold MM 2004). Also see Dumbbell Shoulder External Rotation Errors.',1,'2021-06-27 13:39:40',NULL,NULL,0),(519,537,'Maintain elbow against side and fixed elbow position (90° angle) throughout exercise. Exercise may be performed standing with medium high pulley.',1,'2021-06-27 13:39:40',NULL,NULL,0),(520,539,'Maintain elbow against side and fixed elbow position (90° angle) throughout exercise. Position incline as low as possible so dumbbell can still be aligned against gravity.',1,'2021-06-27 13:39:40',NULL,NULL,0),(521,541,'Throughout movement, keep bent elbow (approximately 90°) out to side, shoulder height.',1,'2021-06-27 13:39:40',NULL,NULL,0),(522,540,'Wrist may be kept straighter throughout movement than what is shown. Also, keep elbow at shoulder height and bent at right angle. Height of cable pulley is dependent upon:',1,'2021-06-27 13:39:40',NULL,NULL,0),(523,542,'Maintain elbow against side and fixed elbow position (90° angle) throughout exercise. Exercise may be performed seated on chair with pulley lowered to elbow height or seated on floor with low pulley.',1,'2021-06-27 13:39:40',NULL,NULL,0),(524,543,'Adjust lever and body orientation to achieve full range of motion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(525,544,'Throughout movement, keep bent elbow (approximately 90°) out to side, shoulder height.',1,'2021-06-27 13:39:40',NULL,NULL,0),(526,545,'Exercise can also be performed with seat facing inward at 45° but this may limit internal rotation ROM of shoulder and supraspinatus will not assist.',1,'2021-06-27 13:39:40',NULL,NULL,0),(527,546,'Those with shorter forearms whose wrists do not make contact with pad would utilize Wrist Extensors as stabilizer to keep wrists ridged while back of the hands move pads.',1,'2021-06-27 13:39:40',NULL,NULL,0),(528,547,'Lean torso toward positioned arm if stretch is not yet felt.',1,'2021-06-27 13:39:40',NULL,NULL,0),(529,548,'None.',1,'2021-06-27 13:39:40',NULL,NULL,0),(530,549,'Keep back straight.',1,'2021-06-27 13:39:40',NULL,NULL,0),(531,550,'None.',1,'2021-06-27 13:39:40',NULL,NULL,0),(532,551,'None.',1,'2021-06-27 13:39:40',NULL,NULL,0),(533,552,'A very upright position (ie: very light resistance) with one foot positioned back slightly (see \'Easier\') is typically required for proper execution. Take care to maintain tension on suspension trainer near top of movement. Dismounting can be achieved by walking backward until body is upright or stepping out at top of movement. This exercise can be performed on TRXⓇ style suspension trainer or adjustable length gymnastics rings.',1,'2021-06-27 13:39:40',NULL,NULL,0),(534,553,'Torso can lean back slightly allowing for fuller range of motion at the bottom of movement. In which case, forearm does not need to travel any closer than vertical toward body. Elbow can be held with opposite hand for additional support.',1,'2021-06-27 13:39:40',NULL,NULL,0),(535,554,'Maintain elbow against side and fixed elbow position throughout exercise. Exercise may be performed seated if medium high / adjustable pulley is not availble.',1,'2021-06-27 13:39:40',NULL,NULL,0),(536,555,'Maintain elbow\'s bend and position at edge of bench against side of body throughout exercise. Elbow can be held with opposite hand for additional support.',1,'2021-06-27 13:39:40',NULL,NULL,0),(537,556,'Adjust lever and body orientation to achieve full range of motion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(538,559,'Bent knees slightly so stretch is not limited by hamstring flexibility and to keep shoulder from being pushed forward.',1,'2021-06-27 13:39:40',NULL,NULL,0),(539,558,'Those with shorter forearms whose wrists do not make contact with pad would utilize Wrist Flexors as stabilizer to keep wrists ridged while hands move pads.',1,'2021-06-27 13:39:40',NULL,NULL,0),(540,557,'Maintain elbow against side and fixed elbow position throughout exercise. Exercise may be performed standing with medium high / adjustable pulley',1,'2021-06-27 13:39:40',NULL,NULL,0),(541,560,'None.',1,'2021-06-27 13:39:40',NULL,NULL,0),(542,561,'Turn seat facing inward at 45° if external rotation ROM of shoulder is limited. Consequently placing the upper arm in this plane limits internal rotation ROM of shoulder and Supraspinatus will assist slightly in interal rotation.',1,'2021-06-27 13:39:40',NULL,NULL,0),(543,562,'See mount and dismount. Some assisted machines require you to kneel on platform instead of standing on bar. Also see Assisted Triceps Dip.',1,'2021-06-27 13:39:40',NULL,NULL,0),(544,563,'See mount and dismount. Some assisted machines require you to standing on bar. Also see Assisted Triceps Dip.',1,'2021-06-27 13:39:40',NULL,NULL,0),(545,564,'Instead of assistant holding bench board, it can be strapped to torso, as shown. Boards of varying thicknesses (1, 2, or 3) can be used. Board Press develops strength in middle range of motion for Bench Press. Gluteus Maximus, Erector Spinae, Quadriceps, and other muscles may be considered significant stabilizers during actual powerlift.',1,'2021-06-27 13:39:40',NULL,NULL,0),(546,565,'Upper arm travels in perpendicular path to torso to minimize anterior deltoid involvement and mimics upper arm positioning of Chest Flies. The oblique grip (hand positioned with palm diagonal on bar) allows elbows to be more easily turned outward to each side. Also see Bench Press Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(547,566,'Competitive lifting requires bar to make contact with chest above bottom of the sternum with momentary pause. Gluteus Maximus, Erector Spinae, Quadriceps, and other muscles may be considered significant stabilizers during actual powerlift.',1,'2021-06-27 13:39:40',NULL,NULL,0),(548,567,'Range of motion will be compromised if grip is too wide.',1,'2021-06-27 13:39:40',NULL,NULL,0),(549,568,'Floor Presses are also said to build explosive strength by breaking eccentric/concentric chain (AKA: stretch-shortening cycle) normally activated at bottom of standard Bench Press.',1,'2021-06-27 13:39:40',NULL,NULL,0),(550,569,'Range of motion will be compromised if grip is too wide. Latissimus Dorsi involvement is l\n\n\now on Decline Bench Press (Barnett 1995). Also see Bench Press Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(551,570,'The animation depicts dip bar placed in front of low pull cable. If cable dip machine is available, attach hip harness and step up to dip bar. Also see Cable Triceps Dip.',1,'2021-06-27 13:39:40',NULL,NULL,0),(552,571,'Since incline of bench does not actually affect angle of pull as with dumbbells, similar effect can be achieved on flat bench if cable stirrups are brought together above upper abdomen instead of chest.\n\n\nKeep shoulders internally rotated so elbows point downward at bottom position and outward at top position. Keep elbows at fixed angle, only slightly bent. Anterior Deltoid will no longer act as synergist in steep decline bench position.',1,'2021-06-27 13:39:40',NULL,NULL,0),(553,572,'Chains provide increasing resistance as barbell moves away from floor. Chains can be used during either Powerlift-style Bench Press or Standard-style Bench Press. Also see Bench Press Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(554,573,'Shoulders are kept internally rotated so elbows are pointing back\n\n\nand out to sides.',1,'2021-06-27 13:39:40',NULL,NULL,0),(555,574,'Keep shoulders internally rotated so elbows point downward at bottom position and outward at top position. Keep elbows at fixed angle, only slightly bent.',1,'2021-06-27 13:39:40',NULL,NULL,0),(556,575,'Stirrup should follow slight arch pattern, above upper arm between elbow and chest at bottom, traveling inward over each shoulder at t\n\n\nop. Also see Bench Press Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(557,576,'Under greater resistance, positioning torso at lower angle downward (by bending over at hips), will allow upper body weight to counterbalance upward pull of cables, as opposed to stepping forward and struggling with\n\n\nbackward pull of cables.',1,'2021-06-27 13:39:40',NULL,NULL,0),(558,577,'Also see exercise performed with twisting movement. Pectoralis Minor and Serratus Anterior act as stabilizers if torso is not against back support as shown.',1,'2021-06-27 13:39:40',NULL,NULL,0),(559,578,'Cable pulleys should be relatively close together, narrower than width of arms extended out to sides (but not too close), closer than what is typically found on standard cable cross over setup. Range of motion will be compromised if grip is too wide.',1,'2021-06-27 13:39:40',NULL,NULL,0),(560,579,'The effective range of motion of Pectoralis Major is only about half of what it is in non-twisting movement.',1,'2021-06-27 13:39:40',NULL,NULL,0),(561,580,'Range of motion will be compromised if grip is too wide. Also see Bench Press Analysis and Cable Bar Standing Bench Press.',1,'2021-06-27 13:39:40',NULL,NULL,0),(562,582,'Stirrup should follow slight arch pattern as hands travel closer together toward extension. Cable pulleys should be relatively close together, narrower than width of arms extended out to sides (but not too close), closer than what is typically found on standard cable cross over setup.',1,'2021-06-27 13:39:40',NULL,NULL,0),(563,581,'Stirrup should follow slight arch pattern, in front of upper arm between elbow and chest in stretched position, traveling inward in front of each shoulder at extended position.',1,'2021-06-27 13:39:40',NULL,NULL,0),(564,583,'Dumbbells should follow slight arch pattern, above upper arm between elbow and chest at bottom, traveling inward over each shoulder at top. No need to drop weights - see suggested mount and dismount techniques: standard or advanced. Also see mount & dismount from special machine rack and\n\n\nBench Press Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(565,584,'Stirrup should follow slight arch pattern, in front of upper arm between elbow and chest in stretched position, traveling inward and slightly downward just below each shoulder at ex\n\n\ntended position. Latissimus Dorsi involvement is low on Decline Bench Press (Barnett 1995).',1,'2021-06-27 13:39:40',NULL,NULL,0),(566,585,'Stirrup should follow slight arch pattern, in front of upper arm between elbow and chest in stretched position, traveling inward in front shoulder at contracted position.',1,'2021-06-27 13:39:40',NULL,NULL,0),(567,586,'Stirrup should follow slight arch pattern as hands travel closer together toward extension. Cable pulleys should be relatively close together, narrower than width of arms extended out to sides (but not too close), closer than what is typically found on standard cable cross over setup.',1,'2021-06-27 13:39:40',NULL,NULL,0),(568,587,'Cable pulleys should be relatively close together, narrower than width of arms extended out to sides (but not too close), closer than what is typically found on standard cable cross over setup.',1,'2021-06-27 13:39:40',NULL,NULL,0),(569,588,'Stirrup should follow slight arch pattern, above upper arm between elbow and chest at bottom, traveling inward over each shoulder at top. No need to drop weights - see suggested mount and dismount technique. Latissimus Dorsi involv\n\n\nement is low on Decline Bench Press (Barnett 1995). Also see mount & dismount from special machine rack and Bench Press Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(570,589,'Keep elbows at fixed angle, only slightly bent, and pointing outward, opposite direction of upward motion. Anterior Deltoid will no longer act as synergist in steep decline bench position.',1,'2021-06-27 13:39:40',NULL,NULL,0),(571,590,'Avoid hips from raising up significantly. Actual range of motion is dependent upon individual shoulder flexibility. Keep elbows fixed at small bend throughout exercise. See suggested mount & dismount.',1,'2021-06-27 13:39:40',NULL,NULL,0),(572,591,'Keep shoulders internally rotated so elbows point downward at bottom position and outward at top position. Keep elbows at fixed angle, only slightly bent.',1,'2021-06-27 13:39:40',NULL,NULL,0),(573,592,'Lower body extending off of bench acts as counter balance to resistance and keeps upper back fixed on bench. Avoid hips from raising up significantly. Actual range of motion is dependent upon individual shoulder flexibility. Keep elbows fixed at small bend throughout exercise. See suggested mount & dismount.',1,'2021-06-27 13:39:40',NULL,NULL,0),(574,593,'Orientation relative to lever will depend upon height of fulcrum relative to bench. Position body so bar is over shoulders during extension, yet lower on chest in lowest position. Range of motion will be compromised if grip is too wide. Also see Bench Press Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(575,594,'Range of motion will be compromised if grip is too wide. Latissimus Dorsi involvem\n\n\nent is low on Decline Bench Press (Barnett 1995). Also see exercises performed on alternative machine. Also see Bench Press Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(576,595,'Range of motion will be compromised if grip is too wide. Also see Bench Press Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(577,596,'Actual range of motion is dependent upon individual shoulder flexibility. Keep elbows fixed at small bend throughout exercise. See suggested mount & dismount.',1,'2021-06-27 13:39:40',NULL,NULL,0),(578,597,'Range of motion will be compromised if grip is too wide. Also see Bench Press Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(579,598,'Also see Lever Triceps Dip.',1,'2021-06-27 13:39:40',NULL,NULL,0),(580,599,'See Lever Chest Dip on machine facing fulcrum. Also see Lever Triceps Dip.',1,'2021-06-27 13:39:40',NULL,NULL,0),(581,602,'Range of motion will be compromised if grip is too wide. Also see Bench Press Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(582,603,'None.',1,'2021-06-27 13:39:40',NULL,NULL,0),(583,604,'None',1,'2021-06-27 13:39:40',NULL,NULL,0),(584,605,'Height of platform should allow shoulders to be near the same height of fulcrums. Secondary levers compensate somewhat for variations if alignment between points of rotation (lever fulcrum and shoulder girdle articulation). Under greater resistance, height of platform can be increased so torso can be positioned at lower angle downward (by bending over at hips). This will allow upper body weight to counterbalance upward pull of levers. See Lever Seated Iron Cross Fly and Lever Iron Cross for Lats.',1,'2021-06-27 13:39:40',NULL,NULL,0),(585,606,'Shoulders should be internally rotated so elbows are pointing back at beginning of motion and outward at end of motion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(586,608,'Shoulders should be internally rotated so elbows are pointing backwards at beginning of motion and forward at completion of motion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(587,609,'Shoulders are kept internally rotated so elbows are pointing out to sides. Adjust lever arms on machine so slight stretch is felt when weight is lowered. Also see exercises on alternative machine.',1,'2021-06-27 13:39:40',NULL,NULL,0),(588,607,'Under greater resistance, positioning torso at lower angle downward (by bending over at hips), will allow upper body weight to counterbalance upward pull of cables, as opposed to stepping forward and struggling with the backward pull of cables. Also see Bent-over Fly on Standing Iron Cross Machine.',1,'2021-06-27 13:39:40',NULL,NULL,0),(589,611,'Shoulders should be internally rotated so elbows are pointing downward at bottom of motion and outward at top of motion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(590,612,'Range of motion will be compromised if grip is too wide. Also see Bench Press Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(591,613,'Range of motion will be compromised if grip is too wide.',1,'2021-06-27 13:39:40',NULL,NULL,0),(592,615,'Some machines have foot levers to position handles in a more comfortable starting and ending position. If foot lever is available, engage it before grasping handles, release it before performing exercise, and engage it again just before releasing grips.',1,'2021-06-27 13:39:40',NULL,NULL,0),(593,614,'Range of motion will be compromised if grip is too wide. Latissimus Dorsi involvement is low on Decline Bench Press (Barnett 1995). Also see Bench Press Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(594,618,'Some machines have foot levers to position handles in a more comfortable starting and ending position. If foot lever is available, engage it before grasping handles, release it before performing exercise, and engage it again just before releasing grips.',1,'2021-06-27 13:39:40',NULL,NULL,0),(595,619,'Both the machine design and handle orientation are rare. See typical dip machines:',1,'2021-06-27 13:39:40',NULL,NULL,0),(596,617,'Range of motion will be compromised if grip is too wide.',1,'2021-06-27 13:39:40',NULL,NULL,0),(597,621,'Range of motion will be compromised if grip is too wide. Also see Bench Press Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(598,620,'This particular machine design is rare. See typical dip machines:',1,'2021-06-27 13:39:40',NULL,NULL,0),(599,622,'Range of motion will be compromised if grip is too wide. Latissimus Dorsi involvement is low on Decline Bench Press (Barnett 1995). Also see Bench Press Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(600,624,'Also see Triceps Dip.',1,'2021-06-27 13:39:40',NULL,NULL,0),(601,623,'Both upper and lower body must be kept straight throughout movement. Exercise can be performed without additional weight. If additional weight is used, partner will need to add and remove weight, and keep weight from sliding off back. See narrower grip push-up.',1,'2021-06-27 13:39:40',NULL,NULL,0),(602,625,'Also see Band-assisted Triceps Dip.',1,'2021-06-27 13:39:40',NULL,NULL,0),(603,628,'Both upper and lower body must be kept straight throughout movement. See close grip push-up. Also see push-up test calculator.',1,'2021-06-27 13:39:40',NULL,NULL,0),(604,626,'Range of motion will be compromised if grip is too wide. Latissimus Dorsi involvement is low on Decline Bench Press (Barnett 1995). Also see Bench Press Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(605,627,'Both upper and lower body must be kept straight throughout movement. Exercise can be performed without additional weight, without handles, or without platform. Platform compensates for height of handles. If platform is too high, upper chest will be emphasized (see Decline Push-up). If additional weight is used, partner will need to add and remove weight, and keep weight from sliding off back.',1,'2021-06-27 13:39:40',NULL,NULL,0),(606,629,'Added weight can be placed on dip belt or dumbbell can be placed between ankles. Also see Weighted Triceps Dip.',1,'2021-06-27 13:39:40',NULL,NULL,0),(607,630,'In above clip, hands are positioned at ends of main segments of benches with fingers between gaps. On standard benches, hands should be placed near ends of benches. Perform on higher benches if slight stretch is not felt. Also see Triceps Dip (between benches).',1,'2021-06-27 13:39:40',NULL,NULL,0),(608,631,'In above clip, hands are positioned at ends of main segments of benches with fingers between gaps. On standard benches, hands should be placed near ends of benches. Perform on higher benches if slight stretch is not felt. Also see Triceps Dip (between benches).',1,'2021-06-27 13:39:40',NULL,NULL,0),(609,632,'Both upper and lower body must be kept straight throughout movement. Height of bench or platform affects difficulty of movement. See Gravity Vectors for greater understanding how of body angle influences resistance. Also see movement performed on horizontal bar and close grip push-up.',1,'2021-06-27 13:39:40',NULL,NULL,0),(610,633,'To emphasize chest, position body bent over by bending hips. Also see Triceps Dips. This exercise can be performed on adjustable length gymnastics rings or a dual anchored suspension trainer.',1,'2021-06-27 13:39:40',NULL,NULL,0),(611,634,'Both upper and lower body must be kept straight throughout movement. Height of bar affects difficulty of movement. See Gravity Vectors for greater understanding of how body angle influences resistance. Also see movement performed on edge of box or bench and close grip push-up.',1,'2021-06-27 13:39:40',NULL,NULL,0),(612,635,'If lower body is used for assistance, Quadriceps are utilized. Hips are kept straighter and body more upright, as compared to Assisted Triceps Dip. This exercise can be performed on adjustable length gymnastics rings or a dual anchored suspension trainer.',1,'2021-06-27 13:39:40',NULL,NULL,0),(613,636,'See Suspended Chest Press Mount/Dismount . Arms and suspension straps should be perpendicular to body. Both upper and lower body must be kept straight throughout movement. Elbows largely remain behind hands\' line of force. See side view. Angle of body affects difficulty of movement. See Gravity Vectors for greater understanding of body angle influences resistance. This exercise can be performed on TRXⓇ style suspension trainer or adjustable length gymnastics rings.',1,'2021-06-27 13:39:40',NULL,NULL,0),(614,637,'Hands may be clasped. Keep head upright.',1,'2021-06-27 13:39:40',NULL,NULL,0),(615,638,'If lower body is used for assistance, Hip and Knee Extensors muscles are utilized. Hips are bent more and body leans forward more, as compared to Self-assisted Triceps Dip.',1,'2021-06-27 13:39:40',NULL,NULL,0),(616,639,'See Suspended Prone Mount/Dismount. Throughout movement, keep elbows in fixed, slightly bent position and shoulders internally rotated, so elbows are kept pointed outward and high. Arms and suspension straps plane of motion should be perpendicular to body. Both upper and lower body must be kept straight throughout movement. Angle of body affects difficulty of movement. See Gravity Vectors for greater understanding of how body angle influences resistance.',1,'2021-06-27 13:39:40',NULL,NULL,0),(617,640,'Both upper and lower body must be kept straight throughout movement. Forefeet can remain on floor as long as body is pivoting on knees. See close grip push-up. Also see push-up test calculator.',1,'2021-06-27 13:39:40',NULL,NULL,0),(618,641,'Upper chest becomes more stretched with elbow lower. Lower chest and pectoralis minor become more stretched with elbow higher.',1,'2021-06-27 13:39:40',NULL,NULL,0),(619,642,'None',1,'2021-06-27 13:39:40',NULL,NULL,0),(620,643,'Participants hands can be clasped. See PNF stretch techniques. Also see Behind Head Chest Stretch for similar static stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(621,644,'Upper chest becomes more stretched with elbow lower. Lower chest and pectoralis minor become more stretched with elbow higher.',1,'2021-06-27 13:39:40',NULL,NULL,0),(622,645,'Stirrup should follow slight arch pattern, in front/above of upper arm between elbow and chest in stretched position, travelling inward in front/above each shoulder at contracted position.',1,'2021-06-27 13:39:40',NULL,NULL,0),(623,646,'Range of motion will be compromised if grip is too wide.\n\n\nAlso see Bench Press Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(624,647,'Stirrup should follow slight arch pattern, in front/above of upper arm between elbow and chest in stretched position, travelling inward in front/above each shoulder at contracted position. Cable pulleys should be closer together than what is typically found on standard cable cross over setup.',1,'2021-06-27 13:39:40',NULL,NULL,0),(625,650,'Cable pulleys should be closer together than what is typically found on standard cable cross over setup. Range of motion will be compromised if grip is too wide.',1,'2021-06-27 13:39:40',NULL,NULL,0),(626,649,'Stirrup should follow slight arch pattern, above upper arm between elbow and chest at bottom, traveling inward over each shoulder at top.',1,'2021-06-27 13:39:40',NULL,NULL,0),(627,648,'Range of motion will be compromised if grip is too wide. Also see Bench Press Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(628,651,'Keep shoulders internally rotated so elbows point downward at bottom position and outward at top position. Shoulder will likely have less range of motion in lower position as compared to Fly on flat bench.',1,'2021-06-27 13:39:40',NULL,NULL,0),(629,652,'Dumbbell should follow slight arch pattern, above upper arm between elbow and chest at bottom, traveling inward over each shoulder at top. See suggested mount & dismount and mount & dismount from special machine rack. Also see elevated foot leg positioning to decrease arch in back and\n\n\nBench Press Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(630,654,'Stirrup should follow slight arch pattern, in front/above of upper arm between elbow and chest in stretched position, travelling inward in front/above shoulder at contracted position.',1,'2021-06-27 13:39:40',NULL,NULL,0),(631,653,'None',1,'2021-06-27 13:39:40',NULL,NULL,0),(632,655,'Keep shoulders internally rotated so elbows point downward at bottom position and outward at top position. Shoulder will likely have less range of motion in lower position as compared to Fly on flat bench.',1,'2021-06-27 13:39:40',NULL,NULL,0),(633,657,'Range of motion will be compromised if grip is too wide.',1,'2021-06-27 13:39:40',NULL,NULL,0),(634,656,'This exercise is typically performed on Lever Incline Chest Press Machine. Seat alterations and precautions during mounting and dismounting of weight will need to be taken since this apperatus is designed for Lever Military Press. Seat should be positioned so base of handles are approximately arm pit height, higher than what is required for military press. Before initiation of movement, lift lever into lower starting position with elbows positioned slightly low. Once first rep is performed, position elbows slightly further out to sides. At bottom position of each rep, lower levers only as far back to allow slight stretch to be felt in chest or shoulders. Once last rep is performed, lower shoulders slightly before lowering levers to resting position.',1,'2021-06-27 13:39:40',NULL,NULL,0),(635,658,'Orientation relative to lever will depend upon height of fulcrum relative to bench. Position body so bar is over shoulders during extension, yet lower on chest in lowest position. Feet can be placed on bench as shown for more comfortable low back positioning. Range of motion will be compromised if grip is too wide.\n\n\nAlso see Bench Press Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(636,659,'Range of motion will be compromised if grip is too wide. See Lever Incline Bench Press improvised on older equipment and\n\n\nexercise performed with parallel grip. Also see Bench Press Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(637,660,'Seat should be adjusted, so handles are to sides of lower chest. Parallel grip tends to place shoulders in a more stable position, with arms closer to sides, which may be more ideal for those with certain shoulder issues. See exercise on alternative machine. Also see exercise performed with standard grip providing greater emphasis on chest development.\n\n\nAlso see Bench Press Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(638,661,'Range of motion will be compromised if grip is too wide. Also see exercise performed with parallel grip and exercise performed on alternative machine.\n\n\nAlso see Bench Press Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(639,662,'Seat should be adjusted so handles are to sides of lower chest. Parallel grip tends to place shoulders in a more stable position, with arms closer to sides, which may be more ideal for those with certain shoulder issues. Also see exercise performed with standard grip providing greater emphasis on chest development.\n\n\nAlso see Bench Press Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(640,663,'Some machines have foot levers to position handles in a more comfortable starting position. If available, push lever with foot, grasp bar, and release foot lever.',1,'2021-06-27 13:39:40',NULL,NULL,0),(641,665,'Some machines have foot levers to position handles in a more comfortable starting and ending position. If foot lever is available, engage it before releasing grips.',1,'2021-06-27 13:39:40',NULL,NULL,0),(642,664,'Range of motion will be compromised if grip is too wide.',1,'2021-06-27 13:39:40',NULL,NULL,0),(643,668,'Elbows should be pointing downward at bottom of motion and outward on top of motion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(644,666,'Range of motion will be compromised if grip is too wide.\n\n\nAlso see Bench Press Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(645,667,'Range of motion will be compromised if grip is too wide or necked is protracted. Very high elevations may not involve sternal head of pectoralis major. Lower elevations will target sternal head of pectoralis major but still involve clavicular head of pectoralis major as synergist.',1,'2021-06-27 13:39:40',NULL,NULL,0),(646,669,'Pike Push-up (for upper chest) differs from Pike Press (for front delts) in that, feet are further away from hands so body is less inverted in lowest position.',1,'2021-06-27 13:39:40',NULL,NULL,0),(647,670,'Range of motion will be compromised if grip is too wide or necked is protracted. Very high elevations may not involve sternal head of pectoralis major. Lower elevations will target sternal head of pectoralis major, but still involve clavicular head of pectoralis major as synergist.',1,'2021-06-27 13:39:40',NULL,NULL,0),(648,671,'This dynamic shoulder girdle stretch exercises rhomboids and trapezius isometrically while stretching pectoralis minor and major. It can be prescribed for protracted shoulder girdle. Continuously push shoulders and back of arms into floor or mat throughout stretch. Although arms move slowly throughout stretch, shoulder blades, elbows, and wrists are continuously pushing back against floor or mat. Position pelvis back so low back remains on floor or mat. See movement in Wall Shoulder Girdle Stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(649,677,'None.',1,'2021-06-27 13:39:40',NULL,NULL,0),(650,678,'This dynamic shoulder girdle stretch exercises rhomboids and trapezius isometrically while stretching pectoralis minor and major. It can be prescribed for protracted shoulder girdle. Keep lower and upper back against wall. Continuously push shoulders blades and arms into wall throughout stretch. Although arms move slowly throughout stretch, shoulders, elbows, and wrists are continuously pushing back against wall.',1,'2021-06-27 13:39:40',NULL,NULL,0),(651,679,'Keep arms straight throughout execution. For convenience, exercise can be performed immediately after warm up on Lever Incline Chest Press.',1,'2021-06-27 13:39:40',NULL,NULL,0),(652,680,'Keep arms straight throughout execution. For convenience, exercise can be performed immediately after warm up on Barbell Incline Chest Press.',1,'2021-06-27 13:39:40',NULL,NULL,0),(653,681,'Keep arms straight throughout execution. For convenience, exercise can be performed immediately after warm up on Dumbbell Incline Chest Press.',1,'2021-06-27 13:39:40',NULL,NULL,0),(654,685,'None',1,'2021-06-27 13:39:40',NULL,NULL,0),(655,682,'Keep arms straight throughout execution. For convenience, exercise can be performed immediately after warm up on Cable Incline Chest Press.',1,'2021-06-27 13:39:40',NULL,NULL,0),(656,683,'Keep arms straight throughout execution. For convenience, exercise can be performed immediately after warm up on Lever Incline Chest Press. See movment performed on Hammer Front Military Press Machine, which incidentally has favorable position for this movement as compared to Hammer Incline Press.',1,'2021-06-27 13:39:40',NULL,NULL,0),(657,686,'Keep arms straight throughout execution. For convenience, exercise can be performed immediately after warm up on Smith Incline Chest Press.',1,'2021-06-27 13:39:40',NULL,NULL,0),(658,687,'Both upper and lower body must be kept straight throughout movement. See similar Push-up exercises targeting Pectoralis Major.',1,'2021-06-27 13:39:40',NULL,NULL,0),(659,689,'Keep weight above shoulders throughout movement. A standard incline crunch without additional weight should be performed until greater resistance is required. Incline bench shown is designed for chest exercises, not abdominal exercise. Flexible hip flexors are required if bench does not provide for fixed hip flexion. A relatively steep incline is required to adequately position abdominal against load throughout fuller range of motion. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(660,690,'See Spot Reduction Myth. Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. Some individuals may experience low back discomfort if hips are not bent so they must use smaller ball size or lower their hip position on ball.',1,'2021-06-27 13:39:40',NULL,NULL,0),(661,691,'Training partner or trainer may need to assist attaching ankle cuffs to cable. Ankle cuffs may also be attached to cable pulley in lowest position when feet are on floor, but assistance may be needed to raise pulley to bench height. Cable Lying Leg Raise on floor is easier to set up.',1,'2021-06-27 13:39:40',NULL,NULL,0),(662,692,'Keep weight above shoulders throughout movement. Incline can also be elevated to increase resistance. If upper back does not come completely down at end of movement, abdominal muscles may only be isometrically involved in exercise. Pectineus, Adductor Longus, and Brevis do not assist in hip flexion since hips are already initially bent. Knee flexors may be involved as stabilizers if incline is steep and no calf support is used. Incline bench should allow for significant bend in hip as shown. Decline benches designed for chest exercises generally do not offer this positioning. Flexible hip flexors are required if bench does not provide for fixed hip flexion. See Spot Reduction Myth. Also see Dangerous Exercise Essay.',1,'2021-06-27 13:39:40',NULL,NULL,0),(663,693,'See Spot Reduction Myth. Also see movement performed on selectorized apparatus.',1,'2021-06-27 13:39:40',NULL,NULL,0),(664,694,'Movement can also be performed on bench. Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible. See Spot Reduction Myth and Lower Ab Myth. Also see Cable Lying Leg Raise.',1,'2021-06-27 13:39:40',NULL,NULL,0),(665,695,'Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. Waist flexion will occur earlier in lift if legs are straighter or Hamstrings are not that flexible. See Spot Reduction Myth and Lower Ab Myth. Also see Cable Lying Straight Leg Raise.',1,'2021-06-27 13:39:40',NULL,NULL,0),(666,696,'See Spot Reduction Myth. Also see movement performed on dedicated apparatus or plate loaded apparatus.',1,'2021-06-27 13:39:40',NULL,NULL,0),(667,697,'Note movement occurs in waist, not hips. See Spot Reduction Myth. Hyperextension of spine at top of motion is achieved by anterior rotation of pelvis with flexed hips. Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. If two soft stirrups are used instead of rope attachment, grasp stirrups at side of head. Also see alternative technique. Movement can also be performed standing up, see Cable Standing Overhead Crunch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(668,698,'Keep arms fixed in position keeping them close to body throughout movement. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(669,699,'Padded hump should be adjusted to height of low back. See Spot Reduction Myth. Also see Cable Standing Twisting Crunch and Cable Standing Overhead Crunch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(670,700,'Keep weight above shoulders throughout movement. A standard incline crunch without additional weight should be performed until greater resistance is required. Incline bench shown is designed for chest exercises, not abdominal exercise. Flexible hip flexors are required if bench does not provide for fixed hip flexion. A relatively steep incline is required to adequately position abdominal against load throughout fuller range of motion. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(671,701,'Lever fulcrum should be aligned with waist, not hips. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(672,702,'Note movement occurs in waist, not hips. Hyperextension of spine at top of motion is achieved by anterior rotation of pelvis with flexed hips. See Spot Reduction Myth. Two soft stirrups or triceps rope can also be substituted for multi-purpose bar. Also see similar exercises:',1,'2021-06-27 13:39:40',NULL,NULL,0),(673,703,'Note movement occurs in waist, not hips. Hyperextension of spine at top of motion is achieved by anterior rotation of pelvis with flexed hips. See Spot Reduction Myth. Two soft stirrups or multi-exercise bar can be substituted for rope. If two soft stirrups are used, grasp stirrups at side of head. Also see similar exercises:',1,'2021-06-27 13:39:40',NULL,NULL,0),(674,704,'Keep weight above shoulders throughout movement. Incline can also be elevated to increase resistance. If upper back does not come completely down at end of movement, abdominal muscles may only be isometrically involved in exercise. Pectineus, Adductor Longus, and Brevis do not assist in hip flexion since hips are already initially bent. Knee flexors may be involved as stabilizers if incline is steep and no calf support is used. Incline bench should allow for significant bend in hip as shown. Decline benches designed for chest exercises generally do not offer this positioning. Flexible hip flexors are required if bench does not provide for fixed hip flexion. See Spot Reduction Myth. Also see Dangerous Exercise Essay.',1,'2021-06-27 13:39:40',NULL,NULL,0),(675,707,'See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(676,705,'Lever fulcrum should be aligned with waist, not hips. Some lever lying crunch machines have handles to sides. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(677,708,'Exercise is typically performed without added resistance. Rectus Abdominis and Obliques only dynamically contract only if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only isometrically contract to stabilize pelvis and waist during hip flexion; see Lever Vertical Leg Raise. Waist flexion will occur earlier in lift if legs are straighter or Hamstrings are not that flexible. See Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(678,706,'Rectus Abdominis and Obliques dynamically contract only if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only isometrically contract to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible. See Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(679,709,'Weight plates added to upper segment adds resistance, whereas weight plates added to lower segment decreases resistance. Seat can also be turned to either side to emphasize obliques. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(680,710,'See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(681,711,'On some models, feet can be positioned behind pad under seat. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(682,712,'Foot bar should be adjusted to allow for slight bend in knees as hips are forcefully being pushed against hip pad. Throughout exercise, keep arms straight and hips securely pushed back against hip pad. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(683,713,'Maintain shoulders fixed at 90º or greater so upper arm and upper back are close to perpendicular. Men should keep chest close to padded lever. Women may choose to position chest as close as possible without making contact with inside of lever. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(684,714,'If low back does flex near top of motion, abdominal muscles may only be isometrically involved in exercise. Pectineus, Adductor Longus, and Brevis do not assist in hip flexion since hips are already initially bent. Sled pad can be turned to either side to emphasize Obliques. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(685,716,'Taller individuals will place feet on floor, whereas shorter individuals will place feet on feet bars. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(686,715,'See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(687,717,'See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(688,718,'Exercise can be performed without added weight until more resistance is needed. Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. See Arm Position During Waist Exercises and Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(689,719,'Exercise can be performed without added weight until more resistance is needed. Leg elevation keeps pelvis tilted back keeping low back on mat. See Arm Position During Waist Exercises and Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(690,720,'Exercise can be performed without added weight until more resistance is needed. Elevate incline to increase resistance. See Arm Position During Waist Exercises. If no knee support is built in to incline board, ball can be placed under legs as illustrated. Hip and knee flexors may be involved as stabilizers if incline is steep and no calf support is used. See advanced technique and Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(691,721,'Exercise can be performed without added weight until more resistance is needed. Elevate incline to increase resistance. Elbows can also raise up over knees during each Sit-up to increase range of motion. Also see Arm Position During Waist Exercises. If no knee support is built in to incline board, ball can be placed under legs as illustrated. If upper back does not come completely down at end of movement, abdominal muscles may only be isometrically involved in exercise. Pectineus, Adductor Longus, and Brevis do not assist in hip flexion since hips are already initially bent. Knee flexors may be involved as stabilizers if incline is steep and no calf support is used. See Spot Reduction Myth. Also see Dangerous Exercise Essay.',1,'2021-06-27 13:39:40',NULL,NULL,0),(692,722,'Exercise can be performed without added weight until more resistance is needed. Incline can also be elevated to increase resistance. See Arm Position During Waist Exercises. Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. If upper back does not come completely down at end of movement, abdominal muscles may only be isometrically involved in exercise. Pectineus, Adductor Longus, and Brevis do not assist in hip flexion since hips are already initially bent. Knee flexors may be involved as stabilizers if incline is steep and no calf support is used. See Spot Reduction Myth. Also see Dangerous Exercise Essay.',1,'2021-06-27 13:39:40',NULL,NULL,0),(693,723,'If ball is positioned lower than upper chest (eg: over waist), effective resistance dramatically diminishes. See how length of lever arm affects resistance. Movement can be made easier by positioning hips low on ball. In contrast, exercise can be made more challenging by using positioning ball lower on back and hips higher. Some individuals may experience low back discomfort if hips are not bent so they must use smaller ball size or lower their hip position on ball. See Arm Position During Waist Exercises and Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(694,724,'Exercise can be performed without added weight until more resistance is needed. Elevate incline to increase resistance. See Arm Position During Waist Exercises. Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. Hip and knee flexors may be involved as stabilizers if incline is steep and no calf support is used. Also see intermediate technique. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(695,726,'Intensity can be increased by using heavier medicine ball,\nby performing movement faster, using\noverhead throwing motion. If upper back does not come completely down\nat end of movement, abdominal muscles may only be\nisometrically\ninvolved in exercise. See similar plyometric movement: Medicine Ball Situp (with partner). See Spot Reduction Myth and Dangerous Exercise Essay.',1,'2021-06-27 13:39:40',NULL,NULL,0),(696,725,'Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. Exercise can be performed without added weight until more resistance is needed. Movement can be made easier by positioning hips low on ball. In contrast, exercise can be made more challenging by using positioning ball lower on back and hips higher. Some individuals may experience low back discomfort if hips are not bent so they must use smaller ball size or lower their hip position on ball. See Arm Position During Waist Exercises and Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(697,727,'Feet can be held down by partner instead of foot bar. Exercise can be performed without added weight until more resistance is needed. Exercise can be performed on incline board to increase resistance or decline board to decrease resistance. See Arm Position During Waist Exercises. Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. If upper back does not come completely down at end of movement, abdominal muscles may only be isometrically involved in exercise. Pectineus, Adductor Longus, and Brevis do not assist in hip flexion since hips are already initially bent. See Spot Reduction Myth. Also see Dangerous Exercise Essay.',1,'2021-06-27 13:39:40',NULL,NULL,0),(698,728,'If feet are close to hips, bent arms can be lifted above knees, allowing for complete range of motion resulting in a more bell shaped resistance curve (ie: lessened resistance at top of movement) due to more varying force vectors against gravity. The same can be accomplished by placing feet slightly further away from hips, requiring no need to lift arms above knees (as shown).',1,'2021-06-27 13:39:40',NULL,NULL,0),(699,729,'Intensity can be increased by using heavier medicine ball or by performing movement faster. Movement can be made easier by using chest throw motion. If upper back does not come completely down at end of movement, abdominal muscles may only be isometrically involved in exercise. See similar plyometric movement: Medicine Ball Situp (with partner). See Spot Reduction Myth and Dangerous Exercise Essay.',1,'2021-06-27 13:39:40',NULL,NULL,0),(700,730,'Exercise can be performed without added weight until more resistance is needed. Rectus Abdominis and Obliques dynamically contract only if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only isometrically contract to stabilize pelvis and waist during hip flexion; see Weighted Vertical Leg Raise. It may be necessary to completely flex hips before waist flexion is possible. See Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(701,731,'Exercise can be performed without added weight until more resistance is needed. Rectus Abdominis and Obliques dynamically contract only if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only isometrically contract to stabilize pelvis and waist during hip flexion; see Weighted Vertical Leg Raise. It may be necessary to completely flex hips before waist flexion is possible. See Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(702,732,'This exercise is alternative to Vertical Leg-hip Raise when apparatus is not available, or Hanging Leg-hip Raise when high bar is not available or too low to allow for adequate leg clearance. Exercise can be performed without added weight until more resistance is needed. Rectus Abdominis and Obliques dynamically contract only if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only isometrically contract to stabilize pelvis and waist during hip flexion; see Weighted Vertical Leg Raise on parallel bars. It may be necessary to completely flex hips before waist flexion is possible. See Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(703,733,'Exercise can be performed without added weight until more resistance is needed. When raising hips, keep knees fully flexed, so as not to throw weight of lower legs over head. Rectus Abdominis and Obliques dynamically contract only if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only isometrically contract to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible. See Spot Reduction Myth and Lower Ab Myth. Also see Weighted Incline Leg Raise.',1,'2021-06-27 13:39:40',NULL,NULL,0),(704,734,'Exercise can be performed without added weight until more resistance is needed. Also see Hanging Leg Hip Raise with Ab Straps. Rectus Abdominis and Obliques dynamically contract only if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only isometrically contract to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible. See Spot Reduction Myth and Lower Ab Myth. Also Weighted Hanging Leg Raise.',1,'2021-06-27 13:39:40',NULL,NULL,0),(705,735,'Exercise can be performed without added weight until more resistance is needed. Certain individuals ma\n\n\ny need to keep their neck in neutral position with space between their chin and sternum. See Spot Reduction Myth and Arm Position During Waist Exercises.',1,'2021-06-27 13:39:40',NULL,NULL,0),(706,736,'Exercise can be performed without added weight until more resistance is needed. See Arm Position During Waist Exercises. Elevate incline to increase resistance. If no knee support is built in to incline board, ball can be placed under legs as illustrated.',1,'2021-06-27 13:39:40',NULL,NULL,0),(707,737,'To allow for full range of motion, grip height on strap should not allow weight to bottom out (weights touching stack) when shoulders are back. Padded hump should be adjusted to height of low back. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(708,738,'Seat can also be locked straight or to one side. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(709,739,'Exercise can be performed without added weight until more resistance is needed. Elevate incline to increase resistance. When raising hips, keep knees fully flexed, so as not to throw weight of lower legs over head.',1,'2021-06-27 13:39:40',NULL,NULL,0),(710,740,'Exercise can be performed without added weight until more resistance is needed. Elevate incline to increase resistance. See Arm Position During Waist Exercises. Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. If upper back does not come completely down at end of movement, abdominal muscles may only be isometrically involved in exercise. Pectineus, Adductor Longus, and Brevis do not assist in hip flexion since hips are already initially bent. Knee flexors may be involved as stabilizers if incline is steep and no calf support is used. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(711,741,'If weight is held behind head, position head hanging off bench. See Spot Reduction Myth. Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. See Arm Position During Waist Exercises.',1,'2021-06-27 13:39:40',NULL,NULL,0),(712,742,'Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. Exercise can be performed without added weight until more resistance is needed. Movement can also be made easier by po\n\n\nsitioning hip low on ball or by using no added weight. In contrast, exercise can be made more challenging by positioning hip higher on ball. In which case, feet may be placed against base of wall for stability. Also see Spot Reduction Myth and Arm Position During Waist Exercises.',1,'2021-06-27 13:39:40',NULL,NULL,0),(713,743,'Crossed arms can also be brought up above knees at top to increase range of motion. Exercise can be performed without added weight until more resistance is needed. Elevate incline to increase resistance. See Arm Position During Waist Exercises. If no knee support is built in to incline board, ball can be placed under legs as illustrated. Elbows can be raised over opposing knees for fuller range of motion. If upper back does not come completely down at end of movement, abdominal muscles may only be isometrically involved in exercise. Pectineus, Adductor Longus, and Brevis do not assist in hip flexion since hips are already initially bent. Knee flexors may be involved as stabilizers if incline is steep and no calf support is used. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(714,744,'Certain individuals may need to keep their neck in neutral position with space between their chin and sternum, particularly if hands are placed behind head. See Spot Reduction Myth. Also see Curl-up / Half Sit-up Test.',1,'2021-06-27 13:39:40',NULL,NULL,0),(715,746,'Feet can be held down by partner instead of foot bar. Exercise can be performed without added weight until more resistance is needed. Add more weight or perform on incline board to increase resistance. Also see Arm Position During Waist Exercises. Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. Also see exercise with weight placed on chest. If upper back does not come completely down at end of movement, abdominal muscles may only be isometrically involved in exercise. Pectineus, Adductor Longus, and Brevis do not assist in hip flexion since hips are already initially bent. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(716,745,'Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(717,747,'Leg elevation keeps pelvis tilted back, keeping low back on mat. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(718,748,'Weight can be held behind neck. Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. Exercise can be performed without added weight until more resistance is needed. Movement can be made easier by positioning hips low on ball. In contrast, exercise can be made more challenging by positioning ball lower on back and hips higher. Some individuals may experience low back discomfort if hips are not bent, so they must use smaller ball size or lower their hip position on ball. See Arm Position During Waist Exercises and Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(719,749,'Exercise can be performed without added weight until more resistance is needed. Add more weight or perform on incline board to increase resistance. Also see Arm Position During Waist Exercises and movement with weight placed behind head. If upper back does not come completely down at end of movement, abdominal muscles may only be isometrically involved in exercise. Pectineus, Adductor Longus, and Brevis do not assist in hip flexion since hips are already initially bent. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(720,750,'Hip may move slightly during exercise. Exercise can be performed with added resistance if needed, by holding weight above. Quadriceps were not listed under stabilizers since they are not under significant resistance. Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. See Arm Position During Waist Exercises and Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(721,751,'Begin each repetition with upper back on floor to allow abdominal muscles to work dynamically. The Rectus Abdominis and Obliques dynamically contract only when actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only isometrically contract to stabilize pelvis and waist during hip flexion. See Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(722,752,'If no knee support is built in to incline board, ball can be placed under legs. Hip and knee flexors may be involved as stabilizers if incline is steep and no calf support is used. Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(723,753,'Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. Some individuals may experience low back discomfort if hips are not bent so they must use smaller ball size or lower their hip position on ball. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(724,755,'If no knee support is built in to incline board, ball can be placed under legs. Hip and knee flexors may be involved as stabilizers if incline is steep and no calf support is used. See Spot Reduction Myth .',1,'2021-06-27 13:39:40',NULL,NULL,0),(725,757,'Attempt to decrease shoulder flexion during movement. Rectus Abdominis and Obliques only dynamically contract if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only isometrically contract to stabilize pelvis and waist during hip flexion. Waist flexion will occur earlier in lift if legs are straighter or Hamstrings are not that flexible. Also known as \'Toes-to-Bar\' or \'\n\n\nStrict Toes-to-Bar\'. See Spot Reduction Myth and Lower Ab Myth. Also Weighted Hanging Straight Leg Raise.',1,'2021-06-27 13:39:40',NULL,NULL,0),(726,759,'When raising hips, keep knees fully flexed, so as not to throw weight of lower legs over head. Rectus Abdominis and Obliques dynamically contract only if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only isometrically contract to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible. See Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(727,756,'Exercise can be performed without ab straps just by hanging from bar. Rectus Abdominis and Obliques only dynamically contract if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only isometrically contract to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible. See Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(728,758,'When raising hips, keep knees fully flexed, so as not to throw weight of lower legs over head. Rectus Abdominis and Obliques dynamically contract only if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only isometrically contract to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible. See Spot Reduction Myth and Lower Ab Myth. Also see Incline Leg Raise.',1,'2021-06-27 13:39:40',NULL,NULL,0),(729,754,'Some individuals may experience low back discomfort if hips are not bent so they must use smaller ball size or lower their hip position on ball. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(730,760,'This exercise is alternative to Vertical Leg-hip Raise when apparatus is not available, or Hanging Leg-hip Raise when high bar is not available or too low to allow for adequate leg clearance. Rectus Abdominis and Obliques dynamically contract only if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only isometrically contract to stabilize pelvis and waist during hip flexion; see Weighted Vertical Leg Raise on parallel bars. It may be necessary to completely flex hips before waist flexion is possible. See Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(731,761,'When raising hips, keep knees fully flexed, so as not to throw weight of lower legs over head. Rectus Abdominis and Obliques dynamically contract only if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only isometrically contract to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible. See Spot Reduction Myth and Lower Ab Myth. Also Incline Leg-Hip Raise on incline board.',1,'2021-06-27 13:39:40',NULL,NULL,0),(732,763,'This exercise is alternative to Hanging Straight Leg-Hip Raise when high bar is not available or too low to allow for adequate leg clearance. Rectus Abdominis and Obliques dynamically contract only if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only isometrically contract to stabilize pelvis and waist during hip flexion; see Weighted Vertical Leg Raise on parallel bars. It may be necessary to completely flex hips before waist flexion is possible. Waist flexion will occur earlier in lift if legs are straighter or Hamstrings are not that flexible. See Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(733,765,'Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. If no knee support is built in to incline board, ball can be placed under legs. If upper back does not come completely down at end of movement, abdominal muscles may only be isometrically involved in exercise. Pectineus, Adductor Longus, and Brevis do not assist in hip flexion since hips are already initially bent. Knee flexors may be involved as stabilizers if incline is steep and no calf support is used. See Spot Reduction Myth. Also see Dangerous Exercise Essay.',1,'2021-06-27 13:39:40',NULL,NULL,0),(734,762,'Rectus Abdominis and Obliques dynamically contract only if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only isometrically contract to stabilize pelvis and waist during hip flexion; see Weighted Vertical Leg Raise. It may be necessary to completely flex hips before waist flexion is possible. See Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(735,764,'Rectus Abdominis and Obliques dynamically contract only if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only isometrically contract to stabilize pelvis and waist during hip flexion; see Weighted Vertical Leg Raise. It may be necessary to completely flex hips before waist flexion is possible. See Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(736,766,'If no knee support is built in to incline board, ball can be placed under legs. If upper back does not come completely down at end of movement, abdominal muscles may only be isometrically involved in exercise. Pectineus, Adductor Longus, and Brevis do not assist in hip flexion since hips are already initially bent. Knee flexors may be involved as stabilizers if incline is steep and no calf support is used. See Spot Reduction Myth. Also see Dangerous Exercise Essay.',1,'2021-06-27 13:39:40',NULL,NULL,0),(737,767,'See Arm Position During Waist Exercises.',1,'2021-06-27 13:39:40',NULL,NULL,0),(738,768,'Feet can be held down by partner instead of foot bar. Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. If upper back does not come completely down at end of movement, abdominal muscles may only be isometrically involved in exercise. Pectineus, Adductor Longus, and Brevis do not assist in hip flexion since hips are already initially bent. See Spot Reduction Myth. Also see Dangerous Exercise Essay.',1,'2021-06-27 13:39:40',NULL,NULL,0),(739,769,'If upper back does not come completely down at end of movement, abdominal muscles may only be isometrically involved in exercise. Pectineus, Adductor Longus, and Brevis do not assist in hip flexion since hips are already initially bent. See Spot Reduction Myth. Also see Dangerous Exercise Essay.',1,'2021-06-27 13:39:40',NULL,NULL,0),(740,771,'See Suspended Prone Feet Mount/Dismount. Keep shins close to horizontal and arms straight with shoulders positioned above hands. Dismount by removing straps while kneeling or after sitting on one side of hip before rotating body to seated position. This exercise can be performed on TRXⓇ style suspension trainer.',1,'2021-06-27 13:39:40',NULL,NULL,0),(741,772,'If upper back does not come completely down at end of movement, abdominal muscles may only be isometrically involved in exercise. Pectineus, Adductor Longus, and Brevis do not assist in hip flexion since hips are already initially bent. See Spot Reduction Myth. Also see Dangerous Exercise Essay.',1,'2021-06-27 13:39:40',NULL,NULL,0),(742,775,'None.',1,'2021-06-27 13:39:40',NULL,NULL,0),(743,773,'See Suspended Supine Feet Mount/Dismount. Abdominals are exercised during spinal flexion , whereas, Erector Spinae is exercised during spinal extension. See Spot Reduction Myth and Lower Ab Myth. This exercise can be performed on TRXⓇ style suspension trainer.',1,'2021-06-27 13:39:40',NULL,NULL,0),(744,774,'Keep knees straight throughout movement. Begin each repetition with upper back on floor to allow abdominal muscles to work dynamically. The Rectus Abdominis and Obliques dynamically contract only when actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only isometrically contract to stabilize pelvis and waist during hip flexion. See Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(745,776,'See Suspended Prone Feet Mount/Dismount . Keep shins close to horizontal and arms straight with shoulders positioned above hands. Dismount by removing straps, while kneeling or after sitting on one side of hip before rotating body to seated position. This exercise can be performed on TRXⓇ style suspension trainer.',1,'2021-06-27 13:39:40',NULL,NULL,0),(746,778,'Muscles are exercised isometrically. Exercise can also be performed with straight supporting arms in pushup stance. Also see Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(747,779,'For beginners or those with less flexibility, position forearms on floor. Arms can also be positioned somewhat bent as an intermediate version of this stretch. Also known as Cobra pose in yoga.',1,'2021-06-27 13:39:40',NULL,NULL,0),(748,780,'The lying (supine) stretch may be more appropriate for certain populations than other more advanced abdominal stretches .',1,'2021-06-27 13:39:40',NULL,NULL,0),(749,781,'Pelvis may anteriorly rotate slightly.',1,'2021-06-27 13:39:40',NULL,NULL,0),(750,782,'Exercise is typically performed isometrically but can also be performed dynamically. Exercise can be performed in most any posture, eg: seated, standing, etc.\n\n\nSee Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(751,783,'See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(752,784,'Place feet wide for support, or if straddling bench, slightly squeeze legs on sides of bench to prevent shifting. Upper body stabilizing occurs primarily on far side through isometric shoulder abduction and isometric scapular upward rotation. Upper body stabilization also occurs somewhat on near side through shoulder protraction. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(753,785,'Slightly squeeze legs on sides of bench to prevent shifting. Bench should be far enough away from cable pulley so cable is taut when stirrup is turned back toward cable pulley. See side view and Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(754,787,'Note movement occurs in waist, not hips. See Spot Reduction Myth. Hyperextension of spine at top of motion is achieved by anterior rotation of pelvis with flexed hips. Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. If two soft stirrups are used instead of rope attachment, grasp stirrups at side of head.',1,'2021-06-27 13:39:40',NULL,NULL,0),(755,788,'Keep stirrup attachment near side of shoulder with elbow down to side. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(756,789,'To allow for full range of motion, grip height on strap should not allow weight to bottom out (weights touching stack) when shoulders are back. Padded hump should be adjusted to height of low back. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(757,790,'Both arms should be kept straight and perpendicular to torso. Hips should also be kept nearly straight, only slightly bent. Also see other view.',1,'2021-06-27 13:39:40',NULL,NULL,0),(758,791,'Both arms should be horizontal and straight. This movement arguably involves more hip internal rotation and transverse adduction than spinal rotation. Although it is considered oblique movement, remarkably little rotation actually occurs through spine, although rotators of spine act largely as stabilizers except at very beginning and end of motion where resistance from cable is minimal. A large part of rotational force actually occurs through rotation/transverse adduction of forward hip. Because rear leg is only supported by forefoot, hip of forward leg is utilized much greater than hip of rear leg since forward leg offers more secured base of support. Continued rotation would occur through spine except when cable makes contact with body precluding further movement and resistance would no longer be provided through cable since line of force is no longer perpendicular line of pull. Seated oblique exercises or those exercises where hips are stabilized allow for greater range of movement through spine. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(759,792,'Both arms should be straight following diagonal path upward. Both arms should be horizontal and straight. This movement arguably involves more hip internal rotation and transverse adduction than spinal rotation. Although it is considered oblique movement, remarkably little rotation actually occurs through spine, although rotators of spine act largely as stabilizers except at very beginning and end of motion where resistance from cable is minimal. A large part of rotational force actually occurs through rotation/transverse adduction of forward hip. Because rear leg is only supported by forefoot, hip of forward leg is utilized much greater than hip of rear leg since forward leg offers more secured base of support. Continued rotation would occur through spine except cable when makes contact with body, precluding further movement and resistance would no longer be provided through cable since line of force is no longer perpendicular to line of pull. Seated oblique exercises or those exercises where hips are stabilized allow for greater range of movement through spine. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(760,793,'Both arms should be straight following diagonal path downward. This movement arguably involves more hip internal rotation and transverse adduction than spinal rotation. Although it is considered oblique movement, remarkably little rotation actually occurs through spine, although rotators of spine act largely as stabilizers except at very beginning and end of motion where resistance from cable is minimal. A large part of rotational force actually occurs through rotation/transverse adduction of forward hip. Because rear leg is only supported by forefoot, hip of forward leg is utilized much greater than hip of rear leg since forward leg offers more secured base of support. Continued rotation would occur through spine except when cable would make contact with body precluding further movement and resistance would no longer be provided through cable since line of force is no longer perpendicular line of pull. Seated oblique exercises or those exercises where hips are stabilized allow for greater range of movement through spine. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(761,794,'See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(762,795,'Both arms should be kept straight and perpendicular to torso. Hips should also be kept nearly straight, only slightly bent. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(763,796,'Maintain shoulder fixed at approximately 90º so upper arm and upper back are perpendicular. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(764,797,'Weight plates added to upper segment adds resistance, whereas, weight plates added to lower segment decreases resistance. Seat can also be oriented straight. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(765,800,'See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(766,799,'See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(767,801,'Keep arm holding dumbbell approximately vertical (below shoulder) throughout movement. See Spot Reduction Myth and Arm Position During Waist Exercises.',1,'2021-06-27 13:39:40',NULL,NULL,0),(768,802,'See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(769,803,'Greater surface area of torso resting padded lever supports significantly reduces involvement of upper body stablizing muscles as compared to Lever Seated Twist. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(770,805,'See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(771,806,'If low back does flex near top of motion, abdominal muscles may only be isometrically involved in exercise. Pectineus, Adductor Longus, and Brevis do not assist in hip flexion since hips are already initially bent. See Leg Hip Raise with sled pad can also be positioned straight. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(772,809,'Stand on platform if lever is too high to allow for full range of movement. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(773,808,'Maintain shoulders fixed at approximately 90º so upper arm and upper back are perpendicular. Men should keep chest close to padded lever. Women may choose to position chest as close as possible without making contact with inside of padded bar. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(774,810,'Maintain knee position throughout movement. For less resistance, do not use additional weight (See Bent-knee lying Twist without ball). See Spot Reduction Myth. Also see Lying Twist with exercise ball.',1,'2021-06-27 13:39:40',NULL,NULL,0),(775,812,'See Spot Reduction Myth and Arm Position During Waist Exercises.',1,'2021-06-27 13:39:40',NULL,NULL,0),(776,811,'Maintain knee position throughout movement. For less resistance, bend knees more and/or do not use additional weight. See Spot Reduction Myth. Also see Bent-knee Lying Twist.',1,'2021-06-27 13:39:40',NULL,NULL,0),(777,813,'Both arms should be kept straight and perpendicular to torso. Hips should also be kept nearly straight, only slightly bent. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(778,817,'Exercise can be performed without added weight until more resistance is needed. Movement can also be made easier by positioning hip low on ball. In contrast, exercise can be made more challenging by positioning hip higher on ball. In which case, feet may be placed against base of wall for stability. See alternative form. Also see Spot Reduction Myth and Arm Position During Waist Exercises.',1,'2021-06-27 13:39:40',NULL,NULL,0),(779,828,'One of very few body weight exercises that directly exercises side deltoid in relatively full range of motion. In addition to lateral flexion of spine, lower hip abducts and upper hip adducts. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(780,826,'Begin with very light weight and add additional weight gradually to allow lower back adequate adaptation. Throughout lift, keep weighted arm and knees straight. Do not pause or bounce at bottom of lift or jerk weight from floor. Lower back may bend slightly during full hip flexion or it can be kept straight. Do not lower weight beyond mild stretch throughout hamstrings and low back. Full rang\n\n\ne of motion will vary from person to person depending on flexibility. See Dangerous Exercise Essay and Kettlebell Straight-leg Deadlift.',1,'2021-06-27 13:39:40',NULL,NULL,0),(781,827,'Maintain knee position throughout movement. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(782,829,'Maintain knee position throughout movement. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(783,830,'In addition to lateral flexion of spine, lower hip abducts and upper hip adducts. Exercise can also be performed isometrically, see Side Plank. Also see Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(784,831,'In addition to lateral flexion of spine, lower hip abducts and upper hip adducts. Exercise can also be performed isometrically, see Bent Knee Side Plank. Gracilis of upper leg enters into active insufficiency with hip extended and knee flexed. Also see Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(785,832,'See alternative form. Also see Spot Reduction Myth and Arm Position During Waist Exercises.',1,'2021-06-27 13:39:40',NULL,NULL,0),(786,833,'See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(787,835,'If upper back does not come completely down at end of movement, abdominal muscles may only be isometrically involved in exercise. Pectineus, Adductor Longus, and Brevis do not assist in hip flexion since hips are already initially bent. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(788,834,'Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. If no knee support is built in to incline board, ball can be placed under legs. Hip and knee flexors may be involved as stabilizers if incline is steep and no calf support is used. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(789,836,'Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. If no knee support is built in to incline board, ball can be placed under legs. If upper back does not come completely down at end of movement, abdominal muscles may only be isometrically involved in exercise. Pectineus, Adductor Longus, and Brevis do not assist in hip flexion since hips are already initially bent. Knee flexors may be involved as stabilizers if incline is steep and no calf support is used. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(790,837,'Feet can be held down by partner instead of foot bar. Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. If upper back does not come completely down at end of movement, abdominal muscles may only be isometrically involved in exercise. Pectineus, Adductor Longus, and Brevis do not assist in hip flexion since hips are already initially bent. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(791,838,'If no knee support is built in to incline board, ball can be placed under legs. Hip and knee flexors may be involved as stabilizers if incline is steep and no calf support is used. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(792,839,'Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. If no knee support is built in to incline board, ball can be placed under legs. If upper back does not come completely down at end of movement, abdominal muscles may only be isometrically involved in exercise. Pectineus, Adductor Longus, and Brevis do not assist in hip flexion since hips are already initially bent. Knee flexors may be involved as stabilizers if incline is steep and no calf support is used. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(793,841,'Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(794,840,'Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. Some individuals may experience low back discomfort if hips are not bent, so they must use smaller ball size or lower their hip position on ball. Also Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(795,842,'Suspension handle(s) can also be gripped with both hands together with either one hand over other hand or with interlaced fingers. In addition to lateral flexion of spine, lower hip abducts and upper hip adducts. Also see Spot Reduction Myth. This exercise can be performed on TRXⓇ style suspension trainer or adjustable length gymnastics rings.',1,'2021-06-27 13:39:40',NULL,NULL,0),(796,843,'Leg elevation keeps pelvis tilted back keeping low back on mat. Certain individuals may need to keep their neck in neutral position with space between their chin and sternum, particularly with their hands are behind their heads. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(797,844,'In addition to lateral flexion of spine, lower hip abducts and upper hip adducts. This exercise can be performed on TRXⓇ style suspension trainer. More popular suspension trainers allow limited slippage, so loop around lower leg can be positioned below loop of upper leg once on side (as shown). Other models can be adjusted, so strap on lower leg is slightly longer than strap on upper leg. Also see Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(798,845,'The exercise can also be mounted from top position in fully rotated position facing perpendicular to suspension straps while positioning feet parallel to straps. Exercise can also be executed by alternating sides, rotating from one side to the other. Dismounting can be achieved either at top of movement when body is fully rotated or hanging at bottom position by walking backward until body is upright. This exercise can be performed on TRXⓇ style suspension trainer or adjustable length gymnastics rings.',1,'2021-06-27 13:39:40',NULL,NULL,0),(799,847,'See Suspended Prone Feet Mount/Dismount. Keep arms straight with shoulders positioned above hands. Dismount by removing straps while kneeling or after sitting on one side of hip, before rotating body to seated position. This exercise can be performed on TRXⓇ style suspension trainer.',1,'2021-06-27 13:39:40',NULL,NULL,0),(800,846,'Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. Some individuals may experience low back discomfort if hips are not bent, so they must use smaller ball size or lower their hip position on ball. Also see Spot Reduction Myth and Arm Position During Waist Exercises.',1,'2021-06-27 13:39:40',NULL,NULL,0),(801,848,'Leg elevation keeps pelvis tilted back keeping low back on mat. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(802,849,'Maintain 90° flexion in hip with both shoulders flat on floor.',1,'2021-06-27 13:39:40',NULL,NULL,0),(803,850,'Also see Pretzel Stretch for Hip Abductors for similar exercise which can be performed with this stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(804,851,'Allow foot of top leg to rest on foot of lower leg. Shoulders can turn away from direction of knees for greater stretch if needed.',1,'2021-06-27 13:39:40',NULL,NULL,0),(805,852,'Keep both shoulders on floor or mat. Allow foot of top leg to rest on foot of lower leg. Arms can be extended to sides.',1,'2021-06-27 13:39:40',NULL,NULL,0),(806,853,'Muscles are exercised isometrically. Movement can also be performed dynamically, moving hip up and down, see Side Bridge. Exercise can also be performed with straight supporting arm. Also see Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(807,854,'Muscles are exercised isometrically. Movement can also be performed dynamically, moving hip up and down, see Bent Knee Side Bridge. Gracilis of upper leg is in active insufficiency with hip extended and knee flexed. Also see Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(808,855,'Adjust lower leg brace so pressure is evenly distributed on thigh pad. Begin with body weight and add additional weight gradually to allow lower back adequate adaptation. Maintain barbell\'s position on back of shoulders when upper body is lowered. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch throughout hamstrings and low back. Full range of motion will vary from person to person. Although articulation of waist is emphasized, some hip extension may accommodate movement. Also see Barbell Hyper-extension and Barbell Back Raise.',1,'2021-06-27 13:39:40',NULL,NULL,0),(809,856,'Target muscle is exercised \n\nisometrically\n\n. Begin with very light weight and add additional weight gradually to allow adequate adaptation. Throughout lift, keep back straight. Knees will have to bend more in those with less hamstring flexibility. Knees can be kept bent throughout movement. Also see straight leg Goodmorning, emphasizing Hamstrings.',1,'2021-06-27 13:39:40',NULL,NULL,0),(810,857,'Target muscle is exercised isometrically. Throughout lift, keep hips low, shoulders high, arms and back straight. Knees should point same direction as feet throughout movement. Keep bar close to body to improve mechanical lev erage. Grip strength and strength endurance often limit ability to perform multiple reps at heavy resistances. Gym chalk, wrist straps, grip work, and mixed grip can be used to enhance grip. Mixed grip indicates one hand holding with overhand grip and other hand holding with underhand grip. Lever barbell jack can be used to lift barbell from floor for easier loading and unload of weight plates.',1,'2021-06-27 13:39:40',NULL,NULL,0),(811,858,'Adjust lower leg brace so pressure is evenly distributed on thigh pad. Begin with body weight and add additional weight gradually to allow lower back adequate adaptation. Maintain barbell\'s position on back of shoulders when upper body is lowered. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch throughout hamstrings and low back. Full range of motion will vary from person to person. Also see Barbell Back Extension and Barbell Hip Extension.',1,'2021-06-27 13:39:40',NULL,NULL,0),(812,860,'Position pad high enough to evenly distribute body weight on thigh but not so high that range of motion is limited; abdomen should not press on top side of pad when upper body is lowered. Begin with body weight and add additional weight gradually to allow lower back adequate adaptation. Maintain barbell\'s position on back of shoulders when upper body is lowered. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch throughout hamstrings and low back. Full range of motion will vary from person to person. Also see Barbell Back Extension and Barbell Hip Extension.',1,'2021-06-27 13:39:40',NULL,NULL,0),(813,859,'Target muscle is exercised isometrically. Heavy barbell deadlifts significantly engages Latissmus Dorsi.',1,'2021-06-27 13:39:40',NULL,NULL,0),(814,861,'Position pad high enough to evenly distribute body weight on thigh but not so high that range of motion is limited; abdomen should not press on top side of pad when upper body is lowered. Begin with body weight and add additional weight gradually to allow lower back adequate adaptation. Maintain barbell\'s position on back of shoulders when upper body is lowered. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch throughout hamstrings and low back. Full range of motion will vary from person to person. Although articulation of waist is emphasized, some hip extension may accommodate movement. Also see Barbell Hyperextension and Barbell Back Raise.',1,'2021-06-27 13:39:40',NULL,NULL,0),(815,862,'Throughout lift, keep hips low, shoulders high, arms and back straight. Knees should point same direction as feet throughout movement. Keep bar close to body to improve mechanical leverage. Grip strength and strength endurance often limit ability to perform multiple reps at heavy resistances. Gym chalk, wrist straps, grip work, and mixed grip can be used to enhance grip. Mixed grip indicates one hand holding with overhand grip and other hand holding with underhand grip.',1,'2021-06-27 13:39:40',NULL,NULL,0),(816,864,'Throughout lift, keep hips low, shoulders high, arms and back straight. Knees should point same direction as feet throughout movement. Keep bar close to body to improve mechanical leverage. Grip strength and strength endurance often limit ability to perform multiple reps at heavy resistances. Gym chalk, wrist straps, grip work, and mixed grip can be used to enhance grip. Mixed grip indicates one hand holding with overhand grip and other hand holding with underhand grip. Lever barbell jack can be used to lift barbell from floor for easier loading and unloading of weight plates.',1,'2021-06-27 13:39:40',NULL,NULL,0),(817,863,'Use shoulder width grip since narrower than shoulder width grip will make it more difficult to lockout at top. Throughout lift, keep hips low, shoulders high, arms and back straight, and knees pointed out same direction as feet. Also, keep bar close to body to improve mechanical leverage. With wide stance, push feet out to sides and not down to prevent knees from buckling inward. Pushing knees out will allow hips to travel toward bar more quickly while improving leverage.',1,'2021-06-27 13:39:40',NULL,NULL,0),(818,865,'Throughout lift, keep hips low, shoulders high, arms and back straight. Knees should point same direction as feet throughout movement. Keep bar close to body to improve mechanical leverage. Grip strength and strength endurance often limit ability to perform multiple reps at heavy resistances. Gym chalk, wrist straps, grip work, and mixed grip can be used to enhance grip. Mixed grip indicates one hand holding with overhand grip and other hand holding with underhand grip.',1,'2021-06-27 13:39:40',NULL,NULL,0),(819,866,'Lower back may bend slightly during hip flexion phase. Erector Spinae is exercised isometrically if low back does articulate as with Straight Back Stiff Leg Deadlift (targeting Glutes). Begin with light weight and add additional weight gradually to allow adequate adaptation. Throughout lift, keep arms straight. Knee can be kept bent throughout movement. Do not stand behind pulleys. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch throughout hamstrings and back When finished with set, dismount by lowering weight with knees bent and low back straight. Full range of motion will vary from person to person. Those with less flexibility may have to bend knees more or they may not even need to stand on platform. See Dangerous Exercise Essay. Also see Straight Leg Deadlift.',1,'2021-06-27 13:39:40',NULL,NULL,0),(820,867,'Lower back may bend slightly during full hip flexion. Erector Spinae is exercised isometrically if low back does articulate as with Straight Back Stiff Leg Deadlift (targeting Glutes). Begin with light weight and add additional weight gradually to allow adequate adaptation. Throughout lift keep arms straight. Knee can be kept bent throughout movement. Keep bar over top of feet, close to legs. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch throughout hamstrings. When finished with set, dismount by lowering weight with knees bent and low back straight. Full range of motion will vary from person to person. Those with less flexibility may have to bend knees more or they may not even need to stand on platform. See Dangerous Exercise Essay. Also see Straight Leg Deadlift.',1,'2021-06-27 13:39:40',NULL,NULL,0),(821,868,'Target muscle is exercised isometrically\n\n\n. Throughout lift, keep hips low, shoulders high, arms and back straight.',1,'2021-06-27 13:39:40',NULL,NULL,0),(822,869,'Lower back may bend slightly during full hip flexion. Erector Spinae is exercised isometrically\n\n\nif low back does articulate as with Straight Back Stiff Leg Deadlift (targeting Glutes). Begin with light weight and add additional weight gradually to allow adequate adaptation. Throughout lift, keep arms straight. Knee can be kept bent throughout movement. Keep bar over top of feet, close to legs. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch throughout hamstrings. When finished with set, dismount by lowering weight with knees bent and low back straight. Full range of motion will vary from person to person. Those with less flexibility may have to bend knees more or they may not even need to stand on platform. See Dangerous Exercise Essay. Also see Straight Leg Deadlift.',1,'2021-06-27 13:39:40',NULL,NULL,0),(823,872,'Begin with very light weight and add additional weight gradually to allow lower back adequate adaptation. Throughout lift keep arms and knees straight. Keep dumbbells close to legs. Do not pause or bounce at bottom of lift. Lower back may bend slightly during full hip flexion phase. Do not lower weight beyond mild stretch throughout hamstrings and low back. Full range of motion will vary from person to person depending on flexibility. See Dangerous Exercise Essay.',1,'2021-06-27 13:39:40',NULL,NULL,0),(824,870,'Begin with very light weight and add additional weight gradually to allow lower back adequate adaptation. Throughout lift keep arms and knees straight. Keep bar over top of feet, close to legs. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch throughout hamstrings and low back. Full range of motion will vary from person to person. Choose platform height that allows contact with floor w\n\n \nith slight stretch or set to height that allows bar to be lowered only millimeters from floor during warm up. This small reserve allows additional room to accommodate the hips loosen up and the grip to give slightly but not so much that would increase risk of descending too far down, beyond a slight stretch. Those with less flexibility may not even need to stand on platform. When finished with set, dismount by lowering weight with knees bent and low back straight. See Dangerous Exercise Essay. Also see Straight Back Straight Leg Deadlift.',1,'2021-06-27 13:39:40',NULL,NULL,0),(825,871,'Not all trap bar designs may allow for this movement. A squared open-ended trap bar is used in this demonstration. Begin with very light weight and add additional weight gradually to allow lower back adequate adaptation. Throughout lift, keep arms and knees straight. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch throughout hamstrings and low back. When finished with set, dismount by lowering weight with knees bent and low back straight. Full range of motion will vary from person to person. Those with less flexibility may need lower platform or may not even need to stand on elevated surface. See Dangerous Exercise Essay. Also see Straight Back Straight Leg Deadlift.',1,'2021-06-27 13:39:40',NULL,NULL,0),(826,874,'Begin with very light weight and add additional weight gradually to allow lower back adequate adaptation. Throughout lift, keep arms and knees straight. Do not stand behind pulleys. Do not pause or bounce at bottom of lift. Lower back may bend slightly during full hip flexion phase. Do not lower weight beyond mild stretch throughout hamstrings and low back. Full range of motion will vary from person to person depending on flexibility. See Dangerous Exercise Essay. Also see Straight Back Straight Leg Deadlift.',1,'2021-06-27 13:39:40',NULL,NULL,0),(827,873,'Target muscle is exercised isometrically\n\n\n. Throughout lift, keep hips low, shoulders high, arms and back straight. Exercise can also be performed facing opposite direction toward fulcrum.',1,'2021-06-27 13:39:40',NULL,NULL,0),(828,876,'Apparatus shown does not allow for full spinal flexion, only allowing for last half of spinal extension.',1,'2021-06-27 13:39:40',NULL,NULL,0),(829,877,'To avoid hip movement, push hips back into seat by pushing feet into platform throughout exercise. Position foot platform, so small space remains between edge of seat and back of lower thigh. Use seat belt if it becomes difficult to stabilize hips. See Low Back Debate. Also see exercises on old Nautilus Machine and MedEx Low Back Machine.',1,'2021-06-27 13:39:40',NULL,NULL,0),(830,878,'Lower back may bend slightly during hip flexion phase. Erector Spinae is exercised isometrically if low back does articulate as with Straight Back Stiff Leg Deadlift (targeting Glutes). Begin with light weight and add additional weight gradually to allow adequate adaptation. Throughout lift, keep arms straight. Knee can be kept bent throughout movement. Do not stand behind lever handles. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch throughout hamstrings and back When finished with set, dismount by lowering weight with knees bent and low back straight. Full range of motion will vary from person to person. Those with less flexibility may have to bend knees more or they may not even need to stand on platform. See Dangerous Exercise Essay.',1,'2021-06-27 13:39:40',NULL,NULL,0),(831,879,'Begin with very light weight and add additional weight gradually to allow lower back adequate adaptation. Throughout lift, keep arms and knees straight. Do not stand behind pulleys. Do not pause or bounce at bottom of lift. Lower back may bend slightly during full hip flexion phase. Do not lower weight beyond mild stretch throughout hamstrings and low back. Full range of motion will vary from person to person depending on flexibility. See Dangerous Exercise Essay. Also see Straight Back Straight Leg Deadlift.',1,'2021-06-27 13:39:40',NULL,NULL,0),(832,880,'Throughout lift, keep hips low, shoulders high, arms and back straight. Keep bar close to body to improve mechanical leverage. See Smith Deadlift under Gluteus Maximus. Also see Deadlift Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(833,881,'Lower back may bend slightly during full hip flexion. Erector Spinae is exercised isometrically\n\n\nif low back does articulate as with Straight Back Stiff Leg Deadlift (targeting Glutes). Begin with light weight and add additional weight gradually to allow adequate adaptation. Throughout lift, keep arms straight. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch throughout hamstrings. Full range of motion will vary from person to person. Those with less flexibility may have to bend their knees more or they may not even need to stand on platform. Knee can be kept bent throughout movement. See Dangerous Exercise Essay. Also see Straight Leg Deadlift.',1,'2021-06-27 13:39:40',NULL,NULL,0),(834,884,'Target muscle is exercised isometrically\n\n\n. Begin with light weight and add additional weight gradually to allow adequate adaptation. Throughout lift, keep back straight. Knees will have to bend more with those with less hamstring flexibility. Knees can be kept bent throughout movement. Also see straight leg Goodmorning emphasizing Hamstrings.',1,'2021-06-27 13:39:40',NULL,NULL,0),(835,885,'Begin with very light weight and add additional weight gradually to allow lower back adequate adaptation. Throughout lift, keep arms and knees straight. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch throughout hamstrings and low back. Full range of motion will vary from person to person. Those with less flexibility may not even need to stand on platform. See Dangerous Exercise Essay. Also see Stiff Leg Deadlift.',1,'2021-06-27 13:39:40',NULL,NULL,0),(836,886,'If weight is positioned behind head, neck extensors act as stabilizers:',1,'2021-06-27 13:39:40',NULL,NULL,0),(837,888,'Adjust lower leg brace so pressure is evenly distributed on thigh pad. Begin with body weight and add additional weight gradually to allow lower back adequate adaptation. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch throughout hamstrings and low back. Full range of motion will vary from person to person. Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. See Arm Position During Waist Exercises. Although articulation of waist is emphasized, some hip extension may accommodate movement. If weight is positioned behind head, neck extensors act as stabilizers.',1,'2021-06-27 13:39:40',NULL,NULL,0),(838,889,'If weight is positioned behind head, neck extensors act as stabilizers:',1,'2021-06-27 13:39:40',NULL,NULL,0),(839,890,'Movement can be made easier by using no additional weight or by positioning hips low on ball. In contrast, exercise can be made more challenging by positioning ball lower toward hip. In which case, feet may be placed against base of wall for stability. See Arm Position During Waist Exercises. If weight is positioned behind head, neck extensors act as stabilizers.',1,'2021-06-27 13:39:40',NULL,NULL,0),(840,891,'Position pad high enough to evenly distribute body weight on thigh but not so high that range of motion is limited; abdomen should not press on top side of pad when upper body is lowered. Begin with body weight and add additional weight gradually to allow lower back adequate adaptation. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch throughout hamstrings and low back. Full range of motion will vary from person to person. Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. See Arm Position During Waist Exercises. Although articulation of waist is emphasized, some hip extension may accommodate movement. If weight is positioned behind head, neck extensors act as stabilizers.',1,'2021-06-27 13:39:40',NULL,NULL,0),(841,893,'If no wall is available, hips can be positioned lower on ball and toes can be positioned out wide on floor for balance.',1,'2021-06-27 13:39:40',NULL,NULL,0),(842,892,'If no wall is available, hips can be positioned lower on ball and toes can be positioned out wide on floor for balance.',1,'2021-06-27 13:39:40',NULL,NULL,0),(843,895,'If no wall is available, hips can be positioned lower on ball and toes can be positioned out wide on floor for balance.',1,'2021-06-27 13:39:40',NULL,NULL,0),(844,896,'Lift leg and arm deliberately with no jerking. Also see Alternating Bird Dog.',1,'2021-06-27 13:39:40',NULL,NULL,0),(845,897,'Lift legs and arms deliberately with no jerking. Also see Bird Dog.',1,'2021-06-27 13:39:40',NULL,NULL,0),(846,898,'Platform should be high enough to allow hips to flex without buttocks contacting floor. Full range of motion will vary from person to person. Adductor Magnus may only assist at initial phase hip extension depending on degree of hip flexion at bottom of movement. Also see Hanging Hamstring Bridge for Hamstrings.',1,'2021-06-27 13:39:40',NULL,NULL,0),(847,899,'Lift leg and arm deliberately with no jerking. Also see Bird Dog (on exercise ball).',1,'2021-06-27 13:39:40',NULL,NULL,0),(848,900,'Adjust lower leg brace so pressure is evenly distributed on thigh pad. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch throughout hamstrings and low back. Full range of motion will vary from person to person.',1,'2021-06-27 13:39:40',NULL,NULL,0),(849,901,'Lift leg and arm deliberately with no jerking. Also see Alternating Bird Dog (one exercise ball).',1,'2021-06-27 13:39:40',NULL,NULL,0),(850,902,'Lift legs and upper body slowly with no jerking or fast movements. Also see Contralateral Superman.',1,'2021-06-27 13:39:40',NULL,NULL,0),(851,903,'Lift legs and arms deliberately with no jerking. Also see bilateral movement: Superman.',1,'2021-06-27 13:39:40',NULL,NULL,0),(852,904,'Adjust lower leg brace so pressure is evenly distributed on thigh pad. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch throughout hamstrings and low back. Full range of motion will vary from person to person. Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. If hands are positioned behind head, neck extensors act as stabilizers:',1,'2021-06-27 13:39:40',NULL,NULL,0),(853,905,'Adjust lower leg brace so pressure is evenly distributed on thigh pad. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch throughout hamstrings and low back. Full range of motion will vary from person to person.',1,'2021-06-27 13:39:40',NULL,NULL,0),(854,906,'Also see Cat Movement.',1,'2021-06-27 13:39:40',NULL,NULL,0),(855,907,'Muscles are exercised isometrically.',1,'2021-06-27 13:39:40',NULL,NULL,0),(856,908,'None',1,'2021-06-27 13:39:40',NULL,NULL,0),(857,909,'Also see Cat Stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(858,910,'Upper back can also be lifted off of floor to stretch Splenius and cervical portion of Erector Spinae.',1,'2021-06-27 13:39:40',NULL,NULL,0),(859,911,'Elbows can be lowered to floor.',1,'2021-06-27 13:39:40',NULL,NULL,0),(860,912,'None',1,'2021-06-27 13:39:40',NULL,NULL,0),(861,913,'An alternative mount involves stepping back with suspension handles in hands until arms are pulled forward about 45° (give or take) from resting position. At this point, recline body back, then fold at hips, allowing rear end to fall far back with arms and shoulders stretched forward. Dismounting can be achieved by walking backward until body is upright. This exercise can be performed on TRXⓇ style suspension trainer or adjustable length gymnastics rings.',1,'2021-06-27 13:39:40',NULL,NULL,0),(862,915,'Muscles are exercised isometrically.',1,'2021-06-27 13:39:40',NULL,NULL,0),(863,916,'None',1,'2021-06-27 13:39:40',NULL,NULL,0),(864,917,'Keep knees pointed same direction as toes. The Soleus may be slightly stretched before leaning back.',1,'2021-06-27 13:39:40',NULL,NULL,0),(865,918,'Avoid overstressing neck anteriorly.',1,'2021-06-27 13:39:40',NULL,NULL,0),(866,919,'Begin with very light weight and add additional weight gradually to allow adequate adaptation. Throughout lift, keep back straight. Hamstrings will be emphasized if knees are straight.',1,'2021-06-27 13:39:40',NULL,NULL,0),(867,926,'Throughout lift, keep arms and back straight. Do not lower weight beyond mild stretch throughout hamstrings. Full range of motion will vary from person to person. Those with less flexibility may need to bend knee of supporting leg more so barbell can contact floor. At top of movement, lifted foot can make contact with floor to maintain balance between repetitions.',1,'2021-06-27 13:39:40',NULL,NULL,0),(868,929,'Throughout lift, keep arms and back straight. Do not lower weight beyond mild stretch throughout hamstrings. Full range of motion will vary from person to person. Stand on shallow platform if weight reaches floor before stretch. Those with less flexibility may have to bend knees more. Knees can be kept bent throughout movement. Also see Stiff Leg Deadlift and Romanian Deadlift.',1,'2021-06-27 13:39:40',NULL,NULL,0),(869,930,'Use bench of lower height 16\" to 18\" (40 to 46 cm) allowing torso to be angled approximately 45º. Bench may need to be secured so it does not slide on floor.',1,'2021-06-27 13:39:40',NULL,NULL,0),(870,931,'Keep torso upright during squat; flexible hip flexors are important. Forward knee should point same direction as foot throughout movement. Also known as Bulgarian Squat.',1,'2021-06-27 13:39:40',NULL,NULL,0),(871,933,'Keep torso upright during lunge; flexible hip flexors are important. Forward knee should point same direction as foot throughout lunge. A long lunge emphasizes Gluteus Maximus; short lunge emphasizes Quadriceps.',1,'2021-06-27 13:39:40',NULL,NULL,0),(872,932,'Keep torso upright during lunge; flexible hip flexors are important. Lead knee should point same direction as foot throughout lunge. A long lunge emphasizes Gluteus Maximus; short lunge emphasizes Quadriceps.',1,'2021-06-27 13:39:40',NULL,NULL,0),(873,935,'Keep torso upright during lunge. Flexible hip adductors will allow fuller range of motion. Lead knee should point same direction as foot throughout lunge. A long lunge emphasizes Gluteus Maximus; short lunge emphasizes Quadriceps.',1,'2021-06-27 13:39:40',NULL,NULL,0),(874,934,'Supporting knee should point same direction as foot throughout movement. Range of motion will be improved with greater leg strength and glute flexibility. Significant spinal flexion occurs at bottom of deep single leg squat to maintain center of gravity over foot. Erector Spinae becomes a stabilizer if spine is kept straight.',1,'2021-06-27 13:39:40',NULL,NULL,0),(875,936,'Keep head facing forward, back straight and feet flat on floor; equal distribution of weight through forefoot and heel. Knees should point same direction as feet throughout movement. At bottom of squat, crease at hips must be lower than top of knee cap. Also see:',1,'2021-06-27 13:39:40',NULL,NULL,0),(876,937,'Keep torso upright during lunge; flexible hip flexors are important. Lead knee should point same direction as foot throughout lunge. A long lunge emphasizes Gluteus Maximus; short lunge emphasizes Quadriceps. Tibialis Anterior is exercised eccentrically during landing on heel.',1,'2021-06-27 13:39:40',NULL,NULL,0),(877,938,'Knees should point same direction as feet throughout movement. Heel of rear foot can be kept elevated off floor throughout movement. Keep torso upright during squat; flexible hip flexors are important. With feet further apart: Gluteus Maximus is emphasized, Quadriceps are less emphasized.',1,'2021-06-27 13:39:40',NULL,NULL,0),(878,939,'Keep head facing forward, back straight and feet flat on floor; equal distribution of weight through forefoot and heel. Knees should point same direction as feet throughout movement. Exercise can also be performed holding onto supports or with long handled safety bar. Also see Squat Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(879,940,'Keep head facing forward, back straight and feet flat on floor; equal distribution of weight through forefoot and heel. Knees should point same direction as feet throughout movement. Hip and ankle flexibility is important for both execution and safety in this movement. See Full Squat Flexibility. Certain knee and low back problems may be aggravated by this exercise. See Full Squat Analysis and Deep Squat Test. See spotting technique and spotting assistance.',1,'2021-06-27 13:39:40',NULL,NULL,0),(880,941,'Keep head facing forward, back straight and feet flat on floor; equal distribution of weight through forefoot and heel. Knees should point same direction as feet throughout movement. Exercise can also be performed holding onto supports or with safety bar without bar handles. Also see Squat Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(881,942,'Throughout lift, keep hips low, shoulders high, arms and back straight. Knees should point same direction as feet throughout movement. See flawed demonstration showing depth of hack squat that is NOT sufficient and knees are NOT pointed same angle as feet. Individuals with short arm to torso ratio or protracted shoulder posture, may find this exercise very difficult to perform. See Squat Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(882,943,'Try to keep knees from traveling forward while reaching rear end back onto squat box. Ideally, knees could be behind ankles. In this position, greater stretch reflex can be created through hips (via hamstrings) once torso rocks forward just before squat. However, other hip extensors can engage in stretch-shortening cycle (although to lesser extend in this position) in lieu of hamstrings\' optimized involvement.',1,'2021-06-27 13:39:40',NULL,NULL,0),(883,944,'Turning knuckles up places bar more on Brachioradialis rather than more sensitive crook of elbow. Keep head facing forward, back straight and feet flat on floor; equal distribution of weight through forefoot and heel. Knees should point same direction as feet throughout movement. Also see rear side view.',1,'2021-06-27 13:39:40',NULL,NULL,0),(884,945,'Keep head facing forward, back straight and feet flat on floor; equal distribution of weight through forefoot and heel. Knees should point same direction as feet throughout movement. If handles are not available, horizontal bars on rack can be used for assistance if needed. Exercise can also be performed without holding onto supports. Also see Squat Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(885,946,'An inverted squared open-ended trap bar is used in this demonstration. Keep head facing forward, back straight and feet flat on floor; equal distribution of weight through forefoot and heel. Knees should point same direction as feet throughout movement. See Squat Analysis. Also see Trap Bar Deadlift.',1,'2021-06-27 13:39:40',NULL,NULL,0),(886,947,'Chains provide increasing resistance as barbell moves away from floor. Keep head facing forward, back straight and feet flat on floor; equal distribution of weight through forefoot and heel. Knees should point same direction as feet throughout movement. See spotting technique and spotting assistance. See Squat for targeting Quadriceps and Squat Analysis. Also see Squat Strength Standards.',1,'2021-06-27 13:39:40',NULL,NULL,0),(887,948,'Keep head facing forward, back straight and feet flat on floor; equal distribution of weight through forefoot and heel. Knees should point same direction as feet throughout movement. See Squat Analysis. Also see weightlifting style Front Squat.',1,'2021-06-27 13:39:40',NULL,NULL,0),(888,949,'Keep torso upright during exercise. Stepping knee should point same direction as foot. A modest degree of knee rotation occurs during this movement. See Controversial Exercises and Rotary Force in Squat Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(889,950,'Keep torso upright during lunge; flexible hip flexors are important. Forward knee should point same direction as foot throughout movement. A long lunge emphasizes Gluteus Maximus; short lunge emphasizes Quadriceps. See Cable Rear Step-down Lunge for similar exercise.',1,'2021-06-27 13:39:40',NULL,NULL,0),(890,952,'Keep torso upright during exercise. Forward knee should point same direction as foot throughout movement. Stepping distance from bench emphasizes Gluteus Maximus; stepping close to bench emphasizes Quadriceps.',1,'2021-06-27 13:39:40',NULL,NULL,0),(891,954,'Not all trap bar designs may allow for this movement. A squared open-ended trap bar is used in this demonstration. Throughout lift, keep arms and back straight. Do not lower weight beyond mild stretch throughout hamstrings. Full range of motion will vary from person to person. Those with less flexibility may have to bend knees more. Knees can be kept bent throughout movement.',1,'2021-06-27 13:39:40',NULL,NULL,0),(892,956,'Knees should point same direction as feet throughout movement. Heel of rear foot can be kept elevated off floor throughout movement as shown. Keep torso upright during squat; flexible hip flexors are important. With feet further apart: Gluteus Maximus is emphasized, Quadriceps are less emphasized. Also know as Cable Lunge.',1,'2021-06-27 13:39:40',NULL,NULL,0),(893,957,'Keep torso upright during lunge; flexible hip flexors are important. Forward knee should point same direction as foot throughout lunge. A long lunge emphasizes Gluteus Maximus; short lunge emphasizes Quadriceps.',1,'2021-06-27 13:39:40',NULL,NULL,0),(894,955,'Keep torso upright during squat; flexible hip flexors are important. Forward knee should point same direction as foot throughout movement. May also be referred to as Cable One Arm Bulgarian Squat.',1,'2021-06-27 13:39:40',NULL,NULL,0),(895,958,'Keep torso upright during squat; flexible hip flexors are important. Forward knee should point same direction as foot throughout movement. May also be referred to as Cable Bulgarian Squat.',1,'2021-06-27 13:39:40',NULL,NULL,0),(896,959,'Position height of cable bar so moving weight plates make contact with unused weight stack at bottom of squat when hips are slightly lower or same height as knees. Keep head facing forward, back straight and feet flat on floor; equal distribution of weight through forefoot and heel. Knees should point same direction as feet throughout movement. See Squat Analysis. Also see Cable Squat.',1,'2021-06-27 13:39:40',NULL,NULL,0),(897,960,'Knees should point same direction as feet throughout movement. Heel of rear foot can be kept elevated off floor throughout movement as shown. Keep torso upright during squat; flexible hip flexors are important. With feet further apart: Gluteus Maximus is emphasized, Quadriceps are less emphasized. Also known as One Arm Split Squat.',1,'2021-06-27 13:39:40',NULL,NULL,0),(898,961,'Also see Cable Bent-over Hip Extension for more bent over posture.',1,'2021-06-27 13:39:40',NULL,NULL,0),(899,962,'Keep head facing forward, back straight, chest high, arms straight to sides, and feet flat on platform; equal distribution of weight through forefoot and heel. Knees should point same direction as feet throughout movement. See Squat Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(900,963,'Knees should point same direction as feet throughout movement. Heel of rear foot can be kept elevated off floor throughout movement as shown. Keep torso upright during squat; flexible hip flexors are important. With feet further apart: Gluteus Maximus is emphasized, Quadriceps are less emphasized. Also known as Cable Lunge.',1,'2021-06-27 13:39:40',NULL,NULL,0),(901,965,'Keep head facing forward, back straight, chest high, and feet flat on surface; equal distribution of weight through forefoot and heel. Knees should point same direction as feet throughout movement. When finished, squat or sit and place pin into lightest weight setting. Step off of platform and unclip cable from belt. Also known as Pole Squat. Instead of holding onto pole for balance (as shown), arms can be extended forward without contact with pole. See Squat Analysis. Also see similar exercise: Weighted Belt Squat.',1,'2021-06-27 13:39:40',NULL,NULL,0),(902,966,'Also see Cable Standing Hip Extension for more upright posture.',1,'2021-06-27 13:39:40',NULL,NULL,0),(903,967,'Do not stand behind pulleys. Throughout lift, keep arms and back straight. Do not lower weight beyond mild stretch throughout hamstrings. When finished with set, dismount by lowering weight with knees bent and low back straight. Full range of motion will vary from person to person. Those with less flexibility may have to bend knees more. Knees can be kept bent throughout movement. Also see Stiff Leg Deadlift .',1,'2021-06-27 13:39:40',NULL,NULL,0),(904,968,'Keep torso upright during exercise. Forward knee should point same direction as foot throughout movement. Stepping distance from bench emphasizes Gluteus Maximus; stepping close to bench emphasizes Quadriceps.',1,'2021-06-27 13:39:40',NULL,NULL,0),(905,969,'Keep head facing forward, back straight and feet flat on floor; equal distribution of weight through forefoot and heel. Knees should point same direction as feet throughout movement. See Squat Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(906,970,'Throughout lift, keep arms and back straight. Do not lower weight beyond mild stretch throughout hamstrings. Full range of motion will vary from person to person. Those with less flexibility may need to bend knee of supporting leg more so dumbells can come closer to floor. At top of movement, lifted foot can make contact with floor to maintain balance between repetitions.',1,'2021-06-27 13:39:40',NULL,NULL,0),(907,971,'Keep torso upright during squat; flexible hip flexors are important. Forward knee should point same direction as foot throughout movement. May also be referred to as Dumbbell Bulgarian Squat.',1,'2021-06-27 13:39:40',NULL,NULL,0),(908,972,'Keep torso upright during lunge; flexible hip flexors are important. Forward knee should point same direction as foot throughout lunge. A long lunge emphasizes Gluteus Maximus; short lunge emphasizes Quadriceps.',1,'2021-06-27 13:39:40',NULL,NULL,0),(909,975,'Knees should point same direction as feet throughout movement. Heel of rear foot can be kept elevated off floor throughout movement as shown. Keep torso upright during squat; flexible hip flexors are important. With feet further apart: Gluteus Maximus is emphasized, Quadriceps are less emphasized.',1,'2021-06-27 13:39:40',NULL,NULL,0),(910,974,'Keep torso upright during lunge. Flexible hip adductors will allow fuller range of motion. Lead knee should point same direction as foot throughout lunge. A long lunge emphasizes Gluteus Maximus; short lunge emphasizes Quadriceps. Dumbbells may be positioned - one to front and other to back.',1,'2021-06-27 13:39:40',NULL,NULL,0),(911,973,'Keep torso upright during lunge; flexible hip flexors are important. Lead knee should point same direction as foot throughout lunge. A long lunge emphasizes Gluteus Maximus; short lunge emphasizes Quadriceps.',1,'2021-06-27 13:39:40',NULL,NULL,0),(912,976,'Keep head facing forward, back straight, chest high, and feet flat on floor; equal distribution of weight through forefoot and heel. Knees should point same direction as feet throughout movement. See Squat Analysis. Also see Kettlebell Front Squat.',1,'2021-06-27 13:39:40',NULL,NULL,0),(913,977,'Keep torso upright during lunge; flexible hip flexors are important. Lead knee should point same direction as foot throughout lunge. A long lunge emphasizes Gluteus Maximus; short lunge emphasizes Quadriceps. Tibilalis Anterior is exercised eccentrically during landing on heel.',1,'2021-06-27 13:39:40',NULL,NULL,0),(914,978,'Supporting knee should point same direction as foot throughout movement. Range of motion will be improved with greater leg strength and glute flexibility. Significant spinal flexion occurs at bottom of deep single leg squat to maintain center of gravity over foot. Erector Spinae becomes a stabilizer if spine is kept straight.',1,'2021-06-27 13:39:40',NULL,NULL,0),(915,979,'None',1,'2021-06-27 13:39:40',NULL,NULL,0),(916,981,'Keep torso upright during exercise. Stepping knee should point same direction as foot. A modest degree of knee rotation occurs during this movement. See Controversial Exercises and Rotary Force in Squat Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(917,982,'Keep torso upright during exercise. Knee of exercised leg should point same direction as foot. Exercise can also be performed by placing traveling foot onto and off of bench next to foot of exercised leg. See alternative form.',1,'2021-06-27 13:39:40',NULL,NULL,0),(918,985,'When finished, engage dock lever, and lower seat to starting position. If insufficient hip flexibility forces pelvis to pull away from back pad at lower portions of movement, only lower sled just short of spinal articulation. Keep knees pointed same directions as feet. Do not allow heels to raise off of platform, pushing with both heel and forefoot. Placing feet slightly high on platform emphasize Gluteus Maximus. Placing feet slightly lower on platform emphasize Quadriceps. Also see Sled Hack Press.',1,'2021-06-27 13:39:40',NULL,NULL,0),(919,984,'Keep torso upright during exercise. Forward knee should point same direction as foot throughout movement. Stepping distance from bench emphasizes Gluteus Maximus; stepping close to bench emphasizes Quadriceps.',1,'2021-06-27 13:39:40',NULL,NULL,0),(920,986,'Adjust safety brace and back support to accommodate near full range of motion without forcing hips to bend at waist. Keep knees pointed same directions as feet. Do not allow heels to raise off of platform, pushing with both heel and forefoot. Knees should point same direction as feet throughout movement. Placing feet slightly high on platform emphasize Gluteus Maximus. Placing feet slightly lower on platform emphasize Quadriceps. Also see Locking Out Knees on Leg Press.',1,'2021-06-27 13:39:40',NULL,NULL,0),(921,987,'Do not stand behind handles. Throughout lift, keep arms and back straight. Do not lower weight beyond mild stretch throughout hamstrings. When finished with set, dismount by lowering weight with knees bent and low back straight. Full range of motion will vary from person to person. Those with less flexibility may have to bend knees more. Knees can be kept bent throughout movement.',1,'2021-06-27 13:39:40',NULL,NULL,0),(922,988,'Lower platform enough to achieve full range of motion without forcing pelvis to bend at waist. On exercised leg, keep pointed same direction as foot . Also, do not allow heel to raise off of platform, pushing with both heel and forefoot. For alternative view, see Lever Single Leg 45° Leg Press performed with opposite leg.',1,'2021-06-27 13:39:40',NULL,NULL,0),(923,989,'Adjust machine to accommodate near full range of motion without forcing pelvis to bend at waist. Keep knee pointed same direction as foot. Do not allow heel to raise off of platform, pushing with both heel and forefoot. Unique apparatus is designed and built by Tracey Cheuvront.',1,'2021-06-27 13:39:40',NULL,NULL,0),(924,990,'Adjust shoulder pads to allow full range of motion without forcing hips to rise at waist. Keep knees pointed same directions as feet. Push with both heel and forefoot and do not allow heels to raise off of platform. Placing feet slightly high on platform emphasize Gluteus Maximus. Placing feet slightly lower on platform emphasize Quadriceps.',1,'2021-06-27 13:39:40',NULL,NULL,0),(925,991,'Adjust seat and back support to accommodate near full range of motion without forcing hips to bend at waist. Keep knees pointed same directions as feet. Do not allow heels to raise off of platform, pushing with both heel and forefoot. This exercise may be performed by alternating (as described), simultaneous, or in simultaneous-alternating fashion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(926,993,'Adjust seat and back support to accommodate near full range of motion without forcing hips to bend at waist. Keep knees pointed same directions as feet. Do not allow heels to raise off of platform, pushing with both heel and forefoot. Placing feet slightly high on platform emphasize Gluteus Maximus. Placing feet slightly lower on platform emphasize Quadriceps.',1,'2021-06-27 13:39:40',NULL,NULL,0),(927,992,'Adjust back support back to accommodate near full range of motion without forcing pelvis to bend at waist. Keep knee pointed same direction as foot. Push with both heel and forefoot and do not allow heel to raise off of platform.',1,'2021-06-27 13:39:40',NULL,NULL,0),(928,995,'Adjust yoke position to accommodate near full range of motion without forcing hips to bend at waist. Also see Lever Sprint Machine.',1,'2021-06-27 13:39:40',NULL,NULL,0),(929,996,'Adjust machine to accommodate near full range of motion without forcing hips to rise at waist. Keep knees pointed same directions as feet. Do not allow heels to raise off of platform, pushing with both heel and forefoot. Placing feet slightly high on platform emphasize Gluteus Maximus. Placing feet slightly lower on platform emphasize Quadriceps. Unique apparatus is designed and built by Tracey Cheuvront.',1,'2021-06-27 13:39:40',NULL,NULL,0),(930,994,'Also see Lever Lying Hip Extension on selectorized machine.',1,'2021-06-27 13:39:40',NULL,NULL,0),(931,997,'Keep torso upright during lunge; flexible hip flexors are important. Forward knee should point same direction as foot throughout lunge. A long lunge with feet slightly forward emphasizes Gluteus Maximus; short lunge with feet under the bar emphasizes Quadriceps.',1,'2021-06-27 13:39:40',NULL,NULL,0),(932,998,'Keep torso upright during lunge; flexible hip flexors are important. Forward knee should point same direction as foot throughout lunge. A long lunge emphasizes Gluteus Maximus; short lunge emphasizes Quadriceps. Also see Lever Rear Lunge on apparatus without platform.',1,'2021-06-27 13:39:40',NULL,NULL,0),(933,999,'Keep torso upright during squat; flexible hip flexors are important. Forward knee should point same direction as foot throughout movement. Keep foot flat on floor. Position foot slightly forward to distribute force on hip extensors. May also be referred to as Lever Bulgarian Squat.',1,'2021-06-27 13:39:40',NULL,NULL,0),(934,1000,'Keep torso upright during movement; flexible hip flexors are important. Knees should point same direction as feet throughout movement. A forward foot further forward will emphasizes Gluteus Maximus; forward foot more closer under bar will emphasizes Quadriceps.',1,'2021-06-27 13:39:40',NULL,NULL,0),(935,1001,'Keep torso upright during squat; flexible hip flexors are important. Knees should point same direction as feet throughout movement. Keep foot flat on floor. Position foot slightly forward to distribute force on hip extensors. Also known as Lever Lunge.',1,'2021-06-27 13:39:40',NULL,NULL,0),(936,1002,'Keep torso upright during squat; flexible hip flexors are important. Forward knee should point same direction as foot throughout movement. Keep foot flat on floor. Position foot slightly forward to distribute force on hip extensors. May also be referred to as Lever Barbell Bulgarian Squat.',1,'2021-06-27 13:39:40',NULL,NULL,0),(937,1005,'Range of motion will be improved with greater leg strength and glute flexibility. Base knee should point same direction as foot throughout movement.',1,'2021-06-27 13:39:40',NULL,NULL,0),(938,1003,'Taller individuals may be able to place both legs into strap and position torso on bench without using steps. Some individuals may be able to articulate both through the hips and through the lower back (i.e. lumbar spine), in which case, Erector Spinae also becomes synergist. Movement can be performed without resistance. Lever Reverse Hyper-extension was invented by Louie Simmons of Westside Barbell.',1,'2021-06-27 13:39:40',NULL,NULL,0),(939,1004,'If available, re-engage support lever in extended position before dismounting. Keep head facing forward, back straight and feet flat on floor; equal distribution of weight through forefoot and heel. Knees should point same direction as feet throughout movement. See Squat Analysis.  Also see exercise performed on classic Lever Squat machine.',1,'2021-06-27 13:39:40',NULL,NULL,0),(940,1007,'Keep torso upright during movement; flexible hip flexors are important. Knees should point same direction as feet throughout movement. Keep forward foot flat on stationary platform.',1,'2021-06-27 13:39:40',NULL,NULL,0),(941,1008,'Keep head facing forward, back straight and feet flat on floor; equal distribution of weight through forefoot and heel. Knees should point same direction as feet throughout movement. See Squat Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(942,1009,'Despite apparatus\' similarity to rear kick exercise, it is actually hip extension exercise due to the isolated hip movement which is apparent with lack of knee articulation.',1,'2021-06-27 13:39:40',NULL,NULL,0),(943,1010,'If insufficient hip flexibility forces pelvis to pull away from back pad at lower portions of movement, only lower sled just short of spinal articulation. Keep knees pointed same directions as feet. Do not allow heels to raise off of platform. Push with both heel and forefoot. If available, re-engage dock lever in extended position before dismounting. Placing feet slightly high on platform emphasize Gluteus Maximus. Placing feet slightly lower on platform emphasize Quadriceps. Also see similar exercise Lever V-Squat.',1,'2021-06-27 13:39:40',NULL,NULL,0),(944,1011,'Exercise can be performed alternating between sides.',1,'2021-06-27 13:39:40',NULL,NULL,0),(945,1012,'If available, re-engage support lever in extended position before dismounting. Keep head facing forward, back straight and feet flat on floor; equal distribution of weight through forefoot and heel. Knees should point same direction as feet throughout movement. See Squat Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(946,1014,'None',1,'2021-06-27 13:39:40',NULL,NULL,0),(947,1013,'If available, re-engage support lever in extended position before dismounting. Model shown uses foot pedal near base of platform to reengage support lever. Keep head facing forward, back straight and feet flat on platform; equal distribution of weight through forefoot and heel. Knees should point same direction as feet throughout movement. See Squat Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(948,1015,'Also Lever Lying Hip Extension on plate loaded machine and Lever Alternating Lying Hip Extension on another selectorized machine.',1,'2021-06-27 13:39:40',NULL,NULL,0),(949,1016,'Hamstring remains in active insufficiency through movement since knee is significantly flexed and hip does not flex beyond 90 degrees. Also see Lever Lying Hip Extension on plate loaded machine.',1,'2021-06-27 13:39:40',NULL,NULL,0),(950,1017,'If available, re-engage support lever in extended position before dismounting. If insufficient hip flexibility forces pelvis to pull away from back pad at lower portions of movement, only lower sled just short of spinal articulation. Keep knees pointed same directions as feet. Do not allow heels to raise off of platform. Push with both heel and forefoot. Also see selectorized machine. Placing feet slightly forward on platform emphasize Gluteus Maximus. Placing feet slightly back on platform emphasize Quadriceps.',1,'2021-06-27 13:39:40',NULL,NULL,0),(951,1018,'Exercise can be performed with one leg, then other leg. See Lever Kneeling Hip Extension (roller pad).',1,'2021-06-27 13:39:40',NULL,NULL,0),(952,1019,'Shorter individuals should stand on higher platform and may be bent over more.',1,'2021-06-27 13:39:40',NULL,NULL,0),(953,1020,'None',1,'2021-06-27 13:39:40',NULL,NULL,0),(954,1021,'Adjust back support back to accommodate near full range of motion without forcing pelvis to bend at waist. Keep knee pointed same direction as foot. Do not allow heel to raise off of platform, pushing with both heel and forefoot.',1,'2021-06-27 13:39:40',NULL,NULL,0),(955,1022,'Adjust seat and back support to accommodate near full range of motion without forcing hips to bend at waist. Keep knees pointed same directions as feet. Do not allow heels to raise off of platform, pushing with both heel and forefoot. Placing feet slightly high on platform emphasize Gluteus Maximus. Placing feet slightly lower on platform emphasize Quadriceps.',1,'2021-06-27 13:39:40',NULL,NULL,0),(956,1024,'With greater resistances, more effort is required to pull on handle bars to keep body from rising upward.',1,'2021-06-27 13:39:40',NULL,NULL,0),(957,1027,'Squeeze hand lever at bottom of movement to disengage weight stack. Keep hand lever squeezed until sled is raised and legs are straight. If insufficient hip flexibility forces pelvis to pull away from back pad at lower portions of movement, only lower sled just short of spinal articulation. Keep knees pointed same directions as feet. Do not allow heels to raise off of platform, pushing with both heel and forefoot. Placing feet slightly forward on platform emphasize Gluteus Maximus. Placing feet slightly back on platform emphasize Quadriceps.',1,'2021-06-27 13:39:40',NULL,NULL,0),(958,1025,'None',1,'2021-06-27 13:39:40',NULL,NULL,0),(959,1023,'Lever height should be adjusted to accommodate full range, allowing hips to descend same height or slightly lower than knees. Keep head facing forward, back straight and feet flat on floor; equal distribution of weight through forefoot and heel. Knees should point same direction as feet throughout movement. See Squat Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(960,1026,'Adjust bench to accommodate near full range of motion without forcing hips to bend at waist. Keep knees pointed same directions as feet. Do not allow heels to raise off of platform, pushing with both heel and forefoot. This exercise may be performed by alternating (as described), simultaneous, or in simultaneous-alternating fashion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(961,1028,'Squeeze hand lever at bottom of movement to disengage weight stack. Keep hand lever squeezed until sled is raised and leg is straight. If insufficient hip flexibility forces pelvis to pull away from back pad at lower portions of movement, only lower sled just short of spinal articulation. Keep knee pointed same directions as foot. Do not allow heel to raise off of platform, pushing with both heel and forefoot. Placing feet slightly forward on platform emphasize Gluteus Maximus. Placing feet slightly back on platform emphasize Quadriceps. See manufacturer\'s suggested foot placement for Lever Split V-Squat.',1,'2021-06-27 13:39:40',NULL,NULL,0),(962,1029,'Adjust safety brace and back support to accommodate near full range of motion without forcing pelvis to bend at waist. Keep knee pointed same direction as foot. Do not allow heel to raise off of platform, pushing with both heel and forefoot.',1,'2021-06-27 13:39:40',NULL,NULL,0),(963,1030,'Squeeze hand lever at bottom of movement to disengage weight stack. Keep hand lever squeezed until sled is raised and legs are straight. Keep knees pointed same directions as feet. Do not allow\n\nforward\n\nheel to raise off of platform, pushing with both heel and forefoot.',1,'2021-06-27 13:39:40',NULL,NULL,0),(964,1031,'Adjust safety brace and back support to accommodate near full range of motion without forcing hips to bend at waist. A wide stance may allow for deeper range of motion as shown. Keep knees pointed same directions as feet. Do not allow heels to raise off of platform, pushing with both heel and forefoot. Placing feet slightly high on platform emphasize Gluteus Maximus. Placing feet slightly lower on platform emphasize Quadriceps. See exercise performed on Bilateral Leg Press. Also see Locking Out Knees on Leg Press.',1,'2021-06-27 13:39:40',NULL,NULL,0),(965,1032,'When finished, keep both feet forward and descend lever downward. Squeeze hand lever at bottom of movement to disengage weight stack. Keep hand lever squeezed until sled is raised and legs are straight. Keep knees pointed same directions as feet. Push with both heel and forefoot. Do not allow forward heel to raise off of platform.',1,'2021-06-27 13:39:40',NULL,NULL,0),(966,1033,'Adjust safety brace and back support to accommodate near full range of motion without forcing hips to bend at waist. Wide stance may allow for deeper range of motion. Keep knees pointed same directions as feet. Do not allow heels to raise off of platform, pushing with both heel and forefoot. Placing feet slightly high on platform emphasize Gluteus Maximus. Placing feet slightly lower on platform emphasize Quadriceps. See exercise performed Bilaterally.',1,'2021-06-27 13:39:40',NULL,NULL,0),(967,1035,'If available, re-engage support lever in extended position before dismounting. Allow for full range of motion without forcing hips to rise at waist. Keep knees pointed same directions as feet. Do not allow heels to raise off of platform, pushing with both heel and forefoot. Placing feet slightly high on platform emphasize Gluteus Maximus. Placing feet slightly lower on platform emphasize Quadriceps.',1,'2021-06-27 13:39:40',NULL,NULL,0),(968,1036,'If available, re-engage support lever in extended position before dismounting. Allow for full range of motion without forcing hips to rise at waist. Keep knee pointed same directions as foot. Do not allow heel to raise off of platform, pushing with both heel and forefoot. Placing foot slightly high on platform emphasizes Gluteus Maximus. Placing foot slightly lower on platform emphasizes Quadriceps.',1,'2021-06-27 13:39:40',NULL,NULL,0),(969,1034,'If available, re-engage support lever in extended position before dismounting. If insufficient hip flexibility forces pelvis to pull away from back pad at lower portions of movement, only lower sled just short of spinal articulation. Keep knees pointed same directions as feet. Do not allow heels to raise off of platform, pushing with both heel and forefoot. Placing feet slightly high on platform emphasize Gluteus Maximus. Placing feet slightly lower on platform emphasize Quadriceps.',1,'2021-06-27 13:39:40',NULL,NULL,0),(970,1038,'Allow for full range of motion without forcing hips to bend\nat waist. Keep knee pointed same directions as foot. Do not allow\nheel to raise off of platform, pushing with both heel and forefoot.\nPlacing foot slightly high on platform emphasizes Gluteus Maximus.\nPlacing foot slightly lower on platform emphasizes Quadriceps.',1,'2021-06-27 13:39:40',NULL,NULL,0),(971,1037,'Adjust machine to accommodate near full range of motion without forcing hips to rise at waist. Keep knees pointed same directions as feet. Do not allow heels to raise off of platform, pushing with both heel and forefoot.',1,'2021-06-27 13:39:40',NULL,NULL,0),(972,1039,'None',1,'2021-06-27 13:39:40',NULL,NULL,0),(973,1040,'Adjust seat and back support to accommodate near full range of motion without forcing hips to bend at waist. Keep knees pointed same directions as feet. Do not allow heels to raise off of platform, pushing with both heel and forefoot. Placing feet slightly high on platform emphasize Gluteus Maximus. Placing feet slightly lower on platform emphasize Quadriceps.',1,'2021-06-27 13:39:40',NULL,NULL,0),(974,1041,'Flexible hip flexion is required for fuller range of motion through knee. Lower weight just short of hips, leaving back support. Keep knees pointed same directions as feet. Do not allow heels to raise off of platform, pushing with both heel and forefoot, or center of feet if platform is shorter than length of feet.',1,'2021-06-27 13:39:40',NULL,NULL,0),(975,1042,'Re-engage support lever in extended position before dismounting. Flexible hip flexion is required for fuller range of motion through knee. Lower weight just short of hips, leaving back support. Keep knees pointed same directions as feet. Do not allow heel to raise off of platform, pushing with both heel and forefoot, or center of foot if platform is shorter than length of feet.',1,'2021-06-27 13:39:40',NULL,NULL,0),(976,1043,'If available, re-engage dock lever(s) in extended position before dismounting. Adjust machine to accommodate near full range of motion without forcing pelvis to rise at waist. Keep knee pointed same direction as feet. Do not allow heel to raise off of platform, pushing with both heel and forefoot.',1,'2021-06-27 13:39:40',NULL,NULL,0),(977,1045,'If available, re-engage dock lever(s) in extended position before dismounting. Keep torso upright during lunge; flexible hip flexors are important. Forward knee should point same direction as foot throughout lunge. A long lunge with feet slightly forward emphasizes Gluteus Maximus; short lunge with feet under the bar emphasizes Quadriceps.',1,'2021-06-27 13:39:40',NULL,NULL,0),(978,1046,'On apparatuses with hand or lever lock, return sled to very bottom, disengage weight, return sled to mid-upper position, and re-engage weight before stepping out. Some Sled Squat apparatuses have back pads like the one shown, whereas, Sled Squat apparatuses have no back pad requiring additional recruitment of stabilizer muscles. Keep head facing forward, back straight and feet flat on floor; equal distribution of weight through forefoot and heel. Knees should point same direction as feet throughout movement.',1,'2021-06-27 13:39:40',NULL,NULL,0),(979,1044,'If available, re-engage support lever in extended position before dismounting. If insufficient hip flexibility forces pelvis to pull away from back pad at lower portions of movement, only lower sled just short of spinal articulation. Keep knees pointed same directions as feet. Do not allow heels to raise off of platform, pushing with both heel and forefoot. Placing feet slightly high on platform emphasize Gluteus Maximus. Placing feet slightly lower on platform emphasize Quadriceps.',1,'2021-06-27 13:39:40',NULL,NULL,0),(980,1048,'None',1,'2021-06-27 13:39:40',NULL,NULL,0),(981,1050,'Keep torso upright during squat; flexible hip flexors are important. Forward knee should point same direction as foot throughout movement. Keep foot flat on floor. Position foot slightly forward to distribute force on hip extensors. May also be referred to as Smith Bulgarian Squat.',1,'2021-06-27 13:39:40',NULL,NULL,0),(982,1051,'Throughout lift, keep arms and back straight. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch. Full range of motion will vary from person to person depending on flexibility. Stand on elevated platform if smith machine does not allow full range of motion. Those with less flexibility may have to bend their knees more. Knees can be kept bent throughout movement. Also see Stiff Leg Deadlift.',1,'2021-06-27 13:39:40',NULL,NULL,0),(983,1053,'Keep torso upright during movement; flexible hip flexors are important. Knees should point same direction as feet throughout movement. A forward foot further forward will emphasize Gluteus Maximus; forward foot more closer under bar will emphasize Quadriceps.',1,'2021-06-27 13:39:40',NULL,NULL,0),(984,1055,'Keep torso upright during lunge; flexible hip flexors are important. Forward knee should point same direction as foot throughout lunge. A long lunge with feet slightly forward emphasizes Gluteus Maximus; short lunge with feet under the bar emphasizes Quadriceps.',1,'2021-06-27 13:39:40',NULL,NULL,0),(985,1054,'Keep head facing forward, back straight and foot flat on floor; equal distribution of weight through forefoot and heel. Forward knee should point same direction as foot throughout movement.',1,'2021-06-27 13:39:40',NULL,NULL,0),(986,1056,'Throughout lift, keep hips low, shoulders high, arms and back straight. Knees should point same direction as feet throughout movement. See Smith Squat Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(987,1057,'Keep head facing forward, back straight and feet flat on floor; equal distribution of weight through forefoot and heel. Knees should point same direction as feet throughout movement. See Smith Squat Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(988,1058,'Keep head facing forward, back straight and feet flat on floor; equal distribution of weight through forefeet and heel. Knees should point same direction as feet throughout movement. Also see bodybuilding-style Smith Squat and Smith Squat Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(989,1059,'Keep head facing forward, back straight, chest high, and feet flat on floor; equal distribution of weight through forefoot and heel. Knees should point same direction as feet throughout movement. See Squat Analysis. Also see Kettlebell Goblet Squat.',1,'2021-06-27 13:39:40',NULL,NULL,0),(990,1060,'Supporting knee should point same direction as foot throughout movement. Range of motion will be improved with greater leg strength and glute flexibility. Significant spinal flexion occurs at bottom of deep single leg squat to maintain center of gravity over foot. Erector Spinae becomes a stabilizer if spine is kept straight.',1,'2021-06-27 13:39:40',NULL,NULL,0),(991,1061,'Keep head facing forward, back straight, chest high, and feet flat on surface; equal distribution of weight through forefoot and heel. Knees should point same direction as feet throughout movement. See Squat Analysis. Also see similar exercise Cable Belt Squat.',1,'2021-06-27 13:39:40',NULL,NULL,0),(992,1063,'Keep head facing forward, back straight and feet flat on floor; equal distribution of weight through forefoot and heel. Knees should point same direction as feet throughout movement. See Smith Squat Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(993,1062,'Exercise can be performed without added weight. Some individuals may be able to articulate both through the hips and through the lower back (i.e. lumbar spine), in which case, Erector Spinae also becomes synergist.',1,'2021-06-27 13:39:40',NULL,NULL,0),(994,1064,'Also see Reverse Hyper-extension performed with exercise ball on bench.',1,'2021-06-27 13:39:40',NULL,NULL,0),(995,1065,'Keep torso upright during lunge; flexible hip flexors are important. Lead knee should point same direction as foot throughout lunge. A long lunge emphasizes Gluteus Maximus; short lunge emphasizes Quadriceps.',1,'2021-06-27 13:39:40',NULL,NULL,0),(996,1066,'Hamstring remains in active insufficiency throughout movement since knee is significantly flexed and hip does not flex beyond 90 degrees. Adductor Magnus does not assist since hip extension does not occur in fully flexed position.',1,'2021-06-27 13:39:40',NULL,NULL,0),(997,1067,'Allow torso to angle forward more than shown, particularly as greater depth is achieved with lower bench or box. Range of motion will be improved with greater leg strength. Supporting knee should point same direction as foot throughout movement.',1,'2021-06-27 13:39:40',NULL,NULL,0),(998,1068,'Supporting knee should point same direction as foot throughout movement. Range of motion will be improved with greater leg strength and glute flexibility. Spine can be kept straighter than standard full range single leg squat. Also known as Reclining Pistol Squats.',1,'2021-06-27 13:39:40',NULL,NULL,0),(999,1069,'Since knee is initially bent significantly, hamstrings are not significantly involved. Also see Reverse Hyper-extension performed with exercise ball on bench.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1000,1071,'Supporting knee should point same direction as foot throughout movement. Range of motion will be improved with greater leg strength and glute flexibility. Also known as Pistol Squat.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1001,1070,'Supporting knee should point same direction as foot throughout movement. Range of motion will be improved with greater leg strength and glute flexibility. Quadriceps on raised leg becomes and Synergist if self assistance is provided at bottom of movement.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1002,1072,'Throughout lift, keep arms and back straight. Do not lower weight beyond mild stretch throughout hamstrings. Full range of motion will vary from person to person. Those with less flexibility may need to bend knee of supporting leg more so hands can come closer to floor. At top of movement, lifted foot can make contact with floor to maintain balance between repetitions.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1003,1073,'Knees should point same direction as feet throughout movement. Heel of rear foot can be kept elevated off floor throughout movement as shown. Keep torso upright during squat; flexible hip flexors are important. With feet further apart: Gluteus Maximus is emphasized, Quadriceps are less emphasized.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1004,1074,'Keep torso upright during squat; flexible hip flexors are important. Forward knee should point same direction as foot throughout movement. May also be referred to as Bodyweight Bulgarian Squat.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1005,1075,'Keep head facing forward, back straight, chest high, and feet flat on surface; equal distribution of weight through forefoot and heel. Knees should point same direction as feet throughout movement. Arms positioned forward allows torso to be positioned more upright. See Squat Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1006,1076,'Keep torso upright during exercise. Knee of exercised leg should point same direction as foot. See front view.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1007,1077,'Keep torso upright during exercise. Lead knee should point same direction as foot throughout movement. Stepping distance from bench emphasizes Gluteus Maximus; stepping close to bench emphasizes Quadriceps.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1008,1078,'Supporting knee should point same direction as foot throughout movement. Range of motion will be improved with greater leg strength and glute flexibility. Significant spinal flexion is acceptable form in full range single leg squat. Erector Spinae becomes a stabilizer if spine is kept straight. Also known as Self-assisted Pistol Squats.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1009,1079,'Supporting knee should point same direction as foot throughout movement.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1010,1080,'Keep torso upright during exercise. Stepping knee should point same direction as foot. A modest degree of knee rotation occurs during this movement. See Controversial Exercises and Rotary Force in Squat Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1011,1081,'Keep torso upright during exercise. Knee of exercised leg should point same direction as foot. Exercise can also be performed by placing travelling foot onto and off of bench next to foot of exercised leg (See demo). Park bench, picnic table and other elevated surfaces can also be used instead of a bench. Weighted versions of this exercise would normally be considered auxiliary in context of other basic exercises (ie: Barbell Squat, Sled Leg Press). However, in the context of \'body weight\' only program, this exercise can be considered basic.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1012,1082,'Supporting knee should point same direction as foot throughout movement, yet only extend forward slightly. Range of motion will be improved with greater leg strength and glute flexibility. Spinal flexion near bottom of motion is acceptable form in full range single leg squat. Erector Spinae becomes a stabilizer if spine is kept straight. See Side Rear View. Weighted versions of this exercise would normally be considered auxiliary in context of other basic exercises (ie: Barbell Squat, Sled Leg Press). However, in the context of \'body weight\' only program, this exercise can be considered basic. Also known as Self-assisted Reclining Pistol Squats or Self-assisted Reclining Single Leg Squats. The degree of self-assistance required affects the significance of upper body muscles utilized.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1013,1083,'This exercise can be performed on TRXⓇ style suspension trainer. See Suspended Supine Feet Mount/Dismount. Hamstring enters active insufficiency as hip is raised since knee is flexed and hip does not flex beyond 90 degrees. However, it is used more to stabilize knees in fixed flexed position. Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius, allowing it to assist Hamstrings in maintaining fixed knee flexion. See Knee flexion abduction force vector diagram. Adductor Magnus does not assist since hip extension does not occur in fully flexed position.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1014,1084,'Keep torso upright during exercise. Stepping knee should point same direction as foot. A modest degree of knee rotation occurs during this movement. See Controversial Exercises and Rotary Force in Squat Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1015,1085,'Notice knee extends out to side more than Lying Piriformis Stretch. Also see Lying Glute Stretch for alternative form.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1016,1087,'Keep torso upright during squat; flexible hip flexors are important particularly in lower position. Forward knee should point same direction as foot throughout movement.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1017,1088,'Supporting knee should point same direction as foot throughout movement. Dismounting can be achieved by placing elevated leg down and walking backward until body is upright. This exercise can be performed on TRXⓇ style suspension trainer or adjustable length gymnastics rings. Also known as Suspended Pistol Squat.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1018,1090,'Ankle can be placed on top edge of shin pad if it can not be positioned above knee.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1019,1089,'See PNF stretch techniques. Also see Modified Lying Glute Stretch for similar static stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1020,1091,'None.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1021,1092,'Allow hip to straighten toward floor for additional hip flexor stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1022,1093,'This exercise can be performed if thigh can not be reached or held on to during Lying Glute Stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1023,1094,'Keep torso upright during squat; flexible hip flexors are important. Forward knee should point same direction as foot throughout movement. Exercise can be dismounted by lifting suspended rear foot from loop, allowing it to fall back while placing foot on floor. A training partner can assist with positioning of loop around rear foot.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1024,1095,'Hands may be placed on elevated platform to maintain balance. Spine may be kept straight. Pelvis may be tilted forward to intensify stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1025,1096,'Spine may be kept straight. Pelvis may be tilted forward to intensify stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1026,1097,'Spine may be kept straight. Pelvis may be tilted forward to intensify stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1027,1098,'Spine may be kept straight. Pelvis may be tilted forward to intensify stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1028,1099,'See PNF stretch techniques. The Seated Glute Stretch can also be performed as static stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1029,1100,'Spine may be kept straight. Pelvis may be tilted forward to intensify stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1030,1101,'Spine may be kept straight. Pelvis may be tilted forward to intensify stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1031,1102,'This Dynamic Stretch can performed before athletic event or sports training session.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1032,1103,'This Dynamic Stretch can performed before athletic event or sports training session. Also stretches muscles involved in Foot Eversion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1033,1104,'See ROM Criteria and Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1034,1105,'Height of knee on exercising leg may require subtle adjustment during movement to permit clearance of traveling foot above floor. Gluteus Maximus will be activated as stabilizer on heavier loads when participant pushes stationary foot onto floor, thereby anchoring lower body as hip abductors keep thighs in place.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1035,1106,'Do not allow upper hip to fall behind upper hip throughout movement. See ROM Criteria and Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1036,1107,'See ROM Criteria and Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1037,1108,'Exercise name is somewhat counter-intuitive since direction of rotation is relative to movement of hip, or thigh, not bent leg. For example, in this exercises, internal rotation of hip causes front of thigh to turn inward despite bent leg moving outward. Incidentally, if knee were straight during internal rotation of thigh, foot would move inward.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1038,1110,'See ROM Criteria and Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1039,1109,'See ROM Criteria and Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1040,1111,'Mount machine with leg levers apart. Use lever to position legs together. See ROM Criteria and Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1041,1113,'Do not allow upper hip to fall behind upper hip throughout movement. See ROM Criteria and Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1042,1114,'Keep knees bent throughout exercise. Exercise can be performed on mat or towel or cushioning can be placed under forearm. See ROM Criteria and Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1043,1115,'See Suspended Supine Feet Mount/Dismount. Keep low back straight, maintaining approximate height from floor throughout movement. This exercise can be performed on TRXⓇ style suspension trainer. See ROM Criteria and Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1044,1117,'Keep feet pointed forward. See ROM Criteria and Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1045,1123,'Keep feet pointed forward. Exercise can be performed on mat or towel or cushioning can be placed under forearm. See ROM Criteria and Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1046,1124,'None.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1047,1125,'None.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1048,1126,'Hand nearest foot can be placed be behind on floor so torso can be reclined back slightly.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1049,1127,'Maintain 90° flexion in participant\'s hip while maintaining participant\'s shoulders flat on floor. See PNF stretch techniques. Also see Lying Crossover Stretch for similar static stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1050,1128,'Hand nearest foot can be placed be behind on floor so torso can be reclined back slightly.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1051,1130,'None',1,'2021-06-27 13:39:40',NULL,NULL,0),(1052,1131,'Keep hip of straight leg extended by leaning pelvis slightly forward.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1053,1132,'Also see Pretzel Stretch for Obliques for similar exercise which can be performed with this stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1054,1133,'Alternatively, upper leg maybe extended straight inline with torso.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1055,1134,'Keep hip extended by leaning pelvis slightly forward and contracting Gluteus Maximus.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1056,1135,'None',1,'2021-06-27 13:39:40',NULL,NULL,0),(1057,1136,'Exercise can be performed on bench. Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible; see Cable Lying Leg-Hip Raise. Knees may be kept extended throughout leg raise to increase intensity; see Cable Lying Straight Leg Raise. Also see Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1058,1137,'Training partner or trainer may need to assist attaching ankle cuffs to cable. Ankle cuffs may also be attached to cable pulley in lowest position when feet are on floor, but assistance may be needed to raise pulley to bench height. Cable Lying Leg Raise on floor is easier to set up.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1059,1138,'See Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1060,1139,'Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible; see Cable Lying Leg-Hip Raise. Knees can flex along with hips to decrease intensity; see Cable Lying Leg Raise. Also see Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1061,1140,'Keep elbows straight or nearly straight throughout exercise. Exercise can be performed without assistance. Rectus Abdominis and Obliques practically contract isometrically since little waist flexion occurs under resistance. With no waist flexion, Rectus Abdominis and External Oblique act to stabilize pelvis and waist during hip flexion. See target muscle of rollout question. Also see Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1062,1141,'Machine must be adjusted to align hip with lever fulcrum. Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. Conversely, it may be necessary to completely flex hips before waist flexion is possible, which is not practical with the opposite leg supporting body. See Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1063,1143,'Exercise is typically performed without added resistance. Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. It is necessary to raise legs higher than what is shown before waist flexion occurs; see Lever Vertical Leg-Hip Raise. Also see Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1064,1142,'Since knee of moving leg is straight and waist flexion is impeded by standing leg, range of motion will be limit to hamstring flexibility. See Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1065,1144,'Exercise can be performed without added weight until more resistance is needed. Lower decline to increase resistance. Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. See Arm Position During Waist Exercises and Spot Reduction Myth and Lower Ab Myth. Also see Dangerous Exercise Essay.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1066,1145,'Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. Exercise may be performed with ab straps. It may be necessary to completely flex hips before waist flexion is possible; see Weighted Hanging Leg-Hip Raise. Exercise can be performed without added weight until more resistance is needed. Knees may be kept extended throughout leg raise to increase intensity; see Weighted Hanging Straight Leg Raise. Also see Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1067,1146,'Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. Also see Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1068,1147,'Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible; see Weighted Incline Leg-Hip Raise. Care should be taken not to have weight falling over or thrown onto sensive bodily areas. For this reason increasing incline to increase intensity may be wiser than adding additional weight. Exercise can be performed without added weight on greater incline. Knees can flex along with hips to decrease intensity; see Weighted Incline Leg Raise. Also see Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1069,1148,'Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible; see Weighted Incline Leg-Hip Raise. Exercise can be performed without added weight until more resistance is needed. Elevate incline to increase resistance. Knees may be kept extended throughout leg raise to increase intensity; see Weighted Incline Straight Leg Raise. Also see Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1070,1149,'Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible; see Weighted Incline Leg-Hip Raise. Care should be taken not to have weight falling over or thrown onto sensitive bodily areas. For this reason, increasing incline to increase intensity may be wiser than adding additional weight. Exercise can be performed without added weight on greater incline. Knees can flex along with hips to decrease intensity; see Weighted Incline Leg Raise. Also see Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1071,1151,'Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible; see Weighted Hanging Leg-Hip Raise. Exercise can be performed without added weight until more resistance is needed; see Hanging Straight Leg Raise. Knees can flex along with hips to decrease intensity; see Weighted Hanging Leg Raise. Also see Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1072,1150,'Exercise can be performed without added weight until more resistance is needed (see Lying Leg Raise). Knees may be kept extended throughout leg raise to increase intensity.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1073,1152,'Heels may make contact with floor to maintain balance at bottom of movement. Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible. Exercise can be performed without added weight until more resistance is needed (See Seated Leg Raise without weight). Also see Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1074,1153,'Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible; see Weighted Incline Leg-Hip Raise. Exercise can also be performed on incline board or without added weight until more resistance is needed. Also see Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1075,1154,'This exercise is alternative to Vertical Leg Raise when apparatus is not available, or Hanging Leg Raise when high bar is not available or too low to allow for adequate leg clearance. Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible; see Weighted Vertical Leg-Hip Raise on parallel bars. Exercise can be performed without added weight until more resistance is needed (See Vertical Leg Raise on dip bar). Knees may be kept extended throughout leg raise to increase intensity. Also see Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1076,1155,'Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible; see Weighted Vertical Leg-Hip Raise. Exercise can be performed without added weight until more resistance is needed (See Vertical Leg Raise without weight). Knees may be kept extended throughout leg raise to increase intensity; see Weighted Vertical Straight Leg Raise. Also see Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1077,1156,'Exercise can be performed on standard bench or without added weight. Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. See Arm Position During Waist Exercises and Spot Reduction Myth and Lower Ab Myth. Also see Dangerous Exercise Essay.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1078,1157,'Exercise can be performed with ab straps. Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible, as in leg-hip raise. Also see Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1079,1158,'Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible as in hip leg raise. Also see Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1080,1160,'Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible, as in leg-hip raise. Also see Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1081,1159,'Exercise can be performed without ab straps, by hanging from high bar. Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible, as in leg-hip raise. Also see Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1082,1161,'Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible, as in leg-hip raise. Attempting to perform Incline Straight Leg-Hip Raise at a low incline would not load waist and hip flexors after they travel beyond vertical so that sort of movement would need to be performed on steep incline or vertical position, requiring much greater strength. Also see Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1083,1162,'Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible; see Weighted Vertical Leg-Hip Raise. Exercise can be performed without added weight until more resistance is needed (see Vertical Straight Leg Raise). Knees can flex along with hips to decrease intensity; see Weighted Vertical Leg Raise. Also see Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1084,1163,'Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible; see Weighted Incline Leg-Hip Raise. Exercise can also be performed on incline board. Also see Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1085,1164,'Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible, as in leg-hip raise. Also see Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1086,1165,'Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible, as in leg-hip raise. Attempting to perform Incline Straight Leg-Hip Raise at a low incline would not load waist and hip flexors after they travel beyond vertical so that sort of movement would need to be performed on steep incline or vertical position, requiring much greater strength. Also see Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1087,1166,'Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. Conversely, it may be necessary to completely flex hips before waist flexion is possible, which is not practical with alternating leg movements. Also see Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1088,1167,'This exercise is alternative to Vertical Leg Raise when apparatus is not available, or Hanging Leg Raise when high bar is not available or too low to allow for adequate leg clearance. Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible; see Weighted Vertical Leg-Hip Raise on parallel bars. Also see Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1089,1168,'Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible, as in leg-hip raise. Also see Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1090,1169,'Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible, as in leg-hip raise. Attempting to perform Lying Straight Leg Hip Raise would not load waist and hip flexors after they travel beyond vertical so that sort of movement would need to be performed on steep incline or vertical position, requiring much greater strength. Also see Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1091,1170,'Heels may make contact with floor to maintain balance at bottom of movement. Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible. Typically, the spine is not extended enough in this movement to constitute significant spinal flexion, so it remains classified as a hip flexor movement. Also see Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1092,1171,'Also known as Scissors Kick. Movement involves very short range of motion so greater isometric-like endurance is required. Also see over/under variation.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1093,1172,'Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible. Conversely, it may be necessary to completely flex hips before waist flexion is possible, which is not practical with alternating leg movements. Also see Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1094,1173,'Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible, as in leg-hip raise. Also see Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1095,1174,'Feet must be propped securely to prevent injury. Exercise can also be performed on Roman Chair Sit-up apparatus. Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. See Spot Reduction Myth and Lower Ab Myth. Also see Dangerous Exercise Essay.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1096,1175,'Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique will only act to stabilize pelvis and waist during hip flexion. It may be necessary to completely flex hips before waist flexion is possible, as in leg-hip raise. Also see Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1097,1176,'Keep arms straight with shoulders positioned above hands. Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique act only to stabilize pelvis and waist during hip flexion. If waist flexion were to occur after complete hip flexion, resistive forces are no longer working against abdominal muscles in this final position when knees and hips are flexed. However, abdominal muscles are activated isometrically to keep spine straight when knees are not under body. Also see Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1098,1177,'Keep arms straight with shoulders positioned above hands. Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique act only to stabilize pelvis and waist during hip flexion. If waist flexion were to occur after complete hip flexion, resistive forces are no longer working against abdominal muscles in this final position when knees and hips are flexed. However, abdominal muscles are activated isometrically to keep spine straight when knees are not under body. Also see Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1099,1178,'Keep arms straight with shoulders positioned above hands. Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique act only to stabilize pelvis and waist during hip flexion. If waist flexion were to occur after complete hip flexion, resistive forces are no longer working against abdominal muscles in this final position when knees and hips are flexed. However, abdominal muscles are activated isometrically to keep spine straight when knees are not under body. Also see Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1100,1179,'Keep arms straight with shoulders positioned above hands. Rectus Abdominis and Obliques only contract dynamically if actual waist flexion occurs. With no waist flexion, Rectus Abdominis and External Oblique act only to stabilize pelvis and waist during hip flexion. In this movement, even if waist flexion were to occur after complete hip flexion, the abs have endured much more stabilizing forces in their extended position than dynamic forces they could possibly encounter in the flexed position. Also see Spot Reduction Myth and Lower Ab Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1101,1181,'Position foot further beyond knee if stretch is felt in Adductor Magnus of forward thigh.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1102,1182,'Feet should be far enough apart to keep knee from traveling too far beyond forward foot. Keep torso upright, close to vertical. Keep forward foot flat on floor and rear foot pointed forward. Soleus of opposite leg may be stretched if ankle is fully dorsal flexed.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1103,1183,'Gluteus Maximus and Adductor Magnus may be mildly stretched if hip of forward leg is fully flexed. Soleus of opposite leg may be stretched if ankle is fully dorsal flexed.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1104,1184,'Attempt to straighten hip each stroke, while maintaining approximate height of hips from floor throughout movement. Dismount by removing straps, while kneeling or after sitting on one side of hip before rotating body to seated position. See Suspended Prone Feet Mount/Dismount. This exercise can be performed on TRXⓇ style suspension trainer.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1105,1185,'Keep foot away from fully extended hip to keep emphasis on Iliopsoas. See Lever Quadriceps Stretch for similar movement.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1106,1186,'Keep arms straight with shoulders positioned above hands. Dismount by removing straps while kneeling or after sitting on one side of hip before rotating body to seated position. See Suspended Prone Feet Mount/Dismount. This exercise can be performed on TRXⓇ style suspension trainer.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1107,1190,'Keep torso upright, close to vertical. Soleus of opposite leg may be stretched if foot is positioned forward and ankle is fully dorsal flexed.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1108,1192,'Alternatively, both hands can anchor upper thigh, on hand inside and other on out side of thigh. The leg may also hang from side of bench if body is positioned slightly diagonal. If stretch is not felt, pull upper thigh closer to side of torso with both hands or use taller bench if heal touches floor.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1109,1191,'Torso can be bent slightly forward with forearms on padded podium. If padded lower leg support is angled up, Rectus Femoris may also be stretched.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1110,1194,'Height of knee on exercising leg may require subtle adjustment during movement to permit clearance of traveling foot above floor. Gluteus Maximus will be activated as stabilizer on heavier loads when participant pushes stationary foot onto floor thereby anchoring lower body as hip adductors keep thighs together. Upper body muscles can also assist in keeping thigh of exercising leg along side stationary leg. Exercise name is somewhat counter-intuitive since direction of rotation is relative to movement of hip, or thigh, not bent leg. For example, in this exercises, external rotation of hip causes front of thigh to turn outward despite bent leg moving inward. Incidentally if knee were straight during external rotation of thigh, foot would move outward.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1111,1195,'Body may be reclined with support of arms as demonstrated (lower right). Also see Seated External Rotator Stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1112,1197,'Low back may be stretched if hips raise off of floor significantly. If spinal flexion is not desired, care should be given to keep back of hips on floor by monitoring hips position and pushing downward instead of toward participant\'s chest. See PNF stretch techniques. Also see Lying Piriformis Stretch for similar static stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1113,1199,'Low back may be stretched if hips and low back muscles are tight.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1114,1200,'Low back may be stretched if spine flexes significantly during stretch. Arms can hug and pull upper legs toward torso as shown in lower photo.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1115,1201,'Exercise name is somewhat counter-intuitive since direction of rotation is relative to movement of hip, or thigh, not bent leg. For example, in this exercises, external rotation of hip causes front of thigh to turn outward despite bent leg moving inward. Incidentally if knee were straight during external rotation of thigh, foot would move outward.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1116,1202,'Also see Lying External Rotator Stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1117,1203,'An alternative preparation: set on floor or mat reclining back with support of both arms behind body. Bend knees with feet on floor. Place back of knee on thigh of other leg. Hug both thighs locking both hands together behind knee of lower leg. Lie down supine by rolling to back.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1118,1204,'Notice knee is keep over torso in contrast to Lying Glute Stretch. Also see Lying Piriformis Stretch for alternative form.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1119,1205,'Low back may be stretched if hips and low back muscles are tight.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1120,1206,'See PNF stretch techniques. A static Seated Piriformis Stretch can also be performed without assistance.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1121,1211,'Keep torso upright and knee of lead leg pointed same direction of foot. Flexible hip adductors and stronger legs will allow fuller range of motion. A wider stance emphasizes Gluteus Maximus; slightly narrower straddled stance emphasizes Quadriceps. Do not position feet too close nor too wide.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1122,1217,'Keep head facing forward, back straight and feet flat on floor; equal distribution of weight throughout forefoot and heel. Knees should point same direction as feet throughout movement. See:',1,'2021-06-27 13:39:40',NULL,NULL,0),(1123,1237,'More or less 3/4 squat depth can be achieved depending upon exerciser\'s height, chain length on dip belt, and height of elevated platform. If greater depth can be achieved, descend as low as thighs being parallel to floor. Keep head facing forward, back straight, chest high, arms straight to sides, and feet flat on platform; equal distribution of weight through forefoot and heel. Knees should point same direction as feet throughout movement. See Squat Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1124,1239,'Those with hamstring inflexibility may have difficulty fully extending knee if knee is too high. In which case, knee can be raised forward less than 45°. Pectineus, Adductor Longus, Adductor Brevis do not contribute to hip stabilization since they are only involved in initial range of hip flexion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1125,1243,'Keep lower leg straight throughout movement. Forward knee should point same direction as foot throughout movement. Instead of grasping cable stirrups, dip belt attached to low pulley cable can be placed around waist.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1126,1249,'Stabilizers may be used during heavy resistances to prevent body rising off of seat.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1127,1254,'Stabilizers may be used during heavy resistances to prevent body rising off of seat. Also see exercise perfomed on bilateral machine.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1128,1262,'With greater resistances, more effort is required to pull on handle bars to keep body from rising upward.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1129,1271,'Re-engage support lever before dismounting. Model shown uses foot pedal near base of platform to re-engage support lever. Keep head facing forward, back straight and feet flat on platform; equal distribution of weight through forefoot and heel. Knees should point same direction as feet throughout movement. See Squat Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1130,1279,'Stabilizers may be used during heavy resistances to prevent body rising off of seat.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1131,1281,'Stabilizers may be used during heavy resistances to prevent body from rising off of seat. Also see exercises performed on bilateral machine.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1132,1285,'Stabilizers may be used during heavy resistances to prevent body rising off of seat.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1133,1286,'Adjust bench to accommodate near full range of motion without forcing hips to bend at waist. Keep knees pointed same directions as feet. Do not allow heels to raise off of platform, pushing with both heel and forefoot. This exercise may be performed by alternating (as described), simultaneous, or in simultaneous-alternating fashion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1134,1289,'Re-engage support lever in extended position before dismounting. If insufficient hip flexibility forces pelvis to pull away from back pad at lower portions of movement, only lower sled just short of spinal articulation. Keep knees pointed same directions as feet. Do not allow heels to raise off of platform, pushing with both heel and forefoot. Placing feet slightly high on platform emphasizes Gluteus Maximus. Placing feet slightly lower on platform emphasizes Quadriceps.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1135,1309,'Keep torso upright and foot flat on platform during exercise.\nKnee of exercised leg should point same direction as foot. Extended\nleg can be positioned slight forward.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1136,1317,'Keep waist and hips straight throughout exercise. Knees should point same direction as feet throughout movement. Sissy Squat can be performed without additional weight until additional resistance is required. Also see Weighted Sissy Squat on apparatus.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1137,1323,'Keep chest high and shoulder behind hips, preventing torso to angle forward. If upper pad is too high, it can obstruct range of motion, and possibly create abrupt forward dislocating forces on knee particularly if descent is not controlled. In contrast, inadequate support will be provided if upper pad is too low.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1138,1324,'Keep waist and hips straight throughout exercise. Knees should point same direction as feet throughout movement. Also see Sissy Squat on apparatus.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1139,1329,'Keep chest high and shoulder behind hips, preventing torso to angle forward. If upper pad is too high, it can obstruct range of motion, and possibly create abrupt forward dislocating forces on knee, particularly if descent is not controlled. In contrast, inadequate support will be provided if upper pad is too low.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1140,1332,'Keep torso upright during exercise. Stepping knee should point same direction as foot. A modest degree of knee rotation occurs during this movement. See Controversial Exercises and Rotary Force in Squat Analysis.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1141,1466,'None.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1142,1467,'The opposite leg or thick towel can be placed under participant\'s near knee (and above participant\'s far knee) to further stretch Rectus Femoris. Tibialis Anterior can be stretched if ankle is completely plantar flexed. See PNF stretch techniques. Also see Prone Quadriceps Stretch for similar static stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1143,1468,'A thickly folded towel can be placed under upper hip if lumbar spine hyperextension would otherwise be uncomfortable. A thickly folded towel can be placed under knee to further stretch Rectus Femoris.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1144,1469,'Rear knee should be completely flexed to keep emphasis on Quadriceps, particularly Rectus Femoris. See Lever Hip Flexor Stretch for similar movement.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1145,1470,'Alternatively, hip may be initially extended, then ankle can be slowly pulled towards rear end. With either technique, do not allow knee to flare outward to side. If low back is sensitive to hyperextension, hip should be postured in more neutral position than demonstrated. If knee is not completely flexed Iliopsoas may be stretched; Quadriceps will not be stretched significantly. If range of motion permits try Standing Quadriceps Stretch with out towel.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1146,1471,'Alternatively, hip may be initially extended, then ankle can be slowly pulled towards rear end. With either technique, do not allow knee to flare outward to side. If low back is sensitive to hyperextension, hip should be postured in more neutral position than demonstrated. If knee is not completely flexed, Iliopsoas may be stretched; Quadriceps will not be stretched significantly. See Standing Tibialis Anterior Stretch for similar exercise which can be combined with this stretch and performed simultaneously. If range of motion prohibits grasping of ankle or foot try Standing Quadriceps Stretch with towel.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1147,1472,'During stretch, do not allow knee to flare upward away from floor. If knee is not completely flexed, Iliopsoas wil be stretched more than Quadriceps. Bottom hip and knee can be bent 90° thereby decreasing anterior pelvic tilt so upper leg will not need to be pulled back as far during hip extension. See Lying Tibialis Anterior Stretch for similar exercise which can be combined with this stretch and performed simultaneously.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1148,1473,'Do not allow knee to flare outward to side. If low back is sensitive to hyperextension, hip should be postured in more neutral position than demonstrated by positioning shelf lower and bending supporting knee more. If knee is not completely flexed, Iliopsoas may be stretched; Quadriceps will not be stretched significantly. Tibialis Anterior may also be stretched if only top of forefoot is on shelf, as opposed to top of entire foot.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1149,1474,'Pull knee in if it initially flares outward to side. This Dynamic Stretch can performed before athletic event or sports training session.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1150,1476,'Begin with very light weight and add additional weight gradually to allow adequate adaptation. Throughout lift, keep back and knees straight. Do not lower weight beyond mild stretch through hamstrings. Full range of motion will vary from person to person depending on flexibility. Also see Bent Knee Goodmorning emphasizing Glutes.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1151,1478,'Adjust lower leg brace so pressure is evenly distributed on thigh pad. Maintain barbell\'s position on back of shoulders when upper body is lowered. Do not lower weight beyond mild stretch. Full range of motion will vary from person to person. Also known as Barbell Hip Extension. Also see Barbell Hyper-extension and Barbell Back Extension.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1152,1479,'Throughout lift, keep arms, knees, and back straight. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch. Full range of motion will vary from person to person depending on flexibility. Re-rack or deadlift weight back to floor. Also see Straight Leg Deadlift.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1153,1480,'Not all trap bar designs may allow for this movement. A squared, open-ended trap bar is used in this demonstration. Throughout lift, keep arms, knees, and back straight. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch. Full range of motion will vary from person to person depending on flexibility. Deadlift weight back to floor.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1154,1481,'Exercise can be performed without added weight until more resistance is needed.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1155,1483,'This is an advanced exercise performed on Glute Ham Raise Apparatus. This movement is also known as Barbell Hamstring Raise. Exercise can be performed without added weight until more resistance is needed. Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius allowing it to assist in knee flexion. Also see Inverse Leg Curl\n\n\ncomments.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1156,1485,'Position pad high enough to evenly distribute body weight on thigh but not so high that range of motion is limited; abdomen should not press on top side of pad when upper body is lowered. Maintain barbell\'s position on back of shoulders when upper body is lowered. Do not lower weight beyond mild stretch. Full range of motion will vary from person to person. Also known as Barbell 45-degree Hip Extension. Also see Barbell Hyperextension and Barbell Back Extension.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1157,1486,'Throughout lift, keep arms, knees, and back straight. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch. Full range of motion will vary from person to person depending on flexibility. Also see Straight Leg Deadlift.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1158,1487,'Keep torso on bench to reduce hyperextension of lower back. Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius allowing it to assist in knee flexion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1159,1489,'Raise knee very slightly as knee is flexing and return as weight is lowered. Keep hip from sagging or from being pulled forward. Heavier resistances can tear apart standard leather ankle cuffs.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1160,1491,'Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius allowing it to assist in knee flexion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1161,1492,'Keep hip from sagging or from being pulled forward. Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius allowing it to assist in knee flexion. Also see Cable Bent-over Leg Curl.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1162,1493,'Throughout lift, keep arms, knees, and back straight. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch. Full range of motion will vary from person to person depending on flexibility. Also see Straight Leg Deadlift.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1163,1494,'Keep torso on bench to reduce hyperextension of lower back. Most machines are angled at user\'s hip to position hamstring in more favorable mechanical position. If angle is at much greater angle than one illustrated, Rectus Femoris will less likely be involved as Antagonist Stabilizer. Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius allowing it to assist in knee flexion. See Knee flexion abduction force vector diagram.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1164,1495,'Keep torso on bench to reduce hyperextension of lower back. Most machines are angled at user\'s hip to position hamstring in more favorable mechanical position. If angle at hip is significantly bent, Rectus Femoris will less likely be involved as Antagonist Stabilizer. Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius allowing it to assist in knee flexion. See Knee flexion abduction force vector diagram.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1165,1496,'The bent-over posture decreases active insufficiency of three of four heads of hamstring at completion of knee flexion. Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius allowing it to assist in knee flexion. This exercise is variation of Standing Leg Curl but is similar biomechanically to Kneeling Leg Curl.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1166,1497,'Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius, allowing it to assist in knee flexion. See Knee flexion abduction force vector diagram.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1167,1499,'Throughout lift, keep arms, knees, and back straight. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch. Full range of motion will vary from person to person depending on flexibility. Also see Straight Leg Deadlift.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1168,1502,'The bent-over posture decreases active insufficiency of three of four heads of hamstring at completion of knee flexion. Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius allowing it to assist in knee flexion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1169,1503,'Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius allowing it to assist in knee flexion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1170,1500,'Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius allowing it to assist in knee flexion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1171,1504,'Keep torso on bench to reduce hyperextension of lower back. Most machines are angled at user\'s hip to position hamstring in more favorable mechanical position. If this angle is sharp (as shown), Rectus Femoris is less likely involved as Antagonist Stabilizer. Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius allowing it to assist in knee flexion. See Knee flexion abduction force vector diagram.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1172,1505,'Keep torso on bench to reduce hyperextension of lower back. Most machines are angled at user\'s hip to position hamstring in more favorable mechanical position. If angle is at much greater angle than one illustrated, Rectus Femoris will less likely be involved as Antagonist Stabilizer. Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius allowing it to assist in knee flexion. See Knee flexion abduction force vector diagram.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1173,1501,'Allow resting leg on top to ride bar down and up throughout exercise. Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius allowing it to assist in knee flexion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1174,1506,'Some apparatuses allow for a bent over posture potentially further decreasing active insufficiency of three of four heads of hamstring at completion of knee flexion. If hips are not significantly bent (ie: body upright), Rectus Femoris becomes antagonist stabilizers. Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius allowing it to assist in knee flexion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1175,1507,'A leg extension with padded rollers with access to both sides is required. If needed, raise body slightly by raising heel so lever fulcrum closer to knee articulation. Disregard calf as stabilizer if this is not necessary. Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius allowing it to assist in knee flexion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1176,1508,'Taller individuals may only be able to perform this exercise on standard multi-hip machine if adjustments are not sufficient to position knee at same height of fulcrum. If needed, raise body slightly by raising heel for proper knee alignment. Disregard calf as stabilizer if this is not necessary. Maintain knee position to lever throughout exercise. Shorter individuals may find it difficult to position body high enough even with elevation. Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius allowing it to assist in knee flexion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1177,1509,'Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius allowing it to assist in knee flexion. Also see Lever Seated Leg Curl machine with pad below knee.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1178,1510,'Some apparatuses allow for a bent over posture potentially further decreasing active insufficiency of three of four heads of hamstring at completion of knee flexion. If hips are not significantly bent (ie: body upright), Rectus Femoris becomes antagonist stabilizers. Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius allowing it to assist in knee flexion. Similar exercise can also be performed on some multi-hip machines and certain leg extension machines. Also see Bent-over Leg Curl.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1179,1511,'Throughout lift, keep arms, knees, and back straight. Do not pause or bounce at bottom of lift. Do not lower weight beyond mild stretch. Full range of motion will vary from person to person depending on flexibility. Stand on elevated platform if smith machine does not allow full range of motion. Also see Straight Leg Deadlift.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1180,1512,'Begin with very light weight and add additional weight gradually to allow adequate adaptation. Throughout lift, keep back and knees straight. At lower position, forefoot may raise off floor slightly. Do not lower weight beyond mild stretch. Full range of motion will vary from person to person depending on flexibility. Also see Bent Knee Goodmorning emphasizing Glutes.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1181,1514,'Throughout lift, knees straight and back of hips on bench. Hip may tend to raise up when legs are pulled up. Full range of motion will vary from person to person depending on flexibility.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1182,1516,'Exercise can be performed without added weight until more resistance is needed. If weight is positioned behind head, neck extensors act as stabilizers.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1183,1518,'Exercise can be performed without added weight until more resistance is needed. If weight is positioned behind head, neck extensors act as stabilizers',1,'2021-06-27 13:39:40',NULL,NULL,0),(1184,1519,'This is an advanced exercise performed on Glute Ham Raise Apparatus. This movement is also known as Weighted Hamstring Raise. Exercise can be performed without added weight until more resistance is needed. If weight is positioned behind head, neck extensors act as stabilizers.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1185,1520,'Platform should be high enough to allow hip to flex without buttocks contacting floor. Full range of motion will vary from person to person. Adductor Magnus may only assist at initial phase hip extension depending on degree of hip flexion at bottom of movement.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1186,1521,'Platform should be high enough to allow hips to flex without buttocks contacting floor. Full range of motion will vary from person to person. Adductor Magnus may only assist at initial phase hip extension depending on degree of hip flexion at bottom of movement. Also see Hanging Hyperextension for Erector Spinae performed with fuller range of movement.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1187,1522,'Positioned bar so back is slightly above floor once grip is established. Keep low back and hips straight throughout movement. With hips fully extended, Hamstrings enter active insufficiency near complete knee flexion.  Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius, allowing it to assist in knee flexion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1188,1523,'Keep hips straight throughout movement. Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius allowing it to assist in knee flexion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1189,1524,'Keep hips straight throughout movement. With hips fully extended, Hamstrings enter active insufficiency near complete knee flexion. Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius, allowing it to assist in knee flexion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1190,1525,'This is an advanced exercise performed on Glute Ham Raise Apparatus. This movement is also known as Hamstring Raise. Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius allowing it to assist in knee flexion. Also see Inverse Leg Curl comments.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1191,1527,'This movement is also known as Self-assisted Hamstring Raise on Floor. Bar or pad height should be only just high enough to position ankles underneath, allowing room for vertical orientation of feet with toes on floor. To keep exercise challenging, push off only hard enough to minimally assist raising of body with hamstrings. Attempt to keep hips as straight as possible throughout movement.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1192,1528,'This movement is also known as Self-assisted Hamstring Raise. To keep exercise challenging, push off only hard enough to minimally assist raising of body with hamstrings only. Place hands on top of platform when controlled descent can no longer be maintained with hamstring strength alone. Also attempt to keep hips as straight as possible throughout movement',1,'2021-06-27 13:39:40',NULL,NULL,0),(1193,1526,'Positioned bar so back is slightly above floor once grip is established. Keep low back straight, maintaining approximate height from floor throughout movement. Hamstrings seemingly acts as a dynamic stabilizer, since it shortens through knee, while it lengthens through hip. However, net contraction actually appears to occur, since hip flexes only slightly, while knee flexes nearly 100%, allowing hamstrings to remain in a mechanically strong position throughout movement. Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius, allowing it to assist in knee flexion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1194,1530,'This exercise can be performed on TRXⓇ style suspension trainer or adjustable length gymnastics rings. Positioned handles so back is slightly above floor once grip is established. Keep low back straight, maintaining approximate height from floor throughout movement. Hamstrings seemingly acts as a dynamic stabilizer, since it shortens through knee, while it lengthens through hip. However, net contraction actually appears to occur, since hip flexes only about 50%, while knee flexes nearly 100%, allowing hamstrings to remain in a mechanically strong position throughout movement. Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius, allowing it to assist in knee flexion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1195,1531,'This exercise can be performed on TRXⓇ style suspension trainer or adjustable length gymnastics rings. Positioned handles so back is slightly above floor once grip is established. Keep low back and hips straight throughout movement. With hips fully extended, Hamstrings enter active insufficiency near complete knee flexion. Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius, allowing it to assist in knee flexion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1196,1532,'This exercise can be performed on TRXⓇ style suspension trainer. See Suspended Supine Feet Mount/Dismount. Keep hips straight throughout movement. With hips fully extended, Hamstrings enter active insufficiency near complete knee flexion. Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius, allowing it to assist in knee flexion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1197,1533,'Far leg can be bent at knee and hip particularly if hip flexors are tight and greater spinal flexion will not irritate existing lower back injury. Alternative method (pictured low right) involves pulling leg toward chest with knee nearly straight. Also see Lying Hamstring Stretch with towel.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1198,1534,'Keep knee straight throughout stretch. If horizontal foot bar is set so foot is more dorsal flexed, leg angle may not need to be set as high.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1199,1535,'See PNF stretch techniques. Also see Lying Hamstring Stretch for similar static stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1200,1538,'To intensify stretch, hold upper bar. Those with longer upper thigh may need to deliberately keep extended leg straight, position hips further back on seat, or perform alternative stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1201,1536,'This exercise can be performed on TRXⓇ style suspension trainer. See Suspended Supine Feet Mount/Dismount. Keep low back straight, maintaining approximate height from floor throughout movement. On most popular suspension trainers, keep lower body weight equally distributed on each side to prevent slippage. Some makes of suspension trainers do not have this slack in their design, so one leg can relax momentarily in straight position, while bent side bears most of resistance, allowing for a more dynamic contraction in this specific movement.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1202,1537,'This exercise can be performed on TRXⓇ style suspension trainer. See Suspended Supine Feet Mount/Dismount. Keep low back straight, maintaining approximate height from floor throughout movement. Hamstrings seemingly acts as a dynamic stabilizer, since it shortens through knee, while it lengthens through hip. However, net contraction actually appears to occur, since hip flexes only about 50%, while knee flexes nearly 100%, allowing hamstrings to remain in a mechanically strong position throughout movement. Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius, allowing it to assist in knee flexion.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1203,1539,'Keep knees straight by tensing Quadriceps. Knees may inadvertently bend if feet are extended off of thick mat. Spine may be kept straight. Pelvis may be tilted forward to intensify stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1204,1540,'Precautions must be taken to prevent sliping off chair. This stretch may be appropriate for those restricted to chair. Keep knees straight by tensing Quadriceps. Spine may be kept straight. Pelvis may be tilted forward to intensify stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1205,1541,'Alternatively, leg not being stretched can be bent so sole of foot is next to stretched thigh. Keep knee of stretched leg straight by tensing Quadriceps. Knees may inadvertently bend if feet are extended off of thick mat or bench. Spine may be kept straight. Pelvis may be tilted forward to intensify stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1206,1542,'Far leg can be straightened keep hip from rolling up or bent for comfort. Also see Lying Hamstring Stretch without towel.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1207,1543,'See PNF stretch techniques. Also see Seated Hamstring Stretch for similar static stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1208,1545,'Keep knees straight by tensing Quadriceps. Spine may be kept straight. Pelvis may be tilted forward to intensify stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1209,1544,'Those with greater than average hamstring flexibility may not find this stretch to be effective. In which case, an alternative stretch would be more suitable.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1210,1546,'Keep knees straight by tensing Quadriceps. The knee may inadvertently bend if foot is extended off edge of bench. Spine may be kept straight. Pelvis may be tilted forward to intensify stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1211,1548,'Keep rear knee straight. If necessary, tense Quadriceps. Spine may be kept straight. Pelvis may be tilted forward to intensify stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1212,1547,'Precautions must be taken to prevent sliping off chair. This stretch may be appropriate for those restricted to chair. Keep knee straight by tensing Quadriceps. Spine may be kept straight. Pelvis may be tilted forward to intensify stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1213,1549,'Rear knee should remain pointed same direction of rear foot. Both hands may be braced just above both knees. Forward knee may also be keep straight by tensing Quadriceps. Spine may be kept straight. Pelvis may be tilted forward to intensify stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1214,1550,'Avoid throwing leg up onto high elevation. Keep forward knee straight by tensing Quadriceps. Spine may be kept straight. Pelvis may be tilted forward to intensify stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1215,1551,'This Dynamic Stretch can performed before athletic event or sports training session. Although this dynamic stretch targets the Hamstrings in the raised leg, Iliopsoas is typically stretched in supporting leg due to posterior rotation of hips as leg is raised.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1216,1552,'This Dynamic Stretch can performed before athletic event or sports training session. Although this dynamic stretch targets the Hamstrings in the raised leg, Iliopsoas is typically stretched in supporting leg due to posterior rotation of hips as leg is raised.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1217,1553,'See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1218,1554,'Mount machine with leg levers together. Use lever to extend legs apart. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1219,1558,'See Spot Reduction Myth and ROM Criteria.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1220,1556,'See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1221,1560,'Notice cable pulley in use is out of view to left. Exerciser is holding on to ballet bar above opposite cable pulley, not in use. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1222,1559,'See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1223,1557,'Mount machine with leg levers together. Use lever to extend legs apart. See Spot Reduction Myth.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1224,1564,'Arms can push legs down if preferred.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1225,1565,'See PNF stretch techniques. Also see Lying Wall Groin Stretch for similar static stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1226,1566,'Push elbow into side of knee for added stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1227,1567,'None.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1228,1569,'Keep back of legs against wall.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1229,1570,'Erector Spinae may be stretched if spine is flexed during stretch. Gluteus Maximus may be stretched if hip is flexed enough.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1230,1571,'emphasizes Adductor Magnus, ischial fibers by flexing hip.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1231,1572,'Keep legs and back straight.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1232,1573,'Administrator may need to kneel down closer to partipants who are more flexible. See PNF stretch techniques. Also see Lying Wall Groin Stretch for similar static stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1233,1574,'Keep feet flat on floor and knees pointed same direction as toes. emphasizes Adductor Magnus, ischial fibers by flexing hip.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1234,1575,'Keep back straight during stretch. Gracilis is stretched on straight leg.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1235,1578,'Abduction stretch is adjusted by turning knob at side. Handles can be adjusted up and down. There is also adjustment that allows knees to bend.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1236,1577,'Adductor Magnus is stretched more as torso is lowered as in Seated Adductor Magnus Stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1237,1576,'Place hands on hips or keep hand on elevated surface or other stable structure for balance.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1238,1579,'Back may be keep straight. Other heads of Hip Adductors can be stretched if legs are positioned out as far as possible.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1239,1580,'Other heads of hip adductors may be stretched if knee of upper leg travels out to side during stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1240,1581,'Back may be keep straight. Other heads of Hip Adductors can be stretched if legs are positioned out as far as possible as in the Seated Groin Stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1241,1582,'None.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1242,1583,'Keeping lower leg straight keeps pelvis from tilting so upper knee does not have to come back as far. Gluteus Maximus is stretched if hips are slightly external rotated. Piriformis and Quadratus Femoris become stretched if hip is slightly transversely adducted (knee toward opposite side of chest).',1,'2021-06-27 13:39:40',NULL,NULL,0),(1243,1584,'Other heads of hip adductors can be stretched if knee of upper leg travels out to side during stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1244,1585,'Position rack just below lowest range of motion. Calf block should be positioned so safety bar is close to but does not make contact with rack. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch. See Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1245,1586,'Notice barbell makes contact with only non-painted surface (plastic or metal surface). Exercise step that will not overturn can be used as calf block. Position rack just below lowest range of motion. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch. See Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1246,1587,'Chain may be used to add length to cable so belt can be more easily attached to cable as long as it is short enough to allow full range of motion. Exercise step that will not overturn can be used as calf block. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch.\n\n\nSee Calf Exercise Analyses. Also see same movement performed on slightly different apparatus, Lever Standing Calf Raise (belt loaded).',1,'2021-06-27 13:39:40',NULL,NULL,0),(1247,1588,'Calf block or exercise step that will not overturn can be used as platform. Keep knee straight throughout exercise or bend knee slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch. See Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1248,1589,'A short chain may be used to add length to cable so belt can be more easily attached to cable as long as it is short enough to allow full range of motion. Calf block or exercise step that will not overturn can be used as platform. A short chain may be used, so belt can be more easily attached to cable as long as it is short enough to allow full range of motion. Keep knee straight throughout exercise or bend knee slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch. See Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1249,1590,'Exercise step that will not overturn can be used as calf block. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knee is bent slightly during stretch. Use lighter load if you need to assist with hands used for support or use both feet. See Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1250,1591,'Exercise step that will not overturn can be used as calf block. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch. If holding heavy dumbbell becomes too difficult, try single leg calf raise. See Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1251,1592,'Reposition stance if feet slip. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch. See Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1252,1593,'Position seat to allow full range of motion. Reposition stance if feet slip. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch. Also known as Rotary Calf Extension. See Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1253,1594,'Position lever just below lowest range of motion. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch. See Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1254,1595,'When finished, place feet back on platform, engage dock lever (if it automatically disengaged), and lower seat to original position. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch.\n\n\nSee Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1255,1596,'Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch. See Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1256,1597,'Position seat back yet not so far that lever bottoms out during stretch. Reposition stance if feet slip. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch. See Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1257,1598,'Position seat to allow full range of motion. Reposition stance if feet slip. Keep knees straight throughout exercise or bend knees slightly only during stretch (as shown). Quadriceps serve as synergists muscle if knees are bent slightly during stretch. See Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1258,1599,'If available, position lever or chain just below lowest range of motion. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch. See Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1259,1600,'When finished, place feet back on platform, engage dock lever (if it automatically disengaged), and lower seat to original position. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch. See Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1260,1601,'Position lever just below lowest range of motion. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch. See Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1261,1603,'Position seat back yet not so far that weight bottoms out (weight stack hits bottom) during stretch. Reposition stance if feet slip. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch. See Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1262,1602,'Position seat to allow full range of motion. Reposition stance if feet slip. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch. See Calf Exercise Analyses. Also see Lever Alternating Bent Knee Calf Extension.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1263,1604,'Position seat to allow full range of motion. Reposition stance if feet slip. Keep knees straight throughout exercise or bend knees slightly only during stretch (as shown). Quadriceps serve as synergists muscle if knees are bent slightly during stretch. See Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1264,1605,'If possible, position lever just below lowest range of motion. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch. See Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1265,1606,'Chain with attachment can be preattached to lever so belt can be more easily attached as long as it is short enough to allow full range of motion. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch.\n\n\nSee Calf Exercise Analyses. Also see same movement performed on slightly different apparatus, Cable Standing Calf Raise.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1266,1607,'Lower weight back into starting position if feet slip. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch. Exercise can also be performed with Simultaneous Extension. See Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1267,1608,'Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch. Also known as Sled Donkey Calf Raise. See Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1268,1609,'Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch. Also known as Sled Donkey Calf Raise. See Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1269,1610,'If possible, position lever just below lowest range of motion. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch. See Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1270,1611,'Position upper pad just below lowest range of motion. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch. See Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1271,1612,'Not all Hack Squat machines have platform with opened lower end allowing for this movement, but some platforms may accommodate calf block, see example. Disengage docking lever if it impedes movements. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergist muscle if knees are bent slightly during stretch. See Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1272,1613,'Position sled back yet not so far that weight bottoms out during stretch. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergist muscle if knees are bent slightly during stretch. See Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1273,1614,'If sled bottoms out on dock lever, disengage it to allow full range of motion. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergist muscle if knees are bent slightly during stretch. See Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1274,1615,'Reposition stance if feet slip. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch. Movement can also be performed on Bilateral 45° Leg Press apparatus. See Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1275,1616,'Position seat back yet not so far that weight bottoms out during stretch. Reposition stance if feet slip. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch. See Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1276,1617,'Reposition stance if feet slip. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch. See Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1277,1618,'Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch. Also see alternative form: Standing Calf Pop-ups involving Quadriceps. See Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1278,1619,'Position smith bar just below lowest range of motion. Weight can be loaded with or without bar catch engaged. In event bar catch obstructs movement mid-set, reach back with one hand and rotate bar to move bar catch out of way. If this is not possible, lower weight, adjust catch, and start again. When set has been completed lower bar to safety catch by bending knees. Make certain both safety catches are secure before each set.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1279,1620,'Position sled just below lowest range of motion. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch. Also see exercise on alternative apparatus with back pad. See Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1280,1621,'Keep knee straight throughout exercise or bend knee slightly only during stretch. Quadriceps serve as synergists muscle if knee is bent slightly during stretch. Use lighter load if you need to assist with hands used for support. See Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1281,1623,'Torso should be approximately parallel to floor. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as Synergists muscle if knees are bent slightly during stretch. Exercise is more challenging with training partner toward hips sitting upright. Also, training partner can hold additional weight in arms. See Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1282,1622,'Sled can be positioned just below lowest range of motion. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch. See Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1283,1624,'Exercise step that will not overturn can be used as calf block. Keep knees straight throughout exercise or bend knees slightly only during stretch. Quadriceps serve as synergists muscle if knees are bent slightly during stretch. See Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1284,1625,'Keep knee straight throughout exercise or bend knee slightly only during stretch. Quadriceps serve as synergists muscle if knee is bent slightly during stretch. See Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1285,1626,'Although angle of ankles increase as hands travel closer to feet (requiring less ankle/Gastrocnemius flexibility), angle of hips decreases (requiring more hip/Hamstrings flexibility). As hamstrings are stretched through hip, they pull on gastrocnemius due to intertwining contact hamstrings have on gastrocnemius behind knee.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1286,1627,'None.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1287,1628,'Keep knee straight throughout exercise or bend knee slightly only during stretch. Quadriceps serve as synergists muscle if knee is bent slightly during stretch. Clip shows use of pulling assistance from high support. If support is lower, assist by pushing on support.\n\n\nSee Calf Exercise Analyses. Also see technique with assistance from opposite leg.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1288,1629,'Keep knee of exercised leg straight throughout exercise. On assisting leg, keep ankle high and only assist minimal, just enough to raise body in a steady motion. See Calf Exercise Analyses.\n\n\nAlso see technique with assistance from upper body.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1289,1630,'Keep knee of rear leg straight and both feet flat on floor. Keep upper body upright. Experiment with positioning feet further apart so minimum bending of forward knee is required.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1290,1631,'Keep knee straight throughout exercise or bend knee slightly only during stretch. Quadriceps serve as synergists muscle if knee is bent slightly during stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1291,1632,'Soleus may also be stretched in forward bent leg if it is placed far enough back to be sufficiently stretched.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1292,1633,'None.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1293,1634,'None',1,'2021-06-27 13:39:40',NULL,NULL,0),(1294,1635,'Opposite leg may be keep bent or straight off to side.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1295,1636,'This machine design is very rare in comparison to Lever Seated Calf Raise machine. This particular machine was missing its adjustable leg pad so fists were placed between legs and cross bar. Movement is predominately Soleus. Gastrocnemius are in active insufficiency since knees are significantly bent. See Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1296,1637,'Slide forward to edge of bench and rack safety bar when finished. See suggested mount & dismount. Movement is predominately Soleus. Gastrocnemius are in active insufficiency since knees are significantly bent. See Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1297,1638,'Movement is predominately Soleus. Gastrocnemius are in active insufficiency since knees are significantly bent. See Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1298,1639,'Keep both feet flat on floor. Upper body may be keep upright. Experiment with positioning feet further apart so minimum bending of knees are required.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1299,1640,'Keep knee of stretched leg bent.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1300,1642,'Movement is predominately Soleus. Gastrocnemius are in active insufficiency since knees are significantly bent. See Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1301,1641,'Position seat to allow full range of motion. Gastrocnemius act as dynamic stabilizers because when they \'contract\' at ankle they are simultaneously \'stretched\' at knee. It could be argued they also act as synergist since bend at knee could be considered relatively smaller range of motion as compared to ankle articulation resulting in net contraction of Gastrocnemius. See Calf Exercise Analyses. Also see Lever Alternating Seated Calf Extension with straight knee.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1302,1643,'Safety stops can be used to support bar at lowest position, particularly if it is difficult to rack bar to original height. If possible, adjust height of bench or calf block so thigh is close to horizontal. Movement is predominately Soleus. Gastrocnemius are in active insufficiency since knees are significantly bent. See Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1303,1644,'Soleus may also be stretched in forward bent leg if it is placed far enough back to be sufficiently stretched.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1304,1645,'None.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1305,1646,'Movement is predominately Soleus. Gastrocnemius are in active insufficiency since knees are significantly bent. See mount and dismount and\n\n\nCalf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1306,1647,'None.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1307,1648,'Keep foot flat on floor.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1308,1649,'None.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1309,1650,'Opposite leg may be keep bent or straight off to side. Also see similar exercise Seated Plantar Fascia Stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1310,1651,'Opposite leg may be keep bent or straight off to side.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1311,1652,'A short chain may be used to add length to cable so belt can be more easily attached to cable as long as it is short enough to allow full range of motion. Calf block or exercise step that will not overturn can be used as platform. Keep knees and hips straight throughout exercise. The exercise can be made more difficult by positioning heels closer to edge of platform. See Dorsal Flexor Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1312,1653,'Throughout exercise, keep knees and hips straight and support barbell against verticals with both hands to sides. The exercise can be made more difficult by positionin\n\n\ng heels closer to edge of platform. Notice barbell makes contact with only non-painted surface (plastic or metal surface). See Dorsal Flexor Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1313,1654,'Keep knee and hip straight throughout exercise. Exercise can be made more difficult by positioning heels closer to edge of platform. If you need to assist with hands used for support, use lighter load (or no weight), or both feet, or position heels more on platform. See Dorsal Flexor Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1314,1656,'When finished, engage dock lever (if it automatically disengaged), and lower seat to original position. Feet should be place highest position that still allows forefeet to make contact with platform. Keep knees straight throughout exercise. Exercise is performed on apparatus design to perform Hack Press. Also see similar movement performed on Sled Donkey Calf Machine. See Dorsal Flexor Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1315,1655,'Care must be taken to avoid heels from slipping off platform. Begin with very light weight to insure shoes have adequate traction. Keep knees straight throughout exercise. See Dorsal Flexor Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1316,1658,'A short chain may be used to add length to cable so belt can be more easily attached to cable as long as it is short enough to allow full range of motion. Calf block or exercise step that will not overturn can be used as platform. Keep knees and hips straight throughout exercise. The exercise can be made more difficult by positioning heels closer to edge of platform. See Dorsal Flexor Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1317,1657,'Position rack just below lowest range of motion. Calf block should be positioned so safety bar is close to but does not make contact with rack. Keep knees and hips straight throughout exercise. See Dorsal Flexor Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1318,1659,'Keep knees and hips straight throughout exercise. The exercise can be made more difficult by using only one leg or positioning heels closer to edge of platform. If you need to assist with hands used for support, use lighter load (or no weight), or position heels more on platform. See Dorsal Flexor Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1319,1660,'Feet may be moved up higher on platform if bottom of forefoot can still remain on platform with knees straight and back of hips can remain on back pad. The angle of back pad may be lowered back to keep back of hips on lower portion of back pad. Keep knees straight throughout exercise. See Dorsal Flexor Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1320,1661,'Feet may be moved up higher on platform if bottom of forefoot can still contact platform with knees straight. Bring feet no further forward than back half of feet remaining on platform. Keep knees and hips straight throughout exercise. See Dorsal Flexor Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1321,1662,'Keep knees and hips straight throughout exercise. The exercise can be made more difficult by positioning heels closer to edge of platform as well as adding weight. See Dorsal Flexor Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1322,1663,'Care must be taken to avoid heels from slipping off platform. Begin with very light weight to insure shoes have adequate traction. Keep knees straight throughout exercise. See Dorsal Flexor Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1323,1664,'Often bending significantly at hips as shown in Sled Reverse Donkey Calf Raise typically reduces range of motion at ankle during dorsal flexion. Position torso more upright as shown, effectively reduces bend at hip. See Dorsal Flexor Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1324,1665,'Avoid using other muscles to push pedal down with heels as lever is lifted. Insure full range of motion is practiced. In starting lower position, scoot back on bench just slightly until full planter flexion is felt. Establish range of motion criteria for highest position. See Dorsal Flexor Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1325,1667,'Avoid using other muscles to push pedal down with heel as lever is lifted. Insure full range of motion is practiced. In starting lower position, scoot back on bench just slightly until full planter flexion is felt. Establish range of motion criteria for highest position. See Dorsal Flexor Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1326,1666,'Keep knees and hips straight throughout exercise. The exercise can be made more difficult by positioning heels closer to edge of platform. See Dorsal Flexor Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1327,1668,'Keep knees straight throughout exercise. Also known as Sled Donkey Reverse Calf Raise. Also see movement performed on Sled Hack Press. See Dorsal Flexor Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1328,1669,'Avoid pushing pedal down with heel as lever is lifted. Insure full range of motion is practiced. In starting lower position, lean back slightly until full planter flexion is felt. Establish range of motion criteria for highest position. Also see close up view. See Dorsal Flexor Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1329,1671,'Feet may be moved up higher on platform if bottom of forefoot can still remain on platform with knees straight and back of hips can remain on back pad. The angle of back pad may be lowered back to keep back of hips on lower portion of back pad. Keep knees straight throughout exercise. See Dorsal Flexor Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1330,1672,'Feet may be moved up higher on platform if bottom of forefoot can still contact platform with knees straight and back of hips can remain on back pad. The angle of back pad may be lowered back to keep back of hips on lower portion of back pad. Keep knees straight throughout exercise. Also see on alternative machine. See Dorsal Flexor Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1331,1670,'Keep knees straight throughout exercise. Also known as Sled Donkey Reverse Calf Raise. Also see movement performed on Sled Hack Press. See Dorsal Flexor Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1332,1674,'Feet may be moved up higher on platform if bottom of forefoot can still remain on platform with knees straight. Keep knees straight throughout exercise. See Dorsal Flexor Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1333,1673,'Often bending at the hip typically reduces range of motion at ankle during dorsal flexion. Two remedies include: (1) end knees slightly, (2) position torso more upright supported by extended arms, effectively reducing bend at hip as shown with Lever Reverse Donkey Calf Raise. In this last case, Triceps Brachii would act as stabilizer. See Dorsal Flexor Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1334,1675,'Feet should be place highest position that still allows forefeet to make contact with platform. Keep knees straight throughout exercise. Exercise is performed on apparatus design to perform Hack Press. Also see similar movement performed on Sled Donkey Calf Machine. See Dorsal Flexor Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1335,1676,'Feet may be moved up higher on platform if bottom of forefoot can still remain on platform with knees straight. Keep knees straight throughout exercise. Dock levers may not need to be released depending on machine model and body height. See Dorsal Flexor Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1336,1677,'Keep knees and hips straight throughout exercise. The exercise can be made more difficult by positioning heels closer to edge of platform. See Dorsal Flexor Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1337,1680,'Throughout exercise, keep knees and hips straight. The exercise can be made more difficult by positioning heels closer to edge of platform. See Dorsal Flexor Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1338,1678,'If sled bottoms out on dock lever, disengage it to allow full range of motion. Feet may be moved up higher on platform if bottom of forefoot can still remain on platform with knees straight. Keep knees straight throughout exercise. See Dorsal Flexor Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1339,1679,'Keep knees and hips straight throughout exercise. The exercise can be made more difficult by positioning heels closer to edge of platform. See Dorsal Flexor Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1340,1681,'Keep knees and hips straight throughout exercise. See Dorsal Flexor Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1341,1682,'Feet may be moved up higher on platform if bottom of forefoot can still remain on platform with knees straight and back of hips can remain on back pad. The angle of back pad may be lowered back to keep back of hips on lower portion of back pad. See Dorsal Flexor Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1342,1684,'None.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1343,1683,'See Standing Quadriceps Stretch for similar exercise which can be combined with this stretch and performed simultaneously.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1344,1685,'Do not allow feet to wing out and do not sit between ankles. Certain knee problems maybe aggravated by this stretch.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1345,1686,'See Lying (side) Quadriceps Stretch for similar exercise which can be combined with this stretch and performed simultaneously.',1,'2021-06-27 13:39:40',NULL,NULL,0),(1346,1687,'Keep knee and hip straight throughout exercise. Exercise can be made more difficult by positioning heels closer to edge of platform. See Dorsal Flexor Calf Exercise Analyses.',1,'2021-06-27 13:39:40',NULL,NULL,0); +/*!40000 ALTER TABLE `exercise_comment` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `exercise_related_classification` +-- + +DROP TABLE IF EXISTS `exercise_related_classification`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `exercise_related_classification` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'The ID of exercise related classification.', + `exercise_id` bigint unsigned NOT NULL COMMENT 'The ID of exercise.', + `exercise_classification_id` bigint unsigned NOT NULL COMMENT 'The exercise classification ID.', + `related_classification_type` tinyint NOT NULL COMMENT '1 - Utility, 2 - Mechanics, 3 - Force', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=3809 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Exercise Related Classification.\n\nRelationship:\nOne exercise usually mapping to 3 types of exercise classification.\nAnd one exercise can have more than one specific type of classification.\n\nFor example:\nOne exercise can have 2 records whose types are both Utility.'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `exercise_related_classification` +-- + +LOCK TABLES `exercise_related_classification` WRITE; +/*!40000 ALTER TABLE `exercise_related_classification` DISABLE KEYS */; +INSERT INTO `exercise_related_classification` VALUES (1,4,2,1),(2,4,4,2),(3,4,9,3),(4,1,1,1),(5,1,2,1),(6,1,4,2),(7,1,9,3),(8,3,1,1),(9,3,2,1),(10,3,4,2),(11,3,9,3),(12,2,1,1),(13,2,2,1),(14,2,4,2),(15,2,9,3),(16,5,2,1),(17,5,4,2),(18,5,9,3),(19,6,2,1),(20,6,4,2),(21,6,9,3),(22,7,2,1),(23,7,4,2),(24,7,9,3),(25,8,1,1),(26,8,2,1),(27,8,4,2),(28,8,9,3),(29,9,1,1),(30,9,2,1),(31,9,4,2),(32,9,9,3),(33,10,1,1),(34,10,2,1),(35,10,4,2),(36,10,9,3),(37,11,2,1),(38,11,4,2),(39,11,9,3),(40,13,2,1),(41,13,4,2),(42,13,9,3),(43,15,1,1),(44,15,2,1),(45,15,4,2),(46,15,9,3),(47,16,1,1),(48,16,2,1),(49,16,4,2),(50,16,8,3),(51,16,9,3),(52,17,1,1),(53,17,2,1),(54,17,4,2),(55,17,8,3),(56,17,9,3),(57,18,2,1),(58,18,4,2),(59,18,9,3),(60,19,1,1),(61,19,2,1),(62,19,4,2),(63,19,9,3),(64,20,1,1),(65,20,2,1),(66,20,4,2),(67,20,9,3),(68,21,1,1),(69,21,2,1),(70,21,4,2),(71,21,9,3),(72,22,1,1),(73,22,2,1),(74,22,4,2),(75,22,9,3),(76,23,1,1),(77,23,2,1),(78,23,4,2),(79,23,9,3),(80,26,1,1),(81,26,2,1),(82,26,4,2),(83,26,9,3),(84,25,1,1),(85,25,2,1),(86,25,4,2),(87,25,9,3),(88,24,1,1),(89,24,2,1),(90,24,4,2),(91,24,9,3),(92,27,2,1),(93,27,4,2),(94,27,9,3),(95,29,1,1),(96,29,2,1),(97,29,4,2),(98,29,9,3),(99,32,2,1),(100,32,4,2),(101,32,9,3),(102,33,1,1),(103,33,3,2),(104,33,8,3),(105,34,2,1),(106,34,4,2),(107,34,8,3),(108,35,1,1),(109,35,3,2),(110,35,8,3),(111,36,2,1),(112,36,4,2),(113,36,8,3),(114,37,1,1),(115,37,3,2),(116,37,8,3),(117,38,1,1),(118,38,3,2),(119,38,8,3),(120,40,1,1),(121,40,3,2),(122,40,8,3),(123,39,1,1),(124,39,3,2),(125,39,8,3),(126,42,2,1),(127,42,4,2),(128,42,8,3),(129,41,1,1),(130,41,3,2),(131,41,8,3),(132,43,2,1),(133,43,4,2),(134,43,8,3),(135,44,2,1),(136,44,4,2),(137,44,8,3),(138,45,2,1),(139,45,4,2),(140,45,8,3),(141,47,2,1),(142,47,4,2),(143,47,8,3),(144,46,1,1),(145,46,2,1),(146,46,3,2),(147,46,8,3),(148,48,2,1),(149,48,4,2),(150,48,8,3),(151,49,1,1),(152,49,2,1),(153,49,3,2),(154,49,8,3),(155,50,1,1),(156,50,2,1),(157,50,3,2),(158,50,8,3),(159,51,2,1),(160,51,4,2),(161,51,8,3),(162,52,2,1),(163,52,4,2),(164,52,8,3),(165,53,1,1),(166,53,2,1),(167,53,3,2),(168,53,8,3),(169,54,1,1),(170,54,3,2),(171,54,8,3),(172,55,1,1),(173,55,3,2),(174,55,8,3),(175,56,1,1),(176,56,3,2),(177,56,8,3),(178,57,1,1),(179,57,3,2),(180,57,8,3),(181,59,1,1),(182,59,2,1),(183,59,3,2),(184,59,8,3),(185,58,1,1),(186,58,3,2),(187,58,8,3),(188,60,2,1),(189,60,4,2),(190,60,8,3),(191,61,1,1),(192,61,3,2),(193,61,8,3),(194,62,1,1),(195,62,3,2),(196,62,8,3),(197,63,1,1),(198,63,2,1),(199,63,3,2),(200,63,8,3),(201,64,1,1),(202,64,3,2),(203,64,8,3),(204,65,1,1),(205,65,3,2),(206,65,8,3),(207,66,1,1),(208,66,3,2),(209,66,8,3),(210,67,1,1),(211,67,3,2),(212,67,8,3),(213,68,1,1),(214,68,3,2),(215,68,8,3),(216,69,1,1),(217,69,3,2),(218,69,8,3),(219,70,1,1),(220,70,3,2),(221,70,8,3),(222,71,1,1),(223,71,3,2),(224,71,8,3),(225,72,1,1),(226,72,3,2),(227,72,8,3),(228,73,1,1),(229,73,3,2),(230,73,8,3),(231,77,1,1),(232,77,3,2),(233,77,8,3),(234,78,1,1),(235,78,3,2),(236,78,8,3),(237,79,2,1),(238,79,4,2),(239,79,8,3),(240,81,1,1),(241,81,2,1),(242,81,4,2),(243,81,9,3),(244,82,1,1),(245,82,3,2),(246,82,9,3),(247,83,1,1),(248,83,2,1),(249,83,4,2),(250,83,9,3),(251,84,1,1),(252,84,3,2),(253,84,9,3),(254,86,1,1),(255,86,3,2),(256,86,9,3),(257,87,1,1),(258,87,3,2),(259,87,9,3),(260,85,1,1),(261,85,2,1),(262,85,4,2),(263,85,9,3),(264,88,1,1),(265,88,3,2),(266,88,9,3),(267,89,1,1),(268,89,2,1),(269,89,3,2),(270,89,9,3),(271,90,1,1),(272,90,3,2),(273,90,9,3),(274,91,1,1),(275,91,2,1),(276,91,4,2),(277,91,9,3),(278,92,2,1),(279,92,4,2),(280,92,9,3),(281,93,2,1),(282,93,4,2),(283,93,9,3),(284,95,1,1),(285,95,3,2),(286,95,9,3),(287,94,2,1),(288,94,4,2),(289,94,9,3),(290,96,2,1),(291,96,4,2),(292,96,9,3),(293,97,2,1),(294,97,4,2),(295,97,9,3),(296,98,1,1),(297,98,3,2),(298,98,9,3),(299,99,1,1),(300,99,2,1),(301,99,4,2),(302,99,9,3),(303,100,2,1),(304,100,4,2),(305,100,9,3),(306,101,2,1),(307,101,4,2),(308,101,9,3),(309,102,1,1),(310,102,3,2),(311,102,9,3),(312,103,1,1),(313,103,3,2),(314,103,9,3),(315,104,1,1),(316,104,3,2),(317,104,9,3),(318,105,1,1),(319,105,3,2),(320,105,9,3),(321,106,1,1),(322,106,2,1),(323,106,4,2),(324,106,9,3),(325,107,1,1),(326,107,2,1),(327,107,4,2),(328,107,9,3),(329,108,1,1),(330,108,3,2),(331,108,9,3),(332,109,1,1),(333,109,2,1),(334,109,4,2),(335,109,9,3),(336,110,1,1),(337,110,2,1),(338,110,4,2),(339,110,9,3),(340,114,2,1),(341,114,4,2),(342,114,9,3),(343,115,1,1),(344,115,3,2),(345,115,9,3),(346,116,1,1),(347,116,3,2),(348,116,9,3),(349,117,1,1),(350,117,2,1),(351,117,3,2),(352,117,9,3),(353,118,2,1),(354,118,4,2),(355,118,9,3),(356,119,1,1),(357,119,2,1),(358,119,3,2),(359,119,9,3),(360,120,2,1),(361,120,4,2),(362,120,9,3),(363,121,2,1),(364,121,4,2),(365,121,9,3),(366,122,2,1),(367,122,4,2),(368,122,9,3),(369,123,1,1),(370,123,2,1),(371,123,3,2),(372,123,9,3),(373,124,1,1),(374,124,2,1),(375,124,3,2),(376,124,9,3),(377,125,2,1),(378,125,4,2),(379,125,9,3),(380,126,1,1),(381,126,2,1),(382,126,3,2),(383,126,9,3),(384,127,2,1),(385,127,3,2),(386,127,9,3),(387,128,1,1),(388,128,2,1),(389,128,3,2),(390,128,9,3),(391,129,2,1),(392,129,4,2),(393,129,9,3),(394,130,2,1),(395,130,4,2),(396,130,9,3),(397,131,1,1),(398,131,2,1),(399,131,3,2),(400,131,9,3),(401,132,2,1),(402,132,4,2),(403,132,9,3),(404,133,1,1),(405,133,2,1),(406,133,3,2),(407,133,9,3),(408,134,2,1),(409,134,4,2),(410,134,9,3),(411,135,2,1),(412,135,3,2),(413,135,9,3),(414,136,2,1),(415,136,3,2),(416,136,9,3),(417,137,2,1),(418,137,3,2),(419,137,9,3),(420,138,2,1),(421,138,4,2),(422,138,9,3),(423,139,2,1),(424,139,4,2),(425,139,9,3),(426,140,1,1),(427,140,2,1),(428,140,3,2),(429,140,9,3),(430,141,1,1),(431,141,2,1),(432,141,3,2),(433,141,9,3),(434,142,2,1),(435,142,4,2),(436,142,9,3),(437,144,2,1),(438,144,4,2),(439,144,9,3),(440,145,2,1),(441,145,4,2),(442,145,9,3),(443,143,1,1),(444,143,2,1),(445,143,3,2),(446,143,9,3),(447,147,2,1),(448,147,4,2),(449,147,9,3),(450,148,2,1),(451,148,4,2),(452,148,9,3),(453,149,1,1),(454,149,2,1),(455,149,3,2),(456,149,9,3),(457,151,2,1),(458,151,4,2),(459,151,9,3),(460,150,2,1),(461,150,4,2),(462,150,9,3),(463,152,1,1),(464,152,2,1),(465,152,3,2),(466,152,9,3),(467,155,2,1),(468,155,4,2),(469,155,9,3),(470,153,2,1),(471,153,4,2),(472,153,9,3),(473,154,2,1),(474,154,4,2),(475,154,9,3),(476,156,2,1),(477,156,4,2),(478,156,9,3),(479,157,2,1),(480,157,4,2),(481,157,9,3),(482,158,1,1),(483,158,2,1),(484,158,3,2),(485,158,9,3),(486,159,1,1),(487,159,2,1),(488,159,3,2),(489,159,9,3),(490,160,1,1),(491,160,2,1),(492,160,3,2),(493,160,9,3),(494,162,2,1),(495,162,3,2),(496,162,9,3),(497,163,1,1),(498,163,2,1),(499,163,3,2),(500,163,9,3),(501,167,2,1),(502,167,4,2),(503,167,9,3),(504,168,2,1),(505,168,4,2),(506,168,9,3),(507,169,2,1),(508,169,4,2),(509,169,9,3),(510,170,2,1),(511,170,4,2),(512,170,9,3),(513,171,2,1),(514,171,4,2),(515,171,9,3),(516,172,1,1),(517,172,3,2),(518,172,8,3),(519,173,1,1),(520,173,3,2),(521,173,8,3),(522,174,1,1),(523,174,3,2),(524,174,8,3),(525,175,1,1),(526,175,3,2),(527,175,8,3),(528,176,1,1),(529,176,4,2),(530,176,8,3),(531,177,1,1),(532,177,2,1),(533,177,3,2),(534,177,8,3),(535,179,1,1),(536,179,4,2),(537,179,8,3),(538,178,1,1),(539,178,4,2),(540,178,8,3),(541,180,1,1),(542,180,2,1),(543,180,4,2),(544,180,8,3),(545,181,1,1),(546,181,4,2),(547,181,8,3),(548,182,1,1),(549,182,2,1),(550,182,4,2),(551,182,8,3),(552,183,2,1),(553,183,4,2),(554,183,8,3),(555,184,1,1),(556,184,4,2),(557,184,8,3),(558,185,1,1),(559,185,2,1),(560,185,4,2),(561,185,8,3),(562,186,1,1),(563,186,4,2),(564,186,8,3),(565,187,1,1),(566,187,2,1),(567,187,4,2),(568,187,8,3),(569,188,1,1),(570,188,4,2),(571,188,8,3),(572,189,1,1),(573,189,2,1),(574,189,4,2),(575,189,8,3),(576,190,1,1),(577,190,2,1),(578,190,4,2),(579,190,8,3),(580,191,1,1),(581,191,2,1),(582,191,4,2),(583,191,8,3),(584,192,2,1),(585,192,4,2),(586,192,8,3),(587,193,2,1),(588,193,4,2),(589,193,8,3),(590,194,2,1),(591,194,4,2),(592,194,8,3),(593,195,2,1),(594,195,4,2),(595,195,8,3),(596,196,1,1),(597,196,2,1),(598,196,4,2),(599,196,8,3),(600,197,2,1),(601,197,4,2),(602,197,8,3),(603,198,2,1),(604,198,4,2),(605,198,8,3),(606,200,1,1),(607,200,3,2),(608,200,8,3),(609,199,2,1),(610,199,4,2),(611,199,8,3),(612,201,1,1),(613,201,2,1),(614,201,4,2),(615,201,8,3),(616,202,2,1),(617,202,4,2),(618,202,8,3),(619,203,1,1),(620,203,2,1),(621,203,4,2),(622,203,8,3),(623,204,1,1),(624,204,2,1),(625,204,4,2),(626,204,8,3),(627,205,2,1),(628,205,4,2),(629,205,8,3),(630,206,2,1),(631,206,4,2),(632,206,8,3),(633,207,1,1),(634,207,2,1),(635,207,4,2),(636,207,8,3),(637,208,2,1),(638,208,4,2),(639,208,8,3),(640,209,1,1),(641,209,2,1),(642,209,4,2),(643,209,8,3),(644,210,1,1),(645,210,2,1),(646,210,4,2),(647,210,8,3),(648,211,1,1),(649,211,3,2),(650,211,8,3),(651,212,1,1),(652,212,3,2),(653,212,8,3),(654,213,1,1),(655,213,2,1),(656,213,4,2),(657,213,8,3),(658,214,1,1),(659,214,2,1),(660,214,4,2),(661,214,8,3),(662,215,1,1),(663,215,2,1),(664,215,4,2),(665,215,8,3),(666,216,1,1),(667,216,2,1),(668,216,4,2),(669,216,8,3),(670,217,1,1),(671,217,3,2),(672,217,8,3),(673,218,1,1),(674,218,2,1),(675,218,4,2),(676,218,8,3),(677,219,1,1),(678,219,3,2),(679,219,8,3),(680,220,1,1),(681,220,3,2),(682,220,8,3),(683,222,1,1),(684,222,2,1),(685,222,3,2),(686,222,8,3),(687,223,1,1),(688,223,2,1),(689,223,4,2),(690,223,8,3),(691,224,1,1),(692,224,2,1),(693,224,4,2),(694,224,8,3),(695,225,1,1),(696,225,3,2),(697,225,8,3),(698,226,1,1),(699,226,3,2),(700,226,8,3),(701,228,1,1),(702,228,3,2),(703,228,8,3),(704,229,1,1),(705,229,2,1),(706,229,3,2),(707,229,8,3),(708,230,1,1),(709,230,3,2),(710,230,8,3),(711,231,1,1),(712,231,3,2),(713,231,8,3),(714,232,1,1),(715,232,3,2),(716,232,8,3),(717,233,1,1),(718,233,3,2),(719,233,8,3),(720,234,1,1),(721,234,3,2),(722,234,8,3),(723,235,1,1),(724,235,3,2),(725,235,8,3),(726,236,1,1),(727,236,3,2),(728,236,8,3),(729,237,1,1),(730,237,3,2),(731,237,8,3),(732,238,1,1),(733,238,3,2),(734,238,8,3),(735,240,1,1),(736,240,3,2),(737,240,8,3),(738,241,1,1),(739,241,2,1),(740,241,4,2),(741,241,8,3),(742,242,1,1),(743,242,3,2),(744,242,8,3),(745,243,1,1),(746,243,3,2),(747,243,8,3),(748,244,1,1),(749,244,3,2),(750,244,8,3),(751,245,1,1),(752,245,3,2),(753,245,8,3),(754,247,1,1),(755,247,3,2),(756,247,8,3),(757,246,1,1),(758,246,2,1),(759,246,4,2),(760,246,8,3),(761,252,1,1),(762,252,3,2),(763,252,8,3),(764,253,1,1),(765,253,2,1),(766,253,4,2),(767,253,9,3),(768,254,1,1),(769,254,2,1),(770,254,4,2),(771,254,9,3),(772,255,2,1),(773,255,4,2),(774,255,9,3),(775,256,1,1),(776,256,4,2),(777,256,9,3),(778,257,1,1),(779,257,4,2),(780,257,9,3),(781,259,1,1),(782,259,4,2),(783,259,9,3),(784,258,1,1),(785,258,2,1),(786,258,4,2),(787,258,9,3),(788,260,2,1),(789,260,4,2),(790,260,9,3),(791,261,1,1),(792,261,2,1),(793,261,4,2),(794,261,9,3),(795,262,2,1),(796,262,4,2),(797,262,9,3),(798,263,1,1),(799,263,4,2),(800,263,9,3),(801,264,1,1),(802,264,2,1),(803,264,3,2),(804,264,9,3),(805,265,1,1),(806,265,2,1),(807,265,4,2),(808,265,9,3),(809,266,1,1),(810,266,2,1),(811,266,4,2),(812,266,9,3),(813,269,1,1),(814,269,2,1),(815,269,4,2),(816,269,9,3),(817,270,1,1),(818,270,3,2),(819,270,9,3),(820,271,1,1),(821,271,2,1),(822,271,3,2),(823,271,9,3),(824,275,2,1),(825,275,4,2),(826,275,9,3),(827,276,2,1),(828,276,4,2),(829,276,9,3),(830,277,2,1),(831,277,4,2),(832,277,9,3),(833,281,2,1),(834,281,4,2),(835,281,9,3),(836,280,2,1),(837,280,4,2),(838,280,9,3),(839,278,2,1),(840,278,4,2),(841,278,9,3),(842,279,2,1),(843,279,4,2),(844,279,9,3),(845,283,2,1),(846,283,4,2),(847,283,9,3),(848,282,2,1),(849,282,4,2),(850,282,9,3),(851,284,2,1),(852,284,4,2),(853,284,9,3),(854,285,2,1),(855,285,4,2),(856,285,9,3),(857,286,2,1),(858,286,4,2),(859,286,9,3),(860,287,2,1),(861,287,4,2),(862,287,9,3),(863,288,2,1),(864,288,4,2),(865,288,9,3),(866,289,2,1),(867,289,4,2),(868,289,9,3),(869,290,2,1),(870,290,4,2),(871,290,9,3),(872,291,2,1),(873,291,4,2),(874,291,9,3),(875,292,2,1),(876,292,4,2),(877,292,9,3),(878,293,2,1),(879,293,4,2),(880,293,9,3),(881,294,2,1),(882,294,4,2),(883,294,9,3),(884,295,2,1),(885,295,4,2),(886,295,9,3),(887,296,2,1),(888,296,4,2),(889,296,9,3),(890,297,2,1),(891,297,4,2),(892,297,9,3),(893,298,2,1),(894,298,4,2),(895,298,9,3),(896,299,2,1),(897,299,4,2),(898,299,9,3),(899,300,2,1),(900,300,4,2),(901,300,9,3),(902,301,2,1),(903,301,4,2),(904,301,9,3),(905,302,2,1),(906,302,4,2),(907,302,9,3),(908,303,2,1),(909,303,4,2),(910,303,9,3),(911,304,2,1),(912,304,4,2),(913,304,9,3),(914,306,2,1),(915,306,4,2),(916,306,9,3),(917,305,1,1),(918,305,2,1),(919,305,4,2),(920,305,9,3),(921,307,2,1),(922,307,4,2),(923,307,9,3),(924,309,2,1),(925,309,4,2),(926,309,9,3),(927,308,2,1),(928,308,4,2),(929,308,9,3),(930,311,2,1),(931,311,4,2),(932,311,9,3),(933,312,2,1),(934,312,4,2),(935,312,9,3),(936,313,1,1),(937,313,2,1),(938,313,4,2),(939,313,9,3),(940,314,1,1),(941,314,2,1),(942,314,4,2),(943,314,9,3),(944,315,1,1),(945,315,2,1),(946,315,4,2),(947,315,9,3),(948,316,2,1),(949,316,4,2),(950,316,9,3),(951,317,1,1),(952,317,2,1),(953,317,4,2),(954,317,9,3),(955,319,1,1),(956,319,2,1),(957,319,4,2),(958,319,9,3),(959,318,1,1),(960,318,2,1),(961,318,4,2),(962,318,9,3),(963,320,1,1),(964,320,2,1),(965,320,4,2),(966,320,9,3),(967,321,1,1),(968,321,2,1),(969,321,4,2),(970,321,9,3),(971,322,2,1),(972,322,4,2),(973,322,9,3),(974,323,1,1),(975,323,2,1),(976,323,4,2),(977,323,9,3),(978,324,1,1),(979,324,2,1),(980,324,4,2),(981,324,9,3),(982,325,1,1),(983,325,2,1),(984,325,4,2),(985,325,9,3),(986,326,2,1),(987,326,4,2),(988,326,8,3),(989,332,2,1),(990,332,4,2),(991,332,9,3),(992,328,1,1),(993,328,2,1),(994,328,4,2),(995,328,9,3),(996,333,2,1),(997,333,4,2),(998,333,9,3),(999,334,1,1),(1000,334,2,1),(1001,334,4,2),(1002,334,9,3),(1003,335,1,1),(1004,335,2,1),(1005,335,4,2),(1006,335,9,3),(1007,336,2,1),(1008,336,4,2),(1009,336,9,3),(1010,337,1,1),(1011,337,2,1),(1012,337,4,2),(1013,337,9,3),(1014,338,1,1),(1015,338,2,1),(1016,338,4,2),(1017,338,9,3),(1018,339,1,1),(1019,339,2,1),(1020,339,4,2),(1021,339,9,3),(1022,340,2,1),(1023,340,4,2),(1024,340,9,3),(1025,341,1,1),(1026,341,2,1),(1027,341,4,2),(1028,341,9,3),(1029,342,2,1),(1030,342,4,2),(1031,342,9,3),(1032,346,2,1),(1033,346,4,2),(1034,346,8,3),(1035,345,2,1),(1036,345,4,2),(1037,345,8,3),(1038,347,2,1),(1039,347,4,2),(1040,347,8,3),(1041,348,2,1),(1042,348,4,2),(1043,348,8,3),(1044,349,2,1),(1045,349,4,2),(1046,349,8,3),(1047,350,2,1),(1048,350,4,2),(1049,350,9,3),(1050,351,2,1),(1051,351,4,2),(1052,351,9,3),(1053,352,2,1),(1054,352,4,2),(1055,352,9,3),(1056,353,2,1),(1057,353,4,2),(1058,353,9,3),(1059,354,2,1),(1060,354,4,2),(1061,354,9,3),(1062,355,1,1),(1063,355,2,1),(1064,355,3,2),(1065,355,9,3),(1066,356,1,1),(1067,356,2,1),(1068,356,3,2),(1069,356,9,3),(1070,357,1,1),(1071,357,3,2),(1072,357,9,3),(1073,358,1,1),(1074,358,2,1),(1075,358,3,2),(1076,358,9,3),(1077,359,1,1),(1078,359,3,2),(1079,359,9,3),(1080,360,1,1),(1081,360,2,1),(1082,360,3,2),(1083,360,9,3),(1084,362,1,1),(1085,362,2,1),(1086,362,3,2),(1087,362,9,3),(1088,361,1,1),(1089,361,2,1),(1090,361,3,2),(1091,361,9,3),(1092,363,2,1),(1093,363,3,2),(1094,363,9,3),(1095,364,1,1),(1096,364,2,1),(1097,364,3,2),(1098,364,9,3),(1099,365,1,1),(1100,365,2,1),(1101,365,3,2),(1102,365,9,3),(1103,366,1,1),(1104,366,2,1),(1105,366,3,2),(1106,366,9,3),(1107,367,1,1),(1108,367,3,2),(1109,367,9,3),(1110,368,1,1),(1111,368,2,1),(1112,368,3,2),(1113,368,9,3),(1114,369,1,1),(1115,369,2,1),(1116,369,3,2),(1117,369,9,3),(1118,370,1,1),(1119,370,3,2),(1120,370,9,3),(1121,371,1,1),(1122,371,2,1),(1123,371,3,2),(1124,371,9,3),(1125,372,1,1),(1126,372,2,1),(1127,372,3,2),(1128,372,9,3),(1129,373,1,1),(1130,373,3,2),(1131,373,9,3),(1132,374,1,1),(1133,374,2,1),(1134,374,3,2),(1135,374,9,3),(1136,375,1,1),(1137,375,2,1),(1138,375,3,2),(1139,375,9,3),(1140,376,1,1),(1141,376,3,2),(1142,376,9,3),(1143,377,1,1),(1144,377,2,1),(1145,377,3,2),(1146,377,9,3),(1147,378,1,1),(1148,378,3,2),(1149,378,9,3),(1150,379,2,1),(1151,379,3,2),(1152,379,9,3),(1153,380,1,1),(1154,380,3,2),(1155,380,9,3),(1156,381,1,1),(1157,381,3,2),(1158,381,9,3),(1159,382,1,1),(1160,382,2,1),(1161,382,3,2),(1162,382,9,3),(1163,383,1,1),(1164,383,3,2),(1165,383,9,3),(1166,385,1,1),(1167,385,3,2),(1168,385,9,3),(1169,384,1,1),(1170,384,2,1),(1171,384,3,2),(1172,384,9,3),(1173,386,1,1),(1174,386,2,1),(1175,386,3,2),(1176,386,9,3),(1177,387,1,1),(1178,387,3,2),(1179,387,9,3),(1180,389,1,1),(1181,389,2,1),(1182,389,3,2),(1183,389,9,3),(1184,388,1,1),(1185,388,2,1),(1186,388,3,2),(1187,388,9,3),(1188,391,1,1),(1189,391,3,2),(1190,391,9,3),(1191,390,1,1),(1192,390,3,2),(1193,390,9,3),(1194,392,1,1),(1195,392,3,2),(1196,392,9,3),(1197,393,1,1),(1198,393,3,2),(1199,393,9,3),(1200,394,2,1),(1201,394,3,2),(1202,394,9,3),(1203,395,1,1),(1204,395,3,2),(1205,395,9,3),(1206,396,1,1),(1207,396,3,2),(1208,396,9,3),(1209,398,1,1),(1210,398,3,2),(1211,398,9,3),(1212,399,1,1),(1213,399,2,1),(1214,399,3,2),(1215,399,9,3),(1216,401,1,1),(1217,401,3,2),(1218,401,9,3),(1219,403,1,1),(1220,403,2,1),(1221,403,3,2),(1222,403,9,3),(1223,402,1,1),(1224,402,3,2),(1225,402,9,3),(1226,405,1,1),(1227,405,3,2),(1228,405,9,3),(1229,406,1,1),(1230,406,3,2),(1231,406,9,3),(1232,407,1,1),(1233,407,2,1),(1234,407,3,2),(1235,407,9,3),(1236,408,1,1),(1237,408,3,2),(1238,408,9,3),(1239,410,1,1),(1240,410,3,2),(1241,410,9,3),(1242,411,1,1),(1243,411,3,2),(1244,411,9,3),(1245,413,1,1),(1246,413,3,2),(1247,413,9,3),(1248,414,1,1),(1249,414,2,1),(1250,414,3,2),(1251,414,9,3),(1252,412,1,1),(1253,412,2,1),(1254,412,3,2),(1255,412,9,3),(1256,415,1,1),(1257,415,2,1),(1258,415,3,2),(1259,415,9,3),(1260,417,1,1),(1261,417,2,1),(1262,417,3,2),(1263,417,9,3),(1264,419,1,1),(1265,419,2,1),(1266,419,3,2),(1267,419,9,3),(1268,420,1,1),(1269,420,2,1),(1270,420,3,2),(1271,420,9,3),(1272,422,1,1),(1273,422,2,1),(1274,422,3,2),(1275,422,9,3),(1276,423,1,1),(1277,423,2,1),(1278,423,3,2),(1279,423,9,3),(1280,425,2,1),(1281,425,3,2),(1282,425,9,3),(1283,426,2,1),(1284,426,4,2),(1285,426,9,3),(1286,427,1,1),(1287,427,3,2),(1288,427,9,3),(1289,428,1,1),(1290,428,3,2),(1291,428,9,3),(1292,429,1,1),(1293,429,3,2),(1294,429,9,3),(1295,430,1,1),(1296,430,3,2),(1297,430,9,3),(1298,431,1,1),(1299,431,3,2),(1300,431,9,3),(1301,432,1,1),(1302,432,2,1),(1303,432,3,2),(1304,432,9,3),(1305,433,2,1),(1306,433,4,2),(1307,433,9,3),(1308,434,1,1),(1309,434,3,2),(1310,434,9,3),(1311,435,1,1),(1312,435,3,2),(1313,435,9,3),(1314,436,1,1),(1315,436,2,1),(1316,436,3,2),(1317,436,9,3),(1318,437,1,1),(1319,437,2,1),(1320,437,3,2),(1321,437,9,3),(1322,438,1,1),(1323,438,3,2),(1324,438,9,3),(1325,440,2,1),(1326,440,3,2),(1327,440,9,3),(1328,439,1,1),(1329,439,3,2),(1330,439,9,3),(1331,441,1,1),(1332,441,3,2),(1333,441,9,3),(1334,442,1,1),(1335,442,2,1),(1336,442,3,2),(1337,442,9,3),(1338,443,2,1),(1339,443,4,2),(1340,443,9,3),(1341,444,1,1),(1342,444,3,2),(1343,444,9,3),(1344,445,1,1),(1345,445,3,2),(1346,445,9,3),(1347,446,2,1),(1348,446,4,2),(1349,446,9,3),(1350,447,1,1),(1351,447,3,2),(1352,447,9,3),(1353,448,1,1),(1354,448,3,2),(1355,448,9,3),(1356,449,1,1),(1357,449,3,2),(1358,449,9,3),(1359,450,2,1),(1360,450,4,2),(1361,450,9,3),(1362,451,1,1),(1363,451,3,2),(1364,451,9,3),(1365,452,1,1),(1366,452,3,2),(1367,452,9,3),(1368,453,1,1),(1369,453,3,2),(1370,453,9,3),(1371,454,1,1),(1372,454,3,2),(1373,454,9,3),(1374,455,2,1),(1375,455,3,2),(1376,455,9,3),(1377,456,1,1),(1378,456,3,2),(1379,456,9,3),(1380,457,1,1),(1381,457,3,2),(1382,457,9,3),(1383,458,1,1),(1384,458,3,2),(1385,458,9,3),(1386,459,1,1),(1387,459,3,2),(1388,459,9,3),(1389,460,1,1),(1390,460,3,2),(1391,460,9,3),(1392,463,1,1),(1393,463,3,2),(1394,463,9,3),(1395,462,2,1),(1396,462,4,2),(1397,462,9,3),(1398,464,1,1),(1399,464,3,2),(1400,464,9,3),(1401,465,1,1),(1402,465,3,2),(1403,465,9,3),(1404,467,1,1),(1405,467,3,2),(1406,467,9,3),(1407,468,2,1),(1408,468,4,2),(1409,468,9,3),(1410,470,1,1),(1411,470,3,2),(1412,470,9,3),(1413,471,1,1),(1414,471,3,2),(1415,471,9,3),(1416,473,1,1),(1417,473,3,2),(1418,473,9,3),(1419,474,1,1),(1420,474,3,2),(1421,474,9,3),(1422,476,1,1),(1423,476,3,2),(1424,476,9,3),(1425,475,1,1),(1426,475,3,2),(1427,475,9,3),(1428,477,1,1),(1429,477,3,2),(1430,477,9,3),(1431,478,1,1),(1432,478,3,2),(1433,478,9,3),(1434,479,1,1),(1435,479,3,2),(1436,479,9,3),(1437,480,1,1),(1438,480,3,2),(1439,480,9,3),(1440,481,1,1),(1441,481,3,2),(1442,481,9,3),(1443,483,1,1),(1444,483,3,2),(1445,483,9,3),(1446,484,1,1),(1447,484,3,2),(1448,484,9,3),(1449,485,1,1),(1450,485,3,2),(1451,485,9,3),(1452,486,1,1),(1453,486,3,2),(1454,486,9,3),(1455,487,1,1),(1456,487,3,2),(1457,487,9,3),(1458,488,1,1),(1459,488,3,2),(1460,488,9,3),(1461,489,1,1),(1462,489,3,2),(1463,489,9,3),(1464,490,1,1),(1465,490,3,2),(1466,490,9,3),(1467,491,1,1),(1468,491,3,2),(1469,491,9,3),(1470,492,1,1),(1471,492,3,2),(1472,492,9,3),(1473,493,1,1),(1474,493,3,2),(1475,493,9,3),(1476,494,1,1),(1477,494,3,2),(1478,494,9,3),(1479,495,1,1),(1480,495,3,2),(1481,495,9,3),(1482,496,1,1),(1483,496,3,2),(1484,496,9,3),(1485,497,2,1),(1486,497,4,2),(1487,497,9,3),(1488,498,2,1),(1489,498,4,2),(1490,498,8,3),(1491,499,1,1),(1492,499,3,2),(1493,499,9,3),(1494,501,1,1),(1495,501,3,2),(1496,501,9,3),(1497,503,2,1),(1498,503,4,2),(1499,503,8,3),(1500,511,1,1),(1501,511,2,1),(1502,511,4,2),(1503,511,9,3),(1504,513,1,1),(1505,513,4,2),(1506,513,9,3),(1507,512,1,1),(1508,512,4,2),(1509,512,9,3),(1510,514,1,1),(1511,514,4,2),(1512,514,9,3),(1513,515,1,1),(1514,515,4,2),(1515,515,9,3),(1516,517,1,1),(1517,517,2,1),(1518,517,4,2),(1519,517,9,3),(1520,516,1,1),(1521,516,2,1),(1522,516,4,2),(1523,516,9,3),(1524,518,2,1),(1525,518,4,2),(1526,518,9,3),(1527,519,1,1),(1528,519,4,2),(1529,519,9,3),(1530,520,1,1),(1531,520,2,1),(1532,520,4,2),(1533,520,9,3),(1534,521,2,1),(1535,521,4,2),(1536,521,9,3),(1537,522,1,1),(1538,522,4,2),(1539,522,9,3),(1540,523,1,1),(1541,523,4,2),(1542,523,9,3),(1543,527,1,1),(1544,527,4,2),(1545,527,9,3),(1546,524,2,1),(1547,524,4,2),(1548,524,9,3),(1549,526,1,1),(1550,526,4,2),(1551,526,9,3),(1552,525,1,1),(1553,525,4,2),(1554,525,9,3),(1555,528,1,1),(1556,528,2,1),(1557,528,4,2),(1558,528,9,3),(1559,529,1,1),(1560,529,2,1),(1561,529,4,2),(1562,529,9,3),(1563,530,2,1),(1564,530,4,2),(1565,530,9,3),(1566,531,2,1),(1567,531,4,2),(1568,531,9,3),(1569,533,1,1),(1570,533,2,1),(1571,533,4,2),(1572,533,9,3),(1573,536,2,1),(1574,536,4,2),(1575,536,9,3),(1576,537,2,1),(1577,537,4,2),(1578,537,9,3),(1579,538,2,1),(1580,538,4,2),(1581,538,9,3),(1582,539,2,1),(1583,539,4,2),(1584,539,9,3),(1585,541,2,1),(1586,541,4,2),(1587,541,9,3),(1588,540,2,1),(1589,540,4,2),(1590,540,9,3),(1591,542,2,1),(1592,542,4,2),(1593,542,9,3),(1594,543,2,1),(1595,543,4,2),(1596,543,9,3),(1597,544,2,1),(1598,544,4,2),(1599,544,9,3),(1600,546,2,1),(1601,546,4,2),(1602,546,9,3),(1603,552,2,1),(1604,552,4,2),(1605,552,9,3),(1606,553,2,1),(1607,553,4,2),(1608,553,9,3),(1609,554,2,1),(1610,554,4,2),(1611,554,9,3),(1612,555,2,1),(1613,555,4,2),(1614,555,9,3),(1615,556,2,1),(1616,556,4,2),(1617,556,9,3),(1618,558,2,1),(1619,558,4,2),(1620,558,9,3),(1621,557,2,1),(1622,557,4,2),(1623,557,9,3),(1624,561,2,1),(1625,561,4,2),(1626,561,9,3),(1627,562,1,1),(1628,562,3,2),(1629,562,8,3),(1630,563,1,1),(1631,563,3,2),(1632,563,8,3),(1633,564,2,1),(1634,564,3,2),(1635,564,8,3),(1636,565,2,1),(1637,565,3,2),(1638,565,8,3),(1639,566,1,1),(1640,566,3,2),(1641,566,8,3),(1642,567,1,1),(1643,567,3,2),(1644,567,8,3),(1645,568,2,1),(1646,568,3,2),(1647,568,8,3),(1648,569,1,1),(1649,569,2,1),(1650,569,3,2),(1651,569,8,3),(1652,570,1,1),(1653,570,3,2),(1654,570,8,3),(1655,571,2,1),(1656,571,4,2),(1657,571,8,3),(1658,572,1,1),(1659,572,2,1),(1660,572,3,2),(1661,572,8,3),(1662,573,2,1),(1663,573,4,2),(1664,573,8,3),(1665,574,2,1),(1666,574,4,2),(1667,574,8,3),(1668,575,1,1),(1669,575,2,1),(1670,575,3,2),(1671,575,8,3),(1672,576,2,1),(1673,576,4,2),(1674,576,8,3),(1675,577,2,1),(1676,577,3,2),(1677,577,8,3),(1678,578,2,1),(1679,578,3,2),(1680,578,8,3),(1681,579,2,1),(1682,579,3,2),(1683,579,8,3),(1684,580,1,1),(1685,580,3,2),(1686,580,8,3),(1687,582,2,1),(1688,582,3,2),(1689,582,8,3),(1690,581,1,1),(1691,581,2,1),(1692,581,3,2),(1693,581,8,3),(1694,583,1,1),(1695,583,3,2),(1696,583,8,3),(1697,584,1,1),(1698,584,2,1),(1699,584,3,2),(1700,584,8,3),(1701,585,2,1),(1702,585,3,2),(1703,585,8,3),(1704,586,2,1),(1705,586,3,2),(1706,586,8,3),(1707,587,2,1),(1708,587,3,2),(1709,587,8,3),(1710,588,1,1),(1711,588,2,1),(1712,588,3,2),(1713,588,8,3),(1714,589,2,1),(1715,589,4,2),(1716,589,8,3),(1717,590,2,1),(1718,590,4,2),(1719,590,8,3),(1720,591,2,1),(1721,591,4,2),(1722,591,8,3),(1723,592,2,1),(1724,592,4,2),(1725,592,8,3),(1726,593,1,1),(1727,593,3,2),(1728,593,8,3),(1729,594,1,1),(1730,594,2,1),(1731,594,3,2),(1732,594,8,3),(1733,595,1,1),(1734,595,3,2),(1735,595,8,3),(1736,596,2,1),(1737,596,4,2),(1738,596,8,3),(1739,597,1,1),(1740,597,3,2),(1741,597,8,3),(1742,598,1,1),(1743,598,3,2),(1744,598,8,3),(1745,599,1,1),(1746,599,3,2),(1747,599,8,3),(1748,602,1,1),(1749,602,3,2),(1750,602,8,3),(1751,603,2,1),(1752,603,4,2),(1753,603,8,3),(1754,604,2,1),(1755,604,4,2),(1756,604,8,3),(1757,605,2,1),(1758,605,4,2),(1759,605,8,3),(1760,606,2,1),(1761,606,4,2),(1762,606,8,3),(1763,608,2,1),(1764,608,4,2),(1765,608,8,3),(1766,609,2,1),(1767,609,4,2),(1768,609,8,3),(1769,607,2,1),(1770,607,4,2),(1771,607,8,3),(1772,611,2,1),(1773,611,4,2),(1774,611,8,3),(1775,612,1,1),(1776,612,3,2),(1777,612,8,3),(1778,613,1,1),(1779,613,2,1),(1780,613,3,2),(1781,613,8,3),(1782,615,1,1),(1783,615,3,2),(1784,615,8,3),(1785,614,1,1),(1786,614,2,1),(1787,614,3,2),(1788,614,8,3),(1789,619,1,1),(1790,619,3,2),(1791,619,8,3),(1792,618,1,1),(1793,618,3,2),(1794,618,8,3),(1795,617,1,1),(1796,617,2,1),(1797,617,3,2),(1798,617,8,3),(1799,621,1,1),(1800,621,3,2),(1801,621,8,3),(1802,620,1,1),(1803,620,3,2),(1804,620,8,3),(1805,622,1,1),(1806,622,2,1),(1807,622,3,2),(1808,622,8,3),(1809,624,1,1),(1810,624,3,2),(1811,624,8,3),(1812,623,1,1),(1813,623,2,1),(1814,623,3,2),(1815,623,8,3),(1816,625,1,1),(1817,625,3,2),(1818,625,8,3),(1819,628,1,1),(1820,628,2,1),(1821,628,3,2),(1822,628,8,3),(1823,626,1,1),(1824,626,2,1),(1825,626,3,2),(1826,626,8,3),(1827,627,1,1),(1828,627,2,1),(1829,627,3,2),(1830,627,8,3),(1831,629,1,1),(1832,629,3,2),(1833,629,8,3),(1834,630,1,1),(1835,630,3,2),(1836,630,8,3),(1837,631,1,1),(1838,631,3,2),(1839,631,8,3),(1840,632,1,1),(1841,632,2,1),(1842,632,3,2),(1843,632,8,3),(1844,633,1,1),(1845,633,3,2),(1846,633,8,3),(1847,634,1,1),(1848,634,2,1),(1849,634,3,2),(1850,634,8,3),(1851,635,1,1),(1852,635,3,2),(1853,635,8,3),(1854,636,1,1),(1855,636,2,1),(1856,636,3,2),(1857,636,8,3),(1858,638,1,1),(1859,638,3,2),(1860,638,8,3),(1861,639,2,1),(1862,639,4,2),(1863,639,8,3),(1864,640,1,1),(1865,640,2,1),(1866,640,3,2),(1867,640,8,3),(1868,645,1,1),(1869,645,2,1),(1870,645,3,2),(1871,645,8,3),(1872,646,1,1),(1873,646,2,1),(1874,646,3,2),(1875,646,8,3),(1876,647,2,1),(1877,647,3,2),(1878,647,8,3),(1879,649,1,1),(1880,649,2,1),(1881,649,3,2),(1882,649,8,3),(1883,650,2,1),(1884,650,3,2),(1885,650,8,3),(1886,648,1,1),(1887,648,2,1),(1888,648,3,2),(1889,648,8,3),(1890,651,2,1),(1891,651,4,2),(1892,651,8,3),(1893,652,1,1),(1894,652,2,1),(1895,652,3,2),(1896,652,8,3),(1897,653,2,1),(1898,653,4,2),(1899,653,8,3),(1900,654,2,1),(1901,654,3,2),(1902,654,8,3),(1903,655,2,1),(1904,655,4,2),(1905,655,8,3),(1906,656,1,1),(1907,656,2,1),(1908,656,3,2),(1909,656,8,3),(1910,657,1,1),(1911,657,2,1),(1912,657,3,2),(1913,657,8,3),(1914,658,1,1),(1915,658,2,1),(1916,658,3,2),(1917,658,8,3),(1918,659,1,1),(1919,659,2,1),(1920,659,3,2),(1921,659,8,3),(1922,660,1,1),(1923,660,2,1),(1924,660,3,2),(1925,660,8,3),(1926,661,1,1),(1927,661,2,1),(1928,661,3,2),(1929,661,8,3),(1930,662,1,1),(1931,662,2,1),(1932,662,3,2),(1933,662,8,3),(1934,663,1,1),(1935,663,2,1),(1936,663,3,2),(1937,663,8,3),(1938,665,1,1),(1939,665,2,1),(1940,665,3,2),(1941,665,8,3),(1942,664,1,1),(1943,664,2,1),(1944,664,3,2),(1945,664,8,3),(1946,668,2,1),(1947,668,3,2),(1948,668,8,3),(1949,666,1,1),(1950,666,2,1),(1951,666,3,2),(1952,666,8,3),(1953,667,1,1),(1954,667,2,1),(1955,667,3,2),(1956,667,8,3),(1957,670,1,1),(1958,670,2,1),(1959,670,3,2),(1960,670,8,3),(1961,669,1,1),(1962,669,2,1),(1963,669,3,2),(1964,669,8,3),(1965,679,2,1),(1966,679,4,2),(1967,679,8,3),(1968,680,2,1),(1969,680,4,2),(1970,680,8,3),(1971,681,2,1),(1972,681,4,2),(1973,681,8,3),(1974,682,2,1),(1975,682,4,2),(1976,682,8,3),(1977,685,2,1),(1978,685,3,2),(1979,685,8,3),(1980,683,2,1),(1981,683,4,2),(1982,683,8,3),(1983,686,2,1),(1984,686,4,2),(1985,686,8,3),(1986,687,2,1),(1987,687,3,2),(1988,687,8,3),(1989,689,2,1),(1990,689,4,2),(1991,689,8,3),(1992,690,2,1),(1993,690,4,2),(1994,690,9,3),(1995,691,1,1),(1996,691,3,2),(1997,691,9,3),(1998,692,1,1),(1999,692,3,2),(2000,692,8,3),(2001,693,2,1),(2002,693,4,2),(2003,693,9,3),(2004,694,1,1),(2005,694,3,2),(2006,694,9,3),(2007,695,1,1),(2008,695,3,2),(2009,695,9,3),(2010,696,2,1),(2011,696,4,2),(2012,696,9,3),(2013,697,2,1),(2014,697,4,2),(2015,697,9,3),(2016,698,2,1),(2017,698,4,2),(2018,698,9,3),(2019,699,2,1),(2020,699,4,2),(2021,699,9,3),(2022,700,2,1),(2023,700,4,2),(2024,700,8,3),(2025,701,2,1),(2026,701,4,2),(2027,701,9,3),(2028,702,2,1),(2029,702,4,2),(2030,702,9,3),(2031,703,2,1),(2032,703,4,2),(2033,703,9,3),(2034,704,1,1),(2035,704,3,2),(2036,704,8,3),(2037,705,2,1),(2038,705,4,2),(2039,705,9,3),(2040,707,2,1),(2041,707,4,2),(2042,707,9,3),(2043,708,1,1),(2044,708,3,2),(2045,708,9,3),(2046,706,1,1),(2047,706,3,2),(2048,706,9,3),(2049,709,2,1),(2050,709,4,2),(2051,709,9,3),(2052,710,2,1),(2053,710,4,2),(2054,710,9,3),(2055,711,2,1),(2056,711,4,2),(2057,711,9,3),(2058,711,8,3),(2059,712,2,1),(2060,712,4,2),(2061,712,8,3),(2062,713,2,1),(2063,713,4,2),(2064,713,9,3),(2065,713,8,3),(2066,714,2,1),(2067,714,4,2),(2068,714,9,3),(2069,716,2,1),(2070,716,4,2),(2071,716,9,3),(2072,715,2,1),(2073,715,4,2),(2074,715,9,3),(2075,717,2,1),(2076,717,1,1),(2077,717,4,2),(2078,717,9,3),(2079,718,2,1),(2080,718,4,2),(2081,718,9,3),(2082,719,2,1),(2083,719,4,2),(2084,719,9,3),(2085,720,2,1),(2086,720,4,2),(2087,720,9,3),(2088,721,1,1),(2089,721,3,2),(2090,721,9,3),(2091,722,1,1),(2092,722,3,2),(2093,722,9,3),(2094,723,2,1),(2095,723,4,2),(2096,723,9,3),(2097,724,2,1),(2098,724,4,2),(2099,724,9,3),(2100,726,1,1),(2101,726,3,2),(2102,726,9,3),(2103,725,2,1),(2104,725,4,2),(2105,725,9,3),(2106,727,1,1),(2107,727,3,2),(2108,727,9,3),(2109,728,1,1),(2110,728,3,2),(2111,728,9,3),(2112,729,1,1),(2113,729,3,2),(2114,729,9,3),(2115,730,1,1),(2116,730,3,2),(2117,730,9,3),(2118,731,1,1),(2119,731,3,2),(2120,731,9,3),(2121,732,1,1),(2122,732,3,2),(2123,732,9,3),(2124,733,1,1),(2125,733,3,2),(2126,733,9,3),(2127,734,1,1),(2128,734,3,2),(2129,734,9,3),(2130,735,2,1),(2131,735,4,2),(2132,735,9,3),(2133,736,2,1),(2134,736,4,2),(2135,736,9,3),(2136,737,2,1),(2137,737,4,2),(2138,737,9,3),(2139,738,2,1),(2140,738,4,2),(2141,738,9,3),(2142,739,1,1),(2143,739,3,2),(2144,739,9,3),(2145,741,2,1),(2146,741,4,2),(2147,741,9,3),(2148,740,1,1),(2149,740,3,2),(2150,740,9,3),(2151,742,2,1),(2152,742,4,2),(2153,742,9,3),(2154,743,1,1),(2155,743,3,2),(2156,743,9,3),(2157,744,2,1),(2158,744,4,2),(2159,744,9,3),(2160,745,2,1),(2161,745,4,2),(2162,745,9,3),(2163,746,1,1),(2164,746,3,2),(2165,746,9,3),(2166,747,2,1),(2167,747,4,2),(2168,747,9,3),(2169,748,2,1),(2170,748,4,2),(2171,748,9,3),(2172,749,1,1),(2173,749,3,2),(2174,749,9,3),(2175,750,2,1),(2176,750,4,2),(2177,750,9,3),(2178,751,1,1),(2179,751,3,2),(2180,751,9,3),(2181,752,2,1),(2182,752,4,2),(2183,752,9,3),(2184,754,2,1),(2185,754,4,2),(2186,754,9,3),(2187,753,2,1),(2188,753,4,2),(2189,753,9,3),(2190,755,2,1),(2191,755,4,2),(2192,755,9,3),(2193,757,1,1),(2194,757,3,2),(2195,757,9,3),(2196,759,1,1),(2197,759,3,2),(2198,759,9,3),(2199,756,1,1),(2200,756,3,2),(2201,756,9,3),(2202,758,1,1),(2203,758,3,2),(2204,758,9,3),(2205,760,1,1),(2206,760,3,2),(2207,760,9,3),(2208,761,1,1),(2209,761,3,2),(2210,761,9,3),(2211,763,1,1),(2212,763,3,2),(2213,763,9,3),(2214,765,1,1),(2215,765,3,2),(2216,765,9,3),(2217,762,1,1),(2218,762,3,2),(2219,762,9,3),(2220,764,1,1),(2221,764,3,2),(2222,764,9,3),(2223,766,1,1),(2224,766,3,2),(2225,766,9,3),(2226,767,1,1),(2227,767,3,2),(2228,767,9,3),(2229,768,1,1),(2230,768,3,2),(2231,768,9,3),(2232,769,1,1),(2233,769,3,2),(2234,769,9,3),(2235,771,1,1),(2236,771,2,1),(2237,771,3,2),(2238,771,9,3),(2239,772,1,1),(2240,772,3,2),(2241,772,9,3),(2242,773,2,1),(2243,773,3,2),(2244,773,9,3),(2245,774,1,1),(2246,774,3,2),(2247,774,9,3),(2248,776,1,1),(2249,776,2,1),(2250,776,3,2),(2251,776,9,3),(2252,778,2,1),(2253,778,4,2),(2254,778,8,3),(2255,782,2,1),(2256,782,4,2),(2257,782,9,3),(2258,783,2,1),(2259,783,4,2),(2260,783,9,3),(2261,784,2,1),(2262,784,4,2),(2263,784,9,3),(2264,785,2,1),(2265,785,4,2),(2266,785,9,3),(2267,787,2,1),(2268,787,4,2),(2269,787,9,3),(2270,788,2,1),(2271,788,4,2),(2272,788,9,3),(2273,789,2,1),(2274,789,4,2),(2275,789,9,3),(2276,790,2,1),(2277,790,4,2),(2278,790,9,3),(2279,791,2,1),(2280,791,4,2),(2281,791,9,3),(2282,792,2,1),(2283,792,4,2),(2284,792,9,3),(2285,793,2,1),(2286,793,4,2),(2287,793,9,3),(2288,794,2,1),(2289,794,4,2),(2290,794,9,3),(2291,795,2,1),(2292,795,4,2),(2293,795,9,3),(2294,796,2,1),(2295,796,4,2),(2296,796,9,3),(2297,797,2,1),(2298,797,4,2),(2299,797,9,3),(2300,800,2,1),(2301,800,4,2),(2302,800,9,3),(2303,799,2,1),(2304,799,4,2),(2305,799,9,3),(2306,801,2,1),(2307,801,4,2),(2308,801,9,3),(2309,802,2,1),(2310,802,4,2),(2311,802,9,3),(2312,803,2,1),(2313,803,4,2),(2314,803,9,3),(2315,805,2,1),(2316,805,4,2),(2317,805,9,3),(2318,806,2,1),(2319,806,4,2),(2320,806,9,3),(2321,809,2,1),(2322,809,4,2),(2323,809,9,3),(2324,808,2,1),(2325,808,4,2),(2326,808,9,3),(2327,810,2,1),(2328,810,4,2),(2329,810,9,3),(2330,812,2,1),(2331,812,4,2),(2332,812,9,3),(2333,811,2,1),(2334,811,4,2),(2335,811,9,3),(2336,813,2,1),(2337,813,4,2),(2338,813,9,3),(2339,817,2,1),(2340,817,4,2),(2341,817,9,3),(2342,826,1,1),(2343,826,2,1),(2344,826,3,2),(2345,826,9,3),(2346,828,2,1),(2347,828,4,2),(2348,828,8,3),(2349,827,2,1),(2350,827,4,2),(2351,827,9,3),(2352,829,2,1),(2353,829,4,2),(2354,829,9,3),(2355,830,2,1),(2356,830,4,2),(2357,830,8,3),(2358,831,2,1),(2359,831,4,2),(2360,831,8,3),(2361,832,2,1),(2362,832,4,2),(2363,832,9,3),(2364,833,2,1),(2365,833,4,2),(2366,833,9,3),(2367,834,2,1),(2368,834,4,2),(2369,834,9,3),(2370,835,1,1),(2371,835,3,2),(2372,835,9,3),(2373,836,1,1),(2374,836,3,2),(2375,836,9,3),(2376,837,1,1),(2377,837,3,2),(2378,837,9,3),(2379,838,2,1),(2380,838,4,2),(2381,838,9,3),(2382,839,1,1),(2383,839,3,2),(2384,839,9,3),(2385,841,2,1),(2386,841,4,2),(2387,841,9,3),(2388,840,2,1),(2389,840,4,2),(2390,840,9,3),(2391,842,2,1),(2392,842,4,2),(2393,842,9,3),(2394,843,2,1),(2395,843,4,2),(2396,843,9,3),(2397,844,2,1),(2398,844,4,2),(2399,844,8,3),(2400,845,2,1),(2401,845,4,2),(2402,845,9,3),(2403,847,1,1),(2404,847,2,1),(2405,847,3,2),(2406,847,9,3),(2407,846,2,1),(2408,846,4,2),(2409,846,9,3),(2410,848,2,1),(2411,848,4,2),(2412,848,9,3),(2413,853,2,1),(2414,853,4,2),(2415,853,8,3),(2416,854,2,1),(2417,854,4,2),(2418,854,8,3),(2419,855,2,1),(2420,855,4,2),(2421,855,9,3),(2422,856,1,1),(2423,856,2,1),(2424,856,4,2),(2425,856,9,3),(2426,857,1,1),(2427,857,3,2),(2428,857,9,3),(2429,858,1,1),(2430,858,2,1),(2431,858,3,2),(2432,858,9,3),(2433,859,1,1),(2434,859,3,2),(2435,859,9,3),(2436,860,1,1),(2437,860,2,1),(2438,860,3,2),(2439,860,9,3),(2440,861,2,1),(2441,861,4,2),(2442,861,9,3),(2443,862,1,1),(2444,862,2,1),(2445,862,3,2),(2446,862,9,3),(2447,864,1,1),(2448,864,2,1),(2449,864,3,2),(2450,864,9,3),(2451,863,1,1),(2452,863,2,1),(2453,863,3,2),(2454,863,9,3),(2455,865,1,1),(2456,865,2,1),(2457,865,3,2),(2458,865,9,3),(2459,866,1,1),(2460,866,2,1),(2461,866,3,2),(2462,866,9,3),(2463,867,1,1),(2464,867,2,1),(2465,867,3,2),(2466,867,9,3),(2467,868,1,1),(2468,868,3,2),(2469,868,9,3),(2470,869,1,1),(2471,869,2,1),(2472,869,3,2),(2473,869,9,3),(2474,872,1,1),(2475,872,3,2),(2476,872,9,3),(2477,870,1,1),(2478,870,3,2),(2479,870,9,3),(2480,871,1,1),(2481,871,3,2),(2482,871,9,3),(2483,874,1,1),(2484,874,3,2),(2485,874,9,3),(2486,873,1,1),(2487,873,3,2),(2488,873,9,3),(2489,876,2,1),(2490,876,4,2),(2491,876,9,3),(2492,877,2,1),(2493,877,4,2),(2494,877,9,3),(2495,878,1,1),(2496,878,2,1),(2497,878,3,2),(2498,878,9,3),(2499,879,1,1),(2500,879,3,2),(2501,879,9,3),(2502,880,1,1),(2503,880,3,2),(2504,880,9,3),(2505,881,1,1),(2506,881,2,1),(2507,881,3,2),(2508,881,9,3),(2509,884,1,1),(2510,884,2,1),(2511,884,4,2),(2512,884,9,3),(2513,885,1,1),(2514,885,3,2),(2515,885,9,3),(2516,886,1,1),(2517,886,2,1),(2518,886,3,2),(2519,886,9,3),(2520,888,2,1),(2521,888,4,2),(2522,888,9,3),(2523,889,1,1),(2524,889,2,1),(2525,889,3,2),(2526,889,9,3),(2527,890,2,1),(2528,890,4,2),(2529,890,9,3),(2530,891,2,1),(2531,891,4,2),(2532,891,9,3),(2533,892,2,1),(2534,892,4,2),(2535,892,9,3),(2536,893,2,1),(2537,893,4,2),(2538,893,9,3),(2539,895,2,1),(2540,895,4,2),(2541,895,9,3),(2542,896,2,1),(2543,896,4,2),(2544,896,9,3),(2545,897,2,1),(2546,897,4,2),(2547,897,9,3),(2548,898,1,1),(2549,898,2,1),(2550,898,3,2),(2551,898,9,3),(2552,899,2,1),(2553,899,4,2),(2554,899,9,3),(2555,900,1,1),(2556,900,2,1),(2557,900,3,2),(2558,900,9,3),(2559,901,2,1),(2560,901,4,2),(2561,901,9,3),(2562,902,2,1),(2563,902,4,2),(2564,902,9,3),(2565,903,2,1),(2566,903,4,2),(2567,903,9,3),(2568,904,1,1),(2569,904,2,1),(2570,904,3,2),(2571,904,9,3),(2572,905,1,1),(2573,905,2,1),(2574,905,3,2),(2575,905,9,3),(2576,907,2,1),(2577,907,4,2),(2578,907,8,3),(2579,913,1,1),(2580,913,2,1),(2581,913,3,2),(2582,913,9,3),(2583,915,2,1),(2584,915,4,2),(2585,915,8,3),(2586,919,2,1),(2587,919,4,2),(2588,919,9,3),(2589,926,2,1),(2590,926,4,2),(2591,926,9,3),(2592,929,2,1),(2593,929,4,2),(2594,929,9,3),(2595,930,2,1),(2596,930,4,2),(2597,930,8,3),(2598,931,2,1),(2599,931,3,2),(2600,931,8,3),(2601,932,2,1),(2602,932,3,2),(2603,932,8,3),(2604,933,2,1),(2605,933,3,2),(2606,933,8,3),(2607,935,2,1),(2608,935,3,2),(2609,935,8,3),(2610,934,2,1),(2611,934,3,2),(2612,934,8,3),(2613,936,1,1),(2614,936,3,2),(2615,936,8,3),(2616,937,2,1),(2617,937,3,2),(2618,937,8,3),(2619,938,2,1),(2620,938,3,2),(2621,938,8,3),(2622,939,1,1),(2623,939,3,2),(2624,939,8,3),(2625,940,1,1),(2626,940,3,2),(2627,940,8,3),(2628,941,1,1),(2629,941,3,2),(2630,941,8,3),(2631,942,2,1),(2632,942,3,2),(2633,942,8,3),(2634,943,1,1),(2635,943,2,1),(2636,943,3,2),(2637,943,8,3),(2638,944,1,1),(2639,944,2,1),(2640,944,3,2),(2641,944,8,3),(2642,945,1,1),(2643,945,3,2),(2644,945,8,3),(2645,946,1,1),(2646,946,2,1),(2647,946,3,2),(2648,946,8,3),(2649,947,1,1),(2650,947,2,1),(2651,947,3,2),(2652,947,8,3),(2653,948,2,1),(2654,948,3,2),(2655,948,8,3),(2656,949,2,1),(2657,949,3,2),(2658,949,8,3),(2659,950,2,1),(2660,950,3,2),(2661,950,8,3),(2662,952,1,1),(2663,952,2,1),(2664,952,3,2),(2665,952,8,3),(2666,954,2,1),(2667,954,4,2),(2668,954,9,3),(2669,956,2,1),(2670,956,3,2),(2671,956,8,3),(2672,957,2,1),(2673,957,3,2),(2674,957,8,3),(2675,955,2,1),(2676,955,3,2),(2677,955,8,3),(2678,958,2,1),(2679,958,3,2),(2680,958,8,3),(2681,959,1,1),(2682,959,3,2),(2683,959,8,3),(2684,960,2,1),(2685,960,3,2),(2686,960,8,3),(2687,961,2,1),(2688,961,4,2),(2689,961,8,3),(2690,962,1,1),(2691,962,2,1),(2692,962,3,2),(2693,962,8,3),(2694,963,2,1),(2695,963,3,2),(2696,963,8,3),(2697,965,1,1),(2698,965,2,1),(2699,965,3,2),(2700,965,8,3),(2701,966,2,1),(2702,966,4,2),(2703,966,8,3),(2704,967,2,1),(2705,967,4,2),(2706,967,9,3),(2707,968,1,1),(2708,968,2,1),(2709,968,3,2),(2710,968,8,3),(2711,969,1,1),(2712,969,2,1),(2713,969,3,2),(2714,969,8,3),(2715,970,2,1),(2716,970,4,2),(2717,970,9,3),(2718,971,2,1),(2719,971,3,2),(2720,971,8,3),(2721,972,2,1),(2722,972,3,2),(2723,972,8,3),(2724,975,2,1),(2725,975,3,2),(2726,975,8,3),(2727,974,2,1),(2728,974,3,2),(2729,974,8,3),(2730,973,2,1),(2731,973,3,2),(2732,973,8,3),(2733,976,1,1),(2734,976,2,1),(2735,976,3,2),(2736,976,8,3),(2737,977,2,1),(2738,977,3,2),(2739,977,8,3),(2740,978,2,1),(2741,978,3,2),(2742,978,8,3),(2743,979,2,1),(2744,979,3,2),(2745,979,8,3),(2746,981,2,1),(2747,981,3,2),(2748,981,8,3),(2749,982,2,1),(2750,982,3,2),(2751,982,8,3),(2752,985,1,1),(2753,985,2,1),(2754,985,3,2),(2755,985,8,3),(2756,984,1,1),(2757,984,2,1),(2758,984,3,2),(2759,984,8,3),(2760,987,2,1),(2761,987,4,2),(2762,987,9,3),(2763,986,1,1),(2764,986,3,2),(2765,986,8,3),(2766,988,2,1),(2767,988,3,2),(2768,988,8,3),(2769,989,2,1),(2770,989,3,2),(2771,989,8,3),(2772,990,1,1),(2773,990,3,2),(2774,990,8,3),(2775,991,1,1),(2776,991,2,1),(2777,991,3,2),(2778,991,8,3),(2779,993,1,1),(2780,993,3,2),(2781,993,8,3),(2782,992,2,1),(2783,992,3,2),(2784,992,8,3),(2785,995,2,1),(2786,995,3,2),(2787,995,8,3),(2788,996,1,1),(2789,996,3,2),(2790,996,8,3),(2791,994,2,1),(2792,994,4,2),(2793,994,8,3),(2794,997,2,1),(2795,997,3,2),(2796,997,8,3),(2797,998,2,1),(2798,998,3,2),(2799,998,8,3),(2800,999,2,1),(2801,999,3,2),(2802,999,8,3),(2803,1000,2,1),(2804,1000,3,2),(2805,1000,8,3),(2806,1001,2,1),(2807,1001,3,2),(2808,1001,8,3),(2809,1002,2,1),(2810,1002,3,2),(2811,1002,8,3),(2812,1003,2,1),(2813,1003,4,2),(2814,1003,8,3),(2815,1005,2,1),(2816,1005,3,2),(2817,1005,8,3),(2818,1004,1,1),(2819,1004,3,2),(2820,1004,8,3),(2821,1007,2,1),(2822,1007,3,2),(2823,1007,8,3),(2824,1008,1,1),(2825,1008,3,2),(2826,1008,8,3),(2827,1009,2,1),(2828,1009,4,2),(2829,1009,8,3),(2830,1010,1,1),(2831,1010,2,1),(2832,1010,3,2),(2833,1010,8,3),(2834,1011,2,1),(2835,1011,4,2),(2836,1011,8,3),(2837,1012,1,1),(2838,1012,3,2),(2839,1012,8,3),(2840,1014,2,1),(2841,1014,4,2),(2842,1014,8,3),(2843,1015,2,1),(2844,1015,4,2),(2845,1015,8,3),(2846,1013,1,1),(2847,1013,3,2),(2848,1013,8,3),(2849,1016,2,1),(2850,1016,4,2),(2851,1016,8,3),(2852,1017,1,1),(2853,1017,2,1),(2854,1017,3,2),(2855,1017,8,3),(2856,1018,2,1),(2857,1018,4,2),(2858,1018,8,3),(2859,1019,2,1),(2860,1019,4,2),(2861,1019,8,3),(2862,1020,2,1),(2863,1020,3,2),(2864,1020,8,3),(2865,1021,2,1),(2866,1021,3,2),(2867,1021,8,3),(2868,1022,1,1),(2869,1022,3,2),(2870,1022,8,3),(2871,1024,2,1),(2872,1024,3,2),(2873,1024,8,3),(2874,1023,1,1),(2875,1023,3,2),(2876,1023,8,3),(2877,1027,1,1),(2878,1027,2,1),(2879,1027,3,2),(2880,1027,8,3),(2881,1025,2,1),(2882,1025,3,2),(2883,1025,8,3),(2884,1026,1,1),(2885,1026,2,1),(2886,1026,3,2),(2887,1026,8,3),(2888,1028,2,1),(2889,1028,3,2),(2890,1028,8,3),(2891,1029,2,1),(2892,1029,3,2),(2893,1029,8,3),(2894,1030,2,1),(2895,1030,3,2),(2896,1030,8,3),(2897,1031,1,1),(2898,1031,3,2),(2899,1031,8,3),(2900,1032,2,1),(2901,1032,3,2),(2902,1032,8,3),(2903,1033,1,1),(2904,1033,2,1),(2905,1033,3,2),(2906,1033,8,3),(2907,1035,1,1),(2908,1035,3,2),(2909,1035,8,3),(2910,1036,2,1),(2911,1036,3,2),(2912,1036,8,3),(2913,1034,1,1),(2914,1034,2,1),(2915,1034,3,2),(2916,1034,8,3),(2917,1038,2,1),(2918,1038,3,2),(2919,1038,8,3),(2920,1037,1,1),(2921,1037,3,2),(2922,1037,8,3),(2923,1039,2,1),(2924,1039,3,2),(2925,1039,8,3),(2926,1040,1,1),(2927,1040,3,2),(2928,1040,8,3),(2929,1041,1,1),(2930,1041,3,2),(2931,1041,8,3),(2932,1042,2,1),(2933,1042,3,2),(2934,1042,8,3),(2935,1043,2,1),(2936,1043,3,2),(2937,1043,8,3),(2938,1045,2,1),(2939,1045,3,2),(2940,1045,8,3),(2941,1044,1,1),(2942,1044,2,1),(2943,1044,3,2),(2944,1044,8,3),(2945,1046,1,1),(2946,1046,3,2),(2947,1046,8,3),(2948,1048,2,1),(2949,1048,3,2),(2950,1048,8,3),(2951,1050,2,1),(2952,1050,3,2),(2953,1050,8,3),(2954,1051,2,1),(2955,1051,4,2),(2956,1051,9,3),(2957,1053,2,1),(2958,1053,3,2),(2959,1053,8,3),(2960,1055,2,1),(2961,1055,3,2),(2962,1055,8,3),(2963,1054,2,1),(2964,1054,3,2),(2965,1054,8,3),(2966,1056,2,1),(2967,1056,3,2),(2968,1056,8,3),(2969,1057,1,1),(2970,1057,3,2),(2971,1057,8,3),(2972,1058,2,1),(2973,1058,3,2),(2974,1058,8,3),(2975,1059,2,1),(2976,1059,3,2),(2977,1059,8,3),(2978,1060,2,1),(2979,1060,3,2),(2980,1060,8,3),(2981,1061,1,1),(2982,1061,2,1),(2983,1061,3,2),(2984,1061,8,3),(2985,1063,1,1),(2986,1063,3,2),(2987,1063,8,3),(2988,1064,2,1),(2989,1064,4,2),(2990,1064,8,3),(2991,1062,2,1),(2992,1062,4,2),(2993,1062,8,3),(2994,1065,1,1),(2995,1065,2,1),(2996,1065,3,2),(2997,1065,8,3),(2998,1066,2,1),(2999,1066,4,2),(3000,1066,8,3),(3001,1067,1,1),(3002,1067,2,1),(3003,1067,3,2),(3004,1067,8,3),(3005,1068,1,1),(3006,1068,2,1),(3007,1068,3,2),(3008,1068,8,3),(3009,1069,2,1),(3010,1069,4,2),(3011,1069,8,3),(3012,1071,1,1),(3013,1071,2,1),(3014,1071,3,2),(3015,1071,8,3),(3016,1070,1,1),(3017,1070,2,1),(3018,1070,3,2),(3019,1070,8,3),(3020,1072,2,1),(3021,1072,4,2),(3022,1072,9,3),(3023,1073,1,1),(3024,1073,2,1),(3025,1073,3,2),(3026,1073,8,3),(3027,1074,1,1),(3028,1074,2,1),(3029,1074,3,2),(3030,1074,8,3),(3031,1075,1,1),(3032,1075,3,2),(3033,1075,8,3),(3034,1076,1,1),(3035,1076,2,1),(3036,1076,3,2),(3037,1076,8,3),(3038,1077,1,1),(3039,1077,2,1),(3040,1077,3,2),(3041,1077,8,3),(3042,1078,1,1),(3043,1078,2,1),(3044,1078,3,2),(3045,1078,8,3),(3046,1079,1,1),(3047,1079,2,1),(3048,1079,3,2),(3049,1079,8,3),(3050,1080,2,1),(3051,1080,3,2),(3052,1080,8,3),(3053,1081,1,1),(3054,1081,2,1),(3055,1081,3,2),(3056,1081,8,3),(3057,1082,1,1),(3058,1082,2,1),(3059,1082,3,2),(3060,1082,8,3),(3061,1083,2,1),(3062,1083,4,2),(3063,1083,8,3),(3064,1084,2,1),(3065,1084,3,2),(3066,1084,8,3),(3067,1087,1,1),(3068,1087,2,1),(3069,1087,3,2),(3070,1087,8,3),(3071,1088,1,1),(3072,1088,2,1),(3073,1088,3,2),(3074,1088,8,3),(3075,1094,1,1),(3076,1094,2,1),(3077,1094,3,2),(3078,1094,8,3),(3079,1104,2,1),(3080,1104,4,2),(3081,1104,8,3),(3082,1105,2,1),(3083,1105,4,2),(3084,1105,9,3),(3085,1106,2,1),(3086,1106,4,2),(3087,1106,8,3),(3088,1107,2,1),(3089,1107,4,2),(3090,1107,8,3),(3091,1108,2,1),(3092,1108,4,2),(3093,1108,9,3),(3094,1109,2,1),(3095,1109,4,2),(3096,1109,8,3),(3097,1110,2,1),(3098,1110,4,2),(3099,1110,8,3),(3100,1111,2,1),(3101,1111,4,2),(3102,1111,8,3),(3103,1113,2,1),(3104,1113,4,2),(3105,1113,8,3),(3106,1114,2,1),(3107,1114,4,2),(3108,1114,8,3),(3109,1115,2,1),(3110,1115,4,2),(3111,1115,8,3),(3112,1117,2,1),(3113,1117,4,2),(3114,1117,8,3),(3115,1123,2,1),(3116,1123,4,2),(3117,1123,8,3),(3118,1136,2,1),(3119,1136,4,2),(3120,1136,9,3),(3121,1137,2,1),(3122,1137,4,2),(3123,1137,9,3),(3124,1138,2,1),(3125,1138,4,2),(3126,1138,9,3),(3127,1139,2,1),(3128,1139,4,2),(3129,1139,9,3),(3130,1140,2,1),(3131,1140,4,2),(3132,1140,9,3),(3133,1141,2,1),(3134,1141,4,2),(3135,1141,9,3),(3136,1142,2,1),(3137,1142,4,2),(3138,1142,9,3),(3139,1143,2,1),(3140,1143,4,2),(3141,1143,9,3),(3142,1144,1,1),(3143,1144,2,1),(3144,1144,4,2),(3145,1144,9,3),(3146,1145,2,1),(3147,1145,4,2),(3148,1145,9,3),(3149,1146,2,1),(3150,1146,4,2),(3151,1146,9,3),(3152,1147,2,1),(3153,1147,4,2),(3154,1147,9,3),(3155,1148,2,1),(3156,1148,4,2),(3157,1148,9,3),(3158,1149,2,1),(3159,1149,4,2),(3160,1149,9,3),(3161,1151,2,1),(3162,1151,4,2),(3163,1151,9,3),(3164,1150,2,1),(3165,1150,4,2),(3166,1150,9,3),(3167,1152,2,1),(3168,1152,4,2),(3169,1152,9,3),(3170,1153,2,1),(3171,1153,4,2),(3172,1153,9,3),(3173,1154,2,1),(3174,1154,4,2),(3175,1154,9,3),(3176,1155,2,1),(3177,1155,4,2),(3178,1155,9,3),(3179,1156,1,1),(3180,1156,2,1),(3181,1156,4,2),(3182,1156,9,3),(3183,1157,2,1),(3184,1157,4,2),(3185,1157,9,3),(3186,1158,2,1),(3187,1158,4,2),(3188,1158,9,3),(3189,1160,2,1),(3190,1160,4,2),(3191,1160,9,3),(3192,1159,2,1),(3193,1159,4,2),(3194,1159,9,3),(3195,1161,2,1),(3196,1161,4,2),(3197,1161,9,3),(3198,1162,2,1),(3199,1162,4,2),(3200,1162,9,3),(3201,1163,2,1),(3202,1163,4,2),(3203,1163,9,3),(3204,1164,2,1),(3205,1164,4,2),(3206,1164,9,3),(3207,1165,2,1),(3208,1165,4,2),(3209,1165,9,3),(3210,1166,2,1),(3211,1166,4,2),(3212,1166,9,3),(3213,1167,2,1),(3214,1167,4,2),(3215,1167,9,3),(3216,1168,2,1),(3217,1168,4,2),(3218,1168,9,3),(3219,1169,2,1),(3220,1169,4,2),(3221,1169,9,3),(3222,1170,2,1),(3223,1170,4,2),(3224,1170,9,3),(3225,1171,2,1),(3226,1171,4,2),(3227,1171,9,3),(3228,1172,2,1),(3229,1172,4,2),(3230,1172,9,3),(3231,1173,2,1),(3232,1173,4,2),(3233,1173,9,3),(3234,1174,2,1),(3235,1174,4,2),(3236,1174,9,3),(3237,1175,2,1),(3238,1175,4,2),(3239,1175,9,3),(3240,1176,2,1),(3241,1176,4,2),(3242,1176,9,3),(3243,1177,2,1),(3244,1177,4,2),(3245,1177,9,3),(3246,1178,2,1),(3247,1178,4,2),(3248,1178,9,3),(3249,1179,2,1),(3250,1179,4,2),(3251,1179,9,3),(3252,1184,2,1),(3253,1184,3,2),(3254,1184,9,3),(3255,1186,2,1),(3256,1186,4,2),(3257,1186,9,3),(3258,1194,2,1),(3259,1194,4,2),(3260,1194,9,3),(3261,1201,2,1),(3262,1201,4,2),(3263,1201,9,3),(3264,1211,2,1),(3265,1211,3,2),(3266,1211,8,3),(3267,1217,1,1),(3268,1217,3,2),(3269,1217,8,3),(3270,1237,1,1),(3271,1237,2,1),(3272,1237,3,2),(3273,1237,8,3),(3274,1239,2,1),(3275,1239,4,2),(3276,1239,8,3),(3277,1243,2,1),(3278,1243,3,2),(3279,1243,8,3),(3280,1249,2,1),(3281,1249,4,2),(3282,1249,8,3),(3283,1254,2,1),(3284,1254,4,2),(3285,1254,8,3),(3286,1262,2,1),(3287,1262,3,2),(3288,1262,8,3),(3289,1271,1,1),(3290,1271,3,2),(3291,1271,8,3),(3292,1279,2,1),(3293,1279,4,2),(3294,1279,8,3),(3295,1281,2,1),(3296,1281,4,2),(3297,1281,8,3),(3298,1285,2,1),(3299,1285,4,2),(3300,1285,8,3),(3301,1286,1,1),(3302,1286,2,1),(3303,1286,3,2),(3304,1286,8,3),(3305,1289,1,1),(3306,1289,2,1),(3307,1289,3,2),(3308,1289,8,3),(3309,1309,2,1),(3310,1309,3,2),(3311,1309,8,3),(3312,1317,2,1),(3313,1317,4,2),(3314,1317,8,3),(3315,1323,2,1),(3316,1323,4,2),(3317,1323,8,3),(3318,1324,2,1),(3319,1324,4,2),(3320,1324,8,3),(3321,1329,2,1),(3322,1329,4,2),(3323,1329,8,3),(3324,1332,2,1),(3325,1332,3,2),(3326,1332,8,3),(3327,1476,1,1),(3328,1476,2,1),(3329,1476,4,2),(3330,1476,9,3),(3331,1478,2,1),(3332,1478,4,2),(3333,1478,9,3),(3334,1479,1,1),(3335,1479,2,1),(3336,1479,4,2),(3337,1479,9,3),(3338,1480,1,1),(3339,1480,2,1),(3340,1480,4,2),(3341,1480,9,3),(3342,1481,1,1),(3343,1481,2,1),(3344,1481,4,2),(3345,1481,9,3),(3346,1483,1,1),(3347,1483,4,2),(3348,1483,9,3),(3349,1485,2,1),(3350,1485,4,2),(3351,1485,9,3),(3352,1486,1,1),(3353,1486,2,1),(3354,1486,4,2),(3355,1486,9,3),(3356,1487,1,1),(3357,1487,4,2),(3358,1487,9,3),(3359,1489,1,1),(3360,1489,2,1),(3361,1489,3,2),(3362,1489,9,3),(3363,1491,1,1),(3364,1491,4,2),(3365,1491,9,3),(3366,1492,1,1),(3367,1492,2,1),(3368,1492,3,2),(3369,1492,9,3),(3370,1493,1,1),(3371,1493,2,1),(3372,1493,4,2),(3373,1493,9,3),(3374,1494,1,1),(3375,1494,4,2),(3376,1494,9,3),(3377,1495,2,1),(3378,1495,4,2),(3379,1495,9,3),(3380,1496,1,1),(3381,1496,4,2),(3382,1496,9,3),(3383,1497,1,1),(3384,1497,4,2),(3385,1497,9,3),(3386,1499,1,1),(3387,1499,2,1),(3388,1499,4,2),(3389,1499,9,3),(3390,1502,1,1),(3391,1502,2,1),(3392,1502,4,2),(3393,1502,9,3),(3394,1503,1,1),(3395,1503,4,2),(3396,1503,9,3),(3397,1500,1,1),(3398,1500,4,2),(3399,1500,9,3),(3400,1504,1,1),(3401,1504,4,2),(3402,1504,9,3),(3403,1505,1,1),(3404,1505,2,1),(3405,1505,4,2),(3406,1505,9,3),(3407,1501,1,1),(3408,1501,2,1),(3409,1501,4,2),(3410,1501,9,3),(3411,1506,1,1),(3412,1506,2,1),(3413,1506,4,2),(3414,1506,9,3),(3415,1507,1,1),(3416,1507,2,1),(3417,1507,4,2),(3418,1507,9,3),(3419,1508,1,1),(3420,1508,2,1),(3421,1508,4,2),(3422,1508,9,3),(3423,1509,1,1),(3424,1509,4,2),(3425,1509,9,3),(3426,1511,1,1),(3427,1511,2,1),(3428,1511,4,2),(3429,1511,9,3),(3430,1510,1,1),(3431,1510,2,1),(3432,1510,4,2),(3433,1510,9,3),(3434,1512,1,1),(3435,1512,2,1),(3436,1512,4,2),(3437,1512,9,3),(3438,1514,2,1),(3439,1514,4,2),(3440,1514,9,3),(3441,1516,2,1),(3442,1516,4,2),(3443,1516,9,3),(3444,1518,2,1),(3445,1518,4,2),(3446,1518,9,3),(3447,1519,1,1),(3448,1519,4,2),(3449,1519,9,3),(3450,1520,1,1),(3451,1520,2,1),(3452,1520,3,2),(3453,1520,9,3),(3454,1521,1,1),(3455,1521,2,1),(3456,1521,4,2),(3457,1521,9,3),(3458,1522,1,1),(3459,1522,2,1),(3460,1522,4,2),(3461,1522,9,3),(3462,1523,1,1),(3463,1523,2,1),(3464,1523,4,2),(3465,1523,9,3),(3466,1524,1,1),(3467,1524,2,1),(3468,1524,4,2),(3469,1524,9,3),(3470,1525,1,1),(3471,1525,4,2),(3472,1525,9,3),(3473,1528,1,1),(3474,1528,4,2),(3475,1528,9,3),(3476,1527,1,1),(3477,1527,4,2),(3478,1527,9,3),(3479,1526,1,1),(3480,1526,2,1),(3481,1526,4,2),(3482,1526,9,3),(3483,1530,1,1),(3484,1530,2,1),(3485,1530,4,2),(3486,1530,9,3),(3487,1531,1,1),(3488,1531,2,1),(3489,1531,4,2),(3490,1531,9,3),(3491,1532,1,1),(3492,1532,2,1),(3493,1532,4,2),(3494,1532,9,3),(3495,1536,1,1),(3496,1536,2,1),(3497,1536,4,2),(3498,1536,9,3),(3499,1537,1,1),(3500,1537,2,1),(3501,1537,4,2),(3502,1537,9,3),(3503,1553,2,1),(3504,1553,4,2),(3505,1553,9,3),(3506,1554,2,1),(3507,1554,4,2),(3508,1554,9,3),(3509,1558,2,1),(3510,1558,4,2),(3511,1558,9,3),(3512,1556,2,1),(3513,1556,4,2),(3514,1556,9,3),(3515,1560,2,1),(3516,1560,4,2),(3517,1560,9,3),(3518,1559,2,1),(3519,1559,4,2),(3520,1559,9,3),(3521,1557,2,1),(3522,1557,4,2),(3523,1557,9,3),(3524,1585,1,1),(3525,1585,4,2),(3526,1585,8,3),(3527,1586,1,1),(3528,1586,4,2),(3529,1586,8,3),(3530,1587,1,1),(3531,1587,4,2),(3532,1587,8,3),(3533,1588,1,1),(3534,1588,2,1),(3535,1588,4,2),(3536,1588,8,3),(3537,1589,1,1),(3538,1589,2,1),(3539,1589,4,2),(3540,1589,8,3),(3541,1590,1,1),(3542,1590,2,1),(3543,1590,4,2),(3544,1590,8,3),(3545,1591,1,1),(3546,1591,4,2),(3547,1591,8,3),(3548,1592,1,1),(3549,1592,4,2),(3550,1592,8,3),(3551,1593,1,1),(3552,1593,4,2),(3553,1593,8,3),(3554,1594,1,1),(3555,1594,4,2),(3556,1594,8,3),(3557,1595,1,1),(3558,1595,4,2),(3559,1595,8,3),(3560,1596,1,1),(3561,1596,4,2),(3562,1596,8,3),(3563,1597,1,1),(3564,1597,4,2),(3565,1597,8,3),(3566,1598,1,1),(3567,1598,4,2),(3568,1598,8,3),(3569,1599,1,1),(3570,1599,4,2),(3571,1599,8,3),(3572,1600,1,1),(3573,1600,4,2),(3574,1600,8,3),(3575,1601,1,1),(3576,1601,4,2),(3577,1601,8,3),(3578,1603,1,1),(3579,1603,4,2),(3580,1603,8,3),(3581,1602,1,1),(3582,1602,2,1),(3583,1602,4,2),(3584,1602,8,3),(3585,1604,1,1),(3586,1604,4,2),(3587,1604,8,3),(3588,1605,1,1),(3589,1605,4,2),(3590,1605,8,3),(3591,1606,1,1),(3592,1606,4,2),(3593,1606,8,3),(3594,1607,1,1),(3595,1607,2,1),(3596,1607,4,2),(3597,1607,8,3),(3598,1608,1,1),(3599,1608,4,2),(3600,1608,8,3),(3601,1609,1,1),(3602,1609,4,2),(3603,1609,8,3),(3604,1610,1,1),(3605,1610,4,2),(3606,1610,8,3),(3607,1611,1,1),(3608,1611,4,2),(3609,1611,8,3),(3610,1612,1,1),(3611,1612,4,2),(3612,1612,8,3),(3613,1613,1,1),(3614,1613,4,2),(3615,1613,8,3),(3616,1614,1,1),(3617,1614,4,2),(3618,1614,8,3),(3619,1615,1,1),(3620,1615,4,2),(3621,1615,8,3),(3622,1616,1,1),(3623,1616,4,2),(3624,1616,8,3),(3625,1617,1,1),(3626,1617,4,2),(3627,1617,8,3),(3628,1618,1,1),(3629,1618,4,2),(3630,1618,8,3),(3631,1619,1,1),(3632,1619,4,2),(3633,1619,8,3),(3634,1620,1,1),(3635,1620,4,2),(3636,1620,8,3),(3637,1621,1,1),(3638,1621,2,1),(3639,1621,4,2),(3640,1621,8,3),(3641,1623,1,1),(3642,1623,4,2),(3643,1623,8,3),(3644,1622,1,1),(3645,1622,4,2),(3646,1622,8,3),(3647,1624,1,1),(3648,1624,4,2),(3649,1624,8,3),(3650,1625,1,1),(3651,1625,2,1),(3652,1625,4,2),(3653,1625,8,3),(3654,1628,1,1),(3655,1628,2,1),(3656,1628,4,2),(3657,1628,8,3),(3658,1629,1,1),(3659,1629,2,1),(3660,1629,4,2),(3661,1629,8,3),(3662,1631,1,1),(3663,1631,2,1),(3664,1631,4,2),(3665,1631,8,3),(3666,1636,2,1),(3667,1636,4,2),(3668,1636,8,3),(3669,1637,2,1),(3670,1637,4,2),(3671,1637,8,3),(3672,1638,2,1),(3673,1638,4,2),(3674,1638,8,3),(3675,1641,2,1),(3676,1641,4,2),(3677,1641,8,3),(3678,1642,2,1),(3679,1642,4,2),(3680,1642,8,3),(3681,1643,2,1),(3682,1643,4,2),(3683,1643,8,3),(3684,1646,2,1),(3685,1646,4,2),(3686,1646,8,3),(3687,1652,2,1),(3688,1652,4,2),(3689,1652,9,3),(3690,1653,1,1),(3691,1653,2,1),(3692,1653,4,2),(3693,1653,9,3),(3694,1654,2,1),(3695,1654,4,2),(3696,1654,9,3),(3697,1656,1,1),(3698,1656,2,1),(3699,1656,4,2),(3700,1656,9,3),(3701,1655,1,1),(3702,1655,2,1),(3703,1655,4,2),(3704,1655,9,3),(3705,1657,1,1),(3706,1657,2,1),(3707,1657,4,2),(3708,1657,9,3),(3709,1658,1,1),(3710,1658,2,1),(3711,1658,4,2),(3712,1658,9,3),(3713,1659,1,1),(3714,1659,2,1),(3715,1659,4,2),(3716,1659,9,3),(3717,1660,1,1),(3718,1660,2,1),(3719,1660,4,2),(3720,1660,9,3),(3721,1661,1,1),(3722,1661,2,1),(3723,1661,4,2),(3724,1661,9,3),(3725,1662,1,1),(3726,1662,2,1),(3727,1662,4,2),(3728,1662,9,3),(3729,1663,1,1),(3730,1663,2,1),(3731,1663,4,2),(3732,1663,9,3),(3733,1664,1,1),(3734,1664,2,1),(3735,1664,4,2),(3736,1664,9,3),(3737,1665,2,1),(3738,1665,4,2),(3739,1665,9,3),(3740,1666,1,1),(3741,1666,2,1),(3742,1666,4,2),(3743,1666,9,3),(3744,1667,2,1),(3745,1667,4,2),(3746,1667,9,3),(3747,1668,1,1),(3748,1668,2,1),(3749,1668,4,2),(3750,1668,9,3),(3751,1669,2,1),(3752,1669,4,2),(3753,1669,9,3),(3754,1671,1,1),(3755,1671,2,1),(3756,1671,4,2),(3757,1671,9,3),(3758,1672,1,1),(3759,1672,2,1),(3760,1672,4,2),(3761,1672,9,3),(3762,1670,1,1),(3763,1670,2,1),(3764,1670,4,2),(3765,1670,9,3),(3766,1673,1,1),(3767,1673,2,1),(3768,1673,4,2),(3769,1673,9,3),(3770,1674,1,1),(3771,1674,2,1),(3772,1674,4,2),(3773,1674,9,3),(3774,1675,1,1),(3775,1675,2,1),(3776,1675,4,2),(3777,1675,9,3),(3778,1676,1,1),(3779,1676,2,1),(3780,1676,4,2),(3781,1676,9,3),(3782,1677,1,1),(3783,1677,2,1),(3784,1677,4,2),(3785,1677,9,3),(3786,1680,1,1),(3787,1680,2,1),(3788,1680,4,2),(3789,1680,9,3),(3790,1678,1,1),(3791,1678,2,1),(3792,1678,4,2),(3793,1678,9,3),(3794,1679,1,1),(3795,1679,2,1),(3796,1679,4,2),(3797,1679,9,3),(3798,1681,1,1),(3799,1681,2,1),(3800,1681,4,2),(3801,1681,9,3),(3802,1682,1,1),(3803,1682,2,1),(3804,1682,4,2),(3805,1682,9,3),(3806,1687,2,1),(3807,1687,4,2),(3808,1687,9,3); +/*!40000 ALTER TABLE `exercise_related_classification` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `exercise_related_muscle` +-- + +DROP TABLE IF EXISTS `exercise_related_muscle`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `exercise_related_muscle` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'The ID of exercise related muscle.', + `exercise_id` bigint unsigned NOT NULL COMMENT 'The ID of exercise.', + `muscle_id` bigint unsigned NOT NULL COMMENT 'The ID of muscle.', + `related_muscle_type` tinyint NOT NULL COMMENT 'Related muscle type. Muscle movement classification.\n\n1 - Agonist\n2 - Antagonist\n3 - Target\n4 - Synergist\n5 - Stabilizer\n6 - Dynamic Stabilizer\n7 - Antagonist Stabilizer\n\nhttps://exrx.net/Kinesiology/Glossary#MuscleMovClass', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=6163 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Exercise Related Muscle.\n\nRelationship:\nOne exercise can have 3 (or more) different types of related muscle.\nAnd one exercise can have more than one specific type of related muscles.'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `exercise_related_muscle` +-- + +LOCK TABLES `exercise_related_muscle` WRITE; +/*!40000 ALTER TABLE `exercise_related_muscle` DISABLE KEYS */; +INSERT INTO `exercise_related_muscle` VALUES (1,1,50,3),(2,1,22,5),(3,2,50,3),(4,2,22,5),(5,3,50,3),(6,3,8,5),(7,3,45,5),(8,3,22,5),(9,4,50,3),(10,4,49,4),(11,4,22,4),(12,4,28,4),(13,4,22,5),(14,4,28,5),(15,5,50,3),(16,5,49,4),(17,5,22,4),(18,5,28,4),(19,5,22,5),(20,5,28,5),(21,5,29,5),(22,6,50,3),(23,6,49,4),(24,6,22,4),(25,6,28,4),(26,6,22,5),(27,6,28,5),(28,8,50,3),(29,8,8,5),(30,8,45,5),(31,8,22,5),(32,9,50,3),(33,9,22,5),(34,10,50,3),(35,10,22,5),(36,7,50,3),(37,7,49,4),(38,7,22,4),(39,7,28,4),(40,7,22,5),(41,7,28,5),(42,7,29,5),(43,11,50,3),(44,11,49,4),(45,12,50,3),(46,13,50,3),(47,13,49,4),(48,13,22,4),(49,13,28,4),(50,13,12,5),(51,13,12,5),(52,15,50,3),(53,15,22,5),(54,15,43,5),(55,16,50,3),(56,16,49,4),(57,16,43,5),(58,16,22,5),(59,16,18,5),(60,16,46,5),(61,16,11,5),(62,16,48,5),(63,17,50,3),(64,17,49,4),(65,17,22,5),(66,17,43,5),(67,18,50,3),(68,18,49,4),(69,18,22,4),(70,18,28,4),(71,18,12,4),(72,18,12,4),(73,18,22,5),(74,18,28,5),(75,18,12,5),(76,18,12,5),(77,19,49,3),(78,19,8,4),(79,19,29,5),(80,19,45,5),(81,20,49,3),(82,20,8,4),(83,20,29,5),(84,20,6,5),(85,20,6,5),(86,21,49,3),(87,21,8,4),(88,21,29,5),(89,21,6,5),(90,21,6,5),(91,22,49,3),(92,22,8,4),(93,26,49,3),(94,26,8,4),(95,23,49,3),(96,23,8,4),(97,25,49,3),(98,25,8,4),(99,28,49,3),(100,28,8,4),(101,28,43,4),(102,28,12,5),(103,27,49,3),(104,24,22,2),(105,24,49,3),(106,24,8,4),(107,24,29,5),(108,24,45,5),(109,24,12,5),(110,24,22,5),(111,24,22,7),(112,29,49,3),(113,29,8,4),(114,29,12,4),(115,29,43,4),(116,30,49,3),(117,31,22,2),(118,31,49,3),(119,31,8,4),(120,31,12,5),(121,31,17,5),(122,31,22,5),(123,31,22,7),(124,32,49,3),(125,33,6,3),(126,33,7,4),(127,33,52,4),(128,34,6,3),(129,34,7,4),(130,34,6,5),(131,34,38,5),(132,35,6,3),(133,35,7,4),(134,37,6,3),(135,37,7,4),(136,37,52,4),(137,36,6,3),(138,36,7,4),(139,36,38,5),(140,40,6,3),(141,40,7,4),(142,40,52,4),(143,38,6,3),(144,38,7,4),(145,38,52,4),(146,39,6,3),(147,39,7,4),(148,42,6,3),(149,42,7,4),(150,42,38,5),(151,41,6,3),(152,41,7,4),(153,41,52,4),(154,43,6,3),(155,43,7,4),(156,43,38,5),(157,44,6,3),(158,44,7,4),(159,44,38,5),(160,45,6,3),(161,45,7,4),(162,45,38,5),(163,46,6,3),(164,46,7,4),(165,46,52,4),(166,48,6,3),(167,48,7,4),(168,48,6,5),(169,48,38,5),(170,47,6,3),(171,47,7,4),(172,47,38,5),(173,51,6,3),(174,51,7,4),(175,51,38,5),(176,50,6,3),(177,50,7,4),(178,50,52,4),(179,52,6,3),(180,52,7,4),(181,52,38,5),(182,53,6,3),(183,53,7,4),(184,53,52,4),(185,49,6,3),(186,49,7,4),(187,49,52,4),(188,49,12,4),(189,49,43,4),(190,49,48,4),(191,49,22,4),(192,49,28,4),(193,49,12,4),(194,49,17,5),(195,49,11,5),(196,49,22,5),(197,49,17,6),(198,49,11,6),(199,54,6,3),(200,54,7,4),(201,54,52,4),(202,55,6,3),(203,55,7,4),(204,55,52,4),(205,56,6,3),(206,56,7,4),(207,56,52,4),(208,57,6,3),(209,57,7,4),(210,57,52,4),(211,60,6,3),(212,60,7,4),(213,60,38,5),(214,58,6,3),(215,58,7,4),(216,59,6,3),(217,59,7,4),(218,59,52,4),(219,59,22,4),(220,59,28,4),(221,61,6,3),(222,61,7,4),(223,62,6,3),(224,62,7,4),(225,63,6,3),(226,63,52,4),(227,63,22,5),(228,63,28,5),(229,64,6,3),(230,64,7,4),(231,64,52,4),(232,65,6,3),(233,65,7,4),(234,66,6,3),(235,66,7,4),(236,66,52,4),(237,67,6,3),(238,67,7,4),(239,67,52,4),(240,68,6,3),(241,68,7,4),(242,71,6,3),(243,71,7,4),(244,69,6,3),(245,69,7,4),(246,69,52,4),(247,72,6,3),(248,72,7,4),(249,72,52,4),(250,70,6,3),(251,70,7,4),(252,73,6,3),(253,73,7,4),(254,74,6,3),(255,75,6,3),(256,76,6,3),(257,77,6,3),(258,77,7,4),(259,77,43,5),(260,77,18,5),(261,77,46,5),(262,77,22,5),(263,78,6,3),(264,78,7,4),(265,78,43,5),(266,78,18,5),(267,78,46,5),(268,78,22,5),(269,79,22,2),(270,79,6,3),(271,79,7,4),(272,79,12,5),(273,79,17,5),(274,79,38,5),(275,79,22,5),(276,79,22,7),(277,80,6,3),(278,81,7,3),(279,81,6,4),(280,81,52,4),(281,81,38,5),(282,82,7,3),(283,82,6,4),(284,82,52,4),(285,82,3,4),(286,82,4,4),(287,82,19,4),(288,82,29,4),(289,84,7,3),(290,84,6,4),(291,84,52,4),(292,84,3,4),(293,84,4,4),(294,84,19,4),(295,84,29,4),(296,83,7,3),(297,83,6,4),(298,83,52,4),(299,83,38,5),(300,85,7,3),(301,85,6,4),(302,85,52,4),(303,85,38,5),(304,86,7,3),(305,86,6,4),(306,86,52,4),(307,86,3,4),(308,86,4,4),(309,86,19,4),(310,86,29,4),(311,87,7,3),(312,87,6,4),(313,87,52,4),(314,87,3,4),(315,87,4,4),(316,87,19,4),(317,87,29,4),(318,88,7,3),(319,88,6,4),(320,88,52,4),(321,88,3,4),(322,88,4,4),(323,88,19,4),(324,88,29,4),(325,89,7,3),(326,89,6,4),(327,89,52,4),(328,89,3,4),(329,89,4,4),(330,89,19,4),(331,89,29,4),(332,90,7,3),(333,90,6,4),(334,90,52,4),(335,90,3,4),(336,90,4,4),(337,90,19,4),(338,90,29,4),(339,91,7,3),(340,91,6,4),(341,91,52,4),(342,91,38,5),(343,92,7,3),(344,92,52,4),(345,92,29,4),(346,92,19,4),(347,92,6,4),(348,92,8,4),(349,92,38,5),(350,92,17,5),(351,92,12,5),(352,93,7,3),(353,93,52,4),(354,93,29,4),(355,93,19,4),(356,93,6,4),(357,93,8,4),(358,93,38,5),(359,94,7,3),(360,94,6,4),(361,94,52,4),(362,94,38,5),(363,95,7,3),(364,95,6,4),(365,95,52,4),(366,95,3,4),(367,95,4,4),(368,95,19,4),(369,95,29,4),(370,96,7,3),(371,96,8,4),(372,96,52,4),(373,96,38,5),(374,97,7,3),(375,97,52,4),(376,97,29,4),(377,97,19,4),(378,97,6,4),(379,97,8,4),(380,97,38,5),(381,97,17,5),(382,97,12,5),(383,99,7,3),(384,99,6,4),(385,99,52,4),(386,99,38,5),(387,98,7,3),(388,98,6,4),(389,98,52,4),(390,98,3,4),(391,98,4,4),(392,98,19,4),(393,98,29,4),(394,100,7,3),(395,100,8,4),(396,100,52,4),(397,100,38,5),(398,101,7,3),(399,101,6,4),(400,101,52,4),(401,101,38,5),(402,102,7,3),(403,102,6,4),(404,102,52,4),(405,102,3,4),(406,102,4,4),(407,102,19,4),(408,102,29,4),(409,103,7,3),(410,103,8,4),(411,103,52,4),(412,103,3,4),(413,103,4,4),(414,103,19,4),(415,103,29,4),(416,105,7,3),(417,105,6,4),(418,105,52,4),(419,105,3,4),(420,105,4,4),(421,105,19,4),(422,105,29,4),(423,104,7,3),(424,104,6,4),(425,104,52,4),(426,104,3,4),(427,104,4,4),(428,104,19,4),(429,104,29,4),(430,107,7,3),(431,107,6,4),(432,107,52,4),(433,106,7,3),(434,106,6,4),(435,106,52,4),(436,109,7,3),(437,109,6,4),(438,109,52,4),(439,109,38,5),(440,108,7,3),(441,108,6,4),(442,108,52,4),(443,108,3,4),(444,108,4,4),(445,108,19,4),(446,108,29,4),(447,110,7,3),(448,110,6,4),(449,110,52,4),(450,110,38,5),(451,112,7,3),(452,113,7,3),(453,114,22,2),(454,114,7,3),(455,114,6,4),(456,114,52,4),(457,114,29,4),(458,114,19,4),(459,114,12,5),(460,114,17,5),(461,114,38,5),(462,114,22,5),(463,114,22,7),(464,115,7,3),(465,115,6,4),(466,115,52,4),(467,115,3,4),(468,115,4,4),(469,115,19,4),(470,115,29,4),(471,116,7,3),(472,116,6,4),(473,116,52,4),(474,116,3,4),(475,116,4,4),(476,116,19,4),(477,116,29,4),(478,117,8,3),(479,117,19,4),(480,117,29,4),(481,117,7,4),(482,117,45,4),(483,117,3,4),(484,117,4,4),(485,118,8,3),(486,118,7,4),(487,118,19,4),(488,118,29,4),(489,118,45,4),(490,118,38,5),(491,119,8,3),(492,119,19,4),(493,119,29,4),(494,119,7,4),(495,119,45,4),(496,119,3,4),(497,119,4,4),(498,120,8,3),(499,120,7,4),(500,120,19,4),(501,120,29,4),(502,120,45,4),(503,120,38,5),(504,122,8,3),(505,122,7,4),(506,122,19,4),(507,122,29,4),(508,122,45,4),(509,122,38,5),(510,121,8,3),(511,121,7,4),(512,121,3,4),(513,121,4,4),(514,121,39,4),(515,121,29,5),(516,123,8,3),(517,123,19,4),(518,123,29,4),(519,123,7,4),(520,123,45,4),(521,123,3,4),(522,123,4,4),(523,123,17,5),(524,123,12,5),(525,124,8,3),(526,124,19,4),(527,124,29,4),(528,124,7,4),(529,124,45,4),(530,124,3,4),(531,124,4,4),(532,124,17,5),(533,124,12,5),(534,124,43,5),(535,125,8,3),(536,125,7,4),(537,125,19,4),(538,125,29,4),(539,125,45,4),(540,125,38,5),(541,125,22,5),(542,126,8,3),(543,126,19,4),(544,126,29,4),(545,126,7,4),(546,126,45,4),(547,126,3,4),(548,126,4,4),(549,126,17,5),(550,126,12,5),(551,127,8,3),(552,127,19,4),(553,127,29,4),(554,127,7,4),(555,127,45,4),(556,127,3,4),(557,127,4,4),(558,127,17,5),(559,127,12,5),(560,128,8,3),(561,128,19,4),(562,128,29,4),(563,128,7,4),(564,128,45,4),(565,128,3,4),(566,128,4,4),(567,128,12,5),(568,129,8,3),(569,129,19,4),(570,129,29,4),(571,129,7,4),(572,129,45,4),(573,129,38,5),(574,130,8,3),(575,130,7,4),(576,130,19,4),(577,130,29,4),(578,130,45,4),(579,130,38,5),(580,130,17,5),(581,130,12,5),(582,131,8,3),(583,131,19,4),(584,131,29,4),(585,131,7,4),(586,131,45,4),(587,131,3,4),(588,131,4,4),(589,133,8,3),(590,133,19,4),(591,133,29,4),(592,133,7,4),(593,133,45,4),(594,133,3,4),(595,133,4,4),(596,132,8,3),(597,132,19,4),(598,132,29,4),(599,132,7,4),(600,132,45,4),(601,132,38,5),(602,135,8,3),(603,135,19,4),(604,135,29,4),(605,135,7,4),(606,135,45,4),(607,135,3,4),(608,135,4,4),(609,134,8,3),(610,134,7,4),(611,134,19,4),(612,134,29,4),(613,134,45,4),(614,134,38,5),(615,134,17,5),(616,134,12,5),(617,134,43,5),(618,137,8,3),(619,137,19,4),(620,137,29,4),(621,137,7,4),(622,137,45,4),(623,136,8,3),(624,136,19,4),(625,136,29,4),(626,136,7,4),(627,136,45,4),(628,136,3,4),(629,136,4,4),(630,136,22,5),(631,138,8,3),(632,138,19,4),(633,138,29,4),(634,138,7,4),(635,138,45,4),(636,138,38,5),(637,138,17,5),(638,138,12,5),(639,138,43,5),(640,139,8,3),(641,139,19,4),(642,139,29,4),(643,139,52,4),(644,139,7,4),(645,139,45,4),(646,140,8,3),(647,140,19,4),(648,140,29,4),(649,140,7,4),(650,140,3,4),(651,140,4,4),(652,140,45,4),(653,141,8,3),(654,141,19,4),(655,141,29,4),(656,141,45,4),(657,141,3,4),(658,141,4,4),(659,141,7,5),(660,142,8,3),(661,142,19,4),(662,142,29,4),(663,142,45,4),(664,145,8,3),(665,145,7,4),(666,145,3,4),(667,145,4,4),(668,145,29,5),(669,144,8,3),(670,144,19,4),(671,144,29,4),(672,144,7,4),(673,144,45,4),(674,143,8,3),(675,143,19,4),(676,143,29,4),(677,143,45,4),(678,143,3,4),(679,143,4,4),(680,143,7,5),(681,147,8,3),(682,147,19,4),(683,147,29,4),(684,147,7,4),(685,147,45,4),(686,147,38,5),(687,148,8,3),(688,148,19,4),(689,148,29,4),(690,148,45,4),(691,148,17,5),(692,148,12,5),(693,148,38,5),(694,149,8,3),(695,149,19,4),(696,149,29,4),(697,149,45,4),(698,149,3,4),(699,149,4,4),(700,149,7,5),(701,150,8,3),(702,150,19,4),(703,150,29,4),(704,150,7,4),(705,150,45,4),(706,150,38,5),(707,151,8,3),(708,151,19,4),(709,151,29,4),(710,151,45,4),(711,151,17,5),(712,151,12,5),(713,151,43,5),(714,153,8,3),(715,153,19,4),(716,153,29,4),(717,153,45,4),(718,157,8,3),(719,157,19,4),(720,157,29,4),(721,157,45,4),(722,157,12,5),(723,157,43,5),(724,154,8,3),(725,154,19,4),(726,154,29,4),(727,154,45,4),(728,156,8,3),(729,156,19,4),(730,156,29,4),(731,156,7,4),(732,156,45,4),(733,156,38,5),(734,155,8,3),(735,155,19,4),(736,155,29,4),(737,155,7,4),(738,155,45,4),(739,155,38,5),(740,152,8,3),(741,152,19,4),(742,152,29,4),(743,152,7,4),(744,152,3,4),(745,152,4,4),(746,152,45,4),(747,152,17,5),(748,152,12,5),(749,152,43,5),(750,158,22,2),(751,158,8,3),(752,158,19,4),(753,158,29,4),(754,158,45,4),(755,158,3,4),(756,158,4,4),(757,158,17,5),(758,158,12,5),(759,158,7,5),(760,158,22,5),(761,158,22,7),(762,159,22,2),(763,159,8,3),(764,159,19,4),(765,159,29,4),(766,159,45,4),(767,159,3,4),(768,159,4,4),(769,159,17,5),(770,159,12,5),(771,159,7,5),(772,159,22,5),(773,159,22,7),(774,160,8,3),(775,160,19,4),(776,160,29,4),(777,160,7,4),(778,160,3,4),(779,160,4,4),(780,160,45,4),(781,160,17,5),(782,160,12,5),(783,160,43,5),(784,163,22,2),(785,163,8,3),(786,163,19,4),(787,163,29,4),(788,163,45,4),(789,163,3,4),(790,163,4,4),(791,163,17,5),(792,163,12,5),(793,163,7,5),(794,163,22,5),(795,163,22,7),(796,165,8,3),(797,164,8,3),(798,162,22,2),(799,162,8,3),(800,162,19,4),(801,162,29,4),(802,162,45,4),(803,162,17,5),(804,162,12,5),(805,162,7,5),(806,162,22,5),(807,162,22,7),(808,168,52,3),(809,168,7,4),(810,168,6,4),(811,168,6,4),(812,168,38,5),(813,167,52,3),(814,167,7,4),(815,167,6,4),(816,167,6,4),(817,167,38,5),(818,169,52,3),(819,169,7,4),(820,169,6,4),(821,169,6,4),(822,169,38,5),(823,170,52,3),(824,170,7,4),(825,170,6,4),(826,170,6,4),(827,170,38,5),(828,171,52,3),(829,171,7,4),(830,171,6,4),(831,171,6,4),(832,171,38,5),(833,172,6,4),(834,173,6,4),(835,173,29,4),(836,173,45,4),(837,174,6,4),(838,174,39,5),(839,175,6,4),(840,175,29,4),(841,175,45,4),(842,177,6,4),(843,176,6,5),(844,176,28,5),(845,176,8,5),(846,176,39,5),(847,179,6,5),(848,179,28,5),(849,179,8,5),(850,179,39,5),(851,178,6,5),(852,178,28,5),(853,178,8,5),(854,178,39,5),(855,180,6,5),(856,180,39,5),(857,181,6,5),(858,181,28,5),(859,181,8,5),(860,181,39,5),(861,182,6,5),(862,182,39,5),(863,182,22,5),(864,184,6,5),(865,184,28,5),(866,184,8,5),(867,184,39,5),(868,183,28,5),(869,183,6,5),(870,183,8,5),(871,183,29,5),(872,183,22,5),(873,183,38,5),(874,185,6,5),(875,185,22,5),(876,186,6,5),(877,186,28,5),(878,186,8,5),(879,186,39,5),(880,187,39,5),(881,188,6,5),(882,188,28,5),(883,188,8,5),(884,188,39,5),(885,189,28,4),(886,189,8,4),(887,189,29,4),(888,189,28,5),(889,189,8,5),(890,189,29,5),(891,189,22,5),(892,189,39,5),(893,190,28,5),(894,190,8,5),(895,190,29,5),(896,190,22,5),(897,190,39,5),(898,191,28,5),(899,191,8,5),(900,191,29,5),(901,191,22,5),(902,191,39,5),(903,192,28,5),(904,192,8,5),(905,192,29,5),(906,192,39,5),(907,193,28,5),(908,193,8,5),(909,193,29,5),(910,193,22,5),(911,193,39,5),(912,194,28,5),(913,194,29,5),(914,194,22,5),(915,194,28,5),(916,194,38,5),(917,195,28,5),(918,195,8,5),(919,195,29,5),(920,195,22,5),(921,195,39,5),(922,196,28,5),(923,196,8,5),(924,196,29,5),(925,196,22,5),(926,196,39,5),(927,197,28,5),(928,197,8,5),(929,197,29,5),(930,197,22,5),(931,197,38,5),(932,200,6,4),(933,200,29,4),(934,200,45,4),(935,199,38,5),(936,198,28,5),(937,198,8,5),(938,198,29,5),(939,198,39,5),(940,201,6,5),(941,201,39,5),(942,202,39,5),(943,203,38,5),(944,204,6,5),(945,204,28,5),(946,204,8,5),(947,205,8,5),(948,205,45,5),(949,206,6,5),(950,206,28,5),(951,206,8,5),(952,207,6,5),(953,207,39,5),(954,208,6,5),(955,208,28,5),(956,208,8,5),(957,209,6,5),(958,209,39,5),(959,210,38,5),(960,211,6,4),(961,212,6,4),(962,213,6,5),(963,213,39,5),(964,214,39,5),(965,215,8,5),(966,215,28,5),(967,215,29,5),(968,216,8,5),(969,216,28,5),(970,216,29,5),(971,216,39,5),(972,217,6,4),(973,217,29,4),(974,217,45,4),(975,218,8,5),(976,218,28,5),(977,218,29,5),(978,220,6,4),(979,219,6,4),(980,219,29,4),(981,219,45,4),(982,222,6,4),(983,223,8,5),(984,223,28,5),(985,223,29,5),(986,224,8,5),(987,224,28,5),(988,224,29,5),(989,225,6,4),(990,225,29,4),(991,225,45,4),(992,226,6,4),(993,228,6,4),(994,228,29,4),(995,228,45,4),(996,229,6,4),(997,231,6,4),(998,231,29,4),(999,231,45,4),(1000,230,6,4),(1001,230,29,4),(1002,230,45,4),(1003,232,6,4),(1004,232,22,5),(1005,232,43,5),(1006,233,6,4),(1007,233,22,5),(1008,234,6,4),(1009,234,29,4),(1010,234,45,4),(1011,235,6,4),(1012,235,22,5),(1013,235,43,5),(1014,236,6,4),(1015,236,29,4),(1016,236,45,4),(1017,237,6,4),(1018,237,29,4),(1019,237,45,4),(1020,238,6,4),(1021,238,29,4),(1022,238,45,4),(1023,240,6,4),(1024,240,29,4),(1025,240,45,4),(1026,242,6,4),(1027,242,22,5),(1028,242,43,5),(1029,242,11,5),(1030,242,48,5),(1031,241,29,5),(1032,241,8,5),(1033,241,29,5),(1034,241,6,5),(1035,241,22,5),(1036,241,43,5),(1037,241,11,5),(1038,243,6,4),(1039,243,29,4),(1040,243,45,4),(1041,244,6,4),(1042,244,29,4),(1043,244,45,4),(1044,245,6,4),(1045,245,29,4),(1046,245,45,4),(1047,247,6,4),(1048,247,29,4),(1049,247,45,4),(1050,246,29,5),(1051,246,8,5),(1052,246,29,5),(1053,246,6,5),(1054,246,22,5),(1055,246,43,5),(1056,246,11,5),(1057,246,39,5),(1058,252,6,4),(1059,252,29,4),(1060,252,45,4),(1061,253,3,4),(1062,253,4,4),(1063,253,39,5),(1064,254,3,4),(1065,254,4,4),(1066,254,39,5),(1067,255,3,4),(1068,255,4,4),(1069,255,8,4),(1070,255,6,4),(1071,255,39,5),(1072,256,3,4),(1073,256,4,4),(1074,256,6,5),(1075,256,39,5),(1076,257,3,4),(1077,257,4,4),(1078,257,6,5),(1079,257,39,5),(1080,258,3,4),(1081,258,4,4),(1082,258,39,5),(1083,259,3,4),(1084,259,4,4),(1085,259,6,5),(1086,259,39,5),(1087,260,3,4),(1088,260,4,4),(1089,260,6,5),(1090,260,39,5),(1091,262,3,4),(1092,262,4,4),(1093,262,6,5),(1094,262,39,5),(1095,261,3,4),(1096,261,4,4),(1097,261,39,5),(1098,263,3,4),(1099,263,4,4),(1100,263,6,5),(1101,263,39,5),(1102,264,22,2),(1103,264,45,4),(1104,264,28,4),(1105,264,8,4),(1106,264,19,4),(1107,264,29,4),(1108,264,3,4),(1109,264,4,4),(1110,264,17,5),(1111,264,12,5),(1112,264,22,7),(1113,265,3,4),(1114,265,4,4),(1115,265,39,5),(1116,266,3,4),(1117,266,4,4),(1118,266,39,5),(1119,269,3,4),(1120,269,4,4),(1121,269,6,5),(1122,269,39,5),(1123,270,3,4),(1124,270,4,4),(1125,270,28,4),(1126,270,8,4),(1127,270,45,4),(1128,270,29,4),(1129,271,22,2),(1130,271,45,4),(1131,271,28,4),(1132,271,8,4),(1133,271,19,4),(1134,271,29,4),(1135,271,3,4),(1136,271,4,4),(1137,271,17,5),(1138,271,12,5),(1139,271,22,5),(1140,271,22,7),(1141,275,3,3),(1142,275,4,4),(1143,275,39,5),(1144,276,3,3),(1145,276,4,4),(1146,276,39,5),(1147,277,3,3),(1148,277,4,4),(1149,277,22,5),(1150,277,39,5),(1151,278,3,3),(1152,278,4,4),(1153,278,39,5),(1154,281,3,3),(1155,281,4,4),(1156,281,39,5),(1157,279,3,3),(1158,279,4,4),(1159,279,39,5),(1160,280,3,3),(1161,280,4,4),(1162,280,39,5),(1163,280,45,5),(1164,282,3,3),(1165,282,4,4),(1166,282,39,5),(1167,283,3,3),(1168,283,4,4),(1169,283,39,5),(1170,284,3,3),(1171,284,4,4),(1172,284,39,5),(1173,284,45,5),(1174,285,3,3),(1175,285,4,4),(1176,285,39,5),(1177,286,3,3),(1178,286,4,4),(1179,286,39,5),(1180,287,3,3),(1181,287,4,4),(1182,287,22,5),(1183,287,39,5),(1184,290,3,3),(1185,290,4,4),(1186,290,39,5),(1187,290,45,5),(1188,288,3,3),(1189,288,4,4),(1190,288,39,5),(1191,289,3,3),(1192,289,4,4),(1193,289,39,5),(1194,291,3,3),(1195,291,4,4),(1196,291,39,5),(1197,292,3,3),(1198,292,4,4),(1199,292,39,5),(1200,293,3,3),(1201,293,4,4),(1202,293,39,5),(1203,295,3,3),(1204,295,4,4),(1205,295,39,5),(1206,294,3,3),(1207,294,4,4),(1208,294,39,5),(1209,296,3,3),(1210,296,4,4),(1211,296,39,5),(1212,297,22,2),(1213,297,3,3),(1214,297,4,4),(1215,297,12,5),(1216,297,17,5),(1217,297,39,5),(1218,297,45,5),(1219,297,22,5),(1220,297,22,7),(1221,298,3,3),(1222,298,4,4),(1223,298,39,5),(1224,299,4,3),(1225,299,3,4),(1226,299,38,5),(1227,300,4,3),(1228,300,3,4),(1229,300,6,5),(1230,301,4,3),(1231,301,3,4),(1232,301,6,5),(1233,301,38,5),(1234,302,4,3),(1235,302,3,4),(1236,302,6,5),(1237,302,38,5),(1238,303,4,3),(1239,303,3,4),(1240,303,6,5),(1241,303,38,5),(1242,304,4,3),(1243,304,3,4),(1244,304,6,5),(1245,305,3,4),(1246,305,4,4),(1247,305,6,5),(1248,305,39,5),(1249,307,4,3),(1250,307,3,4),(1251,307,38,5),(1252,306,4,3),(1253,306,3,4),(1254,306,6,5),(1255,309,4,3),(1256,309,3,4),(1257,309,38,5),(1258,308,4,3),(1259,308,3,4),(1260,308,38,5),(1261,310,4,3),(1262,311,4,3),(1263,311,3,4),(1264,311,38,5),(1265,312,39,3),(1266,312,4,5),(1267,312,3,5),(1268,312,6,5),(1269,312,38,5),(1270,313,39,3),(1271,314,39,3),(1272,315,39,3),(1273,317,39,3),(1274,319,39,3),(1275,318,39,3),(1276,320,39,3),(1277,321,39,3),(1278,323,39,3),(1279,324,39,3),(1280,325,39,3),(1281,326,39,3),(1282,327,39,3),(1283,330,39,3),(1284,329,39,3),(1285,331,39,3),(1286,328,39,3),(1287,334,38,3),(1288,335,38,3),(1289,338,38,3),(1290,337,38,3),(1291,339,38,3),(1292,340,38,3),(1293,340,4,5),(1294,340,3,5),(1295,340,6,5),(1296,340,39,5),(1297,341,38,3),(1298,343,38,3),(1299,344,38,3),(1300,355,22,2),(1301,355,28,4),(1302,355,8,4),(1303,355,45,4),(1304,355,19,4),(1305,355,29,4),(1306,355,3,4),(1307,355,4,4),(1308,355,17,5),(1309,355,12,5),(1310,355,43,5),(1311,355,22,5),(1312,355,22,7),(1313,357,45,4),(1314,357,28,4),(1315,357,8,4),(1316,357,19,4),(1317,357,29,4),(1318,357,3,4),(1319,357,4,4),(1320,356,45,4),(1321,356,28,4),(1322,356,8,4),(1323,356,19,4),(1324,356,29,4),(1325,356,3,4),(1326,356,4,4),(1327,356,17,5),(1328,356,12,5),(1329,358,22,2),(1330,358,45,4),(1331,358,28,4),(1332,358,8,4),(1333,358,19,4),(1334,358,29,4),(1335,358,3,4),(1336,358,4,4),(1337,358,17,5),(1338,358,12,5),(1339,358,22,5),(1340,358,22,7),(1341,362,45,4),(1342,362,28,4),(1343,362,8,4),(1344,362,19,4),(1345,362,29,4),(1346,362,3,4),(1347,362,4,4),(1348,359,22,2),(1349,359,45,4),(1350,359,28,4),(1351,359,8,4),(1352,359,19,4),(1353,359,29,4),(1354,359,3,4),(1355,359,4,4),(1356,359,17,5),(1357,359,12,5),(1358,359,43,5),(1359,359,22,5),(1360,359,22,7),(1361,361,45,4),(1362,361,28,4),(1363,361,8,4),(1364,361,19,4),(1365,361,29,4),(1366,361,3,4),(1367,361,4,4),(1368,363,45,4),(1369,363,28,4),(1370,363,8,4),(1371,363,19,4),(1372,363,29,4),(1373,363,3,4),(1374,363,4,4),(1375,363,22,5),(1376,363,17,5),(1377,363,12,5),(1378,360,22,2),(1379,360,28,4),(1380,360,8,4),(1381,360,45,4),(1382,360,19,4),(1383,360,29,4),(1384,360,3,4),(1385,360,4,4),(1386,360,17,5),(1387,360,12,5),(1388,360,43,5),(1389,360,22,7),(1390,364,45,4),(1391,364,28,4),(1392,364,8,4),(1393,364,19,4),(1394,364,29,4),(1395,364,3,4),(1396,364,4,4),(1397,364,22,5),(1398,364,17,5),(1399,364,12,5),(1400,365,45,4),(1401,365,28,4),(1402,365,8,4),(1403,365,19,4),(1404,365,29,4),(1405,365,3,4),(1406,365,4,4),(1407,365,22,4),(1408,365,28,4),(1409,365,17,5),(1410,365,12,5),(1411,366,45,4),(1412,366,28,4),(1413,366,8,4),(1414,366,19,4),(1415,366,29,4),(1416,366,3,4),(1417,366,4,4),(1418,366,17,5),(1419,366,12,5),(1420,366,22,5),(1421,367,45,4),(1422,367,28,4),(1423,367,8,4),(1424,367,19,4),(1425,367,29,4),(1426,367,3,4),(1427,367,4,4),(1428,367,17,5),(1429,367,12,5),(1430,368,45,4),(1431,368,28,4),(1432,368,8,4),(1433,368,19,4),(1434,368,29,4),(1435,368,3,4),(1436,368,4,4),(1437,368,22,4),(1438,368,28,4),(1439,369,22,2),(1440,369,45,4),(1441,369,28,4),(1442,369,8,4),(1443,369,19,4),(1444,369,29,4),(1445,369,3,4),(1446,369,4,4),(1447,369,22,4),(1448,369,22,7),(1449,370,45,4),(1450,370,28,4),(1451,370,8,4),(1452,370,19,4),(1453,370,29,4),(1454,370,3,4),(1455,370,4,4),(1456,370,17,5),(1457,370,12,5),(1458,371,45,4),(1459,371,28,4),(1460,371,8,4),(1461,371,19,4),(1462,371,29,4),(1463,371,3,4),(1464,371,4,4),(1465,371,22,5),(1466,374,22,2),(1467,374,45,4),(1468,374,28,4),(1469,374,8,4),(1470,374,19,4),(1471,374,29,4),(1472,374,3,4),(1473,374,4,4),(1474,374,17,5),(1475,374,12,5),(1476,374,22,5),(1477,374,22,7),(1478,372,45,4),(1479,372,28,4),(1480,372,8,4),(1481,372,19,4),(1482,372,29,4),(1483,372,3,4),(1484,372,4,4),(1485,372,17,5),(1486,372,12,5),(1487,373,22,2),(1488,373,45,4),(1489,373,28,4),(1490,373,8,4),(1491,373,19,4),(1492,373,29,4),(1493,373,3,4),(1494,373,4,4),(1495,373,17,5),(1496,373,12,5),(1497,373,22,5),(1498,373,22,7),(1499,375,45,4),(1500,375,28,4),(1501,375,8,4),(1502,375,19,4),(1503,375,29,4),(1504,375,3,4),(1505,375,4,4),(1506,376,45,4),(1507,376,28,4),(1508,376,8,4),(1509,376,19,4),(1510,376,29,4),(1511,376,3,4),(1512,376,4,4),(1513,377,45,4),(1514,377,28,4),(1515,377,8,4),(1516,377,19,4),(1517,377,29,4),(1518,377,3,4),(1519,377,4,4),(1520,378,45,4),(1521,378,28,4),(1522,378,8,4),(1523,378,19,4),(1524,378,29,4),(1525,378,3,4),(1526,378,4,4),(1527,379,45,4),(1528,379,28,4),(1529,379,8,4),(1530,379,19,4),(1531,379,29,4),(1532,379,3,4),(1533,379,4,4),(1534,379,22,4),(1535,379,28,4),(1536,380,22,2),(1537,380,45,4),(1538,380,28,4),(1539,380,8,4),(1540,380,19,4),(1541,380,29,4),(1542,380,3,4),(1543,380,4,4),(1544,380,17,5),(1545,380,12,5),(1546,380,43,5),(1547,380,22,5),(1548,380,22,7),(1549,383,45,4),(1550,383,28,4),(1551,383,8,4),(1552,383,19,4),(1553,383,29,4),(1554,383,3,4),(1555,383,4,4),(1556,382,22,2),(1557,382,45,4),(1558,382,28,4),(1559,382,8,4),(1560,382,19,4),(1561,382,29,4),(1562,382,3,4),(1563,382,4,4),(1564,382,17,5),(1565,382,12,5),(1566,382,43,5),(1567,382,22,5),(1568,382,22,7),(1569,385,45,4),(1570,385,28,4),(1571,385,8,4),(1572,385,19,4),(1573,385,29,4),(1574,385,3,4),(1575,385,4,4),(1576,384,45,4),(1577,384,28,4),(1578,384,8,4),(1579,384,19,4),(1580,384,29,4),(1581,384,3,4),(1582,384,4,4),(1583,381,22,2),(1584,381,45,4),(1585,381,28,4),(1586,381,8,4),(1587,381,19,4),(1588,381,29,4),(1589,381,3,4),(1590,381,4,4),(1591,381,17,5),(1592,381,12,5),(1593,381,43,5),(1594,381,22,5),(1595,381,22,7),(1596,386,45,4),(1597,386,28,4),(1598,386,8,4),(1599,386,19,4),(1600,386,29,4),(1601,386,3,4),(1602,386,4,4),(1603,386,22,4),(1604,387,45,4),(1605,387,28,4),(1606,387,8,4),(1607,387,19,4),(1608,387,29,4),(1609,387,3,4),(1610,387,4,4),(1611,388,45,4),(1612,388,28,4),(1613,388,8,4),(1614,388,19,4),(1615,388,29,4),(1616,388,3,4),(1617,388,4,4),(1618,389,45,4),(1619,389,28,4),(1620,389,8,4),(1621,389,19,4),(1622,389,29,4),(1623,389,3,4),(1624,389,4,4),(1625,392,45,4),(1626,392,28,4),(1627,392,8,4),(1628,392,19,4),(1629,392,29,4),(1630,392,3,4),(1631,392,4,4),(1632,391,45,4),(1633,391,28,4),(1634,391,8,4),(1635,391,19,4),(1636,391,29,4),(1637,391,3,4),(1638,391,4,4),(1639,390,45,4),(1640,390,28,4),(1641,390,8,4),(1642,390,19,4),(1643,390,29,4),(1644,390,3,4),(1645,390,4,4),(1646,393,22,2),(1647,393,45,4),(1648,393,28,4),(1649,393,8,4),(1650,393,19,4),(1651,393,29,4),(1652,393,3,4),(1653,393,4,4),(1654,393,17,5),(1655,393,12,5),(1656,393,22,5),(1657,393,22,7),(1658,394,45,4),(1659,394,28,4),(1660,394,8,4),(1661,394,19,4),(1662,394,29,4),(1663,394,3,4),(1664,394,4,4),(1665,395,45,4),(1666,395,28,4),(1667,395,8,4),(1668,395,19,4),(1669,395,29,4),(1670,395,3,4),(1671,395,4,4),(1672,395,17,5),(1673,395,12,5),(1674,396,22,2),(1675,396,45,4),(1676,396,28,4),(1677,396,8,4),(1678,396,19,4),(1679,396,29,4),(1680,396,3,4),(1681,396,4,4),(1682,396,17,5),(1683,396,12,5),(1684,396,43,5),(1685,396,22,5),(1686,396,22,7),(1687,398,22,2),(1688,398,45,4),(1689,398,28,4),(1690,398,8,4),(1691,398,19,4),(1692,398,29,4),(1693,398,3,4),(1694,398,4,4),(1695,398,17,5),(1696,398,12,5),(1697,398,43,5),(1698,398,22,5),(1699,398,22,7),(1700,399,45,4),(1701,399,28,4),(1702,399,8,4),(1703,399,19,4),(1704,399,29,4),(1705,399,3,4),(1706,399,4,4),(1707,402,45,4),(1708,402,28,4),(1709,402,8,4),(1710,402,19,4),(1711,402,29,4),(1712,402,3,4),(1713,402,4,4),(1714,401,45,4),(1715,401,28,4),(1716,401,8,4),(1717,401,19,4),(1718,401,29,4),(1719,401,3,4),(1720,401,4,4),(1721,403,45,4),(1722,403,28,4),(1723,403,8,4),(1724,403,19,4),(1725,403,29,4),(1726,403,3,4),(1727,403,4,4),(1728,405,45,4),(1729,405,28,4),(1730,405,8,4),(1731,405,19,4),(1732,405,29,4),(1733,405,3,4),(1734,405,4,4),(1735,406,45,4),(1736,406,28,4),(1737,406,8,4),(1738,406,19,4),(1739,406,29,4),(1740,406,3,4),(1741,406,4,4),(1742,407,45,4),(1743,407,28,4),(1744,407,8,4),(1745,407,19,4),(1746,407,29,4),(1747,407,3,4),(1748,407,4,4),(1749,408,45,4),(1750,408,28,4),(1751,408,8,4),(1752,408,19,4),(1753,408,29,4),(1754,408,3,4),(1755,408,4,4),(1756,410,45,4),(1757,410,28,4),(1758,410,8,4),(1759,410,19,4),(1760,410,29,4),(1761,410,3,4),(1762,410,4,4),(1763,410,17,5),(1764,410,12,5),(1765,411,22,2),(1766,411,45,4),(1767,411,28,4),(1768,411,8,4),(1769,411,19,4),(1770,411,29,4),(1771,411,3,4),(1772,411,4,4),(1773,411,17,5),(1774,411,12,5),(1775,411,22,5),(1776,411,22,7),(1777,414,22,2),(1778,414,45,4),(1779,414,28,4),(1780,414,8,4),(1781,414,19,4),(1782,414,29,4),(1783,414,3,4),(1784,414,4,4),(1785,414,17,5),(1786,414,12,5),(1787,414,22,5),(1788,414,22,7),(1789,412,22,2),(1790,412,45,4),(1791,412,28,4),(1792,412,8,4),(1793,412,19,4),(1794,412,29,4),(1795,412,3,4),(1796,412,4,4),(1797,412,17,5),(1798,412,12,5),(1799,412,22,5),(1800,412,22,7),(1801,413,22,2),(1802,413,45,4),(1803,413,28,4),(1804,413,8,4),(1805,413,19,4),(1806,413,29,4),(1807,413,3,4),(1808,413,4,4),(1809,413,17,5),(1810,413,12,5),(1811,413,43,5),(1812,413,22,5),(1813,413,22,7),(1814,415,22,2),(1815,415,45,4),(1816,415,28,4),(1817,415,8,4),(1818,415,19,4),(1819,415,29,4),(1820,415,3,4),(1821,415,4,4),(1822,415,12,5),(1823,415,17,5),(1824,415,22,5),(1825,415,22,7),(1826,417,22,2),(1827,417,45,4),(1828,417,28,4),(1829,417,8,4),(1830,417,19,4),(1831,417,29,4),(1832,417,3,4),(1833,417,4,4),(1834,417,22,5),(1835,417,22,7),(1836,419,22,2),(1837,419,45,4),(1838,419,28,4),(1839,419,8,4),(1840,419,19,4),(1841,419,29,4),(1842,419,3,4),(1843,419,4,4),(1844,419,17,5),(1845,419,12,5),(1846,419,22,5),(1847,419,22,7),(1848,420,22,2),(1849,420,45,4),(1850,420,28,4),(1851,420,8,4),(1852,420,19,4),(1853,420,29,4),(1854,420,3,4),(1855,420,4,4),(1856,420,12,5),(1857,420,17,5),(1858,420,22,5),(1859,420,22,7),(1860,422,22,2),(1861,422,45,4),(1862,422,28,4),(1863,422,8,4),(1864,422,19,4),(1865,422,29,4),(1866,422,3,4),(1867,422,4,4),(1868,422,12,5),(1869,422,17,5),(1870,422,22,5),(1871,422,22,7),(1872,423,22,2),(1873,423,45,4),(1874,423,28,4),(1875,423,8,4),(1876,423,19,4),(1877,423,29,4),(1878,423,3,4),(1879,423,4,4),(1880,423,12,5),(1881,423,22,5),(1882,423,22,7),(1883,425,45,4),(1884,425,28,4),(1885,425,8,4),(1886,425,19,4),(1887,425,29,4),(1888,425,3,4),(1889,425,4,4),(1890,425,22,4),(1891,425,28,4),(1892,425,12,5),(1893,425,17,5),(1894,426,28,4),(1895,426,8,4),(1896,426,45,4),(1897,426,29,4),(1898,426,6,5),(1899,426,39,5),(1900,427,3,4),(1901,427,4,4),(1902,427,28,4),(1903,427,45,4),(1904,427,29,4),(1905,428,3,4),(1906,428,4,4),(1907,428,28,4),(1908,428,8,4),(1909,428,45,4),(1910,428,29,4),(1911,430,3,4),(1912,430,4,4),(1913,430,28,4),(1914,430,45,4),(1915,430,29,4),(1916,429,3,4),(1917,429,4,4),(1918,429,28,4),(1919,429,8,4),(1920,429,19,4),(1921,429,29,4),(1922,429,45,4),(1923,429,29,4),(1924,431,3,4),(1925,431,4,4),(1926,431,28,4),(1927,431,8,4),(1928,431,45,4),(1929,431,29,4),(1930,432,3,4),(1931,432,4,4),(1932,432,28,4),(1933,432,8,4),(1934,432,45,4),(1935,432,29,4),(1936,433,28,4),(1937,433,8,4),(1938,433,45,4),(1939,433,29,4),(1940,433,6,5),(1941,433,39,5),(1942,434,3,4),(1943,434,4,4),(1944,434,28,4),(1945,434,8,4),(1946,434,45,4),(1947,434,29,4),(1948,435,3,4),(1949,435,4,4),(1950,435,28,4),(1951,435,8,4),(1952,435,45,4),(1953,435,29,4),(1954,436,3,4),(1955,436,4,4),(1956,436,28,4),(1957,436,8,4),(1958,436,45,4),(1959,436,29,4),(1960,437,3,4),(1961,437,4,4),(1962,437,28,4),(1963,437,8,4),(1964,437,45,4),(1965,437,29,4),(1966,438,3,4),(1967,438,4,4),(1968,438,28,4),(1969,438,8,4),(1970,438,19,4),(1971,438,29,4),(1972,438,45,4),(1973,438,29,4),(1974,440,28,4),(1975,440,8,4),(1976,440,45,4),(1977,440,29,4),(1978,440,3,4),(1979,440,4,4),(1980,440,22,5),(1981,439,3,4),(1982,439,4,4),(1983,439,28,4),(1984,439,8,4),(1985,439,45,4),(1986,439,29,4),(1987,441,3,4),(1988,441,4,4),(1989,441,28,4),(1990,441,8,4),(1991,441,45,4),(1992,441,29,4),(1993,442,3,4),(1994,442,4,4),(1995,442,28,4),(1996,442,8,4),(1997,442,19,4),(1998,442,29,4),(1999,442,45,4),(2000,442,29,4),(2001,443,28,4),(2002,443,8,4),(2003,443,45,4),(2004,443,29,4),(2005,443,6,5),(2006,443,39,5),(2007,444,3,4),(2008,444,4,4),(2009,444,28,4),(2010,444,8,4),(2011,444,19,4),(2012,444,29,4),(2013,444,45,4),(2014,444,29,4),(2015,445,3,4),(2016,445,4,4),(2017,445,28,4),(2018,445,8,4),(2019,445,19,4),(2020,445,29,4),(2021,445,45,4),(2022,445,29,4),(2023,446,28,4),(2024,446,8,4),(2025,446,45,4),(2026,446,29,4),(2027,446,22,5),(2028,446,39,5),(2029,447,3,4),(2030,447,4,4),(2031,447,28,4),(2032,447,8,4),(2033,447,45,4),(2034,447,29,4),(2035,448,3,4),(2036,448,4,4),(2037,448,28,4),(2038,448,8,4),(2039,448,45,4),(2040,448,29,4),(2041,450,28,4),(2042,450,8,4),(2043,450,45,4),(2044,450,29,4),(2045,450,39,5),(2046,449,3,4),(2047,449,4,4),(2048,449,28,4),(2049,449,8,4),(2050,449,45,4),(2051,449,29,4),(2052,451,3,4),(2053,451,4,4),(2054,451,28,4),(2055,451,29,4),(2056,451,45,4),(2057,452,3,4),(2058,452,4,4),(2059,452,28,4),(2060,452,8,4),(2061,452,19,4),(2062,452,29,4),(2063,452,45,4),(2064,452,29,4),(2065,453,3,4),(2066,453,4,4),(2067,453,28,4),(2068,453,29,4),(2069,453,45,4),(2070,454,3,4),(2071,454,4,4),(2072,454,28,4),(2073,454,8,4),(2074,454,45,4),(2075,454,29,4),(2076,455,3,4),(2077,455,4,4),(2078,455,28,4),(2079,455,8,4),(2080,455,45,4),(2081,455,29,4),(2082,455,22,4),(2083,455,28,4),(2084,456,3,4),(2085,456,4,4),(2086,456,28,4),(2087,456,8,4),(2088,456,45,4),(2089,456,29,4),(2090,457,3,4),(2091,457,4,4),(2092,457,28,4),(2093,457,29,4),(2094,457,45,4),(2095,458,3,4),(2096,458,4,4),(2097,458,28,4),(2098,458,45,4),(2099,458,29,4),(2100,459,3,4),(2101,459,4,4),(2102,459,28,4),(2103,459,8,4),(2104,459,45,4),(2105,459,29,4),(2106,460,3,4),(2107,460,4,4),(2108,460,28,4),(2109,460,8,4),(2110,460,19,4),(2111,460,29,4),(2112,460,45,4),(2113,460,29,4),(2114,462,29,4),(2115,462,28,4),(2116,462,8,4),(2117,462,45,4),(2118,463,3,4),(2119,463,4,4),(2120,463,28,4),(2121,463,8,4),(2122,463,45,4),(2123,463,29,4),(2124,464,3,4),(2125,464,4,4),(2126,464,28,4),(2127,464,8,4),(2128,464,19,4),(2129,464,29,4),(2130,464,45,4),(2131,464,29,4),(2132,465,28,4),(2133,465,29,4),(2134,465,45,4),(2135,467,3,4),(2136,467,4,4),(2137,467,28,4),(2138,467,8,4),(2139,467,45,4),(2140,467,29,4),(2141,468,29,4),(2142,468,28,4),(2143,468,8,4),(2144,468,45,4),(2145,470,3,4),(2146,470,4,4),(2147,470,28,4),(2148,470,45,4),(2149,470,29,4),(2150,471,3,4),(2151,471,4,4),(2152,471,28,4),(2153,471,45,4),(2154,471,29,4),(2155,473,3,4),(2156,473,4,4),(2157,473,28,4),(2158,473,8,4),(2159,473,45,4),(2160,473,29,4),(2161,474,3,4),(2162,474,4,4),(2163,474,28,4),(2164,474,8,4),(2165,474,45,4),(2166,474,29,4),(2167,475,3,4),(2168,475,4,4),(2169,475,28,4),(2170,475,8,4),(2171,475,45,4),(2172,475,29,4),(2173,476,3,4),(2174,476,4,4),(2175,476,28,4),(2176,476,8,4),(2177,476,19,4),(2178,476,29,4),(2179,476,45,4),(2180,476,29,4),(2181,477,3,4),(2182,477,4,4),(2183,477,28,4),(2184,477,8,4),(2185,477,19,4),(2186,477,29,4),(2187,477,45,4),(2188,477,29,4),(2189,478,3,4),(2190,478,4,4),(2191,478,28,4),(2192,478,45,4),(2193,478,29,4),(2194,479,3,4),(2195,479,4,4),(2196,479,28,4),(2197,479,8,4),(2198,479,45,4),(2199,479,29,4),(2200,481,3,4),(2201,481,4,4),(2202,481,28,4),(2203,481,8,4),(2204,481,45,4),(2205,481,29,4),(2206,483,3,4),(2207,483,4,4),(2208,483,28,4),(2209,483,45,4),(2210,483,29,4),(2211,480,3,4),(2212,480,4,4),(2213,480,28,4),(2214,480,29,4),(2215,480,45,4),(2216,484,3,4),(2217,484,4,4),(2218,484,28,4),(2219,484,45,4),(2220,484,29,4),(2221,485,3,4),(2222,485,4,4),(2223,485,28,4),(2224,485,8,4),(2225,485,45,4),(2226,485,29,4),(2227,486,3,4),(2228,486,4,4),(2229,486,28,4),(2230,486,29,4),(2231,486,45,4),(2232,487,3,4),(2233,487,4,4),(2234,487,28,4),(2235,487,8,4),(2236,487,19,4),(2237,487,29,4),(2238,487,45,4),(2239,487,29,4),(2240,488,3,4),(2241,488,4,4),(2242,488,28,4),(2243,488,29,4),(2244,488,45,4),(2245,489,3,4),(2246,489,4,4),(2247,489,28,4),(2248,489,45,4),(2249,489,29,4),(2250,490,3,4),(2251,490,4,4),(2252,490,28,4),(2253,490,45,4),(2254,490,29,4),(2255,491,3,4),(2256,491,4,4),(2257,491,28,4),(2258,491,29,4),(2259,491,45,4),(2260,492,3,4),(2261,492,4,4),(2262,492,28,4),(2263,492,8,4),(2264,492,45,4),(2265,492,29,4),(2266,494,3,4),(2267,494,4,4),(2268,494,28,4),(2269,494,29,4),(2270,494,45,4),(2271,493,3,4),(2272,493,4,4),(2273,493,28,4),(2274,493,8,4),(2275,493,19,4),(2276,493,29,4),(2277,493,45,4),(2278,493,29,4),(2279,495,3,4),(2280,495,4,4),(2281,495,28,4),(2282,495,8,4),(2283,495,19,4),(2284,495,29,4),(2285,495,45,4),(2286,495,29,4),(2287,496,3,4),(2288,496,4,4),(2289,496,28,4),(2290,496,8,4),(2291,496,45,4),(2292,496,29,4),(2293,497,18,3),(2294,497,46,4),(2295,497,28,4),(2296,497,29,4),(2297,497,8,4),(2298,497,45,4),(2299,497,22,5),(2300,497,39,5),(2301,498,28,4),(2302,498,29,4),(2303,498,8,4),(2304,498,45,4),(2305,498,22,5),(2306,498,18,5),(2307,498,46,5),(2308,498,39,5),(2309,499,3,4),(2310,499,4,4),(2311,499,28,4),(2312,499,8,4),(2313,499,19,4),(2314,499,29,4),(2315,499,45,4),(2316,499,29,4),(2317,501,3,4),(2318,501,4,4),(2319,501,28,4),(2320,501,45,4),(2321,501,29,4),(2322,503,28,4),(2323,503,29,4),(2324,503,8,4),(2325,503,45,4),(2326,503,22,5),(2327,503,18,5),(2328,503,46,5),(2329,503,39,5),(2330,518,22,5),(2331,534,45,3),(2332,535,45,3),(2333,536,29,3),(2334,536,19,4),(2335,536,8,4),(2336,536,38,5),(2337,538,19,3),(2338,538,29,4),(2339,538,8,4),(2340,538,45,5),(2341,538,38,5),(2342,537,19,3),(2343,537,29,4),(2344,537,8,4),(2345,537,45,5),(2346,537,7,5),(2347,537,38,5),(2348,539,19,3),(2349,539,29,4),(2350,539,8,4),(2351,539,45,5),(2352,539,38,5),(2353,542,19,3),(2354,542,29,4),(2355,542,8,4),(2356,542,45,5),(2357,542,7,5),(2358,542,38,5),(2359,541,29,3),(2360,541,19,4),(2361,541,8,4),(2362,541,52,4),(2363,541,7,5),(2364,541,6,5),(2365,541,6,5),(2366,541,38,5),(2367,543,19,3),(2368,543,29,4),(2369,543,8,4),(2370,543,38,5),(2371,544,29,3),(2372,544,19,4),(2373,544,8,4),(2374,544,52,4),(2375,544,6,5),(2376,544,38,5),(2377,540,29,3),(2378,540,19,4),(2379,540,8,4),(2380,540,52,4),(2381,540,45,5),(2382,540,6,5),(2383,540,38,5),(2384,545,29,3),(2385,545,19,4),(2386,545,8,4),(2387,545,52,4),(2388,545,6,5),(2389,545,38,5),(2390,546,29,3),(2391,546,19,4),(2392,546,8,4),(2393,546,52,4),(2394,546,6,5),(2395,547,19,3),(2396,549,19,3),(2397,548,19,3),(2398,550,29,3),(2399,551,29,3),(2400,552,22,2),(2401,552,19,3),(2402,552,29,4),(2403,552,8,4),(2404,552,45,4),(2405,552,12,5),(2406,552,17,5),(2407,552,28,5),(2408,552,45,5),(2409,552,38,5),(2410,552,22,5),(2411,552,22,7),(2412,553,51,3),(2413,553,28,4),(2414,553,6,4),(2415,553,39,5),(2416,554,51,3),(2417,554,28,4),(2418,554,6,4),(2419,554,29,5),(2420,554,45,5),(2421,554,39,5),(2422,555,51,3),(2423,555,28,4),(2424,555,6,4),(2425,555,39,5),(2426,559,51,3),(2427,556,51,3),(2428,556,28,4),(2429,556,6,4),(2430,556,39,5),(2431,558,51,3),(2432,558,28,4),(2433,558,6,5),(2434,557,51,3),(2435,557,28,4),(2436,557,6,4),(2437,557,29,5),(2438,557,45,5),(2439,557,39,5),(2440,560,51,3),(2441,561,51,3),(2442,561,28,4),(2443,561,6,5),(2444,561,39,5),(2445,562,6,4),(2446,562,29,4),(2447,562,45,4),(2448,562,28,4),(2449,563,6,4),(2450,563,29,4),(2451,563,45,4),(2452,563,28,4),(2453,564,6,4),(2454,564,12,5),(2455,565,6,4),(2456,567,6,4),(2457,566,6,4),(2458,566,12,5),(2459,568,6,4),(2460,569,6,4),(2461,570,6,4),(2462,570,29,4),(2463,570,45,4),(2464,570,28,4),(2465,571,6,4),(2466,571,3,5),(2467,571,39,5),(2468,572,6,4),(2469,573,6,4),(2470,573,3,5),(2471,573,39,5),(2472,574,6,4),(2473,574,3,5),(2474,574,39,5),(2475,575,6,4),(2476,576,29,4),(2477,576,45,4),(2478,576,3,5),(2479,576,39,5),(2480,576,22,5),(2481,577,6,4),(2482,578,6,4),(2483,578,29,4),(2484,579,6,4),(2485,579,22,4),(2486,579,6,4),(2487,580,6,4),(2488,582,6,4),(2489,582,29,5),(2490,582,6,5),(2491,581,6,4),(2492,583,6,4),(2493,584,6,4),(2494,585,6,4),(2495,585,6,4),(2496,585,22,4),(2497,585,28,4),(2498,585,12,4),(2499,585,6,4),(2500,586,6,4),(2501,586,29,4),(2502,587,6,4),(2503,587,29,4),(2504,588,6,4),(2505,589,6,4),(2506,589,3,5),(2507,589,39,5),(2508,590,28,4),(2509,590,8,4),(2510,590,29,4),(2511,590,45,4),(2512,590,6,5),(2513,590,39,5),(2514,591,6,4),(2515,591,3,5),(2516,591,39,5),(2517,592,28,4),(2518,592,8,4),(2519,592,29,4),(2520,592,45,4),(2521,592,6,5),(2522,592,39,5),(2523,593,6,4),(2524,594,6,4),(2525,595,6,4),(2526,596,28,4),(2527,596,8,4),(2528,596,29,4),(2529,596,45,4),(2530,596,6,5),(2531,596,39,5),(2532,597,6,4),(2533,599,6,4),(2534,599,29,4),(2535,599,45,4),(2536,599,28,4),(2537,598,6,4),(2538,598,29,4),(2539,598,45,4),(2540,598,28,4),(2541,602,6,4),(2542,603,29,4),(2543,604,29,4),(2544,604,6,4),(2545,606,29,4),(2546,605,29,4),(2547,605,3,5),(2548,605,39,5),(2549,605,22,5),(2550,608,29,4),(2551,608,6,4),(2552,608,6,4),(2553,609,29,4),(2554,609,6,4),(2555,609,6,4),(2556,609,3,5),(2557,607,29,4),(2558,607,45,4),(2559,607,3,5),(2560,607,39,5),(2561,607,22,5),(2562,611,29,4),(2563,611,6,4),(2564,611,6,4),(2565,612,6,4),(2566,613,6,4),(2567,615,6,4),(2568,614,6,4),(2569,618,6,4),(2570,617,6,4),(2571,619,6,4),(2572,619,29,4),(2573,619,45,4),(2574,619,28,4),(2575,621,6,4),(2576,620,6,4),(2577,620,29,4),(2578,620,45,4),(2579,620,28,4),(2580,622,6,4),(2581,624,6,4),(2582,624,29,4),(2583,624,45,4),(2584,624,28,4),(2585,623,6,4),(2586,623,22,5),(2587,623,43,5),(2588,623,29,5),(2589,623,6,5),(2590,628,6,4),(2591,628,22,5),(2592,628,43,5),(2593,626,6,4),(2594,627,6,4),(2595,627,22,5),(2596,627,43,5),(2597,627,29,5),(2598,627,6,5),(2599,625,6,4),(2600,625,29,4),(2601,625,45,4),(2602,625,28,4),(2603,629,6,4),(2604,629,29,4),(2605,629,45,4),(2606,629,28,4),(2607,630,6,4),(2608,630,29,4),(2609,630,45,4),(2610,630,28,4),(2611,631,6,4),(2612,631,29,4),(2613,631,45,4),(2614,631,28,4),(2615,632,6,4),(2616,632,22,5),(2617,632,29,5),(2618,632,6,5),(2619,632,43,5),(2620,632,11,5),(2621,632,48,5),(2622,633,6,4),(2623,633,29,4),(2624,633,45,4),(2625,633,28,4),(2626,634,6,4),(2627,634,22,5),(2628,634,29,5),(2629,634,6,5),(2630,634,43,5),(2631,634,11,5),(2632,634,48,5),(2633,635,6,4),(2634,635,29,4),(2635,635,45,4),(2636,635,28,4),(2637,636,6,4),(2638,636,22,5),(2639,636,29,5),(2640,636,6,5),(2641,636,43,5),(2642,636,11,5),(2643,636,48,5),(2644,638,6,4),(2645,638,29,4),(2646,638,45,4),(2647,638,28,4),(2648,639,6,4),(2649,639,22,5),(2650,639,29,5),(2651,639,6,5),(2652,639,43,5),(2653,639,11,5),(2654,639,48,5),(2655,639,3,5),(2656,639,39,5),(2657,640,6,4),(2658,640,22,5),(2659,642,29,3),(2660,645,6,4),(2661,646,6,4),(2662,649,6,4),(2663,648,6,4),(2664,647,6,4),(2665,647,6,4),(2666,647,22,5),(2667,650,6,4),(2668,650,6,4),(2669,650,22,5),(2670,651,6,4),(2671,651,3,5),(2672,651,39,5),(2673,652,6,4),(2674,655,6,4),(2675,655,3,5),(2676,655,39,5),(2677,653,6,4),(2678,653,3,5),(2679,653,39,5),(2680,653,22,5),(2681,654,6,4),(2682,654,6,4),(2683,654,22,4),(2684,654,28,4),(2685,654,12,4),(2686,654,6,4),(2687,656,6,4),(2688,657,6,4),(2689,658,6,4),(2690,659,6,4),(2691,661,6,4),(2692,662,6,4),(2693,663,6,4),(2694,660,6,4),(2695,665,6,4),(2696,664,6,4),(2697,668,6,4),(2698,666,6,4),(2699,667,6,4),(2700,669,6,4),(2701,670,6,4),(2702,671,29,3),(2703,671,45,3),(2704,677,29,3),(2705,678,29,3),(2706,678,45,3),(2707,679,6,3),(2708,679,6,5),(2709,680,6,3),(2710,680,6,5),(2711,681,6,3),(2712,681,6,5),(2713,685,6,3),(2714,685,6,4),(2715,685,22,4),(2716,682,6,3),(2717,682,6,5),(2718,683,6,3),(2719,683,6,5),(2720,686,6,3),(2721,686,6,5),(2722,687,6,3),(2723,687,29,4),(2724,687,6,4),(2725,687,22,5),(2726,687,43,5),(2727,689,22,4),(2728,689,29,5),(2729,689,6,5),(2730,690,22,4),(2731,690,28,5),(2732,690,8,5),(2733,690,45,5),(2734,690,29,5),(2735,690,6,5),(2736,691,18,4),(2737,691,46,4),(2738,691,22,4),(2739,693,22,4),(2740,692,18,4),(2741,692,46,4),(2742,692,22,4),(2743,692,6,5),(2744,692,6,5),(2745,692,7,5),(2746,692,29,5),(2747,692,6,5),(2748,694,18,4),(2749,694,46,4),(2750,694,22,4),(2751,695,18,4),(2752,695,46,4),(2753,695,22,4),(2754,696,22,4),(2755,698,22,4),(2756,698,8,5),(2757,698,45,5),(2758,698,28,5),(2759,698,29,5),(2760,699,22,4),(2761,697,22,4),(2762,697,18,5),(2763,697,46,5),(2764,697,28,5),(2765,697,8,5),(2766,697,45,5),(2767,697,29,5),(2768,697,6,5),(2769,700,22,4),(2770,700,29,5),(2771,700,6,5),(2772,701,22,4),(2773,701,28,5),(2774,701,8,5),(2775,702,22,4),(2776,702,18,5),(2777,702,46,5),(2778,702,28,5),(2779,702,8,5),(2780,702,45,5),(2781,702,29,5),(2782,702,6,5),(2783,703,22,4),(2784,703,18,5),(2785,703,46,5),(2786,703,28,5),(2787,703,8,5),(2788,703,45,5),(2789,703,29,5),(2790,703,6,5),(2791,704,18,4),(2792,704,46,4),(2793,704,22,4),(2794,704,6,5),(2795,704,6,5),(2796,704,7,5),(2797,704,29,5),(2798,704,6,5),(2799,705,22,4),(2800,705,28,5),(2801,705,8,5),(2802,707,22,4),(2803,707,46,4),(2804,707,28,5),(2805,707,8,5),(2806,708,18,4),(2807,708,46,4),(2808,708,22,4),(2809,708,29,5),(2810,708,6,5),(2811,706,18,4),(2812,706,46,4),(2813,706,22,4),(2814,706,43,5),(2815,706,28,5),(2816,706,8,5),(2817,709,22,4),(2818,709,46,5),(2819,709,28,5),(2820,709,8,5),(2821,711,22,4),(2822,710,22,4),(2823,710,46,5),(2824,710,28,5),(2825,710,8,5),(2826,712,22,4),(2827,712,29,5),(2828,712,6,5),(2829,712,43,5),(2830,712,12,5),(2831,713,22,4),(2832,713,28,5),(2833,713,8,5),(2834,716,22,4),(2835,716,28,5),(2836,716,8,5),(2837,715,22,4),(2838,715,28,5),(2839,715,8,5),(2840,714,18,4),(2841,714,46,4),(2842,714,22,4),(2843,714,28,5),(2844,714,8,5),(2845,717,22,4),(2846,717,46,4),(2847,717,17,5),(2848,717,28,5),(2849,717,8,5),(2850,718,22,4),(2851,719,22,4),(2852,720,22,4),(2853,720,6,5),(2854,721,18,4),(2855,721,46,4),(2856,721,22,4),(2857,721,6,5),(2858,722,18,4),(2859,722,46,4),(2860,722,22,4),(2861,722,6,5),(2862,723,22,4),(2863,724,22,4),(2864,724,6,5),(2865,725,22,4),(2866,727,18,4),(2867,727,46,4),(2868,727,22,4),(2869,727,6,5),(2870,728,18,4),(2871,728,46,4),(2872,728,22,4),(2873,728,6,5),(2874,726,18,4),(2875,726,46,4),(2876,726,22,4),(2877,726,6,4),(2878,726,6,5),(2879,729,18,4),(2880,729,46,4),(2881,729,22,4),(2882,729,28,4),(2883,729,8,4),(2884,729,45,4),(2885,729,29,4),(2886,729,6,5),(2887,730,18,4),(2888,730,46,4),(2889,730,22,4),(2890,730,29,5),(2891,731,18,4),(2892,731,46,4),(2893,731,22,4),(2894,731,29,5),(2895,733,18,4),(2896,733,46,4),(2897,733,22,4),(2898,733,43,5),(2899,733,28,5),(2900,733,8,5),(2901,732,18,4),(2902,732,46,4),(2903,732,22,4),(2904,732,8,5),(2905,732,29,5),(2906,732,6,5),(2907,735,22,3),(2908,736,22,3),(2909,736,28,4),(2910,736,6,5),(2911,734,18,4),(2912,734,46,4),(2913,734,22,4),(2914,737,22,3),(2915,737,28,4),(2916,738,22,3),(2917,738,46,5),(2918,738,28,5),(2919,738,8,5),(2920,739,18,4),(2921,739,46,4),(2922,739,22,4),(2923,739,43,5),(2924,739,28,5),(2925,739,8,5),(2926,741,22,3),(2927,741,28,4),(2928,740,22,3),(2929,740,18,4),(2930,740,46,4),(2931,740,6,5),(2932,742,22,3),(2933,744,22,4),(2934,745,22,4),(2935,743,22,3),(2936,743,18,4),(2937,743,46,4),(2938,743,6,5),(2939,746,22,3),(2940,746,18,4),(2941,746,46,4),(2942,746,6,5),(2943,748,22,3),(2944,747,22,4),(2945,749,22,3),(2946,749,18,4),(2947,749,46,4),(2948,749,6,5),(2949,750,22,4),(2950,750,39,5),(2951,751,18,4),(2952,751,46,4),(2953,751,22,4),(2954,752,22,4),(2955,752,6,5),(2956,753,22,4),(2957,755,22,4),(2958,755,6,5),(2959,757,18,4),(2960,757,46,4),(2961,757,22,4),(2962,757,43,4),(2963,756,18,4),(2964,756,46,4),(2965,756,22,4),(2966,754,22,4),(2967,759,18,4),(2968,759,46,4),(2969,759,22,4),(2970,759,43,5),(2971,759,28,5),(2972,759,8,5),(2973,758,18,4),(2974,758,46,4),(2975,758,22,4),(2976,758,43,5),(2977,758,28,5),(2978,758,8,5),(2979,760,18,4),(2980,760,46,4),(2981,760,22,4),(2982,760,8,5),(2983,760,29,5),(2984,760,6,5),(2985,761,18,4),(2986,761,46,4),(2987,761,22,4),(2988,761,43,5),(2989,761,28,5),(2990,761,8,5),(2991,765,18,4),(2992,765,46,4),(2993,765,22,4),(2994,765,6,5),(2995,762,18,4),(2996,762,46,4),(2997,762,22,4),(2998,762,29,5),(2999,766,18,4),(3000,766,46,4),(3001,766,22,4),(3002,766,6,5),(3003,763,18,4),(3004,763,46,4),(3005,763,22,4),(3006,763,43,4),(3007,763,8,5),(3008,763,29,5),(3009,763,6,5),(3010,764,18,4),(3011,764,46,4),(3012,764,22,4),(3013,764,29,5),(3014,767,18,4),(3015,767,46,4),(3016,767,22,4),(3017,768,18,4),(3018,768,46,4),(3019,768,22,4),(3020,768,6,5),(3021,769,18,4),(3022,769,46,4),(3023,769,22,4),(3024,769,6,5),(3025,771,45,2),(3026,771,22,4),(3027,771,18,4),(3028,771,46,4),(3029,771,28,5),(3030,771,6,5),(3031,771,6,5),(3032,771,43,5),(3033,771,45,5),(3034,771,45,7),(3035,772,18,4),(3036,772,46,4),(3037,772,22,4),(3038,772,6,5),(3039,774,18,4),(3040,774,46,4),(3041,774,22,4),(3042,773,22,2),(3043,773,22,4),(3044,773,18,4),(3045,773,46,4),(3046,773,12,4),(3047,773,17,4),(3048,773,29,5),(3049,773,28,5),(3050,773,6,5),(3051,773,45,5),(3052,773,22,5),(3053,773,22,7),(3054,776,45,2),(3055,776,22,4),(3056,776,18,4),(3057,776,46,4),(3058,776,43,5),(3059,776,28,5),(3060,776,6,5),(3061,776,6,5),(3062,776,45,5),(3063,776,45,7),(3064,778,45,2),(3065,778,22,5),(3066,778,18,5),(3067,778,43,5),(3068,778,46,5),(3069,778,28,5),(3070,778,6,5),(3071,778,45,5),(3072,778,45,7),(3073,783,22,3),(3074,783,28,4),(3075,783,12,5),(3076,783,12,5),(3077,784,22,3),(3078,784,28,4),(3079,784,45,5),(3080,784,6,5),(3081,784,8,5),(3082,784,29,5),(3083,784,28,5),(3084,789,22,3),(3085,789,28,4),(3086,787,22,3),(3087,787,18,5),(3088,787,46,5),(3089,787,28,5),(3090,787,8,5),(3091,787,45,5),(3092,787,29,5),(3093,787,6,5),(3094,785,22,3),(3095,785,28,4),(3096,785,29,5),(3097,785,6,5),(3098,785,45,5),(3099,785,7,5),(3100,785,8,5),(3101,788,22,3),(3102,788,28,4),(3103,788,28,5),(3104,788,29,5),(3105,788,45,5),(3106,788,3,5),(3107,788,4,5),(3108,790,22,3),(3109,790,28,4),(3110,790,12,5),(3111,790,29,5),(3112,790,45,5),(3113,790,7,5),(3114,790,8,5),(3115,791,22,3),(3116,791,12,4),(3117,791,6,4),(3118,791,28,4),(3119,791,29,5),(3120,791,45,5),(3121,791,7,5),(3122,791,8,5),(3123,793,22,3),(3124,793,12,4),(3125,793,6,4),(3126,793,28,4),(3127,793,29,5),(3128,793,45,5),(3129,793,8,5),(3130,793,28,5),(3131,792,22,3),(3132,792,12,4),(3133,792,6,4),(3134,792,28,4),(3135,792,6,5),(3136,792,45,5),(3137,792,8,5),(3138,792,7,5),(3139,792,52,5),(3140,792,43,5),(3141,792,12,5),(3142,792,11,5),(3143,792,48,5),(3144,794,22,3),(3145,794,28,4),(3146,794,12,5),(3147,794,12,5),(3148,795,22,3),(3149,795,28,4),(3150,795,12,5),(3151,795,29,5),(3152,795,45,5),(3153,795,7,5),(3154,795,8,5),(3155,796,22,3),(3156,796,28,4),(3157,796,28,5),(3158,796,45,5),(3159,800,22,3),(3160,800,28,4),(3161,800,12,5),(3162,800,12,5),(3163,797,22,3),(3164,797,46,5),(3165,797,28,5),(3166,797,8,5),(3167,801,22,3),(3168,801,28,4),(3169,801,12,5),(3170,801,12,5),(3171,802,22,3),(3172,802,28,4),(3173,802,29,5),(3174,802,6,5),(3175,802,45,5),(3176,802,8,5),(3177,803,22,3),(3178,803,28,4),(3179,799,22,3),(3180,799,28,4),(3181,799,29,5),(3182,799,6,5),(3183,799,45,5),(3184,799,8,5),(3185,799,12,5),(3186,805,22,3),(3187,805,28,4),(3188,805,29,5),(3189,805,6,5),(3190,806,22,3),(3191,806,18,4),(3192,806,46,4),(3193,806,28,5),(3194,806,8,5),(3195,808,22,3),(3196,808,28,5),(3197,808,8,5),(3198,809,22,3),(3199,809,28,4),(3200,809,12,5),(3201,809,12,5),(3202,812,22,3),(3203,812,28,4),(3204,812,12,5),(3205,812,12,5),(3206,810,22,3),(3207,810,28,4),(3208,810,45,5),(3209,810,8,5),(3210,811,22,3),(3211,811,28,4),(3212,811,45,5),(3213,811,8,5),(3214,813,22,3),(3215,813,28,4),(3216,813,12,5),(3217,813,29,5),(3218,813,45,5),(3219,813,7,5),(3220,813,8,5),(3221,817,22,3),(3222,817,28,4),(3223,826,22,4),(3224,826,17,4),(3225,826,12,4),(3226,826,45,5),(3227,827,22,3),(3228,827,28,4),(3229,827,45,5),(3230,827,8,5),(3231,829,22,3),(3232,829,28,4),(3233,829,45,5),(3234,829,8,5),(3235,828,22,3),(3236,828,12,4),(3237,828,12,4),(3238,828,28,4),(3239,828,16,4),(3240,828,12,4),(3241,828,7,4),(3242,828,52,4),(3243,828,28,5),(3244,828,29,5),(3245,830,22,3),(3246,830,12,4),(3247,830,12,4),(3248,830,28,4),(3249,830,16,4),(3250,830,12,4),(3251,830,7,4),(3252,830,52,4),(3253,830,28,5),(3254,830,29,5),(3255,831,22,3),(3256,831,12,4),(3257,831,12,4),(3258,831,28,4),(3259,831,12,4),(3260,831,7,4),(3261,831,52,4),(3262,831,28,5),(3263,831,29,5),(3264,832,22,3),(3265,832,28,4),(3266,834,22,3),(3267,834,28,4),(3268,834,6,5),(3269,835,22,3),(3270,835,18,4),(3271,835,46,4),(3272,835,6,5),(3273,836,22,3),(3274,836,18,4),(3275,836,46,4),(3276,836,6,5),(3277,833,22,3),(3278,833,28,4),(3279,833,6,5),(3280,833,6,5),(3281,833,43,5),(3282,833,18,5),(3283,833,46,5),(3284,838,22,3),(3285,838,28,4),(3286,838,6,5),(3287,837,22,3),(3288,837,18,4),(3289,837,46,4),(3290,837,6,5),(3291,839,22,3),(3292,839,18,4),(3293,839,46,4),(3294,839,6,5),(3295,841,22,3),(3296,840,22,3),(3297,842,22,3),(3298,842,28,4),(3299,842,12,4),(3300,842,12,4),(3301,842,16,4),(3302,842,12,4),(3303,842,6,5),(3304,842,7,5),(3305,842,52,5),(3306,842,3,5),(3307,842,4,5),(3308,842,39,5),(3309,842,28,5),(3310,842,45,5),(3311,843,22,3),(3312,843,28,4),(3313,844,22,3),(3314,844,12,4),(3315,844,12,4),(3316,844,28,4),(3317,844,16,4),(3318,844,12,4),(3319,844,7,4),(3320,844,52,4),(3321,844,28,5),(3322,844,29,5),(3323,845,22,2),(3324,845,22,3),(3325,845,28,4),(3326,845,12,4),(3327,845,12,4),(3328,845,12,5),(3329,845,17,5),(3330,845,29,5),(3331,845,45,5),(3332,845,7,5),(3333,845,8,5),(3334,845,22,5),(3335,845,22,7),(3336,846,22,3),(3337,847,45,2),(3338,847,22,3),(3339,847,18,4),(3340,847,46,4),(3341,847,28,5),(3342,847,6,5),(3343,847,6,5),(3344,847,43,5),(3345,847,45,5),(3346,847,45,7),(3347,848,22,3),(3348,848,28,4),(3349,849,22,3),(3350,850,22,3),(3351,851,22,3),(3352,852,22,3),(3353,853,22,2),(3354,853,22,3),(3355,853,12,5),(3356,853,12,5),(3357,853,28,5),(3358,853,16,5),(3359,853,12,5),(3360,853,28,5),(3361,853,29,5),(3362,853,22,5),(3363,853,22,7),(3364,854,22,2),(3365,854,22,3),(3366,854,12,5),(3367,854,12,5),(3368,854,28,5),(3369,854,12,5),(3370,854,28,5),(3371,854,29,5),(3372,854,22,5),(3373,854,22,7),(3374,855,12,4),(3375,855,17,4),(3376,855,28,5),(3377,855,8,5),(3378,855,3,5),(3379,855,4,5),(3380,855,29,5),(3381,855,45,5),(3382,856,22,2),(3383,856,12,4),(3384,856,17,4),(3385,856,43,5),(3386,856,22,5),(3387,856,22,7),(3388,857,22,2),(3389,857,12,4),(3390,857,43,4),(3391,857,17,4),(3392,857,48,4),(3393,857,17,5),(3394,857,11,5),(3395,857,45,5),(3396,857,22,5),(3397,857,17,6),(3398,857,11,6),(3399,857,22,7),(3400,860,12,4),(3401,860,17,4),(3402,860,28,5),(3403,860,8,5),(3404,860,3,5),(3405,860,4,5),(3406,860,29,5),(3407,860,45,5),(3408,859,22,2),(3409,859,12,4),(3410,859,43,4),(3411,859,48,4),(3412,859,17,5),(3413,859,11,5),(3414,859,45,5),(3415,859,22,5),(3416,859,17,6),(3417,859,11,6),(3418,859,22,7),(3419,858,12,4),(3420,858,17,4),(3421,858,28,5),(3422,858,8,5),(3423,858,3,5),(3424,858,4,5),(3425,858,29,5),(3426,858,45,5),(3427,861,12,4),(3428,861,17,4),(3429,861,28,5),(3430,861,8,5),(3431,861,3,5),(3432,861,4,5),(3433,861,29,5),(3434,861,45,5),(3435,862,22,2),(3436,862,12,4),(3437,862,43,4),(3438,862,17,4),(3439,862,48,4),(3440,862,17,5),(3441,862,11,5),(3442,862,45,5),(3443,862,22,5),(3444,862,17,6),(3445,862,11,6),(3446,862,22,7),(3447,864,22,2),(3448,864,12,4),(3449,864,43,4),(3450,864,17,4),(3451,864,48,4),(3452,864,17,5),(3453,864,11,5),(3454,864,45,5),(3455,864,22,5),(3456,864,17,6),(3457,864,11,6),(3458,864,22,7),(3459,863,22,2),(3460,863,12,4),(3461,863,43,4),(3462,863,48,4),(3463,863,17,5),(3464,863,11,5),(3465,863,45,5),(3466,863,22,5),(3467,863,17,6),(3468,863,11,6),(3469,863,22,7),(3470,865,22,2),(3471,865,12,4),(3472,865,43,4),(3473,865,17,4),(3474,865,48,4),(3475,865,17,5),(3476,865,11,5),(3477,865,45,5),(3478,865,22,5),(3479,865,17,6),(3480,865,11,6),(3481,865,22,7),(3482,866,22,2),(3483,866,12,4),(3484,866,17,4),(3485,866,43,5),(3486,866,45,5),(3487,866,22,5),(3488,866,22,7),(3489,867,22,2),(3490,867,12,4),(3491,867,17,4),(3492,867,43,5),(3493,867,45,5),(3494,867,22,7),(3495,868,22,2),(3496,868,22,2),(3497,868,12,4),(3498,868,43,4),(3499,868,48,4),(3500,868,17,5),(3501,868,11,5),(3502,868,45,5),(3503,868,22,5),(3504,868,22,5),(3505,868,17,6),(3506,868,11,6),(3507,868,22,7),(3508,868,22,7),(3509,869,22,2),(3510,869,12,4),(3511,869,17,4),(3512,869,43,5),(3513,869,45,5),(3514,869,22,5),(3515,869,22,7),(3516,872,22,2),(3517,872,17,4),(3518,872,12,4),(3519,872,45,5),(3520,872,22,7),(3521,870,22,2),(3522,870,17,4),(3523,870,12,4),(3524,870,45,5),(3525,870,22,5),(3526,870,22,7),(3527,871,22,2),(3528,871,17,4),(3529,871,12,4),(3530,871,45,5),(3531,871,22,5),(3532,871,22,7),(3533,874,22,2),(3534,874,17,4),(3535,874,12,4),(3536,874,45,5),(3537,874,22,5),(3538,874,22,7),(3539,873,22,2),(3540,873,12,4),(3541,873,43,4),(3542,873,48,4),(3543,873,17,5),(3544,873,11,5),(3545,873,45,5),(3546,873,22,5),(3547,873,17,6),(3548,873,11,6),(3549,873,22,7),(3550,876,12,5),(3551,877,43,5),(3552,877,12,5),(3553,877,17,5),(3554,878,22,2),(3555,878,12,4),(3556,878,17,4),(3557,878,43,5),(3558,878,45,5),(3559,878,22,5),(3560,878,22,7),(3561,879,22,2),(3562,879,17,4),(3563,879,12,4),(3564,879,45,5),(3565,879,22,5),(3566,879,22,7),(3567,880,22,2),(3568,880,12,4),(3569,880,43,4),(3570,880,17,4),(3571,880,48,4),(3572,880,17,5),(3573,880,11,5),(3574,880,45,5),(3575,880,22,5),(3576,880,17,6),(3577,880,11,6),(3578,880,22,7),(3579,881,22,2),(3580,881,12,4),(3581,881,17,4),(3582,881,43,5),(3583,881,45,5),(3584,881,22,5),(3585,881,22,7),(3586,884,22,2),(3587,884,12,4),(3588,884,17,4),(3589,884,43,5),(3590,884,22,5),(3591,884,22,7),(3592,885,22,2),(3593,885,17,4),(3594,885,12,4),(3595,885,45,5),(3596,885,22,5),(3597,885,22,7),(3598,886,12,4),(3599,886,17,4),(3600,888,12,4),(3601,888,17,4),(3602,889,12,4),(3603,889,17,4),(3604,891,12,4),(3605,891,17,4),(3606,892,49,5),(3607,893,6,5),(3608,893,7,5),(3609,893,49,5),(3610,895,49,5),(3611,896,22,2),(3612,896,12,4),(3613,896,6,4),(3614,896,7,4),(3615,896,17,5),(3616,896,12,5),(3617,896,12,5),(3618,896,6,5),(3619,896,22,5),(3620,896,17,6),(3621,896,22,7),(3622,897,22,2),(3623,897,12,4),(3624,897,6,4),(3625,897,7,4),(3626,897,12,5),(3627,897,12,5),(3628,897,6,5),(3629,897,22,5),(3630,897,17,6),(3631,897,22,7),(3632,898,17,4),(3633,898,12,4),(3634,898,28,4),(3635,898,8,4),(3636,898,45,4),(3637,898,29,4),(3638,898,45,5),(3639,900,12,4),(3640,900,17,4),(3641,899,22,2),(3642,899,12,4),(3643,899,6,4),(3644,899,7,4),(3645,899,17,4),(3646,899,6,5),(3647,899,22,7),(3648,901,22,2),(3649,901,12,4),(3650,901,6,4),(3651,901,7,4),(3652,901,17,4),(3653,901,6,5),(3654,901,22,7),(3655,904,12,4),(3656,904,17,4),(3657,903,12,4),(3658,903,17,4),(3659,903,6,5),(3660,903,7,5),(3661,903,49,5),(3662,902,12,4),(3663,902,17,4),(3664,902,6,5),(3665,902,7,5),(3666,902,49,5),(3667,905,12,4),(3668,905,17,4),(3669,907,22,2),(3670,907,12,5),(3671,907,17,5),(3672,907,45,5),(3673,907,22,5),(3674,907,22,7),(3675,912,45,3),(3676,915,22,2),(3677,915,12,5),(3678,915,43,5),(3679,915,22,7),(3680,913,22,2),(3681,913,17,4),(3682,913,12,4),(3683,913,6,5),(3684,913,7,5),(3685,913,52,5),(3686,913,6,5),(3687,913,22,5),(3688,913,22,7),(3689,919,22,2),(3690,919,12,3),(3691,919,17,4),(3692,919,22,5),(3693,919,22,7),(3694,926,22,2),(3695,926,12,3),(3696,926,17,4),(3697,926,43,5),(3698,926,45,5),(3699,926,12,5),(3700,926,12,5),(3701,926,22,5),(3702,926,12,5),(3703,926,22,5),(3704,926,22,7),(3705,929,22,2),(3706,929,12,3),(3707,929,17,4),(3708,929,43,5),(3709,929,45,5),(3710,929,22,5),(3711,929,22,7),(3712,930,22,2),(3713,930,12,3),(3714,930,43,4),(3715,930,17,5),(3716,930,22,5),(3717,930,17,6),(3718,930,22,7),(3719,931,12,3),(3720,931,43,4),(3721,931,48,4),(3722,931,17,5),(3723,931,11,5),(3724,931,12,5),(3725,931,12,5),(3726,931,17,6),(3727,931,11,6),(3728,933,12,3),(3729,933,43,4),(3730,933,48,4),(3731,933,12,5),(3732,933,12,5),(3733,933,22,5),(3734,933,17,6),(3735,933,11,6),(3736,932,12,3),(3737,932,43,4),(3738,932,48,4),(3739,932,17,5),(3740,932,11,5),(3741,932,6,5),(3742,932,12,5),(3743,932,12,5),(3744,932,22,5),(3745,932,17,6),(3746,932,11,6),(3747,934,12,3),(3748,934,43,4),(3749,934,48,4),(3750,934,17,5),(3751,934,11,5),(3752,934,12,5),(3753,934,12,5),(3754,934,22,5),(3755,934,17,6),(3756,934,11,6),(3757,936,22,2),(3758,936,12,3),(3759,936,43,4),(3760,936,48,4),(3761,936,17,5),(3762,936,11,5),(3763,936,22,5),(3764,936,17,6),(3765,936,11,6),(3766,936,22,7),(3767,935,12,3),(3768,935,43,4),(3769,935,1,4),(3770,935,48,4),(3771,935,17,5),(3772,935,11,5),(3773,935,6,5),(3774,935,12,5),(3775,935,12,5),(3776,935,22,5),(3777,935,17,6),(3778,935,11,6),(3779,937,12,3),(3780,937,43,4),(3781,937,48,4),(3782,937,17,5),(3783,937,11,5),(3784,937,6,5),(3785,937,12,5),(3786,937,12,5),(3787,937,22,5),(3788,937,17,6),(3789,937,11,6),(3790,938,12,3),(3791,938,43,4),(3792,938,48,4),(3793,938,12,5),(3794,938,12,5),(3795,938,17,6),(3796,938,11,6),(3797,939,22,2),(3798,939,12,3),(3799,939,43,4),(3800,939,48,4),(3801,939,17,5),(3802,939,11,5),(3803,939,22,5),(3804,939,17,6),(3805,939,11,6),(3806,939,22,7),(3807,940,22,2),(3808,940,12,3),(3809,940,43,4),(3810,940,48,4),(3811,940,17,5),(3812,940,11,5),(3813,940,22,5),(3814,940,17,6),(3815,940,11,6),(3816,940,22,7),(3817,941,22,2),(3818,941,12,3),(3819,941,43,4),(3820,941,48,4),(3821,941,17,5),(3822,941,11,5),(3823,941,22,5),(3824,941,17,6),(3825,941,11,6),(3826,941,22,7),(3827,942,22,2),(3828,942,12,3),(3829,942,43,4),(3830,942,48,4),(3831,942,17,5),(3832,942,11,5),(3833,942,22,5),(3834,942,17,6),(3835,942,11,6),(3836,942,22,7),(3837,943,22,2),(3838,943,12,3),(3839,943,43,4),(3840,943,48,4),(3841,943,17,5),(3842,943,11,5),(3843,943,22,5),(3844,943,17,6),(3845,943,11,6),(3846,943,22,7),(3847,945,22,2),(3848,945,12,3),(3849,945,43,4),(3850,945,48,4),(3851,945,17,5),(3852,945,11,5),(3853,945,22,5),(3854,945,17,6),(3855,945,11,6),(3856,945,22,7),(3857,944,22,2),(3858,944,12,3),(3859,944,43,4),(3860,944,48,4),(3861,944,17,5),(3862,944,11,5),(3863,944,6,5),(3864,944,7,5),(3865,944,52,5),(3866,944,6,5),(3867,944,3,5),(3868,944,4,5),(3869,944,22,5),(3870,944,17,6),(3871,944,11,6),(3872,944,22,7),(3873,946,22,2),(3874,946,12,3),(3875,946,43,4),(3876,946,48,4),(3877,946,17,5),(3878,946,11,5),(3879,946,22,5),(3880,946,17,6),(3881,946,11,6),(3882,946,22,7),(3883,947,22,2),(3884,947,12,3),(3885,947,43,4),(3886,947,48,4),(3887,947,17,5),(3888,947,11,5),(3889,947,22,5),(3890,947,17,6),(3891,947,11,6),(3892,947,22,7),(3893,948,22,2),(3894,948,12,3),(3895,948,43,4),(3896,948,48,4),(3897,948,17,5),(3898,948,11,5),(3899,948,6,5),(3900,948,7,5),(3901,948,52,5),(3902,948,6,5),(3903,948,22,5),(3904,948,17,6),(3905,948,11,6),(3906,948,22,7),(3907,949,22,2),(3908,949,12,3),(3909,949,43,4),(3910,949,48,4),(3911,949,11,4),(3912,949,17,5),(3913,949,11,5),(3914,949,12,5),(3915,949,12,5),(3916,949,22,5),(3917,949,22,5),(3918,949,17,6),(3919,949,11,6),(3920,949,22,7),(3921,950,12,3),(3922,950,43,4),(3923,950,48,4),(3924,950,12,5),(3925,950,12,5),(3926,950,22,5),(3927,950,17,6),(3928,950,11,6),(3929,952,22,2),(3930,952,12,3),(3931,952,43,4),(3932,952,48,4),(3933,952,11,4),(3934,952,12,5),(3935,952,12,5),(3936,952,22,5),(3937,952,17,6),(3938,952,11,6),(3939,952,22,7),(3940,956,12,3),(3941,956,43,4),(3942,956,48,4),(3943,956,17,5),(3944,956,11,5),(3945,956,17,6),(3946,956,11,6),(3947,957,12,3),(3948,957,43,4),(3949,957,48,4),(3950,957,12,5),(3951,957,12,5),(3952,957,22,5),(3953,957,17,6),(3954,957,11,6),(3955,955,12,3),(3956,955,43,4),(3957,955,48,4),(3958,955,22,5),(3959,955,12,5),(3960,955,12,5),(3961,955,17,6),(3962,955,11,6),(3963,954,22,2),(3964,954,12,3),(3965,954,17,4),(3966,954,43,5),(3967,954,45,5),(3968,954,22,5),(3969,954,22,7),(3970,958,12,3),(3971,958,43,4),(3972,958,48,4),(3973,958,17,5),(3974,958,11,5),(3975,958,12,5),(3976,958,12,5),(3977,958,17,6),(3978,958,11,6),(3979,959,22,2),(3980,959,12,3),(3981,959,43,4),(3982,959,48,4),(3983,959,17,5),(3984,959,11,5),(3985,959,22,5),(3986,959,17,6),(3987,959,11,6),(3988,959,22,7),(3989,960,12,3),(3990,960,43,4),(3991,960,48,4),(3992,960,22,5),(3993,960,17,6),(3994,960,11,6),(3995,961,12,3),(3996,961,17,4),(3997,961,22,5),(3998,961,12,5),(3999,961,12,5),(4000,962,22,2),(4001,962,12,3),(4002,962,43,4),(4003,962,48,4),(4004,962,17,5),(4005,962,11,5),(4006,962,22,5),(4007,962,17,6),(4008,962,11,6),(4009,962,22,7),(4010,965,12,3),(4011,965,43,4),(4012,965,48,4),(4013,965,17,5),(4014,965,11,5),(4015,965,17,6),(4016,965,11,6),(4017,963,12,3),(4018,963,43,4),(4019,963,48,4),(4020,963,22,5),(4021,963,17,6),(4022,963,11,6),(4023,966,12,3),(4024,966,17,4),(4025,966,22,5),(4026,966,12,5),(4027,966,12,5),(4028,967,22,2),(4029,967,12,3),(4030,967,17,4),(4031,967,43,5),(4032,967,45,5),(4033,967,22,5),(4034,967,22,7),(4035,968,22,2),(4036,968,12,3),(4037,968,43,4),(4038,968,48,4),(4039,968,11,4),(4040,968,17,5),(4041,968,11,5),(4042,968,12,5),(4043,968,12,5),(4044,968,22,5),(4045,968,22,5),(4046,968,17,6),(4047,968,11,6),(4048,968,22,7),(4049,969,22,2),(4050,969,12,3),(4051,969,43,4),(4052,969,48,4),(4053,969,17,5),(4054,969,11,5),(4055,969,22,5),(4056,969,17,6),(4057,969,11,6),(4058,969,22,7),(4059,970,22,2),(4060,970,12,3),(4061,970,17,4),(4062,970,43,5),(4063,970,45,5),(4064,970,12,5),(4065,970,12,5),(4066,970,22,5),(4067,970,12,5),(4068,970,22,5),(4069,970,22,7),(4070,971,12,3),(4071,971,43,4),(4072,971,48,4),(4073,971,12,5),(4074,971,12,5),(4075,971,17,6),(4076,971,11,6),(4077,975,12,3),(4078,975,43,4),(4079,975,48,4),(4080,975,12,5),(4081,975,12,5),(4082,975,17,6),(4083,975,11,6),(4084,972,12,3),(4085,972,43,4),(4086,972,48,4),(4087,972,12,5),(4088,972,12,5),(4089,972,22,5),(4090,972,17,6),(4091,972,11,6),(4092,974,12,3),(4093,974,43,4),(4094,974,1,4),(4095,974,48,4),(4096,974,6,5),(4097,974,12,5),(4098,974,12,5),(4099,974,22,5),(4100,974,17,6),(4101,974,11,6),(4102,976,22,2),(4103,976,12,3),(4104,976,43,4),(4105,976,48,4),(4106,976,17,5),(4107,976,11,5),(4108,976,22,5),(4109,976,17,6),(4110,976,11,6),(4111,976,22,7),(4112,973,12,3),(4113,973,43,4),(4114,973,48,4),(4115,973,6,5),(4116,973,12,5),(4117,973,12,5),(4118,973,22,5),(4119,973,17,6),(4120,973,11,6),(4121,977,12,3),(4122,977,43,4),(4123,977,48,4),(4124,977,6,5),(4125,977,12,5),(4126,977,12,5),(4127,977,22,5),(4128,977,17,6),(4129,977,11,6),(4130,978,12,3),(4131,978,43,4),(4132,978,48,4),(4133,978,17,5),(4134,978,11,5),(4135,978,12,5),(4136,978,12,5),(4137,978,22,5),(4138,978,17,6),(4139,978,11,6),(4140,979,17,2),(4141,979,12,3),(4142,979,22,5),(4143,979,12,5),(4144,979,12,5),(4145,979,17,5),(4146,979,17,7),(4147,981,22,2),(4148,981,12,3),(4149,981,43,4),(4150,981,48,4),(4151,981,11,4),(4152,981,12,5),(4153,981,12,5),(4154,981,22,5),(4155,981,17,6),(4156,981,11,6),(4157,981,22,7),(4158,982,22,2),(4159,982,12,3),(4160,982,43,4),(4161,982,48,4),(4162,982,11,4),(4163,982,17,5),(4164,982,11,5),(4165,982,12,5),(4166,982,12,5),(4167,982,22,5),(4168,982,22,5),(4169,982,17,6),(4170,982,11,6),(4171,982,22,7),(4172,985,12,3),(4173,985,43,4),(4174,985,48,4),(4175,985,17,5),(4176,985,11,5),(4177,985,17,6),(4178,985,11,6),(4179,986,12,3),(4180,986,43,4),(4181,986,48,4),(4182,986,17,5),(4183,986,11,5),(4184,986,17,6),(4185,986,11,6),(4186,984,22,2),(4187,984,12,3),(4188,984,43,4),(4189,984,48,4),(4190,984,11,4),(4191,984,17,5),(4192,984,11,5),(4193,984,12,5),(4194,984,12,5),(4195,984,22,5),(4196,984,22,5),(4197,984,17,6),(4198,984,11,6),(4199,984,22,7),(4200,987,22,2),(4201,987,12,3),(4202,987,17,4),(4203,987,43,5),(4204,987,45,5),(4205,987,22,5),(4206,987,22,7),(4207,988,12,3),(4208,988,43,4),(4209,988,48,4),(4210,988,17,5),(4211,988,11,5),(4212,988,17,6),(4213,988,11,6),(4214,989,12,3),(4215,989,43,4),(4216,989,48,4),(4217,989,17,5),(4218,989,11,5),(4219,989,17,6),(4220,989,11,6),(4221,990,12,3),(4222,990,43,4),(4223,990,48,4),(4224,990,17,5),(4225,990,11,5),(4226,990,17,6),(4227,990,11,6),(4228,991,12,3),(4229,991,43,4),(4230,991,48,4),(4231,991,17,5),(4232,991,11,5),(4233,991,17,6),(4234,991,11,6),(4235,993,12,3),(4236,993,43,4),(4237,993,48,4),(4238,993,17,5),(4239,993,11,5),(4240,993,17,6),(4241,993,11,6),(4242,992,12,3),(4243,992,43,4),(4244,992,48,4),(4245,992,17,5),(4246,992,11,5),(4247,992,17,6),(4248,992,11,6),(4249,994,12,3),(4250,994,17,5),(4251,994,17,6),(4252,996,12,3),(4253,996,43,4),(4254,996,48,4),(4255,996,17,5),(4256,996,11,5),(4257,996,17,6),(4258,996,11,6),(4259,995,12,3),(4260,995,43,4),(4261,995,48,4),(4262,995,17,5),(4263,995,11,5),(4264,995,17,6),(4265,995,11,6),(4266,997,12,3),(4267,997,43,4),(4268,997,48,4),(4269,997,12,5),(4270,997,12,5),(4271,997,22,5),(4272,997,17,6),(4273,997,11,6),(4274,998,12,3),(4275,998,43,4),(4276,998,48,4),(4277,998,17,5),(4278,998,11,5),(4279,998,12,5),(4280,998,12,5),(4281,998,22,5),(4282,998,17,6),(4283,998,11,6),(4284,999,12,3),(4285,999,43,4),(4286,999,48,4),(4287,999,12,5),(4288,999,12,5),(4289,999,17,6),(4290,999,11,6),(4291,1000,12,3),(4292,1000,43,4),(4293,1000,48,4),(4294,1000,17,6),(4295,1000,11,6),(4296,1001,12,3),(4297,1001,43,4),(4298,1001,48,4),(4299,1001,12,5),(4300,1001,12,5),(4301,1001,17,6),(4302,1001,11,6),(4303,1002,12,3),(4304,1002,43,4),(4305,1002,48,4),(4306,1002,12,5),(4307,1002,12,5),(4308,1002,17,6),(4309,1002,11,6),(4310,1003,22,2),(4311,1003,12,3),(4312,1003,17,4),(4313,1003,22,5),(4314,1003,22,7),(4315,1005,12,3),(4316,1005,43,4),(4317,1005,48,4),(4318,1005,12,5),(4319,1005,12,5),(4320,1005,22,5),(4321,1005,17,6),(4322,1005,11,6),(4323,1007,12,3),(4324,1007,43,4),(4325,1007,48,4),(4326,1007,12,5),(4327,1007,12,5),(4328,1007,43,5),(4329,1007,17,6),(4330,1007,11,6),(4331,1008,22,2),(4332,1008,12,3),(4333,1008,43,4),(4334,1008,48,4),(4335,1008,17,5),(4336,1008,11,5),(4337,1008,22,5),(4338,1008,17,6),(4339,1008,11,6),(4340,1008,22,7),(4341,1004,22,2),(4342,1004,12,3),(4343,1004,43,4),(4344,1004,48,4),(4345,1004,17,5),(4346,1004,11,5),(4347,1004,22,5),(4348,1004,17,6),(4349,1004,11,6),(4350,1004,22,7),(4351,1009,17,2),(4352,1009,12,3),(4353,1009,22,5),(4354,1009,12,5),(4355,1009,12,5),(4356,1009,17,5),(4357,1009,17,7),(4358,1010,12,3),(4359,1010,43,4),(4360,1010,48,4),(4361,1010,17,5),(4362,1010,11,5),(4363,1010,17,6),(4364,1010,11,6),(4365,1011,17,2),(4366,1011,12,3),(4367,1011,22,5),(4368,1011,12,5),(4369,1011,12,5),(4370,1011,17,5),(4371,1011,17,7),(4372,1012,22,2),(4373,1012,12,3),(4374,1012,43,4),(4375,1012,48,4),(4376,1012,17,5),(4377,1012,11,5),(4378,1012,22,5),(4379,1012,17,6),(4380,1012,11,6),(4381,1012,22,7),(4382,1016,12,3),(4383,1016,22,5),(4384,1015,12,3),(4385,1014,12,3),(4386,1014,17,4),(4387,1014,22,5),(4388,1014,12,5),(4389,1014,12,5),(4390,1013,22,2),(4391,1013,12,3),(4392,1013,43,4),(4393,1013,48,4),(4394,1013,17,5),(4395,1013,11,5),(4396,1013,22,5),(4397,1013,17,6),(4398,1013,11,6),(4399,1013,22,7),(4400,1017,12,3),(4401,1017,43,4),(4402,1017,48,4),(4403,1017,17,5),(4404,1017,11,5),(4405,1017,17,6),(4406,1017,11,6),(4407,1018,17,2),(4408,1018,12,3),(4409,1018,22,5),(4410,1018,12,5),(4411,1018,12,5),(4412,1018,17,5),(4413,1018,17,7),(4414,1019,12,3),(4415,1019,22,5),(4416,1019,12,5),(4417,1019,12,5),(4418,1019,17,6),(4419,1020,17,2),(4420,1020,12,3),(4421,1020,22,5),(4422,1020,12,5),(4423,1020,12,5),(4424,1020,17,5),(4425,1020,17,7),(4426,1021,12,3),(4427,1021,43,4),(4428,1021,48,4),(4429,1021,17,5),(4430,1021,11,5),(4431,1021,17,6),(4432,1021,11,6),(4433,1022,12,3),(4434,1022,43,4),(4435,1022,48,4),(4436,1022,17,5),(4437,1022,11,5),(4438,1022,17,6),(4439,1022,11,6),(4440,1024,17,2),(4441,1024,12,3),(4442,1024,43,4),(4443,1024,22,5),(4444,1024,12,5),(4445,1024,12,5),(4446,1024,17,5),(4447,1024,17,7),(4448,1027,12,3),(4449,1027,43,4),(4450,1027,48,4),(4451,1027,17,5),(4452,1027,11,5),(4453,1027,17,6),(4454,1027,11,6),(4455,1025,17,2),(4456,1025,12,3),(4457,1025,22,5),(4458,1025,12,5),(4459,1025,12,5),(4460,1025,17,5),(4461,1025,17,7),(4462,1026,12,3),(4463,1026,43,4),(4464,1026,48,4),(4465,1026,17,5),(4466,1026,11,5),(4467,1026,17,6),(4468,1026,11,6),(4469,1023,22,2),(4470,1023,12,3),(4471,1023,43,4),(4472,1023,48,4),(4473,1023,17,5),(4474,1023,11,5),(4475,1023,22,5),(4476,1023,17,6),(4477,1023,11,6),(4478,1023,22,7),(4479,1028,12,3),(4480,1028,43,4),(4481,1028,48,4),(4482,1028,17,5),(4483,1028,11,5),(4484,1028,12,5),(4485,1028,12,5),(4486,1028,22,5),(4487,1028,17,6),(4488,1028,11,6),(4489,1029,12,3),(4490,1029,43,4),(4491,1029,48,4),(4492,1029,17,5),(4493,1029,11,5),(4494,1029,17,6),(4495,1029,11,6),(4496,1030,12,3),(4497,1030,43,4),(4498,1030,48,4),(4499,1030,17,5),(4500,1030,11,5),(4501,1030,12,5),(4502,1030,12,5),(4503,1030,22,5),(4504,1030,17,6),(4505,1030,11,6),(4506,1031,12,3),(4507,1031,43,4),(4508,1031,48,4),(4509,1031,17,5),(4510,1031,11,5),(4511,1031,17,6),(4512,1031,11,6),(4513,1032,12,3),(4514,1032,43,4),(4515,1032,48,4),(4516,1032,17,5),(4517,1032,11,5),(4518,1032,12,5),(4519,1032,12,5),(4520,1032,22,5),(4521,1032,17,6),(4522,1032,11,6),(4523,1035,12,3),(4524,1035,43,4),(4525,1035,48,4),(4526,1035,17,5),(4527,1035,11,5),(4528,1035,17,6),(4529,1035,11,6),(4530,1033,12,3),(4531,1033,43,4),(4532,1033,48,4),(4533,1033,17,5),(4534,1033,11,5),(4535,1033,17,6),(4536,1033,11,6),(4537,1036,12,3),(4538,1036,43,4),(4539,1036,48,4),(4540,1036,17,5),(4541,1036,11,5),(4542,1036,12,5),(4543,1036,12,5),(4544,1036,22,5),(4545,1036,17,6),(4546,1036,11,6),(4547,1034,12,3),(4548,1034,43,4),(4549,1034,48,4),(4550,1034,17,5),(4551,1034,11,5),(4552,1034,17,6),(4553,1034,11,6),(4554,1037,12,3),(4555,1037,43,4),(4556,1037,48,4),(4557,1037,17,5),(4558,1037,11,5),(4559,1037,17,6),(4560,1037,11,6),(4561,1038,12,3),(4562,1038,43,4),(4563,1038,48,4),(4564,1038,17,5),(4565,1038,11,5),(4566,1038,12,5),(4567,1038,12,5),(4568,1038,22,5),(4569,1039,17,2),(4570,1039,12,3),(4571,1039,43,4),(4572,1039,22,5),(4573,1039,12,5),(4574,1039,12,5),(4575,1039,17,5),(4576,1039,17,7),(4577,1040,12,3),(4578,1040,43,4),(4579,1040,48,4),(4580,1040,17,5),(4581,1040,11,5),(4582,1040,17,6),(4583,1040,11,6),(4584,1041,12,3),(4585,1041,43,4),(4586,1041,48,4),(4587,1041,17,5),(4588,1041,11,5),(4589,1041,17,6),(4590,1041,11,6),(4591,1042,12,3),(4592,1042,43,4),(4593,1042,48,4),(4594,1042,17,5),(4595,1042,11,5),(4596,1042,17,6),(4597,1042,11,6),(4598,1043,12,3),(4599,1043,43,4),(4600,1043,48,4),(4601,1043,17,5),(4602,1043,11,5),(4603,1043,12,5),(4604,1043,12,5),(4605,1043,22,5),(4606,1043,17,6),(4607,1043,11,6),(4608,1044,12,3),(4609,1044,43,4),(4610,1044,48,4),(4611,1044,17,5),(4612,1044,11,5),(4613,1044,17,6),(4614,1044,11,6),(4615,1045,12,3),(4616,1045,43,4),(4617,1045,48,4),(4618,1045,17,5),(4619,1045,11,5),(4620,1045,12,5),(4621,1045,12,5),(4622,1045,22,5),(4623,1045,17,6),(4624,1045,11,6),(4625,1046,12,3),(4626,1046,43,4),(4627,1046,48,4),(4628,1046,17,5),(4629,1046,11,5),(4630,1046,17,6),(4631,1046,11,6),(4632,1048,17,2),(4633,1048,12,3),(4634,1048,22,5),(4635,1048,12,5),(4636,1048,12,5),(4637,1048,17,5),(4638,1048,17,7),(4639,1050,12,3),(4640,1050,43,4),(4641,1050,48,4),(4642,1050,12,5),(4643,1050,12,5),(4644,1050,17,6),(4645,1050,11,6),(4646,1051,22,2),(4647,1051,12,3),(4648,1051,17,4),(4649,1051,43,5),(4650,1051,45,5),(4651,1051,22,5),(4652,1051,22,7),(4653,1053,12,3),(4654,1053,43,4),(4655,1053,48,4),(4656,1053,17,5),(4657,1053,11,5),(4658,1053,17,6),(4659,1053,11,6),(4660,1057,22,2),(4661,1057,12,3),(4662,1057,43,4),(4663,1057,48,4),(4664,1057,17,5),(4665,1057,11,5),(4666,1057,22,5),(4667,1057,17,6),(4668,1057,11,6),(4669,1057,22,7),(4670,1055,12,3),(4671,1055,43,4),(4672,1055,48,4),(4673,1055,17,5),(4674,1055,11,5),(4675,1055,12,5),(4676,1055,12,5),(4677,1055,22,5),(4678,1055,17,6),(4679,1055,11,6),(4680,1054,22,2),(4681,1054,12,3),(4682,1054,43,4),(4683,1054,48,4),(4684,1054,17,5),(4685,1054,11,5),(4686,1054,12,5),(4687,1054,12,5),(4688,1054,22,5),(4689,1054,22,5),(4690,1054,17,6),(4691,1054,11,6),(4692,1054,22,7),(4693,1056,22,2),(4694,1056,12,3),(4695,1056,43,4),(4696,1056,48,4),(4697,1056,17,5),(4698,1056,11,5),(4699,1056,22,5),(4700,1056,17,6),(4701,1056,11,6),(4702,1056,22,7),(4703,1058,22,2),(4704,1058,12,3),(4705,1058,43,4),(4706,1058,48,4),(4707,1058,17,5),(4708,1058,11,5),(4709,1058,6,5),(4710,1058,7,5),(4711,1058,6,5),(4712,1058,22,5),(4713,1058,17,6),(4714,1058,11,6),(4715,1058,22,7),(4716,1059,22,2),(4717,1059,12,3),(4718,1059,43,4),(4719,1059,48,4),(4720,1059,17,5),(4721,1059,11,5),(4722,1059,6,5),(4723,1059,7,5),(4724,1059,52,5),(4725,1059,6,5),(4726,1059,4,5),(4727,1059,3,5),(4728,1059,22,5),(4729,1059,17,6),(4730,1059,11,6),(4731,1059,22,7),(4732,1060,12,3),(4733,1060,43,4),(4734,1060,48,4),(4735,1060,17,5),(4736,1060,11,5),(4737,1060,12,5),(4738,1060,12,5),(4739,1060,22,5),(4740,1060,17,6),(4741,1060,11,6),(4742,1061,12,3),(4743,1061,43,4),(4744,1061,48,4),(4745,1061,17,5),(4746,1061,11,5),(4747,1061,17,6),(4748,1061,11,6),(4749,1062,22,2),(4750,1062,12,3),(4751,1062,17,4),(4752,1062,22,5),(4753,1062,22,7),(4754,1063,22,2),(4755,1063,12,3),(4756,1063,43,4),(4757,1063,48,4),(4758,1063,17,5),(4759,1063,11,5),(4760,1063,22,5),(4761,1063,17,6),(4762,1063,11,6),(4763,1063,22,7),(4764,1064,22,2),(4765,1064,12,3),(4766,1064,17,4),(4767,1064,22,5),(4768,1064,22,7),(4769,1065,12,3),(4770,1065,43,4),(4771,1065,48,4),(4772,1065,17,5),(4773,1065,11,5),(4774,1065,6,5),(4775,1065,12,5),(4776,1065,12,5),(4777,1065,22,5),(4778,1065,17,6),(4779,1065,11,6),(4780,1066,12,3),(4781,1066,22,5),(4782,1066,18,5),(4783,1066,46,5),(4784,1066,43,5),(4785,1067,22,2),(4786,1067,12,3),(4787,1067,43,4),(4788,1067,48,4),(4789,1067,17,5),(4790,1067,11,5),(4791,1067,12,5),(4792,1067,12,5),(4793,1067,22,5),(4794,1067,22,5),(4795,1067,17,6),(4796,1067,11,6),(4797,1067,22,7),(4798,1069,22,2),(4799,1069,12,3),(4800,1069,22,5),(4801,1069,22,7),(4802,1068,43,3),(4803,1068,12,4),(4804,1068,48,4),(4805,1068,28,4),(4806,1068,8,4),(4807,1068,17,5),(4808,1068,11,5),(4809,1068,12,5),(4810,1068,12,5),(4811,1068,22,5),(4812,1068,45,5),(4813,1068,17,6),(4814,1068,11,6),(4815,1070,22,2),(4816,1070,12,3),(4817,1070,43,4),(4818,1070,48,4),(4819,1070,17,5),(4820,1070,11,5),(4821,1070,12,5),(4822,1070,12,5),(4823,1070,22,5),(4824,1070,22,5),(4825,1070,17,6),(4826,1070,11,6),(4827,1070,22,7),(4828,1071,22,2),(4829,1071,12,3),(4830,1071,43,4),(4831,1071,48,4),(4832,1071,17,5),(4833,1071,11,5),(4834,1071,12,5),(4835,1071,12,5),(4836,1071,22,5),(4837,1071,22,5),(4838,1071,17,6),(4839,1071,11,6),(4840,1071,22,7),(4841,1073,12,3),(4842,1073,43,4),(4843,1073,48,4),(4844,1073,17,5),(4845,1073,11,5),(4846,1073,12,5),(4847,1073,12,5),(4848,1073,17,6),(4849,1073,11,6),(4850,1072,22,2),(4851,1072,12,3),(4852,1072,17,4),(4853,1072,43,5),(4854,1072,12,5),(4855,1072,12,5),(4856,1072,22,5),(4857,1072,12,5),(4858,1072,22,5),(4859,1072,22,7),(4860,1074,12,3),(4861,1074,43,4),(4862,1074,48,4),(4863,1074,12,5),(4864,1074,12,5),(4865,1074,17,6),(4866,1074,11,6),(4867,1075,12,3),(4868,1075,43,4),(4869,1075,48,4),(4870,1075,17,5),(4871,1075,11,5),(4872,1075,17,6),(4873,1075,11,6),(4874,1076,22,2),(4875,1076,12,3),(4876,1076,43,4),(4877,1076,48,4),(4878,1076,11,4),(4879,1076,17,5),(4880,1076,11,5),(4881,1076,12,5),(4882,1076,12,5),(4883,1076,22,5),(4884,1076,22,5),(4885,1076,17,6),(4886,1076,11,6),(4887,1076,22,7),(4888,1077,22,2),(4889,1077,12,3),(4890,1077,43,4),(4891,1077,48,4),(4892,1077,11,4),(4893,1077,17,5),(4894,1077,11,5),(4895,1077,12,5),(4896,1077,12,5),(4897,1077,22,5),(4898,1077,22,5),(4899,1077,17,6),(4900,1077,11,6),(4901,1077,22,7),(4902,1078,12,3),(4903,1078,43,4),(4904,1078,48,4),(4905,1078,17,5),(4906,1078,11,5),(4907,1078,12,5),(4908,1078,12,5),(4909,1078,22,5),(4910,1078,17,6),(4911,1078,11,6),(4912,1079,12,3),(4913,1079,43,4),(4914,1079,48,4),(4915,1079,17,5),(4916,1079,11,5),(4917,1079,12,5),(4918,1079,12,5),(4919,1079,22,5),(4920,1079,17,6),(4921,1079,11,6),(4922,1081,22,2),(4923,1081,12,3),(4924,1081,43,4),(4925,1081,48,4),(4926,1081,11,4),(4927,1081,17,5),(4928,1081,11,5),(4929,1081,12,5),(4930,1081,12,5),(4931,1081,22,5),(4932,1081,22,5),(4933,1081,17,6),(4934,1081,11,6),(4935,1081,22,7),(4936,1080,22,2),(4937,1080,12,3),(4938,1080,43,4),(4939,1080,48,4),(4940,1080,11,4),(4941,1080,17,5),(4942,1080,11,5),(4943,1080,12,5),(4944,1080,12,5),(4945,1080,22,5),(4946,1080,22,5),(4947,1080,17,6),(4948,1080,11,6),(4949,1080,22,7),(4950,1083,22,2),(4951,1083,6,2),(4952,1083,12,3),(4953,1083,17,5),(4954,1083,46,5),(4955,1083,41,5),(4956,1083,11,5),(4957,1083,22,5),(4958,1083,6,5),(4959,1083,22,7),(4960,1083,6,7),(4961,1082,12,3),(4962,1082,43,4),(4963,1082,48,4),(4964,1082,17,5),(4965,1082,11,5),(4966,1082,12,5),(4967,1082,12,5),(4968,1082,22,5),(4969,1082,17,6),(4970,1082,11,6),(4971,1084,22,2),(4972,1084,12,3),(4973,1084,43,4),(4974,1084,48,4),(4975,1084,11,4),(4976,1084,17,5),(4977,1084,11,5),(4978,1084,12,5),(4979,1084,12,5),(4980,1084,22,5),(4981,1084,22,5),(4982,1084,17,6),(4983,1084,11,6),(4984,1084,22,7),(4985,1085,12,3),(4986,1087,12,3),(4987,1087,43,4),(4988,1087,48,4),(4989,1087,17,5),(4990,1087,11,5),(4991,1087,12,5),(4992,1087,12,5),(4993,1087,17,6),(4994,1087,11,6),(4995,1090,12,3),(4996,1089,12,3),(4997,1091,12,3),(4998,1093,12,3),(4999,1092,12,3),(5000,1092,18,3),(5001,1088,12,3),(5002,1088,43,4),(5003,1088,48,4),(5004,1088,17,5),(5005,1088,11,5),(5006,1088,12,5),(5007,1088,12,5),(5008,1088,22,5),(5009,1088,45,5),(5010,1088,17,6),(5011,1088,11,6),(5012,1094,12,3),(5013,1094,43,4),(5014,1094,48,4),(5015,1094,17,5),(5016,1094,11,5),(5017,1094,12,5),(5018,1094,12,5),(5019,1094,17,6),(5020,1094,11,6),(5021,1095,12,3),(5022,1096,12,3),(5023,1097,12,3),(5024,1098,12,3),(5025,1099,12,3),(5026,1100,12,3),(5027,1101,12,3),(5028,1102,12,3),(5029,1103,12,3),(5030,1104,12,4),(5031,1104,12,4),(5032,1105,12,4),(5033,1105,12,4),(5034,1105,16,5),(5035,1105,12,5),(5036,1106,12,4),(5037,1106,12,4),(5038,1107,12,4),(5039,1107,12,4),(5040,1108,12,4),(5041,1108,12,4),(5042,1108,22,5),(5043,1109,12,4),(5044,1109,12,4),(5045,1110,12,4),(5046,1110,12,4),(5047,1110,12,4),(5048,1111,12,4),(5049,1111,12,4),(5050,1111,12,4),(5051,1113,12,4),(5052,1113,12,4),(5053,1114,12,3),(5054,1114,12,3),(5055,1114,22,4),(5056,1114,28,4),(5057,1114,29,5),(5058,1115,12,4),(5059,1115,12,4),(5060,1115,12,5),(5061,1115,17,5),(5062,1117,12,3),(5063,1117,12,3),(5064,1117,22,4),(5065,1117,28,4),(5066,1117,7,4),(5067,1117,29,5),(5068,1123,12,3),(5069,1123,12,3),(5070,1123,22,4),(5071,1123,28,4),(5072,1123,29,5),(5073,1124,12,3),(5074,1124,6,3),(5075,1125,12,3),(5076,1125,12,3),(5077,1126,12,3),(5078,1126,6,3),(5079,1127,12,3),(5080,1127,12,3),(5081,1128,12,3),(5082,1128,6,3),(5083,1132,12,3),(5084,1132,12,3),(5085,1133,12,3),(5086,1133,12,3),(5087,1136,18,3),(5088,1136,46,4),(5089,1136,22,5),(5090,1137,18,3),(5091,1137,46,4),(5092,1137,22,5),(5093,1138,18,3),(5094,1138,46,4),(5095,1138,22,5),(5096,1138,12,5),(5097,1138,12,5),(5098,1139,18,3),(5099,1139,46,4),(5100,1139,22,5),(5101,1141,18,3),(5102,1141,46,4),(5103,1141,22,5),(5104,1141,12,5),(5105,1141,12,5),(5106,1140,18,3),(5107,1140,46,4),(5108,1140,28,4),(5109,1140,29,4),(5110,1140,8,4),(5111,1140,45,4),(5112,1140,22,5),(5113,1140,39,5),(5114,1144,18,3),(5115,1144,46,4),(5116,1144,22,5),(5117,1142,18,3),(5118,1142,46,4),(5119,1142,22,5),(5120,1142,12,5),(5121,1142,12,5),(5122,1145,18,3),(5123,1145,46,4),(5124,1145,22,5),(5125,1143,18,3),(5126,1143,46,4),(5127,1143,22,5),(5128,1143,29,5),(5129,1143,6,5),(5130,1146,18,3),(5131,1146,46,4),(5132,1146,22,5),(5133,1146,43,5),(5134,1147,18,3),(5135,1147,46,4),(5136,1147,22,5),(5137,1147,43,5),(5138,1147,28,5),(5139,1147,8,5),(5140,1148,18,3),(5141,1148,46,4),(5142,1148,22,5),(5143,1148,43,5),(5144,1148,28,5),(5145,1148,8,5),(5146,1149,18,3),(5147,1149,46,4),(5148,1149,22,5),(5149,1149,43,5),(5150,1149,29,5),(5151,1152,18,3),(5152,1152,46,4),(5153,1152,22,5),(5154,1151,18,3),(5155,1151,46,4),(5156,1151,22,5),(5157,1151,43,5),(5158,1150,18,3),(5159,1150,46,4),(5160,1150,22,5),(5161,1150,43,5),(5162,1153,18,3),(5163,1153,46,4),(5164,1153,22,5),(5165,1153,43,5),(5166,1153,29,5),(5167,1155,18,3),(5168,1155,46,4),(5169,1155,22,5),(5170,1155,29,5),(5171,1154,18,3),(5172,1154,46,4),(5173,1154,22,5),(5174,1154,8,5),(5175,1154,29,5),(5176,1154,6,5),(5177,1156,18,3),(5178,1156,46,4),(5179,1156,22,5),(5180,1157,18,3),(5181,1157,46,4),(5182,1157,22,5),(5183,1158,18,3),(5184,1158,46,4),(5185,1158,22,5),(5186,1158,43,5),(5187,1159,18,3),(5188,1159,46,4),(5189,1159,22,5),(5190,1160,18,3),(5191,1160,46,4),(5192,1160,22,5),(5193,1160,28,5),(5194,1160,8,5),(5195,1162,18,3),(5196,1162,46,4),(5197,1162,22,5),(5198,1162,43,5),(5199,1162,29,5),(5200,1163,18,3),(5201,1163,46,4),(5202,1163,22,5),(5203,1163,43,5),(5204,1163,29,5),(5205,1164,18,3),(5206,1164,46,4),(5207,1164,22,5),(5208,1164,43,5),(5209,1161,18,3),(5210,1161,46,4),(5211,1161,22,5),(5212,1161,43,5),(5213,1161,29,5),(5214,1165,18,3),(5215,1165,46,4),(5216,1165,22,5),(5217,1165,43,5),(5218,1165,28,5),(5219,1165,8,5),(5220,1166,18,3),(5221,1166,46,4),(5222,1166,22,5),(5223,1166,43,5),(5224,1168,18,3),(5225,1168,46,4),(5226,1168,22,5),(5227,1168,29,5),(5228,1167,18,3),(5229,1167,46,4),(5230,1167,22,5),(5231,1167,8,5),(5232,1167,29,5),(5233,1167,6,5),(5234,1169,18,3),(5235,1169,46,4),(5236,1169,22,5),(5237,1169,43,5),(5238,1170,18,3),(5239,1170,46,4),(5240,1170,22,5),(5241,1171,18,3),(5242,1171,46,4),(5243,1171,22,5),(5244,1171,43,5),(5245,1172,18,3),(5246,1172,46,4),(5247,1172,22,5),(5248,1172,43,5),(5249,1173,18,3),(5250,1173,46,4),(5251,1173,22,5),(5252,1173,43,5),(5253,1174,18,3),(5254,1174,46,4),(5255,1174,22,5),(5256,1175,18,3),(5257,1175,46,4),(5258,1175,22,5),(5259,1175,43,5),(5260,1175,29,5),(5261,1176,45,2),(5262,1176,18,3),(5263,1176,46,4),(5264,1176,12,4),(5265,1176,22,5),(5266,1176,6,5),(5267,1176,6,5),(5268,1176,43,5),(5269,1176,17,5),(5270,1176,45,5),(5271,1176,17,6),(5272,1176,45,7),(5273,1177,18,3),(5274,1177,46,4),(5275,1177,22,5),(5276,1177,29,5),(5277,1177,6,5),(5278,1177,6,5),(5279,1177,43,5),(5280,1178,18,3),(5281,1178,46,4),(5282,1178,22,5),(5283,1178,29,5),(5284,1178,6,5),(5285,1178,6,5),(5286,1178,43,5),(5287,1179,18,3),(5288,1179,46,4),(5289,1179,12,4),(5290,1179,22,5),(5291,1179,6,5),(5292,1179,6,5),(5293,1179,43,5),(5294,1179,17,5),(5295,1179,17,6),(5296,1181,18,3),(5297,1182,18,3),(5298,1183,18,3),(5299,1185,18,3),(5300,1184,45,2),(5301,1184,18,3),(5302,1184,46,4),(5303,1184,22,5),(5304,1184,43,5),(5305,1184,28,5),(5306,1184,6,5),(5307,1184,45,5),(5308,1184,45,7),(5309,1186,45,2),(5310,1186,18,3),(5311,1186,46,4),(5312,1186,22,5),(5313,1186,43,5),(5314,1186,28,5),(5315,1186,6,5),(5316,1186,6,5),(5317,1186,45,5),(5318,1186,45,7),(5319,1190,18,3),(5320,1191,18,3),(5321,1192,18,3),(5322,1194,12,5),(5323,1194,12,5),(5324,1194,12,5),(5325,1194,12,5),(5326,1201,22,5),(5327,1211,43,3),(5328,1211,12,4),(5329,1211,1,4),(5330,1211,48,4),(5331,1211,12,5),(5332,1211,12,5),(5333,1211,17,6),(5334,1211,11,6),(5335,1217,22,2),(5336,1217,43,3),(5337,1217,12,4),(5338,1217,48,4),(5339,1217,17,5),(5340,1217,11,5),(5341,1217,22,5),(5342,1217,17,6),(5343,1217,11,6),(5344,1217,22,7),(5345,1237,22,2),(5346,1237,43,3),(5347,1237,12,4),(5348,1237,48,4),(5349,1237,17,5),(5350,1237,11,5),(5351,1237,22,5),(5352,1237,17,6),(5353,1237,11,6),(5354,1237,22,7),(5355,1239,43,3),(5356,1239,18,4),(5357,1239,46,4),(5358,1239,22,5),(5359,1239,12,5),(5360,1239,12,5),(5361,1243,43,3),(5362,1243,12,4),(5363,1243,48,4),(5364,1243,17,5),(5365,1243,11,5),(5366,1243,12,5),(5367,1243,12,5),(5368,1243,22,5),(5369,1243,17,6),(5370,1243,11,6),(5371,1249,43,3),(5372,1254,43,3),(5373,1262,17,2),(5374,1262,43,3),(5375,1262,12,4),(5376,1262,22,5),(5377,1262,12,5),(5378,1262,12,5),(5379,1262,17,7),(5380,1271,22,2),(5381,1271,43,3),(5382,1271,12,4),(5383,1271,48,4),(5384,1271,17,5),(5385,1271,11,5),(5386,1271,22,5),(5387,1271,17,6),(5388,1271,11,6),(5389,1271,22,7),(5390,1279,43,3),(5391,1281,43,3),(5392,1285,43,3),(5393,1285,4,5),(5394,1285,3,5),(5395,1286,43,3),(5396,1286,12,4),(5397,1286,48,4),(5398,1286,17,5),(5399,1286,11,5),(5400,1286,17,6),(5401,1286,11,6),(5402,1289,43,3),(5403,1289,12,4),(5404,1289,48,4),(5405,1289,17,5),(5406,1289,11,5),(5407,1289,17,6),(5408,1289,11,6),(5409,1309,22,2),(5410,1309,43,3),(5411,1309,12,4),(5412,1309,48,4),(5413,1309,17,5),(5414,1309,11,5),(5415,1309,12,5),(5416,1309,12,5),(5417,1309,22,5),(5418,1309,22,5),(5419,1317,43,3),(5420,1317,12,5),(5421,1317,48,5),(5422,1317,11,5),(5423,1317,22,5),(5424,1323,43,3),(5425,1323,12,4),(5426,1323,22,5),(5427,1323,18,5),(5428,1323,46,5),(5429,1323,17,6),(5430,1324,43,3),(5431,1324,12,5),(5432,1324,48,5),(5433,1324,11,5),(5434,1324,22,5),(5435,1329,43,3),(5436,1329,12,4),(5437,1329,22,5),(5438,1329,18,5),(5439,1329,46,5),(5440,1329,17,6),(5441,1332,22,2),(5442,1332,43,3),(5443,1332,12,4),(5444,1332,48,4),(5445,1332,11,4),(5446,1332,17,5),(5447,1332,11,5),(5448,1332,12,5),(5449,1332,12,5),(5450,1332,22,5),(5451,1332,22,5),(5452,1332,17,6),(5453,1332,11,6),(5454,1332,22,7),(5455,1476,22,2),(5456,1476,17,3),(5457,1476,12,4),(5458,1476,22,5),(5459,1476,22,7),(5460,1478,22,2),(5461,1478,17,3),(5462,1478,12,4),(5463,1478,28,5),(5464,1478,8,5),(5465,1478,3,5),(5466,1478,4,5),(5467,1478,45,5),(5468,1478,22,7),(5469,1479,22,2),(5470,1479,17,3),(5471,1479,12,4),(5472,1479,45,5),(5473,1479,22,5),(5474,1479,22,7),(5475,1480,22,2),(5476,1480,17,3),(5477,1480,12,4),(5478,1480,45,5),(5479,1480,22,5),(5480,1480,22,7),(5481,1481,22,2),(5482,1481,6,2),(5483,1481,17,3),(5484,1481,12,4),(5485,1481,11,4),(5486,1481,46,4),(5487,1481,16,4),(5488,1481,41,4),(5489,1481,22,5),(5490,1481,6,5),(5491,1481,22,7),(5492,1481,6,7),(5493,1483,22,2),(5494,1483,6,2),(5495,1483,17,3),(5496,1483,11,4),(5497,1483,16,4),(5498,1483,46,4),(5499,1483,41,4),(5500,1483,12,5),(5501,1483,22,5),(5502,1483,6,5),(5503,1483,22,7),(5504,1483,6,7),(5505,1485,22,2),(5506,1485,17,3),(5507,1485,12,4),(5508,1485,28,5),(5509,1485,8,5),(5510,1485,3,5),(5511,1485,4,5),(5512,1485,45,5),(5513,1485,22,5),(5514,1485,22,7),(5515,1486,22,2),(5516,1486,17,3),(5517,1486,12,4),(5518,1486,45,5),(5519,1486,22,5),(5520,1486,22,7),(5521,1487,6,2),(5522,1487,17,3),(5523,1487,11,4),(5524,1487,46,4),(5525,1487,16,4),(5526,1487,41,4),(5527,1487,6,5),(5528,1487,6,7),(5529,1489,6,2),(5530,1489,17,3),(5531,1489,11,4),(5532,1489,16,4),(5533,1489,46,4),(5534,1489,18,4),(5535,1489,41,4),(5536,1489,12,5),(5537,1489,12,5),(5538,1489,6,5),(5539,1489,6,7),(5540,1491,6,2),(5541,1491,17,3),(5542,1491,11,4),(5543,1491,16,4),(5544,1491,46,4),(5545,1491,41,4),(5546,1491,12,5),(5547,1491,12,5),(5548,1491,6,7),(5549,1492,6,2),(5550,1492,17,3),(5551,1492,11,4),(5552,1492,16,4),(5553,1492,46,4),(5554,1492,41,4),(5555,1492,12,5),(5556,1492,12,5),(5557,1492,22,5),(5558,1492,6,5),(5559,1492,6,7),(5560,1494,6,2),(5561,1494,17,3),(5562,1494,11,4),(5563,1494,46,4),(5564,1494,16,4),(5565,1494,41,4),(5566,1494,6,5),(5567,1494,6,7),(5568,1495,6,2),(5569,1495,17,3),(5570,1495,11,4),(5571,1495,46,4),(5572,1495,16,4),(5573,1495,41,4),(5574,1495,6,5),(5575,1495,6,7),(5576,1493,22,2),(5577,1493,17,3),(5578,1493,12,4),(5579,1493,45,5),(5580,1493,22,5),(5581,1493,22,7),(5582,1497,6,2),(5583,1497,17,3),(5584,1497,11,4),(5585,1497,46,4),(5586,1497,16,4),(5587,1497,41,4),(5588,1497,6,5),(5589,1497,6,7),(5590,1496,6,2),(5591,1496,17,3),(5592,1496,11,4),(5593,1496,46,4),(5594,1496,16,4),(5595,1496,12,5),(5596,1496,12,5),(5597,1496,6,7),(5598,1499,22,2),(5599,1499,17,3),(5600,1499,12,4),(5601,1499,45,5),(5602,1499,22,5),(5603,1499,22,7),(5604,1502,6,2),(5605,1502,17,3),(5606,1502,11,4),(5607,1502,46,4),(5608,1502,16,4),(5609,1502,12,5),(5610,1502,12,5),(5611,1502,6,7),(5612,1503,6,2),(5613,1503,17,3),(5614,1503,11,4),(5615,1503,16,4),(5616,1503,46,4),(5617,1503,41,4),(5618,1503,12,5),(5619,1503,12,5),(5620,1503,6,7),(5621,1504,6,2),(5622,1504,17,3),(5623,1504,11,4),(5624,1504,46,4),(5625,1504,16,4),(5626,1504,41,4),(5627,1504,6,5),(5628,1504,6,7),(5629,1501,6,2),(5630,1501,17,3),(5631,1501,11,4),(5632,1501,16,4),(5633,1501,46,4),(5634,1501,41,4),(5635,1501,6,5),(5636,1501,6,7),(5637,1500,6,2),(5638,1500,17,3),(5639,1500,11,4),(5640,1500,16,4),(5641,1500,46,4),(5642,1500,41,4),(5643,1500,6,5),(5644,1500,6,7),(5645,1505,6,2),(5646,1505,17,3),(5647,1505,11,4),(5648,1505,46,4),(5649,1505,16,4),(5650,1505,41,4),(5651,1505,6,5),(5652,1505,6,7),(5653,1506,6,2),(5654,1506,17,3),(5655,1506,11,4),(5656,1506,46,4),(5657,1506,16,4),(5658,1506,12,5),(5659,1506,12,5),(5660,1506,6,7),(5661,1507,6,2),(5662,1507,17,3),(5663,1507,11,4),(5664,1507,16,4),(5665,1507,46,4),(5666,1507,41,4),(5667,1507,12,5),(5668,1507,12,5),(5669,1507,11,5),(5670,1507,48,5),(5671,1507,6,5),(5672,1507,6,7),(5673,1509,6,2),(5674,1509,17,3),(5675,1509,11,4),(5676,1509,16,4),(5677,1509,46,4),(5678,1509,41,4),(5679,1509,6,5),(5680,1509,6,7),(5681,1508,6,2),(5682,1508,17,3),(5683,1508,11,4),(5684,1508,16,4),(5685,1508,46,4),(5686,1508,41,4),(5687,1508,12,5),(5688,1508,12,5),(5689,1508,12,5),(5690,1508,11,5),(5691,1508,48,5),(5692,1508,6,5),(5693,1508,6,7),(5694,1512,22,2),(5695,1512,17,3),(5696,1512,12,4),(5697,1512,22,5),(5698,1512,22,7),(5699,1510,6,2),(5700,1510,17,3),(5701,1510,11,4),(5702,1510,46,4),(5703,1510,16,4),(5704,1510,12,5),(5705,1510,12,5),(5706,1510,6,7),(5707,1511,22,2),(5708,1511,17,3),(5709,1511,12,4),(5710,1511,45,5),(5711,1511,22,5),(5712,1511,22,7),(5713,1514,22,2),(5714,1514,17,3),(5715,1514,12,4),(5716,1514,45,5),(5717,1514,22,5),(5718,1514,22,7),(5719,1516,22,2),(5720,1516,17,3),(5721,1516,12,4),(5722,1516,28,5),(5723,1516,8,5),(5724,1516,3,5),(5725,1516,4,5),(5726,1516,45,5),(5727,1516,22,5),(5728,1516,22,7),(5729,1519,22,2),(5730,1519,6,2),(5731,1519,17,3),(5732,1519,11,4),(5733,1519,16,4),(5734,1519,46,4),(5735,1519,41,4),(5736,1519,12,5),(5737,1519,22,5),(5738,1519,6,5),(5739,1519,22,7),(5740,1519,6,7),(5741,1518,22,2),(5742,1518,17,3),(5743,1518,12,4),(5744,1518,28,5),(5745,1518,8,5),(5746,1518,3,5),(5747,1518,4,5),(5748,1518,45,5),(5749,1518,22,5),(5750,1518,22,7),(5751,1520,17,4),(5752,1520,12,4),(5753,1520,28,4),(5754,1520,8,4),(5755,1520,45,4),(5756,1520,29,4),(5757,1520,45,5),(5758,1521,22,2),(5759,1521,17,3),(5760,1521,12,4),(5761,1521,28,4),(5762,1521,8,4),(5763,1521,45,4),(5764,1521,29,4),(5765,1521,45,5),(5766,1521,22,5),(5767,1521,22,7),(5768,1522,6,2),(5769,1522,22,2),(5770,1522,17,3),(5771,1522,11,4),(5772,1522,46,4),(5773,1522,16,4),(5774,1522,41,4),(5775,1522,12,5),(5776,1522,45,5),(5777,1522,6,5),(5778,1522,22,5),(5779,1522,6,7),(5780,1522,22,7),(5781,1523,6,2),(5782,1523,22,2),(5783,1523,17,3),(5784,1523,11,4),(5785,1523,46,4),(5786,1523,16,4),(5787,1523,41,4),(5788,1523,12,5),(5789,1523,6,5),(5790,1523,22,5),(5791,1523,6,7),(5792,1523,22,7),(5793,1524,6,2),(5794,1524,22,2),(5795,1524,17,3),(5796,1524,11,4),(5797,1524,46,4),(5798,1524,16,4),(5799,1524,41,4),(5800,1524,12,5),(5801,1524,6,5),(5802,1524,22,5),(5803,1524,6,7),(5804,1524,22,7),(5805,1525,22,2),(5806,1525,6,2),(5807,1525,17,3),(5808,1525,11,4),(5809,1525,16,4),(5810,1525,46,4),(5811,1525,41,4),(5812,1525,12,5),(5813,1525,22,5),(5814,1525,6,5),(5815,1525,22,7),(5816,1525,6,7),(5817,1528,22,2),(5818,1528,6,2),(5819,1528,17,3),(5820,1528,11,4),(5821,1528,16,4),(5822,1528,46,4),(5823,1528,41,4),(5824,1528,6,4),(5825,1528,39,4),(5826,1528,12,5),(5827,1528,22,5),(5828,1528,6,5),(5829,1528,22,7),(5830,1528,6,7),(5831,1526,6,2),(5832,1526,22,2),(5833,1526,17,3),(5834,1526,11,4),(5835,1526,46,4),(5836,1526,16,4),(5837,1526,41,4),(5838,1526,12,5),(5839,1526,45,5),(5840,1526,6,5),(5841,1526,22,5),(5842,1526,6,7),(5843,1526,22,7),(5844,1527,22,2),(5845,1527,6,2),(5846,1527,17,3),(5847,1527,11,4),(5848,1527,16,4),(5849,1527,46,4),(5850,1527,41,4),(5851,1527,6,4),(5852,1527,3,4),(5853,1527,39,4),(5854,1527,12,5),(5855,1527,22,5),(5856,1527,6,5),(5857,1527,22,7),(5858,1527,6,7),(5859,1530,6,2),(5860,1530,22,2),(5861,1530,17,3),(5862,1530,11,4),(5863,1530,46,4),(5864,1530,16,4),(5865,1530,41,4),(5866,1530,12,5),(5867,1530,45,5),(5868,1530,6,5),(5869,1530,22,5),(5870,1530,6,7),(5871,1530,22,7),(5872,1534,17,3),(5873,1533,17,3),(5874,1532,6,2),(5875,1532,22,2),(5876,1532,17,3),(5877,1532,11,4),(5878,1532,46,4),(5879,1532,16,4),(5880,1532,41,4),(5881,1532,12,5),(5882,1532,6,5),(5883,1532,22,5),(5884,1532,6,7),(5885,1532,22,7),(5886,1531,6,2),(5887,1531,22,2),(5888,1531,17,3),(5889,1531,11,4),(5890,1531,46,4),(5891,1531,16,4),(5892,1531,41,4),(5893,1531,12,5),(5894,1531,45,5),(5895,1531,6,5),(5896,1531,22,5),(5897,1531,6,7),(5898,1531,22,7),(5899,1535,17,3),(5900,1538,17,3),(5901,1537,6,2),(5902,1537,22,2),(5903,1537,17,3),(5904,1537,11,4),(5905,1537,46,4),(5906,1537,16,4),(5907,1537,41,4),(5908,1537,12,5),(5909,1537,6,5),(5910,1537,22,5),(5911,1537,6,7),(5912,1537,22,7),(5913,1536,6,2),(5914,1536,22,2),(5915,1536,17,3),(5916,1536,11,4),(5917,1536,46,4),(5918,1536,16,4),(5919,1536,41,4),(5920,1536,12,5),(5921,1536,6,5),(5922,1536,22,5),(5923,1536,6,7),(5924,1536,22,7),(5925,1539,17,3),(5926,1540,17,3),(5927,1541,17,3),(5928,1542,17,3),(5929,1543,17,3),(5930,1545,17,3),(5931,1544,17,3),(5932,1546,17,3),(5933,1548,17,3),(5934,1547,17,3),(5935,1549,17,3),(5936,1550,17,3),(5937,1551,17,3),(5938,1552,17,3),(5939,1553,16,4),(5940,1553,12,4),(5941,1554,16,4),(5942,1558,16,4),(5943,1558,12,4),(5944,1560,16,4),(5945,1560,12,4),(5946,1559,16,4),(5947,1556,16,4),(5948,1556,18,5),(5949,1556,46,5),(5950,1556,22,5),(5951,1557,16,4),(5952,1557,12,4),(5953,1585,11,3),(5954,1585,48,4),(5955,1586,11,3),(5956,1586,48,4),(5957,1587,11,3),(5958,1587,48,4),(5959,1588,11,3),(5960,1588,48,4),(5961,1588,12,5),(5962,1588,12,5),(5963,1588,22,5),(5964,1589,11,3),(5965,1589,48,4),(5966,1589,12,5),(5967,1589,12,5),(5968,1589,22,5),(5969,1590,11,3),(5970,1590,48,4),(5971,1590,12,5),(5972,1590,12,5),(5973,1590,22,5),(5974,1591,11,3),(5975,1591,48,4),(5976,1591,12,5),(5977,1591,12,5),(5978,1592,11,3),(5979,1592,48,4),(5980,1593,11,3),(5981,1593,48,4),(5982,1595,11,3),(5983,1595,48,4),(5984,1594,11,3),(5985,1594,48,4),(5986,1594,6,5),(5987,1594,29,5),(5988,1596,11,3),(5989,1596,48,4),(5990,1597,11,3),(5991,1597,48,4),(5992,1598,11,3),(5993,1598,48,4),(5994,1599,11,3),(5995,1599,48,4),(5996,1600,11,3),(5997,1600,48,4),(5998,1601,11,3),(5999,1601,48,4),(6000,1601,6,5),(6001,1601,29,5),(6002,1603,11,3),(6003,1603,48,4),(6004,1604,11,3),(6005,1604,48,4),(6006,1602,11,3),(6007,1602,48,4),(6008,1605,11,3),(6009,1605,48,4),(6010,1606,11,3),(6011,1606,48,4),(6012,1607,11,3),(6013,1607,48,4),(6014,1608,11,3),(6015,1608,48,4),(6016,1609,11,3),(6017,1609,48,4),(6018,1610,11,3),(6019,1610,48,4),(6020,1611,11,3),(6021,1611,48,4),(6022,1611,6,5),(6023,1611,29,5),(6024,1612,11,3),(6025,1612,48,4),(6026,1613,11,3),(6027,1613,48,4),(6028,1614,11,3),(6029,1614,48,4),(6030,1615,11,3),(6031,1615,48,4),(6032,1616,11,3),(6033,1616,48,4),(6034,1617,11,3),(6035,1617,48,4),(6036,1618,11,3),(6037,1618,48,4),(6038,1619,11,3),(6039,1619,48,4),(6040,1619,6,5),(6041,1619,29,5),(6042,1620,11,3),(6043,1620,48,4),(6044,1621,11,3),(6045,1621,48,4),(6046,1621,12,5),(6047,1621,12,5),(6048,1621,22,5),(6049,1622,11,3),(6050,1622,48,4),(6051,1623,11,3),(6052,1623,48,4),(6053,1623,6,5),(6054,1623,29,5),(6055,1624,11,3),(6056,1624,48,4),(6057,1625,11,3),(6058,1625,48,4),(6059,1625,12,5),(6060,1625,12,5),(6061,1625,22,5),(6062,1626,11,3),(6063,1627,11,3),(6064,1628,11,3),(6065,1628,48,4),(6066,1628,12,5),(6067,1628,12,5),(6068,1628,22,5),(6069,1629,11,3),(6070,1629,48,4),(6071,1629,43,4),(6072,1629,12,4),(6073,1629,12,5),(6074,1629,12,5),(6075,1629,22,5),(6076,1630,11,3),(6077,1632,11,3),(6078,1633,11,3),(6079,1635,11,3),(6080,1634,11,3),(6081,1631,11,3),(6082,1631,48,4),(6083,1631,12,5),(6084,1631,12,5),(6085,1631,22,5),(6086,1631,29,5),(6087,1631,6,5),(6088,1636,48,3),(6089,1636,11,4),(6090,1637,48,3),(6091,1637,11,4),(6092,1638,48,3),(6093,1638,11,4),(6094,1638,43,5),(6095,1638,12,5),(6096,1639,48,3),(6097,1640,48,3),(6098,1643,48,3),(6099,1643,11,4),(6100,1642,48,3),(6101,1642,11,4),(6102,1641,48,3),(6103,1641,43,4),(6104,1641,12,4),(6105,1641,11,5),(6106,1641,17,5),(6107,1641,11,6),(6108,1641,17,6),(6109,1644,48,3),(6110,1645,48,3),(6111,1646,48,3),(6112,1646,11,4),(6113,1647,48,3),(6114,1648,48,3),(6115,1649,48,3),(6116,1650,48,3),(6117,1651,48,3),(6118,1652,6,3),(6119,1653,6,3),(6120,1654,6,3),(6121,1654,12,5),(6122,1654,12,5),(6123,1655,6,3),(6124,1656,6,3),(6125,1658,6,3),(6126,1659,6,3),(6127,1657,6,3),(6128,1660,6,3),(6129,1661,6,3),(6130,1662,6,3),(6131,1663,6,3),(6132,1664,6,3),(6133,1664,6,5),(6134,1664,29,5),(6135,1665,6,3),(6136,1667,6,3),(6137,1666,6,3),(6138,1668,6,3),(6139,1669,6,3),(6140,1671,6,3),(6141,1672,6,3),(6142,1670,6,3),(6143,1674,6,3),(6144,1673,6,3),(6145,1673,6,5),(6146,1673,29,5),(6147,1675,6,3),(6148,1676,6,3),(6149,1677,6,3),(6150,1678,6,3),(6151,1679,6,3),(6152,1680,6,3),(6153,1681,6,3),(6154,1682,6,3),(6155,1684,6,3),(6156,1685,6,3),(6157,1683,6,3),(6158,1686,6,3),(6159,1687,6,3),(6160,1687,12,5),(6161,1687,12,5),(6162,1687,22,5); +/*!40000 ALTER TABLE `exercise_related_muscle` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `kinesiology_glossary` +-- + +DROP TABLE IF EXISTS `kinesiology_glossary`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `kinesiology_glossary` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'The ID of kinesiology glossary.', + `name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'The name kinesiology glossary.', + `description` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'The description of kinesiology glossary.', + `parent_id` bigint unsigned DEFAULT NULL COMMENT 'The parent ID of kinesiology glossary.', + `created_by` bigint unsigned NOT NULL DEFAULT '1' COMMENT 'Created by', + `created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Created time', + `modified_by` bigint unsigned DEFAULT NULL COMMENT 'Modified by', + `modified_time` datetime DEFAULT NULL COMMENT 'Modified time', + `deleted` tinyint NOT NULL DEFAULT '0' COMMENT 'Deleted', + PRIMARY KEY (`id`), + UNIQUE KEY `kinesiology_glossary_name_uindex` (`name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Kinesiology Glossary.\n\nhttps://exrx.net/Kinesiology/Glossary'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `kinesiology_glossary` +-- + +LOCK TABLES `kinesiology_glossary` WRITE; +/*!40000 ALTER TABLE `kinesiology_glossary` DISABLE KEYS */; +/*!40000 ALTER TABLE `kinesiology_glossary` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `muscle` +-- + +DROP TABLE IF EXISTS `muscle`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `muscle` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'The ID of muscle.', + `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'The name of muscle.', + `other_names` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'The muslce''s other names.', + `parent_id` bigint unsigned DEFAULT NULL COMMENT 'The parent ID of muscle.', + `body_part_id` bigint unsigned NOT NULL COMMENT 'Related body part ID.', + `created_by` bigint unsigned NOT NULL DEFAULT '1' COMMENT 'Created by', + `created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Created time', + `modified_by` bigint unsigned DEFAULT NULL COMMENT 'Modified by', + `modified_time` datetime DEFAULT NULL COMMENT 'Modified time', + `deleted` tinyint NOT NULL DEFAULT '0' COMMENT 'Deleted', + PRIMARY KEY (`id`), + UNIQUE KEY `muscle_name_uindex` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=54 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Muscle.\n\nhttps://exrx.net/Lists/Muscle'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `muscle` +-- + +LOCK TABLES `muscle` WRITE; +/*!40000 ALTER TABLE `muscle` DISABLE KEYS */; +INSERT INTO `muscle` VALUES (1,'Adductors','Inner Thigh',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(2,'Biceps Brachii','Arm (Front),Biceps,Biceps Cubiti',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(3,'Brachialis','Arm (Side),Lower Biceps',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(4,'Brachioradialis','Forearm (Upper-outer),Supinator longus (out dated)',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(5,'Deltoid',NULL,NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(6,'Anterior','Shoulder (Front),Front Delts',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(7,'Lateral','Shoulder (Side),Side Delts',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(8,'Posterior','Shoulder (Rear),Rear Delts',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(9,'Deep Hip External Rotators','Six Deep Lateral Rotator Hip Muscles',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(10,'Erector Spinae','Lower Back',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(11,'Gastrocnemius','Calf',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(12,'Gluteus',NULL,NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(13,'Maximus','Butt,Hips (Rear),Glutes',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(14,'Medius','Hip,Hip Abductor',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(15,'Minimus','Hip,Hip Abductor',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(16,'Gracilis','Inner Thigh,Hip Adductor',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(17,'Hamstrings','Thigh (Rear)',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(18,'Iliopsoas','Hip,Hip Flexors',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(19,'Infraspinatus','Rotatory Cuff,Back',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(20,'Latissimus Dorsi','Back (Middle, Outer),Lats',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(21,'Levator Scapulae','Shoulder (Upper),Neck (Rear)',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(22,'Obliques','Hips (Upper),Waist (Sides),Obliques',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(23,'Pectineous','Thigh (upper),Hip Flexors',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(24,'Pectoralis Major',NULL,NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(25,'Clavicular Head','Chest (Upper),Upper Pecs',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(26,'Sternal Head','Chest,Lower Pecs',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(27,'Teres',NULL,NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(28,'Major','Back (Outer),Lats little helper',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(29,'Minor','Rotatory Cuff,Back',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(30,'Tibialis Anterior','Shin,Tibias,Tibialis Anticus',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(31,'Transverse Abdominus','Transverse Abs',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(32,'Trapezius',NULL,NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(33,'Lower Fibers','Back (Middle),Lower Traps',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(34,'Middle Fibers','Back (Upper),Traps',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(35,'Upper Fibers','Shoulder (Upper),Upper Traps',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(36,'Triceps Brachii','Arm (Rear),Triceps',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(37,'Wrist',NULL,NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(38,'Extensors','Forearm (outer or back),Hand Extensors',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(39,'Flexors','Forearm (Inner),Hand Flexors',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(40,'Pectoralis Minor','Chest,Shoulder',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(41,'Popliteus','Knee flexor',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(42,'Quadratus Lumborum','Deep Low Back Lateral Flexor',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(43,'Quadriceps','Thigh (Front),Quads',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(44,'Rectus Abdominis','Waist (Belly),Abdominal,Abs',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(45,'Rhomboids','Back (Middle)',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(46,'Sartorius','Thigh (Inner),Tailor\'s muscle,Longest muscle in body',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(47,'Serratus Anterior','Serratus Magnus,Boxer\'s Muscle',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(48,'Soleus','Calf,Soleus',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(49,'Splenius','Neck (Rear),Neck Extensors',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(50,'Sternocleidomastoid','Sterno-mastoid,Neck (Front / Sides),Neck Flexors',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(51,'Subscapularis','Rotator Cuff,Back',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(52,'Supraspinatus','Rotatory Cuff,Shoulder',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0),(53,'Tensor Fasciae Latae','Hip,Hip Abductor/Flexor,Tensor Fasciae Femoris',NULL,0,1,'2021-06-27 13:54:02',NULL,NULL,0); +/*!40000 ALTER TABLE `muscle` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `muscle_image` +-- + +DROP TABLE IF EXISTS `muscle_image`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `muscle_image` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'The ID of muscle image.', + `muscle_id` bigint unsigned NOT NULL COMMENT 'The ID of muslce.', + `image_path` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'The image path of muscle image.', + `alternative_text` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'A textual description of the image.', + `created_by` bigint unsigned NOT NULL DEFAULT '1' COMMENT 'Created by', + `created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Created time', + `modified_by` bigint unsigned DEFAULT NULL COMMENT 'Modified by', + `modified_time` datetime DEFAULT NULL COMMENT 'Modified time', + `deleted` tinyint NOT NULL DEFAULT '0' COMMENT 'Deleted', + PRIMARY KEY (`id`), + UNIQUE KEY `muscle_image_image_path_uindex` (`image_path`) +) ENGINE=InnoDB AUTO_INCREMENT=61 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Muscle Image.\n\nThe relationship:\nOne muscle to one or more muscle image.'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `muscle_image` +-- + +LOCK TABLES `muscle_image` WRITE; +/*!40000 ALTER TABLE `muscle_image` DISABLE KEYS */; +INSERT INTO `muscle_image` VALUES (1,1,'upload/muscle-picture/adductors/AdductorAnteriorSmall.png','Adductors',1,'2021-06-27 13:54:16',NULL,NULL,0),(2,1,'upload/muscle-picture/adductors/AdductorPosteriorSmall.png','Adductors',1,'2021-06-27 13:54:16',NULL,NULL,0),(3,2,'upload/muscle-picture/biceps-brachii/BicepsInsideSmall.gif','Biceps Brachii',1,'2021-06-27 13:54:16',NULL,NULL,0),(4,3,'upload/muscle-picture/brachialis/BrachialisInsideSmall.gif','Brachialis',1,'2021-06-27 13:54:16',NULL,NULL,0),(5,3,'upload/muscle-picture/brachialis/BrachialisUpperArmSegmentSmall.gif','Brachialis',1,'2021-06-27 13:54:16',NULL,NULL,0),(6,4,'upload/muscle-picture/brachioradialis/BrachioradialisoutsideSmall.png','Brachioradialis',1,'2021-06-27 13:54:16',NULL,NULL,0),(7,6,'upload/muscle-picture/anterior/DeltoidAnteriorFront.gif','Anterior',1,'2021-06-27 13:54:16',NULL,NULL,0),(8,7,'upload/muscle-picture/lateral/DeltoidLateralBack.gif','Lateral',1,'2021-06-27 13:54:16',NULL,NULL,0),(9,8,'upload/muscle-picture/posterior/DeltoidPosteriorBack.gif','Posterior',1,'2021-06-27 13:54:16',NULL,NULL,0),(10,9,'upload/muscle-picture/deep-hip-external-rotators/DeepHipRotators.gif','Deep Hip External Rotators',1,'2021-06-27 13:54:16',NULL,NULL,0),(11,10,'upload/muscle-picture/erector-spinae/96a0e9eeb4ad8418eff179a9c59bc713.png','Erector Spinae',1,'2021-06-27 13:54:16',NULL,NULL,0),(12,10,'upload/muscle-picture/erector-spinae/ErectorSpinaeCrossSection.gif','Erector Spinae',1,'2021-06-27 13:54:16',NULL,NULL,0),(13,11,'upload/muscle-picture/gastrocnemius/GastrocnemiusLateral.gif','Gastrocnemius',1,'2021-06-27 13:54:16',NULL,NULL,0),(14,13,'upload/muscle-picture/maximus/80a4754b254e159c4cd5474b063d096e.png','Maximus',1,'2021-06-27 13:54:16',NULL,NULL,0),(15,14,'upload/muscle-picture/medius/GluteusMediusPosterior.gif','Medius',1,'2021-06-27 13:54:16',NULL,NULL,0),(16,15,'upload/muscle-picture/minimus/bf94c6ef8b7ca1c02323779e1fe3b837.png','Minimus',1,'2021-06-27 13:54:16',NULL,NULL,0),(17,15,'upload/muscle-picture/minimus/GluteusMinimusSide.gif','Minimus',1,'2021-06-27 13:54:16',NULL,NULL,0),(18,16,'upload/muscle-picture/gracilis/69c90b7fb98b9c863015a90b3ff3173c.png','Gracilis',1,'2021-06-27 13:54:16',NULL,NULL,0),(19,17,'upload/muscle-picture/hamstrings/1c94da8f4db345d0343c3db475d2d84d.png','Hamstrings',1,'2021-06-27 13:54:16',NULL,NULL,0),(20,18,'upload/muscle-picture/iliopsoas/99beae51baa19dc3d8ef62c04b469133.png','Iliopsoas',1,'2021-06-27 13:54:16',NULL,NULL,0),(21,18,'upload/muscle-picture/iliopsoas/ed4205586bfaf0b1603ad8e70dae6706.png','Iliopsoas',1,'2021-06-27 13:54:16',NULL,NULL,0),(22,19,'upload/muscle-picture/infraspinatus/3e3d3ded3335c56a7f932c6e38a3ed53.png','Infraspinatus',1,'2021-06-27 13:54:16',NULL,NULL,0),(23,20,'upload/muscle-picture/latissimus-dorsi/67f687e9482a2a6bca9a38544e45d31c.png','Latissimus Dorsi',1,'2021-06-27 13:54:16',NULL,NULL,0),(24,20,'upload/muscle-picture/latissimus-dorsi/LatSmall.png','Latissimus Dorsi',1,'2021-06-27 13:54:16',NULL,NULL,0),(25,21,'upload/muscle-picture/levator-scapulae/5083bc6f81d7a598832a5cb53340fb4a.png','Levator Scapulae',1,'2021-06-27 13:54:16',NULL,NULL,0),(26,22,'upload/muscle-picture/obliques/1d421470bb1b8650b68a055d15704abe.png','Obliques',1,'2021-06-27 13:54:16',NULL,NULL,0),(27,22,'upload/muscle-picture/obliques/ObliqueCrossSection.gif','Obliques',1,'2021-06-27 13:54:16',NULL,NULL,0),(28,23,'upload/muscle-picture/pectineous/52d884ea5ad22f197b0335468e4ca6e7.png','Pectineous',1,'2021-06-27 13:54:16',NULL,NULL,0),(29,25,'upload/muscle-picture/clavicular-head/11a9ea1af4fa3e206ec2eecc7e60100e.png','Clavicular Head',1,'2021-06-27 13:54:16',NULL,NULL,0),(30,25,'upload/muscle-picture/clavicular-head/0e1ed54440e102b3ec973207ea371964.png','Clavicular Head',1,'2021-06-27 13:54:16',NULL,NULL,0),(31,26,'upload/muscle-picture/sternal-head/5a6b344e7b8a52c715adf8b091461f7d.png','Sternal Head',1,'2021-06-27 13:54:16',NULL,NULL,0),(32,26,'upload/muscle-picture/sternal-head/PectoralAttachmentSmall.png','Sternal Head',1,'2021-06-27 13:54:16',NULL,NULL,0),(33,28,'upload/muscle-picture/major/TeresMajorSmall.png','Major',1,'2021-06-27 13:54:16',NULL,NULL,0),(34,29,'upload/muscle-picture/minor/TeresMinorSmall.png','Minor',1,'2021-06-27 13:54:16',NULL,NULL,0),(35,30,'upload/muscle-picture/tibialis-anterior/TibialisAnteriorSmall.png','Tibialis Anterior',1,'2021-06-27 13:54:16',NULL,NULL,0),(36,31,'upload/muscle-picture/transverse-abdominus/TransverseAbdominisCrossSectionNew.jpg','Transverse Abdominus',1,'2021-06-27 13:54:16',NULL,NULL,0),(37,33,'upload/muscle-picture/lower-fibers/TrapLowerHalfSmall.png','Lower Fibers',1,'2021-06-27 13:54:16',NULL,NULL,0),(38,34,'upload/muscle-picture/middle-fibers/TrapMiddleHalfSmall.png','Middle Fibers',1,'2021-06-27 13:54:16',NULL,NULL,0),(39,35,'upload/muscle-picture/upper-fibers/TrapUpperHalfSmall.png','Upper Fibers',1,'2021-06-27 13:54:16',NULL,NULL,0),(40,36,'upload/muscle-picture/triceps-brachii/TricepsOutsideSmall.gif','Triceps Brachii',1,'2021-06-27 13:54:16',NULL,NULL,0),(41,38,'upload/muscle-picture/extensors/WristExtensorsSupSmall.gif','Extensors',1,'2021-06-27 13:54:16',NULL,NULL,0),(42,39,'upload/muscle-picture/flexors/WristFlexorNeutSmall.gif','Flexors',1,'2021-06-27 13:54:16',NULL,NULL,0),(43,40,'upload/muscle-picture/pectoralis-minor/e7cda9218a2e2c84a31a7ca32e98c3a9.png','Pectoralis Minor',1,'2021-06-27 13:54:16',NULL,NULL,0),(44,41,'upload/muscle-picture/popliteus/PopliteusSmall.png','Popliteus',1,'2021-06-27 13:54:16',NULL,NULL,0),(45,42,'upload/muscle-picture/quadratus-lumborum/QuadratusLumborumSmall.png','Quadratus Lumborum',1,'2021-06-27 13:54:16',NULL,NULL,0),(46,43,'upload/muscle-picture/quadriceps/QuadricepsAnteriorSmall.png','Quadriceps',1,'2021-06-27 13:54:16',NULL,NULL,0),(47,44,'upload/muscle-picture/rectus-abdominis/RectusAbdominisWaistSmall.png','Rectus Abdominis',1,'2021-06-27 13:54:16',NULL,NULL,0),(48,44,'upload/muscle-picture/rectus-abdominis/RectusAbdominalCrossSectionNew.jpg','Rectus Abdominis',1,'2021-06-27 13:54:16',NULL,NULL,0),(49,45,'upload/muscle-picture/rhomboids/RhomboidsHalfSmall.png','Rhomboids',1,'2021-06-27 13:54:16',NULL,NULL,0),(50,46,'upload/muscle-picture/sartorius/SartoriusAnteriorSmall.png','Sartorius',1,'2021-06-27 13:54:16',NULL,NULL,0),(51,47,'upload/muscle-picture/serratus-anterior/SerratusAnteriorSideSmall.png','Serratus Anterior',1,'2021-06-27 13:54:16',NULL,NULL,0),(52,47,'upload/muscle-picture/serratus-anterior/SerratusAnteriorPullSmall.png','Serratus Anterior',1,'2021-06-27 13:54:16',NULL,NULL,0),(53,47,'upload/muscle-picture/serratus-anterior/SerratusScapulaTransverseCu.gif','Serratus Anterior',1,'2021-06-27 13:54:16',NULL,NULL,0),(54,48,'upload/muscle-picture/soleus/SoleusLateralSmall.png','Soleus',1,'2021-06-27 13:54:16',NULL,NULL,0),(55,49,'upload/muscle-picture/splenius/SpleniusSpineSmall.png','Splenius',1,'2021-06-27 13:54:16',NULL,NULL,0),(56,49,'upload/muscle-picture/splenius/SpeniusHalfSmall.png','Splenius',1,'2021-06-27 13:54:16',NULL,NULL,0),(57,50,'upload/muscle-picture/sternocleidomastoid/SternoSideSmall.png','Sternocleidomastoid',1,'2021-06-27 13:54:16',NULL,NULL,0),(58,51,'upload/muscle-picture/subscapularis/SubscapularisSmall.png','Subscapularis',1,'2021-06-27 13:54:16',NULL,NULL,0),(59,52,'upload/muscle-picture/supraspinatus/SupraspinatusBackSmall.png','Supraspinatus',1,'2021-06-27 13:54:16',NULL,NULL,0),(60,53,'upload/muscle-picture/tensor-fasciae-latae/TensorFasciaeLataeASmall.png','Tensor Fasciae Latae',1,'2021-06-27 13:54:16',NULL,NULL,0); +/*!40000 ALTER TABLE `muscle_image` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `permission` +-- + +DROP TABLE IF EXISTS `permission`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `permission` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'Primary key', + `url` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'URL. If type of record is page (1), URL stands for route; if type of record is button (2), URL stands for API', + `description` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'Permission description', + `type` tinyint NOT NULL COMMENT 'Permission type. 1 - page; 2 - button', + `permission_expression` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'Permission expression', + `method` enum('GET','HEAD','POST','PUT','DELETE','CONNECT','OPTIONS','TRACE','PATCH') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'HTTP method of API', + `sort` int NOT NULL DEFAULT '0' COMMENT 'Sort number', + `parent_id` bigint DEFAULT '0' COMMENT 'Primary key of parent', + `created_by` bigint unsigned NOT NULL DEFAULT '1' COMMENT 'Created by', + `created_time` datetime NOT NULL COMMENT 'Created time', + `modified_by` bigint unsigned DEFAULT NULL COMMENT 'Modified by', + `modified_time` datetime DEFAULT NULL COMMENT 'Modified time', + `deleted` tinyint NOT NULL DEFAULT '0' COMMENT 'Deleted flag', + PRIMARY KEY (`id`), + UNIQUE KEY `permission_expression_UNIQUE` (`permission_expression`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Permission.'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `permission` +-- + +LOCK TABLES `permission` WRITE; +/*!40000 ALTER TABLE `permission` DISABLE KEYS */; +/*!40000 ALTER TABLE `permission` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `related_muscle` +-- + +DROP TABLE IF EXISTS `related_muscle`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `related_muscle` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'The ID of related muscle.', + `muscle_id` bigint unsigned NOT NULL COMMENT 'The ID of muscle.', + `related_muscle_id` bigint unsigned NOT NULL COMMENT 'Related muscle''s ID.', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=56 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Muscle''s related muscles.'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `related_muscle` +-- + +LOCK TABLES `related_muscle` WRITE; +/*!40000 ALTER TABLE `related_muscle` DISABLE KEYS */; +INSERT INTO `related_muscle` VALUES (1,1,16),(2,2,3),(3,2,4),(4,3,2),(5,3,4),(6,4,3),(7,4,2),(8,10,49),(9,10,42),(10,11,48),(11,16,1),(12,16,17),(13,17,11),(14,17,46),(15,17,16),(16,18,46),(17,18,53),(18,21,45),(19,22,42),(20,22,44),(21,23,1),(22,23,18),(23,23,46),(24,23,53),(25,25,40),(26,26,40),(27,28,20),(28,29,19),(29,31,44),(30,31,22),(31,33,45),(32,34,45),(33,35,21),(34,40,47),(35,41,17),(36,42,22),(37,42,10),(38,43,18),(39,43,46),(40,43,53),(41,44,22),(42,45,32),(43,45,21),(44,45,47),(45,46,18),(46,46,53),(47,46,17),(48,47,40),(49,47,45),(50,48,11),(51,49,50),(52,49,10),(53,50,49),(54,53,18),(55,53,46); +/*!40000 ALTER TABLE `related_muscle` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `role` +-- + +DROP TABLE IF EXISTS `role`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `role` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'Primary key', + `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'Role name', + `description` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'Role description', + `created_by` bigint unsigned NOT NULL DEFAULT '1' COMMENT 'Created by', + `created_time` datetime NOT NULL COMMENT 'Created time', + `modified_by` bigint unsigned DEFAULT NULL COMMENT 'Modified by', + `modified_time` datetime DEFAULT NULL COMMENT 'Modified time', + `deleted` tinyint NOT NULL DEFAULT '0' COMMENT 'Deleted flag.', + PRIMARY KEY (`id`), + UNIQUE KEY `name_UNIQUE` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Role.'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `role` +-- + +LOCK TABLES `role` WRITE; +/*!40000 ALTER TABLE `role` DISABLE KEYS */; +INSERT INTO `role` VALUES (1,'admin','M&F system admin',1,'2020-05-09 16:18:51',1,'2020-05-09 16:18:45',0),(2,'guest','Guest for the system',1,'2021-06-29 11:37:33',NULL,NULL,0); +/*!40000 ALTER TABLE `role` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `role_permission` +-- + +DROP TABLE IF EXISTS `role_permission`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `role_permission` ( + `role_id` bigint NOT NULL COMMENT 'Primary key of role', + `permission_id` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'Primary key of permission', + PRIMARY KEY (`role_id`,`permission_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Role-permission Relation.'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `role_permission` +-- + +LOCK TABLES `role_permission` WRITE; +/*!40000 ALTER TABLE `role_permission` DISABLE KEYS */; +/*!40000 ALTER TABLE `role_permission` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `user` +-- + +DROP TABLE IF EXISTS `user`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `user` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'Primary key of user', + `username` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'Username', + `email` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'Email', + `cellphone` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'Cellphone number', + `password` varchar(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'Password', + `full_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'Full name', + `birthday` date DEFAULT NULL COMMENT 'Birthday', + `gender` enum('Agender','Androgyne','Bigender','Cisgender','Cisgender Female','Cisgender Male','Female to Male','Gender Fluid','Gender Nonconforming','Gender Questioning','Gender Variant','Genderqueer','Intersex','Male to Female','Neither','Neutrois','Non-binary','Other','Pangender','Transfeminine','Transgender','Transgender Female','Transgender Male','Transgender Person','Transmasculine','Two-Spirit') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '26 gender options', + `avatar` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'User avatar full path on SFTP server', + `status` tinyint NOT NULL DEFAULT '1' COMMENT 'Status. 1 - enabled, 2 - disabled', + `created_by` bigint unsigned NOT NULL DEFAULT '1' COMMENT 'Created by', + `created_time` datetime NOT NULL COMMENT 'Created time', + `modified_by` bigint unsigned DEFAULT NULL COMMENT 'Modified by', + `modified_time` datetime DEFAULT NULL COMMENT 'Modified time', + `deleted` tinyint NOT NULL DEFAULT '0' COMMENT 'Delete flag.', + PRIMARY KEY (`id`), + UNIQUE KEY `email_UNIQUE` (`email`), + UNIQUE KEY `username_UNIQUE` (`username`), + UNIQUE KEY `cellphone_UNIQUE` (`cellphone`), + KEY `user_username_email_cellphone_index` (`username`,`email`,`cellphone`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='User.'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `user` +-- + +LOCK TABLES `user` WRITE; +/*!40000 ALTER TABLE `user` DISABLE KEYS */; +INSERT INTO `user` VALUES (1,'ijohnnymiller','ijohnnymiller@icloud.com','13100959832','$2a$10$2wDrBjRykjsFoUZfKgogyOm0LxIg6EdH42uR3sQ8fHOQcKg5/Mvsm','Johnny Miller','1996-04-29','Cisgender Male',NULL,1,1,'2020-05-09 16:26:23',NULL,'2020-05-09 15:13:19',0),(2,'test1','test1@email.com',NULL,'$2a$10$Ft5LsGrnMoW2DNeboV.QV.w9r.meesdzwEOw1WMMUn/6zH.R9IW/K',NULL,NULL,NULL,NULL,1,1,'2021-06-27 11:21:38',NULL,'2021-06-27 11:21:38',0); +/*!40000 ALTER TABLE `user` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `user_role` +-- + +DROP TABLE IF EXISTS `user_role`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `user_role` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'The primary key', + `user_id` bigint unsigned NOT NULL COMMENT 'The primary key of user', + `role_id` bigint unsigned NOT NULL COMMENT 'The primary key of role', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='User-role Relation. Roles that users have.'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `user_role` +-- + +LOCK TABLES `user_role` WRITE; +/*!40000 ALTER TABLE `user_role` DISABLE KEYS */; +INSERT INTO `user_role` VALUES (1,1,1),(2,2,2); +/*!40000 ALTER TABLE `user_role` ENABLE KEYS */; +UNLOCK TABLES; +SET @@SESSION.SQL_LOG_BIN = @MYSQLDUMP_TEMP_LOG_BIN; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +-- Dump completed on 2021-07-04 15:21:59 diff --git a/docker/script/mysql-server-slave/3_quartz_tables_mysql_innodb.sql b/docker/script/mysql-server-slave/3_quartz_tables_mysql_innodb.sql new file mode 100644 index 00000000..d57295d1 --- /dev/null +++ b/docker/script/mysql-server-slave/3_quartz_tables_mysql_innodb.sql @@ -0,0 +1,183 @@ +# +# In your Quartz properties file, you'll need to set +# org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate +# +# +# By: Ron Cordell - roncordell +# I didn't see this anywhere, so I thought I'd post it here. This is the script from Quartz to create the tables in a MySQL database, modified to use INNODB instead of MYISAM. + +DROP DATABASE IF EXISTS QUARTZ_DB; +CREATE DATABASE QUARTZ_DB; +USE QUARTZ_DB; + +DROP TABLE IF EXISTS QRTZ_FIRED_TRIGGERS; +DROP TABLE IF EXISTS QRTZ_PAUSED_TRIGGER_GRPS; +DROP TABLE IF EXISTS QRTZ_SCHEDULER_STATE; +DROP TABLE IF EXISTS QRTZ_LOCKS; +DROP TABLE IF EXISTS QRTZ_SIMPLE_TRIGGERS; +DROP TABLE IF EXISTS QRTZ_SIMPROP_TRIGGERS; +DROP TABLE IF EXISTS QRTZ_CRON_TRIGGERS; +DROP TABLE IF EXISTS QRTZ_BLOB_TRIGGERS; +DROP TABLE IF EXISTS QRTZ_TRIGGERS; +DROP TABLE IF EXISTS QRTZ_JOB_DETAILS; +DROP TABLE IF EXISTS QRTZ_CALENDARS; + +CREATE TABLE QRTZ_JOB_DETAILS( +SCHED_NAME VARCHAR(120) NOT NULL, +JOB_NAME VARCHAR(190) NOT NULL, +JOB_GROUP VARCHAR(190) NOT NULL, +DESCRIPTION VARCHAR(250) NULL, +JOB_CLASS_NAME VARCHAR(250) NOT NULL, +IS_DURABLE VARCHAR(1) NOT NULL, +IS_NONCONCURRENT VARCHAR(1) NOT NULL, +IS_UPDATE_DATA VARCHAR(1) NOT NULL, +REQUESTS_RECOVERY VARCHAR(1) NOT NULL, +JOB_DATA BLOB NULL, +PRIMARY KEY (SCHED_NAME,JOB_NAME,JOB_GROUP)) +ENGINE=InnoDB; + +CREATE TABLE QRTZ_TRIGGERS ( +SCHED_NAME VARCHAR(120) NOT NULL, +TRIGGER_NAME VARCHAR(190) NOT NULL, +TRIGGER_GROUP VARCHAR(190) NOT NULL, +JOB_NAME VARCHAR(190) NOT NULL, +JOB_GROUP VARCHAR(190) NOT NULL, +DESCRIPTION VARCHAR(250) NULL, +NEXT_FIRE_TIME BIGINT(13) NULL, +PREV_FIRE_TIME BIGINT(13) NULL, +PRIORITY INTEGER NULL, +TRIGGER_STATE VARCHAR(16) NOT NULL, +TRIGGER_TYPE VARCHAR(8) NOT NULL, +START_TIME BIGINT(13) NOT NULL, +END_TIME BIGINT(13) NULL, +CALENDAR_NAME VARCHAR(190) NULL, +MISFIRE_INSTR SMALLINT(2) NULL, +JOB_DATA BLOB NULL, +PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP), +FOREIGN KEY (SCHED_NAME,JOB_NAME,JOB_GROUP) +REFERENCES QRTZ_JOB_DETAILS(SCHED_NAME,JOB_NAME,JOB_GROUP)) +ENGINE=InnoDB; + +CREATE TABLE QRTZ_SIMPLE_TRIGGERS ( +SCHED_NAME VARCHAR(120) NOT NULL, +TRIGGER_NAME VARCHAR(190) NOT NULL, +TRIGGER_GROUP VARCHAR(190) NOT NULL, +REPEAT_COUNT BIGINT(7) NOT NULL, +REPEAT_INTERVAL BIGINT(12) NOT NULL, +TIMES_TRIGGERED BIGINT(10) NOT NULL, +PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP), +FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) +REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)) +ENGINE=InnoDB; + +CREATE TABLE QRTZ_CRON_TRIGGERS ( +SCHED_NAME VARCHAR(120) NOT NULL, +TRIGGER_NAME VARCHAR(190) NOT NULL, +TRIGGER_GROUP VARCHAR(190) NOT NULL, +CRON_EXPRESSION VARCHAR(120) NOT NULL, +TIME_ZONE_ID VARCHAR(80), +PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP), +FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) +REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)) +ENGINE=InnoDB; + +CREATE TABLE QRTZ_SIMPROP_TRIGGERS + ( + SCHED_NAME VARCHAR(120) NOT NULL, + TRIGGER_NAME VARCHAR(190) NOT NULL, + TRIGGER_GROUP VARCHAR(190) NOT NULL, + STR_PROP_1 VARCHAR(512) NULL, + STR_PROP_2 VARCHAR(512) NULL, + STR_PROP_3 VARCHAR(512) NULL, + INT_PROP_1 INT NULL, + INT_PROP_2 INT NULL, + LONG_PROP_1 BIGINT NULL, + LONG_PROP_2 BIGINT NULL, + DEC_PROP_1 NUMERIC(13,4) NULL, + DEC_PROP_2 NUMERIC(13,4) NULL, + BOOL_PROP_1 VARCHAR(1) NULL, + BOOL_PROP_2 VARCHAR(1) NULL, + PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP), + FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) + REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)) +ENGINE=InnoDB; + +CREATE TABLE QRTZ_BLOB_TRIGGERS ( +SCHED_NAME VARCHAR(120) NOT NULL, +TRIGGER_NAME VARCHAR(190) NOT NULL, +TRIGGER_GROUP VARCHAR(190) NOT NULL, +BLOB_DATA BLOB NULL, +PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP), +INDEX (SCHED_NAME,TRIGGER_NAME, TRIGGER_GROUP), +FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) +REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)) +ENGINE=InnoDB; + +CREATE TABLE QRTZ_CALENDARS ( +SCHED_NAME VARCHAR(120) NOT NULL, +CALENDAR_NAME VARCHAR(190) NOT NULL, +CALENDAR BLOB NOT NULL, +PRIMARY KEY (SCHED_NAME,CALENDAR_NAME)) +ENGINE=InnoDB; + +CREATE TABLE QRTZ_PAUSED_TRIGGER_GRPS ( +SCHED_NAME VARCHAR(120) NOT NULL, +TRIGGER_GROUP VARCHAR(190) NOT NULL, +PRIMARY KEY (SCHED_NAME,TRIGGER_GROUP)) +ENGINE=InnoDB; + +CREATE TABLE QRTZ_FIRED_TRIGGERS ( +SCHED_NAME VARCHAR(120) NOT NULL, +ENTRY_ID VARCHAR(95) NOT NULL, +TRIGGER_NAME VARCHAR(190) NOT NULL, +TRIGGER_GROUP VARCHAR(190) NOT NULL, +INSTANCE_NAME VARCHAR(190) NOT NULL, +FIRED_TIME BIGINT(13) NOT NULL, +SCHED_TIME BIGINT(13) NOT NULL, +PRIORITY INTEGER NOT NULL, +STATE VARCHAR(16) NOT NULL, +JOB_NAME VARCHAR(190) NULL, +JOB_GROUP VARCHAR(190) NULL, +IS_NONCONCURRENT VARCHAR(1) NULL, +REQUESTS_RECOVERY VARCHAR(1) NULL, +PRIMARY KEY (SCHED_NAME,ENTRY_ID)) +ENGINE=InnoDB; + +CREATE TABLE QRTZ_SCHEDULER_STATE ( +SCHED_NAME VARCHAR(120) NOT NULL, +INSTANCE_NAME VARCHAR(190) NOT NULL, +LAST_CHECKIN_TIME BIGINT(13) NOT NULL, +CHECKIN_INTERVAL BIGINT(13) NOT NULL, +PRIMARY KEY (SCHED_NAME,INSTANCE_NAME)) +ENGINE=InnoDB; + +CREATE TABLE QRTZ_LOCKS ( +SCHED_NAME VARCHAR(120) NOT NULL, +LOCK_NAME VARCHAR(40) NOT NULL, +PRIMARY KEY (SCHED_NAME,LOCK_NAME)) +ENGINE=InnoDB; + +CREATE INDEX IDX_QRTZ_J_REQ_RECOVERY ON QRTZ_JOB_DETAILS(SCHED_NAME,REQUESTS_RECOVERY); +CREATE INDEX IDX_QRTZ_J_GRP ON QRTZ_JOB_DETAILS(SCHED_NAME,JOB_GROUP); + +CREATE INDEX IDX_QRTZ_T_J ON QRTZ_TRIGGERS(SCHED_NAME,JOB_NAME,JOB_GROUP); +CREATE INDEX IDX_QRTZ_T_JG ON QRTZ_TRIGGERS(SCHED_NAME,JOB_GROUP); +CREATE INDEX IDX_QRTZ_T_C ON QRTZ_TRIGGERS(SCHED_NAME,CALENDAR_NAME); +CREATE INDEX IDX_QRTZ_T_G ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_GROUP); +CREATE INDEX IDX_QRTZ_T_STATE ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_STATE); +CREATE INDEX IDX_QRTZ_T_N_STATE ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP,TRIGGER_STATE); +CREATE INDEX IDX_QRTZ_T_N_G_STATE ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_GROUP,TRIGGER_STATE); +CREATE INDEX IDX_QRTZ_T_NEXT_FIRE_TIME ON QRTZ_TRIGGERS(SCHED_NAME,NEXT_FIRE_TIME); +CREATE INDEX IDX_QRTZ_T_NFT_ST ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_STATE,NEXT_FIRE_TIME); +CREATE INDEX IDX_QRTZ_T_NFT_MISFIRE ON QRTZ_TRIGGERS(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME); +CREATE INDEX IDX_QRTZ_T_NFT_ST_MISFIRE ON QRTZ_TRIGGERS(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME,TRIGGER_STATE); +CREATE INDEX IDX_QRTZ_T_NFT_ST_MISFIRE_GRP ON QRTZ_TRIGGERS(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME,TRIGGER_GROUP,TRIGGER_STATE); + +CREATE INDEX IDX_QRTZ_FT_TRIG_INST_NAME ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,INSTANCE_NAME); +CREATE INDEX IDX_QRTZ_FT_INST_JOB_REQ_RCVRY ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,INSTANCE_NAME,REQUESTS_RECOVERY); +CREATE INDEX IDX_QRTZ_FT_J_G ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,JOB_NAME,JOB_GROUP); +CREATE INDEX IDX_QRTZ_FT_JG ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,JOB_GROUP); +CREATE INDEX IDX_QRTZ_FT_T_G ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP); +CREATE INDEX IDX_QRTZ_FT_TG ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,TRIGGER_GROUP); + +commit; diff --git a/docker/script/mysql-server-slave/4_replication_configuration.sql b/docker/script/mysql-server-slave/4_replication_configuration.sql new file mode 100644 index 00000000..b4dbc225 --- /dev/null +++ b/docker/script/mysql-server-slave/4_replication_configuration.sql @@ -0,0 +1,9 @@ +CHANGE MASTER TO + MASTER_HOST = 'maf-mysql-server-master', + MASTER_PORT = 3306, + MASTER_USER = 'replication_user', + MASTER_PASSWORD = 'replication_password', + GET_MASTER_PUBLIC_KEY = 1, + MASTER_AUTO_POSITION = 1; + +START SLAVE; diff --git a/exercise-mis/src/main/java/com/jmsoftware/maf/exercisemis/ExerciseMisApplication.java b/exercise-mis/src/main/java/com/jmsoftware/maf/exercisemis/ExerciseMisApplication.java deleted file mode 100644 index c35accb2..00000000 --- a/exercise-mis/src/main/java/com/jmsoftware/maf/exercisemis/ExerciseMisApplication.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.jmsoftware.maf.exercisemis; - -import com.jmsoftware.maf.exercisemis.universal.configuration.ProjectProperty; -import com.jmsoftware.maf.exercisemis.universal.configuration.ServerConfiguration; -import lombok.extern.slf4j.Slf4j; -import lombok.val; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cloud.client.discovery.EnableDiscoveryClient; -import org.springframework.cloud.openfeign.EnableFeignClients; - -import java.time.Duration; -import java.time.Instant; -import java.util.TimeZone; - -/** - *

ExerciseMisApplication

- *

- * Change description here. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2/17/20 8:41 PM - **/ -@Slf4j -@EnableFeignClients -@EnableDiscoveryClient -@SpringBootApplication -public class ExerciseMisApplication { - private static final String LINE_SEPARATOR = System.lineSeparator(); - private static ProjectProperty projectProperty; - private static ServerConfiguration serverConfiguration; - - public ExerciseMisApplication(ProjectProperty projectProperty, ServerConfiguration serverConfiguration) { - ExerciseMisApplication.projectProperty = projectProperty; - ExerciseMisApplication.serverConfiguration = serverConfiguration; - } - - public static void main(String[] args) { - val startInstant = Instant.now(); - SpringApplication.run(ExerciseMisApplication.class, args); - val endInstant = Instant.now(); - val duration = Duration.between(startInstant, endInstant); - log.info("🥳 Congratulations! 🎉"); - log.info("🖥 {}@{} started!", projectProperty.getProjectArtifactId(), projectProperty.getVersion()); - log.info("⚙️ Environment: {}", projectProperty.getEnvironment()); - log.info("⏳ Deployment duration: {} seconds ({} ms)", duration.getSeconds(), duration.toMillis()); - log.info("⏰ App started at {} (timezone - {})", endInstant, TimeZone.getDefault().getDisplayName()); - log.info("{} App running at{} - Local: http://localhost:{}{}/{} - Network: {}/", - LINE_SEPARATOR, LINE_SEPARATOR, serverConfiguration.getServerPort(), projectProperty.getContextPath(), - LINE_SEPARATOR, serverConfiguration.getBaseUrl()); - } -} diff --git a/exercise-mis/src/main/java/com/jmsoftware/maf/exercisemis/universal/configuration/DruidConfiguration.java b/exercise-mis/src/main/java/com/jmsoftware/maf/exercisemis/universal/configuration/DruidConfiguration.java deleted file mode 100644 index f93b00ea..00000000 --- a/exercise-mis/src/main/java/com/jmsoftware/maf/exercisemis/universal/configuration/DruidConfiguration.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.jmsoftware.maf.exercisemis.universal.configuration; - -import com.alibaba.druid.pool.DruidDataSource; -import com.alibaba.druid.support.http.StatViewServlet; -import com.alibaba.druid.support.http.WebStatFilter; -import lombok.RequiredArgsConstructor; -import lombok.val; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.boot.web.servlet.FilterRegistrationBean; -import org.springframework.boot.web.servlet.ServletRegistrationBean; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import javax.sql.DataSource; - -/** - *

DruidConfiguration

- *

- * Druid Configuration - * Click me to view Druid Monitor - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2019-03-24 13:31 - **/ -@Configuration -@RequiredArgsConstructor -public class DruidConfiguration { - @Bean - public ServletRegistrationBean druidServlet() { - val servletRegistrationBean = new ServletRegistrationBean<>(new StatViewServlet(), "/druid/*"); - servletRegistrationBean.addInitParameter("loginUsername", "admin"); - servletRegistrationBean.addInitParameter("loginPassword", "admin"); - servletRegistrationBean.addInitParameter("resetEnable", "false"); - return servletRegistrationBean; - } - - @Bean - public FilterRegistrationBean filterRegistrationBean() { - val filterRegistrationBean = new FilterRegistrationBean(); - filterRegistrationBean.setFilter(new WebStatFilter()); - filterRegistrationBean.addUrlPatterns("/*"); - // Ignored resources - filterRegistrationBean.addInitParameter("exclusions", - "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"); - filterRegistrationBean.addInitParameter("profileEnable", "true"); - filterRegistrationBean.addInitParameter("principalCookieName", "USER_COOKIE"); - filterRegistrationBean.addInitParameter("principalSessionName", "USER_SESSION"); - return filterRegistrationBean; - } - - @Bean - @ConfigurationProperties(prefix = "spring.datasource") - public DataSource druidDataSource() { - return new DruidDataSource(); - } -} diff --git a/exercise-mis/src/main/java/com/jmsoftware/maf/exercisemis/universal/configuration/MyBatisPlusConfiguration.java b/exercise-mis/src/main/java/com/jmsoftware/maf/exercisemis/universal/configuration/MyBatisPlusConfiguration.java deleted file mode 100644 index 97b64313..00000000 --- a/exercise-mis/src/main/java/com/jmsoftware/maf/exercisemis/universal/configuration/MyBatisPlusConfiguration.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.jmsoftware.maf.exercisemis.universal.configuration; - -import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor; -import com.baomidou.mybatisplus.extension.plugins.pagination.optimize.JsqlParserCountOptimize; -import lombok.val; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.transaction.annotation.EnableTransactionManagement; - -/** - *

MyBatisPlusConfiguration

- *

- * Change description here. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2019-05-02 11:57 - **/ -@Configuration -@EnableTransactionManagement -public class MyBatisPlusConfiguration { - /** - * Inject bean to enable pagination. - * - * @return bean for pagination - */ - @Bean - public PaginationInterceptor paginationInterceptor() { - val paginationInterceptor = new PaginationInterceptor(); - // Set maximum query record count - paginationInterceptor.setLimit(100L); - // Enable JSQL Parser Count Optimizing (for left join) - paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true)); - return paginationInterceptor; - } -} diff --git a/exercise-mis/src/main/java/com/jmsoftware/maf/exercisemis/universal/configuration/ProjectProperty.java b/exercise-mis/src/main/java/com/jmsoftware/maf/exercisemis/universal/configuration/ProjectProperty.java deleted file mode 100644 index 771c6829..00000000 --- a/exercise-mis/src/main/java/com/jmsoftware/maf/exercisemis/universal/configuration/ProjectProperty.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.jmsoftware.maf.exercisemis.universal.configuration; - -import lombok.Data; -import lombok.extern.slf4j.Slf4j; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.stereotype.Component; - -/** - *

ProjectProperty

- *

- * Change description here. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2019-04-18 13:01 - **/ -@Slf4j -@Data -@Component -@ConfigurationProperties(prefix = "project.property") -public class ProjectProperty { - private String basePackage; - private String contextPath; - private String groupId; - private String projectParentArtifactId; - private String projectArtifactId; - private String version; - private String description; - private String jdkVersion; - private String environment; - private String url; - private String inceptionYear; - private String organizationName; - private String organizationUrl; - private String issueManagementSystem; - private String issueManagementUrl; - private String developerName; - private String developerEmail; - private String developerUrl; -} diff --git a/exercise-mis/src/main/java/com/jmsoftware/maf/exercisemis/universal/configuration/ServerConfiguration.java b/exercise-mis/src/main/java/com/jmsoftware/maf/exercisemis/universal/configuration/ServerConfiguration.java deleted file mode 100644 index 01656095..00000000 --- a/exercise-mis/src/main/java/com/jmsoftware/maf/exercisemis/universal/configuration/ServerConfiguration.java +++ /dev/null @@ -1,118 +0,0 @@ -package com.jmsoftware.maf.exercisemis.universal.configuration; - -import lombok.Getter; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import lombok.val; -import org.springframework.boot.web.context.WebServerInitializedEvent; -import org.springframework.context.ApplicationListener; -import org.springframework.stereotype.Component; - -import java.io.BufferedReader; -import java.io.InputStreamReader; -import java.net.Inet4Address; -import java.net.InetAddress; -import java.net.NetworkInterface; -import java.net.URL; -import java.util.Enumeration; - -/** - *

ServerConfiguration

- *

- * Change description here. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2019-04-26 16:02 - **/ -@Slf4j -@Getter -@Component -@RequiredArgsConstructor -public class ServerConfiguration implements ApplicationListener { - private static final String DEVELOPMENT_ENVIRONMENT = "development"; - private final ProjectProperty projectProperty; - private int serverPort; - - @Override - public void onApplicationEvent(WebServerInitializedEvent event) { - this.serverPort = event.getWebServer().getPort(); - } - - /** - *

Get base URL of backend server.

- *

The result will be like:

- *
    - *
  1. http://[serverIp]:[serverPort]/[contextPath]
  2. - *
  3. https://[serverIp]/[contextPath]
  4. - *
- * - * @return base URL - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2019-05-03 16:05 - */ - public String getBaseUrl() { - return "http://" + this.getPublicIp() + ":" + serverPort + projectProperty.getContextPath(); - } - - /** - * Find public IP address. - * - * @return public IP - */ - public String getPublicIp() { - if (projectProperty.getEnvironment().contains(DEVELOPMENT_ENVIRONMENT)) { - return this.getInternetIp(); - } - try { - // An API provided by https://whatismyipaddress.com/api - val url = new URL("https://ipv4bot.whatismyipaddress.com/"); - val sc = new BufferedReader(new InputStreamReader(url.openStream())); - // Read system IP Address - return sc.readLine().trim(); - } catch (Exception e) { - log.error("Cannot execute properly to get IP address from https://whatismyipaddress.com/api", e); - } - return this.getInternetIp(); - } - - /** - * Get internet IP. - * - * @return internet IP - */ - private String getInternetIp() { - val intranetIp = this.getIntranetIp(); - try { - val networks = NetworkInterface.getNetworkInterfaces(); - InetAddress ip; - Enumeration addresses; - while (networks.hasMoreElements()) { - addresses = networks.nextElement().getInetAddresses(); - while (addresses.hasMoreElements()) { - ip = addresses.nextElement(); - if (ip instanceof Inet4Address - && ip.isSiteLocalAddress() - && !ip.getHostAddress().equals(intranetIp)) { - return ip.getHostAddress(); - } - } - } - return intranetIp; - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - /** - * Get intranet IP. - * - * @return intranet IP - */ - private String getIntranetIp() { - try { - return InetAddress.getLocalHost().getHostAddress(); - } catch (Exception e) { - throw new RuntimeException(e); - } - } -} diff --git a/exercise-mis/src/main/java/com/jmsoftware/maf/exercisemis/universal/configuration/Swagger2Configuration.java b/exercise-mis/src/main/java/com/jmsoftware/maf/exercisemis/universal/configuration/Swagger2Configuration.java deleted file mode 100644 index 4437d5f4..00000000 --- a/exercise-mis/src/main/java/com/jmsoftware/maf/exercisemis/universal/configuration/Swagger2Configuration.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.jmsoftware.maf.exercisemis.universal.configuration; - -import lombok.RequiredArgsConstructor; -import lombok.val; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import springfox.documentation.builders.ApiInfoBuilder; -import springfox.documentation.builders.PathSelectors; -import springfox.documentation.builders.RequestHandlerSelectors; -import springfox.documentation.service.ApiInfo; -import springfox.documentation.service.Contact; -import springfox.documentation.spi.DocumentationType; -import springfox.documentation.spring.web.plugins.Docket; -import springfox.documentation.swagger2.annotations.EnableSwagger2; - -/** - *

Swagger2Configuration

- *

- * Swagger 2 Configuration - * Click me to view - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2019-02-07 16:15 - **/ -@Configuration -@EnableSwagger2 -@RequiredArgsConstructor -public class Swagger2Configuration { - private final ProjectProperty projectProperty; - private static final String LINE_SEPARATOR = System.lineSeparator(); - - @Bean - public Docket createRestApi() { - return new Docket(DocumentationType.SWAGGER_2) - .apiInfo(apiInfo()) - .select() - .apis(RequestHandlerSelectors.basePackage(projectProperty.getBasePackage())) - .paths(PathSelectors.any()) - .build(); - } - - private ApiInfo apiInfo() { - val projectArtifactId = projectProperty.getProjectArtifactId(); - val version = projectProperty.getVersion(); - val developerEmail = projectProperty.getDeveloperEmail(); - val developerUrl = projectProperty.getDeveloperUrl(); - return new ApiInfoBuilder() - .title(String.format("API for %s@%s", projectArtifactId, version)) - .description(String.format("%s %sArtifact ID: %s%sEnvironment: %s", - projectProperty.getDescription(), - LINE_SEPARATOR, - projectArtifactId, - LINE_SEPARATOR, - projectProperty.getEnvironment())) - .contact(new Contact(String.format("%s, email: %s%sHome page: %s", - projectProperty.getDeveloperName(), - developerEmail, - LINE_SEPARATOR, - developerUrl), - developerUrl, developerEmail)) - .version(version) - .build(); - } -} diff --git a/exercise-mis/src/main/java/com/jmsoftware/maf/exercisemis/universal/controller/ErrorController.java b/exercise-mis/src/main/java/com/jmsoftware/maf/exercisemis/universal/controller/ErrorController.java deleted file mode 100644 index c950dba0..00000000 --- a/exercise-mis/src/main/java/com/jmsoftware/maf/exercisemis/universal/controller/ErrorController.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.jmsoftware.maf.exercisemis.universal.controller; - -import io.swagger.annotations.Api; -import lombok.extern.slf4j.Slf4j; -import lombok.val; -import org.springframework.boot.autoconfigure.web.ServerProperties; -import org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController; -import org.springframework.boot.autoconfigure.web.servlet.error.ErrorViewResolver; -import org.springframework.boot.web.servlet.error.ErrorAttributes; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.RestController; - -import javax.servlet.http.HttpServletRequest; -import java.util.List; -import java.util.Map; -import java.util.Optional; - -/** - *

ErrorController

- *

- * Error controller. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2019-03-02 16:56 - **/ -@Slf4j -@RestController -@Api(tags = {"Error Controller"}) -public class ErrorController extends BasicErrorController { - public ErrorController(ErrorAttributes errorAttributes, - ServerProperties serverProperties, - List errorViewResolvers) { - super(errorAttributes, serverProperties.getError(), errorViewResolvers); - } - - @Override - public ResponseEntity> error(HttpServletRequest request) { - val httpStatus = getStatus(request); - val body = getErrorAttributes(request, isIncludeStackTrace(request, MediaType.ALL)); - body.put("message", httpStatus.getReasonPhrase()); - val optionalTrace = Optional.ofNullable(body.get("trace")); - optionalTrace.ifPresent(trace -> { - val message = body.get("message"); - val firstLineOfTrace = trace.toString().split("\\n")[0]; - val joinedMessage = String.format("%s %s", message, firstLineOfTrace); - body.put("message", joinedMessage); - body.put("trace", "Trace has been simplified. Refer to 'message'"); - }); - log.error("Captured HTTP request error. Response body = {}", body); - return new ResponseEntity<>(body, httpStatus); - } -} diff --git a/exercise-mis/src/main/java/com/jmsoftware/maf/exercisemis/universal/controller/RedirectController.java b/exercise-mis/src/main/java/com/jmsoftware/maf/exercisemis/universal/controller/RedirectController.java deleted file mode 100644 index bdbce6c5..00000000 --- a/exercise-mis/src/main/java/com/jmsoftware/maf/exercisemis/universal/controller/RedirectController.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.jmsoftware.maf.exercisemis.universal.controller; - -import com.jmsoftware.maf.exercisemis.universal.configuration.ProjectProperty; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RestController; - -import javax.annotation.PostConstruct; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; - -/** - *

RedirectController

- *

- * HTTP Redirect Controller - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 1/21/20 1:18 PM - **/ -@Slf4j -@RestController -@RequiredArgsConstructor -@Api(tags = {"Redirect Controller"}) -public class RedirectController { - private final ProjectProperty projectProperty; - - @PostConstruct - private void postConstruct() { - log.info("URL redirect service initialized."); - } - - @GetMapping("/home") - @ApiOperation(value = "/home", notes = "Home page") - public void handleHomeRequest(HttpServletResponse response) throws IOException { - // Redirect to home page - response.sendRedirect(projectProperty.getContextPath() + "static/home.html"); - } - - @GetMapping("/doc") - @ApiOperation(value = "/doc", notes = "Swagger API Documentation") - public void handleDocRequest(HttpServletResponse response) throws IOException { - // Redirect to Bootstrap Swagger API documentation - response.sendRedirect(projectProperty.getContextPath() + "/doc.html?cache=1&lang=en"); - } - - @GetMapping("/webjars/bycdao-ui/images/api.ico") - @ApiOperation(value = "/webjars/bycdao-ui/images/api.ico", notes = "Favicon redirection") - public void handleFaviconRequest(HttpServletResponse response) throws IOException { - // Redirect to a customized favicon - response.sendRedirect(projectProperty.getContextPath() + "/static/icon/favicon.ico"); - } -} diff --git a/exercise-mis/src/main/java/com/jmsoftware/maf/exercisemis/universal/service/CommonService.java b/exercise-mis/src/main/java/com/jmsoftware/maf/exercisemis/universal/service/CommonService.java deleted file mode 100644 index 7c65d38c..00000000 --- a/exercise-mis/src/main/java/com/jmsoftware/maf/exercisemis/universal/service/CommonService.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.jmsoftware.maf.exercisemis.universal.service; - -import com.jmsoftware.maf.common.domain.ValidationTestPayload; -import org.springframework.validation.annotation.Validated; - -import javax.validation.Valid; -import java.util.Map; - -/** - *

CommonService

- *

- * Change description here. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2/4/20 11:15 AM - */ -@Validated -public interface CommonService { - /** - * Gets application info. - * - * @return the application info. - */ - Map getApplicationInfo(); - - /** - * Validate object. - * - * @param payload the payload - */ - void validateObject(@Valid ValidationTestPayload payload); -} diff --git a/exercise-mis/src/main/java/com/jmsoftware/maf/exercisemis/universal/service/impl/CommonServiceImpl.java b/exercise-mis/src/main/java/com/jmsoftware/maf/exercisemis/universal/service/impl/CommonServiceImpl.java deleted file mode 100644 index 66e88830..00000000 --- a/exercise-mis/src/main/java/com/jmsoftware/maf/exercisemis/universal/service/impl/CommonServiceImpl.java +++ /dev/null @@ -1,122 +0,0 @@ -package com.jmsoftware.maf.exercisemis.universal.service.impl; - -import com.jmsoftware.maf.common.domain.ValidationTestPayload; -import com.jmsoftware.maf.exercisemis.universal.configuration.ProjectProperty; -import com.jmsoftware.maf.exercisemis.universal.service.CommonService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import javax.validation.Valid; -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - *

CommonServiceImpl

- *

- * Change description here. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2/4/20 11:16 AM - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class CommonServiceImpl implements CommonService { - private final ProjectProperty projectProperty; - - @Override - public Map getApplicationInfo() { - var map = new HashMap(16); - var fieldsInfo = getFieldsInfo(projectProperty); - fieldsInfo.forEach(fieldInfo -> { - var type = fieldInfo.get("type"); - if ("class java.lang.String".equals(type)) { - map.put((String) fieldInfo.get("name"), fieldInfo.get("value")); - } - }); - return map; - } - - @Override - public void validateObject(@Valid ValidationTestPayload payload) { - log.info("Validation passed! {}", payload); - } - - /** - * Gets field value by name. - * - * @param fieldName the field name - * @param object the object - * @return the field value by name - * @see Java 中遍历一个对象的所有属性 - */ - private Object getFieldValueByName(String fieldName, Object object) { - try { - String firstLetter = fieldName.substring(0, 1).toUpperCase(); - String getter = "get" + firstLetter + fieldName.substring(1); - Method method = object.getClass().getMethod(getter); - return method.invoke(object); - } catch (Exception e) { - log.error("Can't get field's value by name! Cause: {}", e.getMessage()); - return null; - } - } - - /** - * Get filed name string [ ]. - * - * @param o the o - * @return the string [ ] - * @see Java 中遍历一个对象的所有属性 - */ - private String[] getFiledName(Object o) { - Field[] fields = o.getClass().getDeclaredFields(); - String[] fieldNames = new String[fields.length]; - for (int i = 0; i < fields.length; i++) { - log.info("fields[i].getType(): {}", fields[i].getType()); - fieldNames[i] = fields[i].getName(); - } - return fieldNames; - } - - /** - * Get Fields Info - * - * @param o the o - * @return the fields info - * @see Java 中遍历一个对象的所有属性 - */ - private List> getFieldsInfo(Object o) { - Field[] fields = o.getClass().getDeclaredFields(); - var arrayList = new ArrayList>(); - for (Field field : fields) { - var infoMap = new HashMap(16); - infoMap.put("type", field.getType().toString()); - infoMap.put("name", field.getName()); - infoMap.put("value", getFieldValueByName(field.getName(), o)); - arrayList.add(infoMap); - } - return arrayList; - } - - /** - * Get Filed Values - * - * @param o the o - * @return the object [ ] - * @see Java 中遍历一个对象的所有属性 - */ - public Object[] getFiledValues(Object o) { - String[] fieldNames = this.getFiledName(o); - Object[] value = new Object[fieldNames.length]; - for (int i = 0; i < fieldNames.length; i++) { - value[i] = this.getFieldValueByName(fieldNames[i], o); - } - return value; - } -} diff --git a/exercise-mis/src/main/resources/application-development-docker.yml b/exercise-mis/src/main/resources/application-development-docker.yml deleted file mode 100644 index 65f9b605..00000000 --- a/exercise-mis/src/main/resources/application-development-docker.yml +++ /dev/null @@ -1,20 +0,0 @@ -eureka: - client: - serviceUrl: - defaultZone: http://maf.service-registry.dev:8760/eureka/ - -spring: - zipkin: - base-url: http://maf.open-zipkin.dev:9411 - datasource: - name: muscle_and_fitness - driver-class-name: com.mysql.cj.jdbc.Driver - type: com.alibaba.druid.pool.DruidDataSource - url: jdbc:mysql://maf.mysql.dev:3306/muscle_and_fitness?useSSL=true&useUnicode=true - username: root - password: jm@mysql - -logging: - # Configure logging level for SFTP/JSCH - level: - com.jcraft.jsch: INFO diff --git a/exercise-mis/src/main/resources/application-development-local.yml b/exercise-mis/src/main/resources/application-development-local.yml deleted file mode 100644 index 5c2d67b4..00000000 --- a/exercise-mis/src/main/resources/application-development-local.yml +++ /dev/null @@ -1,23 +0,0 @@ -eureka: - client: - serviceUrl: - defaultZone: http://localhost:8760/eureka/ - -spring: - zipkin: - base-url: http://localhost:9411 - datasource: - name: muscle_and_fitness - driver-class-name: com.mysql.cj.jdbc.Driver - type: com.alibaba.druid.pool.DruidDataSource - url: jdbc:mysql://localhost:3306/muscle_and_fitness?useSSL=true&useUnicode=true - username: root - password: jm@mysql - devtools: - restart: - enabled: true - -logging: - # Configure logging level for SFTP/JSCH - level: - com.jcraft.jsch: INFO diff --git a/exercise-mis/src/main/resources/application-production.yml b/exercise-mis/src/main/resources/application-production.yml deleted file mode 100644 index 4c566437..00000000 --- a/exercise-mis/src/main/resources/application-production.yml +++ /dev/null @@ -1,20 +0,0 @@ -eureka: - client: - serviceUrl: - defaultZone: http://172.16.4.20:8760/eureka/ - -spring: - zipkin: - base-url: http://172.16.4.13:9411 - datasource: - name: muscle_and_fitness - driver-class-name: com.mysql.cj.jdbc.Driver - type: com.alibaba.druid.pool.DruidDataSource - url: jdbc:mysql://172.16.4.10:3306/muscle_and_fitness?useSSL=true&useUnicode=true - username: root - password: jm@mysql - -logging: - # Configure logging level for SFTP/JSCH - level: - com.jcraft.jsch: INFO diff --git a/exercise-mis/src/main/resources/application-stage.yml b/exercise-mis/src/main/resources/application-stage.yml deleted file mode 100644 index 30f315e8..00000000 --- a/exercise-mis/src/main/resources/application-stage.yml +++ /dev/null @@ -1,20 +0,0 @@ -eureka: - client: - serviceUrl: - defaultZone: http://172.16.3.20:8760/eureka/ - -spring: - zipkin: - base-url: http://172.16.3.13:9411 - datasource: - name: muscle_and_fitness - driver-class-name: com.mysql.cj.jdbc.Driver - type: com.alibaba.druid.pool.DruidDataSource - url: jdbc:mysql://172.16.3.10:3306/muscle_and_fitness?useSSL=true&useUnicode=true - username: root - password: jm@mysql - -logging: - # Configure logging level for SFTP/JSCH - level: - com.jcraft.jsch: INFO diff --git a/exercise-mis/src/main/resources/application-test.yml b/exercise-mis/src/main/resources/application-test.yml deleted file mode 100644 index c8e5dec9..00000000 --- a/exercise-mis/src/main/resources/application-test.yml +++ /dev/null @@ -1,20 +0,0 @@ -eureka: - client: - serviceUrl: - defaultZone: http://172.16.2.20:8760/eureka/ - -spring: - zipkin: - base-url: http://172.16.2.13:9411 - datasource: - name: muscle_and_fitness - driver-class-name: com.mysql.cj.jdbc.Driver - type: com.alibaba.druid.pool.DruidDataSource - url: jdbc:mysql://172.16.2.10:3306/muscle_and_fitness?useSSL=true&useUnicode=true - username: root - password: jm@mysql - -logging: - # Configure logging level for SFTP/JSCH - level: - com.jcraft.jsch: INFO diff --git a/exercise-mis/src/main/resources/application.yml b/exercise-mis/src/main/resources/application.yml deleted file mode 100644 index 4de91bed..00000000 --- a/exercise-mis/src/main/resources/application.yml +++ /dev/null @@ -1,101 +0,0 @@ -server: - port: @exercise-mis.port@ - tomcat: - uri-encoding: @project.build.sourceEncoding@ - -spring: - application: - name: @project.artifactId@ - profiles: - active: @env@ - mvc: - throw-exception-if-no-handler-found: true - jackson: - date-format: yyyy-MM-dd HH:mm:ss - time-zone: Asia/Hong_Kong - sleuth: - sampler: - probability: 1.0 - servlet: - multipart: - # `location` specifies the directory where uploaded files will be stored. When not specified, - # a temporary directory will be used. ATTENTION: it may differ due to OS. - location: /Users/johnny/Documents/@project.artifactId@/temprary-file - # `max-file-size` specifies the maximum size permitted for uploaded files. The default is 1MB. We set it as 64 MB. - max-file-size: 64MB - # `max-request-size` specifies the maximum size allowed for multipart/form-data requests. The default is 10MB. - max-request-size: 70MB - # `file-size-threshold` specifies the size threshold after which files will be written to disk. - # The default is 0. We set it as 0 too. - file-size-threshold: 0 - -eureka: - instance: - leaseRenewalIntervalInSeconds: 10 - health-check-url-path: /actuator/health - status-page-url-path: / - metadata-map: - # needed to trigger info and endpoint update after restart - startup: ${random.int} - instance-id: ${spring.cloud.client.ip-address}:${server.port}@${spring.cloud.client.hostname}@${spring.application.name}-${random.int} - prefer-ip-address: true - client: - registryFetchIntervalSeconds: 5 - -feign: - client: - config: - default: - connectTimeout: 5000 - readTimeout: 10000 - loggerLevel: full - compression: - request: - enabled: true - response: - enabled: true - useGzipDecoder: true - -management: - endpoints: - web: - exposure: - include: "*" - endpoint: - health: - show-details: ALWAYS - -mybatis-plus: - configuration: - map-underscore-to-camel-case: true - log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl - # mapper-locations should start with `classpath*` prefix - # when project is based on Maven multi-module to load XML mapper in different jar - mapper-locations: classpath*:/mapper/**/*Mapper.xml - -logging: - config: classpath:configuration/logback/logback-@env@.xml - # Configure logging level of project as DEBUG to enable SQL logging and other logging. - level: - com.jmsoftware: DEBUG - -project: - property: - base-package: com.jmsoftware.maf.exercisemis - context-path: - group-id: @project.groupId@ - project-parent-artifact-id: @project.parent.artifactId@ - project-artifact-id: @project.artifactId@ - version: @project.version@ - description: @project.description@ - jdk-version: @java.version@ - environment: @env@ - url: @project.url@ - inception-year: @inceptionYear@ - organization-name: @project.organization.name@ - organization-url: @project.organization.url@ - issue-management-system: @project.issueManagement.system@ - issue-management-url: @project.issueManagement.url@ - developer-name: @developerName@ - developer-email: @developerEmail@ - developer-url: @developerUrl@ diff --git a/exercise-mis/src/main/resources/configuration/.empty b/exercise-mis/src/main/resources/configuration/.empty deleted file mode 100644 index e69de29b..00000000 diff --git a/exercise-mis/src/main/resources/static/home.html b/exercise-mis/src/main/resources/static/home.html deleted file mode 100644 index e7599316..00000000 --- a/exercise-mis/src/main/resources/static/home.html +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - UNSET - - - - -

-
- Hello, World! - - Welcome to {{ projectArtifactId }}@{{ version }}! - - - - {{ applicationName }} - -
-
- Create New Person -
- - -
-
- - -
-
- - -
-
- - -
-
- - - - - - - - - - - - - - - - - -
NameAgeSexDelete
{{ person.name }}{{ person.age }}{{ person.sex }} - -
- This page is provided by - keepfool. - -
- - - - diff --git a/exercise-mis/src/main/resources/static/icon/favicon.ico b/exercise-mis/src/main/resources/static/icon/favicon.ico deleted file mode 100644 index 0798d38f..00000000 Binary files a/exercise-mis/src/main/resources/static/icon/favicon.ico and /dev/null differ diff --git a/exercise-mis/src/main/resources/static/image/muscle-and-fitness-server-social-image.png b/exercise-mis/src/main/resources/static/image/muscle-and-fitness-server-social-image.png deleted file mode 100644 index 83786ad8..00000000 Binary files a/exercise-mis/src/main/resources/static/image/muscle-and-fitness-server-social-image.png and /dev/null differ diff --git a/exercise-mis/src/main/resources/static/script/404.js b/exercise-mis/src/main/resources/static/script/404.js deleted file mode 100644 index 5401ce54..00000000 --- a/exercise-mis/src/main/resources/static/script/404.js +++ /dev/null @@ -1,12 +0,0 @@ -// noinspection JSUnusedGlobalSymbols -const vm = new Vue({ - el: '#app', - data: {}, - methods: { - handleClickGoToHome: function () { - const currentUrl = window.location.href; - const split = currentUrl.split('/'); - window.location.href = `${split[0]}//${split[2]}/${split[3]}`; - } - } -}); diff --git a/exercise-mis/src/main/resources/static/script/home.js b/exercise-mis/src/main/resources/static/script/home.js deleted file mode 100644 index a191d8c5..00000000 --- a/exercise-mis/src/main/resources/static/script/home.js +++ /dev/null @@ -1,72 +0,0 @@ -// noinspection JSUnusedGlobalSymbols -const vm = new Vue({ - el: '#app', - data: { - projectArtifactId: null, - version: null, - applicationName: null, - newPerson: { - name: '', - age: 0, - sex: 'Male' - }, - people: [{ - name: 'Jack', - age: 30, - sex: 'Male' - }, { - name: 'Bill', - age: 26, - sex: 'Male' - }, { - name: 'Tracy', - age: 22, - sex: 'Female' - }, { - name: 'Chris', - age: 36, - sex: 'Male' - }] - }, - methods: { - /** - * Create a person - */ - createPerson: function () { - this.people.push(this.newPerson); - this.newPerson = {name: '', age: 0, sex: 'Male'} - - }, - /** - * delete a person - * @param index - */ - deletePerson: function (index) { - this.people.splice(index, 1); - }, - handleClickSwaggerApiDocumentation: function () { - const currentUrl = window.location.href; - const split = currentUrl.split('/'); - window.location.href = `${split[0]}//${split[2]}/doc`; - }, - handleClickVideoDemo: function () { - const currentUrl = window.location.href; - const split = currentUrl.split('/'); - window.location.href = `${split[0]}//${split[2]}/${split[3]}/video.html`; - }, - getAppInfo: async function () { - const currentUrl = window.location.href; - const split = currentUrl.split('/'); - const baseUrl = `${split[0]}//${split[2]}`; - const response = await fetch(`${baseUrl}/common/app-info`); - const responseJson = await response.json(); - this.projectArtifactId = responseJson.data.projectArtifactId; - this.version = responseJson.data.version; - this.applicationName = this.projectArtifactId.toUpperCase(); - window.document.title = this.applicationName; - } - }, - mounted: async function () { - this.getAppInfo(); - } -}); diff --git a/exercise-mis/src/main/resources/static/script/video.js b/exercise-mis/src/main/resources/static/script/video.js deleted file mode 100644 index 3a155900..00000000 --- a/exercise-mis/src/main/resources/static/script/video.js +++ /dev/null @@ -1,17 +0,0 @@ -// noinspection JSUnusedGlobalSymbols -const vm = new Vue({ - el: '#app', - data: { - appInfo: null, - videoSource: '' - }, - async mounted() { - const currentUrl = window.location.href; - const split = currentUrl.split('/'); - this.videoSource = `${split[0]}//${split[2]}/${split[3]}/test-table/demo-video`; - const baseUrl = `${split[0]}//${split[2]}`; - const response = await fetch(`${baseUrl}/common/app-info`); - const responseJson = await response.json(); - this.appInfo = responseJson.data; - } -}); diff --git a/exercise-mis/src/main/resources/static/styles/404.css b/exercise-mis/src/main/resources/static/styles/404.css deleted file mode 100644 index 09a4e9bc..00000000 --- a/exercise-mis/src/main/resources/static/styles/404.css +++ /dev/null @@ -1,89 +0,0 @@ -* { - margin: 0; - padding: 0; - box-sizing: border-box -} - -html { - font-size: 12px; - font-family: Ubuntu, simHei, sans-serif; - font-weight: 400 -} - -body { - font-size: 1rem -} - -button { - outline: none; - padding: 5px 8px; - color: #fff; - border: 1px solid #BCBCBC; - border-radius: 3px; - background-color: #009A61; - cursor: pointer; -} - -button:hover { - opacity: 0.8; -} - -#app { - margin: 48px auto 0; - max-width: 640px; - -webkit-perspective: 500px; -} - -.text-center { - text-align: center; -} - -.message-box { - background-color: firebrick; - max-width: 700px; - padding: 20px; - border-radius: 8px; - margin: 48px auto 20px; -} - -.slide-in-bck-center { - animation: slide-in-bck-center 1.2s cubic-bezier(0.250, 0.460, 0.450, 0.940) both; -} - -@keyframes slide-in-bck-center { - 0% { - transform: translateZ(600px); - opacity: 0; - } - 100% { - transform: translateZ(0); - opacity: 1; - } -} - -.message-text { - font-size: xx-large; - text-align: center; - color: ivory; -} - -.social-image { - width: 600px; - border-radius: 8px; -} - -.message-title { - text-align: center; - display: block; - font-size: 48px; - text-shadow: black 2px 2px 6px; -} - -.server-name { - color: gold; -} - -.go-to { - display: inline-block; - margin-bottom: 6px; -} diff --git a/exercise-mis/src/main/resources/static/styles/home.css b/exercise-mis/src/main/resources/static/styles/home.css deleted file mode 100644 index 62ebe0c2..00000000 --- a/exercise-mis/src/main/resources/static/styles/home.css +++ /dev/null @@ -1,222 +0,0 @@ -* { - margin: 0; - padding: 0; - box-sizing: border-box -} - -html { - font-size: 12px; - font-family: Ubuntu, simHei, sans-serif; - font-weight: 400 -} - -body { - font-size: 1rem -} - -table, -td, -th { - border-collapse: collapse; - border-spacing: 0 -} - -table { - width: 100% -} - -td, -th { - border: 1px solid #bcbcbc; - padding: 5px 10px -} - -th { - background: #42b983; - font-size: 1.2rem; - font-weight: 400; - color: #fff; - cursor: pointer -} - -tr:nth-of-type(odd) { - background: #fff -} - -tr:nth-of-type(even) { - background: #eee -} - -fieldset { - border: 1px solid #BCBCBC; - padding: 15px; -} - -input { - outline: none -} - -input[type=text] { - border: 1px solid #ccc; - padding: .5rem .3rem; -} - -input[type=text]:focus { - border-color: #42b983; -} - -button { - outline: none; - padding: 5px 8px; - color: #fff; - border: 1px solid #BCBCBC; - border-radius: 3px; - background-color: #009A61; - cursor: pointer; -} - -button:hover { - opacity: 0.8; -} - -#app { - margin: 0 auto; - max-width: 640px; - -webkit-perspective: 500px; -} - -.form-group { - margin: 10px; -} - -.form-group > label { - display: inline-block; - width: 10rem; - text-align: right; -} - -.form-group > input, -.form-group > select { - display: inline-block; - height: 2.5rem; - line-height: 2.5rem; -} - -.text-center { - text-align: center; -} - -.pagination { - display: inline-block; - padding-left: 0; - margin: 21px 0; - border-radius: 3px; -} - -.pagination > li { - display: inline; -} - -.pagination > li > a { - position: relative; - float: left; - padding: 6px 12px; - line-height: 1.5; - text-decoration: none; - color: #009a61; - background-color: #fff; - border: 1px solid #ddd; - margin-left: -1px; - list-style: none; -} - -.pagination > li > a:hover { - background-color: #eee; -} - -.pagination .active { - color: #fff; - background-color: #009a61; - border-left: none; - border-right: none; -} - -.pagination .active:hover { - background: #009a61; - cursor: default; -} - -.pagination > li:first-child > a .p { - border-bottom-left-radius: 3px; - border-top-left-radius: 3px; -} - -.pagination > li:last-child > a { - border-bottom-right-radius: 3px; - border-top-right-radius: 3px; -} - -.greeting-box { - background-color: firebrick; - max-width: 700px; - padding: 20px; - border-radius: 8px; - margin: 48px auto 20px; -} - -.slide-in-bck-center { - animation: slide-in-bck-center 1.2s cubic-bezier(0.250, 0.460, 0.450, 0.940) both; -} - -@keyframes slide-in-bck-center { - 0% { - transform: translateZ(600px); - opacity: 0; - } - 100% { - transform: translateZ(0); - opacity: 1; - } -} - -.greeting-text { - font-size: xx-large; - text-align: center; - color: ivory; - display: block; -} - -.application-name { - display: inline-block; - font-weight: bold; - width: auto; - font-size: 48px; - color: rgb(7, 156, 58); - position: relative; - left: 60px; - top: 200px; - cursor: default; -} - -.social-image { - width: 600px; - border-radius: 8px; -} - -.greeting-title { - text-align: center; - display: block; - font-size: 48px; - font-weight: bold; - color: ivory; - text-shadow: black 2px 2px 6px; -} - -.server-name { - color: gold; -} - -.go-to { - display: inline-block; - margin-bottom: 6px; -} diff --git a/exercise-mis/src/main/resources/static/styles/video.css b/exercise-mis/src/main/resources/static/styles/video.css deleted file mode 100644 index 341a63f5..00000000 --- a/exercise-mis/src/main/resources/static/styles/video.css +++ /dev/null @@ -1,136 +0,0 @@ -* { - margin: 0; - padding: 0; - box-sizing: border-box -} - -html { - font-size: 12px; - font-family: Ubuntu, simHei, sans-serif; - font-weight: 400 -} - -body { - font-size: 1rem -} - -table, -td, -th { - border-collapse: collapse; - border-spacing: 0 -} - -table { - width: 100% -} - -td, -th { - border: 1px solid #bcbcbc; - padding: 5px 10px -} - -th { - background: #42b983; - font-size: 1.2rem; - font-weight: 400; - color: #fff; - cursor: pointer -} - -tr:nth-of-type(odd) { - background: #fff -} - -tr:nth-of-type(even) { - background: #eee -} - -fieldset { - border: 1px solid #BCBCBC; - padding: 15px; -} - -input { - outline: none -} - -input[type=text] { - border: 1px solid #ccc; - padding: .5rem .3rem; -} - -input[type=text]:focus { - border-color: #42b983; -} - -button { - outline: none; - padding: 5px 8px; - color: #fff; - border: 1px solid #BCBCBC; - border-radius: 3px; - background-color: #009A61; - cursor: pointer; -} - -button:hover { - opacity: 0.8; -} - -#app { - margin: 0 auto; - max-width: 640px; - -webkit-perspective: 500px; -} - -.greeting-box { - background-color: firebrick; - max-width: 700px; - padding: 20px; - border-radius: 8px; - margin: 48px auto 20px; -} - -.slide-in-bck-center { - animation: slide-in-bck-center 1.2s cubic-bezier(0.250, 0.460, 0.450, 0.940) both; -} - -@keyframes slide-in-bck-center { - 0% { - transform: translateZ(600px); - opacity: 0; - } - 100% { - transform: translateZ(0); - opacity: 1; - } -} - -.greeting-text { - font-size: xx-large; - text-align: center; - color: ivory; -} - -.social-image { - width: 600px; - border-radius: 8px; -} - -.greeting-title { - text-align: center; - display: block; - font-size: 48px; - text-shadow: black 2px 2px 6px; -} - -.server-name { - color: gold; -} - -.go-to { - display: inline-block; - margin-bottom: 6px; -} diff --git a/exercise-mis/src/main/resources/static/video.html b/exercise-mis/src/main/resources/static/video.html deleted file mode 100644 index 9a186caa..00000000 --- a/exercise-mis/src/main/resources/static/video.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - ExRx.net Crawler Server - - - - -
-
- - Hello, World! - Welcome to {{ appInfo.projectArtifactId }}@{{ appInfo.version }}! - - -
-
- - - - diff --git a/gateway/auto-run-windows.cmd b/gateway/auto-run-windows.cmd deleted file mode 100644 index cd3242c5..00000000 --- a/gateway/auto-run-windows.cmd +++ /dev/null @@ -1,139 +0,0 @@ -@ECHO OFF -@REM ############################## auto-run ############################ -@REM # Author: 钟俊, date: 12:43:04 PM, Dec. 8, 2020 # -@REM # Copyright (c) 钟俊 # -@REM # Capability: Windows 10 Pro (20H2) # -@REM # Purpose: # -@REM # 1. Integrate easy and simple deployment, # -@REM # 2. Reduce memory usage of IntelliJ IDEA to run services, # -@REM # 3. Improve the efficiency of local development. # -@REM #################################################################### - -SETLOCAL EnableDelayedExpansion -@REM UTF-8 -chcp 65001 - -@REM #################### Configurable Environment Variables ################### -SET skipGitPull=true -SET skipMavenBuild=true -SET mavenActiveProfile="development-local" -SET javaParameter=-Dfile.encoding=UTF-8 -Xms256m -Xmx256m - -GOTO:MAIN - -@REM ############################# Common Functions ############################ - -@REM Log trace. -@REM %~1 Info message -:logTrace - ECHO %date% %time% TRACE - %~1% -EXIT /B 0 - -@REM Log info. -@REM %~1 Info message -:logInfo - ECHO %date% %time% INFO - %~1% -EXIT /B 0 - -@REM Log warn. -@REM %~1 Warn message -:logWarn - ECHO %date% %time% WARN - %~1% -EXIT /B 0 - -@REM Log error. -@REM %~1 Error message -:logError - ECHO %date% %time% ERROR - %~1% -EXIT /B 0 - -@REM Set terminal title. -@REM %~1 Title string -:setTerminalTitle - TITLE %~1 -EXIT /B 0 - -@REM ############################ Custom Functions ############################# - -@REM Pull the latest code of current branch from Git. -:gitPull - git pull - if %ERRORLEVEL% NEQ 0 ( - CALL :logError "Failed to execute command `Git pull`" - EXIT /B %ERRORLEVEL% - ) -EXIT /B 0 - -@REM Execute pre-build phase. -:executePreBuildPhase - CALL :logWarn "[PRE-BUILD] Active profile: %mavenActiveProfile%" - FOR /F "tokens=*" %%i IN ('git rev-parse --abbrev-ref HEAD') DO SET currentBranch=%%i - CALL :logWarn "[PRE-BUILD] Current Git branch: %currentBranch%" - if %skipGitPull% == true ( - CALL :logWarn "[PRE-BUILD] Skipped Git pull" - ) else ( - CALL :logInfo "[PRE-BUILD] Start to pull latest code from Git" - CALL :gitPull - ) - CALL :logInfo "[PRE-BUILD] Java Version Information" - CALL java -version - CALL :logInfo "[PRE-BUILD] Maven Version Information" - CALL mvn -v - CALL :logInfo "[PRE-BUILD] Current directory:" - dir -EXIT /B 0 - -@REM Execute build phase. -:executeBuildPhase - if %skipMavenBuild% == true ( - CALL :logWarn "[PRE-BUILD] Skipped Maven build" - EXIT /B 0 - ) - CALL :logInfo "[PRE-BUILD] Start to pull latest code from Git" - SET currentDirectory=%cd% - @REM Change directory to root projeject - cd .. - CALL mvn clean package --batch-mode --show-version -Dmaven.javadoc.skip=true -DskipTests=true - if %ERRORLEVEL% NEQ 0 ( - CALL :logError "[BUILD] Failed to execute Maven build" - EXIT /B %ERRORLEVEL% - ) - CALL :logInfo "[BUILD] Maven build success" - cd %currentDirectory% - dir -EXIT /B 0 - -@REM Execute run phase. -:executeRunPhase - CALL :logWarn "[RUN] Running service…" - FOR /F "tokens=*" %%i IN ('dir /B/A:- target\*.jar') DO SET jarFileName=%%i - if "%jarFileName%" == "" ( - CALL :logError "[RUN] Not found runnable JAR!" - EXIT /B 1 - ) - CALL :logWarn "[RUN] Found JAR: %jarFileName%" - CALL :setTerminalTitle %jarFileName% - SET runJarCommand=java %javaParameter% -Dspring.profiles.active=%mavenActiveProfile% -jar target\%jarFileName% - CALL :logWarn "[RUN] Execute command: %runJarCommand%" - CALL %runJarCommand% -EXIT /B 0 - -@REM ############################# MAIN Procedures ############################# -:MAIN -cls -@REM Pre-build phrase (Display version, Git pull) -CALL :executePreBuildPhase -if %ERRORLEVEL% NEQ 0 ( - CALL :logError "[PRE-BUILD] Failed to execute pre-build phase" - EXIT /B %ERRORLEVEL% -) -@REM Build phase -CALL :executeBuildPhase -if %ERRORLEVEL% NEQ 0 ( - CALL :logError "[BUILD] Failed to execute build phase" - EXIT /B %ERRORLEVEL% -) -@REM Run phase -CALL :executeRunPhase - -ENDLOCAL diff --git a/gateway/src/main/java/com/jmsoftware/maf/gateway/GatewayApplication.java b/gateway/src/main/java/com/jmsoftware/maf/gateway/GatewayApplication.java deleted file mode 100644 index edb5ab06..00000000 --- a/gateway/src/main/java/com/jmsoftware/maf/gateway/GatewayApplication.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.jmsoftware.maf.gateway; - -import com.jmsoftware.maf.gateway.universal.configuration.ProjectProperty; -import com.jmsoftware.maf.gateway.universal.configuration.ServerConfiguration; -import lombok.extern.slf4j.Slf4j; -import lombok.val; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cloud.client.discovery.EnableDiscoveryClient; - -import java.time.Duration; -import java.time.Instant; -import java.util.TimeZone; - -/** - *

GatewayApplication

- *

- * Change description here. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2/15/20 3:56 PM - **/ -@Slf4j -@EnableDiscoveryClient -@SpringBootApplication -public class GatewayApplication { - private static final String LINE_SEPARATOR = System.lineSeparator(); - private static ProjectProperty projectProperty; - private static ServerConfiguration serverConfiguration; - - public GatewayApplication(ProjectProperty projectProperty, ServerConfiguration serverConfiguration) { - GatewayApplication.projectProperty = projectProperty; - GatewayApplication.serverConfiguration = serverConfiguration; - } - - public static void main(String[] args) { - val startInstant = Instant.now(); - SpringApplication.run(GatewayApplication.class, args); - val endInstant = Instant.now(); - val duration = Duration.between(startInstant, endInstant); - log.info("🥳 Congratulations! 🎉"); - log.info("🖥 {}@{} started!", projectProperty.getProjectArtifactId(), projectProperty.getVersion()); - log.info("⚙️ Environment: {}", projectProperty.getEnvironment()); - log.info("⏳ Deployment duration: {} seconds ({} ms)", duration.getSeconds(), duration.toMillis()); - log.info("⏰ App started at {} (timezone - {})", endInstant, TimeZone.getDefault().getDisplayName()); - log.info("{} App running at{} - Local: http://localhost:{}{}/{} - Network: {}/", - LINE_SEPARATOR, LINE_SEPARATOR, serverConfiguration.getServerPort(), projectProperty.getContextPath(), - LINE_SEPARATOR, serverConfiguration.getBaseUrl()); - } -} diff --git a/gateway/src/main/java/com/jmsoftware/maf/gateway/universal/aspect/MethodArgumentValidationAspect.java b/gateway/src/main/java/com/jmsoftware/maf/gateway/universal/aspect/MethodArgumentValidationAspect.java deleted file mode 100644 index 099aeb4f..00000000 --- a/gateway/src/main/java/com/jmsoftware/maf/gateway/universal/aspect/MethodArgumentValidationAspect.java +++ /dev/null @@ -1,160 +0,0 @@ -package com.jmsoftware.maf.gateway.universal.aspect; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.ArrayUtil; -import cn.hutool.core.util.StrUtil; -import lombok.extern.slf4j.Slf4j; -import lombok.val; -import org.aspectj.lang.JoinPoint; -import org.aspectj.lang.ProceedingJoinPoint; -import org.aspectj.lang.annotation.*; -import org.aspectj.lang.reflect.MethodSignature; -import org.springframework.stereotype.Component; - -import javax.validation.ConstraintViolation; -import javax.validation.Valid; -import javax.validation.Validation; -import javax.validation.Validator; -import java.util.LinkedList; -import java.util.Set; - -/** - *

MethodArgumentValidationAspect

- *

This class is an aspect class that validates method's argument(s).

- *

USAGE (Must Do's)

- *
    - *
  1. Annotate the method which argument we need to validate by @ValidateArgument
  2. - *
  3. Annotate the argument(s) that we need to validate by @javax.validation.Valid
  4. - *
  5. The field(s) of the argument(s) could be annotated by the constraint annotation provided by Spring - * Security
  6. - *
- *

ATTENTION

- *

If the argument doesn't pass validation, an IllegalArgumentException will be thrown, and not proceed - * the target method.

- * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2019-07-06 12:17 - **/ -@Slf4j -@Aspect -@Component -public class MethodArgumentValidationAspect { - private final Validator validator; - - public MethodArgumentValidationAspect() { - val validatorFactory = Validation.buildDefaultValidatorFactory(); - this.validator = validatorFactory.getValidator(); - log.info("The validator for {} has been initiated.", this.getClass().getSimpleName()); - } - - /** - * Define pointcut. Pointcut is a predicate or expression that matches join points. In - * ValidateMethodArgumentAspect, we need to cut any method annotated with `@ValidateArgument` only. - *

- * More detail at: Spring aop aspectJ - * pointcut expression examples - */ - @Pointcut("@annotation(com.jmsoftware.maf.gateway.universal.aspect.ValidateArgument)") - public void validateMethodArgumentPointcut() { - } - - /** - * Before handle method's argument. This method will be executed after called `proceedingJoinPoint.proceed()`. In - * this phrase, we're going to take some logs. - *

- * `@Before` annotated methods run exactly before the all methods matching with pointcut expression. - * - * @param joinPoint a point of execution of the program - */ - @Before("validateMethodArgumentPointcut()") - public void beforeMethodHandleArgument(JoinPoint joinPoint) { - log.info("Method : {}#{}", - joinPoint.getSignature().getDeclaringTypeName(), - joinPoint.getSignature().getName()); - log.info("Argument : {}", joinPoint.getArgs()); - } - - /** - * Around annotated method processes argument. Around advice can perform custom behavior before and after the - * method invocation. - * - * @param proceedingJoinPoint the object can perform method invocation - * @return any value (may be void) that annotated method returned - */ - @Around("validateMethodArgumentPointcut()") - public Object aroundMethodHandleArgument(ProceedingJoinPoint proceedingJoinPoint) throws Throwable { - log.info("======= METHOD'S ARGUMENT VALIDATION START ======="); - val args = proceedingJoinPoint.getArgs(); - val signature = (MethodSignature) proceedingJoinPoint.getSignature(); - val parameterAnnotations = signature.getMethod().getParameterAnnotations(); - // argumentIndexes is the array list that stores the index of argument we need to validate (the argument - // annotated by `@Valid`) - val argumentIndexListThatNeedsToBeValidated = new LinkedList(); - for (val parameterAnnotation : parameterAnnotations) { - val paramIndex = ArrayUtil.indexOf(parameterAnnotations, parameterAnnotation); - for (val annotation : parameterAnnotation) { - if (annotation instanceof Valid) { - argumentIndexListThatNeedsToBeValidated.add(paramIndex); - } - } - } - val errorMessageList = new LinkedList(); - for (val index : argumentIndexListThatNeedsToBeValidated) { - val constraintViolationSet = validator.validate(args[index]); - if (CollUtil.isNotEmpty(constraintViolationSet)) { - val errorMessage = String.format("Argument validation failed! %s", - getAllFieldErrorMessage(constraintViolationSet)); - errorMessageList.add(errorMessage); - } - } - if (CollUtil.isNotEmpty(errorMessageList)) { - val joinedErrorMessage = StrUtil.join(", ", errorMessageList); - log.info("Method : {}#{}", proceedingJoinPoint.getSignature().getDeclaringTypeName(), - proceedingJoinPoint.getSignature().getName()); - log.info("Argument : {}", args); - log.error("Validation result: {}", joinedErrorMessage); - // If the argument doesn't pass validation, an IllegalArgumentException will be thrown, and not - // proceed the target method - throw new IllegalArgumentException(joinedErrorMessage); - } - log.info("Validation result: Validation passed"); - return proceedingJoinPoint.proceed(); - } - - /** - * `@After` annotated methods run exactly after the all methods matching with pointcut expression. - */ - @After("validateMethodArgumentPointcut()") - public void afterMethodHandleArgument() { - log.info("======== METHOD'S ARGUMENT VALIDATION END ========"); - } - - /** - * `@AfterThrowing` annotated methods run after the method (matching with pointcut expression) exits by throwing an - * exception. - * - * @param joinPoint a point of execution of the program - * @param e exception that controller's method throws - */ - @AfterThrowing(pointcut = "validateMethodArgumentPointcut()", throwing = "e") - public void afterThrowingException(JoinPoint joinPoint, Exception e) { - log.info("Signature : {}", joinPoint.getSignature().toShortString()); - log.error("Exception message: {}", e.toString()); - log.error("== METHOD'S ARGUMENT VALIDATION END WITH EXCEPTION =="); - } - - /** - * Gets all field error message. - * - * @param constraintViolationSet the constraint violation set - * @return the all field error message - */ - private String getAllFieldErrorMessage(Set> constraintViolationSet) { - val allErrorMessageList = new LinkedList(); - for (val constraintViolation : constraintViolationSet) { - allErrorMessageList.add(String.format("invalid field: %s, %s", constraintViolation.getPropertyPath(), - constraintViolation.getMessage())); - } - return StrUtil.join("; ", allErrorMessageList); - } -} diff --git a/gateway/src/main/java/com/jmsoftware/maf/gateway/universal/aspect/ValidateArgument.java b/gateway/src/main/java/com/jmsoftware/maf/gateway/universal/aspect/ValidateArgument.java deleted file mode 100644 index 55795306..00000000 --- a/gateway/src/main/java/com/jmsoftware/maf/gateway/universal/aspect/ValidateArgument.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.jmsoftware.maf.gateway.universal.aspect; - -import java.lang.annotation.*; - -/** - *

ValidateArgument

- *

Annotation for validating method's argument.

- *

ATTENTION

- *

If the argument doesn't pass validation, an IllegalArgumentException will be thrown, and not proceed - * the target method.

- * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2019-07-06 12:08 - **/ -@Retention(RetentionPolicy.RUNTIME) -@Target({ElementType.METHOD}) -@Documented -public @interface ValidateArgument { -} diff --git a/gateway/src/main/java/com/jmsoftware/maf/gateway/universal/configuration/CustomConfiguration.java b/gateway/src/main/java/com/jmsoftware/maf/gateway/universal/configuration/CustomConfiguration.java deleted file mode 100644 index 36053e56..00000000 --- a/gateway/src/main/java/com/jmsoftware/maf/gateway/universal/configuration/CustomConfiguration.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.jmsoftware.maf.gateway.universal.configuration; - -import com.google.common.collect.Lists; -import lombok.Data; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.stereotype.Component; - -import java.util.List; - -/** - *

CustomConfiguration

- *

Custom configurations which are written in .yml files, containing a variety of fragmentary configs. Such as, - * Druid login info, web security switch, web log and so on.

- * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2019-03-23 14:24 - **/ -@Data -@Component -@ConfigurationProperties(prefix = "custom.configuration") -public class CustomConfiguration { - /** - * The Allowed application list. If it's empty, gateway will allow all request to any applications (microservices) - */ - private List allowedApplicationList = Lists.newLinkedList(); -} diff --git a/gateway/src/main/java/com/jmsoftware/maf/gateway/universal/configuration/ProjectProperty.java b/gateway/src/main/java/com/jmsoftware/maf/gateway/universal/configuration/ProjectProperty.java deleted file mode 100644 index c4545fa1..00000000 --- a/gateway/src/main/java/com/jmsoftware/maf/gateway/universal/configuration/ProjectProperty.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.jmsoftware.maf.gateway.universal.configuration; - -import lombok.Data; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.stereotype.Component; - -/** - *

ProjectProperty

- *

- * Change description here. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2019-04-18 13:01 - **/ -@Data -@Component -@ConfigurationProperties(prefix = "project.property") -public class ProjectProperty { - private String basePackage; - private String contextPath; - private String groupId; - private String projectParentArtifactId; - private String projectArtifactId; - private String version; - private String description; - private String jdkVersion; - private String environment; - private String url; - private String inceptionYear; - private String organizationName; - private String organizationUrl; - private String issueManagementSystem; - private String issueManagementUrl; - private String developerName; - private String developerEmail; - private String developerUrl; -} diff --git a/gateway/src/main/java/com/jmsoftware/maf/gateway/universal/configuration/SwaggerResourceProvider.java b/gateway/src/main/java/com/jmsoftware/maf/gateway/universal/configuration/SwaggerResourceProvider.java deleted file mode 100644 index c6de1d1a..00000000 --- a/gateway/src/main/java/com/jmsoftware/maf/gateway/universal/configuration/SwaggerResourceProvider.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.jmsoftware.maf.gateway.universal.configuration; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.StrUtil; -import cn.hutool.json.JSONUtil; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import lombok.val; -import org.springframework.cloud.gateway.config.GatewayProperties; -import org.springframework.cloud.gateway.route.RouteLocator; -import org.springframework.context.annotation.Primary; -import org.springframework.stereotype.Component; -import springfox.documentation.swagger.web.SwaggerResource; -import springfox.documentation.swagger.web.SwaggerResourcesProvider; - -import java.util.LinkedList; -import java.util.List; - -/** - *

SwaggerResourceProvider

- *

- * Change description here. - *

- * https://blog.csdn.net/ttzommed/article/details/81103609 - *

- * TODO: Refactor this class. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2/15/20 5:40 PM - * @see - * 文档聚合业务编码 - **/ -@Slf4j -@Primary -@Component -@RequiredArgsConstructor -public class SwaggerResourceProvider implements SwaggerResourcesProvider { - public static final String SWAGGER_API_URI = "/v2/api-docs"; - private final RouteLocator routeLocator; - private final GatewayProperties gatewayProperties; - private final ProjectProperty projectProperty; - private final CustomConfiguration customConfiguration; - - /** - * Generate Swagger resource. - * - * @return Swagger resource. - * @author Johnny Miller (鍾俊), e-mail: johnnysviva@outlook.com - * @date 2/15/20 11:06 PM - */ - @Override - public List get() { - val swaggerResourceList = new LinkedList(); - routeLocator.getRoutes().subscribe(route -> { - val serviceName = route.getUri().toString().substring(5).toLowerCase(); - log.info("{} found dynamic route for [{}] from subscription. {}", projectProperty.getProjectArtifactId(), - serviceName, route); - val swaggerResource = new SwaggerResource(); - swaggerResource.setName(serviceName.toUpperCase()); - swaggerResource.setLocation(String.format("%s%s", serviceName, SWAGGER_API_URI)); - swaggerResource.setSwaggerVersion("2.0"); - log.info("Got allowed application list: {}", customConfiguration.getAllowedApplicationList()); - if (CollUtil.isEmpty(customConfiguration.getAllowedApplicationList())) { - log.warn("Allowed application list is not configured. Swagger is able to access any applications."); - swaggerResourceList.add(swaggerResource); - } else { - customConfiguration.getAllowedApplicationList().forEach(allocationName -> { - if (StrUtil.compareIgnoreCase(serviceName, allocationName, false) == 0) { - log.warn("Swagger is adding resource. {}", JSONUtil.toJsonStr(swaggerResource)); - swaggerResourceList.add(swaggerResource); - } - }); - } - }); - log.info("Pre defined GatewayProperties. {}", gatewayProperties); - return swaggerResourceList; - } -} diff --git a/gateway/src/main/java/com/jmsoftware/maf/gateway/universal/controller/SwaggerResourceController.java b/gateway/src/main/java/com/jmsoftware/maf/gateway/universal/controller/SwaggerResourceController.java deleted file mode 100644 index a61e851f..00000000 --- a/gateway/src/main/java/com/jmsoftware/maf/gateway/universal/controller/SwaggerResourceController.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.jmsoftware.maf.gateway.universal.controller; - -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import reactor.core.publisher.Mono; -import springfox.documentation.swagger.web.*; - -import java.util.Optional; - - -/** - *

SwaggerResourceController

- *

- * Change description here. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2/15/20 6:07 PM - **/ -@RestController -@RequiredArgsConstructor -@RequestMapping("/swagger-resources") -public class SwaggerResourceController { - @Autowired(required = false) - private SecurityConfiguration securityConfiguration; - @Autowired(required = false) - private UiConfiguration uiConfiguration; - private final SwaggerResourcesProvider swaggerResources; - - @GetMapping("/configuration/security") - public Mono> securityConfiguration() { - return Mono.just(new ResponseEntity<>( - Optional.ofNullable(securityConfiguration).orElse(SecurityConfigurationBuilder.builder().build()), - HttpStatus.OK)); - } - - @GetMapping("/configuration/ui") - public Mono> uiConfiguration() { - return Mono.just(new ResponseEntity<>( - Optional.ofNullable(uiConfiguration).orElse(UiConfigurationBuilder.builder().build()), HttpStatus.OK)); - } - - @GetMapping("") - public Mono> swaggerResources() { - return Mono.just((new ResponseEntity<>(swaggerResources.get(), HttpStatus.OK))); - } -} diff --git a/gateway/src/main/java/com/jmsoftware/maf/gateway/universal/domain/ValidationTestPayload.java b/gateway/src/main/java/com/jmsoftware/maf/gateway/universal/domain/ValidationTestPayload.java deleted file mode 100644 index 29d4f1db..00000000 --- a/gateway/src/main/java/com/jmsoftware/maf/gateway/universal/domain/ValidationTestPayload.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.jmsoftware.maf.gateway.universal.domain; - -import lombok.Data; - -import javax.validation.constraints.Min; -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; - -/** - *

ValidationTestPayload

- *

- * Change description here. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2/14/20 11:34 AM - **/ -@Data -public class ValidationTestPayload { - @NotNull - @Min(value = 1L) - private Long id; - @NotEmpty - private String name; -} diff --git a/gateway/src/main/java/com/jmsoftware/maf/gateway/universal/filter/RequestFilter.java b/gateway/src/main/java/com/jmsoftware/maf/gateway/universal/filter/RequestFilter.java deleted file mode 100644 index f89e29fe..00000000 --- a/gateway/src/main/java/com/jmsoftware/maf/gateway/universal/filter/RequestFilter.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.jmsoftware.maf.gateway.universal.filter; - -import com.jmsoftware.maf.gateway.universal.configuration.ProjectProperty; -import com.jmsoftware.maf.gateway.universal.util.RequestUtil; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.cloud.gateway.filter.GatewayFilterChain; -import org.springframework.cloud.gateway.filter.GlobalFilter; -import org.springframework.stereotype.Component; -import org.springframework.web.server.ServerWebExchange; -import reactor.core.publisher.Mono; - -/** - *

RequestFilter

- *

- * Change description here. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2/15/20 7:42 PM - **/ -@Slf4j -@Component -@RequiredArgsConstructor -public class RequestFilter implements GlobalFilter { - private final ProjectProperty projectProperty; - - @Override - public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { - log.info("{} intercepted requester's access. Requester: {}, resource: [{}] {}", - projectProperty.getProjectArtifactId().toUpperCase(), - RequestUtil.getRequestIpAndPort(exchange.getRequest()), exchange.getRequest().getMethod(), - exchange.getRequest().getURI()); - return chain.filter(exchange); - } -} diff --git a/gateway/src/main/java/com/jmsoftware/maf/gateway/universal/service/impl/CommonServiceImpl.java b/gateway/src/main/java/com/jmsoftware/maf/gateway/universal/service/impl/CommonServiceImpl.java deleted file mode 100644 index 5aaa762a..00000000 --- a/gateway/src/main/java/com/jmsoftware/maf/gateway/universal/service/impl/CommonServiceImpl.java +++ /dev/null @@ -1,124 +0,0 @@ -package com.jmsoftware.maf.gateway.universal.service.impl; - -import com.jmsoftware.maf.gateway.universal.aspect.ValidateArgument; -import com.jmsoftware.maf.gateway.universal.configuration.ProjectProperty; -import com.jmsoftware.maf.gateway.universal.domain.ValidationTestPayload; -import com.jmsoftware.maf.gateway.universal.service.CommonService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import javax.validation.Valid; -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - *

CommonServiceImpl

- *

- * Change description here. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2/4/20 11:16 AM - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class CommonServiceImpl implements CommonService { - private final ProjectProperty projectProperty; - - @Override - public Map getApplicationInfo() { - var map = new HashMap(16); - var fieldsInfo = getFieldsInfo(projectProperty); - fieldsInfo.forEach(fieldInfo -> { - var type = fieldInfo.get("type"); - if ("class java.lang.String".equals(type)) { - map.put((String) fieldInfo.get("name"), fieldInfo.get("value")); - } - }); - return map; - } - - @Override - @ValidateArgument - public void validateObject(@Valid ValidationTestPayload payload) { - log.info("Validation passed! {}", payload); - } - - /** - * Gets field value by name. - * - * @param fieldName the field name - * @param object the object - * @return the field value by name - * @see Java 中遍历一个对象的所有属性 - */ - private Object getFieldValueByName(String fieldName, Object object) { - try { - String firstLetter = fieldName.substring(0, 1).toUpperCase(); - String getter = "get" + firstLetter + fieldName.substring(1); - Method method = object.getClass().getMethod(getter); - return method.invoke(object); - } catch (Exception e) { - log.error("Can't get field's value by name! Cause: {}", e.getMessage()); - return null; - } - } - - /** - * Get filed name string [ ]. - * - * @param o the o - * @return the string [ ] - * @see Java 中遍历一个对象的所有属性 - */ - private String[] getFiledName(Object o) { - Field[] fields = o.getClass().getDeclaredFields(); - String[] fieldNames = new String[fields.length]; - for (int i = 0; i < fields.length; i++) { - log.info("fields[i].getType(): {}", fields[i].getType()); - fieldNames[i] = fields[i].getName(); - } - return fieldNames; - } - - /** - * Get Fields Info - * - * @param o the o - * @return the fields info - * @see Java 中遍历一个对象的所有属性 - */ - private List> getFieldsInfo(Object o) { - Field[] fields = o.getClass().getDeclaredFields(); - var arrayList = new ArrayList>(); - for (Field field : fields) { - var infoMap = new HashMap(16); - infoMap.put("type", field.getType().toString()); - infoMap.put("name", field.getName()); - infoMap.put("value", getFieldValueByName(field.getName(), o)); - arrayList.add(infoMap); - } - return arrayList; - } - - /** - * Get Filed Values - * - * @param o the o - * @return the object [ ] - * @see Java 中遍历一个对象的所有属性 - */ - public Object[] getFiledValues(Object o) { - String[] fieldNames = this.getFiledName(o); - Object[] value = new Object[fieldNames.length]; - for (int i = 0; i < fieldNames.length; i++) { - value[i] = this.getFieldValueByName(fieldNames[i], o); - } - return value; - } -} diff --git a/gateway/src/main/resources/application-development-docker.yml b/gateway/src/main/resources/application-development-docker.yml deleted file mode 100644 index 66baa2b0..00000000 --- a/gateway/src/main/resources/application-development-docker.yml +++ /dev/null @@ -1,13 +0,0 @@ -eureka: - client: - serviceUrl: - defaultZone: http://maf.service-registry.dev:8760/eureka/ - -spring: - zipkin: - base-url: http://maf.open-zipkin.dev:9411 - -custom: - configuration: - allowed-application-list: - - api-portal diff --git a/gateway/src/main/resources/application-development-local.yml b/gateway/src/main/resources/application-development-local.yml deleted file mode 100644 index 995d8142..00000000 --- a/gateway/src/main/resources/application-development-local.yml +++ /dev/null @@ -1,13 +0,0 @@ -eureka: - client: - serviceUrl: - defaultZone: http://localhost:8760/eureka/ - -spring: - zipkin: - base-url: http://localhost:9411 - -custom: - configuration: - # Leave `allowed-application-list` empty - allowed-application-list: diff --git a/gateway/src/main/resources/application-production.yml b/gateway/src/main/resources/application-production.yml deleted file mode 100644 index 4a2d384e..00000000 --- a/gateway/src/main/resources/application-production.yml +++ /dev/null @@ -1,13 +0,0 @@ -eureka: - client: - serviceUrl: - defaultZone: http://172.16.4.20:8760/eureka/ - -spring: - zipkin: - base-url: http://172.16.4.13:9411 - -custom: - configuration: - allowed-application-list: - - api-portal diff --git a/gateway/src/main/resources/application-stage.yml b/gateway/src/main/resources/application-stage.yml deleted file mode 100644 index 670e7f15..00000000 --- a/gateway/src/main/resources/application-stage.yml +++ /dev/null @@ -1,13 +0,0 @@ -eureka: - client: - serviceUrl: - defaultZone: http://172.16.3.20:8760/eureka/ - -spring: - zipkin: - base-url: http://172.16.3.13:9411 - -custom: - configuration: - allowed-application-list: - - api-portal diff --git a/gateway/src/main/resources/application-test.yml b/gateway/src/main/resources/application-test.yml deleted file mode 100644 index 66d4e079..00000000 --- a/gateway/src/main/resources/application-test.yml +++ /dev/null @@ -1,13 +0,0 @@ -eureka: - client: - serviceUrl: - defaultZone: http://172.16.2.20:8760/eureka/ - -spring: - zipkin: - base-url: http://172.16.2.13:9411 - -custom: - configuration: - allowed-application-list: - - api-portal diff --git a/gateway/src/main/resources/application.yml b/gateway/src/main/resources/application.yml deleted file mode 100644 index 1865a1bf..00000000 --- a/gateway/src/main/resources/application.yml +++ /dev/null @@ -1,74 +0,0 @@ -server: - port: @port@ - tomcat: - uri-encoding: @project.build.sourceEncoding@ - -spring: - application: - name: @project.artifactId@ - profiles: - active: @env@ - mvc: - throw-exception-if-no-handler-found: true - jackson: - date-format: yyyy-MM-dd HH:mm:ss - time-zone: Asia/Hong_Kong - sleuth: - sampler: - probability: 1.0 - cloud: - gateway: - discovery: - locator: - enabled: true - lower-case-service-id: true - -eureka: - instance: - leaseRenewalIntervalInSeconds: 10 - health-check-url-path: /actuator/health - status-page-url-path: / - metadata-map: - # needed to trigger info and endpoint update after restart - startup: ${random.int} - instance-id: ${spring.cloud.client.ip-address}:${server.port}@${spring.cloud.client.hostname}@${spring.application.name}-${random.int} - prefer-ip-address: true - client: - registryFetchIntervalSeconds: 5 - -management: - endpoints: - web: - exposure: - include: "*" - endpoint: - health: - show-details: ALWAYS - -logging: - config: classpath:configuration/logback/logback-@env@.xml - # Configure logging level of project as DEBUG to enable SQL logging and other logging. - level: - com.jmsoftware: DEBUG -# org.springframework.cloud.gateway: debug - -project: - property: - base-package: com.jmsoftware.maf.gateway - context-path: - group-id: @project.groupId@ - project-parent-artifact-id: @project.parent.artifactId@ - project-artifact-id: @project.artifactId@ - version: @project.version@ - description: @project.description@ - jdk-version: @java.version@ - environment: @env@ - url: @project.url@ - inception-year: @inceptionYear@ - organization-name: @project.organization.name@ - organization-url: @project.organization.url@ - issue-management-system: @project.issueManagement.system@ - issue-management-url: @project.issueManagement.url@ - developer-name: @developerName@ - developer-email: @developerEmail@ - developer-url: @developerUrl@ diff --git a/gateway/src/main/resources/configuration/.empty b/gateway/src/main/resources/configuration/.empty deleted file mode 100644 index e69de29b..00000000 diff --git a/gateway/src/main/resources/static/home.html b/gateway/src/main/resources/static/home.html deleted file mode 100644 index e7599316..00000000 --- a/gateway/src/main/resources/static/home.html +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - UNSET - - - - -

-
- Hello, World! - - Welcome to {{ projectArtifactId }}@{{ version }}! - - - - {{ applicationName }} - -
-
- Create New Person -
- - -
-
- - -
-
- - -
-
- - -
-
- - - - - - - - - - - - - - - - - -
NameAgeSexDelete
{{ person.name }}{{ person.age }}{{ person.sex }} - -
- This page is provided by - keepfool. - -
- - - - diff --git a/gateway/src/main/resources/static/icon/favicon.ico b/gateway/src/main/resources/static/icon/favicon.ico deleted file mode 100644 index 0798d38f..00000000 Binary files a/gateway/src/main/resources/static/icon/favicon.ico and /dev/null differ diff --git a/gateway/src/main/resources/static/image/muscle-and-fitness-server-social-image.png b/gateway/src/main/resources/static/image/muscle-and-fitness-server-social-image.png deleted file mode 100644 index 83786ad8..00000000 Binary files a/gateway/src/main/resources/static/image/muscle-and-fitness-server-social-image.png and /dev/null differ diff --git a/gateway/src/main/resources/static/script/404.js b/gateway/src/main/resources/static/script/404.js deleted file mode 100644 index 5401ce54..00000000 --- a/gateway/src/main/resources/static/script/404.js +++ /dev/null @@ -1,12 +0,0 @@ -// noinspection JSUnusedGlobalSymbols -const vm = new Vue({ - el: '#app', - data: {}, - methods: { - handleClickGoToHome: function () { - const currentUrl = window.location.href; - const split = currentUrl.split('/'); - window.location.href = `${split[0]}//${split[2]}/${split[3]}`; - } - } -}); diff --git a/gateway/src/main/resources/static/script/video.js b/gateway/src/main/resources/static/script/video.js deleted file mode 100644 index 3a155900..00000000 --- a/gateway/src/main/resources/static/script/video.js +++ /dev/null @@ -1,17 +0,0 @@ -// noinspection JSUnusedGlobalSymbols -const vm = new Vue({ - el: '#app', - data: { - appInfo: null, - videoSource: '' - }, - async mounted() { - const currentUrl = window.location.href; - const split = currentUrl.split('/'); - this.videoSource = `${split[0]}//${split[2]}/${split[3]}/test-table/demo-video`; - const baseUrl = `${split[0]}//${split[2]}`; - const response = await fetch(`${baseUrl}/common/app-info`); - const responseJson = await response.json(); - this.appInfo = responseJson.data; - } -}); diff --git a/gateway/src/main/resources/static/styles/404.css b/gateway/src/main/resources/static/styles/404.css deleted file mode 100644 index 09a4e9bc..00000000 --- a/gateway/src/main/resources/static/styles/404.css +++ /dev/null @@ -1,89 +0,0 @@ -* { - margin: 0; - padding: 0; - box-sizing: border-box -} - -html { - font-size: 12px; - font-family: Ubuntu, simHei, sans-serif; - font-weight: 400 -} - -body { - font-size: 1rem -} - -button { - outline: none; - padding: 5px 8px; - color: #fff; - border: 1px solid #BCBCBC; - border-radius: 3px; - background-color: #009A61; - cursor: pointer; -} - -button:hover { - opacity: 0.8; -} - -#app { - margin: 48px auto 0; - max-width: 640px; - -webkit-perspective: 500px; -} - -.text-center { - text-align: center; -} - -.message-box { - background-color: firebrick; - max-width: 700px; - padding: 20px; - border-radius: 8px; - margin: 48px auto 20px; -} - -.slide-in-bck-center { - animation: slide-in-bck-center 1.2s cubic-bezier(0.250, 0.460, 0.450, 0.940) both; -} - -@keyframes slide-in-bck-center { - 0% { - transform: translateZ(600px); - opacity: 0; - } - 100% { - transform: translateZ(0); - opacity: 1; - } -} - -.message-text { - font-size: xx-large; - text-align: center; - color: ivory; -} - -.social-image { - width: 600px; - border-radius: 8px; -} - -.message-title { - text-align: center; - display: block; - font-size: 48px; - text-shadow: black 2px 2px 6px; -} - -.server-name { - color: gold; -} - -.go-to { - display: inline-block; - margin-bottom: 6px; -} diff --git a/gateway/src/main/resources/static/styles/home.css b/gateway/src/main/resources/static/styles/home.css deleted file mode 100644 index 62ebe0c2..00000000 --- a/gateway/src/main/resources/static/styles/home.css +++ /dev/null @@ -1,222 +0,0 @@ -* { - margin: 0; - padding: 0; - box-sizing: border-box -} - -html { - font-size: 12px; - font-family: Ubuntu, simHei, sans-serif; - font-weight: 400 -} - -body { - font-size: 1rem -} - -table, -td, -th { - border-collapse: collapse; - border-spacing: 0 -} - -table { - width: 100% -} - -td, -th { - border: 1px solid #bcbcbc; - padding: 5px 10px -} - -th { - background: #42b983; - font-size: 1.2rem; - font-weight: 400; - color: #fff; - cursor: pointer -} - -tr:nth-of-type(odd) { - background: #fff -} - -tr:nth-of-type(even) { - background: #eee -} - -fieldset { - border: 1px solid #BCBCBC; - padding: 15px; -} - -input { - outline: none -} - -input[type=text] { - border: 1px solid #ccc; - padding: .5rem .3rem; -} - -input[type=text]:focus { - border-color: #42b983; -} - -button { - outline: none; - padding: 5px 8px; - color: #fff; - border: 1px solid #BCBCBC; - border-radius: 3px; - background-color: #009A61; - cursor: pointer; -} - -button:hover { - opacity: 0.8; -} - -#app { - margin: 0 auto; - max-width: 640px; - -webkit-perspective: 500px; -} - -.form-group { - margin: 10px; -} - -.form-group > label { - display: inline-block; - width: 10rem; - text-align: right; -} - -.form-group > input, -.form-group > select { - display: inline-block; - height: 2.5rem; - line-height: 2.5rem; -} - -.text-center { - text-align: center; -} - -.pagination { - display: inline-block; - padding-left: 0; - margin: 21px 0; - border-radius: 3px; -} - -.pagination > li { - display: inline; -} - -.pagination > li > a { - position: relative; - float: left; - padding: 6px 12px; - line-height: 1.5; - text-decoration: none; - color: #009a61; - background-color: #fff; - border: 1px solid #ddd; - margin-left: -1px; - list-style: none; -} - -.pagination > li > a:hover { - background-color: #eee; -} - -.pagination .active { - color: #fff; - background-color: #009a61; - border-left: none; - border-right: none; -} - -.pagination .active:hover { - background: #009a61; - cursor: default; -} - -.pagination > li:first-child > a .p { - border-bottom-left-radius: 3px; - border-top-left-radius: 3px; -} - -.pagination > li:last-child > a { - border-bottom-right-radius: 3px; - border-top-right-radius: 3px; -} - -.greeting-box { - background-color: firebrick; - max-width: 700px; - padding: 20px; - border-radius: 8px; - margin: 48px auto 20px; -} - -.slide-in-bck-center { - animation: slide-in-bck-center 1.2s cubic-bezier(0.250, 0.460, 0.450, 0.940) both; -} - -@keyframes slide-in-bck-center { - 0% { - transform: translateZ(600px); - opacity: 0; - } - 100% { - transform: translateZ(0); - opacity: 1; - } -} - -.greeting-text { - font-size: xx-large; - text-align: center; - color: ivory; - display: block; -} - -.application-name { - display: inline-block; - font-weight: bold; - width: auto; - font-size: 48px; - color: rgb(7, 156, 58); - position: relative; - left: 60px; - top: 200px; - cursor: default; -} - -.social-image { - width: 600px; - border-radius: 8px; -} - -.greeting-title { - text-align: center; - display: block; - font-size: 48px; - font-weight: bold; - color: ivory; - text-shadow: black 2px 2px 6px; -} - -.server-name { - color: gold; -} - -.go-to { - display: inline-block; - margin-bottom: 6px; -} diff --git a/gateway/src/main/resources/static/styles/video.css b/gateway/src/main/resources/static/styles/video.css deleted file mode 100644 index 341a63f5..00000000 --- a/gateway/src/main/resources/static/styles/video.css +++ /dev/null @@ -1,136 +0,0 @@ -* { - margin: 0; - padding: 0; - box-sizing: border-box -} - -html { - font-size: 12px; - font-family: Ubuntu, simHei, sans-serif; - font-weight: 400 -} - -body { - font-size: 1rem -} - -table, -td, -th { - border-collapse: collapse; - border-spacing: 0 -} - -table { - width: 100% -} - -td, -th { - border: 1px solid #bcbcbc; - padding: 5px 10px -} - -th { - background: #42b983; - font-size: 1.2rem; - font-weight: 400; - color: #fff; - cursor: pointer -} - -tr:nth-of-type(odd) { - background: #fff -} - -tr:nth-of-type(even) { - background: #eee -} - -fieldset { - border: 1px solid #BCBCBC; - padding: 15px; -} - -input { - outline: none -} - -input[type=text] { - border: 1px solid #ccc; - padding: .5rem .3rem; -} - -input[type=text]:focus { - border-color: #42b983; -} - -button { - outline: none; - padding: 5px 8px; - color: #fff; - border: 1px solid #BCBCBC; - border-radius: 3px; - background-color: #009A61; - cursor: pointer; -} - -button:hover { - opacity: 0.8; -} - -#app { - margin: 0 auto; - max-width: 640px; - -webkit-perspective: 500px; -} - -.greeting-box { - background-color: firebrick; - max-width: 700px; - padding: 20px; - border-radius: 8px; - margin: 48px auto 20px; -} - -.slide-in-bck-center { - animation: slide-in-bck-center 1.2s cubic-bezier(0.250, 0.460, 0.450, 0.940) both; -} - -@keyframes slide-in-bck-center { - 0% { - transform: translateZ(600px); - opacity: 0; - } - 100% { - transform: translateZ(0); - opacity: 1; - } -} - -.greeting-text { - font-size: xx-large; - text-align: center; - color: ivory; -} - -.social-image { - width: 600px; - border-radius: 8px; -} - -.greeting-title { - text-align: center; - display: block; - font-size: 48px; - text-shadow: black 2px 2px 6px; -} - -.server-name { - color: gold; -} - -.go-to { - display: inline-block; - margin-bottom: 6px; -} diff --git a/gateway/src/main/resources/static/video.html b/gateway/src/main/resources/static/video.html deleted file mode 100644 index 9a186caa..00000000 --- a/gateway/src/main/resources/static/video.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - ExRx.net Crawler Server - - - - -
-
- - Hello, World! - Welcome to {{ appInfo.projectArtifactId }}@{{ appInfo.version }}! - - -
-
- - - - diff --git a/kubernetes/.empty b/kubernetes/.empty deleted file mode 100644 index e69de29b..00000000 diff --git a/exercise-mis/README.md b/maf-mis/README.md similarity index 92% rename from exercise-mis/README.md rename to maf-mis/README.md index a12282ae..82e0b603 100644 --- a/exercise-mis/README.md +++ b/maf-mis/README.md @@ -9,15 +9,15 @@ [![GitHub repo size](https://img.shields.io/github/repo-size/johnnymillergh/muscle-and-fitness-server.svg)](https://github.com/johnnymillergh/muscle-and-fitness-server) [![Twitter](https://img.shields.io/twitter/url/https/github.com/johnnymillergh/muscle-and-fitness-server?style=social)](https://twitter.com/intent/tweet?text=Wow:&url=https%3A%2F%2Fgithub.com%2Fjohnnymillergh%2Fmuscle-and-fitness-server) -# Muscle and Fitness Server :: Exercise MIS +# Muscle and Fitness Server :: MAF MIS -**Muscle and Fitness Server :: Exercise MIS** full name is Exercise Management Information Service, a sub module of Muscle and Fitness Server (M&F). +**Muscle and Fitness Server :: MAF MIS** full name is Exercise Management Information Service, a sub module of Muscle and Fitness Server (M&F). -[Official Docker Image](https://hub.docker.com/r/ijohnnymiller/muslce-and-fitness-server.exercise-mis-prod) +[Official Docker Image](https://hub.docker.com/r/ijohnnymiller/muslce-and-fitness-server.maf-mis-prod) ## Features -Here is the highlights of **Exercise MIS**: +Here is the highlights of **MAF MIS**: 1. Inherited from the most modern and newest Spring frameworks: diff --git a/api-portal/auto-run-windows.cmd b/maf-mis/auto-run-windows.cmd similarity index 77% rename from api-portal/auto-run-windows.cmd rename to maf-mis/auto-run-windows.cmd index cd3242c5..2b4a7fc1 100644 --- a/api-portal/auto-run-windows.cmd +++ b/maf-mis/auto-run-windows.cmd @@ -16,8 +16,10 @@ chcp 65001 @REM #################### Configurable Environment Variables ################### SET skipGitPull=true SET skipMavenBuild=true +SET minimalJavaMajorVersion=11 +SET javaExe=C:\Users\Johnny\.sdkman\candidates\java\11.0.10.hs-adpt\bin\java.exe SET mavenActiveProfile="development-local" -SET javaParameter=-Dfile.encoding=UTF-8 -Xms256m -Xmx256m +SET javaParameter=-Xms256m -Xmx256m -Dfile.encoding=UTF-8 -Dspring.cloud.consul.host=localhost GOTO:MAIN @@ -55,6 +57,22 @@ EXIT /B 0 @REM ############################ Custom Functions ############################# +@REM Check Java major version +:checkJavaMajorVersion +CALL :logWarn "Start to Check Java major version…" +%javaExe% -version 1>nul 2>nul || ( + CALL :logError "Java is not installed!" + EXIT /B 2 +) +for /f tokens^=2-6^ delims^=.-_+^" %%j in ('%javaExe% -fullversion 2^>^&1') do set "currentJavaMajorVersion=%%j" +CALL :logWarn "Got current Java major version number: %currentJavaMajorVersion%" +if %currentJavaMajorVersion% LSS %minimalJavaMajorVersion% ( + CALL :logError "Current Java version is too low, at least OpenJDK %minimalJavaMajorVersion% is needed" + EXIT /B 1 +) +CALL :logInfo "Passed Java major version cheking" +EXIT /B 0 + @REM Pull the latest code of current branch from Git. :gitPull git pull @@ -76,7 +94,7 @@ EXIT /B 0 CALL :gitPull ) CALL :logInfo "[PRE-BUILD] Java Version Information" - CALL java -version + CALL %javaExe% -version CALL :logInfo "[PRE-BUILD] Maven Version Information" CALL mvn -v CALL :logInfo "[PRE-BUILD] Current directory:" @@ -113,7 +131,7 @@ EXIT /B 0 ) CALL :logWarn "[RUN] Found JAR: %jarFileName%" CALL :setTerminalTitle %jarFileName% - SET runJarCommand=java %javaParameter% -Dspring.profiles.active=%mavenActiveProfile% -jar target\%jarFileName% + SET runJarCommand=%javaExe% %javaParameter% -Dspring.profiles.active=%mavenActiveProfile% -jar target\%jarFileName% CALL :logWarn "[RUN] Execute command: %runJarCommand%" CALL %runJarCommand% EXIT /B 0 @@ -121,6 +139,14 @@ EXIT /B 0 @REM ############################# MAIN Procedures ############################# :MAIN cls + +@REM Check Java major version +CALL :checkJavaMajorVersion +if %ERRORLEVEL% NEQ 0 ( + CALL :logError "Failed to check Java major version!" + EXIT /B %ERRORLEVEL% +) + @REM Pre-build phrase (Display version, Git pull) CALL :executePreBuildPhase if %ERRORLEVEL% NEQ 0 ( diff --git a/exercise-mis/pom.xml b/maf-mis/pom.xml similarity index 58% rename from exercise-mis/pom.xml rename to maf-mis/pom.xml index ad42c912..574d373f 100644 --- a/exercise-mis/pom.xml +++ b/maf-mis/pom.xml @@ -1,16 +1,16 @@ - 4.0.0 - exercise-mis - Muscle and Fitness Server :: Exercise MIS + maf-mis + Muscle and Fitness Server :: MAF MIS Exercise Management Information Service. com.jmsoftware.maf muscle-and-fitness-server - 0.0.1 + 0.0.2 @@ -19,22 +19,31 @@ org.springframework.boot spring-boot-maven-plugin + + + build-info + compile + + build-info + + + com.google.cloud.tools jib-maven-plugin - 2.2.0 + ${jib-maven-plugin.version} - + buildAndPushDockerImagePhase @@ -46,8 +55,8 @@ - - openjdk:11.0.9.1-jre-slim + + adoptopenjdk/openjdk11:${adoptopenjdk11.tag} docker.io/ijohnnymiller/${project.parent.artifactId}.${project.artifactId} @@ -62,7 +71,7 @@ -Dfile.encoding=${project.build.sourceEncoding} - ${exercise-mis.port} + ${maf-mis.port} USE_CURRENT_TIMESTAMP @@ -73,53 +82,32 @@ - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.cloud - spring-cloud-starter-netflix-eureka-client - - - de.codecentric - spring-boot-admin-starter-client - ${spring-boot-admin.version} - - - org.springframework.cloud - spring-cloud-starter-zipkin - - - org.springframework.integration - spring-integration-sftp - - com.jmsoftware.maf - common - - - com.jmsoftware.maf - muscle-and-fitness-server-spring-boot-starter + spring-cloud-starter + + + org.springframework.integration + spring-integration-sftp + + + io.minio + minio + + - - - com.baomidou - mybatis-plus-boot-starter - 3.3.1 - + - mysql - mysql-connector-java - runtime - - - com.alibaba - druid - 1.1.22 + org.springframework.boot + spring-boot-starter-test + test + + + org.junit.vintage + junit-vintage-engine + + diff --git a/maf-mis/src/main/java/com/jmsoftware/maf/mafmis/MafMisApplication.java b/maf-mis/src/main/java/com/jmsoftware/maf/mafmis/MafMisApplication.java new file mode 100644 index 00000000..2523c8cb --- /dev/null +++ b/maf-mis/src/main/java/com/jmsoftware/maf/mafmis/MafMisApplication.java @@ -0,0 +1,35 @@ +package com.jmsoftware.maf.mafmis; + +import com.jmsoftware.maf.springcloudstarter.helper.SpringBootStartupHelper; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.client.discovery.EnableDiscoveryClient; +import org.springframework.cloud.openfeign.EnableFeignClients; +import org.springframework.util.StopWatch; + +/** + *

MafMisApplication

+ *

+ * Change description here. + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 6/25/2021 4:23 PM + **/ +@Slf4j +@EnableFeignClients +@EnableDiscoveryClient +@SpringBootApplication +public class MafMisApplication { + private static final StopWatch STOP_WATCH = new StopWatch(); + private static SpringBootStartupHelper springBootStartupHelper; + + public MafMisApplication(SpringBootStartupHelper springBootStartupHelper) { + MafMisApplication.springBootStartupHelper = springBootStartupHelper; + } + + public static void main(String[] args) { + STOP_WATCH.start(); + SpringApplication.run(MafMisApplication.class, args); + springBootStartupHelper.stop(STOP_WATCH); + } +} diff --git a/exercise-mis/src/main/java/com/jmsoftware/maf/exercisemis/exercise/controller/ExerciseController.java b/maf-mis/src/main/java/com/jmsoftware/maf/mafmis/exercise/controller/ExerciseController.java similarity index 80% rename from exercise-mis/src/main/java/com/jmsoftware/maf/exercisemis/exercise/controller/ExerciseController.java rename to maf-mis/src/main/java/com/jmsoftware/maf/mafmis/exercise/controller/ExerciseController.java index d790e21a..51466a37 100644 --- a/exercise-mis/src/main/java/com/jmsoftware/maf/exercisemis/exercise/controller/ExerciseController.java +++ b/maf-mis/src/main/java/com/jmsoftware/maf/mafmis/exercise/controller/ExerciseController.java @@ -1,10 +1,10 @@ -package com.jmsoftware.maf.exercisemis.exercise.controller; +package com.jmsoftware.maf.mafmis.exercise.controller; import cn.hutool.core.bean.BeanUtil; import com.jmsoftware.maf.common.bean.ResponseBodyBean; -import com.jmsoftware.maf.exercisemis.exercise.domain.ExercisePo; -import com.jmsoftware.maf.exercisemis.exercise.domain.GetPageListPayload; -import com.jmsoftware.maf.exercisemis.exercise.service.ExerciseService; +import com.jmsoftware.maf.mafmis.exercise.domain.ExercisePo; +import com.jmsoftware.maf.mafmis.exercise.domain.GetPageListPayload; +import com.jmsoftware.maf.mafmis.exercise.service.ExerciseService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; @@ -20,7 +20,7 @@ *

* Exercise Controller * - * @author Johnny Miller (鍾俊), e-mail: johnnysviva@outlook.com + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com * @date 2/18/20 10:22 AM */ @RestController diff --git a/exercise-mis/src/main/java/com/jmsoftware/maf/exercisemis/exercise/domain/ExercisePo.java b/maf-mis/src/main/java/com/jmsoftware/maf/mafmis/exercise/domain/ExercisePo.java similarity index 93% rename from exercise-mis/src/main/java/com/jmsoftware/maf/exercisemis/exercise/domain/ExercisePo.java rename to maf-mis/src/main/java/com/jmsoftware/maf/mafmis/exercise/domain/ExercisePo.java index 70e553e0..9420fad7 100644 --- a/exercise-mis/src/main/java/com/jmsoftware/maf/exercisemis/exercise/domain/ExercisePo.java +++ b/maf-mis/src/main/java/com/jmsoftware/maf/mafmis/exercise/domain/ExercisePo.java @@ -1,4 +1,4 @@ -package com.jmsoftware.maf.exercisemis.exercise.domain; +package com.jmsoftware.maf.mafmis.exercise.domain; import com.jmsoftware.maf.common.bean.PaginationBase; import lombok.Data; diff --git a/exercise-mis/src/main/java/com/jmsoftware/maf/exercisemis/exercise/domain/GetPageListPayload.java b/maf-mis/src/main/java/com/jmsoftware/maf/mafmis/exercise/domain/GetPageListPayload.java similarity index 78% rename from exercise-mis/src/main/java/com/jmsoftware/maf/exercisemis/exercise/domain/GetPageListPayload.java rename to maf-mis/src/main/java/com/jmsoftware/maf/mafmis/exercise/domain/GetPageListPayload.java index 4cb273f9..e7df7944 100644 --- a/exercise-mis/src/main/java/com/jmsoftware/maf/exercisemis/exercise/domain/GetPageListPayload.java +++ b/maf-mis/src/main/java/com/jmsoftware/maf/mafmis/exercise/domain/GetPageListPayload.java @@ -1,4 +1,4 @@ -package com.jmsoftware.maf.exercisemis.exercise.domain; +package com.jmsoftware.maf.mafmis.exercise.domain; import com.jmsoftware.maf.common.bean.PaginationBase; import lombok.Data; @@ -9,7 +9,7 @@ *

* Change description here. * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com * @date 2/18/20 2:27 PM **/ @Data diff --git a/exercise-mis/src/main/java/com/jmsoftware/maf/exercisemis/exercise/mapper/ExerciseMapper.java b/maf-mis/src/main/java/com/jmsoftware/maf/mafmis/exercise/mapper/ExerciseMapper.java similarity index 86% rename from exercise-mis/src/main/java/com/jmsoftware/maf/exercisemis/exercise/mapper/ExerciseMapper.java rename to maf-mis/src/main/java/com/jmsoftware/maf/mafmis/exercise/mapper/ExerciseMapper.java index 089c215c..a68cee4f 100644 --- a/exercise-mis/src/main/java/com/jmsoftware/maf/exercisemis/exercise/mapper/ExerciseMapper.java +++ b/maf-mis/src/main/java/com/jmsoftware/maf/mafmis/exercise/mapper/ExerciseMapper.java @@ -1,8 +1,8 @@ -package com.jmsoftware.maf.exercisemis.exercise.mapper; +package com.jmsoftware.maf.mafmis.exercise.mapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.jmsoftware.maf.exercisemis.exercise.domain.ExercisePo; +import com.jmsoftware.maf.mafmis.exercise.domain.ExercisePo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -11,7 +11,7 @@ *

* Exercise Mapper * - * @author Johnny Miller (鍾俊), e-mail: johnnysviva@outlook.com + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com * @date 2/18/20 10:22 AM */ @Mapper diff --git a/exercise-mis/src/main/java/com/jmsoftware/maf/exercisemis/exercise/service/ExerciseService.java b/maf-mis/src/main/java/com/jmsoftware/maf/mafmis/exercise/service/ExerciseService.java similarity index 83% rename from exercise-mis/src/main/java/com/jmsoftware/maf/exercisemis/exercise/service/ExerciseService.java rename to maf-mis/src/main/java/com/jmsoftware/maf/mafmis/exercise/service/ExerciseService.java index b448085b..c650e522 100644 --- a/exercise-mis/src/main/java/com/jmsoftware/maf/exercisemis/exercise/service/ExerciseService.java +++ b/maf-mis/src/main/java/com/jmsoftware/maf/mafmis/exercise/service/ExerciseService.java @@ -1,6 +1,6 @@ -package com.jmsoftware.maf.exercisemis.exercise.service; +package com.jmsoftware.maf.mafmis.exercise.service; -import com.jmsoftware.maf.exercisemis.exercise.domain.ExercisePo; +import com.jmsoftware.maf.mafmis.exercise.domain.ExercisePo; import java.util.List; @@ -9,7 +9,7 @@ *

* Exercise Service * - * @author Johnny Miller (鍾俊), e-mail: johnnysviva@outlook.com + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com * @date 2/18/20 10:21 AM */ public interface ExerciseService { diff --git a/exercise-mis/src/main/java/com/jmsoftware/maf/exercisemis/exercise/service/impl/ExerciseServiceImpl.java b/maf-mis/src/main/java/com/jmsoftware/maf/mafmis/exercise/service/impl/ExerciseServiceImpl.java similarity index 82% rename from exercise-mis/src/main/java/com/jmsoftware/maf/exercisemis/exercise/service/impl/ExerciseServiceImpl.java rename to maf-mis/src/main/java/com/jmsoftware/maf/mafmis/exercise/service/impl/ExerciseServiceImpl.java index 4bb070f7..8f2f2d58 100644 --- a/exercise-mis/src/main/java/com/jmsoftware/maf/exercisemis/exercise/service/impl/ExerciseServiceImpl.java +++ b/maf-mis/src/main/java/com/jmsoftware/maf/mafmis/exercise/service/impl/ExerciseServiceImpl.java @@ -1,11 +1,11 @@ -package com.jmsoftware.maf.exercisemis.exercise.service.impl; +package com.jmsoftware.maf.mafmis.exercise.service.impl; import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.jmsoftware.maf.common.exception.BusinessException; -import com.jmsoftware.maf.exercisemis.exercise.domain.ExercisePo; -import com.jmsoftware.maf.exercisemis.exercise.mapper.ExerciseMapper; -import com.jmsoftware.maf.exercisemis.exercise.service.ExerciseService; +import com.jmsoftware.maf.mafmis.exercise.domain.ExercisePo; +import com.jmsoftware.maf.mafmis.exercise.mapper.ExerciseMapper; +import com.jmsoftware.maf.mafmis.exercise.service.ExerciseService; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; @@ -18,7 +18,7 @@ *

* Exercise Service Impl * - * @author Johnny Miller (鍾俊), e-mail: johnnysviva@outlook.com + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com * @date 2/18/20 10:19 AM */ @Slf4j diff --git a/maf-mis/src/main/resources/application-development-docker.yml b/maf-mis/src/main/resources/application-development-docker.yml new file mode 100644 index 00000000..15797f14 --- /dev/null +++ b/maf-mis/src/main/resources/application-development-docker.yml @@ -0,0 +1,36 @@ +spring: + zipkin: + base-url: http://maf-zipkin:9411 + devtools: + add-properties: true + datasource: + dynamic: + datasource: + master: + url: jdbc:mysql://maf-mysql-server-master:3306/muscle_and_fitness?useSSL=true&useUnicode=true + username: maf_mysql_rw + password: maf@mysql + driver-class-name: com.mysql.cj.jdbc.Driver + slave1: + url: jdbc:mysql://maf-mysql-server-slave:3306/muscle_and_fitness?useSSL=true&useUnicode=true + username: maf_mysql_r + password: maf@mysql + driver-class-name: com.mysql.cj.jdbc.Driver + quartz: + url: jdbc:mysql://maf-mysql-server-master:3306/QUARTZ_DB?useSSL=true&useUnicode=true + username: maf_mysql_rw + password: maf@mysql + driver-class-name: com.mysql.cj.jdbc.Driver + redis: + host: maf-redis + port: 6379 + password: maf@redis + rabbitmq: + host: maf-rabbitmq + port: 5672 + username: maf_rabbitmq_su + password: maf@rabbitmq + +maf: + configuration: + swagger-enabled: true diff --git a/maf-mis/src/main/resources/application-development-local.yml b/maf-mis/src/main/resources/application-development-local.yml new file mode 100644 index 00000000..19f727d3 --- /dev/null +++ b/maf-mis/src/main/resources/application-development-local.yml @@ -0,0 +1,36 @@ +spring: + zipkin: + base-url: http://localhost:9411 + devtools: + add-properties: true + datasource: + dynamic: + datasource: + master: + url: jdbc:mysql://localhost:3306/muscle_and_fitness?useSSL=true&useUnicode=true + username: maf_mysql_rw + password: maf@mysql + driver-class-name: com.mysql.cj.jdbc.Driver + slave1: + url: jdbc:mysql://localhost:3307/muscle_and_fitness?useSSL=true&useUnicode=true + username: maf_mysql_r + password: maf@mysql + driver-class-name: com.mysql.cj.jdbc.Driver + quartz: + url: jdbc:mysql://localhost:3306/QUARTZ_DB?useSSL=true&useUnicode=true + username: maf_mysql_rw + password: maf@mysql + driver-class-name: com.mysql.cj.jdbc.Driver + redis: + host: localhost + port: 6379 + password: maf@redis + rabbitmq: + host: localhost + port: 5672 + username: maf_rabbitmq_su + password: maf@rabbitmq + +maf: + configuration: + swagger-enabled: true diff --git a/maf-mis/src/main/resources/application-production.yml b/maf-mis/src/main/resources/application-production.yml new file mode 100644 index 00000000..db47a645 --- /dev/null +++ b/maf-mis/src/main/resources/application-production.yml @@ -0,0 +1,36 @@ +spring: + zipkin: + base-url: http://maf-zipkin:9411 + devtools: + add-properties: false + datasource: + dynamic: + datasource: + master: + url: jdbc:mysql://maf-mysql-server-master:3306/muscle_and_fitness?useSSL=true&useUnicode=true + username: maf_mysql_rw + password: maf@mysql + driver-class-name: com.mysql.cj.jdbc.Driver + slave1: + url: jdbc:mysql://maf-mysql-server-slave:3306/muscle_and_fitness?useSSL=true&useUnicode=true + username: maf_mysql_r + password: maf@mysql + driver-class-name: com.mysql.cj.jdbc.Driver + quartz: + url: jdbc:mysql://maf-mysql-server-master:3306/QUARTZ_DB?useSSL=true&useUnicode=true + username: maf_mysql_rw + password: maf@mysql + driver-class-name: com.mysql.cj.jdbc.Driver + redis: + host: maf-redis + port: 6379 + password: maf@redis + rabbitmq: + host: maf-rabbitmq + port: 5672 + username: maf_rabbitmq_su + password: maf@rabbitmq + +maf: + configuration: + swagger-enabled: false diff --git a/maf-mis/src/main/resources/application-stage.yml b/maf-mis/src/main/resources/application-stage.yml new file mode 100644 index 00000000..db47a645 --- /dev/null +++ b/maf-mis/src/main/resources/application-stage.yml @@ -0,0 +1,36 @@ +spring: + zipkin: + base-url: http://maf-zipkin:9411 + devtools: + add-properties: false + datasource: + dynamic: + datasource: + master: + url: jdbc:mysql://maf-mysql-server-master:3306/muscle_and_fitness?useSSL=true&useUnicode=true + username: maf_mysql_rw + password: maf@mysql + driver-class-name: com.mysql.cj.jdbc.Driver + slave1: + url: jdbc:mysql://maf-mysql-server-slave:3306/muscle_and_fitness?useSSL=true&useUnicode=true + username: maf_mysql_r + password: maf@mysql + driver-class-name: com.mysql.cj.jdbc.Driver + quartz: + url: jdbc:mysql://maf-mysql-server-master:3306/QUARTZ_DB?useSSL=true&useUnicode=true + username: maf_mysql_rw + password: maf@mysql + driver-class-name: com.mysql.cj.jdbc.Driver + redis: + host: maf-redis + port: 6379 + password: maf@redis + rabbitmq: + host: maf-rabbitmq + port: 5672 + username: maf_rabbitmq_su + password: maf@rabbitmq + +maf: + configuration: + swagger-enabled: false diff --git a/maf-mis/src/main/resources/application-test.yml b/maf-mis/src/main/resources/application-test.yml new file mode 100644 index 00000000..9c992a1b --- /dev/null +++ b/maf-mis/src/main/resources/application-test.yml @@ -0,0 +1,36 @@ +spring: + zipkin: + base-url: http://maf-zipkin:9411 + devtools: + add-properties: false + datasource: + dynamic: + datasource: + master: + url: jdbc:mysql://maf-mysql-server-master:3306/muscle_and_fitness?useSSL=true&useUnicode=true + username: maf_mysql_rw + password: maf@mysql + driver-class-name: com.mysql.cj.jdbc.Driver + slave1: + url: jdbc:mysql://maf-mysql-server-slave:3306/muscle_and_fitness?useSSL=true&useUnicode=true + username: maf_mysql_r + password: maf@mysql + driver-class-name: com.mysql.cj.jdbc.Driver + quartz: + url: jdbc:mysql://maf-mysql-server-master:3306/QUARTZ_DB?useSSL=true&useUnicode=true + username: maf_mysql_rw + password: maf@mysql + driver-class-name: com.mysql.cj.jdbc.Driver + redis: + host: maf-redis + port: 6379 + password: maf@redis + rabbitmq: + host: maf-rabbitmq + port: 5672 + username: maf_rabbitmq_su + password: maf@rabbitmq + +maf: + configuration: + swagger-enabled: true diff --git a/maf-mis/src/main/resources/application.yml b/maf-mis/src/main/resources/application.yml new file mode 100644 index 00000000..afeb5833 --- /dev/null +++ b/maf-mis/src/main/resources/application.yml @@ -0,0 +1,191 @@ +server: + port: @maf-mis.port@ + tomcat: + uri-encoding: @project.build.sourceEncoding@ + shutdown: GRACEFUL + servlet: + context-path: + +spring: + application: + name: @project.artifactId@ + profiles: + active: @env@ + mvc: + throw-exception-if-no-handler-found: true + jackson: + date-format: yyyy-MM-dd HH:mm:ss + time-zone: Asia/Hong_Kong + sleuth: + sampler: + probability: 1.0 + servlet: + multipart: + # `location` specifies the directory where uploaded files will be stored. When not specified, + # a temporary directory will be used. ATTENTION: it may differ due to OS. + location: ~/Documents/@project.parent.artifactId@/${spring.application.name}/temprary-file + # `max-file-size` specifies the maximum size permitted for uploaded files. The default is 1MB. We set it as 64 MB. + max-file-size: 64MB + # `max-request-size` specifies the maximum size allowed for multipart/form-data requests. The default is 10MB. + max-request-size: 70MB + # `file-size-threshold` specifies the size threshold after which files will be written to disk. + # The default is 0. We set it as 0 too. + file-size-threshold: 0 + cloud: + consul: + discovery: + register: true + instance-id: ${spring.application.name}-${spring.cloud.client.hostname}-${vcap.application.instance_id:${spring.application.instance_id:${random.value}}} + service-name: ${spring.application.name} + port: ${server.port} + prefer-ip-address: true + ip-address: ${spring.cloud.client.ip-address} + health-check-critical-timeout: 15s + datasource: + type: com.alibaba.druid.pool.DruidDataSource + druid: + driver-class-name: com.mysql.cj.jdbc.Driver + initial-size: 5 + minIdle: 10 + max-active: 20 + max-wait: 60000 + min-evictable-idle-time-millis: 600000 + max-evictable-idle-time-millis: 900000 + validation-query: SELECT 1 + test-while-idle: true + test-on-borrow: false + test-on-return: false + pool-prepared-statements: true + max-open-prepared-statements: 20 + keep-alive: true + filters: stat,wall,log4j2 + filter: + stat: + enabled: true + db-type: mysql + log-slow-sql: true + slow-sql-millis: 2000 + slf4j: + enabled: true + statement-log-error-enabled: true + statement-create-after-log-enabled: false + statement-close-after-log-enabled: false + result-set-open-after-log-enabled: false + result-set-close-after-log-enabled: false + web-stat-filter: + enabled: true + url-pattern: /* + exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*" + session-stat-enable: true + session-stat-max-count: 1000 + stat-view-servlet: + enabled: true + url-pattern: /druid/* + reset-enable: false + login-username: root + login-password: maf_druid_password + allow: + redis: + database: 0 + timeout: 10000ms + client-type: LETTUCE + lettuce: + pool: + max-active: 20 + max-idle: 10 + max-wait: -1ms + min-idle: 0 + quartz: + job-store-type: JDBC + scheduler-name: ${spring.application.name}-scheduler + wait-for-jobs-to-complete-on-shutdown: true + jdbc: + initialize-schema: NEVER + properties: + org: + quartz: + scheduler: + instanceId: AUTO + jobStore: + tablePrefix: QRTZ_ + isClustered: true + clusterCheckinInterval: 3000 + useProperties: false + threadPool: + threadCount: 15 + threadPriority: 5 + class: org.quartz.simpl.SimpleThreadPool + +feign: + httpclient: + enabled: false + okhttp: + enabled: true + client: + config: + default: + connectTimeout: 5000 + readTimeout: 10000 + loggerLevel: full + compression: + request: + enabled: true + response: + enabled: true + useGzipDecoder: true + +management: + endpoints: + web: + exposure: + include: "*" + endpoint: + health: + show-details: ALWAYS + +mybatis-plus: + configuration: + map-underscore-to-camel-case: true + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl + # mapper-locations should start with `classpath*` prefix + # when project is based on Maven multi-module to load XML mapper in different jar + mapper-locations: classpath*:/mapper/**/*Mapper.xml + +logging: + config: classpath:logback-configuration/logback-${spring.profiles.active}.xml + level: + # Configure logging level for SFTP/JSCH + com.jcraft.jsch: INFO + +maf: + project-property: + base-package: @project.groupId@ + context-path: ${server.servlet.context-path} + group-id: @project.groupId@ + project-parent-artifact-id: @project.parent.artifactId@ + project-artifact-id: @project.artifactId@ + version: @project.version@ + description: @project.description@ + jdk-version: @java.version@ + environment: ${spring.profiles.active} + url: @project.url@ + inception-year: @inceptionYear@ + organization-name: @project.organization.name@ + organization-url: @project.organization.url@ + issue-management-system: @project.issueManagement.system@ + issue-management-url: @project.issueManagement.url@ + developer-name: @developerName@ + developer-email: @developerEmail@ + developer-url: @developerUrl@ + configuration: + ignored-url: + pattern: + - "/static/**" + - "/actuator/**" + - "/druid/**" + - "/swagger-resources/**" + - "/v2/api-docs/**" + - "/*/v2/api-docs/**" + - "/webjars/**" + - "/doc.html" + included-package-for-http-api-scan: ${maf.project-property.base-package} diff --git a/gateway/src/main/resources/banner.txt b/maf-mis/src/main/resources/banner.txt similarity index 72% rename from gateway/src/main/resources/banner.txt rename to maf-mis/src/main/resources/banner.txt index d46648bc..de92d1b1 100644 --- a/gateway/src/main/resources/banner.txt +++ b/maf-mis/src/main/resources/banner.txt @@ -1,13 +1,12 @@ ${AnsiStyle.BOLD}${AnsiColor.BRIGHT_GREEN} - ______ __ - / ____/___ _/ /____ _ ______ ___ __ - / / __/ __ `/ __/ _ \ | /| / / __ `/ / / / -/ /_/ / /_/ / /_/ __/ |/ |/ / /_/ / /_/ / -\____/\__,_/\__/\___/|__/|__/\__,_/\__, / - /____/ -${AnsiStyle.BOLD}Gateway :: Powered by Spring Boot ::${spring-boot.formatted-version} -${AnsiColor.CYAN}Author: Johnny Miller (鍾俊), email: johnnysviva@outlook.com -${AnsiStyle.NORMAL}${AnsiColor.MAGENTA}http://patorjk.com/software/taag/#p=display&f=Slant&t=Gateway + __ ______ ______ __ ____________ + / |/ / | / ____/ / |/ / _/ ___/ + / /|_/ / /| | / /_ / /|_/ // / \__ \ + / / / / ___ |/ __/ / / / // / ___/ / +/_/ /_/_/ |_/_/ /_/ /_/___//____/ +${AnsiStyle.BOLD}MAF MIS :: Powered by Spring Boot ::${spring-boot.formatted-version} +${AnsiColor.CYAN}Author: Johnny Miller (锺俊), email: johnnysviva@outlook.com +${AnsiStyle.NORMAL}${AnsiColor.MAGENTA}http://patorjk.com/software/taag/#p=display&f=Slant&t=MAF%20MIS ${AnsiColor.BRIGHT_BLACK} -------------------------------------------Font Info------------------------------------------- Slant by Glenn Chappell 3/93 -- based on Standard diff --git a/maf-mis/src/main/resources/bootstrap.yml b/maf-mis/src/main/resources/bootstrap.yml new file mode 100644 index 00000000..79e3552f --- /dev/null +++ b/maf-mis/src/main/resources/bootstrap.yml @@ -0,0 +1,18 @@ +spring: + application: + name: @project.artifactId@ + cloud: + consul: + host: "should-be-passed-by-java-opts" + port: 8500 + config: + enabled: true + prefix: config + # `default-context` should be equal to Spring application name + default-context: @project.artifactId@ + profile-separator: "::" + format: YAML + data-key: "data" + watch: + enabled: true + delay: 1000 diff --git a/gateway/src/main/resources/configuration/logback/logback-base.xml b/maf-mis/src/main/resources/logback-configuration/logback-base.xml similarity index 69% rename from gateway/src/main/resources/configuration/logback/logback-base.xml rename to maf-mis/src/main/resources/logback-configuration/logback-base.xml index 98a8a11b..1629f54f 100644 --- a/gateway/src/main/resources/configuration/logback/logback-base.xml +++ b/maf-mis/src/main/resources/logback-configuration/logback-base.xml @@ -10,7 +10,7 @@ converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/> - + - + + - + + - + + - + + - + + @@ -60,11 +65,19 @@ - ${LOG_HOME}/${PROJECT_ARTIFACT_Id}${LOG_FILE_SUFFIX}.%d{yyyy-MM-dd}.%i.log.gz + ${LOG_HOME}/${APPLICATION}-${ENVIRONMENT}-${HOSTNAME}.%d{yyyy-MM-dd}.%i.log.gz 5MB 7 1GB + + + + ${LOGSTASH_HOST}:4560 + + {"applicationName": "${APPLICATION}", "environment": "${ENVIRONMENT}"} + + diff --git a/api-portal/src/main/resources/configuration/logback/logback-development-docker.xml b/maf-mis/src/main/resources/logback-configuration/logback-development-docker.xml similarity index 68% rename from api-portal/src/main/resources/configuration/logback/logback-development-docker.xml rename to maf-mis/src/main/resources/logback-configuration/logback-development-docker.xml index f38e6c2d..86b71ee2 100644 --- a/api-portal/src/main/resources/configuration/logback/logback-development-docker.xml +++ b/maf-mis/src/main/resources/logback-configuration/logback-development-docker.xml @@ -1,10 +1,11 @@ - + + diff --git a/gateway/src/main/resources/configuration/logback/logback-development-local.xml b/maf-mis/src/main/resources/logback-configuration/logback-development-local.xml similarity index 68% rename from gateway/src/main/resources/configuration/logback/logback-development-local.xml rename to maf-mis/src/main/resources/logback-configuration/logback-development-local.xml index f38e6c2d..86b71ee2 100644 --- a/gateway/src/main/resources/configuration/logback/logback-development-local.xml +++ b/maf-mis/src/main/resources/logback-configuration/logback-development-local.xml @@ -1,10 +1,11 @@ - + + diff --git a/exercise-mis/src/main/resources/configuration/logback/logback-production.xml b/maf-mis/src/main/resources/logback-configuration/logback-production.xml similarity index 68% rename from exercise-mis/src/main/resources/configuration/logback/logback-production.xml rename to maf-mis/src/main/resources/logback-configuration/logback-production.xml index f38e6c2d..86b71ee2 100644 --- a/exercise-mis/src/main/resources/configuration/logback/logback-production.xml +++ b/maf-mis/src/main/resources/logback-configuration/logback-production.xml @@ -1,10 +1,11 @@ - + + diff --git a/exercise-mis/src/main/resources/configuration/logback/logback-stage.xml b/maf-mis/src/main/resources/logback-configuration/logback-stage.xml similarity index 68% rename from exercise-mis/src/main/resources/configuration/logback/logback-stage.xml rename to maf-mis/src/main/resources/logback-configuration/logback-stage.xml index f38e6c2d..86b71ee2 100644 --- a/exercise-mis/src/main/resources/configuration/logback/logback-stage.xml +++ b/maf-mis/src/main/resources/logback-configuration/logback-stage.xml @@ -1,10 +1,11 @@ - + + diff --git a/exercise-mis/src/main/resources/configuration/logback/logback-test.xml b/maf-mis/src/main/resources/logback-configuration/logback-test.xml similarity index 66% rename from exercise-mis/src/main/resources/configuration/logback/logback-test.xml rename to maf-mis/src/main/resources/logback-configuration/logback-test.xml index f1916a0f..3c705245 100644 --- a/exercise-mis/src/main/resources/configuration/logback/logback-test.xml +++ b/maf-mis/src/main/resources/logback-configuration/logback-test.xml @@ -1,10 +1,11 @@ - + + diff --git a/exercise-mis/src/main/resources/mapper/ExerciseMapper.xml b/maf-mis/src/main/resources/mapper/ExerciseMapper.xml similarity index 94% rename from exercise-mis/src/main/resources/mapper/ExerciseMapper.xml rename to maf-mis/src/main/resources/mapper/ExerciseMapper.xml index dbf46e8e..fc7877d7 100644 --- a/exercise-mis/src/main/resources/mapper/ExerciseMapper.xml +++ b/maf-mis/src/main/resources/mapper/ExerciseMapper.xml @@ -1,7 +1,7 @@ - - + + diff --git a/exercise-mis/src/test/java/com/jmsoftware/maf/exercisemis/ExercisePoMisApplicationTests.java b/maf-mis/src/test/java/com/jmsoftware/maf/mafmis/ExercisePoMisApplicationTests.java similarity index 83% rename from exercise-mis/src/test/java/com/jmsoftware/maf/exercisemis/ExercisePoMisApplicationTests.java rename to maf-mis/src/test/java/com/jmsoftware/maf/mafmis/ExercisePoMisApplicationTests.java index de98f9d5..8f7940b9 100644 --- a/exercise-mis/src/test/java/com/jmsoftware/maf/exercisemis/ExercisePoMisApplicationTests.java +++ b/maf-mis/src/test/java/com/jmsoftware/maf/mafmis/ExercisePoMisApplicationTests.java @@ -1,4 +1,4 @@ -package com.jmsoftware.maf.exercisemis; +package com.jmsoftware.maf.mafmis; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; diff --git a/misc/.empty b/misc/.empty deleted file mode 100644 index e69de29b..00000000 diff --git a/muscle-and-fitness-server-reactive-spring-boot-starter/pom.xml b/muscle-and-fitness-server-reactive-spring-boot-starter/pom.xml deleted file mode 100644 index 6cd84b39..00000000 --- a/muscle-and-fitness-server-reactive-spring-boot-starter/pom.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - 4.0.0 - - - muscle-and-fitness-server-reactive-spring-boot-starter - Muscle and Fitness Server :: Reactive Spring Boot Starter - Muscle and Fitness Server Reactive Spring Boot Starter - - com.jmsoftware.maf - muscle-and-fitness-server - 0.0.1 - - - - - - org.springframework.boot - spring-boot-autoconfigure - - - org.springframework.boot - spring-boot-autoconfigure-processor - true - - - diff --git a/muscle-and-fitness-server-reactive-spring-boot-starter/src/main/java/com/jmsoftware/maf/muscleandfitnessserverreactivespringbootstarter/package-info.java b/muscle-and-fitness-server-reactive-spring-boot-starter/src/main/java/com/jmsoftware/maf/muscleandfitnessserverreactivespringbootstarter/package-info.java deleted file mode 100644 index 04f0469b..00000000 --- a/muscle-and-fitness-server-reactive-spring-boot-starter/src/main/java/com/jmsoftware/maf/muscleandfitnessserverreactivespringbootstarter/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package com.jmsoftware.maf.muscleandfitnessserverreactivespringbootstarter; diff --git a/muscle-and-fitness-server-reactive-spring-boot-starter/src/main/resources/application.yml b/muscle-and-fitness-server-reactive-spring-boot-starter/src/main/resources/application.yml deleted file mode 100644 index 8b137891..00000000 --- a/muscle-and-fitness-server-reactive-spring-boot-starter/src/main/resources/application.yml +++ /dev/null @@ -1 +0,0 @@ - diff --git a/muscle-and-fitness-server-spring-boot-starter/pom.xml b/muscle-and-fitness-server-spring-boot-starter/pom.xml deleted file mode 100644 index 4bb8d12c..00000000 --- a/muscle-and-fitness-server-spring-boot-starter/pom.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - 4.0.0 - - - muscle-and-fitness-server-spring-boot-starter - Muscle and Fitness Server :: Spring Boot Starter - Muscle and Fitness Server Spring Boot Starter - - com.jmsoftware.maf - muscle-and-fitness-server - 0.0.1 - - - - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-autoconfigure - - - org.springframework.boot - spring-boot-autoconfigure-processor - true - - - com.jmsoftware.maf - common - - - diff --git a/muscle-and-fitness-server-spring-boot-starter/src/main/java/com/jmsoftware/maf/muscleandfitnessserverspringbootstarter/aspect/ExceptionControllerAdvice.java b/muscle-and-fitness-server-spring-boot-starter/src/main/java/com/jmsoftware/maf/muscleandfitnessserverspringbootstarter/aspect/ExceptionControllerAdvice.java deleted file mode 100644 index 251d926b..00000000 --- a/muscle-and-fitness-server-spring-boot-starter/src/main/java/com/jmsoftware/maf/muscleandfitnessserverspringbootstarter/aspect/ExceptionControllerAdvice.java +++ /dev/null @@ -1,137 +0,0 @@ -package com.jmsoftware.maf.muscleandfitnessserverspringbootstarter.aspect; - -import cn.hutool.core.collection.CollUtil; -import com.jmsoftware.maf.common.bean.ResponseBodyBean; -import com.jmsoftware.maf.common.constant.HttpStatus; -import com.jmsoftware.maf.common.exception.BaseException; -import com.jmsoftware.maf.muscleandfitnessserverspringbootstarter.util.RequestUtil; -import lombok.extern.slf4j.Slf4j; -import lombok.val; -import org.springframework.context.support.DefaultMessageSourceResolvable; -import org.springframework.http.converter.HttpMessageNotReadableException; -import org.springframework.validation.BindException; -import org.springframework.web.HttpRequestMethodNotSupportedException; -import org.springframework.web.bind.MethodArgumentNotValidException; -import org.springframework.web.bind.annotation.ControllerAdvice; -import org.springframework.web.bind.annotation.ExceptionHandler; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException; -import org.springframework.web.servlet.NoHandlerFoundException; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.validation.ConstraintViolationException; -import java.util.Objects; - -/** - *

ExceptionControllerAdvice

- *

- * Exception advice for global controllers. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2019-03-02 17:39 - **/ -@Slf4j -@ControllerAdvice -public class ExceptionControllerAdvice { - /** - *

Exception handler.

- *

ATTENTION: In this method, cannot throw any exception.

- * - * @param request HTTP request - * @param exception any kinds of exception occurred in controller - * @return custom exception info - */ - @ResponseBody - @ExceptionHandler(value = Exception.class) - public ResponseBodyBean handleException(HttpServletRequest request, - HttpServletResponse response, - Exception exception) { - log.error("Exception occurred when [{}] requested access. URL: {}", RequestUtil.getRequestIpAndPort(request), - request.getServletPath()); - - // FIXME: THIS IS NOT A PROBLEM - // ATTENTION: Use only ResponseBodyBean.ofStatus() in handleException() method and DON'T throw any exception - if (exception instanceof NoHandlerFoundException) { - log.error("NoHandlerFoundException: Request URL = {}, HTTP method = {}", - ((NoHandlerFoundException) exception).getRequestURL(), - ((NoHandlerFoundException) exception).getHttpMethod()); - response.setStatus(HttpStatus.NOT_FOUND.getCode()); - return ResponseBodyBean.ofStatus(HttpStatus.NOT_FOUND); - } else if (exception instanceof HttpRequestMethodNotSupportedException) { - log.error("Exception occurred when the request handler does not support a specific request method. " + - "Current method is {}, Support HTTP method = {}", - ((HttpRequestMethodNotSupportedException) exception).getMethod(), - ((HttpRequestMethodNotSupportedException) exception).getSupportedHttpMethods()); - response.setStatus(HttpStatus.METHOD_NOT_ALLOWED.getCode()); - return ResponseBodyBean.ofStatus(HttpStatus.METHOD_NOT_ALLOWED); - } else if (exception instanceof MethodArgumentNotValidException) { - log.error("Exception occurred when validation on an argument annotated with fails. Exception message: {}", - exception.getMessage()); - response.setStatus(HttpStatus.BAD_REQUEST.getCode()); - return ResponseBodyBean.ofStatus(HttpStatus.BAD_REQUEST.getCode(), - getFieldErrorMessageFromException( - (MethodArgumentNotValidException) exception), - null); - } else if (exception instanceof ConstraintViolationException) { - log.error("Constraint violations exception occurred. Exception message: {}", exception.getMessage()); - response.setStatus(HttpStatus.BAD_REQUEST.getCode()); - return ResponseBodyBean.ofStatus(HttpStatus.BAD_REQUEST.getCode(), - CollUtil.getFirst( - ((ConstraintViolationException) exception).getConstraintViolations()).getMessage(), - null); - } else if (exception instanceof MethodArgumentTypeMismatchException) { - log.error("MethodArgumentTypeMismatchException: Parameter name = {}, Exception message: {}", - ((MethodArgumentTypeMismatchException) exception).getName(), - ((MethodArgumentTypeMismatchException) exception).getMessage()); - response.setStatus(HttpStatus.PARAM_NOT_MATCH.getCode()); - return ResponseBodyBean.ofStatus(HttpStatus.PARAM_NOT_MATCH); - } else if (exception instanceof HttpMessageNotReadableException) { - log.error("HttpMessageNotReadableException: {}", - ((HttpMessageNotReadableException) exception).getMessage()); - response.setStatus(HttpStatus.PARAM_NOT_NULL.getCode()); - return ResponseBodyBean.ofStatus(HttpStatus.PARAM_NOT_NULL); - } else if (exception instanceof BaseException) { - log.error("BaseException: Status code: {}, message: {}, data: {}", ((BaseException) exception).getCode(), - exception.getMessage(), ((BaseException) exception).getData()); - response.setStatus(((BaseException) exception).getCode()); - return ResponseBodyBean.ofStatus(((BaseException) exception).getCode(), exception.getMessage(), - ((BaseException) exception).getData()); - } else if (exception instanceof BindException) { - log.error("Exception message: {} ", exception.getMessage()); - response.setStatus(HttpStatus.INVALID_PARAM.getCode()); - return ResponseBodyBean.ofStatus(HttpStatus.INVALID_PARAM); - } else if (exception instanceof IllegalArgumentException) { - log.error("Exception message: {} ", exception.getMessage()); - response.setStatus(HttpStatus.BAD_REQUEST.getCode()); - return ResponseBodyBean.ofStatus(HttpStatus.BAD_REQUEST.getCode(), exception.getMessage(), null); - } - log.error("Internal system exception occurred! Exception message: {} ", exception.getMessage(), exception); - response.setStatus(HttpStatus.ERROR.getCode()); - return ResponseBodyBean.ofStatus(HttpStatus.ERROR.getCode(), HttpStatus.ERROR.getMessage(), null); - } - - /** - * Get field error message from exception. If two or more fields do not pass Spring Validation check, then will - * return the 1st error message of the error field. - * - * @param exception MethodArgumentNotValidException - * @return field error message - */ - private String getFieldErrorMessageFromException(MethodArgumentNotValidException exception) { - try { - val firstErrorField = - (DefaultMessageSourceResolvable) Objects.requireNonNull(exception.getBindingResult() - .getAllErrors() - .get(0) - .getArguments())[0]; - val firstErrorFieldName = firstErrorField.getDefaultMessage(); - val firstErrorFieldMessage = exception.getBindingResult().getAllErrors().get(0).getDefaultMessage(); - return String.format("%s %s", firstErrorFieldName, firstErrorFieldMessage); - } catch (Exception e) { - log.error("Exception occurred when get field error message from exception. Exception message: {}", - e.getMessage(), e); - return HttpStatus.INVALID_PARAM.getMessage(); - } - } -} diff --git a/muscle-and-fitness-server-spring-boot-starter/src/main/java/com/jmsoftware/maf/muscleandfitnessserverspringbootstarter/configuration/MuscleAndFitnessServerAutoConfiguration.java b/muscle-and-fitness-server-spring-boot-starter/src/main/java/com/jmsoftware/maf/muscleandfitnessserverspringbootstarter/configuration/MuscleAndFitnessServerAutoConfiguration.java deleted file mode 100644 index 08248a88..00000000 --- a/muscle-and-fitness-server-spring-boot-starter/src/main/java/com/jmsoftware/maf/muscleandfitnessserverspringbootstarter/configuration/MuscleAndFitnessServerAutoConfiguration.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.jmsoftware.maf.muscleandfitnessserverspringbootstarter.configuration; - -import com.jmsoftware.maf.muscleandfitnessserverspringbootstarter.aspect.ExceptionControllerAdvice; -import com.jmsoftware.maf.muscleandfitnessserverspringbootstarter.aspect.WebRequestLogAspect; -import com.jmsoftware.maf.muscleandfitnessserverspringbootstarter.controller.RedirectController; -import com.jmsoftware.maf.muscleandfitnessserverspringbootstarter.filter.RequestFilter; -import com.jmsoftware.maf.muscleandfitnessserverspringbootstarter.helper.IpHelper; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.Environment; - -import javax.annotation.PostConstruct; - -/** - * Description: MediaStreamingAutoConfiguration, change description here. - * - * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 10/19/2020 2:51 PM - **/ -@Slf4j -@Configuration -@RequiredArgsConstructor -@EnableConfigurationProperties(MuscleAndFitnessServerAutoConfiguration.class) -public class MuscleAndFitnessServerAutoConfiguration { - @PostConstruct - public void afterInitialization() { - log.debug("{} initialization is done. About to inject beans.", getClass().getSimpleName()); - } - - @Bean - @ConditionalOnMissingBean - public ExceptionControllerAdvice exceptionControllerAdvice() { - log.debug("Initial bean: {}", ExceptionControllerAdvice.class.getName()); - return new ExceptionControllerAdvice(); - } - - @Bean - @ConditionalOnMissingBean - public WebRequestLogAspect webRequestLogAspect() { - log.debug("Initial bean: {}", WebRequestLogAspect.class.getName()); - return new WebRequestLogAspect(); - } - - @Bean - @ConditionalOnMissingBean - public RedirectController redirectController() { - log.debug("Initial bean: {}", RedirectController.class.getName()); - return new RedirectController(); - } - - @Bean - @ConditionalOnMissingBean - public RequestFilter requestFilter() { - log.debug("Initial bean: {}", RequestFilter.class.getName()); - return new RequestFilter(); - } - - @Bean - @ConditionalOnMissingBean - public IpHelper ipHelper(Environment environment) { - log.debug("Initial bean: {}", IpHelper.class.getName()); - return new IpHelper(environment); - } - - @Bean - @ConditionalOnMissingBean - public WebMvcConfiguration webMvcConfiguration() { - log.debug("Initial bean: {}", WebMvcConfiguration.class.getName()); - return new WebMvcConfiguration(); - } -} diff --git a/muscle-and-fitness-server-spring-boot-starter/src/main/java/com/jmsoftware/maf/muscleandfitnessserverspringbootstarter/configuration/WebMvcConfiguration.java b/muscle-and-fitness-server-spring-boot-starter/src/main/java/com/jmsoftware/maf/muscleandfitnessserverspringbootstarter/configuration/WebMvcConfiguration.java deleted file mode 100644 index f326fd67..00000000 --- a/muscle-and-fitness-server-spring-boot-starter/src/main/java/com/jmsoftware/maf/muscleandfitnessserverspringbootstarter/configuration/WebMvcConfiguration.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.jmsoftware.maf.muscleandfitnessserverspringbootstarter.configuration; - -import lombok.RequiredArgsConstructor; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.servlet.config.annotation.CorsRegistry; -import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; - -/** - *

WebMvcConfiguration

- *

- * Spring MVC Configurations. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 1/23/20 9:02 AM - **/ -@Configuration -@RequiredArgsConstructor -public class WebMvcConfiguration implements WebMvcConfigurer { - private static final long MAX_AGE_SECS = 3600; - - /** - * 1. Config static path pattern - * 2. Config static resource location - * - * @param registry static resources register - */ - @Override - public void addResourceHandlers(ResourceHandlerRegistry registry) { - registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/"); - } - - /** - * Configure cross origin requests processing. - * - * @param registry CORS registry - */ - @Override - public void addCorsMappings(CorsRegistry registry) { - registry.addMapping("/**") - .allowedOrigins("*") - .allowedMethods("HEAD", "OPTIONS", "GET", "POST", "PUT", "PATCH", "DELETE") - .maxAge(MAX_AGE_SECS); - } -} diff --git a/muscle-and-fitness-server-spring-boot-starter/src/main/java/com/jmsoftware/maf/muscleandfitnessserverspringbootstarter/filter/RequestFilter.java b/muscle-and-fitness-server-spring-boot-starter/src/main/java/com/jmsoftware/maf/muscleandfitnessserverspringbootstarter/filter/RequestFilter.java deleted file mode 100644 index cc2444e5..00000000 --- a/muscle-and-fitness-server-spring-boot-starter/src/main/java/com/jmsoftware/maf/muscleandfitnessserverspringbootstarter/filter/RequestFilter.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.jmsoftware.maf.muscleandfitnessserverspringbootstarter.filter; - -import com.jmsoftware.maf.muscleandfitnessserverspringbootstarter.util.RequestUtil; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; -import org.springframework.web.filter.OncePerRequestFilter; - -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; - -/** - *

RequestFilter

- *

Request filter.

- * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2019-03-23 14:24 - **/ -@Slf4j -@Component -public class RequestFilter extends OncePerRequestFilter { - @Override - @SuppressWarnings("NullableProblems") - protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, - FilterChain filterChain) throws IOException, ServletException { - log.info("The requester({}) requested resource. Resource: [{}] {}", RequestUtil.getRequestIpAndPort(request), - request.getMethod(), request.getRequestURL()); - filterChain.doFilter(request, response); - } -} diff --git a/muscle-and-fitness-server-spring-boot-starter/src/main/java/com/jmsoftware/maf/muscleandfitnessserverspringbootstarter/helper/IpHelper.java b/muscle-and-fitness-server-spring-boot-starter/src/main/java/com/jmsoftware/maf/muscleandfitnessserverspringbootstarter/helper/IpHelper.java deleted file mode 100644 index a78cfd4c..00000000 --- a/muscle-and-fitness-server-spring-boot-starter/src/main/java/com/jmsoftware/maf/muscleandfitnessserverspringbootstarter/helper/IpHelper.java +++ /dev/null @@ -1,108 +0,0 @@ -package com.jmsoftware.maf.muscleandfitnessserverspringbootstarter.helper; - -import cn.hutool.core.util.StrUtil; -import lombok.Getter; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import lombok.val; -import org.springframework.boot.web.context.WebServerInitializedEvent; -import org.springframework.context.ApplicationListener; -import org.springframework.core.env.Environment; -import org.springframework.stereotype.Component; - -import java.io.BufferedReader; -import java.io.InputStreamReader; -import java.net.Inet4Address; -import java.net.InetAddress; -import java.net.NetworkInterface; -import java.net.URL; -import java.util.Enumeration; - -/** - *

ServerConfiguration

- *

- * Change description here. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2019-04-26 16:02 - **/ -@Slf4j -@Getter -@Component -@RequiredArgsConstructor -public class IpHelper implements ApplicationListener { - private static final String DEVELOPMENT_ENVIRONMENT = "development"; - private final Environment environment; - private int serverPort; - - @Override - public void onApplicationEvent(WebServerInitializedEvent event) { - this.serverPort = event.getWebServer().getPort(); - } - - /** - * Find public IP address. - * - * @return public IP - */ - public String getPublicIp() { - String jointProfiles = String.join(",", environment.getActiveProfiles()); - if (StrUtil.isNotBlank(jointProfiles)) { - if (jointProfiles.contains(DEVELOPMENT_ENVIRONMENT)) { - log.debug("Current active profiles for environment contains: {}", DEVELOPMENT_ENVIRONMENT); - return this.getInternetIp(); - } - } - try { - // An API provided by https://whatismyipaddress.com/api - val url = new URL("https://ipv4bot.whatismyipaddress.com/"); - val sc = new BufferedReader(new InputStreamReader(url.openStream())); - // Read system IP Address - return sc.readLine().trim(); - } catch (Exception e) { - log.error("Cannot execute properly to get IP address from https://whatismyipaddress.com/api", e); - } - return this.getInternetIp(); - } - - /** - * Get internet IP. - * - * @return internet IP - */ - private String getInternetIp() { - val intranetIp = this.getIntranetIp(); - try { - val networks = NetworkInterface.getNetworkInterfaces(); - InetAddress ip; - Enumeration addresses; - while (networks.hasMoreElements()) { - addresses = networks.nextElement().getInetAddresses(); - while (addresses.hasMoreElements()) { - ip = addresses.nextElement(); - if (ip instanceof Inet4Address - && ip.isSiteLocalAddress() - && !ip.getHostAddress().equals(intranetIp)) { - return ip.getHostAddress(); - } - } - } - return intranetIp; - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - /** - * Get intranet IP. - * - * @return intranet IP - */ - private String getIntranetIp() { - try { - return InetAddress.getLocalHost().getHostAddress(); - } catch (Exception e) { - throw new RuntimeException(e); - } - } -} diff --git a/muscle-and-fitness-server-spring-boot-starter/src/main/java/com/jmsoftware/maf/muscleandfitnessserverspringbootstarter/package-info.java b/muscle-and-fitness-server-spring-boot-starter/src/main/java/com/jmsoftware/maf/muscleandfitnessserverspringbootstarter/package-info.java deleted file mode 100644 index 7aa39447..00000000 --- a/muscle-and-fitness-server-spring-boot-starter/src/main/java/com/jmsoftware/maf/muscleandfitnessserverspringbootstarter/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package com.jmsoftware.maf.muscleandfitnessserverspringbootstarter; diff --git a/muscle-and-fitness-server-spring-boot-starter/src/main/java/com/jmsoftware/maf/muscleandfitnessserverspringbootstarter/util/FileUtil.java b/muscle-and-fitness-server-spring-boot-starter/src/main/java/com/jmsoftware/maf/muscleandfitnessserverspringbootstarter/util/FileUtil.java deleted file mode 100644 index 6a624390..00000000 --- a/muscle-and-fitness-server-spring-boot-starter/src/main/java/com/jmsoftware/maf/muscleandfitnessserverspringbootstarter/util/FileUtil.java +++ /dev/null @@ -1,101 +0,0 @@ -package com.jmsoftware.maf.muscleandfitnessserverspringbootstarter.util; - -import cn.hutool.core.date.DateUtil; -import cn.hutool.core.util.StrUtil; -import lombok.extern.slf4j.Slf4j; -import org.springframework.web.multipart.MultipartFile; - -import java.io.*; -import java.util.Date; -import java.util.Objects; -import java.util.UUID; - -/** - *

FileUtil

- *

Change description here

- * - * @author Johnny Miller (鍾俊), e-mail: johnnysviva@outlook.com - * @date 2/27/20 9:45 AM - **/ -@Slf4j -@SuppressWarnings("unused") -public class FileUtil { - /** - * Convert multipart file to file - * - * @param multipartFile multipart file - * @return file - * @throws IOException IO exception - */ - public static File convertFrom(final MultipartFile multipartFile) throws IOException { - log.info("Converting multipart file, original multipart file name: {}", multipartFile.getOriginalFilename()); - var convertFile = new File(Objects.requireNonNull(multipartFile.getOriginalFilename())); - var fos = new FileOutputStream(convertFile); - fos.write(multipartFile.getBytes()); - fos.close(); - return convertFile; - } - - /** - * Convert input stream to file - * - * @param inputStream input stream - * @param savePath path for saving file - * @return file - */ - public static File convertFrom(final InputStream inputStream, final String savePath) { - log.info("Converting InputStream to file, save path: {}", savePath); - var file = new File(savePath); - try (OutputStream outputStream = new FileOutputStream(file)) { - int read; - byte[] bytes = new byte[1024]; - while ((read = inputStream.read(bytes)) != -1) { - outputStream.write(bytes, 0, read); - } - } catch (IOException e) { - log.error("Exception occurred when initializing FileOutputStream. Exception message: {}", - e.getMessage(), - e); - } finally { - try { - inputStream.close(); - } catch (IOException e) { - log.error("Exception occurred when closing FileOutputStream. Exception message: {}", e.getMessage(), e); - } - } - return file; - } - - /** - * Generate date-format storage path (relative path, w/o SFTP's server directory) - * - * @param sftpSubDirectory SFTP server's sub directory - * @return full storage path (absolute path). Null if file name is empty. - */ - public static String generateDateFormatStoragePath(final String sftpSubDirectory) { - var today = new Date(); - var year = DateUtil.format(today, "yyyy"); - var month = DateUtil.format(today, "MM"); - var day = DateUtil.format(today, "dd"); - return sftpSubDirectory - + year - + "/" + month - + "/" + day - + "/"; - } - - /** - * Generate unique file name for file - * - * @param file file - * @return unique file name (UUID.fileExtension) - */ - public static String generateUniqueFileName(final File file) { - var fileName = file.getName(); - if (StrUtil.isBlank(fileName)) { - return null; - } - var fileExtension = fileName.substring(fileName.lastIndexOf(".")); - return UUID.randomUUID() + "." + fileExtension; - } -} diff --git a/muscle-and-fitness-server-spring-boot-starter/src/main/resources/META-INF/spring.factories b/muscle-and-fitness-server-spring-boot-starter/src/main/resources/META-INF/spring.factories deleted file mode 100644 index 77c4a2b8..00000000 --- a/muscle-and-fitness-server-spring-boot-starter/src/main/resources/META-INF/spring.factories +++ /dev/null @@ -1,3 +0,0 @@ -# Auto Configure -org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ - com.jmsoftware.maf.muscleandfitnessserverspringbootstarter.configuration.MuscleAndFitnessServerAutoConfiguration diff --git a/muscle-mis/README.md b/muscle-mis/README.md deleted file mode 100644 index 1fa07bd5..00000000 --- a/muscle-mis/README.md +++ /dev/null @@ -1,67 +0,0 @@ -![Muscle and Fitness Server Social Image](https://raw.githubusercontent.com/johnnymillergh/MaterialLibrary/master/muscle-and-fitness/muscle-and-fitness-server-social-image.png) -[![GitHub release](https://img.shields.io/github/release/johnnymillergh/muscle-and-fitness-server.svg)](https://github.com/johnnymillergh/muscle-and-fitness-server/releases) -[![Build Status](https://travis-ci.com/johnnymillergh/muscle-and-fitness-server.svg?branch=master)](https://travis-ci.com/johnnymillergh/muscle-and-fitness-server) -[![GitHub issues](https://img.shields.io/github/issues/johnnymillergh/muscle-and-fitness-server)](https://github.com/johnnymillergh/muscle-and-fitness-server/issues) -[![GitHub forks](https://img.shields.io/github/forks/johnnymillergh/muscle-and-fitness-server)](https://github.com/johnnymillergh/muscle-and-fitness-server/network) -[![GitHub stars](https://img.shields.io/github/stars/johnnymillergh/muscle-and-fitness-server)](https://github.com/johnnymillergh/muscle-and-fitness-server) -[![GitHub license](https://img.shields.io/github/license/johnnymillergh/muscle-and-fitness-server)](https://github.com/johnnymillergh/muscle-and-fitness-server/blob/master/LICENSE) -[![GitHub code size in bytes](https://img.shields.io/github/languages/code-size/johnnymillergh/muscle-and-fitness-server.svg?style=popout)](https://github.com/johnnymillergh/muscle-and-fitness-server) -[![GitHub repo size](https://img.shields.io/github/repo-size/johnnymillergh/muscle-and-fitness-server.svg)](https://github.com/johnnymillergh/muscle-and-fitness-server) -[![Twitter](https://img.shields.io/twitter/url/https/github.com/johnnymillergh/muscle-and-fitness-server?style=social)](https://twitter.com/intent/tweet?text=Wow:&url=https%3A%2F%2Fgithub.com%2Fjohnnymillergh%2Fmuscle-and-fitness-server) - -# Muscle and Fitness Server :: Muscle MIS - -**Muscle and Fitness Server :: Muscle MIS** full name is Muscle Management Information Service, a sub module of Muscle and Fitness Server (M&F). - -[Official Docker Image](https://hub.docker.com/r/ijohnnymiller/muscle-and-fitness-server.muscle-mis-prod) - -## Features - -Here is the highlights of **Muscle MIS**: - -1. Inherited from the most modern and newest Spring frameworks: - - `org.springframework.boot:spring-boot-starter-parent` - [![Spring Boot](https://maven-badges.herokuapp.com/maven-central/org.springframework.boot/spring-boot-starter-parent/badge.svg)](https://maven-badges.herokuapp.com/maven-central/org.springframework.boot/spring-boot-starter-parent/) - `org.springframework.cloud:spring-cloud-dependencies` - [![Spring Cloud](https://maven-badges.herokuapp.com/maven-central/org.springframework.cloud/spring-cloud-dependencies/badge.svg)](https://maven-badges.herokuapp.com/maven-central/org.springframework.cloud/spring-cloud-dependencies/) - -2. Manage muscle information. - -## Usage - -1. Clone or download this project. - - ```shell - $ git clone https://github.com/johnnymillergh/exrx-net-crawler-server.git - ``` - -2. Build with newest Intellij IDEA. - -3. Click the green triangle to Run. - -## Maintainers - -[@johnnymillergh](https://github.com/johnnymillergh). - -## Contributing - -Feel free to dive in! [Open an issue](https://github.com/johnnymillergh/spring-cloud-tutorial/issues/new). - -### Contributors - -This project exists thanks to all the people who contribute. - -- Johnny Miller [[@johnnymillergh](https://github.com/johnnymillergh)] -- … - - -### Sponsors - -Support this project by becoming a sponsor. Your logo will show up here with a link to your website. [[Become a sponsor](https://become-a-sponsor.org)] - -## License - -[Apache License](https://github.com/johnnymillergh/exrx-net-crawler-server/blob/master/LICENSE) © Johnny Miller - -2020 - Present - - diff --git a/muscle-mis/pom.xml b/muscle-mis/pom.xml deleted file mode 100644 index 9304fb20..00000000 --- a/muscle-mis/pom.xml +++ /dev/null @@ -1,125 +0,0 @@ - - - 4.0.0 - - - muscle-mis - Muscle and Fitness Server :: Muscle MIS - Muscle Management Information Service. - - com.jmsoftware.maf - muscle-and-fitness-server - 0.0.1 - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - - com.google.cloud.tools - jib-maven-plugin - 2.2.0 - - - - buildDockerImagePhase - verify - - dockerBuild - - - - - buildAndPushDockerImagePhase - install - - build - - - - - - - openjdk:11.0.9.1-jre-slim - - - docker.io/ijohnnymiller/${project.parent.artifactId}.${project.artifactId} - - ${project.version} - - - - - /${project.artifactId} - - -Dfile.encoding=${project.build.sourceEncoding} - - - ${muscle-mis.port} - - USE_CURRENT_TIMESTAMP - - - - - - - - - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.cloud - spring-cloud-starter-netflix-eureka-client - - - de.codecentric - spring-boot-admin-starter-client - ${spring-boot-admin.version} - - - org.springframework.cloud - spring-cloud-starter-zipkin - - - org.springframework.integration - spring-integration-sftp - - - - com.jmsoftware.maf - common - - - com.jmsoftware.maf - muscle-and-fitness-server-spring-boot-starter - - - - - com.baomidou - mybatis-plus-boot-starter - 3.3.1 - - - mysql - mysql-connector-java - runtime - - - com.alibaba - druid - 1.1.22 - - - diff --git a/muscle-mis/src/main/java/com/jmsoftware/maf/musclemis/MuscleMisApplication.java b/muscle-mis/src/main/java/com/jmsoftware/maf/musclemis/MuscleMisApplication.java deleted file mode 100644 index a367b0ae..00000000 --- a/muscle-mis/src/main/java/com/jmsoftware/maf/musclemis/MuscleMisApplication.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.jmsoftware.maf.musclemis; - -import com.jmsoftware.maf.muscleandfitnessserverspringbootstarter.helper.IpHelper; -import com.jmsoftware.maf.musclemis.universal.configuration.ProjectProperty; -import lombok.extern.slf4j.Slf4j; -import lombok.val; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cloud.client.discovery.EnableDiscoveryClient; -import org.springframework.cloud.openfeign.EnableFeignClients; - -import java.time.Duration; -import java.time.Instant; -import java.util.TimeZone; - -/** - *

MuscleMisApplication

- *

- * Change description here. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2/17/20 8:41 PM - **/ -@Slf4j -@EnableFeignClients -@EnableDiscoveryClient -@SpringBootApplication -public class MuscleMisApplication { - private static final String LINE_SEPARATOR = System.lineSeparator(); - private static ProjectProperty projectProperty; - private static IpHelper ipHelper; - - public MuscleMisApplication(ProjectProperty projectProperty, IpHelper ipHelper) { - MuscleMisApplication.projectProperty = projectProperty; - MuscleMisApplication.ipHelper = ipHelper; - } - - public static void main(String[] args) { - val startInstant = Instant.now(); - SpringApplication.run(MuscleMisApplication.class, args); - val endInstant = Instant.now(); - val duration = Duration.between(startInstant, endInstant); - log.info("🥳 Congratulations! 🎉"); - log.info("🖥 {}@{} started!", projectProperty.getProjectArtifactId(), projectProperty.getVersion()); - log.info("⚙️ Environment: {}", projectProperty.getEnvironment()); - log.info("⏳ Deployment duration: {} seconds ({} ms)", duration.getSeconds(), duration.toMillis()); - log.info("⏰ App started at {} (timezone - {})", endInstant, TimeZone.getDefault().getDisplayName()); - log.info("{} App running at{} - Local: http://localhost:{}{}/{} - Network: {}/{}", - LINE_SEPARATOR, LINE_SEPARATOR, ipHelper.getServerPort(), projectProperty.getContextPath(), - LINE_SEPARATOR, ipHelper.getPublicIp(), projectProperty.getContextPath()); - } -} diff --git a/muscle-mis/src/main/java/com/jmsoftware/maf/musclemis/universal/configuration/DruidConfiguration.java b/muscle-mis/src/main/java/com/jmsoftware/maf/musclemis/universal/configuration/DruidConfiguration.java deleted file mode 100644 index 15dcd4ae..00000000 --- a/muscle-mis/src/main/java/com/jmsoftware/maf/musclemis/universal/configuration/DruidConfiguration.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.jmsoftware.maf.musclemis.universal.configuration; - -import com.alibaba.druid.pool.DruidDataSource; -import com.alibaba.druid.support.http.StatViewServlet; -import com.alibaba.druid.support.http.WebStatFilter; -import lombok.RequiredArgsConstructor; -import lombok.val; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.boot.web.servlet.FilterRegistrationBean; -import org.springframework.boot.web.servlet.ServletRegistrationBean; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import javax.sql.DataSource; - -/** - *

DruidConfiguration

- *

- * Druid Configuration - * Click me to view Druid Monitor - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2019-03-24 13:31 - **/ -@Configuration -@RequiredArgsConstructor -public class DruidConfiguration { - @Bean - public ServletRegistrationBean druidServlet() { - val servletRegistrationBean = new ServletRegistrationBean<>(new StatViewServlet(), "/druid/*"); - servletRegistrationBean.addInitParameter("loginUsername", "admin"); - servletRegistrationBean.addInitParameter("loginPassword", "admin"); - servletRegistrationBean.addInitParameter("resetEnable", "false"); - return servletRegistrationBean; - } - - @Bean - public FilterRegistrationBean filterRegistrationBean() { - val filterRegistrationBean = new FilterRegistrationBean(); - filterRegistrationBean.setFilter(new WebStatFilter()); - filterRegistrationBean.addUrlPatterns("/*"); - // Ignored resources - filterRegistrationBean.addInitParameter("exclusions", - "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"); - filterRegistrationBean.addInitParameter("profileEnable", "true"); - filterRegistrationBean.addInitParameter("principalCookieName", "USER_COOKIE"); - filterRegistrationBean.addInitParameter("principalSessionName", "USER_SESSION"); - return filterRegistrationBean; - } - - @Bean - @ConfigurationProperties(prefix = "spring.datasource") - public DataSource druidDataSource() { - return new DruidDataSource(); - } -} diff --git a/muscle-mis/src/main/java/com/jmsoftware/maf/musclemis/universal/configuration/MyBatisPlusConfiguration.java b/muscle-mis/src/main/java/com/jmsoftware/maf/musclemis/universal/configuration/MyBatisPlusConfiguration.java deleted file mode 100644 index 67b7b6f7..00000000 --- a/muscle-mis/src/main/java/com/jmsoftware/maf/musclemis/universal/configuration/MyBatisPlusConfiguration.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.jmsoftware.maf.musclemis.universal.configuration; - -import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor; -import com.baomidou.mybatisplus.extension.plugins.pagination.optimize.JsqlParserCountOptimize; -import lombok.val; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.transaction.annotation.EnableTransactionManagement; - -/** - *

MyBatisPlusConfiguration

- *

- * Change description here. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2019-05-02 11:57 - **/ -@Configuration -@EnableTransactionManagement -public class MyBatisPlusConfiguration { - /** - * Inject bean to enable pagination. - * - * @return bean for pagination - */ - @Bean - public PaginationInterceptor paginationInterceptor() { - val paginationInterceptor = new PaginationInterceptor(); - // Set maximum query record count - paginationInterceptor.setLimit(100L); - // Enable JSQL Parser Count Optimizing (for left join) - paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true)); - return paginationInterceptor; - } -} diff --git a/muscle-mis/src/main/java/com/jmsoftware/maf/musclemis/universal/configuration/ProjectProperty.java b/muscle-mis/src/main/java/com/jmsoftware/maf/musclemis/universal/configuration/ProjectProperty.java deleted file mode 100644 index ba5e0751..00000000 --- a/muscle-mis/src/main/java/com/jmsoftware/maf/musclemis/universal/configuration/ProjectProperty.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.jmsoftware.maf.musclemis.universal.configuration; - -import lombok.Data; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.stereotype.Component; - -/** - *

ProjectProperty

- *

- * Change description here. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2019-04-18 13:01 - **/ -@Data -@Component -@ConfigurationProperties(prefix = "project.property") -public class ProjectProperty { - private String basePackage; - private String contextPath; - private String groupId; - private String projectParentArtifactId; - private String projectArtifactId; - private String version; - private String description; - private String jdkVersion; - private String environment; - private String url; - private String inceptionYear; - private String organizationName; - private String organizationUrl; - private String issueManagementSystem; - private String issueManagementUrl; - private String developerName; - private String developerEmail; - private String developerUrl; -} diff --git a/muscle-mis/src/main/java/com/jmsoftware/maf/musclemis/universal/configuration/Swagger2Configuration.java b/muscle-mis/src/main/java/com/jmsoftware/maf/musclemis/universal/configuration/Swagger2Configuration.java deleted file mode 100644 index 44f93fdb..00000000 --- a/muscle-mis/src/main/java/com/jmsoftware/maf/musclemis/universal/configuration/Swagger2Configuration.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.jmsoftware.maf.musclemis.universal.configuration; - -import lombok.RequiredArgsConstructor; -import lombok.val; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import springfox.documentation.builders.ApiInfoBuilder; -import springfox.documentation.builders.PathSelectors; -import springfox.documentation.builders.RequestHandlerSelectors; -import springfox.documentation.service.ApiInfo; -import springfox.documentation.service.Contact; -import springfox.documentation.spi.DocumentationType; -import springfox.documentation.spring.web.plugins.Docket; -import springfox.documentation.swagger2.annotations.EnableSwagger2; - -/** - *

Swagger2Configuration

- *

- * Swagger 2 Configuration - * Click me to view - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2019-02-07 16:15 - **/ -@Configuration -@EnableSwagger2 -@RequiredArgsConstructor -public class Swagger2Configuration { - private final ProjectProperty projectProperty; - private static final String LINE_SEPARATOR = System.lineSeparator(); - - @Bean - public Docket createRestApi() { - return new Docket(DocumentationType.SWAGGER_2) - .apiInfo(apiInfo()) - .select() - .apis(RequestHandlerSelectors.basePackage(projectProperty.getBasePackage())) - .paths(PathSelectors.any()) - .build(); - } - - private ApiInfo apiInfo() { - val projectArtifactId = projectProperty.getProjectArtifactId(); - val version = projectProperty.getVersion(); - val developerEmail = projectProperty.getDeveloperEmail(); - val developerUrl = projectProperty.getDeveloperUrl(); - return new ApiInfoBuilder() - .title(String.format("API for %s@%s", projectArtifactId, version)) - .description(String.format("%s %sArtifact ID: %s%sEnvironment: %s", - projectProperty.getDescription(), - LINE_SEPARATOR, - projectArtifactId, - LINE_SEPARATOR, - projectProperty.getEnvironment())) - .contact(new Contact(String.format("%s, email: %s%sHome page: %s", - projectProperty.getDeveloperName(), - developerEmail, - LINE_SEPARATOR, - developerUrl), - developerUrl, developerEmail)) - .version(version) - .build(); - } -} diff --git a/muscle-mis/src/main/java/com/jmsoftware/maf/musclemis/universal/controller/CommonController.java b/muscle-mis/src/main/java/com/jmsoftware/maf/musclemis/universal/controller/CommonController.java deleted file mode 100644 index d90bab6a..00000000 --- a/muscle-mis/src/main/java/com/jmsoftware/maf/musclemis/universal/controller/CommonController.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.jmsoftware.maf.musclemis.universal.controller; - -import com.jmsoftware.maf.common.bean.ResponseBodyBean; -import com.jmsoftware.maf.musclemis.universal.domain.ValidationTestPayload; -import com.jmsoftware.maf.musclemis.universal.service.CommonService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; -import lombok.val; -import org.springframework.web.bind.annotation.*; - -import java.util.Map; - -/** - *

CommonController

- *

- * Change description here. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2/4/20 10:29 AM - **/ -@RestController -@RequiredArgsConstructor -@RequestMapping("/common") -@Api(tags = {"Common Controller"}) -public class CommonController { - private final CommonService commonService; - - @GetMapping("/app-info") - @ApiOperation(value = "/app-info", notes = "Retrieve application information") - public ResponseBodyBean> applicationInformation() { - val data = commonService.getApplicationInfo(); - return ResponseBodyBean.ofSuccess(data, "Succeed to retrieve app info."); - } - - @PostMapping("/validation-test") - @ApiOperation(value = "/validation-test", notes = "Validation of request payload test") - public ResponseBodyBean validationTest(@RequestBody ValidationTestPayload payload) { - commonService.validateObject(payload); - return ResponseBodyBean.ofSuccess(payload.getName(), "validationTest()"); - } -} diff --git a/muscle-mis/src/main/java/com/jmsoftware/maf/musclemis/universal/controller/ErrorController.java b/muscle-mis/src/main/java/com/jmsoftware/maf/musclemis/universal/controller/ErrorController.java deleted file mode 100644 index f295d118..00000000 --- a/muscle-mis/src/main/java/com/jmsoftware/maf/musclemis/universal/controller/ErrorController.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.jmsoftware.maf.musclemis.universal.controller; - -import io.swagger.annotations.Api; -import lombok.extern.slf4j.Slf4j; -import lombok.val; -import org.springframework.boot.autoconfigure.web.ServerProperties; -import org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController; -import org.springframework.boot.autoconfigure.web.servlet.error.ErrorViewResolver; -import org.springframework.boot.web.servlet.error.ErrorAttributes; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.RestController; - -import javax.servlet.http.HttpServletRequest; -import java.util.List; -import java.util.Map; -import java.util.Optional; - -/** - *

ErrorController

- *

- * Error controller. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2019-03-02 16:56 - **/ -@Slf4j -@RestController -@Api(tags = {"Error Controller"}) -public class ErrorController extends BasicErrorController { - public ErrorController(ErrorAttributes errorAttributes, - ServerProperties serverProperties, - List errorViewResolvers) { - super(errorAttributes, serverProperties.getError(), errorViewResolvers); - } - - @Override - public ResponseEntity> error(HttpServletRequest request) { - val httpStatus = getStatus(request); - val body = getErrorAttributes(request, isIncludeStackTrace(request, MediaType.ALL)); - body.put("message", httpStatus.getReasonPhrase()); - val optionalTrace = Optional.ofNullable(body.get("trace")); - optionalTrace.ifPresent(trace -> { - val message = body.get("message"); - val firstLineOfTrace = trace.toString().split("\\n")[0]; - val joinedMessage = String.format("%s %s", message, firstLineOfTrace); - body.put("message", joinedMessage); - body.put("trace", "Trace has been simplified. Refer to 'message'"); - }); - log.error("Captured HTTP request error. Response body = {}", body); - return new ResponseEntity<>(body, httpStatus); - } -} diff --git a/muscle-mis/src/main/java/com/jmsoftware/maf/musclemis/universal/domain/ValidationTestPayload.java b/muscle-mis/src/main/java/com/jmsoftware/maf/musclemis/universal/domain/ValidationTestPayload.java deleted file mode 100644 index 2e7e8776..00000000 --- a/muscle-mis/src/main/java/com/jmsoftware/maf/musclemis/universal/domain/ValidationTestPayload.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.jmsoftware.maf.musclemis.universal.domain; - -import lombok.Data; - -import javax.validation.constraints.Min; -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; - -/** - *

ValidationTestPayload

- *

- * Change description here. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2/14/20 11:34 AM - **/ -@Data -public class ValidationTestPayload { - @NotNull - @Min(value = 1L) - private Long id; - @NotEmpty - private String name; -} diff --git a/muscle-mis/src/main/java/com/jmsoftware/maf/musclemis/universal/service/CommonService.java b/muscle-mis/src/main/java/com/jmsoftware/maf/musclemis/universal/service/CommonService.java deleted file mode 100644 index 31ad9111..00000000 --- a/muscle-mis/src/main/java/com/jmsoftware/maf/musclemis/universal/service/CommonService.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.jmsoftware.maf.musclemis.universal.service; - -import com.jmsoftware.maf.musclemis.universal.domain.ValidationTestPayload; -import org.springframework.validation.annotation.Validated; - -import javax.validation.Valid; -import java.util.Map; - -/** - *

CommonService

- *

- * Change description here. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2/4/20 11:15 AM - */ -@Validated -public interface CommonService { - /** - * Gets application info. - * - * @return the application info. - */ - Map getApplicationInfo(); - - /** - * Validate object. - * - * @param payload the payload - */ - void validateObject(@Valid ValidationTestPayload payload); -} diff --git a/muscle-mis/src/main/java/com/jmsoftware/maf/musclemis/universal/service/impl/CommonServiceImpl.java b/muscle-mis/src/main/java/com/jmsoftware/maf/musclemis/universal/service/impl/CommonServiceImpl.java deleted file mode 100644 index f0aa0120..00000000 --- a/muscle-mis/src/main/java/com/jmsoftware/maf/musclemis/universal/service/impl/CommonServiceImpl.java +++ /dev/null @@ -1,122 +0,0 @@ -package com.jmsoftware.maf.musclemis.universal.service.impl; - -import com.jmsoftware.maf.musclemis.universal.configuration.ProjectProperty; -import com.jmsoftware.maf.musclemis.universal.domain.ValidationTestPayload; -import com.jmsoftware.maf.musclemis.universal.service.CommonService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import javax.validation.Valid; -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - *

CommonServiceImpl

- *

- * Change description here. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2/4/20 11:16 AM - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class CommonServiceImpl implements CommonService { - private final ProjectProperty projectProperty; - - @Override - public Map getApplicationInfo() { - var map = new HashMap(16); - var fieldsInfo = getFieldsInfo(projectProperty); - fieldsInfo.forEach(fieldInfo -> { - var type = fieldInfo.get("type"); - if ("class java.lang.String".equals(type)) { - map.put((String) fieldInfo.get("name"), fieldInfo.get("value")); - } - }); - return map; - } - - @Override - public void validateObject(@Valid ValidationTestPayload payload) { - log.info("Validation passed! {}", payload); - } - - /** - * Gets field value by name. - * - * @param fieldName the field name - * @param object the object - * @return the field value by name - * @see Java 中遍历一个对象的所有属性 - */ - private Object getFieldValueByName(String fieldName, Object object) { - try { - String firstLetter = fieldName.substring(0, 1).toUpperCase(); - String getter = "get" + firstLetter + fieldName.substring(1); - Method method = object.getClass().getMethod(getter); - return method.invoke(object); - } catch (Exception e) { - log.error("Can't get field's value by name! Cause: {}", e.getMessage()); - return null; - } - } - - /** - * Get filed name string [ ]. - * - * @param o the o - * @return the string [ ] - * @see Java 中遍历一个对象的所有属性 - */ - private String[] getFiledName(Object o) { - Field[] fields = o.getClass().getDeclaredFields(); - String[] fieldNames = new String[fields.length]; - for (int i = 0; i < fields.length; i++) { - log.info("fields[i].getType(): {}", fields[i].getType()); - fieldNames[i] = fields[i].getName(); - } - return fieldNames; - } - - /** - * Get Fields Info - * - * @param o the o - * @return the fields info - * @see Java 中遍历一个对象的所有属性 - */ - private List> getFieldsInfo(Object o) { - Field[] fields = o.getClass().getDeclaredFields(); - var arrayList = new ArrayList>(); - for (Field field : fields) { - var infoMap = new HashMap(16); - infoMap.put("type", field.getType().toString()); - infoMap.put("name", field.getName()); - infoMap.put("value", getFieldValueByName(field.getName(), o)); - arrayList.add(infoMap); - } - return arrayList; - } - - /** - * Get Filed Values - * - * @param o the o - * @return the object [ ] - * @see Java 中遍历一个对象的所有属性 - */ - public Object[] getFiledValues(Object o) { - String[] fieldNames = this.getFiledName(o); - Object[] value = new Object[fieldNames.length]; - for (int i = 0; i < fieldNames.length; i++) { - value[i] = this.getFieldValueByName(fieldNames[i], o); - } - return value; - } -} diff --git a/muscle-mis/src/main/resources/application-development-docker.yml b/muscle-mis/src/main/resources/application-development-docker.yml deleted file mode 100644 index 65f9b605..00000000 --- a/muscle-mis/src/main/resources/application-development-docker.yml +++ /dev/null @@ -1,20 +0,0 @@ -eureka: - client: - serviceUrl: - defaultZone: http://maf.service-registry.dev:8760/eureka/ - -spring: - zipkin: - base-url: http://maf.open-zipkin.dev:9411 - datasource: - name: muscle_and_fitness - driver-class-name: com.mysql.cj.jdbc.Driver - type: com.alibaba.druid.pool.DruidDataSource - url: jdbc:mysql://maf.mysql.dev:3306/muscle_and_fitness?useSSL=true&useUnicode=true - username: root - password: jm@mysql - -logging: - # Configure logging level for SFTP/JSCH - level: - com.jcraft.jsch: INFO diff --git a/muscle-mis/src/main/resources/application-development-local.yml b/muscle-mis/src/main/resources/application-development-local.yml deleted file mode 100644 index 5c2d67b4..00000000 --- a/muscle-mis/src/main/resources/application-development-local.yml +++ /dev/null @@ -1,23 +0,0 @@ -eureka: - client: - serviceUrl: - defaultZone: http://localhost:8760/eureka/ - -spring: - zipkin: - base-url: http://localhost:9411 - datasource: - name: muscle_and_fitness - driver-class-name: com.mysql.cj.jdbc.Driver - type: com.alibaba.druid.pool.DruidDataSource - url: jdbc:mysql://localhost:3306/muscle_and_fitness?useSSL=true&useUnicode=true - username: root - password: jm@mysql - devtools: - restart: - enabled: true - -logging: - # Configure logging level for SFTP/JSCH - level: - com.jcraft.jsch: INFO diff --git a/muscle-mis/src/main/resources/application-production.yml b/muscle-mis/src/main/resources/application-production.yml deleted file mode 100644 index 4c566437..00000000 --- a/muscle-mis/src/main/resources/application-production.yml +++ /dev/null @@ -1,20 +0,0 @@ -eureka: - client: - serviceUrl: - defaultZone: http://172.16.4.20:8760/eureka/ - -spring: - zipkin: - base-url: http://172.16.4.13:9411 - datasource: - name: muscle_and_fitness - driver-class-name: com.mysql.cj.jdbc.Driver - type: com.alibaba.druid.pool.DruidDataSource - url: jdbc:mysql://172.16.4.10:3306/muscle_and_fitness?useSSL=true&useUnicode=true - username: root - password: jm@mysql - -logging: - # Configure logging level for SFTP/JSCH - level: - com.jcraft.jsch: INFO diff --git a/muscle-mis/src/main/resources/application-stage.yml b/muscle-mis/src/main/resources/application-stage.yml deleted file mode 100644 index 30f315e8..00000000 --- a/muscle-mis/src/main/resources/application-stage.yml +++ /dev/null @@ -1,20 +0,0 @@ -eureka: - client: - serviceUrl: - defaultZone: http://172.16.3.20:8760/eureka/ - -spring: - zipkin: - base-url: http://172.16.3.13:9411 - datasource: - name: muscle_and_fitness - driver-class-name: com.mysql.cj.jdbc.Driver - type: com.alibaba.druid.pool.DruidDataSource - url: jdbc:mysql://172.16.3.10:3306/muscle_and_fitness?useSSL=true&useUnicode=true - username: root - password: jm@mysql - -logging: - # Configure logging level for SFTP/JSCH - level: - com.jcraft.jsch: INFO diff --git a/muscle-mis/src/main/resources/application-test.yml b/muscle-mis/src/main/resources/application-test.yml deleted file mode 100644 index c8e5dec9..00000000 --- a/muscle-mis/src/main/resources/application-test.yml +++ /dev/null @@ -1,20 +0,0 @@ -eureka: - client: - serviceUrl: - defaultZone: http://172.16.2.20:8760/eureka/ - -spring: - zipkin: - base-url: http://172.16.2.13:9411 - datasource: - name: muscle_and_fitness - driver-class-name: com.mysql.cj.jdbc.Driver - type: com.alibaba.druid.pool.DruidDataSource - url: jdbc:mysql://172.16.2.10:3306/muscle_and_fitness?useSSL=true&useUnicode=true - username: root - password: jm@mysql - -logging: - # Configure logging level for SFTP/JSCH - level: - com.jcraft.jsch: INFO diff --git a/muscle-mis/src/main/resources/application.yml b/muscle-mis/src/main/resources/application.yml deleted file mode 100644 index 75149d97..00000000 --- a/muscle-mis/src/main/resources/application.yml +++ /dev/null @@ -1,89 +0,0 @@ -server: - port: @muscle-mis.port@ - tomcat: - uri-encoding: @project.build.sourceEncoding@ - -spring: - application: - name: @project.artifactId@ - profiles: - active: @env@ - mvc: - throw-exception-if-no-handler-found: true - jackson: - date-format: yyyy-MM-dd HH:mm:ss - time-zone: Asia/Hong_Kong - sleuth: - sampler: - probability: 1.0 - -eureka: - instance: - leaseRenewalIntervalInSeconds: 10 - health-check-url-path: /actuator/health - status-page-url-path: / - metadata-map: - # needed to trigger info and endpoint update after restart - startup: ${random.int} - instance-id: ${spring.cloud.client.ip-address}:${server.port}@${spring.cloud.client.hostname}@${spring.application.name}-${random.int} - prefer-ip-address: true - client: - registryFetchIntervalSeconds: 5 - -feign: - client: - config: - default: - connectTimeout: 5000 - readTimeout: 10000 - loggerLevel: full - compression: - request: - enabled: true - response: - enabled: true - useGzipDecoder: true - -management: - endpoints: - web: - exposure: - include: "*" - endpoint: - health: - show-details: ALWAYS - -mybatis-plus: - configuration: - map-underscore-to-camel-case: true - log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl - # mapper-locations should start with `classpath*` prefix - # when project is based on Maven multi-module to load XML mapper in different jar - mapper-locations: classpath*:/mapper/**/*Mapper.xml - -logging: - config: classpath:configuration/logback/logback-@env@.xml - # Configure logging level of project as DEBUG to enable SQL logging and other logging. - level: - com.jmsoftware: DEBUG - -project: - property: - base-package: com.jmsoftware.maf.musclemis - context-path: - group-id: @project.groupId@ - project-parent-artifact-id: @project.parent.artifactId@ - project-artifact-id: @project.artifactId@ - version: @project.version@ - description: @project.description@ - jdk-version: @java.version@ - environment: @env@ - url: @project.url@ - inception-year: @inceptionYear@ - organization-name: @project.organization.name@ - organization-url: @project.organization.url@ - issue-management-system: @project.issueManagement.system@ - issue-management-url: @project.issueManagement.url@ - developer-name: @developerName@ - developer-email: @developerEmail@ - developer-url: @developerUrl@ diff --git a/muscle-mis/src/main/resources/banner.txt b/muscle-mis/src/main/resources/banner.txt deleted file mode 100644 index d74e7be8..00000000 --- a/muscle-mis/src/main/resources/banner.txt +++ /dev/null @@ -1,26 +0,0 @@ -${AnsiStyle.BOLD}${AnsiColor.BRIGHT_GREEN} - __ ___ __ __ ____________ - / |/ /_ ____________/ /__ / |/ / _/ ___/ - / /|_/ / / / / ___/ ___/ / _ \ / /|_/ // / \__ \ - / / / / /_/ (__ ) /__/ / __/ / / / // / ___/ / -/_/ /_/\__,_/____/\___/_/\___/ /_/ /_/___//____/ -${AnsiStyle.BOLD}Muscle MIS :: Powered by Spring Boot ::${spring-boot.formatted-version} -${AnsiColor.CYAN}Author: Johnny Miller (鍾俊), email: johnnysviva@outlook.com -${AnsiStyle.NORMAL}${AnsiColor.MAGENTA}http://patorjk.com/software/taag/#p=display&f=Slant&t=Muscle%20MIS -${AnsiColor.BRIGHT_BLACK} --------------------------------------------Font Info------------------------------------------- -Slant by Glenn Chappell 3/93 -- based on Standard -Includes ISO Latin-1 -figlet release 2.1 -- 12 Aug 1994 -Permission is hereby given to modify this font, as long as the -modifier's name is placed on a comment line. - -Modified by Paul Burton 12/96 to include new parameter -supported by FIGlet and FIGWin. May also be slightly modified for better use -of new full-width/kern/smush alternatives, but default output is NOT changed. - -------------------------------------------Banner Info------------------------------------------ -Banner generated by Text ASCII Art Generator. -A web app that lets you type in large ASCII Art text lettering. -This can create art you can put in your email signature, on your webpage, etc etc. -More at http://patorjk.com/software/taag/ diff --git a/muscle-mis/src/main/resources/configuration/.empty b/muscle-mis/src/main/resources/configuration/.empty deleted file mode 100644 index e69de29b..00000000 diff --git a/muscle-mis/src/main/resources/configuration/logback/logback-base.xml b/muscle-mis/src/main/resources/configuration/logback/logback-base.xml deleted file mode 100644 index ac8f735d..00000000 --- a/muscle-mis/src/main/resources/configuration/logback/logback-base.xml +++ /dev/null @@ -1,70 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ${CONSOLE_LOG_PATTERN} - UTF-8 - - - - - - - ALL - ACCEPT - ACCEPT - - - - ${FILE_LOG_PATTERN} - UTF-8 - - - - - - - ${LOG_HOME}/${PROJECT_ARTIFACT_Id}${LOG_FILE_SUFFIX}.%d{yyyy-MM-dd}.%i.log.gz - - 5MB - 7 - 1GB - - - diff --git a/muscle-mis/src/main/resources/configuration/logback/logback-development-docker.xml b/muscle-mis/src/main/resources/configuration/logback/logback-development-docker.xml deleted file mode 100644 index f38e6c2d..00000000 --- a/muscle-mis/src/main/resources/configuration/logback/logback-development-docker.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/muscle-mis/src/main/resources/configuration/logback/logback-development-local.xml b/muscle-mis/src/main/resources/configuration/logback/logback-development-local.xml deleted file mode 100644 index f38e6c2d..00000000 --- a/muscle-mis/src/main/resources/configuration/logback/logback-development-local.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/muscle-mis/src/main/resources/configuration/logback/logback-production.xml b/muscle-mis/src/main/resources/configuration/logback/logback-production.xml deleted file mode 100644 index f38e6c2d..00000000 --- a/muscle-mis/src/main/resources/configuration/logback/logback-production.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/muscle-mis/src/main/resources/configuration/logback/logback-stage.xml b/muscle-mis/src/main/resources/configuration/logback/logback-stage.xml deleted file mode 100644 index f38e6c2d..00000000 --- a/muscle-mis/src/main/resources/configuration/logback/logback-stage.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/muscle-mis/src/main/resources/configuration/logback/logback-test.xml b/muscle-mis/src/main/resources/configuration/logback/logback-test.xml deleted file mode 100644 index f1916a0f..00000000 --- a/muscle-mis/src/main/resources/configuration/logback/logback-test.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/muscle-mis/src/main/resources/static/home.html b/muscle-mis/src/main/resources/static/home.html deleted file mode 100644 index e7599316..00000000 --- a/muscle-mis/src/main/resources/static/home.html +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - UNSET - - - - -

-
- Hello, World! - - Welcome to {{ projectArtifactId }}@{{ version }}! - - - - {{ applicationName }} - -
-
- Create New Person -
- - -
-
- - -
-
- - -
-
- - -
-
- - - - - - - - - - - - - - - - - -
NameAgeSexDelete
{{ person.name }}{{ person.age }}{{ person.sex }} - -
- This page is provided by - keepfool. - -
- - - - diff --git a/muscle-mis/src/main/resources/static/icon/favicon.ico b/muscle-mis/src/main/resources/static/icon/favicon.ico deleted file mode 100644 index 0798d38f..00000000 Binary files a/muscle-mis/src/main/resources/static/icon/favicon.ico and /dev/null differ diff --git a/muscle-mis/src/main/resources/static/image/muscle-and-fitness-server-social-image.png b/muscle-mis/src/main/resources/static/image/muscle-and-fitness-server-social-image.png deleted file mode 100644 index 83786ad8..00000000 Binary files a/muscle-mis/src/main/resources/static/image/muscle-and-fitness-server-social-image.png and /dev/null differ diff --git a/muscle-mis/src/main/resources/static/script/404.js b/muscle-mis/src/main/resources/static/script/404.js deleted file mode 100644 index 5401ce54..00000000 --- a/muscle-mis/src/main/resources/static/script/404.js +++ /dev/null @@ -1,12 +0,0 @@ -// noinspection JSUnusedGlobalSymbols -const vm = new Vue({ - el: '#app', - data: {}, - methods: { - handleClickGoToHome: function () { - const currentUrl = window.location.href; - const split = currentUrl.split('/'); - window.location.href = `${split[0]}//${split[2]}/${split[3]}`; - } - } -}); diff --git a/muscle-mis/src/main/resources/static/script/home.js b/muscle-mis/src/main/resources/static/script/home.js deleted file mode 100644 index a191d8c5..00000000 --- a/muscle-mis/src/main/resources/static/script/home.js +++ /dev/null @@ -1,72 +0,0 @@ -// noinspection JSUnusedGlobalSymbols -const vm = new Vue({ - el: '#app', - data: { - projectArtifactId: null, - version: null, - applicationName: null, - newPerson: { - name: '', - age: 0, - sex: 'Male' - }, - people: [{ - name: 'Jack', - age: 30, - sex: 'Male' - }, { - name: 'Bill', - age: 26, - sex: 'Male' - }, { - name: 'Tracy', - age: 22, - sex: 'Female' - }, { - name: 'Chris', - age: 36, - sex: 'Male' - }] - }, - methods: { - /** - * Create a person - */ - createPerson: function () { - this.people.push(this.newPerson); - this.newPerson = {name: '', age: 0, sex: 'Male'} - - }, - /** - * delete a person - * @param index - */ - deletePerson: function (index) { - this.people.splice(index, 1); - }, - handleClickSwaggerApiDocumentation: function () { - const currentUrl = window.location.href; - const split = currentUrl.split('/'); - window.location.href = `${split[0]}//${split[2]}/doc`; - }, - handleClickVideoDemo: function () { - const currentUrl = window.location.href; - const split = currentUrl.split('/'); - window.location.href = `${split[0]}//${split[2]}/${split[3]}/video.html`; - }, - getAppInfo: async function () { - const currentUrl = window.location.href; - const split = currentUrl.split('/'); - const baseUrl = `${split[0]}//${split[2]}`; - const response = await fetch(`${baseUrl}/common/app-info`); - const responseJson = await response.json(); - this.projectArtifactId = responseJson.data.projectArtifactId; - this.version = responseJson.data.version; - this.applicationName = this.projectArtifactId.toUpperCase(); - window.document.title = this.applicationName; - } - }, - mounted: async function () { - this.getAppInfo(); - } -}); diff --git a/muscle-mis/src/main/resources/static/script/video.js b/muscle-mis/src/main/resources/static/script/video.js deleted file mode 100644 index 3a155900..00000000 --- a/muscle-mis/src/main/resources/static/script/video.js +++ /dev/null @@ -1,17 +0,0 @@ -// noinspection JSUnusedGlobalSymbols -const vm = new Vue({ - el: '#app', - data: { - appInfo: null, - videoSource: '' - }, - async mounted() { - const currentUrl = window.location.href; - const split = currentUrl.split('/'); - this.videoSource = `${split[0]}//${split[2]}/${split[3]}/test-table/demo-video`; - const baseUrl = `${split[0]}//${split[2]}`; - const response = await fetch(`${baseUrl}/common/app-info`); - const responseJson = await response.json(); - this.appInfo = responseJson.data; - } -}); diff --git a/muscle-mis/src/main/resources/static/styles/404.css b/muscle-mis/src/main/resources/static/styles/404.css deleted file mode 100644 index 09a4e9bc..00000000 --- a/muscle-mis/src/main/resources/static/styles/404.css +++ /dev/null @@ -1,89 +0,0 @@ -* { - margin: 0; - padding: 0; - box-sizing: border-box -} - -html { - font-size: 12px; - font-family: Ubuntu, simHei, sans-serif; - font-weight: 400 -} - -body { - font-size: 1rem -} - -button { - outline: none; - padding: 5px 8px; - color: #fff; - border: 1px solid #BCBCBC; - border-radius: 3px; - background-color: #009A61; - cursor: pointer; -} - -button:hover { - opacity: 0.8; -} - -#app { - margin: 48px auto 0; - max-width: 640px; - -webkit-perspective: 500px; -} - -.text-center { - text-align: center; -} - -.message-box { - background-color: firebrick; - max-width: 700px; - padding: 20px; - border-radius: 8px; - margin: 48px auto 20px; -} - -.slide-in-bck-center { - animation: slide-in-bck-center 1.2s cubic-bezier(0.250, 0.460, 0.450, 0.940) both; -} - -@keyframes slide-in-bck-center { - 0% { - transform: translateZ(600px); - opacity: 0; - } - 100% { - transform: translateZ(0); - opacity: 1; - } -} - -.message-text { - font-size: xx-large; - text-align: center; - color: ivory; -} - -.social-image { - width: 600px; - border-radius: 8px; -} - -.message-title { - text-align: center; - display: block; - font-size: 48px; - text-shadow: black 2px 2px 6px; -} - -.server-name { - color: gold; -} - -.go-to { - display: inline-block; - margin-bottom: 6px; -} diff --git a/muscle-mis/src/main/resources/static/styles/home.css b/muscle-mis/src/main/resources/static/styles/home.css deleted file mode 100644 index 62ebe0c2..00000000 --- a/muscle-mis/src/main/resources/static/styles/home.css +++ /dev/null @@ -1,222 +0,0 @@ -* { - margin: 0; - padding: 0; - box-sizing: border-box -} - -html { - font-size: 12px; - font-family: Ubuntu, simHei, sans-serif; - font-weight: 400 -} - -body { - font-size: 1rem -} - -table, -td, -th { - border-collapse: collapse; - border-spacing: 0 -} - -table { - width: 100% -} - -td, -th { - border: 1px solid #bcbcbc; - padding: 5px 10px -} - -th { - background: #42b983; - font-size: 1.2rem; - font-weight: 400; - color: #fff; - cursor: pointer -} - -tr:nth-of-type(odd) { - background: #fff -} - -tr:nth-of-type(even) { - background: #eee -} - -fieldset { - border: 1px solid #BCBCBC; - padding: 15px; -} - -input { - outline: none -} - -input[type=text] { - border: 1px solid #ccc; - padding: .5rem .3rem; -} - -input[type=text]:focus { - border-color: #42b983; -} - -button { - outline: none; - padding: 5px 8px; - color: #fff; - border: 1px solid #BCBCBC; - border-radius: 3px; - background-color: #009A61; - cursor: pointer; -} - -button:hover { - opacity: 0.8; -} - -#app { - margin: 0 auto; - max-width: 640px; - -webkit-perspective: 500px; -} - -.form-group { - margin: 10px; -} - -.form-group > label { - display: inline-block; - width: 10rem; - text-align: right; -} - -.form-group > input, -.form-group > select { - display: inline-block; - height: 2.5rem; - line-height: 2.5rem; -} - -.text-center { - text-align: center; -} - -.pagination { - display: inline-block; - padding-left: 0; - margin: 21px 0; - border-radius: 3px; -} - -.pagination > li { - display: inline; -} - -.pagination > li > a { - position: relative; - float: left; - padding: 6px 12px; - line-height: 1.5; - text-decoration: none; - color: #009a61; - background-color: #fff; - border: 1px solid #ddd; - margin-left: -1px; - list-style: none; -} - -.pagination > li > a:hover { - background-color: #eee; -} - -.pagination .active { - color: #fff; - background-color: #009a61; - border-left: none; - border-right: none; -} - -.pagination .active:hover { - background: #009a61; - cursor: default; -} - -.pagination > li:first-child > a .p { - border-bottom-left-radius: 3px; - border-top-left-radius: 3px; -} - -.pagination > li:last-child > a { - border-bottom-right-radius: 3px; - border-top-right-radius: 3px; -} - -.greeting-box { - background-color: firebrick; - max-width: 700px; - padding: 20px; - border-radius: 8px; - margin: 48px auto 20px; -} - -.slide-in-bck-center { - animation: slide-in-bck-center 1.2s cubic-bezier(0.250, 0.460, 0.450, 0.940) both; -} - -@keyframes slide-in-bck-center { - 0% { - transform: translateZ(600px); - opacity: 0; - } - 100% { - transform: translateZ(0); - opacity: 1; - } -} - -.greeting-text { - font-size: xx-large; - text-align: center; - color: ivory; - display: block; -} - -.application-name { - display: inline-block; - font-weight: bold; - width: auto; - font-size: 48px; - color: rgb(7, 156, 58); - position: relative; - left: 60px; - top: 200px; - cursor: default; -} - -.social-image { - width: 600px; - border-radius: 8px; -} - -.greeting-title { - text-align: center; - display: block; - font-size: 48px; - font-weight: bold; - color: ivory; - text-shadow: black 2px 2px 6px; -} - -.server-name { - color: gold; -} - -.go-to { - display: inline-block; - margin-bottom: 6px; -} diff --git a/muscle-mis/src/main/resources/static/styles/video.css b/muscle-mis/src/main/resources/static/styles/video.css deleted file mode 100644 index 341a63f5..00000000 --- a/muscle-mis/src/main/resources/static/styles/video.css +++ /dev/null @@ -1,136 +0,0 @@ -* { - margin: 0; - padding: 0; - box-sizing: border-box -} - -html { - font-size: 12px; - font-family: Ubuntu, simHei, sans-serif; - font-weight: 400 -} - -body { - font-size: 1rem -} - -table, -td, -th { - border-collapse: collapse; - border-spacing: 0 -} - -table { - width: 100% -} - -td, -th { - border: 1px solid #bcbcbc; - padding: 5px 10px -} - -th { - background: #42b983; - font-size: 1.2rem; - font-weight: 400; - color: #fff; - cursor: pointer -} - -tr:nth-of-type(odd) { - background: #fff -} - -tr:nth-of-type(even) { - background: #eee -} - -fieldset { - border: 1px solid #BCBCBC; - padding: 15px; -} - -input { - outline: none -} - -input[type=text] { - border: 1px solid #ccc; - padding: .5rem .3rem; -} - -input[type=text]:focus { - border-color: #42b983; -} - -button { - outline: none; - padding: 5px 8px; - color: #fff; - border: 1px solid #BCBCBC; - border-radius: 3px; - background-color: #009A61; - cursor: pointer; -} - -button:hover { - opacity: 0.8; -} - -#app { - margin: 0 auto; - max-width: 640px; - -webkit-perspective: 500px; -} - -.greeting-box { - background-color: firebrick; - max-width: 700px; - padding: 20px; - border-radius: 8px; - margin: 48px auto 20px; -} - -.slide-in-bck-center { - animation: slide-in-bck-center 1.2s cubic-bezier(0.250, 0.460, 0.450, 0.940) both; -} - -@keyframes slide-in-bck-center { - 0% { - transform: translateZ(600px); - opacity: 0; - } - 100% { - transform: translateZ(0); - opacity: 1; - } -} - -.greeting-text { - font-size: xx-large; - text-align: center; - color: ivory; -} - -.social-image { - width: 600px; - border-radius: 8px; -} - -.greeting-title { - text-align: center; - display: block; - font-size: 48px; - text-shadow: black 2px 2px 6px; -} - -.server-name { - color: gold; -} - -.go-to { - display: inline-block; - margin-bottom: 6px; -} diff --git a/muscle-mis/src/main/resources/static/video.html b/muscle-mis/src/main/resources/static/video.html deleted file mode 100644 index 9a186caa..00000000 --- a/muscle-mis/src/main/resources/static/video.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - ExRx.net Crawler Server - - - - -
-
- - Hello, World! - Welcome to {{ appInfo.projectArtifactId }}@{{ appInfo.version }}! - - -
-
- - - - diff --git a/muscle-mis/src/test/java/com/jmsoftware/maf/musclemis/MuscleMisApplicationTests.java b/muscle-mis/src/test/java/com/jmsoftware/maf/musclemis/MuscleMisApplicationTests.java deleted file mode 100644 index e0ca5581..00000000 --- a/muscle-mis/src/test/java/com/jmsoftware/maf/musclemis/MuscleMisApplicationTests.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.jmsoftware.maf.musclemis; - -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -class MuscleMisApplicationTests { - - @Test - void contextLoads() { - } - -} diff --git a/api-portal/README.md b/oss-center/README.md similarity index 85% rename from api-portal/README.md rename to oss-center/README.md index b7660809..168703ba 100644 --- a/api-portal/README.md +++ b/oss-center/README.md @@ -9,19 +9,17 @@ [![GitHub repo size](https://img.shields.io/github/repo-size/johnnymillergh/muscle-and-fitness-server.svg)](https://github.com/johnnymillergh/muscle-and-fitness-server) [![Twitter](https://img.shields.io/twitter/url/https/github.com/johnnymillergh/muscle-and-fitness-server?style=social)](https://twitter.com/intent/tweet?text=Wow:&url=https%3A%2F%2Fgithub.com%2Fjohnnymillergh%2Fmuscle-and-fitness-server) -# Muscle and Fitness Server :: API Portal +# Muscle and Fitness Server :: Auth Center -**Muscle and Fitness Server :: API Portal**, an entrance for upcoming requests from any external devices. Responsible for aggregating internal micro-services and exposing to external. +**Muscle and Fitness Server :: Auth Center**, authentication and authorization Center (AAC) for incoming requests from clients. -[Official Docker Image](https://hub.docker.com/r/ijohnnymiller/muscle-and-fitness-server.api-portal-prod) +[Official Docker Image](https://hub.docker.com/r/ijohnnymiller/muscle-and-fitness-server.auth-center-prod) ## Features -Here is the highlights of **Muscle and Fitness Server :: API Portal**: +Here is the highlights of **Muscle and Fitness Server :: Auth Center**: -1. Expose APIs for Web, App, etc. URL starts with `/api-portal`. -2. Authentication and authorization for incoming requests. -3. JWT support. +1. Manage the information of `User`, `Role` and `Permission`, as well as their relationship. ## Usage diff --git a/muscle-mis/auto-run-windows.cmd b/oss-center/auto-run-windows.cmd similarity index 77% rename from muscle-mis/auto-run-windows.cmd rename to oss-center/auto-run-windows.cmd index cd3242c5..2b4a7fc1 100644 --- a/muscle-mis/auto-run-windows.cmd +++ b/oss-center/auto-run-windows.cmd @@ -16,8 +16,10 @@ chcp 65001 @REM #################### Configurable Environment Variables ################### SET skipGitPull=true SET skipMavenBuild=true +SET minimalJavaMajorVersion=11 +SET javaExe=C:\Users\Johnny\.sdkman\candidates\java\11.0.10.hs-adpt\bin\java.exe SET mavenActiveProfile="development-local" -SET javaParameter=-Dfile.encoding=UTF-8 -Xms256m -Xmx256m +SET javaParameter=-Xms256m -Xmx256m -Dfile.encoding=UTF-8 -Dspring.cloud.consul.host=localhost GOTO:MAIN @@ -55,6 +57,22 @@ EXIT /B 0 @REM ############################ Custom Functions ############################# +@REM Check Java major version +:checkJavaMajorVersion +CALL :logWarn "Start to Check Java major version…" +%javaExe% -version 1>nul 2>nul || ( + CALL :logError "Java is not installed!" + EXIT /B 2 +) +for /f tokens^=2-6^ delims^=.-_+^" %%j in ('%javaExe% -fullversion 2^>^&1') do set "currentJavaMajorVersion=%%j" +CALL :logWarn "Got current Java major version number: %currentJavaMajorVersion%" +if %currentJavaMajorVersion% LSS %minimalJavaMajorVersion% ( + CALL :logError "Current Java version is too low, at least OpenJDK %minimalJavaMajorVersion% is needed" + EXIT /B 1 +) +CALL :logInfo "Passed Java major version cheking" +EXIT /B 0 + @REM Pull the latest code of current branch from Git. :gitPull git pull @@ -76,7 +94,7 @@ EXIT /B 0 CALL :gitPull ) CALL :logInfo "[PRE-BUILD] Java Version Information" - CALL java -version + CALL %javaExe% -version CALL :logInfo "[PRE-BUILD] Maven Version Information" CALL mvn -v CALL :logInfo "[PRE-BUILD] Current directory:" @@ -113,7 +131,7 @@ EXIT /B 0 ) CALL :logWarn "[RUN] Found JAR: %jarFileName%" CALL :setTerminalTitle %jarFileName% - SET runJarCommand=java %javaParameter% -Dspring.profiles.active=%mavenActiveProfile% -jar target\%jarFileName% + SET runJarCommand=%javaExe% %javaParameter% -Dspring.profiles.active=%mavenActiveProfile% -jar target\%jarFileName% CALL :logWarn "[RUN] Execute command: %runJarCommand%" CALL %runJarCommand% EXIT /B 0 @@ -121,6 +139,14 @@ EXIT /B 0 @REM ############################# MAIN Procedures ############################# :MAIN cls + +@REM Check Java major version +CALL :checkJavaMajorVersion +if %ERRORLEVEL% NEQ 0 ( + CALL :logError "Failed to check Java major version!" + EXIT /B %ERRORLEVEL% +) + @REM Pre-build phrase (Display version, Git pull) CALL :executePreBuildPhase if %ERRORLEVEL% NEQ 0 ( diff --git a/service-registry/pom.xml b/oss-center/pom.xml similarity index 66% rename from service-registry/pom.xml rename to oss-center/pom.xml index ac09d881..180b9633 100644 --- a/service-registry/pom.xml +++ b/oss-center/pom.xml @@ -1,16 +1,16 @@ - 4.0.0 - service-registry - Muscle and Fitness Server :: Service Registry - Service Registry center. + oss-center + Muscle and Fitness Server :: OSS Center + Object Storage Service (OOS) Center for M&F. com.jmsoftware.maf muscle-and-fitness-server - 0.0.1 + 0.0.2 @@ -19,22 +19,31 @@ org.springframework.boot spring-boot-maven-plugin + + + build-info + compile + + build-info + + + com.google.cloud.tools jib-maven-plugin - 2.2.0 + ${jib-maven-plugin.version} - + buildAndPushDockerImagePhase @@ -46,8 +55,8 @@ - - openjdk:11.0.9.1-jre-slim + + adoptopenjdk/openjdk11:${adoptopenjdk11.tag} docker.io/ijohnnymiller/${project.parent.artifactId}.${project.artifactId} @@ -62,7 +71,7 @@ -Dfile.encoding=${project.build.sourceEncoding} - ${service-registry.port} + ${oss-center.port} USE_CURRENT_TIMESTAMP @@ -74,21 +83,27 @@ - org.springframework.boot - spring-boot-starter-web - - - org.springframework.cloud - spring-cloud-starter-netflix-eureka-server + com.jmsoftware.maf + spring-cloud-starter + - com.jmsoftware.maf - common + org.springframework.boot + spring-boot-starter-test + test + + + org.junit.vintage + junit-vintage-engine + + + - com.jmsoftware.maf - muscle-and-fitness-server-spring-boot-starter + org.apache.tika + tika-core + ${apache-tika.version} diff --git a/oss-center/src/main/java/com/jmsoftware/maf/osscenter/OssCenterApplication.java b/oss-center/src/main/java/com/jmsoftware/maf/osscenter/OssCenterApplication.java new file mode 100644 index 00000000..182dc3cc --- /dev/null +++ b/oss-center/src/main/java/com/jmsoftware/maf/osscenter/OssCenterApplication.java @@ -0,0 +1,35 @@ +package com.jmsoftware.maf.osscenter; + +import com.jmsoftware.maf.springcloudstarter.helper.SpringBootStartupHelper; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.client.discovery.EnableDiscoveryClient; +import org.springframework.cloud.openfeign.EnableFeignClients; +import org.springframework.util.StopWatch; + +/** + *

OssCenterApplication

+ *

+ * Change description here. + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 6/20/21 1:32 PM + **/ +@Slf4j +@EnableFeignClients +@EnableDiscoveryClient +@SpringBootApplication +public class OssCenterApplication { + private static final StopWatch STOP_WATCH = new StopWatch(); + private static SpringBootStartupHelper springBootStartupHelper; + + public OssCenterApplication(SpringBootStartupHelper springBootStartupHelper) { + OssCenterApplication.springBootStartupHelper = springBootStartupHelper; + } + + public static void main(String[] args) { + STOP_WATCH.start(); + SpringApplication.run(OssCenterApplication.class, args); + springBootStartupHelper.stop(STOP_WATCH); + } +} diff --git a/oss-center/src/main/java/com/jmsoftware/maf/osscenter/read/controller/ReadResourceController.java b/oss-center/src/main/java/com/jmsoftware/maf/osscenter/read/controller/ReadResourceController.java new file mode 100644 index 00000000..a174006f --- /dev/null +++ b/oss-center/src/main/java/com/jmsoftware/maf/osscenter/read/controller/ReadResourceController.java @@ -0,0 +1,37 @@ +package com.jmsoftware.maf.osscenter.read.controller; + +import com.jmsoftware.maf.osscenter.read.entity.GetSingleResourcePayload; +import com.jmsoftware.maf.osscenter.read.service.ReadResourceService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import org.springframework.core.io.Resource; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RestController; + +import javax.validation.Valid; + +/** + *

ReadResourceController

+ *

+ * Change description here. + * + * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com, 6/20/21 5:16 PM + **/ +@Validated +@RestController +@RequiredArgsConstructor +@Api(tags = {"Read resource API"}) +public class ReadResourceController { + private final ReadResourceService readResourceService; + + @GetMapping("/{bucket}/{object}") + @ApiOperation(value = "Get single resource", notes = "Get or download single resource") + public ResponseEntity getSingleResource(@PathVariable String bucket, @PathVariable String object, + @Valid GetSingleResourcePayload payload) { + return readResourceService.getSingleResource(bucket, object, payload); + } +} diff --git a/oss-center/src/main/java/com/jmsoftware/maf/osscenter/read/entity/GetSingleResourcePayload.java b/oss-center/src/main/java/com/jmsoftware/maf/osscenter/read/entity/GetSingleResourcePayload.java new file mode 100644 index 00000000..c02e3532 --- /dev/null +++ b/oss-center/src/main/java/com/jmsoftware/maf/osscenter/read/entity/GetSingleResourcePayload.java @@ -0,0 +1,15 @@ +package com.jmsoftware.maf.osscenter.read.entity; + +import lombok.Data; + +/** + *

GetSingleResourcePayload

+ *

+ * Change description here. + * + * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com, 6/20/21 7:16 PM + **/ +@Data +public class GetSingleResourcePayload { + private Boolean downloadable; +} diff --git a/oss-center/src/main/java/com/jmsoftware/maf/osscenter/read/package-info.java b/oss-center/src/main/java/com/jmsoftware/maf/osscenter/read/package-info.java new file mode 100644 index 00000000..0cb19f7c --- /dev/null +++ b/oss-center/src/main/java/com/jmsoftware/maf/osscenter/read/package-info.java @@ -0,0 +1 @@ +package com.jmsoftware.maf.osscenter.read; diff --git a/oss-center/src/main/java/com/jmsoftware/maf/osscenter/read/service/ReadResourceService.java b/oss-center/src/main/java/com/jmsoftware/maf/osscenter/read/service/ReadResourceService.java new file mode 100644 index 00000000..dabe7873 --- /dev/null +++ b/oss-center/src/main/java/com/jmsoftware/maf/osscenter/read/service/ReadResourceService.java @@ -0,0 +1,34 @@ +package com.jmsoftware.maf.osscenter.read.service; + +import com.jmsoftware.maf.osscenter.read.entity.GetSingleResourcePayload; +import org.springframework.core.io.Resource; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; + +import javax.validation.Valid; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + *

ReadResourceService

+ *

+ * Change description here. + * + * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com, 6/20/21 5:17 PM + **/ +@Validated +public interface ReadResourceService { + String BUCKET_OBJECT_NAME_REGEX = "^.+/.+$"; + long CHUNK_SIZE = 1024 * 1024 * 1024 * 4L; + + /** + * Gets single resource. + * + * @param bucket the bucket + * @param object the object + * @param payload the payload + * @return the single resource + */ + ResponseEntity getSingleResource(@NotBlank String bucket, @NotBlank String object, + @Valid @NotNull GetSingleResourcePayload payload); +} diff --git a/oss-center/src/main/java/com/jmsoftware/maf/osscenter/read/service/impl/ReadResourceServiceImpl.java b/oss-center/src/main/java/com/jmsoftware/maf/osscenter/read/service/impl/ReadResourceServiceImpl.java new file mode 100644 index 00000000..d27f27b1 --- /dev/null +++ b/oss-center/src/main/java/com/jmsoftware/maf/osscenter/read/service/impl/ReadResourceServiceImpl.java @@ -0,0 +1,54 @@ +package com.jmsoftware.maf.osscenter.read.service.impl; + +import cn.hutool.core.util.BooleanUtil; +import cn.hutool.core.util.ObjectUtil; +import com.jmsoftware.maf.osscenter.read.entity.GetSingleResourcePayload; +import com.jmsoftware.maf.osscenter.read.service.ReadResourceService; +import com.jmsoftware.maf.springcloudstarter.helper.MinioHelper; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import lombok.val; +import org.springframework.core.io.InputStreamResource; +import org.springframework.core.io.Resource; +import org.springframework.http.*; +import org.springframework.stereotype.Service; + +import javax.validation.Valid; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +import static java.lang.Math.min; + +/** + *

ReadResourceServiceImpl

+ *

+ * Change description here. + * + * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com, 6/20/21 5:18 PM + **/ +@Slf4j +@Service +@RequiredArgsConstructor +public class ReadResourceServiceImpl implements ReadResourceService { + private final MinioHelper minioHelper; + + @Override + public ResponseEntity getSingleResource(@NotBlank String bucket, @NotBlank String object, + @Valid @NotNull GetSingleResourcePayload payload) { + val statObjectResponse = minioHelper.statObject(bucket, object); + if (ObjectUtil.isNull(statObjectResponse)) { + return ResponseEntity.notFound().build(); + } + val inputStream = minioHelper.getObject(bucket, object); + val bodyBuilder = ResponseEntity.ok(); + if (BooleanUtil.isTrue(payload.getDownloadable())) { + String contentDisposition = ContentDisposition.builder("attachment").filename(object).build().toString(); + bodyBuilder.header(HttpHeaders.CONTENT_DISPOSITION, contentDisposition); + } + return bodyBuilder + .header(HttpHeaders.ACCEPT_RANGES, "bytes") + .contentLength(statObjectResponse.size()) + .contentType(MediaType.parseMediaType(statObjectResponse.contentType())) + .body(new InputStreamResource(inputStream)); + } +} diff --git a/oss-center/src/main/java/com/jmsoftware/maf/osscenter/read/service/impl/package-info.java b/oss-center/src/main/java/com/jmsoftware/maf/osscenter/read/service/impl/package-info.java new file mode 100644 index 00000000..bc6eee9a --- /dev/null +++ b/oss-center/src/main/java/com/jmsoftware/maf/osscenter/read/service/impl/package-info.java @@ -0,0 +1 @@ +package com.jmsoftware.maf.osscenter.read.service.impl; diff --git a/oss-center/src/main/java/com/jmsoftware/maf/osscenter/read/service/package-info.java b/oss-center/src/main/java/com/jmsoftware/maf/osscenter/read/service/package-info.java new file mode 100644 index 00000000..0b7241e8 --- /dev/null +++ b/oss-center/src/main/java/com/jmsoftware/maf/osscenter/read/service/package-info.java @@ -0,0 +1 @@ +package com.jmsoftware.maf.osscenter.read.service; diff --git a/oss-center/src/main/java/com/jmsoftware/maf/osscenter/write/controller/WriteResourceController.java b/oss-center/src/main/java/com/jmsoftware/maf/osscenter/write/controller/WriteResourceController.java new file mode 100644 index 00000000..c90bfd60 --- /dev/null +++ b/oss-center/src/main/java/com/jmsoftware/maf/osscenter/write/controller/WriteResourceController.java @@ -0,0 +1,39 @@ +package com.jmsoftware.maf.osscenter.write.controller; + +import com.jmsoftware.maf.osscenter.write.service.WriteResourceService; +import com.jmsoftware.maf.common.bean.ResponseBodyBean; +import com.jmsoftware.maf.common.exception.BusinessException; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; + +/** + *

WriteResourceController

+ *

+ * Change description here. + * + * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com, 6/20/21 1:57 PM + **/ +@Validated +@RestController +@RequiredArgsConstructor +@Api(tags = {"Write resource API"}) +public class WriteResourceController { + private final WriteResourceService writeResourceService; + + @PostMapping("/upload/single") + @SneakyThrows({IOException.class, BusinessException.class}) + @ApiOperation(value = "Upload single resource", notes = "Upload single resource") + public ResponseBodyBean uploadSingleResource(@RequestParam("file") MultipartFile multipartFile) { + return ResponseBodyBean.ofSuccess(writeResourceService.uploadSingleResource(multipartFile), + "Succeed to upload"); + } +} diff --git a/oss-center/src/main/java/com/jmsoftware/maf/osscenter/write/package-info.java b/oss-center/src/main/java/com/jmsoftware/maf/osscenter/write/package-info.java new file mode 100644 index 00000000..4540037f --- /dev/null +++ b/oss-center/src/main/java/com/jmsoftware/maf/osscenter/write/package-info.java @@ -0,0 +1 @@ +package com.jmsoftware.maf.osscenter.write; diff --git a/oss-center/src/main/java/com/jmsoftware/maf/osscenter/write/service/WriteResourceService.java b/oss-center/src/main/java/com/jmsoftware/maf/osscenter/write/service/WriteResourceService.java new file mode 100644 index 00000000..f9648a77 --- /dev/null +++ b/oss-center/src/main/java/com/jmsoftware/maf/osscenter/write/service/WriteResourceService.java @@ -0,0 +1,28 @@ +package com.jmsoftware.maf.osscenter.write.service; + +import com.jmsoftware.maf.common.exception.BusinessException; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.multipart.MultipartFile; + +import javax.validation.constraints.NotNull; +import java.io.IOException; + +/** + *

WriteResourceService

+ *

+ * Change description here. + * + * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com, 6/20/21 2:19 PM + **/ +@Validated +public interface WriteResourceService { + /** + * Upload single resource string. + * + * @param multipartFile the multipart file + * @return the string + * @throws IOException the io exception + * @throws BusinessException the business exception + */ + String uploadSingleResource(@NotNull MultipartFile multipartFile) throws IOException, BusinessException; +} diff --git a/oss-center/src/main/java/com/jmsoftware/maf/osscenter/write/service/impl/WriteResourceServiceImpl.java b/oss-center/src/main/java/com/jmsoftware/maf/osscenter/write/service/impl/WriteResourceServiceImpl.java new file mode 100644 index 00000000..5d34db8a --- /dev/null +++ b/oss-center/src/main/java/com/jmsoftware/maf/osscenter/write/service/impl/WriteResourceServiceImpl.java @@ -0,0 +1,46 @@ +package com.jmsoftware.maf.osscenter.write.service.impl; + +import cn.hutool.core.util.StrUtil; +import com.jmsoftware.maf.osscenter.write.service.WriteResourceService; +import com.jmsoftware.maf.common.exception.BusinessException; +import com.jmsoftware.maf.springcloudstarter.helper.MinioHelper; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import lombok.val; +import org.apache.tika.Tika; +import org.apache.tika.mime.MediaType; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import javax.validation.constraints.NotNull; +import java.io.IOException; + +/** + *

WriteResourceServiceImpl

+ *

+ * Change description here. + * + * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com, 6/20/21 2:20 PM + **/ +@Slf4j +@Service +@RequiredArgsConstructor +public class WriteResourceServiceImpl implements WriteResourceService { + private final MinioHelper minioHelper; + + @Override + public String uploadSingleResource(@NotNull MultipartFile multipartFile) throws IOException, BusinessException { + val tika = new Tika(); + val detectedMediaType = tika.detect(multipartFile.getInputStream()); + log.info("Detected media type: {}", detectedMediaType); + if (StrUtil.isBlank(detectedMediaType)) { + throw new BusinessException("Media extension detection failed!"); + } + val mediaType = MediaType.parse(detectedMediaType); + val mediaBaseType = mediaType.getType(); + minioHelper.makeBucket(mediaBaseType); + final var put = minioHelper.put(mediaBaseType, multipartFile.getOriginalFilename(), multipartFile); + log.info("Uploaded single resource: {}/{}", put.bucket(), put.object()); + return String.format("%s/%s", put.bucket(), put.object()); + } +} diff --git a/oss-center/src/main/java/com/jmsoftware/maf/osscenter/write/service/package-info.java b/oss-center/src/main/java/com/jmsoftware/maf/osscenter/write/service/package-info.java new file mode 100644 index 00000000..a421fd8c --- /dev/null +++ b/oss-center/src/main/java/com/jmsoftware/maf/osscenter/write/service/package-info.java @@ -0,0 +1 @@ +package com.jmsoftware.maf.osscenter.write.service; diff --git a/oss-center/src/main/resources/application-development-docker.yml b/oss-center/src/main/resources/application-development-docker.yml new file mode 100644 index 00000000..5b321c55 --- /dev/null +++ b/oss-center/src/main/resources/application-development-docker.yml @@ -0,0 +1,43 @@ +spring: + zipkin: + base-url: http://maf-zipkin:9411 + devtools: + add-properties: true + datasource: + dynamic: + datasource: + master: + url: jdbc:mysql://maf-mysql-server-master:3306/muscle_and_fitness?useSSL=true&useUnicode=true + username: maf_mysql_rw + password: maf@mysql + driver-class-name: com.mysql.cj.jdbc.Driver + slave1: + url: jdbc:mysql://maf-mysql-server-slave:3306/muscle_and_fitness?useSSL=true&useUnicode=true + username: maf_mysql_r + password: maf@mysql + driver-class-name: com.mysql.cj.jdbc.Driver + quartz: + url: jdbc:mysql://maf-mysql-server-master:3306/QUARTZ_DB?useSSL=true&useUnicode=true + username: maf_mysql_rw + password: maf@mysql + driver-class-name: com.mysql.cj.jdbc.Driver + redis: + host: maf-redis + port: 6379 + password: maf@redis + rabbitmq: + host: maf-rabbitmq + port: 5672 + username: maf_rabbitmq_su + password: maf@rabbitmq + +maf: + configuration: + swagger-enabled: true + +minio: + endpoint: http://maf-minio + port: 9000 + access-key: maf_minio_root_user + secret-key: jm@minio + bucket-name: maf diff --git a/oss-center/src/main/resources/application-development-local.yml b/oss-center/src/main/resources/application-development-local.yml new file mode 100644 index 00000000..15551814 --- /dev/null +++ b/oss-center/src/main/resources/application-development-local.yml @@ -0,0 +1,48 @@ +spring: + zipkin: + base-url: http://localhost:9411 + devtools: + add-properties: true + datasource: + dynamic: + datasource: + master: + url: jdbc:mysql://localhost:3306/muscle_and_fitness?useSSL=true&useUnicode=true + username: maf_mysql_rw + password: maf@mysql + driver-class-name: com.mysql.cj.jdbc.Driver + slave1: + url: jdbc:mysql://localhost:3307/muscle_and_fitness?useSSL=true&useUnicode=true + username: maf_mysql_r + password: maf@mysql + driver-class-name: com.mysql.cj.jdbc.Driver + quartz: + url: jdbc:mysql://localhost:3306/QUARTZ_DB?useSSL=true&useUnicode=true + username: maf_mysql_rw + password: maf@mysql + driver-class-name: com.mysql.cj.jdbc.Driver + redis: + host: localhost + port: 6379 + password: maf@redis + rabbitmq: + host: localhost + port: 5672 + username: maf_rabbitmq_su + password: maf@rabbitmq + +logging: + # Configure logging level for SFTP/JSCH + level: + com.jcraft.jsch: INFO + +maf: + configuration: + swagger-enabled: true + +minio: + endpoint: http://localhost + port: 9900 + access-key: maf_minio_root_user + secret-key: jm@minio + bucket-name: maf diff --git a/oss-center/src/main/resources/application-production.yml b/oss-center/src/main/resources/application-production.yml new file mode 100644 index 00000000..8698e8e5 --- /dev/null +++ b/oss-center/src/main/resources/application-production.yml @@ -0,0 +1,43 @@ +spring: + zipkin: + base-url: http://maf-zipkin:9411 + devtools: + add-properties: false + datasource: + dynamic: + datasource: + master: + url: jdbc:mysql://maf-mysql-server-master:3306/muscle_and_fitness?useSSL=true&useUnicode=true + username: maf_mysql_rw + password: maf@mysql + driver-class-name: com.mysql.cj.jdbc.Driver + slave1: + url: jdbc:mysql://maf-mysql-server-slave:3306/muscle_and_fitness?useSSL=true&useUnicode=true + username: maf_mysql_r + password: maf@mysql + driver-class-name: com.mysql.cj.jdbc.Driver + quartz: + url: jdbc:mysql://maf-mysql-server-master:3306/QUARTZ_DB?useSSL=true&useUnicode=true + username: maf_mysql_rw + password: maf@mysql + driver-class-name: com.mysql.cj.jdbc.Driver + redis: + host: maf-redis + port: 6379 + password: maf@redis + rabbitmq: + host: maf-rabbitmq + port: 5672 + username: maf_rabbitmq_su + password: maf@rabbitmq + +maf: + configuration: + swagger-enabled: false + +minio: + endpoint: http://maf-minio + port: 9000 + access-key: maf_minio_root_user + secret-key: jm@minio + bucket-name: maf diff --git a/oss-center/src/main/resources/application-stage.yml b/oss-center/src/main/resources/application-stage.yml new file mode 100644 index 00000000..8698e8e5 --- /dev/null +++ b/oss-center/src/main/resources/application-stage.yml @@ -0,0 +1,43 @@ +spring: + zipkin: + base-url: http://maf-zipkin:9411 + devtools: + add-properties: false + datasource: + dynamic: + datasource: + master: + url: jdbc:mysql://maf-mysql-server-master:3306/muscle_and_fitness?useSSL=true&useUnicode=true + username: maf_mysql_rw + password: maf@mysql + driver-class-name: com.mysql.cj.jdbc.Driver + slave1: + url: jdbc:mysql://maf-mysql-server-slave:3306/muscle_and_fitness?useSSL=true&useUnicode=true + username: maf_mysql_r + password: maf@mysql + driver-class-name: com.mysql.cj.jdbc.Driver + quartz: + url: jdbc:mysql://maf-mysql-server-master:3306/QUARTZ_DB?useSSL=true&useUnicode=true + username: maf_mysql_rw + password: maf@mysql + driver-class-name: com.mysql.cj.jdbc.Driver + redis: + host: maf-redis + port: 6379 + password: maf@redis + rabbitmq: + host: maf-rabbitmq + port: 5672 + username: maf_rabbitmq_su + password: maf@rabbitmq + +maf: + configuration: + swagger-enabled: false + +minio: + endpoint: http://maf-minio + port: 9000 + access-key: maf_minio_root_user + secret-key: jm@minio + bucket-name: maf diff --git a/oss-center/src/main/resources/application-test.yml b/oss-center/src/main/resources/application-test.yml new file mode 100644 index 00000000..c25e4c0b --- /dev/null +++ b/oss-center/src/main/resources/application-test.yml @@ -0,0 +1,43 @@ +spring: + zipkin: + base-url: http://maf-zipkin:9411 + devtools: + add-properties: false + datasource: + dynamic: + datasource: + master: + url: jdbc:mysql://maf-mysql-server-master:3306/muscle_and_fitness?useSSL=true&useUnicode=true + username: maf_mysql_rw + password: maf@mysql + driver-class-name: com.mysql.cj.jdbc.Driver + slave1: + url: jdbc:mysql://maf-mysql-server-slave:3306/muscle_and_fitness?useSSL=true&useUnicode=true + username: maf_mysql_r + password: maf@mysql + driver-class-name: com.mysql.cj.jdbc.Driver + quartz: + url: jdbc:mysql://maf-mysql-server-master:3306/QUARTZ_DB?useSSL=true&useUnicode=true + username: maf_mysql_rw + password: maf@mysql + driver-class-name: com.mysql.cj.jdbc.Driver + redis: + host: maf-redis + port: 6379 + password: maf@redis + rabbitmq: + host: maf-rabbitmq + port: 5672 + username: maf_rabbitmq_su + password: maf@rabbitmq + +maf: + configuration: + swagger-enabled: true + +minio: + endpoint: http://maf-minio + port: 9000 + access-key: maf_minio_root_user + secret-key: jm@minio + bucket-name: maf diff --git a/oss-center/src/main/resources/application.yml b/oss-center/src/main/resources/application.yml new file mode 100644 index 00000000..8a1ed499 --- /dev/null +++ b/oss-center/src/main/resources/application.yml @@ -0,0 +1,195 @@ +server: + port: @oss-center.port@ + tomcat: + uri-encoding: @project.build.sourceEncoding@ + shutdown: GRACEFUL + servlet: + context-path: + +spring: + profiles: + active: @env@ + mvc: + throw-exception-if-no-handler-found: true + jackson: + date-format: yyyy-MM-dd HH:mm:ss + time-zone: Asia/Hong_Kong + sleuth: + sampler: + probability: 1.0 + servlet: + multipart: + # `location` specifies the directory where uploaded files will be stored. When not specified, + # a temporary directory will be used. ATTENTION: it may differ due to OS. + location: ~/Documents/@project.parent.artifactId@/${spring.application.name}/temprary-file + # `max-file-size` specifies the maximum size permitted for uploaded files. The default is 1MB. We set it as 64 MB. + max-file-size: 64MB + # `max-request-size` specifies the maximum size allowed for multipart/form-data requests. The default is 10MB. + max-request-size: 70MB + # `file-size-threshold` specifies the size threshold after which files will be written to disk. + # The default is 0. We set it as 0 too. + file-size-threshold: 0 + cloud: + consul: + discovery: + register: true + instance-id: ${spring.application.name}-${spring.cloud.client.hostname}-${vcap.application.instance_id:${spring.application.instance_id:${random.value}}} + service-name: ${spring.application.name} + port: ${server.port} + prefer-ip-address: true + ip-address: ${spring.cloud.client.ip-address} + health-check-critical-timeout: 15s + datasource: + type: com.alibaba.druid.pool.DruidDataSource + druid: + driver-class-name: com.mysql.cj.jdbc.Driver + initial-size: 5 + minIdle: 10 + max-active: 20 + max-wait: 60000 + min-evictable-idle-time-millis: 600000 + max-evictable-idle-time-millis: 900000 + validation-query: SELECT 1 + test-while-idle: true + test-on-borrow: false + test-on-return: false + pool-prepared-statements: true + max-open-prepared-statements: 20 + keep-alive: true + filters: stat,wall,log4j2 + filter: + stat: + enabled: true + db-type: mysql + log-slow-sql: true + slow-sql-millis: 2000 + slf4j: + enabled: true + statement-log-error-enabled: true + statement-create-after-log-enabled: false + statement-close-after-log-enabled: false + result-set-open-after-log-enabled: false + result-set-close-after-log-enabled: false + web-stat-filter: + enabled: true + url-pattern: /* + exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*" + session-stat-enable: true + session-stat-max-count: 1000 + stat-view-servlet: + enabled: true + url-pattern: /druid/* + reset-enable: false + login-username: root + login-password: maf_druid_password + allow: + redis: + database: 0 + timeout: 10000ms + client-type: LETTUCE + lettuce: + pool: + max-active: 20 + max-idle: 10 + max-wait: -1ms + min-idle: 0 + quartz: + job-store-type: JDBC + scheduler-name: ${spring.application.name}-scheduler + wait-for-jobs-to-complete-on-shutdown: true + jdbc: + initialize-schema: NEVER + properties: + org: + quartz: + scheduler: + instanceId: AUTO + jobStore: + tablePrefix: QRTZ_ + isClustered: true + clusterCheckinInterval: 3000 + useProperties: false + threadPool: + threadCount: 15 + threadPriority: 5 + class: org.quartz.simpl.SimpleThreadPool + +feign: + httpclient: + enabled: false + okhttp: + enabled: true + client: + config: + default: + connectTimeout: 5000 + readTimeout: 10000 + loggerLevel: full + compression: + request: + enabled: true + response: + enabled: true + useGzipDecoder: true + +management: + endpoints: + web: + exposure: + include: "*" + endpoint: + health: + show-details: ALWAYS + +mybatis-plus: + global-config: + db-config: + logic-delete-field: deleted + configuration: + map-underscore-to-camel-case: true + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl + # mapper-locations should start with `classpath*` prefix + # when project is based on Maven multi-module to load XML mapper in different jar + mapper-locations: classpath*:/mapper/**/*Mapper.xml + +logging: + config: classpath:logback-configuration/logback-${spring.profiles.active}.xml + level: + # Configure logging level for SFTP/JSCH + com.jcraft.jsch: INFO + +maf: + project-property: + base-package: @project.groupId@ + context-path: ${server.servlet.context-path} + group-id: @project.groupId@ + project-parent-artifact-id: @project.parent.artifactId@ + project-artifact-id: @project.artifactId@ + version: @project.version@ + description: @project.description@ + jdk-version: @java.version@ + environment: ${spring.profiles.active} + url: @project.url@ + inception-year: @inceptionYear@ + organization-name: @project.organization.name@ + organization-url: @project.organization.url@ + issue-management-system: @project.issueManagement.system@ + issue-management-url: @project.issueManagement.url@ + developer-name: @developerName@ + developer-email: @developerEmail@ + developer-url: @developerUrl@ + configuration: + ignored-url: + pattern: + - "/static/**" + - "/actuator/**" + - "/druid/**" + - "/swagger-resources/**" + - "/v2/api-docs/**" + - "/*/v2/api-docs/**" + - "/webjars/**" + - "/doc.html" + included-package-for-http-api-scan: ${maf.project-property.base-package} + +minio: + enabled: true diff --git a/api-portal/src/main/resources/banner.txt b/oss-center/src/main/resources/banner.txt similarity index 68% rename from api-portal/src/main/resources/banner.txt rename to oss-center/src/main/resources/banner.txt index a89ea7a7..46496b27 100644 --- a/api-portal/src/main/resources/banner.txt +++ b/oss-center/src/main/resources/banner.txt @@ -1,12 +1,12 @@ ${AnsiStyle.BOLD}${AnsiColor.BRIGHT_GREEN} - ___ ____ ____ ____ __ __ - / | / __ \/ _/ / __ \____ _____/ /_____ _/ / - / /| | / /_/ // / / /_/ / __ \/ ___/ __/ __ `/ / - / ___ |/ ____// / / ____/ /_/ / / / /_/ /_/ / / -/_/ |_/_/ /___/ /_/ \____/_/ \__/\__,_/_/ -${AnsiStyle.BOLD}Exercise MIS :: Powered by Spring Boot ::${spring-boot.formatted-version} -${AnsiColor.CYAN}Author: Johnny Miller (鍾俊), email: johnnysviva@outlook.com -${AnsiStyle.NORMAL}${AnsiColor.MAGENTA}http://patorjk.com/software/taag/#p=display&f=Slant&t=API%20Portal + ____ __________ ______ __ + / __ \/ ___/ ___/ / ____/__ ____ / /____ _____ + / / / /\__ \\__ \ / / / _ \/ __ \/ __/ _ \/ ___/ +/ /_/ /___/ /__/ / / /___/ __/ / / / /_/ __/ / +\____//____/____/ \____/\___/_/ /_/\__/\___/_/ +${AnsiStyle.BOLD}Static Resource Center :: Powered by Spring Boot ::${spring-boot.formatted-version} +${AnsiColor.CYAN}Author: Johnny Miller (锺俊), email: johnnysviva@outlook.com +${AnsiStyle.NORMAL}${AnsiColor.MAGENTA}http://patorjk.com/software/taag/#p=display&f=Slant&t=Static%20Resource%20Center ${AnsiColor.BRIGHT_BLACK} -------------------------------------------Font Info------------------------------------------- Slant by Glenn Chappell 3/93 -- based on Standard diff --git a/oss-center/src/main/resources/bootstrap.yml b/oss-center/src/main/resources/bootstrap.yml new file mode 100644 index 00000000..b2cd0424 --- /dev/null +++ b/oss-center/src/main/resources/bootstrap.yml @@ -0,0 +1,19 @@ +spring: + application: + name: @project.artifactId@ + cloud: + consul: + host: "should-be-passed-by-java-opts" + port: 8500 + config: + enabled: true + prefixes: + - config + # `default-context` should be equal to Spring application name + default-context: @project.artifactId@ + profile-separator: "::" + format: YAML + data-key: "data" + watch: + enabled: true + delay: 1000 diff --git a/oss-center/src/main/resources/logback-configuration/logback-base.xml b/oss-center/src/main/resources/logback-configuration/logback-base.xml new file mode 100644 index 00000000..be7eb0ef --- /dev/null +++ b/oss-center/src/main/resources/logback-configuration/logback-base.xml @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + UTF-8 + + + + + + + ALL + ACCEPT + ACCEPT + + + + ${FILE_LOG_PATTERN} + UTF-8 + + + + + + + ${LOG_HOME}/${APPLICATION}-${ENVIRONMENT}-${HOSTNAME}.%d{yyyy-MM-dd}.%i.log.gz + + + 5MB + 7 + 1GB + + + + + + ${LOGSTASH_HOST}:4560 + + {"applicationName": "${APPLICATION}", "environment": "${ENVIRONMENT}"} + + + diff --git a/gateway/src/main/resources/configuration/logback/logback-development-docker.xml b/oss-center/src/main/resources/logback-configuration/logback-development-docker.xml similarity index 68% rename from gateway/src/main/resources/configuration/logback/logback-development-docker.xml rename to oss-center/src/main/resources/logback-configuration/logback-development-docker.xml index f38e6c2d..86b71ee2 100644 --- a/gateway/src/main/resources/configuration/logback/logback-development-docker.xml +++ b/oss-center/src/main/resources/logback-configuration/logback-development-docker.xml @@ -1,10 +1,11 @@ - + + diff --git a/api-portal/src/main/resources/configuration/logback/logback-development-local.xml b/oss-center/src/main/resources/logback-configuration/logback-development-local.xml similarity index 68% rename from api-portal/src/main/resources/configuration/logback/logback-development-local.xml rename to oss-center/src/main/resources/logback-configuration/logback-development-local.xml index f38e6c2d..86b71ee2 100644 --- a/api-portal/src/main/resources/configuration/logback/logback-development-local.xml +++ b/oss-center/src/main/resources/logback-configuration/logback-development-local.xml @@ -1,10 +1,11 @@ - + + diff --git a/gateway/src/main/resources/configuration/logback/logback-production.xml b/oss-center/src/main/resources/logback-configuration/logback-production.xml similarity index 68% rename from gateway/src/main/resources/configuration/logback/logback-production.xml rename to oss-center/src/main/resources/logback-configuration/logback-production.xml index f38e6c2d..86b71ee2 100644 --- a/gateway/src/main/resources/configuration/logback/logback-production.xml +++ b/oss-center/src/main/resources/logback-configuration/logback-production.xml @@ -1,10 +1,11 @@ - + + diff --git a/gateway/src/main/resources/configuration/logback/logback-stage.xml b/oss-center/src/main/resources/logback-configuration/logback-stage.xml similarity index 68% rename from gateway/src/main/resources/configuration/logback/logback-stage.xml rename to oss-center/src/main/resources/logback-configuration/logback-stage.xml index f38e6c2d..86b71ee2 100644 --- a/gateway/src/main/resources/configuration/logback/logback-stage.xml +++ b/oss-center/src/main/resources/logback-configuration/logback-stage.xml @@ -1,10 +1,11 @@ - + + diff --git a/gateway/src/main/resources/configuration/logback/logback-test.xml b/oss-center/src/main/resources/logback-configuration/logback-test.xml similarity index 66% rename from gateway/src/main/resources/configuration/logback/logback-test.xml rename to oss-center/src/main/resources/logback-configuration/logback-test.xml index f1916a0f..3c705245 100644 --- a/gateway/src/main/resources/configuration/logback/logback-test.xml +++ b/oss-center/src/main/resources/logback-configuration/logback-test.xml @@ -1,10 +1,11 @@ - + + diff --git a/oss-center/src/main/resources/messages.properties b/oss-center/src/main/resources/messages.properties new file mode 100644 index 00000000..39490033 --- /dev/null +++ b/oss-center/src/main/resources/messages.properties @@ -0,0 +1 @@ +greeting=Hello! diff --git a/oss-center/src/main/resources/messages_zh_CN.properties b/oss-center/src/main/resources/messages_zh_CN.properties new file mode 100644 index 00000000..75f72bdd --- /dev/null +++ b/oss-center/src/main/resources/messages_zh_CN.properties @@ -0,0 +1 @@ +greeting=你好! diff --git a/oss-center/src/test/java/com/jmsoftware/maf/osscenter/OssCenterApplicationTests.java b/oss-center/src/test/java/com/jmsoftware/maf/osscenter/OssCenterApplicationTests.java new file mode 100644 index 00000000..518e880e --- /dev/null +++ b/oss-center/src/test/java/com/jmsoftware/maf/osscenter/OssCenterApplicationTests.java @@ -0,0 +1,21 @@ +package com.jmsoftware.maf.osscenter; + +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +/** + * Description: OssCenterApplicationTests. + * + * @author 钟俊 (zhongjun), email: zhongjun@toguide.cn, date: 12/21/2020 3:08 PM + */ +@Slf4j +@SpringBootTest +class OssCenterApplicationTests { + + @Test + @SneakyThrows + void mockLogin() { + } +} diff --git a/pom.xml b/pom.xml index c8ef8de4..11b6f4dd 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ com.jmsoftware.maf muscle-and-fitness-server - 0.0.1 + 0.0.2 Muscle and Fitness Server Muscle and Fitness Server (M&F, maf), a Spring Cloud microservice based, back-end server for managing data of muscle and fitness. @@ -15,7 +15,7 @@ pom - Johnny Miller (鍾俊) + Johnny Miller (锺俊) johnnysviva@outlook.com https://www.linkedin.com/in/ijohnnymiller @@ -23,44 +23,56 @@ UTF-8 - 8760 + 8760 8761 - 8762 8800 - 8801 - 8802 + 8801 - 8080 + 8080 11 - Hoxton.SR4 + x86_64-alpine-jre-11.0.10_9 + 3.1.1 + 2020.0.3 1.0.0.M5 - 2.2.2 - 2.0.2 + 2.4.3 + 2.4.3 + 1.2.6 + 3.4.3.1 + 3.4.0 + 5.7.3 + 30.0-jre + 2.0.8 + 0.11.2 + 1.0.2 + 2.2.6 + 5.0.0 + 6.6 + 8.2.2 + 1.26 common - muscle-and-fitness-server-spring-boot-starter - muscle-and-fitness-server-reactive-spring-boot-starter - service-registry + universal-ui + spring-cloud-starter + reactive-spring-cloud-starter spring-boot-admin - gateway - api-portal + api-gateway auth-center - exercise-mis - muscle-mis + oss-center + maf-mis org.springframework.boot spring-boot-starter-parent - 2.3.7.RELEASE + 2.4.6 @@ -82,17 +94,12 @@ com.jmsoftware.maf - muscle-and-fitness-server-spring-boot-starter + spring-cloud-starter ${project.version} com.jmsoftware.maf - muscle-and-fitness-server-reactive-spring-boot-starter - ${project.version} - - - com.jmsoftware.maf - service-registry + reactive-spring-cloud-starter ${project.version} @@ -107,22 +114,22 @@ com.jmsoftware.maf - api-portal + auth-center ${project.version} com.jmsoftware.maf - auth-center + maf-mis ${project.version} com.jmsoftware.maf - exercise-mis + universal-ui ${project.version} com.jmsoftware.maf - muscle-mis + oss-center ${project.version} @@ -143,7 +150,7 @@ - Johnny Miller (鍾俊) + Johnny Miller (锺俊) johnnysviva@outlook.com https://www.linkedin.com/in/ijohnnymiller JM Software, Inc. @@ -152,16 +159,50 @@ - GitHub https://github.com/johnnymillergh/muscle-and-fitness-server/issues - ${project.artifactId}-${project.version} + + + ${basedir}/src/main/resources + true + + **/application*.yml + **/application*.yaml + **/application*.properties + + + + ${basedir}/src/main/resources + + **/application*.yml + **/application*.yaml + **/application*.properties + + + + true + ${basedir}/src/main/resources + + **/bootstrap*.yml + **/bootstrap*.yaml + **/bootstrap*.properties + + + + ${basedir}/src/main/resources + + **/bootstrap*.yml + **/bootstrap*.yaml + **/bootstrap*.properties + + + @@ -222,89 +263,32 @@ + - - - org.springframework.boot - spring-boot-starter-webflux - - - org.springframework.cloud - spring-cloud-starter-openfeign - - - org.springframework.cloud - spring-cloud-starter-netflix-hystrix - - - org.springframework.boot - spring-boot-starter-aop - + - org.springframework.boot - spring-boot-starter-validation - - - org.springframework.boot - spring-boot-configuration-processor + org.projectlombok + lombok true - - - org.springframework.boot - spring-boot-starter-test - test - - - org.junit.vintage - junit-vintage-engine - - - - - io.projectreactor - reactor-test - test - - com.google.guava guava - 29.0-jre + ${guava.version} cn.hutool hutool-all - 5.3.4 + ${hutool-all.version} com.github.javafaker javafaker - 1.0.2 - - - - - org.springframework.boot - spring-boot-devtools - runtime - true - - - org.projectlombok - lombok - true - - - - - com.github.xiaoymin - knife4j-micro-spring-boot-starter - ${knife4j.version} + ${java-faker.version} diff --git a/muscle-and-fitness-server-reactive-spring-boot-starter/README.md b/reactive-spring-cloud-starter/README.md similarity index 100% rename from muscle-and-fitness-server-reactive-spring-boot-starter/README.md rename to reactive-spring-cloud-starter/README.md diff --git a/reactive-spring-cloud-starter/pom.xml b/reactive-spring-cloud-starter/pom.xml new file mode 100644 index 00000000..9f7a53d0 --- /dev/null +++ b/reactive-spring-cloud-starter/pom.xml @@ -0,0 +1,110 @@ + + + 4.0.0 + + + reactive-spring-cloud-starter + Muscle and Fitness Server :: Reactive Spring Cloud Starter + Muscle and Fitness Server Reactive Spring Cloud Starter + + com.jmsoftware.maf + muscle-and-fitness-server + 0.0.2 + + + + + + + org.springframework.boot + spring-boot-starter-webflux + + + org.springframework.boot + spring-boot-starter-security + + + org.springframework.boot + spring-boot-starter-aop + + + org.springframework.boot + spring-boot-starter-validation + + + org.springframework.boot + spring-boot-autoconfigure + + + org.springframework.boot + spring-boot-autoconfigure-processor + true + + + org.springframework.boot + spring-boot-configuration-processor + + + org.springframework.boot + spring-boot-starter-data-redis-reactive + + + org.springframework.boot + spring-boot-devtools + runtime + + + + + org.springframework.cloud + spring-cloud-starter-bootstrap + + + org.springframework.cloud + spring-cloud-starter-consul-all + + + org.springframework.cloud + spring-cloud-starter-sleuth + + + org.springframework.cloud + spring-cloud-sleuth-zipkin + + + + com.jmsoftware.maf + common + + + com.jmsoftware.maf + universal-ui + + + + de.codecentric + spring-boot-admin-starter-client + ${spring-boot-admin-starter-client.version} + + + + + com.github.xiaoymin + knife4j-micro-spring-boot-starter + ${knife4j.version} + + + + + org.apache.commons + commons-pool2 + + + + net.logstash.logback + logstash-logback-encoder + ${logstash-logback-encoder.version} + + + diff --git a/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/MafReactiveAutoConfiguration.java b/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/MafReactiveAutoConfiguration.java new file mode 100644 index 00000000..3f472ea1 --- /dev/null +++ b/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/MafReactiveAutoConfiguration.java @@ -0,0 +1,103 @@ +package com.jmsoftware.maf.reactivespringcloudstarter; + +import com.jmsoftware.maf.reactivespringcloudstarter.configuration.MafConfiguration; +import com.jmsoftware.maf.reactivespringcloudstarter.configuration.MafProjectProperty; +import com.jmsoftware.maf.reactivespringcloudstarter.configuration.RedisConfiguration; +import com.jmsoftware.maf.reactivespringcloudstarter.configuration.WebFluxConfiguration; +import com.jmsoftware.maf.reactivespringcloudstarter.controller.CommonController; +import com.jmsoftware.maf.reactivespringcloudstarter.filter.AccessLogFilter; +import com.jmsoftware.maf.reactivespringcloudstarter.helper.IpHelper; +import com.jmsoftware.maf.reactivespringcloudstarter.helper.SpringBootStartupHelper; +import com.jmsoftware.maf.reactivespringcloudstarter.service.CommonService; +import com.jmsoftware.maf.reactivespringcloudstarter.service.impl.CommonServiceImpl; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.autoconfigure.AutoConfigureOrder; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.cloud.client.loadbalancer.LoadBalanced; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; +import org.springframework.web.reactive.function.client.WebClient; + +import javax.annotation.PostConstruct; + +/** + * Description: MuscleAndFitnessServerReactiveAutoConfiguration, change description here. + * + * @author 钟俊(zhongjun), email: zhongjun@toguide.cn, date: 12/22/2020 2:41 PM + **/ +@Slf4j +@Configuration +@RequiredArgsConstructor +@AutoConfigureOrder(Integer.MIN_VALUE) +@EnableConfigurationProperties(MafConfiguration.class) +@Import({ + RedisConfiguration.class +}) +public class MafReactiveAutoConfiguration { + @PostConstruct + public void postConstruct() { + log.warn("Post construction of [{}] is done. About to inject beans. Auto configure order: {}", + getClass().getSimpleName(), Integer.MIN_VALUE); + } + + @Bean + public WebFluxConfiguration webFluxConfiguration() { + log.warn("Initial bean: '{}'", WebFluxConfiguration.class.getSimpleName()); + return new WebFluxConfiguration(); + } + + @Bean + @ConditionalOnMissingBean + public MafConfiguration mafConfiguration() { + log.warn("Initial bean: '{}'", MafConfiguration.class.getSimpleName()); + return new MafConfiguration(); + } + + @Bean + @ConditionalOnMissingBean + public AccessLogFilter requestFilter(MafConfiguration mafConfiguration) { + log.warn("Initial bean: '{}'", AccessLogFilter.class.getSimpleName()); + return new AccessLogFilter(mafConfiguration); + } + + @Bean + public MafProjectProperty mafProjectProperty() { + log.warn("Initial bean: '{}'", MafProjectProperty.class.getSimpleName()); + return new MafProjectProperty(); + } + + @Bean + public IpHelper ipHelper(MafProjectProperty mafProjectProperty) { + log.warn("Initial bean: '{}'", IpHelper.class.getSimpleName()); + return new IpHelper(mafProjectProperty); + } + + @Bean + public SpringBootStartupHelper springBootStartupHelper(MafProjectProperty mafProjectProperty, + IpHelper ipHelper) { + log.warn("Initial bean: '{}'", SpringBootStartupHelper.class.getSimpleName()); + return new SpringBootStartupHelper(mafProjectProperty, ipHelper); + } + + @Bean + public CommonService commonService(MafProjectProperty mafProjectProperty) { + log.warn("Initial bean: '{}'", CommonServiceImpl.class.getSimpleName()); + return new CommonServiceImpl(mafProjectProperty); + } + + @Bean + public CommonController commonController(CommonService commonService) { + log.warn("Initial bean: '{}'", CommonController.class.getSimpleName()); + return new CommonController(commonService); + } + + @Bean + @LoadBalanced + public WebClient.Builder loadBalancedWebClientBuilder() { + log.warn("Initial bean: '{}'", WebClient.Builder.class.getSimpleName()); + return WebClient.builder(); + } +} diff --git a/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/configuration/MafConfiguration.java b/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/configuration/MafConfiguration.java new file mode 100644 index 00000000..a30b3c37 --- /dev/null +++ b/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/configuration/MafConfiguration.java @@ -0,0 +1,143 @@ +package com.jmsoftware.maf.reactivespringcloudstarter.configuration; + +import cn.hutool.core.util.ObjectUtil; +import com.google.common.collect.Lists; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import lombok.val; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.PostConstruct; +import javax.validation.Valid; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Pattern; +import java.util.ArrayList; +import java.util.List; + +/** + *

CustomConfiguration

+ *

Custom configurations which are written in .yml files, containing a variety of fragmentary configs. Such as, + * Druid login info, web security switch, web log and so on.

+ * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com + * @date 2019-03-23 14:24 + **/ +@Data +@Slf4j +@Validated +@Component +@ConfigurationProperties(prefix = "maf.configuration") +public class MafConfiguration { + /** + *

The username of super user who has no restriction to access any system's resources.

+ *

ATTENTION: The value of username of super user must be equal to the value that is + * persistent in database.

+ */ + @NotBlank + private String superUserRole = "admin"; + /** + * Ignore URLs + */ + @Valid + private IgnoredUrl ignoredUrl; + /** + *

Web security feature switch. Default is TRUE.

+ * true - disable web security; false - enable web security. + */ + @NotNull + private Boolean webSecurityEnabled = Boolean.TRUE; + /** + * Web request log switch. Default is TRUE. + *

+ * true - disable web request log; false - enable web request log. + */ + @NotNull + private Boolean webRequestLogEnabled = Boolean.TRUE; + + /** + * Flatten ignored urls string [ ]. + * + * @return the string [ ] + */ + public String[] flattenIgnoredUrls() { + if (ObjectUtil.isNull(this.ignoredUrl)) { + return new String[0]; + } + val flattenIgnoredUrls = new ArrayList(); + flattenIgnoredUrls.addAll(this.ignoredUrl.getGet()); + flattenIgnoredUrls.addAll(this.ignoredUrl.getPost()); + flattenIgnoredUrls.addAll(this.ignoredUrl.getDelete()); + flattenIgnoredUrls.addAll(this.ignoredUrl.getPut()); + flattenIgnoredUrls.addAll(this.ignoredUrl.getHead()); + flattenIgnoredUrls.addAll(this.ignoredUrl.getPatch()); + flattenIgnoredUrls.addAll(this.ignoredUrl.getOptions()); + flattenIgnoredUrls.addAll(this.ignoredUrl.getTrace()); + flattenIgnoredUrls.addAll(this.ignoredUrl.getPattern()); + return flattenIgnoredUrls.toArray(new String[0]); + } + + @PostConstruct + private void postConstruct() { + log.warn("Initial bean: '{}'", this.getClass().getSimpleName()); + } + + /** + *

IgnoredUrl

+ *

+ * Ignored URL configuration. + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 2/9/2021 9:36 AM + **/ + @Data + public static class IgnoredUrl { + private static final String URL_REGEXP = "^/.{1,50}$"; + /** + * Ignored URL pattern. + */ + @Valid + private List<@Pattern(regexp = URL_REGEXP) String> pattern = Lists.newArrayList(); + /** + * Ignored GET request. + */ + @Valid + private List<@Pattern(regexp = URL_REGEXP) String> get = Lists.newArrayList(); + /** + * Ignored POST request. + */ + @Valid + private List<@Pattern(regexp = URL_REGEXP) String> post = Lists.newArrayList(); + /** + * Ignored DELETE request. + */ + @Valid + private List<@Pattern(regexp = URL_REGEXP) String> delete = Lists.newArrayList(); + /** + * Ignored PUT request. + */ + @Valid + private List<@Pattern(regexp = URL_REGEXP) String> put = Lists.newArrayList(); + /** + * Ignored HEAD request. + */ + @Valid + private List<@Pattern(regexp = URL_REGEXP) String> head = Lists.newArrayList(); + /** + * Ignored PATCH request. + */ + @Valid + private List<@Pattern(regexp = URL_REGEXP) String> patch = Lists.newArrayList(); + /** + * Ignored OPTIONS request. + */ + @Valid + private List<@Pattern(regexp = URL_REGEXP) String> options = Lists.newArrayList(); + /** + * Ignored TRACE request. + */ + @Valid + private List<@Pattern(regexp = URL_REGEXP) String> trace = Lists.newArrayList(); + } +} diff --git a/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/configuration/MafProjectProperty.java b/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/configuration/MafProjectProperty.java new file mode 100644 index 00000000..a2a3df88 --- /dev/null +++ b/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/configuration/MafProjectProperty.java @@ -0,0 +1,103 @@ +package com.jmsoftware.maf.reactivespringcloudstarter.configuration; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; +import org.springframework.validation.annotation.Validated; + +import javax.validation.constraints.NotBlank; + +/** + *

MafProjectProperty

+ *

+ * M&F project property, containing the basic constants of the project. + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 12/29/2020 1:21 PM + */ +@Data +@Validated +@Component +@SuppressWarnings("jol") +@ConfigurationProperties(prefix = "maf.project-property") +public class MafProjectProperty { + /** + * The Base package. + */ + @NotBlank + private String basePackage; + /** + * The Context path. + */ + private String contextPath; + /** + * The Group id. + */ + @NotBlank + private String groupId; + /** + * The Project parent artifact id. + */ + @NotBlank + private String projectParentArtifactId; + /** + * The Project artifact id. + */ + @NotBlank + private String projectArtifactId; + /** + * The Version. + */ + @NotBlank + private String version; + /** + * The Description. + */ + @NotBlank + private String description; + /** + * The Jdk version. + */ + @NotBlank + private String jdkVersion; + /** + * The Environment. + */ + @NotBlank + private String environment; + /** + * The Url. + */ + private String url; + /** + * The Inception year. + */ + private String inceptionYear; + /** + * The Organization name. + */ + private String organizationName; + /** + * The Organization url. + */ + private String organizationUrl; + /** + * The Issue management system. + */ + private String issueManagementSystem; + /** + * The Issue management url. + */ + private String issueManagementUrl; + /** + * The Developer name. + */ + private String developerName; + /** + * The Developer email. + */ + private String developerEmail; + /** + * The Developer url. + */ + private String developerUrl; +} diff --git a/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/configuration/RedisConfiguration.java b/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/configuration/RedisConfiguration.java new file mode 100644 index 00000000..e0c82336 --- /dev/null +++ b/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/configuration/RedisConfiguration.java @@ -0,0 +1,53 @@ +package com.jmsoftware.maf.reactivespringcloudstarter.configuration; + +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; +import org.springframework.data.redis.connection.ReactiveRedisConnectionFactory; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.core.ReactiveRedisTemplate; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; +import org.springframework.data.redis.serializer.RedisSerializationContext; +import org.springframework.data.redis.serializer.RedisSerializer; +import org.springframework.data.redis.serializer.StringRedisSerializer; + +import javax.annotation.PostConstruct; + +/** + * Description: RedisConfiguration, change description here. + * + * @author 钟俊(zhongjun), email: zhongjun@toguide.cn, date: 12/30/2020 1:08 PM + **/ +@Slf4j +@Configuration +@RequiredArgsConstructor +public class RedisConfiguration { + @PostConstruct + private void postConstruct() { + log.warn("Initial bean: '{}'", RedisConfiguration.class.getSimpleName()); + } + + /** + * Reactive redis template factory. + * + * @param connectionFactory the reactive redis connection factory + * @return the reactive redis template + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 12/30/2020 1:43 PM + */ + @Bean + ReactiveRedisTemplate reactiveRedisTemplate(ReactiveRedisConnectionFactory connectionFactory) { + log.warn("Initial bean: '{}'", ReactiveRedisTemplate.class.getSimpleName()); + Jackson2JsonRedisSerializer valueSerializer = new Jackson2JsonRedisSerializer<>(Object.class); + RedisSerializationContext serializationContext = RedisSerializationContext + .newSerializationContext( + RedisSerializationContext.SerializationPair.fromSerializer(RedisSerializer.string())) + .value(valueSerializer) + .hashValue(valueSerializer) + .build(); + return new ReactiveRedisTemplate<>(connectionFactory, serializationContext); + } +} diff --git a/gateway/src/main/java/com/jmsoftware/maf/gateway/universal/configuration/WebFluxConfiguration.java b/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/configuration/WebFluxConfiguration.java similarity index 58% rename from gateway/src/main/java/com/jmsoftware/maf/gateway/universal/configuration/WebFluxConfiguration.java rename to reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/configuration/WebFluxConfiguration.java index 01005561..312a0cc6 100644 --- a/gateway/src/main/java/com/jmsoftware/maf/gateway/universal/configuration/WebFluxConfiguration.java +++ b/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/configuration/WebFluxConfiguration.java @@ -1,4 +1,4 @@ -package com.jmsoftware.maf.gateway.universal.configuration; +package com.jmsoftware.maf.reactivespringcloudstarter.configuration; import org.springframework.context.annotation.Configuration; import org.springframework.web.reactive.config.ResourceHandlerRegistry; @@ -9,7 +9,7 @@ *

* Change description here. * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com * @date 2/17/20 5:16 PM **/ @Configuration @@ -17,12 +17,12 @@ public class WebFluxConfiguration implements WebFluxConfigurer { /** * Add resource handlers for serving static resources. * - * @author Johnny Miller (鍾俊), e-mail: johnnysviva@outlook.com + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com * @date 2/17/20 5:19 PM * @see ResourceHandlerRegistry registry */ - @Override - public void addResourceHandlers(ResourceHandlerRegistry registry) { - registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/"); - } +// @Override +// public void addResourceHandlers(ResourceHandlerRegistry registry) { +// registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/"); +// } } diff --git a/exercise-mis/src/main/java/com/jmsoftware/maf/exercisemis/universal/controller/CommonController.java b/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/controller/CommonController.java similarity index 70% rename from exercise-mis/src/main/java/com/jmsoftware/maf/exercisemis/universal/controller/CommonController.java rename to reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/controller/CommonController.java index 99685081..8deda1fa 100644 --- a/exercise-mis/src/main/java/com/jmsoftware/maf/exercisemis/universal/controller/CommonController.java +++ b/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/controller/CommonController.java @@ -1,24 +1,24 @@ -package com.jmsoftware.maf.exercisemis.universal.controller; +package com.jmsoftware.maf.reactivespringcloudstarter.controller; +import cn.hutool.json.JSON; import com.jmsoftware.maf.common.bean.ResponseBodyBean; import com.jmsoftware.maf.common.domain.ValidationTestPayload; -import com.jmsoftware.maf.exercisemis.universal.service.CommonService; +import com.jmsoftware.maf.reactivespringcloudstarter.service.CommonService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; -import lombok.val; +import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; -import java.util.Map; - /** *

CommonController

*

* Change description here. * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com * @date 2/4/20 10:29 AM **/ +@Slf4j @RestController @RequiredArgsConstructor @RequestMapping("/common") @@ -28,9 +28,8 @@ public class CommonController { @GetMapping("/app-info") @ApiOperation(value = "/app-info", notes = "Retrieve application information") - public ResponseBodyBean> applicationInformation() { - val data = commonService.getApplicationInfo(); - return ResponseBodyBean.ofSuccess(data, "Succeed to retrieve app info."); + public ResponseBodyBean applicationInformation() { + return ResponseBodyBean.ofSuccess(commonService.getApplicationInfo(), "Succeed to retrieve app info."); } @PostMapping("/validation-test") diff --git a/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/filter/AccessLogFilter.java b/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/filter/AccessLogFilter.java new file mode 100644 index 00000000..2e014b21 --- /dev/null +++ b/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/filter/AccessLogFilter.java @@ -0,0 +1,55 @@ +package com.jmsoftware.maf.reactivespringcloudstarter.filter; + +import com.jmsoftware.maf.reactivespringcloudstarter.configuration.MafConfiguration; +import com.jmsoftware.maf.reactivespringcloudstarter.util.RequestUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.Ordered; +import org.springframework.http.server.reactive.ServerHttpRequest; +import org.springframework.stereotype.Component; +import org.springframework.util.AntPathMatcher; +import org.springframework.web.server.ServerWebExchange; +import org.springframework.web.server.WebFilter; +import org.springframework.web.server.WebFilterChain; +import reactor.core.publisher.Mono; + +/** + *

AccessLogFilter

+ *

+ * Change description here. + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 12/24/2020 10:56 AM + **/ +@Slf4j +@Component +@RequiredArgsConstructor +public class AccessLogFilter implements WebFilter, Ordered { + private final MafConfiguration mafConfiguration; + private final AntPathMatcher antPathMatcher = new AntPathMatcher(); + + @Override + @SuppressWarnings("NullableProblems") + public Mono filter(ServerWebExchange exchange, WebFilterChain chain) { + ServerHttpRequest request = exchange.getRequest(); + for (String ignoredUrl : mafConfiguration.flattenIgnoredUrls()) { + if (antPathMatcher.match(ignoredUrl, request.getURI().getPath())) { + return chain.filter(exchange); + } + } + // Only record non-ignored request log + log.info("{} (pre). Requester: {}, request URL: [{}] {}", + this.getClass().getSimpleName(), RequestUtil.getRequesterIpAndPort(request), request.getMethod(), + request.getURI()); + return chain.filter(exchange).then( + Mono.fromRunnable(() -> log.info("{} (post). Requester: {}, request URL: [{}] {}", + this.getClass().getSimpleName(), + RequestUtil.getRequesterIpAndPort(request), request.getMethod(), + request.getURI())) + ); + } + + @Override + public int getOrder() { + return -500; + } +} diff --git a/gateway/src/main/java/com/jmsoftware/maf/gateway/universal/configuration/ServerConfiguration.java b/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/helper/IpHelper.java similarity index 85% rename from gateway/src/main/java/com/jmsoftware/maf/gateway/universal/configuration/ServerConfiguration.java rename to reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/helper/IpHelper.java index b784a1f3..a17fe1f5 100644 --- a/gateway/src/main/java/com/jmsoftware/maf/gateway/universal/configuration/ServerConfiguration.java +++ b/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/helper/IpHelper.java @@ -1,5 +1,6 @@ -package com.jmsoftware.maf.gateway.universal.configuration; +package com.jmsoftware.maf.reactivespringcloudstarter.helper; +import com.jmsoftware.maf.reactivespringcloudstarter.configuration.MafProjectProperty; import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -21,16 +22,16 @@ *

* Change description here. * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com * @date 2019-04-26 16:02 **/ @Slf4j @Getter @Component @RequiredArgsConstructor -public class ServerConfiguration implements ApplicationListener { +public class IpHelper implements ApplicationListener { private static final String DEVELOPMENT_ENVIRONMENT = "development"; - private final ProjectProperty projectProperty; + private final MafProjectProperty mafProjectProperty; private int serverPort; @Override @@ -47,11 +48,11 @@ public void onApplicationEvent(WebServerInitializedEvent event) { * * * @return base URL - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com * @date 2019-05-03 16:05 */ public String getBaseUrl() { - return "http://" + this.getPublicIp() + ":" + serverPort + projectProperty.getContextPath(); + return "http://" + this.getPublicIp() + ":" + serverPort + mafProjectProperty.getContextPath(); } /** @@ -60,7 +61,7 @@ public String getBaseUrl() { * @return public IP */ public String getPublicIp() { - if (projectProperty.getEnvironment().contains(DEVELOPMENT_ENVIRONMENT)) { + if (mafProjectProperty.getEnvironment().contains(DEVELOPMENT_ENVIRONMENT)) { return this.getInternetIp(); } try { diff --git a/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/helper/SpringBootStartupHelper.java b/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/helper/SpringBootStartupHelper.java new file mode 100644 index 00000000..2b670582 --- /dev/null +++ b/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/helper/SpringBootStartupHelper.java @@ -0,0 +1,39 @@ +package com.jmsoftware.maf.reactivespringcloudstarter.helper; + +import com.jmsoftware.maf.reactivespringcloudstarter.configuration.MafProjectProperty; +import lombok.NonNull; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.springframework.util.StopWatch; + +import java.time.Instant; +import java.time.ZoneId; +import java.util.TimeZone; + +/** + * Description: SpringBootStartupHelper, change description here. + * + * @author 钟俊(zhongjun), email: zhongjun@toguide.cn, date: 2/10/2021 10:07 AM + **/ +@Slf4j +@Component +@RequiredArgsConstructor +public class SpringBootStartupHelper { + private static final String LINE_SEPARATOR = System.lineSeparator(); + private final MafProjectProperty mafProjectProperty; + private final IpHelper ipHelper; + + public void stop(@NonNull StopWatch stopWatch) { + stopWatch.stop(); + log.info("🥳 Congratulations! 🎉"); + log.info("🖥 {}@{} started!", mafProjectProperty.getProjectArtifactId(), mafProjectProperty.getVersion()); + log.info("⚙️ Environment: {}", mafProjectProperty.getEnvironment()); + log.info("⏳ Deployment duration: {} seconds ({} ms)", stopWatch.getTotalTimeSeconds(), + stopWatch.getTotalTimeMillis()); + log.info("⏰ App started at {} (timezone - {})", Instant.now().atZone(ZoneId.of("UTC+8")), TimeZone.getDefault().getDisplayName()); + log.info("{} App running at{} - Local: http://localhost:{}{}/{} - Network: http://{}:{}{}/", + LINE_SEPARATOR, LINE_SEPARATOR, ipHelper.getServerPort(), mafProjectProperty.getContextPath(), + LINE_SEPARATOR, ipHelper.getPublicIp(), ipHelper.getServerPort(), mafProjectProperty.getContextPath()); + } +} diff --git a/gateway/src/main/java/com/jmsoftware/maf/gateway/universal/service/CommonService.java b/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/service/CommonService.java similarity index 58% rename from gateway/src/main/java/com/jmsoftware/maf/gateway/universal/service/CommonService.java rename to reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/service/CommonService.java index ea191cbe..e2a1c3e3 100644 --- a/gateway/src/main/java/com/jmsoftware/maf/gateway/universal/service/CommonService.java +++ b/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/service/CommonService.java @@ -1,15 +1,14 @@ -package com.jmsoftware.maf.gateway.universal.service; +package com.jmsoftware.maf.reactivespringcloudstarter.service; -import com.jmsoftware.maf.gateway.universal.domain.ValidationTestPayload; - -import java.util.Map; +import cn.hutool.json.JSON; +import com.jmsoftware.maf.common.domain.ValidationTestPayload; /** *

CommonService

*

* Change description here. * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com * @date 2/4/20 11:15 AM */ public interface CommonService { @@ -18,7 +17,7 @@ public interface CommonService { * * @return the application info. */ - Map getApplicationInfo(); + JSON getApplicationInfo(); /** * Validate object. diff --git a/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/service/impl/CommonServiceImpl.java b/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/service/impl/CommonServiceImpl.java new file mode 100644 index 00000000..f21db389 --- /dev/null +++ b/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/service/impl/CommonServiceImpl.java @@ -0,0 +1,37 @@ +package com.jmsoftware.maf.reactivespringcloudstarter.service.impl; + +import cn.hutool.json.JSON; +import cn.hutool.json.JSONUtil; +import com.jmsoftware.maf.common.domain.ValidationTestPayload; +import com.jmsoftware.maf.reactivespringcloudstarter.configuration.MafProjectProperty; +import com.jmsoftware.maf.reactivespringcloudstarter.service.CommonService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import javax.validation.Valid; + +/** + *

CommonServiceImpl

+ *

+ * Change description here. + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com + * @date 2/4/20 11:16 AM + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class CommonServiceImpl implements CommonService { + private final MafProjectProperty mafProjectProperty; + + @Override + public JSON getApplicationInfo() { + return JSONUtil.parse(this.mafProjectProperty); + } + + @Override + public void validateObject(@Valid ValidationTestPayload payload) { + log.info("Validation passed! {}", payload); + } +} diff --git a/gateway/src/main/java/com/jmsoftware/maf/gateway/universal/util/RequestUtil.java b/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/util/RequestUtil.java similarity index 70% rename from gateway/src/main/java/com/jmsoftware/maf/gateway/universal/util/RequestUtil.java rename to reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/util/RequestUtil.java index 71996e6e..bdbd36a5 100644 --- a/gateway/src/main/java/com/jmsoftware/maf/gateway/universal/util/RequestUtil.java +++ b/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/util/RequestUtil.java @@ -1,4 +1,4 @@ -package com.jmsoftware.maf.gateway.universal.util; +package com.jmsoftware.maf.reactivespringcloudstarter.util; import cn.hutool.core.util.ObjectUtil; @@ -9,7 +9,7 @@ *

* Request util. * - * @author Johnny Miller (鍾俊), e-mail: johnnysviva@outlook.com + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com * @date 2/15/20 9:58 PM **/ public class RequestUtil { @@ -19,14 +19,14 @@ public class RequestUtil { * * @param request HTTP request. * @return user's IP and port information. Pattern like: IP:Port. - * @author Johnny Miller (鍾俊), e-mail: johnnysviva@outlook.com + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com * @date 2/15/20 9:52 PM */ - public static String getRequestIpAndPort(ServerHttpRequest request) { + public static String getRequesterIpAndPort(ServerHttpRequest request) { var requestRemoteAddress = request.getRemoteAddress(); if (ObjectUtil.isNotNull(requestRemoteAddress)) { return requestRemoteAddress.toString().substring(1); } - return "Unknown Request"; + return "Unknown Requester"; } } diff --git a/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/util/ResponseUtil.java b/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/util/ResponseUtil.java new file mode 100644 index 00000000..bbf7356a --- /dev/null +++ b/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/util/ResponseUtil.java @@ -0,0 +1,51 @@ +package com.jmsoftware.maf.reactivespringcloudstarter.util; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.jmsoftware.maf.common.bean.ResponseBodyBean; +import lombok.NonNull; +import lombok.SneakyThrows; +import lombok.val; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.lang.Nullable; +import org.springframework.web.server.ServerWebExchange; +import reactor.core.publisher.Mono; + +/** + * Description: ResponseUtil, change description here. + * + * @author 钟俊(zhongjun), email: zhongjun@toguide.cn, date: 12/21/2020 9:19 AM + **/ +public class ResponseUtil { + /** + * Render json mono. + * + * @param exchange the exchange + * @param httpStatus the http status + * @param message the message + * @param data the data + * @return the mono + */ + @SneakyThrows + public static Mono renderJson(@NonNull ServerWebExchange exchange, @NonNull HttpStatus httpStatus, + @Nullable String message, @Nullable Object data) { + val objectMapper = new ObjectMapper(); + exchange.getResponse().setStatusCode(httpStatus); + val response = exchange.getResponse(); + response.setStatusCode(httpStatus); + // Set HTTP header, major browsers like Chrome now comply with the specification and interpret correctly + // UTF-8 special characters without requiring a charset=UTF-8 parameter. + response.getHeaders().setContentType(MediaType.APPLICATION_JSON); + return response.writeWith(Mono.fromSupplier(() -> { + val bufferFactory = response.bufferFactory(); + val message2 = String.format("%s. %s", httpStatus.getReasonPhrase(), message); + val responseBody = ResponseBodyBean.ofStatus(httpStatus.value(), message2, data); + try { + return bufferFactory.wrap(objectMapper.writeValueAsBytes(responseBody)); + } catch (JsonProcessingException e) { + return bufferFactory.wrap(new byte[0]); + } + })); + } +} diff --git a/reactive-spring-cloud-starter/src/main/resources/META-INF/spring.factories b/reactive-spring-cloud-starter/src/main/resources/META-INF/spring.factories new file mode 100644 index 00000000..fc1b0041 --- /dev/null +++ b/reactive-spring-cloud-starter/src/main/resources/META-INF/spring.factories @@ -0,0 +1,3 @@ +# Auto Configure +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ + com.jmsoftware.maf.reactivespringcloudstarter.MafReactiveAutoConfiguration diff --git a/service-registry/README.md b/service-registry/README.md deleted file mode 100644 index 05f42234..00000000 --- a/service-registry/README.md +++ /dev/null @@ -1,67 +0,0 @@ -![Muscle and Fitness Server Social Image](https://raw.githubusercontent.com/johnnymillergh/MaterialLibrary/master/muscle-and-fitness/muscle-and-fitness-server-social-image.png) -[![GitHub release](https://img.shields.io/github/release/johnnymillergh/muscle-and-fitness-server.svg)](https://github.com/johnnymillergh/muscle-and-fitness-server/releases) -[![Build Status](https://travis-ci.com/johnnymillergh/muscle-and-fitness-server.svg?branch=master)](https://travis-ci.com/johnnymillergh/muscle-and-fitness-server) -[![GitHub issues](https://img.shields.io/github/issues/johnnymillergh/muscle-and-fitness-server)](https://github.com/johnnymillergh/muscle-and-fitness-server/issues) -[![GitHub forks](https://img.shields.io/github/forks/johnnymillergh/muscle-and-fitness-server)](https://github.com/johnnymillergh/muscle-and-fitness-server/network) -[![GitHub stars](https://img.shields.io/github/stars/johnnymillergh/muscle-and-fitness-server)](https://github.com/johnnymillergh/muscle-and-fitness-server) -[![GitHub license](https://img.shields.io/github/license/johnnymillergh/muscle-and-fitness-server)](https://github.com/johnnymillergh/muscle-and-fitness-server/blob/master/LICENSE) -[![GitHub code size in bytes](https://img.shields.io/github/languages/code-size/johnnymillergh/muscle-and-fitness-server.svg?style=popout)](https://github.com/johnnymillergh/muscle-and-fitness-server) -[![GitHub repo size](https://img.shields.io/github/repo-size/johnnymillergh/muscle-and-fitness-server.svg)](https://github.com/johnnymillergh/muscle-and-fitness-server) -[![Twitter](https://img.shields.io/twitter/url/https/github.com/johnnymillergh/muscle-and-fitness-server?style=social)](https://twitter.com/intent/tweet?text=Wow:&url=https%3A%2F%2Fgithub.com%2Fjohnnymillergh%2Fmuscle-and-fitness-server) - -# Muscle and Fitness Server :: Service Registry - -**Muscle and Fitness Server :: Service Registry**, a sub module of Muscle and Fitness Server (M&F), a service registry center for micro-services. - -[Official Docker Image](https://hub.docker.com/r/ijohnnymiller/muscle-and-fitness-server.service-registry-prod) - -## Features - -Here is the highlights of **Service Registry**: - -1. Inherited from the most modern and newest Spring frameworks: - - `org.springframework.boot:spring-boot-starter-parent` - [![Spring Boot](https://maven-badges.herokuapp.com/maven-central/org.springframework.boot/spring-boot-starter-parent/badge.svg)](https://maven-badges.herokuapp.com/maven-central/org.springframework.boot/spring-boot-starter-parent/) - `org.springframework.cloud:spring-cloud-dependencies` - [![Spring Cloud](https://maven-badges.herokuapp.com/maven-central/org.springframework.cloud/spring-cloud-dependencies/badge.svg)](https://maven-badges.herokuapp.com/maven-central/org.springframework.cloud/spring-cloud-dependencies/) - -2. Service Discovery: Eureka instances can be registered and clients can discover the instances using Spring-managed beans. - -## Usage - -1. Clone or download this project. - - ```shell - $ git clone https://github.com/johnnymillergh/exrx-net-crawler-server.git - ``` - -2. Build with newest Intellij IDEA. - -3. Click the green triangle to Run. - -## Maintainers - -[@johnnymillergh](https://github.com/johnnymillergh). - -## Contributing - -Feel free to dive in! [Open an issue](https://github.com/johnnymillergh/spring-cloud-tutorial/issues/new). - -### Contributors - -This project exists thanks to all the people who contribute. - -- Johnny Miller [[@johnnymillergh](https://github.com/johnnymillergh)] -- … - - -### Sponsors - -Support this project by becoming a sponsor. Your logo will show up here with a link to your website. [[Become a sponsor](https://become-a-sponsor.org)] - -## License - -[Apache License](https://github.com/johnnymillergh/exrx-net-crawler-server/blob/master/LICENSE) © Johnny Miller - -2020 - Present - - diff --git a/service-registry/auto-run-windows.cmd b/service-registry/auto-run-windows.cmd deleted file mode 100644 index cd3242c5..00000000 --- a/service-registry/auto-run-windows.cmd +++ /dev/null @@ -1,139 +0,0 @@ -@ECHO OFF -@REM ############################## auto-run ############################ -@REM # Author: 钟俊, date: 12:43:04 PM, Dec. 8, 2020 # -@REM # Copyright (c) 钟俊 # -@REM # Capability: Windows 10 Pro (20H2) # -@REM # Purpose: # -@REM # 1. Integrate easy and simple deployment, # -@REM # 2. Reduce memory usage of IntelliJ IDEA to run services, # -@REM # 3. Improve the efficiency of local development. # -@REM #################################################################### - -SETLOCAL EnableDelayedExpansion -@REM UTF-8 -chcp 65001 - -@REM #################### Configurable Environment Variables ################### -SET skipGitPull=true -SET skipMavenBuild=true -SET mavenActiveProfile="development-local" -SET javaParameter=-Dfile.encoding=UTF-8 -Xms256m -Xmx256m - -GOTO:MAIN - -@REM ############################# Common Functions ############################ - -@REM Log trace. -@REM %~1 Info message -:logTrace - ECHO %date% %time% TRACE - %~1% -EXIT /B 0 - -@REM Log info. -@REM %~1 Info message -:logInfo - ECHO %date% %time% INFO - %~1% -EXIT /B 0 - -@REM Log warn. -@REM %~1 Warn message -:logWarn - ECHO %date% %time% WARN - %~1% -EXIT /B 0 - -@REM Log error. -@REM %~1 Error message -:logError - ECHO %date% %time% ERROR - %~1% -EXIT /B 0 - -@REM Set terminal title. -@REM %~1 Title string -:setTerminalTitle - TITLE %~1 -EXIT /B 0 - -@REM ############################ Custom Functions ############################# - -@REM Pull the latest code of current branch from Git. -:gitPull - git pull - if %ERRORLEVEL% NEQ 0 ( - CALL :logError "Failed to execute command `Git pull`" - EXIT /B %ERRORLEVEL% - ) -EXIT /B 0 - -@REM Execute pre-build phase. -:executePreBuildPhase - CALL :logWarn "[PRE-BUILD] Active profile: %mavenActiveProfile%" - FOR /F "tokens=*" %%i IN ('git rev-parse --abbrev-ref HEAD') DO SET currentBranch=%%i - CALL :logWarn "[PRE-BUILD] Current Git branch: %currentBranch%" - if %skipGitPull% == true ( - CALL :logWarn "[PRE-BUILD] Skipped Git pull" - ) else ( - CALL :logInfo "[PRE-BUILD] Start to pull latest code from Git" - CALL :gitPull - ) - CALL :logInfo "[PRE-BUILD] Java Version Information" - CALL java -version - CALL :logInfo "[PRE-BUILD] Maven Version Information" - CALL mvn -v - CALL :logInfo "[PRE-BUILD] Current directory:" - dir -EXIT /B 0 - -@REM Execute build phase. -:executeBuildPhase - if %skipMavenBuild% == true ( - CALL :logWarn "[PRE-BUILD] Skipped Maven build" - EXIT /B 0 - ) - CALL :logInfo "[PRE-BUILD] Start to pull latest code from Git" - SET currentDirectory=%cd% - @REM Change directory to root projeject - cd .. - CALL mvn clean package --batch-mode --show-version -Dmaven.javadoc.skip=true -DskipTests=true - if %ERRORLEVEL% NEQ 0 ( - CALL :logError "[BUILD] Failed to execute Maven build" - EXIT /B %ERRORLEVEL% - ) - CALL :logInfo "[BUILD] Maven build success" - cd %currentDirectory% - dir -EXIT /B 0 - -@REM Execute run phase. -:executeRunPhase - CALL :logWarn "[RUN] Running service…" - FOR /F "tokens=*" %%i IN ('dir /B/A:- target\*.jar') DO SET jarFileName=%%i - if "%jarFileName%" == "" ( - CALL :logError "[RUN] Not found runnable JAR!" - EXIT /B 1 - ) - CALL :logWarn "[RUN] Found JAR: %jarFileName%" - CALL :setTerminalTitle %jarFileName% - SET runJarCommand=java %javaParameter% -Dspring.profiles.active=%mavenActiveProfile% -jar target\%jarFileName% - CALL :logWarn "[RUN] Execute command: %runJarCommand%" - CALL %runJarCommand% -EXIT /B 0 - -@REM ############################# MAIN Procedures ############################# -:MAIN -cls -@REM Pre-build phrase (Display version, Git pull) -CALL :executePreBuildPhase -if %ERRORLEVEL% NEQ 0 ( - CALL :logError "[PRE-BUILD] Failed to execute pre-build phase" - EXIT /B %ERRORLEVEL% -) -@REM Build phase -CALL :executeBuildPhase -if %ERRORLEVEL% NEQ 0 ( - CALL :logError "[BUILD] Failed to execute build phase" - EXIT /B %ERRORLEVEL% -) -@REM Run phase -CALL :executeRunPhase - -ENDLOCAL diff --git a/service-registry/src/main/java/com/jmsoftware/maf/serviceregistry/ServiceRegistryApplication.java b/service-registry/src/main/java/com/jmsoftware/maf/serviceregistry/ServiceRegistryApplication.java deleted file mode 100644 index cc65389d..00000000 --- a/service-registry/src/main/java/com/jmsoftware/maf/serviceregistry/ServiceRegistryApplication.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.jmsoftware.maf.serviceregistry; - -import com.jmsoftware.maf.muscleandfitnessserverspringbootstarter.helper.IpHelper; -import com.jmsoftware.maf.serviceregistry.universal.configuration.ProjectProperty; -import lombok.extern.slf4j.Slf4j; -import lombok.val; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; - -import java.time.Duration; -import java.time.Instant; -import java.util.TimeZone; - -/** - *

ServiceRegistryApplication

- *

- * Change description here. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2/14/20 10:56 AM - **/ -@Slf4j -@EnableEurekaServer -@SpringBootApplication -public class ServiceRegistryApplication { - private static final String LINE_SEPARATOR = System.lineSeparator(); - private static ProjectProperty projectProperty; - private static IpHelper ipHelper; - - public ServiceRegistryApplication(ProjectProperty projectProperty, IpHelper ipHelper) { - ServiceRegistryApplication.projectProperty = projectProperty; - ServiceRegistryApplication.ipHelper = ipHelper; - } - - public static void main(String[] args) { - val startInstant = Instant.now(); - SpringApplication.run(ServiceRegistryApplication.class, args); - val endInstant = Instant.now(); - val duration = Duration.between(startInstant, endInstant); - log.info("🥳 Congratulations! 🎉"); - log.info("🖥 {}@{} started!", projectProperty.getProjectArtifactId(), projectProperty.getVersion()); - log.info("⚙️ Environment: {}", projectProperty.getEnvironment()); - log.info("⏳ Deployment duration: {} seconds ({} ms)", duration.getSeconds(), duration.toMillis()); - log.info("⏰ App started at {} (timezone - {})", endInstant, TimeZone.getDefault().getDisplayName()); - log.info("{} App running at{} - Local: http://localhost:{}{}/{} - Network: {}/{}", - LINE_SEPARATOR, LINE_SEPARATOR, ipHelper.getServerPort(), projectProperty.getContextPath(), - LINE_SEPARATOR, ipHelper.getPublicIp(), projectProperty.getContextPath()); - } -} diff --git a/service-registry/src/main/java/com/jmsoftware/maf/serviceregistry/universal/configuration/ProjectProperty.java b/service-registry/src/main/java/com/jmsoftware/maf/serviceregistry/universal/configuration/ProjectProperty.java deleted file mode 100644 index d940ce25..00000000 --- a/service-registry/src/main/java/com/jmsoftware/maf/serviceregistry/universal/configuration/ProjectProperty.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.jmsoftware.maf.serviceregistry.universal.configuration; - -import lombok.Data; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.stereotype.Component; - -/** - *

ProjectProperty

- *

- * Change description here. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2019-04-18 13:01 - **/ -@Data -@Component -@ConfigurationProperties(prefix = "project.property") -public class ProjectProperty { - private String basePackage; - private String contextPath; - private String groupId; - private String projectParentArtifactId; - private String projectArtifactId; - private String version; - private String description; - private String jdkVersion; - private String environment; - private String url; - private String inceptionYear; - private String organizationName; - private String organizationUrl; - private String issueManagementSystem; - private String issueManagementUrl; - private String developerName; - private String developerEmail; - private String developerUrl; -} diff --git a/service-registry/src/main/java/com/jmsoftware/maf/serviceregistry/universal/configuration/Swagger2Configuration.java b/service-registry/src/main/java/com/jmsoftware/maf/serviceregistry/universal/configuration/Swagger2Configuration.java deleted file mode 100644 index 5a889b9e..00000000 --- a/service-registry/src/main/java/com/jmsoftware/maf/serviceregistry/universal/configuration/Swagger2Configuration.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.jmsoftware.maf.serviceregistry.universal.configuration; - -import lombok.RequiredArgsConstructor; -import lombok.val; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import springfox.documentation.builders.ApiInfoBuilder; -import springfox.documentation.builders.PathSelectors; -import springfox.documentation.builders.RequestHandlerSelectors; -import springfox.documentation.service.ApiInfo; -import springfox.documentation.service.Contact; -import springfox.documentation.spi.DocumentationType; -import springfox.documentation.spring.web.plugins.Docket; -import springfox.documentation.swagger2.annotations.EnableSwagger2; - -/** - *

Swagger2Configuration

- *

- * Swagger 2 Configuration - * Click me to view - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2019-02-07 16:15 - **/ -@Configuration -@EnableSwagger2 -@RequiredArgsConstructor -public class Swagger2Configuration { - private final ProjectProperty projectProperty; - private static final String LINE_SEPARATOR = System.lineSeparator(); - - @Bean - public Docket createRestApi() { - return new Docket(DocumentationType.SWAGGER_2) - .apiInfo(apiInfo()) - .select() - .apis(RequestHandlerSelectors.basePackage(projectProperty.getBasePackage())) - .paths(PathSelectors.any()) - .build(); - } - - private ApiInfo apiInfo() { - val projectArtifactId = projectProperty.getProjectArtifactId(); - val version = projectProperty.getVersion(); - val developerEmail = projectProperty.getDeveloperEmail(); - val developerUrl = projectProperty.getDeveloperUrl(); - return new ApiInfoBuilder() - .title(String.format("API for %s@%s", projectArtifactId, version)) - .description(String.format("%s %sArtifact ID: %s%sEnvironment: %s", - projectProperty.getDescription(), - LINE_SEPARATOR, - projectArtifactId, - LINE_SEPARATOR, - projectProperty.getEnvironment())) - .contact(new Contact(String.format("%s, email: %s%sHome page: %s", - projectProperty.getDeveloperName(), - developerEmail, - LINE_SEPARATOR, - developerUrl), - developerUrl, developerEmail)) - .version(version) - .build(); - } -} diff --git a/service-registry/src/main/java/com/jmsoftware/maf/serviceregistry/universal/controller/CommonController.java b/service-registry/src/main/java/com/jmsoftware/maf/serviceregistry/universal/controller/CommonController.java deleted file mode 100644 index 53e10be6..00000000 --- a/service-registry/src/main/java/com/jmsoftware/maf/serviceregistry/universal/controller/CommonController.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.jmsoftware.maf.serviceregistry.universal.controller; - -import com.jmsoftware.maf.common.bean.ResponseBodyBean; -import com.jmsoftware.maf.serviceregistry.universal.domain.ValidationTestPayload; -import com.jmsoftware.maf.serviceregistry.universal.service.CommonService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; -import lombok.val; -import org.springframework.web.bind.annotation.*; - -import java.util.Map; - -/** - *

CommonController

- *

- * Change description here. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2/4/20 10:29 AM - **/ -@RestController -@RequiredArgsConstructor -@RequestMapping("/common") -@Api(tags = {"Common Controller"}) -public class CommonController { - private final CommonService commonService; - - @GetMapping("/app-info") - @ApiOperation(value = "/app-info", notes = "Retrieve application information") - public ResponseBodyBean> applicationInformation() { - val data = commonService.getApplicationInfo(); - return ResponseBodyBean.ofSuccess(data, "Succeed to retrieve app info."); - } - - @PostMapping("/validation-test") - @ApiOperation(value = "/validation-test", notes = "Validation of request payload test") - public ResponseBodyBean validationTest(@RequestBody ValidationTestPayload payload) { - commonService.validateObject(payload); - return ResponseBodyBean.ofSuccess(payload.getName(), "validationTest()"); - } -} diff --git a/service-registry/src/main/java/com/jmsoftware/maf/serviceregistry/universal/domain/ValidationTestPayload.java b/service-registry/src/main/java/com/jmsoftware/maf/serviceregistry/universal/domain/ValidationTestPayload.java deleted file mode 100644 index 97110126..00000000 --- a/service-registry/src/main/java/com/jmsoftware/maf/serviceregistry/universal/domain/ValidationTestPayload.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.jmsoftware.maf.serviceregistry.universal.domain; - -import lombok.Data; - -import javax.validation.constraints.Min; -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; - -/** - *

ValidationTestPayload

- *

- * Change description here. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2/14/20 11:34 AM - **/ -@Data -public class ValidationTestPayload { - @NotNull - @Min(value = 1L) - private Long id; - @NotEmpty - private String name; -} diff --git a/service-registry/src/main/java/com/jmsoftware/maf/serviceregistry/universal/service/CommonService.java b/service-registry/src/main/java/com/jmsoftware/maf/serviceregistry/universal/service/CommonService.java deleted file mode 100644 index 7a6dc447..00000000 --- a/service-registry/src/main/java/com/jmsoftware/maf/serviceregistry/universal/service/CommonService.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.jmsoftware.maf.serviceregistry.universal.service; - -import com.jmsoftware.maf.serviceregistry.universal.domain.ValidationTestPayload; -import org.springframework.validation.annotation.Validated; - -import javax.validation.Valid; -import java.util.Map; - -/** - *

CommonService

- *

- * Change description here. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2/4/20 11:15 AM - */ -@Validated -public interface CommonService { - /** - * Gets application info. - * - * @return the application info. - */ - Map getApplicationInfo(); - - /** - * Validate object. - * - * @param payload the payload - */ - void validateObject(@Valid ValidationTestPayload payload); -} diff --git a/service-registry/src/main/java/com/jmsoftware/maf/serviceregistry/universal/service/impl/CommonServiceImpl.java b/service-registry/src/main/java/com/jmsoftware/maf/serviceregistry/universal/service/impl/CommonServiceImpl.java deleted file mode 100644 index 29524cbe..00000000 --- a/service-registry/src/main/java/com/jmsoftware/maf/serviceregistry/universal/service/impl/CommonServiceImpl.java +++ /dev/null @@ -1,122 +0,0 @@ -package com.jmsoftware.maf.serviceregistry.universal.service.impl; - -import com.jmsoftware.maf.serviceregistry.universal.configuration.ProjectProperty; -import com.jmsoftware.maf.serviceregistry.universal.domain.ValidationTestPayload; -import com.jmsoftware.maf.serviceregistry.universal.service.CommonService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import javax.validation.Valid; -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - *

CommonServiceImpl

- *

- * Change description here. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2/4/20 11:16 AM - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class CommonServiceImpl implements CommonService { - private final ProjectProperty projectProperty; - - @Override - public Map getApplicationInfo() { - var map = new HashMap(16); - var fieldsInfo = getFieldsInfo(projectProperty); - fieldsInfo.forEach(fieldInfo -> { - var type = fieldInfo.get("type"); - if ("class java.lang.String".equals(type)) { - map.put((String) fieldInfo.get("name"), fieldInfo.get("value")); - } - }); - return map; - } - - @Override - public void validateObject(@Valid ValidationTestPayload payload) { - log.info("Validation passed! {}", payload); - } - - /** - * Gets field value by name. - * - * @param fieldName the field name - * @param object the object - * @return the field value by name - * @see Java 中遍历一个对象的所有属性 - */ - private Object getFieldValueByName(String fieldName, Object object) { - try { - String firstLetter = fieldName.substring(0, 1).toUpperCase(); - String getter = "get" + firstLetter + fieldName.substring(1); - Method method = object.getClass().getMethod(getter); - return method.invoke(object); - } catch (Exception e) { - log.error("Can't get field's value by name! Cause: {}", e.getMessage()); - return null; - } - } - - /** - * Get filed name string [ ]. - * - * @param o the o - * @return the string [ ] - * @see Java 中遍历一个对象的所有属性 - */ - private String[] getFiledName(Object o) { - Field[] fields = o.getClass().getDeclaredFields(); - String[] fieldNames = new String[fields.length]; - for (int i = 0; i < fields.length; i++) { - log.info("fields[i].getType(): {}", fields[i].getType()); - fieldNames[i] = fields[i].getName(); - } - return fieldNames; - } - - /** - * Get Fields Info - * - * @param o the o - * @return the fields info - * @see Java 中遍历一个对象的所有属性 - */ - private List> getFieldsInfo(Object o) { - Field[] fields = o.getClass().getDeclaredFields(); - var arrayList = new ArrayList>(); - for (Field field : fields) { - var infoMap = new HashMap(16); - infoMap.put("type", field.getType().toString()); - infoMap.put("name", field.getName()); - infoMap.put("value", getFieldValueByName(field.getName(), o)); - arrayList.add(infoMap); - } - return arrayList; - } - - /** - * Get Filed Values - * - * @param o the o - * @return the object [ ] - * @see Java 中遍历一个对象的所有属性 - */ - public Object[] getFiledValues(Object o) { - String[] fieldNames = this.getFiledName(o); - Object[] value = new Object[fieldNames.length]; - for (int i = 0; i < fieldNames.length; i++) { - value[i] = this.getFieldValueByName(fieldNames[i], o); - } - return value; - } -} diff --git a/service-registry/src/main/resources/application-development-docker.yml b/service-registry/src/main/resources/application-development-docker.yml deleted file mode 100644 index 690151c5..00000000 --- a/service-registry/src/main/resources/application-development-docker.yml +++ /dev/null @@ -1,4 +0,0 @@ -eureka: - client: - service-url: - defaultZone: http://${spring.cloud.client.ip-address}:${server.port}/eureka/ diff --git a/service-registry/src/main/resources/application-development-local.yml b/service-registry/src/main/resources/application-development-local.yml deleted file mode 100644 index e1dc099e..00000000 --- a/service-registry/src/main/resources/application-development-local.yml +++ /dev/null @@ -1,4 +0,0 @@ -eureka: - client: - service-url: - defaultZone: http://localhost:${server.port}/eureka/ diff --git a/service-registry/src/main/resources/application-production.yml b/service-registry/src/main/resources/application-production.yml deleted file mode 100644 index 690151c5..00000000 --- a/service-registry/src/main/resources/application-production.yml +++ /dev/null @@ -1,4 +0,0 @@ -eureka: - client: - service-url: - defaultZone: http://${spring.cloud.client.ip-address}:${server.port}/eureka/ diff --git a/service-registry/src/main/resources/application-stage.yml b/service-registry/src/main/resources/application-stage.yml deleted file mode 100644 index 690151c5..00000000 --- a/service-registry/src/main/resources/application-stage.yml +++ /dev/null @@ -1,4 +0,0 @@ -eureka: - client: - service-url: - defaultZone: http://${spring.cloud.client.ip-address}:${server.port}/eureka/ diff --git a/service-registry/src/main/resources/application-test.yml b/service-registry/src/main/resources/application-test.yml deleted file mode 100644 index 690151c5..00000000 --- a/service-registry/src/main/resources/application-test.yml +++ /dev/null @@ -1,4 +0,0 @@ -eureka: - client: - service-url: - defaultZone: http://${spring.cloud.client.ip-address}:${server.port}/eureka/ diff --git a/service-registry/src/main/resources/application.yml b/service-registry/src/main/resources/application.yml deleted file mode 100644 index a714f59c..00000000 --- a/service-registry/src/main/resources/application.yml +++ /dev/null @@ -1,49 +0,0 @@ -server: - port: @service-registry.port@ - tomcat: - uri-encoding: @project.build.sourceEncoding@ - -spring: - application: - name: @project.artifactId@ - profiles: - active: @env@ - mvc: - throw-exception-if-no-handler-found: true - jackson: - date-format: yyyy-MM-dd HH:mm:ss - time-zone: Asia/Hong_Kong - -eureka: - instance: - prefer-ip-address: true - client: - register-with-eureka: false - fetch-registry: false - -logging: - config: classpath:configuration/logback/logback-@env@.xml - # Configure logging level of project as DEBUG to enable SQL logging and other logging. - level: - com.jmsoftware: DEBUG - -project: - property: - base-package: com.jmsoftware.maf.serviceregistry - context-path: - group-id: @project.groupId@ - project-parent-artifact-id: @project.parent.artifactId@ - project-artifact-id: @project.artifactId@ - version: @project.version@ - description: @project.description@ - jdk-version: @java.version@ - environment: ${spring.profiles.active} - url: @project.url@ - inception-year: @inceptionYear@ - organization-name: @project.organization.name@ - organization-url: @project.organization.url@ - issue-management-system: @project.issueManagement.system@ - issue-management-url: @project.issueManagement.url@ - developer-name: @developerName@ - developer-email: @developerEmail@ - developer-url: @developerUrl@ diff --git a/service-registry/src/main/resources/banner.txt b/service-registry/src/main/resources/banner.txt deleted file mode 100644 index be66ef4f..00000000 --- a/service-registry/src/main/resources/banner.txt +++ /dev/null @@ -1,27 +0,0 @@ -${AnsiStyle.BOLD}${AnsiColor.BRIGHT_GREEN} - _____ _ ____ _ __ - / ___/___ ______ __(_)_______ / __ \___ ____ _(_)____/ /________ __ - \__ \/ _ \/ ___/ | / / / ___/ _ \ / /_/ / _ \/ __ `/ / ___/ __/ ___/ / / / - ___/ / __/ / | |/ / / /__/ __/ / _, _/ __/ /_/ / (__ ) /_/ / / /_/ / -/____/\___/_/ |___/_/\___/\___/ /_/ |_|\___/\__, /_/____/\__/_/ \__, / - /____/ /____/ -${AnsiStyle.BOLD}Service Registry :: Powered by Spring Boot ::${spring-boot.formatted-version} -${AnsiColor.CYAN}Author: Johnny Miller (鍾俊), email: johnnysviva@outlook.com -${AnsiStyle.NORMAL}${AnsiColor.MAGENTA}http://patorjk.com/software/taag/#p=display&f=Slant&t=ExRx%20Net%20Crawler%20Server -${AnsiColor.BRIGHT_BLACK} --------------------------------------------Font Info------------------------------------------- -Slant by Glenn Chappell 3/93 -- based on Standard -Includes ISO Latin-1 -figlet release 2.1 -- 12 Aug 1994 -Permission is hereby given to modify this font, as long as the -modifier's name is placed on a comment line. - -Modified by Paul Burton 12/96 to include new parameter -supported by FIGlet and FIGWin. May also be slightly modified for better use -of new full-width/kern/smush alternatives, but default output is NOT changed. - -------------------------------------------Banner Info------------------------------------------ -Banner generated by Text ASCII Art Generator. -A web app that lets you type in large ASCII Art text lettering. -This can create art you can put in your email signature, on your webpage, etc etc. -More at http://patorjk.com/software/taag/ diff --git a/service-registry/src/main/resources/configuration/.empty b/service-registry/src/main/resources/configuration/.empty deleted file mode 100644 index e69de29b..00000000 diff --git a/service-registry/src/main/resources/configuration/logback/logback-base.xml b/service-registry/src/main/resources/configuration/logback/logback-base.xml deleted file mode 100644 index 65218314..00000000 --- a/service-registry/src/main/resources/configuration/logback/logback-base.xml +++ /dev/null @@ -1,70 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ${CONSOLE_LOG_PATTERN} - UTF-8 - - - - - - - ALL - ACCEPT - ACCEPT - - - - ${FILE_LOG_PATTERN} - UTF-8 - - - - - - - ${LOG_HOME}/${PROJECT_ARTIFACT_Id}${LOG_FILE_SUFFIX}.%d{yyyy-MM-dd}.%i.log.gz - - 5MB - 7 - 1GB - - - diff --git a/service-registry/src/main/resources/configuration/logback/logback-development-docker.xml b/service-registry/src/main/resources/configuration/logback/logback-development-docker.xml deleted file mode 100644 index f38e6c2d..00000000 --- a/service-registry/src/main/resources/configuration/logback/logback-development-docker.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/service-registry/src/main/resources/configuration/logback/logback-development-local.xml b/service-registry/src/main/resources/configuration/logback/logback-development-local.xml deleted file mode 100644 index f38e6c2d..00000000 --- a/service-registry/src/main/resources/configuration/logback/logback-development-local.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/service-registry/src/main/resources/configuration/logback/logback-production.xml b/service-registry/src/main/resources/configuration/logback/logback-production.xml deleted file mode 100644 index f38e6c2d..00000000 --- a/service-registry/src/main/resources/configuration/logback/logback-production.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/service-registry/src/main/resources/configuration/logback/logback-stage.xml b/service-registry/src/main/resources/configuration/logback/logback-stage.xml deleted file mode 100644 index f38e6c2d..00000000 --- a/service-registry/src/main/resources/configuration/logback/logback-stage.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/service-registry/src/main/resources/configuration/logback/logback-test.xml b/service-registry/src/main/resources/configuration/logback/logback-test.xml deleted file mode 100644 index f1916a0f..00000000 --- a/service-registry/src/main/resources/configuration/logback/logback-test.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/service-registry/src/main/resources/static/home.html b/service-registry/src/main/resources/static/home.html deleted file mode 100644 index e7599316..00000000 --- a/service-registry/src/main/resources/static/home.html +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - UNSET - - - - -

-
- Hello, World! - - Welcome to {{ projectArtifactId }}@{{ version }}! - - - - {{ applicationName }} - -
-
- Create New Person -
- - -
-
- - -
-
- - -
-
- - -
-
- - - - - - - - - - - - - - - - - -
NameAgeSexDelete
{{ person.name }}{{ person.age }}{{ person.sex }} - -
- This page is provided by - keepfool. - -
- - - - diff --git a/service-registry/src/main/resources/static/icon/favicon.ico b/service-registry/src/main/resources/static/icon/favicon.ico deleted file mode 100644 index 0798d38f..00000000 Binary files a/service-registry/src/main/resources/static/icon/favicon.ico and /dev/null differ diff --git a/service-registry/src/main/resources/static/image/muscle-and-fitness-server-social-image.png b/service-registry/src/main/resources/static/image/muscle-and-fitness-server-social-image.png deleted file mode 100644 index 83786ad8..00000000 Binary files a/service-registry/src/main/resources/static/image/muscle-and-fitness-server-social-image.png and /dev/null differ diff --git a/service-registry/src/main/resources/static/script/404.js b/service-registry/src/main/resources/static/script/404.js deleted file mode 100644 index 5401ce54..00000000 --- a/service-registry/src/main/resources/static/script/404.js +++ /dev/null @@ -1,12 +0,0 @@ -// noinspection JSUnusedGlobalSymbols -const vm = new Vue({ - el: '#app', - data: {}, - methods: { - handleClickGoToHome: function () { - const currentUrl = window.location.href; - const split = currentUrl.split('/'); - window.location.href = `${split[0]}//${split[2]}/${split[3]}`; - } - } -}); diff --git a/service-registry/src/main/resources/static/script/home.js b/service-registry/src/main/resources/static/script/home.js deleted file mode 100644 index a191d8c5..00000000 --- a/service-registry/src/main/resources/static/script/home.js +++ /dev/null @@ -1,72 +0,0 @@ -// noinspection JSUnusedGlobalSymbols -const vm = new Vue({ - el: '#app', - data: { - projectArtifactId: null, - version: null, - applicationName: null, - newPerson: { - name: '', - age: 0, - sex: 'Male' - }, - people: [{ - name: 'Jack', - age: 30, - sex: 'Male' - }, { - name: 'Bill', - age: 26, - sex: 'Male' - }, { - name: 'Tracy', - age: 22, - sex: 'Female' - }, { - name: 'Chris', - age: 36, - sex: 'Male' - }] - }, - methods: { - /** - * Create a person - */ - createPerson: function () { - this.people.push(this.newPerson); - this.newPerson = {name: '', age: 0, sex: 'Male'} - - }, - /** - * delete a person - * @param index - */ - deletePerson: function (index) { - this.people.splice(index, 1); - }, - handleClickSwaggerApiDocumentation: function () { - const currentUrl = window.location.href; - const split = currentUrl.split('/'); - window.location.href = `${split[0]}//${split[2]}/doc`; - }, - handleClickVideoDemo: function () { - const currentUrl = window.location.href; - const split = currentUrl.split('/'); - window.location.href = `${split[0]}//${split[2]}/${split[3]}/video.html`; - }, - getAppInfo: async function () { - const currentUrl = window.location.href; - const split = currentUrl.split('/'); - const baseUrl = `${split[0]}//${split[2]}`; - const response = await fetch(`${baseUrl}/common/app-info`); - const responseJson = await response.json(); - this.projectArtifactId = responseJson.data.projectArtifactId; - this.version = responseJson.data.version; - this.applicationName = this.projectArtifactId.toUpperCase(); - window.document.title = this.applicationName; - } - }, - mounted: async function () { - this.getAppInfo(); - } -}); diff --git a/service-registry/src/main/resources/static/script/video.js b/service-registry/src/main/resources/static/script/video.js deleted file mode 100644 index 3a155900..00000000 --- a/service-registry/src/main/resources/static/script/video.js +++ /dev/null @@ -1,17 +0,0 @@ -// noinspection JSUnusedGlobalSymbols -const vm = new Vue({ - el: '#app', - data: { - appInfo: null, - videoSource: '' - }, - async mounted() { - const currentUrl = window.location.href; - const split = currentUrl.split('/'); - this.videoSource = `${split[0]}//${split[2]}/${split[3]}/test-table/demo-video`; - const baseUrl = `${split[0]}//${split[2]}`; - const response = await fetch(`${baseUrl}/common/app-info`); - const responseJson = await response.json(); - this.appInfo = responseJson.data; - } -}); diff --git a/service-registry/src/main/resources/static/styles/404.css b/service-registry/src/main/resources/static/styles/404.css deleted file mode 100644 index 09a4e9bc..00000000 --- a/service-registry/src/main/resources/static/styles/404.css +++ /dev/null @@ -1,89 +0,0 @@ -* { - margin: 0; - padding: 0; - box-sizing: border-box -} - -html { - font-size: 12px; - font-family: Ubuntu, simHei, sans-serif; - font-weight: 400 -} - -body { - font-size: 1rem -} - -button { - outline: none; - padding: 5px 8px; - color: #fff; - border: 1px solid #BCBCBC; - border-radius: 3px; - background-color: #009A61; - cursor: pointer; -} - -button:hover { - opacity: 0.8; -} - -#app { - margin: 48px auto 0; - max-width: 640px; - -webkit-perspective: 500px; -} - -.text-center { - text-align: center; -} - -.message-box { - background-color: firebrick; - max-width: 700px; - padding: 20px; - border-radius: 8px; - margin: 48px auto 20px; -} - -.slide-in-bck-center { - animation: slide-in-bck-center 1.2s cubic-bezier(0.250, 0.460, 0.450, 0.940) both; -} - -@keyframes slide-in-bck-center { - 0% { - transform: translateZ(600px); - opacity: 0; - } - 100% { - transform: translateZ(0); - opacity: 1; - } -} - -.message-text { - font-size: xx-large; - text-align: center; - color: ivory; -} - -.social-image { - width: 600px; - border-radius: 8px; -} - -.message-title { - text-align: center; - display: block; - font-size: 48px; - text-shadow: black 2px 2px 6px; -} - -.server-name { - color: gold; -} - -.go-to { - display: inline-block; - margin-bottom: 6px; -} diff --git a/service-registry/src/main/resources/static/styles/home.css b/service-registry/src/main/resources/static/styles/home.css deleted file mode 100644 index 62ebe0c2..00000000 --- a/service-registry/src/main/resources/static/styles/home.css +++ /dev/null @@ -1,222 +0,0 @@ -* { - margin: 0; - padding: 0; - box-sizing: border-box -} - -html { - font-size: 12px; - font-family: Ubuntu, simHei, sans-serif; - font-weight: 400 -} - -body { - font-size: 1rem -} - -table, -td, -th { - border-collapse: collapse; - border-spacing: 0 -} - -table { - width: 100% -} - -td, -th { - border: 1px solid #bcbcbc; - padding: 5px 10px -} - -th { - background: #42b983; - font-size: 1.2rem; - font-weight: 400; - color: #fff; - cursor: pointer -} - -tr:nth-of-type(odd) { - background: #fff -} - -tr:nth-of-type(even) { - background: #eee -} - -fieldset { - border: 1px solid #BCBCBC; - padding: 15px; -} - -input { - outline: none -} - -input[type=text] { - border: 1px solid #ccc; - padding: .5rem .3rem; -} - -input[type=text]:focus { - border-color: #42b983; -} - -button { - outline: none; - padding: 5px 8px; - color: #fff; - border: 1px solid #BCBCBC; - border-radius: 3px; - background-color: #009A61; - cursor: pointer; -} - -button:hover { - opacity: 0.8; -} - -#app { - margin: 0 auto; - max-width: 640px; - -webkit-perspective: 500px; -} - -.form-group { - margin: 10px; -} - -.form-group > label { - display: inline-block; - width: 10rem; - text-align: right; -} - -.form-group > input, -.form-group > select { - display: inline-block; - height: 2.5rem; - line-height: 2.5rem; -} - -.text-center { - text-align: center; -} - -.pagination { - display: inline-block; - padding-left: 0; - margin: 21px 0; - border-radius: 3px; -} - -.pagination > li { - display: inline; -} - -.pagination > li > a { - position: relative; - float: left; - padding: 6px 12px; - line-height: 1.5; - text-decoration: none; - color: #009a61; - background-color: #fff; - border: 1px solid #ddd; - margin-left: -1px; - list-style: none; -} - -.pagination > li > a:hover { - background-color: #eee; -} - -.pagination .active { - color: #fff; - background-color: #009a61; - border-left: none; - border-right: none; -} - -.pagination .active:hover { - background: #009a61; - cursor: default; -} - -.pagination > li:first-child > a .p { - border-bottom-left-radius: 3px; - border-top-left-radius: 3px; -} - -.pagination > li:last-child > a { - border-bottom-right-radius: 3px; - border-top-right-radius: 3px; -} - -.greeting-box { - background-color: firebrick; - max-width: 700px; - padding: 20px; - border-radius: 8px; - margin: 48px auto 20px; -} - -.slide-in-bck-center { - animation: slide-in-bck-center 1.2s cubic-bezier(0.250, 0.460, 0.450, 0.940) both; -} - -@keyframes slide-in-bck-center { - 0% { - transform: translateZ(600px); - opacity: 0; - } - 100% { - transform: translateZ(0); - opacity: 1; - } -} - -.greeting-text { - font-size: xx-large; - text-align: center; - color: ivory; - display: block; -} - -.application-name { - display: inline-block; - font-weight: bold; - width: auto; - font-size: 48px; - color: rgb(7, 156, 58); - position: relative; - left: 60px; - top: 200px; - cursor: default; -} - -.social-image { - width: 600px; - border-radius: 8px; -} - -.greeting-title { - text-align: center; - display: block; - font-size: 48px; - font-weight: bold; - color: ivory; - text-shadow: black 2px 2px 6px; -} - -.server-name { - color: gold; -} - -.go-to { - display: inline-block; - margin-bottom: 6px; -} diff --git a/service-registry/src/main/resources/static/styles/video.css b/service-registry/src/main/resources/static/styles/video.css deleted file mode 100644 index 341a63f5..00000000 --- a/service-registry/src/main/resources/static/styles/video.css +++ /dev/null @@ -1,136 +0,0 @@ -* { - margin: 0; - padding: 0; - box-sizing: border-box -} - -html { - font-size: 12px; - font-family: Ubuntu, simHei, sans-serif; - font-weight: 400 -} - -body { - font-size: 1rem -} - -table, -td, -th { - border-collapse: collapse; - border-spacing: 0 -} - -table { - width: 100% -} - -td, -th { - border: 1px solid #bcbcbc; - padding: 5px 10px -} - -th { - background: #42b983; - font-size: 1.2rem; - font-weight: 400; - color: #fff; - cursor: pointer -} - -tr:nth-of-type(odd) { - background: #fff -} - -tr:nth-of-type(even) { - background: #eee -} - -fieldset { - border: 1px solid #BCBCBC; - padding: 15px; -} - -input { - outline: none -} - -input[type=text] { - border: 1px solid #ccc; - padding: .5rem .3rem; -} - -input[type=text]:focus { - border-color: #42b983; -} - -button { - outline: none; - padding: 5px 8px; - color: #fff; - border: 1px solid #BCBCBC; - border-radius: 3px; - background-color: #009A61; - cursor: pointer; -} - -button:hover { - opacity: 0.8; -} - -#app { - margin: 0 auto; - max-width: 640px; - -webkit-perspective: 500px; -} - -.greeting-box { - background-color: firebrick; - max-width: 700px; - padding: 20px; - border-radius: 8px; - margin: 48px auto 20px; -} - -.slide-in-bck-center { - animation: slide-in-bck-center 1.2s cubic-bezier(0.250, 0.460, 0.450, 0.940) both; -} - -@keyframes slide-in-bck-center { - 0% { - transform: translateZ(600px); - opacity: 0; - } - 100% { - transform: translateZ(0); - opacity: 1; - } -} - -.greeting-text { - font-size: xx-large; - text-align: center; - color: ivory; -} - -.social-image { - width: 600px; - border-radius: 8px; -} - -.greeting-title { - text-align: center; - display: block; - font-size: 48px; - text-shadow: black 2px 2px 6px; -} - -.server-name { - color: gold; -} - -.go-to { - display: inline-block; - margin-bottom: 6px; -} diff --git a/service-registry/src/main/resources/static/video.html b/service-registry/src/main/resources/static/video.html deleted file mode 100644 index 9a186caa..00000000 --- a/service-registry/src/main/resources/static/video.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - ExRx.net Crawler Server - - - - -
-
- - Hello, World! - Welcome to {{ appInfo.projectArtifactId }}@{{ appInfo.version }}! - - -
-
- - - - diff --git a/service-registry/src/test/java/com/jmsoftware/maf/serviceregistry/ServiceRegistryApplicationTests.java b/service-registry/src/test/java/com/jmsoftware/maf/serviceregistry/ServiceRegistryApplicationTests.java deleted file mode 100644 index 6ed139b3..00000000 --- a/service-registry/src/test/java/com/jmsoftware/maf/serviceregistry/ServiceRegistryApplicationTests.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.jmsoftware.maf.serviceregistry; - -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -class ServiceRegistryApplicationTests { - - @Test - void contextLoads() { - } - -} diff --git a/spring-boot-admin/auto-run-windows.cmd b/spring-boot-admin/auto-run-windows.cmd index cd3242c5..2b4a7fc1 100644 --- a/spring-boot-admin/auto-run-windows.cmd +++ b/spring-boot-admin/auto-run-windows.cmd @@ -16,8 +16,10 @@ chcp 65001 @REM #################### Configurable Environment Variables ################### SET skipGitPull=true SET skipMavenBuild=true +SET minimalJavaMajorVersion=11 +SET javaExe=C:\Users\Johnny\.sdkman\candidates\java\11.0.10.hs-adpt\bin\java.exe SET mavenActiveProfile="development-local" -SET javaParameter=-Dfile.encoding=UTF-8 -Xms256m -Xmx256m +SET javaParameter=-Xms256m -Xmx256m -Dfile.encoding=UTF-8 -Dspring.cloud.consul.host=localhost GOTO:MAIN @@ -55,6 +57,22 @@ EXIT /B 0 @REM ############################ Custom Functions ############################# +@REM Check Java major version +:checkJavaMajorVersion +CALL :logWarn "Start to Check Java major version…" +%javaExe% -version 1>nul 2>nul || ( + CALL :logError "Java is not installed!" + EXIT /B 2 +) +for /f tokens^=2-6^ delims^=.-_+^" %%j in ('%javaExe% -fullversion 2^>^&1') do set "currentJavaMajorVersion=%%j" +CALL :logWarn "Got current Java major version number: %currentJavaMajorVersion%" +if %currentJavaMajorVersion% LSS %minimalJavaMajorVersion% ( + CALL :logError "Current Java version is too low, at least OpenJDK %minimalJavaMajorVersion% is needed" + EXIT /B 1 +) +CALL :logInfo "Passed Java major version cheking" +EXIT /B 0 + @REM Pull the latest code of current branch from Git. :gitPull git pull @@ -76,7 +94,7 @@ EXIT /B 0 CALL :gitPull ) CALL :logInfo "[PRE-BUILD] Java Version Information" - CALL java -version + CALL %javaExe% -version CALL :logInfo "[PRE-BUILD] Maven Version Information" CALL mvn -v CALL :logInfo "[PRE-BUILD] Current directory:" @@ -113,7 +131,7 @@ EXIT /B 0 ) CALL :logWarn "[RUN] Found JAR: %jarFileName%" CALL :setTerminalTitle %jarFileName% - SET runJarCommand=java %javaParameter% -Dspring.profiles.active=%mavenActiveProfile% -jar target\%jarFileName% + SET runJarCommand=%javaExe% %javaParameter% -Dspring.profiles.active=%mavenActiveProfile% -jar target\%jarFileName% CALL :logWarn "[RUN] Execute command: %runJarCommand%" CALL %runJarCommand% EXIT /B 0 @@ -121,6 +139,14 @@ EXIT /B 0 @REM ############################# MAIN Procedures ############################# :MAIN cls + +@REM Check Java major version +CALL :checkJavaMajorVersion +if %ERRORLEVEL% NEQ 0 ( + CALL :logError "Failed to check Java major version!" + EXIT /B %ERRORLEVEL% +) + @REM Pre-build phrase (Display version, Git pull) CALL :executePreBuildPhase if %ERRORLEVEL% NEQ 0 ( diff --git a/spring-boot-admin/pom.xml b/spring-boot-admin/pom.xml index 73663f17..70f2f1cc 100644 --- a/spring-boot-admin/pom.xml +++ b/spring-boot-admin/pom.xml @@ -1,5 +1,5 @@ - 4.0.0 @@ -10,7 +10,7 @@ com.jmsoftware.maf muscle-and-fitness-server - 0.0.1 + 0.0.2 @@ -19,22 +19,31 @@ org.springframework.boot spring-boot-maven-plugin + + + build-info + compile + + build-info + + + com.google.cloud.tools jib-maven-plugin - 2.2.0 + ${jib-maven-plugin.version} - + buildAndPushDockerImagePhase @@ -46,8 +55,8 @@ - - openjdk:11.0.9.1-jre-slim + + adoptopenjdk/openjdk11:${adoptopenjdk11.tag} docker.io/ijohnnymiller/${project.parent.artifactId}.${project.artifactId} @@ -74,26 +83,85 @@ - org.springframework.boot - spring-boot-starter-web - - - org.springframework.cloud - spring-cloud-starter-netflix-eureka-client + com.jmsoftware.maf + spring-cloud-starter + + + org.springframework.boot + spring-boot-starter-data-redis + + + org.springframework.boot + spring-boot-starter-amqp + + + org.springframework.boot + spring-boot-starter-quartz + + + org.springframework.boot + spring-boot-starter-websocket + + + org.springframework.boot + spring-boot-starter-reactor-netty + + + org.springframework.integration + spring-integration-sftp + + + de.codecentric + spring-boot-admin-starter-client + + + com.baomidou + mybatis-plus-boot-starter + + + com.baomidou + dynamic-datasource-spring-boot-starter + + + mysql + mysql-connector-java + + + com.alibaba + druid-spring-boot-starter + + + org.apache.poi + poi + + + org.apache.poi + poi-ooxml + + + io.minio + minio + + + de.codecentric spring-boot-admin-starter-server - ${spring-boot-admin.version} + ${spring-boot-admin-starter-server.version} + - com.jmsoftware.maf - common - - - com.jmsoftware.maf - muscle-and-fitness-server-spring-boot-starter + org.springframework.boot + spring-boot-starter-test + test + + + org.junit.vintage + junit-vintage-engine + + diff --git a/spring-boot-admin/src/main/java/com/jmsoftware/maf/springbootadmin/SpringBootAdminApplication.java b/spring-boot-admin/src/main/java/com/jmsoftware/maf/springbootadmin/SpringBootAdminApplication.java index ef795313..a27b1a5a 100644 --- a/spring-boot-admin/src/main/java/com/jmsoftware/maf/springbootadmin/SpringBootAdminApplication.java +++ b/spring-boot-admin/src/main/java/com/jmsoftware/maf/springbootadmin/SpringBootAdminApplication.java @@ -1,24 +1,19 @@ package com.jmsoftware.maf.springbootadmin; -import com.jmsoftware.maf.springbootadmin.universal.configuration.ProjectProperty; -import com.jmsoftware.maf.springbootadmin.universal.configuration.ServerConfiguration; +import com.jmsoftware.maf.springcloudstarter.helper.SpringBootStartupHelper; import de.codecentric.boot.admin.server.config.EnableAdminServer; import lombok.extern.slf4j.Slf4j; -import lombok.val; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; - -import java.time.Duration; -import java.time.Instant; -import java.util.TimeZone; +import org.springframework.util.StopWatch; /** *

SpringBootAdminApplication

*

* Change description here. * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com * @date 2/14/20 3:07 PM **/ @Slf4j @@ -26,27 +21,16 @@ @EnableDiscoveryClient @SpringBootApplication public class SpringBootAdminApplication { - private static final String LINE_SEPARATOR = System.lineSeparator(); - private static ProjectProperty projectProperty; - private static ServerConfiguration serverConfiguration; + private static final StopWatch STOP_WATCH = new StopWatch(); + private static SpringBootStartupHelper springBootStartupHelper; - public SpringBootAdminApplication(ProjectProperty projectProperty, ServerConfiguration serverConfiguration) { - SpringBootAdminApplication.projectProperty = projectProperty; - SpringBootAdminApplication.serverConfiguration = serverConfiguration; + public SpringBootAdminApplication(SpringBootStartupHelper springBootStartupHelper) { + SpringBootAdminApplication.springBootStartupHelper = springBootStartupHelper; } public static void main(String[] args) { - val startInstant = Instant.now(); + STOP_WATCH.start(); SpringApplication.run(SpringBootAdminApplication.class, args); - val endInstant = Instant.now(); - val duration = Duration.between(startInstant, endInstant); - log.info("🥳 Congratulations! 🎉"); - log.info("🖥 {}@{} started!", projectProperty.getProjectArtifactId(), projectProperty.getVersion()); - log.info("⚙️ Environment: {}", projectProperty.getEnvironment()); - log.info("⏳ Deployment duration: {} seconds ({} ms)", duration.getSeconds(), duration.toMillis()); - log.info("⏰ App started at {} (timezone - {})", endInstant, TimeZone.getDefault().getDisplayName()); - log.info("{} App running at{} - Local: http://localhost:{}{}/{} - Network: {}/", - LINE_SEPARATOR, LINE_SEPARATOR, serverConfiguration.getServerPort(), projectProperty.getContextPath(), - LINE_SEPARATOR, serverConfiguration.getBaseUrl()); + springBootStartupHelper.stop(STOP_WATCH); } } diff --git a/spring-boot-admin/src/main/java/com/jmsoftware/maf/springbootadmin/universal/configuration/ProjectProperty.java b/spring-boot-admin/src/main/java/com/jmsoftware/maf/springbootadmin/universal/configuration/ProjectProperty.java deleted file mode 100644 index a83f13be..00000000 --- a/spring-boot-admin/src/main/java/com/jmsoftware/maf/springbootadmin/universal/configuration/ProjectProperty.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.jmsoftware.maf.springbootadmin.universal.configuration; - -import lombok.Data; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.stereotype.Component; - -/** - *

ProjectProperty

- *

- * Change description here. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2019-04-18 13:01 - **/ -@Data -@Component -@ConfigurationProperties(prefix = "project.property") -public class ProjectProperty { - private String basePackage; - private String contextPath; - private String groupId; - private String projectParentArtifactId; - private String projectArtifactId; - private String version; - private String description; - private String jdkVersion; - private String environment; - private String url; - private String inceptionYear; - private String organizationName; - private String organizationUrl; - private String issueManagementSystem; - private String issueManagementUrl; - private String developerName; - private String developerEmail; - private String developerUrl; -} diff --git a/spring-boot-admin/src/main/java/com/jmsoftware/maf/springbootadmin/universal/configuration/ServerConfiguration.java b/spring-boot-admin/src/main/java/com/jmsoftware/maf/springbootadmin/universal/configuration/ServerConfiguration.java deleted file mode 100644 index f86dee9c..00000000 --- a/spring-boot-admin/src/main/java/com/jmsoftware/maf/springbootadmin/universal/configuration/ServerConfiguration.java +++ /dev/null @@ -1,118 +0,0 @@ -package com.jmsoftware.maf.springbootadmin.universal.configuration; - -import lombok.Getter; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import lombok.val; -import org.springframework.boot.web.context.WebServerInitializedEvent; -import org.springframework.context.ApplicationListener; -import org.springframework.stereotype.Component; - -import java.io.BufferedReader; -import java.io.InputStreamReader; -import java.net.Inet4Address; -import java.net.InetAddress; -import java.net.NetworkInterface; -import java.net.URL; -import java.util.Enumeration; - -/** - *

ServerConfiguration

- *

- * Change description here. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2019-04-26 16:02 - **/ -@Slf4j -@Getter -@Component -@RequiredArgsConstructor -public class ServerConfiguration implements ApplicationListener { - private static final String DEVELOPMENT_ENVIRONMENT = "development"; - private final ProjectProperty projectProperty; - private int serverPort; - - @Override - public void onApplicationEvent(WebServerInitializedEvent event) { - this.serverPort = event.getWebServer().getPort(); - } - - /** - *

Get base URL of backend server.

- *

The result will be like:

- *
    - *
  1. http://[serverIp]:[serverPort]/[contextPath]
  2. - *
  3. https://[serverIp]/[contextPath]
  4. - *
- * - * @return base URL - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2019-05-03 16:05 - */ - public String getBaseUrl() { - return "http://" + this.getPublicIp() + ":" + serverPort + projectProperty.getContextPath(); - } - - /** - * Find public IP address. - * - * @return public IP - */ - public String getPublicIp() { - if (projectProperty.getEnvironment().contains(DEVELOPMENT_ENVIRONMENT)) { - return this.getInternetIp(); - } - try { - // An API provided by https://whatismyipaddress.com/api - val url = new URL("https://ipv4bot.whatismyipaddress.com/"); - val sc = new BufferedReader(new InputStreamReader(url.openStream())); - // Read system IP Address - return sc.readLine().trim(); - } catch (Exception e) { - log.error("Cannot execute properly to get IP address from https://whatismyipaddress.com/api", e); - } - return this.getInternetIp(); - } - - /** - * Get internet IP. - * - * @return internet IP - */ - private String getInternetIp() { - val intranetIp = this.getIntranetIp(); - try { - val networks = NetworkInterface.getNetworkInterfaces(); - InetAddress ip; - Enumeration addresses; - while (networks.hasMoreElements()) { - addresses = networks.nextElement().getInetAddresses(); - while (addresses.hasMoreElements()) { - ip = addresses.nextElement(); - if (ip instanceof Inet4Address - && ip.isSiteLocalAddress() - && !ip.getHostAddress().equals(intranetIp)) { - return ip.getHostAddress(); - } - } - } - return intranetIp; - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - /** - * Get intranet IP. - * - * @return intranet IP - */ - private String getIntranetIp() { - try { - return InetAddress.getLocalHost().getHostAddress(); - } catch (Exception e) { - throw new RuntimeException(e); - } - } -} diff --git a/spring-boot-admin/src/main/java/com/jmsoftware/maf/springbootadmin/universal/configuration/Swagger2Configuration.java b/spring-boot-admin/src/main/java/com/jmsoftware/maf/springbootadmin/universal/configuration/Swagger2Configuration.java deleted file mode 100644 index e92170ac..00000000 --- a/spring-boot-admin/src/main/java/com/jmsoftware/maf/springbootadmin/universal/configuration/Swagger2Configuration.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.jmsoftware.maf.springbootadmin.universal.configuration; - -import lombok.RequiredArgsConstructor; -import lombok.val; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import springfox.documentation.builders.ApiInfoBuilder; -import springfox.documentation.builders.PathSelectors; -import springfox.documentation.builders.RequestHandlerSelectors; -import springfox.documentation.service.ApiInfo; -import springfox.documentation.service.Contact; -import springfox.documentation.spi.DocumentationType; -import springfox.documentation.spring.web.plugins.Docket; -import springfox.documentation.swagger2.annotations.EnableSwagger2; - -/** - *

Swagger2Configuration

- *

- * Swagger 2 Configuration - * Click me to view - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2019-02-07 16:15 - **/ -@Configuration -@EnableSwagger2 -@RequiredArgsConstructor -public class Swagger2Configuration { - private final ProjectProperty projectProperty; - private static final String LINE_SEPARATOR = System.lineSeparator(); - - @Bean - public Docket createRestApi() { - return new Docket(DocumentationType.SWAGGER_2) - .apiInfo(apiInfo()) - .select() - .apis(RequestHandlerSelectors.basePackage(projectProperty.getBasePackage())) - .paths(PathSelectors.any()) - .build(); - } - - private ApiInfo apiInfo() { - val projectArtifactId = projectProperty.getProjectArtifactId(); - val version = projectProperty.getVersion(); - val developerEmail = projectProperty.getDeveloperEmail(); - val developerUrl = projectProperty.getDeveloperUrl(); - return new ApiInfoBuilder() - .title(String.format("API for %s@%s", projectArtifactId, version)) - .description(String.format("%s %sArtifact ID: %s%sEnvironment: %s", - projectProperty.getDescription(), - LINE_SEPARATOR, - projectArtifactId, - LINE_SEPARATOR, - projectProperty.getEnvironment())) - .contact(new Contact(String.format("%s, email: %s%sHome page: %s", - projectProperty.getDeveloperName(), - developerEmail, - LINE_SEPARATOR, - developerUrl), - developerUrl, developerEmail)) - .version(version) - .build(); - } -} diff --git a/spring-boot-admin/src/main/java/com/jmsoftware/maf/springbootadmin/universal/configuration/WebMvcConfiguration.java b/spring-boot-admin/src/main/java/com/jmsoftware/maf/springbootadmin/universal/configuration/WebMvcConfiguration.java deleted file mode 100644 index fc5eea6b..00000000 --- a/spring-boot-admin/src/main/java/com/jmsoftware/maf/springbootadmin/universal/configuration/WebMvcConfiguration.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.jmsoftware.maf.springbootadmin.universal.configuration; - -import lombok.RequiredArgsConstructor; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.servlet.config.annotation.CorsRegistry; -import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; - -/** - *

WebMvcConfiguration

- *

- * Spring MVC Configurations. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 1/23/20 9:02 AM - **/ -@Configuration -@RequiredArgsConstructor -public class WebMvcConfiguration implements WebMvcConfigurer { - private static final long MAX_AGE_SECS = 3600; - - /** - * 1. Config static path pattern - * 2. Config static resource location - * - * @param registry static resources register - */ - @Override - public void addResourceHandlers(ResourceHandlerRegistry registry) { - registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/"); - } - - /** - * Configure cross origin requests processing. - * - * @param registry CORS registry - */ - @Override - public void addCorsMappings(CorsRegistry registry) { - registry.addMapping("/**") - .allowedOrigins("*") - .allowedMethods("HEAD", "OPTIONS", "GET", "POST", "PUT", "PATCH", "DELETE") - .maxAge(MAX_AGE_SECS); - } -} diff --git a/spring-boot-admin/src/main/java/com/jmsoftware/maf/springbootadmin/universal/controller/CommonController.java b/spring-boot-admin/src/main/java/com/jmsoftware/maf/springbootadmin/universal/controller/CommonController.java deleted file mode 100644 index 3824d2eb..00000000 --- a/spring-boot-admin/src/main/java/com/jmsoftware/maf/springbootadmin/universal/controller/CommonController.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.jmsoftware.maf.springbootadmin.universal.controller; - -import com.jmsoftware.maf.common.bean.ResponseBodyBean; -import com.jmsoftware.maf.springbootadmin.universal.domain.ValidationTestPayload; -import com.jmsoftware.maf.springbootadmin.universal.service.CommonService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; -import lombok.val; -import org.springframework.web.bind.annotation.*; - -import java.util.Map; - -/** - *

CommonController

- *

- * Change description here. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2/4/20 10:29 AM - **/ -@RestController -@RequiredArgsConstructor -@RequestMapping("/common") -@Api(tags = {"Common Controller"}) -public class CommonController { - private final CommonService commonService; - - @GetMapping("/app-info") - @ApiOperation(value = "/app-info", notes = "Retrieve application information") - public ResponseBodyBean> applicationInformation() { - val data = commonService.getApplicationInfo(); - return ResponseBodyBean.ofSuccess(data, "Succeed to retrieve app info."); - } - - @PostMapping("/validation-test") - @ApiOperation(value = "/validation-test", notes = "Validation of request payload test") - public ResponseBodyBean validationTest(@RequestBody ValidationTestPayload payload) { - commonService.validateObject(payload); - return ResponseBodyBean.ofSuccess(payload.getName(), "validationTest()"); - } -} diff --git a/spring-boot-admin/src/main/java/com/jmsoftware/maf/springbootadmin/universal/controller/ErrorController.java b/spring-boot-admin/src/main/java/com/jmsoftware/maf/springbootadmin/universal/controller/ErrorController.java deleted file mode 100644 index 1000d4c4..00000000 --- a/spring-boot-admin/src/main/java/com/jmsoftware/maf/springbootadmin/universal/controller/ErrorController.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.jmsoftware.maf.springbootadmin.universal.controller; - -import io.swagger.annotations.Api; -import lombok.extern.slf4j.Slf4j; -import lombok.val; -import org.springframework.boot.autoconfigure.web.ServerProperties; -import org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController; -import org.springframework.boot.autoconfigure.web.servlet.error.ErrorViewResolver; -import org.springframework.boot.web.servlet.error.ErrorAttributes; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.RestController; - -import javax.servlet.http.HttpServletRequest; -import java.util.List; -import java.util.Map; -import java.util.Optional; - -/** - *

ErrorController

- *

- * Error controller. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2019-03-02 16:56 - **/ -@Slf4j -@RestController -@Api(tags = {"Error Controller"}) -public class ErrorController extends BasicErrorController { - public ErrorController(ErrorAttributes errorAttributes, - ServerProperties serverProperties, - List errorViewResolvers) { - super(errorAttributes, serverProperties.getError(), errorViewResolvers); - } - - @Override - public ResponseEntity> error(HttpServletRequest request) { - val httpStatus = getStatus(request); - val body = getErrorAttributes(request, isIncludeStackTrace(request, MediaType.ALL)); - body.put("message", httpStatus.getReasonPhrase()); - val optionalTrace = Optional.ofNullable(body.get("trace")); - optionalTrace.ifPresent(trace -> { - val message = body.get("message"); - val firstLineOfTrace = trace.toString().split("\\n")[0]; - val joinedMessage = String.format("%s %s", message, firstLineOfTrace); - body.put("message", joinedMessage); - body.put("trace", "Trace has been simplified. Refer to 'message'"); - }); - log.error("Captured HTTP request error. Response body = {}", body); - return new ResponseEntity<>(body, httpStatus); - } -} diff --git a/spring-boot-admin/src/main/java/com/jmsoftware/maf/springbootadmin/universal/domain/ValidationTestPayload.java b/spring-boot-admin/src/main/java/com/jmsoftware/maf/springbootadmin/universal/domain/ValidationTestPayload.java deleted file mode 100644 index 770783e1..00000000 --- a/spring-boot-admin/src/main/java/com/jmsoftware/maf/springbootadmin/universal/domain/ValidationTestPayload.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.jmsoftware.maf.springbootadmin.universal.domain; - -import lombok.Data; - -import javax.validation.constraints.Min; -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; - -/** - *

ValidationTestPayload

- *

- * Change description here. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2/14/20 11:34 AM - **/ -@Data -public class ValidationTestPayload { - @NotNull - @Min(value = 1L) - private Long id; - @NotEmpty - private String name; -} diff --git a/spring-boot-admin/src/main/java/com/jmsoftware/maf/springbootadmin/universal/service/CommonService.java b/spring-boot-admin/src/main/java/com/jmsoftware/maf/springbootadmin/universal/service/CommonService.java deleted file mode 100644 index fb7d830f..00000000 --- a/spring-boot-admin/src/main/java/com/jmsoftware/maf/springbootadmin/universal/service/CommonService.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.jmsoftware.maf.springbootadmin.universal.service; - -import com.jmsoftware.maf.springbootadmin.universal.domain.ValidationTestPayload; -import org.springframework.validation.annotation.Validated; - -import javax.validation.Valid; -import java.util.Map; - -/** - *

CommonService

- *

- * Change description here. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2/4/20 11:15 AM - */ -@Validated -public interface CommonService { - /** - * Gets application info. - * - * @return the application info. - */ - Map getApplicationInfo(); - - /** - * Validate object. - * - * @param payload the payload - */ - void validateObject(@Valid ValidationTestPayload payload); -} diff --git a/spring-boot-admin/src/main/java/com/jmsoftware/maf/springbootadmin/universal/service/impl/CommonServiceImpl.java b/spring-boot-admin/src/main/java/com/jmsoftware/maf/springbootadmin/universal/service/impl/CommonServiceImpl.java deleted file mode 100644 index e4d7f1c7..00000000 --- a/spring-boot-admin/src/main/java/com/jmsoftware/maf/springbootadmin/universal/service/impl/CommonServiceImpl.java +++ /dev/null @@ -1,122 +0,0 @@ -package com.jmsoftware.maf.springbootadmin.universal.service.impl; - -import com.jmsoftware.maf.springbootadmin.universal.configuration.ProjectProperty; -import com.jmsoftware.maf.springbootadmin.universal.domain.ValidationTestPayload; -import com.jmsoftware.maf.springbootadmin.universal.service.CommonService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import javax.validation.Valid; -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - *

CommonServiceImpl

- *

- * Change description here. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2/4/20 11:16 AM - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class CommonServiceImpl implements CommonService { - private final ProjectProperty projectProperty; - - @Override - public Map getApplicationInfo() { - var map = new HashMap(16); - var fieldsInfo = getFieldsInfo(projectProperty); - fieldsInfo.forEach(fieldInfo -> { - var type = fieldInfo.get("type"); - if ("class java.lang.String".equals(type)) { - map.put((String) fieldInfo.get("name"), fieldInfo.get("value")); - } - }); - return map; - } - - @Override - public void validateObject(@Valid ValidationTestPayload payload) { - log.info("Validation passed! {}", payload); - } - - /** - * Gets field value by name. - * - * @param fieldName the field name - * @param object the object - * @return the field value by name - * @see Java 中遍历一个对象的所有属性 - */ - private Object getFieldValueByName(String fieldName, Object object) { - try { - String firstLetter = fieldName.substring(0, 1).toUpperCase(); - String getter = "get" + firstLetter + fieldName.substring(1); - Method method = object.getClass().getMethod(getter); - return method.invoke(object); - } catch (Exception e) { - log.error("Can't get field's value by name! Cause: {}", e.getMessage()); - return null; - } - } - - /** - * Get filed name string [ ]. - * - * @param o the o - * @return the string [ ] - * @see Java 中遍历一个对象的所有属性 - */ - private String[] getFiledName(Object o) { - Field[] fields = o.getClass().getDeclaredFields(); - String[] fieldNames = new String[fields.length]; - for (int i = 0; i < fields.length; i++) { - log.info("fields[i].getType(): {}", fields[i].getType()); - fieldNames[i] = fields[i].getName(); - } - return fieldNames; - } - - /** - * Get Fields Info - * - * @param o the o - * @return the fields info - * @see Java 中遍历一个对象的所有属性 - */ - private List> getFieldsInfo(Object o) { - Field[] fields = o.getClass().getDeclaredFields(); - var arrayList = new ArrayList>(); - for (Field field : fields) { - var infoMap = new HashMap(16); - infoMap.put("type", field.getType().toString()); - infoMap.put("name", field.getName()); - infoMap.put("value", getFieldValueByName(field.getName(), o)); - arrayList.add(infoMap); - } - return arrayList; - } - - /** - * Get Filed Values - * - * @param o the o - * @return the object [ ] - * @see Java 中遍历一个对象的所有属性 - */ - public Object[] getFiledValues(Object o) { - String[] fieldNames = this.getFiledName(o); - Object[] value = new Object[fieldNames.length]; - for (int i = 0; i < fieldNames.length; i++) { - value[i] = this.getFieldValueByName(fieldNames[i], o); - } - return value; - } -} diff --git a/spring-boot-admin/src/main/resources/application-development-docker.yml b/spring-boot-admin/src/main/resources/application-development-docker.yml index c594f079..9816783e 100644 --- a/spring-boot-admin/src/main/resources/application-development-docker.yml +++ b/spring-boot-admin/src/main/resources/application-development-docker.yml @@ -1,4 +1,5 @@ -eureka: - client: - serviceUrl: - defaultZone: http://maf.service-registry.dev:8760/eureka/ +spring: + devtools: + add-properties: true + zipkin: + base-url: http://maf-zipkin:9411 diff --git a/spring-boot-admin/src/main/resources/application-development-local.yml b/spring-boot-admin/src/main/resources/application-development-local.yml index 3dbb1d17..e565a413 100644 --- a/spring-boot-admin/src/main/resources/application-development-local.yml +++ b/spring-boot-admin/src/main/resources/application-development-local.yml @@ -1,4 +1,5 @@ -eureka: - client: - serviceUrl: - defaultZone: http://localhost:8760/eureka/ +spring: + devtools: + add-properties: true + zipkin: + base-url: http://localhost:9411 diff --git a/spring-boot-admin/src/main/resources/application-production.yml b/spring-boot-admin/src/main/resources/application-production.yml index 57057aea..dc23ad3d 100644 --- a/spring-boot-admin/src/main/resources/application-production.yml +++ b/spring-boot-admin/src/main/resources/application-production.yml @@ -1,4 +1,5 @@ -eureka: - client: - serviceUrl: - defaultZone: http://172.16.4.20:8760/eureka/ +spring: + devtools: + add-properties: false + zipkin: + base-url: http://maf-zipkin:9411 diff --git a/spring-boot-admin/src/main/resources/application-stage.yml b/spring-boot-admin/src/main/resources/application-stage.yml index e886b05f..dc23ad3d 100644 --- a/spring-boot-admin/src/main/resources/application-stage.yml +++ b/spring-boot-admin/src/main/resources/application-stage.yml @@ -1,4 +1,5 @@ -eureka: - client: - serviceUrl: - defaultZone: http://172.16.3.20:8760/eureka/ +spring: + devtools: + add-properties: false + zipkin: + base-url: http://maf-zipkin:9411 diff --git a/spring-boot-admin/src/main/resources/application-test.yml b/spring-boot-admin/src/main/resources/application-test.yml index 0e84171a..dc23ad3d 100644 --- a/spring-boot-admin/src/main/resources/application-test.yml +++ b/spring-boot-admin/src/main/resources/application-test.yml @@ -1,4 +1,5 @@ -eureka: - client: - serviceUrl: - defaultZone: http://172.16.2.20:8760/eureka/ +spring: + devtools: + add-properties: false + zipkin: + base-url: http://maf-zipkin:9411 diff --git a/spring-boot-admin/src/main/resources/application.yml b/spring-boot-admin/src/main/resources/application.yml index 953fe539..76717b92 100644 --- a/spring-boot-admin/src/main/resources/application.yml +++ b/spring-boot-admin/src/main/resources/application.yml @@ -2,8 +2,16 @@ server: port: @spring-boot-admin.port@ tomcat: uri-encoding: @project.build.sourceEncoding@ + shutdown: GRACEFUL + servlet: + context-path: spring: + boot: + admin: + discovery: + ignored-services: + - "consul" application: name: @project.artifactId@ profiles: @@ -13,19 +21,19 @@ spring: jackson: date-format: yyyy-MM-dd HH:mm:ss time-zone: Asia/Hong_Kong - -eureka: - instance: - leaseRenewalIntervalInSeconds: 10 - health-check-url-path: /actuator/health - status-page-url-path: / - metadata-map: - # needed to trigger info and endpoint update after restart - startup: ${random.int} - instance-id: ${spring.cloud.client.ip-address}:${server.port}@${spring.cloud.client.hostname}@${spring.application.name}-${random.int} - prefer-ip-address: true - client: - registryFetchIntervalSeconds: 5 + sleuth: + sampler: + probability: 1.0 + cloud: + consul: + discovery: + register: true + instance-id: ${spring.application.name}-${spring.cloud.client.hostname}-${vcap.application.instance_id:${spring.application.instance_id:${random.value}}} + service-name: ${spring.application.name} + port: ${server.port} + prefer-ip-address: true + ip-address: ${spring.cloud.client.ip-address} + health-check-critical-timeout: 15s management: endpoints: @@ -37,22 +45,19 @@ management: show-details: ALWAYS logging: - config: classpath:configuration/logback/logback-@env@.xml - # Configure logging level of project as DEBUG to enable SQL logging and other logging. - level: - com.jmsoftware: DEBUG + config: classpath:logback-configuration/logback-${spring.profiles.active}.xml -project: - property: - base-package: com.jmsoftware.maf.gateway - context-path: +maf: + project-property: + base-package: @project.groupId@ + context-path: ${server.servlet.context-path} group-id: @project.groupId@ project-parent-artifact-id: @project.parent.artifactId@ project-artifact-id: @project.artifactId@ version: @project.version@ description: @project.description@ jdk-version: @java.version@ - environment: @env@ + environment: ${spring.profiles.active} url: @project.url@ inception-year: @inceptionYear@ organization-name: @project.organization.name@ @@ -62,3 +67,15 @@ project: developer-name: @developerName@ developer-email: @developerEmail@ developer-url: @developerUrl@ + configuration: + ignored-url: + pattern: + - "/static/**" + - "/actuator/**" + - "/druid/**" + - "/swagger-resources/**" + - "/v2/api-docs/**" + - "/*/v2/api-docs/**" + - "/webjars/**" + - "/doc.html" + included-package-for-http-api-scan: ${maf.project-property.base-package} diff --git a/spring-boot-admin/src/main/resources/banner.txt b/spring-boot-admin/src/main/resources/banner.txt index 835a3894..5c4c80f2 100644 --- a/spring-boot-admin/src/main/resources/banner.txt +++ b/spring-boot-admin/src/main/resources/banner.txt @@ -6,7 +6,7 @@ ${AnsiStyle.BOLD}${AnsiColor.BRIGHT_GREEN} /____/ .___/_/ /_/_/ /_/\__, / /_____/\____/\____/\__/ /_/ |_\__,_/_/ /_/ /_/_/_/ /_/ /_/ /____/ ${AnsiStyle.BOLD}Spring Boot Admin :: Powered by Spring Boot ::${spring-boot.formatted-version} -${AnsiColor.CYAN}Author: Johnny Miller (鍾俊), email: johnnysviva@outlook.com +${AnsiColor.CYAN}Author: Johnny Miller (锺俊), email: johnnysviva@outlook.com ${AnsiStyle.NORMAL}${AnsiColor.MAGENTA}http://patorjk.com/software/taag/#p=display&f=Slant&t=Spring%20Boot%20Admin ${AnsiColor.BRIGHT_BLACK} -------------------------------------------Font Info------------------------------------------- diff --git a/spring-boot-admin/src/main/resources/bootstrap.yml b/spring-boot-admin/src/main/resources/bootstrap.yml new file mode 100644 index 00000000..79e3552f --- /dev/null +++ b/spring-boot-admin/src/main/resources/bootstrap.yml @@ -0,0 +1,18 @@ +spring: + application: + name: @project.artifactId@ + cloud: + consul: + host: "should-be-passed-by-java-opts" + port: 8500 + config: + enabled: true + prefix: config + # `default-context` should be equal to Spring application name + default-context: @project.artifactId@ + profile-separator: "::" + format: YAML + data-key: "data" + watch: + enabled: true + delay: 1000 diff --git a/spring-boot-admin/src/main/resources/configuration/.empty b/spring-boot-admin/src/main/resources/configuration/.empty deleted file mode 100644 index e69de29b..00000000 diff --git a/spring-boot-admin/src/main/resources/configuration/logback/logback-base.xml b/spring-boot-admin/src/main/resources/configuration/logback/logback-base.xml deleted file mode 100644 index b8f2bb0a..00000000 --- a/spring-boot-admin/src/main/resources/configuration/logback/logback-base.xml +++ /dev/null @@ -1,70 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ${CONSOLE_LOG_PATTERN} - UTF-8 - - - - - - - ALL - ACCEPT - ACCEPT - - - - ${FILE_LOG_PATTERN} - UTF-8 - - - - - - - ${LOG_HOME}/${PROJECT_ARTIFACT_Id}${LOG_FILE_SUFFIX}.%d{yyyy-MM-dd}.%i.log.gz - - 5MB - 7 - 1GB - - - diff --git a/spring-boot-admin/src/main/resources/configuration/logback/logback-development-docker.xml b/spring-boot-admin/src/main/resources/configuration/logback/logback-development-docker.xml deleted file mode 100644 index f38e6c2d..00000000 --- a/spring-boot-admin/src/main/resources/configuration/logback/logback-development-docker.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/spring-boot-admin/src/main/resources/configuration/logback/logback-development-local.xml b/spring-boot-admin/src/main/resources/configuration/logback/logback-development-local.xml deleted file mode 100644 index f38e6c2d..00000000 --- a/spring-boot-admin/src/main/resources/configuration/logback/logback-development-local.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/spring-boot-admin/src/main/resources/configuration/logback/logback-production.xml b/spring-boot-admin/src/main/resources/configuration/logback/logback-production.xml deleted file mode 100644 index f38e6c2d..00000000 --- a/spring-boot-admin/src/main/resources/configuration/logback/logback-production.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/spring-boot-admin/src/main/resources/configuration/logback/logback-stage.xml b/spring-boot-admin/src/main/resources/configuration/logback/logback-stage.xml deleted file mode 100644 index f38e6c2d..00000000 --- a/spring-boot-admin/src/main/resources/configuration/logback/logback-stage.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/spring-boot-admin/src/main/resources/configuration/logback/logback-test.xml b/spring-boot-admin/src/main/resources/configuration/logback/logback-test.xml deleted file mode 100644 index f1916a0f..00000000 --- a/spring-boot-admin/src/main/resources/configuration/logback/logback-test.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/exercise-mis/src/main/resources/configuration/logback/logback-base.xml b/spring-boot-admin/src/main/resources/logback-configuration/logback-base.xml similarity index 69% rename from exercise-mis/src/main/resources/configuration/logback/logback-base.xml rename to spring-boot-admin/src/main/resources/logback-configuration/logback-base.xml index 4c34946d..1629f54f 100644 --- a/exercise-mis/src/main/resources/configuration/logback/logback-base.xml +++ b/spring-boot-admin/src/main/resources/logback-configuration/logback-base.xml @@ -10,7 +10,7 @@ converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/> - + - + + - + + - + + - + + - + + @@ -60,11 +65,19 @@ - ${LOG_HOME}/${PROJECT_ARTIFACT_Id}${LOG_FILE_SUFFIX}.%d{yyyy-MM-dd}.%i.log.gz + ${LOG_HOME}/${APPLICATION}-${ENVIRONMENT}-${HOSTNAME}.%d{yyyy-MM-dd}.%i.log.gz 5MB 7 1GB + + + + ${LOGSTASH_HOST}:4560 + + {"applicationName": "${APPLICATION}", "environment": "${ENVIRONMENT}"} + + diff --git a/spring-boot-admin/src/main/resources/logback-configuration/logback-development-docker.xml b/spring-boot-admin/src/main/resources/logback-configuration/logback-development-docker.xml new file mode 100644 index 00000000..86b71ee2 --- /dev/null +++ b/spring-boot-admin/src/main/resources/logback-configuration/logback-development-docker.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/spring-boot-admin/src/main/resources/logback-configuration/logback-development-local.xml b/spring-boot-admin/src/main/resources/logback-configuration/logback-development-local.xml new file mode 100644 index 00000000..86b71ee2 --- /dev/null +++ b/spring-boot-admin/src/main/resources/logback-configuration/logback-development-local.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/spring-boot-admin/src/main/resources/logback-configuration/logback-production.xml b/spring-boot-admin/src/main/resources/logback-configuration/logback-production.xml new file mode 100644 index 00000000..86b71ee2 --- /dev/null +++ b/spring-boot-admin/src/main/resources/logback-configuration/logback-production.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/spring-boot-admin/src/main/resources/logback-configuration/logback-stage.xml b/spring-boot-admin/src/main/resources/logback-configuration/logback-stage.xml new file mode 100644 index 00000000..86b71ee2 --- /dev/null +++ b/spring-boot-admin/src/main/resources/logback-configuration/logback-stage.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/spring-boot-admin/src/main/resources/logback-configuration/logback-test.xml b/spring-boot-admin/src/main/resources/logback-configuration/logback-test.xml new file mode 100644 index 00000000..3c705245 --- /dev/null +++ b/spring-boot-admin/src/main/resources/logback-configuration/logback-test.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/spring-boot-admin/src/main/resources/static/home.html b/spring-boot-admin/src/main/resources/static/home.html deleted file mode 100644 index e7599316..00000000 --- a/spring-boot-admin/src/main/resources/static/home.html +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - UNSET - - - - -

-
- Hello, World! - - Welcome to {{ projectArtifactId }}@{{ version }}! - - - - {{ applicationName }} - -
-
- Create New Person -
- - -
-
- - -
-
- - -
-
- - -
-
- - - - - - - - - - - - - - - - - -
NameAgeSexDelete
{{ person.name }}{{ person.age }}{{ person.sex }} - -
- This page is provided by - keepfool. - -
- - - - diff --git a/spring-boot-admin/src/main/resources/static/icon/favicon.ico b/spring-boot-admin/src/main/resources/static/icon/favicon.ico deleted file mode 100644 index 0798d38f..00000000 Binary files a/spring-boot-admin/src/main/resources/static/icon/favicon.ico and /dev/null differ diff --git a/spring-boot-admin/src/main/resources/static/image/muscle-and-fitness-server-social-image.png b/spring-boot-admin/src/main/resources/static/image/muscle-and-fitness-server-social-image.png deleted file mode 100644 index 83786ad8..00000000 Binary files a/spring-boot-admin/src/main/resources/static/image/muscle-and-fitness-server-social-image.png and /dev/null differ diff --git a/spring-boot-admin/src/main/resources/static/script/404.js b/spring-boot-admin/src/main/resources/static/script/404.js deleted file mode 100644 index 5401ce54..00000000 --- a/spring-boot-admin/src/main/resources/static/script/404.js +++ /dev/null @@ -1,12 +0,0 @@ -// noinspection JSUnusedGlobalSymbols -const vm = new Vue({ - el: '#app', - data: {}, - methods: { - handleClickGoToHome: function () { - const currentUrl = window.location.href; - const split = currentUrl.split('/'); - window.location.href = `${split[0]}//${split[2]}/${split[3]}`; - } - } -}); diff --git a/spring-boot-admin/src/main/resources/static/script/home.js b/spring-boot-admin/src/main/resources/static/script/home.js deleted file mode 100644 index a191d8c5..00000000 --- a/spring-boot-admin/src/main/resources/static/script/home.js +++ /dev/null @@ -1,72 +0,0 @@ -// noinspection JSUnusedGlobalSymbols -const vm = new Vue({ - el: '#app', - data: { - projectArtifactId: null, - version: null, - applicationName: null, - newPerson: { - name: '', - age: 0, - sex: 'Male' - }, - people: [{ - name: 'Jack', - age: 30, - sex: 'Male' - }, { - name: 'Bill', - age: 26, - sex: 'Male' - }, { - name: 'Tracy', - age: 22, - sex: 'Female' - }, { - name: 'Chris', - age: 36, - sex: 'Male' - }] - }, - methods: { - /** - * Create a person - */ - createPerson: function () { - this.people.push(this.newPerson); - this.newPerson = {name: '', age: 0, sex: 'Male'} - - }, - /** - * delete a person - * @param index - */ - deletePerson: function (index) { - this.people.splice(index, 1); - }, - handleClickSwaggerApiDocumentation: function () { - const currentUrl = window.location.href; - const split = currentUrl.split('/'); - window.location.href = `${split[0]}//${split[2]}/doc`; - }, - handleClickVideoDemo: function () { - const currentUrl = window.location.href; - const split = currentUrl.split('/'); - window.location.href = `${split[0]}//${split[2]}/${split[3]}/video.html`; - }, - getAppInfo: async function () { - const currentUrl = window.location.href; - const split = currentUrl.split('/'); - const baseUrl = `${split[0]}//${split[2]}`; - const response = await fetch(`${baseUrl}/common/app-info`); - const responseJson = await response.json(); - this.projectArtifactId = responseJson.data.projectArtifactId; - this.version = responseJson.data.version; - this.applicationName = this.projectArtifactId.toUpperCase(); - window.document.title = this.applicationName; - } - }, - mounted: async function () { - this.getAppInfo(); - } -}); diff --git a/spring-boot-admin/src/main/resources/static/script/video.js b/spring-boot-admin/src/main/resources/static/script/video.js deleted file mode 100644 index 3a155900..00000000 --- a/spring-boot-admin/src/main/resources/static/script/video.js +++ /dev/null @@ -1,17 +0,0 @@ -// noinspection JSUnusedGlobalSymbols -const vm = new Vue({ - el: '#app', - data: { - appInfo: null, - videoSource: '' - }, - async mounted() { - const currentUrl = window.location.href; - const split = currentUrl.split('/'); - this.videoSource = `${split[0]}//${split[2]}/${split[3]}/test-table/demo-video`; - const baseUrl = `${split[0]}//${split[2]}`; - const response = await fetch(`${baseUrl}/common/app-info`); - const responseJson = await response.json(); - this.appInfo = responseJson.data; - } -}); diff --git a/spring-boot-admin/src/main/resources/static/styles/404.css b/spring-boot-admin/src/main/resources/static/styles/404.css deleted file mode 100644 index 09a4e9bc..00000000 --- a/spring-boot-admin/src/main/resources/static/styles/404.css +++ /dev/null @@ -1,89 +0,0 @@ -* { - margin: 0; - padding: 0; - box-sizing: border-box -} - -html { - font-size: 12px; - font-family: Ubuntu, simHei, sans-serif; - font-weight: 400 -} - -body { - font-size: 1rem -} - -button { - outline: none; - padding: 5px 8px; - color: #fff; - border: 1px solid #BCBCBC; - border-radius: 3px; - background-color: #009A61; - cursor: pointer; -} - -button:hover { - opacity: 0.8; -} - -#app { - margin: 48px auto 0; - max-width: 640px; - -webkit-perspective: 500px; -} - -.text-center { - text-align: center; -} - -.message-box { - background-color: firebrick; - max-width: 700px; - padding: 20px; - border-radius: 8px; - margin: 48px auto 20px; -} - -.slide-in-bck-center { - animation: slide-in-bck-center 1.2s cubic-bezier(0.250, 0.460, 0.450, 0.940) both; -} - -@keyframes slide-in-bck-center { - 0% { - transform: translateZ(600px); - opacity: 0; - } - 100% { - transform: translateZ(0); - opacity: 1; - } -} - -.message-text { - font-size: xx-large; - text-align: center; - color: ivory; -} - -.social-image { - width: 600px; - border-radius: 8px; -} - -.message-title { - text-align: center; - display: block; - font-size: 48px; - text-shadow: black 2px 2px 6px; -} - -.server-name { - color: gold; -} - -.go-to { - display: inline-block; - margin-bottom: 6px; -} diff --git a/spring-boot-admin/src/main/resources/static/styles/home.css b/spring-boot-admin/src/main/resources/static/styles/home.css deleted file mode 100644 index 62ebe0c2..00000000 --- a/spring-boot-admin/src/main/resources/static/styles/home.css +++ /dev/null @@ -1,222 +0,0 @@ -* { - margin: 0; - padding: 0; - box-sizing: border-box -} - -html { - font-size: 12px; - font-family: Ubuntu, simHei, sans-serif; - font-weight: 400 -} - -body { - font-size: 1rem -} - -table, -td, -th { - border-collapse: collapse; - border-spacing: 0 -} - -table { - width: 100% -} - -td, -th { - border: 1px solid #bcbcbc; - padding: 5px 10px -} - -th { - background: #42b983; - font-size: 1.2rem; - font-weight: 400; - color: #fff; - cursor: pointer -} - -tr:nth-of-type(odd) { - background: #fff -} - -tr:nth-of-type(even) { - background: #eee -} - -fieldset { - border: 1px solid #BCBCBC; - padding: 15px; -} - -input { - outline: none -} - -input[type=text] { - border: 1px solid #ccc; - padding: .5rem .3rem; -} - -input[type=text]:focus { - border-color: #42b983; -} - -button { - outline: none; - padding: 5px 8px; - color: #fff; - border: 1px solid #BCBCBC; - border-radius: 3px; - background-color: #009A61; - cursor: pointer; -} - -button:hover { - opacity: 0.8; -} - -#app { - margin: 0 auto; - max-width: 640px; - -webkit-perspective: 500px; -} - -.form-group { - margin: 10px; -} - -.form-group > label { - display: inline-block; - width: 10rem; - text-align: right; -} - -.form-group > input, -.form-group > select { - display: inline-block; - height: 2.5rem; - line-height: 2.5rem; -} - -.text-center { - text-align: center; -} - -.pagination { - display: inline-block; - padding-left: 0; - margin: 21px 0; - border-radius: 3px; -} - -.pagination > li { - display: inline; -} - -.pagination > li > a { - position: relative; - float: left; - padding: 6px 12px; - line-height: 1.5; - text-decoration: none; - color: #009a61; - background-color: #fff; - border: 1px solid #ddd; - margin-left: -1px; - list-style: none; -} - -.pagination > li > a:hover { - background-color: #eee; -} - -.pagination .active { - color: #fff; - background-color: #009a61; - border-left: none; - border-right: none; -} - -.pagination .active:hover { - background: #009a61; - cursor: default; -} - -.pagination > li:first-child > a .p { - border-bottom-left-radius: 3px; - border-top-left-radius: 3px; -} - -.pagination > li:last-child > a { - border-bottom-right-radius: 3px; - border-top-right-radius: 3px; -} - -.greeting-box { - background-color: firebrick; - max-width: 700px; - padding: 20px; - border-radius: 8px; - margin: 48px auto 20px; -} - -.slide-in-bck-center { - animation: slide-in-bck-center 1.2s cubic-bezier(0.250, 0.460, 0.450, 0.940) both; -} - -@keyframes slide-in-bck-center { - 0% { - transform: translateZ(600px); - opacity: 0; - } - 100% { - transform: translateZ(0); - opacity: 1; - } -} - -.greeting-text { - font-size: xx-large; - text-align: center; - color: ivory; - display: block; -} - -.application-name { - display: inline-block; - font-weight: bold; - width: auto; - font-size: 48px; - color: rgb(7, 156, 58); - position: relative; - left: 60px; - top: 200px; - cursor: default; -} - -.social-image { - width: 600px; - border-radius: 8px; -} - -.greeting-title { - text-align: center; - display: block; - font-size: 48px; - font-weight: bold; - color: ivory; - text-shadow: black 2px 2px 6px; -} - -.server-name { - color: gold; -} - -.go-to { - display: inline-block; - margin-bottom: 6px; -} diff --git a/spring-boot-admin/src/main/resources/static/styles/video.css b/spring-boot-admin/src/main/resources/static/styles/video.css deleted file mode 100644 index 341a63f5..00000000 --- a/spring-boot-admin/src/main/resources/static/styles/video.css +++ /dev/null @@ -1,136 +0,0 @@ -* { - margin: 0; - padding: 0; - box-sizing: border-box -} - -html { - font-size: 12px; - font-family: Ubuntu, simHei, sans-serif; - font-weight: 400 -} - -body { - font-size: 1rem -} - -table, -td, -th { - border-collapse: collapse; - border-spacing: 0 -} - -table { - width: 100% -} - -td, -th { - border: 1px solid #bcbcbc; - padding: 5px 10px -} - -th { - background: #42b983; - font-size: 1.2rem; - font-weight: 400; - color: #fff; - cursor: pointer -} - -tr:nth-of-type(odd) { - background: #fff -} - -tr:nth-of-type(even) { - background: #eee -} - -fieldset { - border: 1px solid #BCBCBC; - padding: 15px; -} - -input { - outline: none -} - -input[type=text] { - border: 1px solid #ccc; - padding: .5rem .3rem; -} - -input[type=text]:focus { - border-color: #42b983; -} - -button { - outline: none; - padding: 5px 8px; - color: #fff; - border: 1px solid #BCBCBC; - border-radius: 3px; - background-color: #009A61; - cursor: pointer; -} - -button:hover { - opacity: 0.8; -} - -#app { - margin: 0 auto; - max-width: 640px; - -webkit-perspective: 500px; -} - -.greeting-box { - background-color: firebrick; - max-width: 700px; - padding: 20px; - border-radius: 8px; - margin: 48px auto 20px; -} - -.slide-in-bck-center { - animation: slide-in-bck-center 1.2s cubic-bezier(0.250, 0.460, 0.450, 0.940) both; -} - -@keyframes slide-in-bck-center { - 0% { - transform: translateZ(600px); - opacity: 0; - } - 100% { - transform: translateZ(0); - opacity: 1; - } -} - -.greeting-text { - font-size: xx-large; - text-align: center; - color: ivory; -} - -.social-image { - width: 600px; - border-radius: 8px; -} - -.greeting-title { - text-align: center; - display: block; - font-size: 48px; - text-shadow: black 2px 2px 6px; -} - -.server-name { - color: gold; -} - -.go-to { - display: inline-block; - margin-bottom: 6px; -} diff --git a/spring-boot-admin/src/main/resources/static/video.html b/spring-boot-admin/src/main/resources/static/video.html deleted file mode 100644 index 9a186caa..00000000 --- a/spring-boot-admin/src/main/resources/static/video.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - ExRx.net Crawler Server - - - - -
-
- - Hello, World! - Welcome to {{ appInfo.projectArtifactId }}@{{ appInfo.version }}! - - -
-
- - - - diff --git a/muscle-and-fitness-server-spring-boot-starter/README.md b/spring-cloud-starter/README.md similarity index 100% rename from muscle-and-fitness-server-spring-boot-starter/README.md rename to spring-cloud-starter/README.md diff --git a/spring-cloud-starter/pom.xml b/spring-cloud-starter/pom.xml new file mode 100644 index 00000000..0cc516aa --- /dev/null +++ b/spring-cloud-starter/pom.xml @@ -0,0 +1,185 @@ + + + 4.0.0 + + + spring-cloud-starter + Muscle and Fitness Server :: Spring Cloud Starter + Muscle and Fitness Server Spring Cloud Starter + + com.jmsoftware.maf + muscle-and-fitness-server + 0.0.2 + + + + + + + org.springframework.boot + spring-boot-devtools + runtime + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-security + + + org.springframework.boot + spring-boot-starter-aop + + + org.springframework.boot + spring-boot-starter-validation + + + org.springframework.boot + spring-boot-starter-data-redis + + + org.springframework.boot + spring-boot-starter-amqp + + + org.springframework.amqp + spring-rabbit-test + test + + + org.springframework.boot + spring-boot-starter-quartz + + + org.springframework.boot + spring-boot-starter-websocket + + + org.springframework.boot + spring-boot-starter-reactor-netty + + + org.springframework.boot + spring-boot-configuration-processor + + + org.springframework.boot + spring-boot-autoconfigure + true + + + org.springframework.boot + spring-boot-autoconfigure-processor + true + + + + + org.springframework.cloud + spring-cloud-starter-bootstrap + + + org.springframework.cloud + spring-cloud-starter-consul-all + + + org.springframework.cloud + spring-cloud-starter-openfeign + + + io.github.openfeign + feign-okhttp + + + org.springframework.cloud + spring-cloud-starter-sleuth + + + org.springframework.cloud + spring-cloud-sleuth-zipkin + + + + + io.minio + minio + ${minio.version} + + + org.springframework.integration + spring-integration-sftp + + + + com.jmsoftware.maf + common + + + com.jmsoftware.maf + universal-ui + + + + de.codecentric + spring-boot-admin-starter-client + ${spring-boot-admin-starter-client.version} + + + + + com.baomidou + mybatis-plus-boot-starter + ${mybatis-plus-boot-starter.version} + + + com.baomidou + dynamic-datasource-spring-boot-starter + ${dynamic-datasource-spring-boot-starter.version} + + + mysql + mysql-connector-java + runtime + + + com.alibaba + druid-spring-boot-starter + ${druid-spring-boot-starter.version} + + + + + com.github.xiaoymin + knife4j-micro-spring-boot-starter + ${knife4j.version} + + + + + org.apache.commons + commons-pool2 + + + + + org.apache.poi + poi + ${poi.version} + + + org.apache.poi + poi-ooxml + ${poi.version} + + + + net.logstash.logback + logstash-logback-encoder + ${logstash-logback-encoder.version} + + + diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/MafAutoConfiguration.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/MafAutoConfiguration.java new file mode 100644 index 00000000..75860611 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/MafAutoConfiguration.java @@ -0,0 +1,165 @@ +package com.jmsoftware.maf.springcloudstarter; + +import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException; +import com.jmsoftware.maf.springcloudstarter.aspect.CommonExceptionControllerAdvice; +import com.jmsoftware.maf.springcloudstarter.aspect.DatabaseExceptionControllerAdvice; +import com.jmsoftware.maf.springcloudstarter.aspect.WebRequestLogAspect; +import com.jmsoftware.maf.springcloudstarter.configuration.*; +import com.jmsoftware.maf.springcloudstarter.controller.CommonController; +import com.jmsoftware.maf.springcloudstarter.controller.GlobalErrorController; +import com.jmsoftware.maf.springcloudstarter.controller.HttpApiResourceRemoteApiController; +import com.jmsoftware.maf.springcloudstarter.controller.RedirectController; +import com.jmsoftware.maf.springcloudstarter.database.MyBatisPlusConfiguration; +import com.jmsoftware.maf.springcloudstarter.filter.AccessLogFilter; +import com.jmsoftware.maf.springcloudstarter.helper.HttpApiScanHelper; +import com.jmsoftware.maf.springcloudstarter.helper.IpHelper; +import com.jmsoftware.maf.springcloudstarter.helper.SpringBootStartupHelper; +import com.jmsoftware.maf.springcloudstarter.quartz.QuartzConfiguration; +import com.jmsoftware.maf.springcloudstarter.redis.RedisConfiguration; +import com.jmsoftware.maf.springcloudstarter.service.CommonService; +import com.jmsoftware.maf.springcloudstarter.service.impl.CommonServiceImpl; +import com.jmsoftware.maf.springcloudstarter.sftp.SftpConfiguration; +import com.jmsoftware.maf.springcloudstarter.websocket.WebSocketConfiguration; +import lombok.extern.slf4j.Slf4j; +import org.apache.ibatis.exceptions.PersistenceException; +import org.mybatis.spring.MyBatisSystemException; +import org.springframework.boot.autoconfigure.condition.*; +import org.springframework.boot.autoconfigure.web.ServerProperties; +import org.springframework.boot.autoconfigure.web.servlet.error.ErrorViewResolver; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.boot.web.servlet.error.ErrorAttributes; +import org.springframework.boot.web.servlet.error.ErrorController; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; +import org.springframework.core.env.Environment; +import org.springframework.integration.annotation.IntegrationComponentScan; +import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; + +import javax.annotation.PostConstruct; +import java.util.List; + +/** + * Description: MediaStreamingAutoConfiguration, change description here. + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 10/19/2020 2:51 PM + **/ +@Slf4j +@Configuration +@IntegrationComponentScan +@ConditionalOnWebApplication +@EnableConfigurationProperties({ + MafConfiguration.class, + MafProjectProperty.class, + ExcelImportConfiguration.class +}) +@Import({ + WebMvcConfiguration.class, + MyBatisPlusConfiguration.class, + RedisConfiguration.class, + Swagger2Configuration.class, + SftpConfiguration.class, + WebSecurityConfiguration.class, + RestTemplateConfiguration.class, + AsyncConfiguration.class, + RabbitmqConfiguration.class, + MinioConfiguration.class, + JacksonConfiguration.class, + TypeConversionConfiguration.class, + QuartzConfiguration.class, + WebSocketConfiguration.class +}) +public class MafAutoConfiguration { + @PostConstruct + public void postConstruct() { + log.warn("Post construction of '{}'", this.getClass().getSimpleName()); + } + + @Bean + @ConditionalOnMissingBean + public CommonExceptionControllerAdvice exceptionControllerAdvice() { + log.warn("Initial bean: '{}'", CommonExceptionControllerAdvice.class.getSimpleName()); + return new CommonExceptionControllerAdvice(); + } + + @Bean + @ConditionalOnClass({MyBatisSystemException.class, MybatisPlusException.class, PersistenceException.class}) + public DatabaseExceptionControllerAdvice databaseExceptionControllerAdvice() { + log.warn("Initial bean: '{}'", DatabaseExceptionControllerAdvice.class.getSimpleName()); + return new DatabaseExceptionControllerAdvice(); + } + + @Bean + @ConditionalOnProperty(value = "maf.configuration.web-request-log-enabled") + public WebRequestLogAspect webRequestLogAspect() { + log.warn("Initial bean: '{}'", WebRequestLogAspect.class.getSimpleName()); + return new WebRequestLogAspect(); + } + + @Bean + public RedirectController redirectController() { + log.warn("Initial bean: '{}'", RedirectController.class.getSimpleName()); + return new RedirectController(); + } + + @Bean + public AccessLogFilter requestFilter(MafConfiguration mafConfiguration) { + log.warn("Initial bean: '{}'", AccessLogFilter.class.getSimpleName()); + return new AccessLogFilter(mafConfiguration); + } + + @Bean + public IpHelper ipHelper(Environment environment) { + log.warn("Initial bean: '{}'", IpHelper.class.getSimpleName()); + return new IpHelper(environment); + } + + @Bean + public SpringBootStartupHelper springBootStartupHelper(MafProjectProperty mafProjectProperty, + IpHelper ipHelper) { + log.warn("Initial bean: '{}'", SpringBootStartupHelper.class.getSimpleName()); + return new SpringBootStartupHelper(mafProjectProperty, ipHelper); + } + + @Bean + @ConditionalOnMissingBean(value = ErrorController.class, search = SearchStrategy.CURRENT) + public GlobalErrorController globalErrorController(ErrorAttributes errorAttributes, + ServerProperties serverProperties, + List errorViewResolvers) { + log.warn("Initial bean: '{}'", GlobalErrorController.class.getSimpleName()); + return new GlobalErrorController(errorAttributes, serverProperties, errorViewResolvers); + } + + @Bean + public HttpApiScanHelper httpApiScanHelper(RequestMappingHandlerMapping requestMappingHandlerMapping) { + log.warn("Initial bean: '{}'", HttpApiScanHelper.class.getSimpleName()); + return new HttpApiScanHelper(requestMappingHandlerMapping); + } + + @Bean + public HttpApiResourceRemoteApiController httpApiResourceRemoteController(MafConfiguration mafConfiguration, + HttpApiScanHelper httpApiScanHelper) { + log.warn("Initial bean: '{}'", HttpApiResourceRemoteApiController.class.getSimpleName()); + return new HttpApiResourceRemoteApiController(mafConfiguration, httpApiScanHelper); + } + + @Bean + @RefreshScope + public CommonService commonService(MafProjectProperty mafProjectProperty) { + log.warn("Initial bean: '{}'", CommonServiceImpl.class.getSimpleName()); + return new CommonServiceImpl(mafProjectProperty); + } + + @Bean + public CommonController commonController(CommonService commonService) { + log.warn("Initial bean: '{}'", CommonController.class.getSimpleName()); + return new CommonController(commonService); + } + + @Bean + public JwtConfiguration jwtConfiguration(MafProjectProperty mafProjectProperty) { + log.warn("Initial bean: '{}'", JwtConfiguration.class.getSimpleName()); + return new JwtConfiguration(mafProjectProperty); + } +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/annotation/ExcelColumn.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/annotation/ExcelColumn.java new file mode 100644 index 00000000..c82b803c --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/annotation/ExcelColumn.java @@ -0,0 +1,29 @@ +package com.jmsoftware.maf.springcloudstarter.annotation; + +import org.apache.poi.ss.usermodel.CellType; + +import java.lang.annotation.*; + +/** + * Description: ExcelColumn, change description here. + * + * @author 钟俊 (zhongjun), email: zhongjun@toguide.cn, date: 2/19/2021 9:15 AM + */ +@Documented +@Target(ElementType.FIELD) +@Retention(RetentionPolicy.RUNTIME) +public @interface ExcelColumn { + /** + * Description string. + * + * @return the string + */ + String description() default ""; + + /** + * Cell type cell type. + * + * @return the cell type + */ + CellType cellType() default CellType.STRING; +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/annotation/TreeElement.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/annotation/TreeElement.java new file mode 100644 index 00000000..bae7dd45 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/annotation/TreeElement.java @@ -0,0 +1,17 @@ +package com.jmsoftware.maf.springcloudstarter.annotation; + +import com.jmsoftware.maf.springcloudstarter.util.TreeElementType; + +import java.lang.annotation.*; + +/** + * Description: TreeElement, change description here. + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 5/28/2021 4:27 PM + */ +@Documented +@Target(ElementType.FIELD) +@Retention(RetentionPolicy.RUNTIME) +public @interface TreeElement { + TreeElementType type() default TreeElementType.ID; +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/aspect/CommonExceptionControllerAdvice.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/aspect/CommonExceptionControllerAdvice.java new file mode 100644 index 00000000..76fb4440 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/aspect/CommonExceptionControllerAdvice.java @@ -0,0 +1,237 @@ +package com.jmsoftware.maf.springcloudstarter.aspect; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.jmsoftware.maf.common.bean.ResponseBodyBean; +import com.jmsoftware.maf.common.exception.BaseException; +import com.jmsoftware.maf.springcloudstarter.util.RequestUtil; +import lombok.extern.slf4j.Slf4j; +import lombok.val; +import org.springframework.context.support.DefaultMessageSourceResolvable; +import org.springframework.core.annotation.Order; +import org.springframework.http.HttpStatus; +import org.springframework.http.converter.HttpMessageNotReadableException; +import org.springframework.security.authentication.BadCredentialsException; +import org.springframework.security.authentication.InternalAuthenticationServiceException; +import org.springframework.validation.BindException; +import org.springframework.web.HttpRequestMethodNotSupportedException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.bind.annotation.RestControllerAdvice; +import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException; +import org.springframework.web.servlet.NoHandlerFoundException; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.validation.ConstraintViolationException; +import java.lang.reflect.UndeclaredThrowableException; +import java.util.Objects; + +/** + *

ExceptionControllerAdvice

+ *

+ * Exception advice for global controllers. + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com + * @date 2019-03-02 17:39 + **/ +@Slf4j +@Order(0) +@RestControllerAdvice +public class CommonExceptionControllerAdvice { + /** + *

Exception handler.

+ *

ATTENTION: In this method, cannot throw any exception.

+ * + * @param request HTTP request + * @param exception any kinds of exception occurred in controller + * @return custom exception info + */ + @ResponseStatus(HttpStatus.NOT_FOUND) + @ExceptionHandler(NoHandlerFoundException.class) + public ResponseBodyBean handleException(HttpServletRequest request, NoHandlerFoundException exception) { + this.requestLog(request); + // ATTENTION: Use only ResponseBodyBean.ofStatus() in handleException() method and + // DON'T throw any exceptions in this method + log.error("NoHandlerFoundException: Request URL = {}, HTTP method = {}", exception.getRequestURL(), + exception.getHttpMethod()); + return ResponseBodyBean.ofStatus(HttpStatus.NOT_FOUND); + } + + @ResponseStatus(HttpStatus.METHOD_NOT_ALLOWED) + @ExceptionHandler(HttpRequestMethodNotSupportedException.class) + public ResponseBodyBean handleException(HttpServletRequest request, + HttpRequestMethodNotSupportedException exception) { + this.requestLog(request); + log.error("Exception occurred when the request handler does not support a specific request method. " + + "Current method is {}, Support HTTP method = {}", exception.getMethod(), + exception.getSupportedHttpMethods()); + return ResponseBodyBean.ofStatus(HttpStatus.METHOD_NOT_ALLOWED); + } + + @ResponseStatus(HttpStatus.BAD_REQUEST) + @ExceptionHandler(MethodArgumentNotValidException.class) + public ResponseBodyBean handleException(HttpServletRequest request, MethodArgumentNotValidException exception) { + this.requestLog(request); + log.error("MethodArgumentNotValidException message: {}", exception.getMessage()); + return ResponseBodyBean.ofStatus(HttpStatus.BAD_REQUEST.value(), this.getFieldErrorMessageFromException(exception), + null); + } + + @ResponseStatus(HttpStatus.BAD_REQUEST) + @ExceptionHandler(MethodArgumentTypeMismatchException.class) + public ResponseBodyBean handleException(HttpServletRequest request, + MethodArgumentTypeMismatchException exception) { + this.requestLog(request); + log.error("MethodArgumentTypeMismatchException: Parameter name = {}, Exception message: {}", + exception.getName(), exception.getMessage()); + return ResponseBodyBean.ofStatus(HttpStatus.BAD_REQUEST, this.removeLineSeparator(exception.getMessage())); + } + + @ResponseStatus(HttpStatus.BAD_REQUEST) + @ExceptionHandler(HttpMessageNotReadableException.class) + public ResponseBodyBean handleException(HttpServletRequest request, HttpMessageNotReadableException exception) { + this.requestLog(request); + log.error("HttpMessageNotReadableException: {}", exception.getMessage()); + return ResponseBodyBean.ofStatus(HttpStatus.BAD_REQUEST, this.removeLineSeparator(exception.getMessage())); + } + + @ExceptionHandler(BaseException.class) + public ResponseBodyBean handleException(HttpServletRequest request, HttpServletResponse response, + BaseException exception) { + this.requestLog(request); + log.error("BaseException: Status code: {}, message: {}, data: {}", exception.getCode(), + exception.getMessage(), exception.getData()); + response.setStatus(exception.getCode()); + return ResponseBodyBean.ofStatus(exception.getCode(), this.removeLineSeparator(exception.getMessage()), + exception.getData()); + } + + @ResponseStatus(HttpStatus.BAD_REQUEST) + @ExceptionHandler(BindException.class) + public ResponseBodyBean handleException(HttpServletRequest request, BindException exception) { + this.requestLog(request); + log.error("BindException message: {} ", exception.getMessage()); + String message; + if (exception.hasFieldErrors()) { + val fieldError = exception.getFieldError(); + message = String.format("Field [%s] has error: %s", Objects.requireNonNull(fieldError).getField(), + fieldError.getDefaultMessage()); + } else { + val globalError = exception.getGlobalError(); + message = String.format("Bind error: %s", Objects.requireNonNull(globalError).getDefaultMessage()); + } + return ResponseBodyBean.ofStatus(HttpStatus.BAD_REQUEST, message); + } + + @ResponseStatus(HttpStatus.BAD_REQUEST) + @ExceptionHandler(ConstraintViolationException.class) + public ResponseBodyBean handleException(HttpServletRequest request, ConstraintViolationException exception) { + this.requestLog(request); + log.error("ConstraintViolationException message: {} ", exception.getMessage()); + return ResponseBodyBean.ofStatus(HttpStatus.BAD_REQUEST, this.removeLineSeparator(exception.getMessage())); + } + + @ResponseStatus(HttpStatus.BAD_REQUEST) + @ExceptionHandler(IllegalArgumentException.class) + public ResponseBodyBean handleException(HttpServletRequest request, IllegalArgumentException exception) { + this.requestLog(request); + log.error("IllegalArgumentException message: {} ", exception.getMessage()); + return ResponseBodyBean.ofStatus(HttpStatus.BAD_REQUEST.value(), this.removeLineSeparator(exception.getMessage()), + null); + } + + @ResponseStatus(HttpStatus.FORBIDDEN) + @ExceptionHandler(BadCredentialsException.class) + public ResponseBodyBean handleException(HttpServletRequest request, BadCredentialsException exception) { + this.requestLog(request); + // IMPORTANT: org.springframework.security.authentication.BadCredentialsException only exists in the project + // that depends on org.springframework.boot.spring-boot-starter-security + log.error("BadCredentialsException message: {} ", exception.getMessage()); + return ResponseBodyBean.ofStatus(HttpStatus.FORBIDDEN.value(), this.removeLineSeparator(exception.getMessage()), + null); + } + + @ExceptionHandler(InternalAuthenticationServiceException.class) + public ResponseBodyBean handleException(HttpServletRequest request, HttpServletResponse response, + InternalAuthenticationServiceException exception) { + this.requestLog(request); + log.error("An authentication request could not be processed due to a system problem that occurred " + + "internally. Exception message: {} ", exception.getMessage()); + if (exception.getCause() instanceof BaseException) { + val exceptionCause = (BaseException) exception.getCause(); + val code = exceptionCause.getCode(); + response.setStatus(code); + return ResponseBodyBean.ofStatus(HttpStatus.valueOf(code), this.removeLineSeparator(exception.getMessage())); + } + response.setStatus(HttpStatus.FORBIDDEN.value()); + return ResponseBodyBean.ofStatus(HttpStatus.FORBIDDEN.value(), this.removeLineSeparator(exception.getMessage()), + null); + } + + @ExceptionHandler(UndeclaredThrowableException.class) + @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) + public ResponseBodyBean handleError(UndeclaredThrowableException exception) { + log.error("Undeclared throwable exception occurred! Exception message: {} ", exception.getMessage(), exception); + if (ObjectUtil.isNotNull(exception.getCause()) && StrUtil.isNotEmpty(exception.getCause().getMessage())) { + return ResponseBodyBean.ofStatus(HttpStatus.INTERNAL_SERVER_ERROR, + String.format("Exception message: %s", + this.removeLineSeparator(exception.getCause().getMessage()))); + } + return ResponseBodyBean.ofStatus(HttpStatus.INTERNAL_SERVER_ERROR, + String.format("Exception message: %s", + this.removeLineSeparator(exception.getMessage()))); + } + + @ExceptionHandler(Throwable.class) + @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) + public ResponseBodyBean handleError(Throwable ex) { + log.error("Internal server exception occurred! Exception message: {} ", ex.getMessage(), ex); + return ResponseBodyBean.ofStatus(HttpStatus.INTERNAL_SERVER_ERROR, + String.format("Exception message: %s", this.removeLineSeparator(ex.getMessage()))); + } + + private void requestLog(HttpServletRequest request) { + log.error("Exception occurred when [{}] requested access. Request URL: [{}] {}", + RequestUtil.getRequestIpAndPort(request), request.getMethod(), request.getRequestURL()); + } + + /** + * Get field error message from exception. If two or more fields do not pass Spring Validation check, then will + * return the 1st error message of the error field. + * + * @param exception MethodArgumentNotValidException + * @return field error message + */ + private String getFieldErrorMessageFromException(MethodArgumentNotValidException exception) { + try { + val firstErrorField = + (DefaultMessageSourceResolvable) Objects.requireNonNull(exception.getBindingResult() + .getAllErrors() + .get(0) + .getArguments())[0]; + val firstErrorFieldName = firstErrorField.getDefaultMessage(); + val firstErrorFieldMessage = exception.getBindingResult().getAllErrors().get(0).getDefaultMessage(); + return String.format("%s %s", firstErrorFieldName, firstErrorFieldMessage); + } catch (Exception e) { + log.error("Exception occurred when get field error message from exception. Exception message: {}", + e.getMessage(), e); + return HttpStatus.BAD_REQUEST.getReasonPhrase(); + } + } + + /** + * Remove line separator string. + * + * @param source the source + * @return the string + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 12/24/2020 11:22 AM + */ + private String removeLineSeparator(String source) { + if (StrUtil.isBlank(source)) { + return "source is blank"; + } + return source.replaceAll(System.lineSeparator(), " "); + } +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/aspect/DatabaseExceptionControllerAdvice.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/aspect/DatabaseExceptionControllerAdvice.java new file mode 100644 index 00000000..ffd91076 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/aspect/DatabaseExceptionControllerAdvice.java @@ -0,0 +1,104 @@ +package com.jmsoftware.maf.springcloudstarter.aspect; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException; +import com.jmsoftware.maf.common.bean.ResponseBodyBean; +import com.jmsoftware.maf.springcloudstarter.util.RequestUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.ibatis.exceptions.PersistenceException; +import org.mybatis.spring.MyBatisSystemException; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.core.annotation.Order; +import org.springframework.http.HttpStatus; +import org.springframework.jdbc.BadSqlGrammarException; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +import javax.servlet.http.HttpServletRequest; + +/** + *

DatabaseExceptionControllerAdvice

+ *

+ * Exception advice for database exception. + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 6/27/2021 10:41 AM + **/ +@Slf4j +@RestControllerAdvice +@Order(DatabaseExceptionControllerAdvice.ORDER) +@ConditionalOnClass({MyBatisSystemException.class, MybatisPlusException.class, PersistenceException.class}) +public class DatabaseExceptionControllerAdvice { + /** + * Before CommonExceptionControllerAdvice + * + * @see CommonExceptionControllerAdvice + */ + public static final int ORDER = -1; + + @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) + @ExceptionHandler(MyBatisSystemException.class) + public ResponseBodyBean handleMyBatisSystemException(HttpServletRequest request, + MyBatisSystemException exception) { + this.requestLog(request); + log.error("MyBatisSystemException message: {}", exception.getMessage()); + return ResponseBodyBean.ofStatus(HttpStatus.INTERNAL_SERVER_ERROR, + String.format("MyBatisSystemException message: %s", + this.removeLineSeparator(exception.getMessage()))); + } + + @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) + @ExceptionHandler(MybatisPlusException.class) + public ResponseBodyBean handleMybatisPlusException(HttpServletRequest request, MybatisPlusException exception) { + this.requestLog(request); + log.error("MybatisPlusException message: {}", exception.getMessage()); + return ResponseBodyBean.ofStatus(HttpStatus.INTERNAL_SERVER_ERROR, + String.format("MybatisPlusException message: %s", + this.removeLineSeparator(exception.getMessage()))); + } + + @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) + @ExceptionHandler(PersistenceException.class) + public ResponseBodyBean handlePersistenceException(HttpServletRequest request, PersistenceException exception) { + this.requestLog(request); + log.error("PersistenceException message: {}", exception.getMessage()); + return ResponseBodyBean.ofStatus(HttpStatus.INTERNAL_SERVER_ERROR, + String.format("PersistenceException message: %s", + this.removeLineSeparator(exception.getMessage()))); + } + + @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) + @ExceptionHandler(BadSqlGrammarException.class) + public ResponseBodyBean handleBadSqlGrammarException(HttpServletRequest request, + BadSqlGrammarException exception) { + this.requestLog(request); + log.error("BadSqlGrammarException message: {}", exception.getMessage()); + var message = exception.getMessage(); + if (ObjectUtil.isNotNull(exception.getCause()) && StrUtil.isNotBlank(exception.getCause().getMessage())) { + message = exception.getCause().getMessage(); + } + return ResponseBodyBean.ofStatus(HttpStatus.INTERNAL_SERVER_ERROR, + String.format("PersistenceException message: %s", + this.removeLineSeparator(message))); + } + + private void requestLog(HttpServletRequest request) { + log.error("Exception occurred when [{}] requested access. Request URL: [{}] {}", + RequestUtil.getRequestIpAndPort(request), request.getMethod(), request.getRequestURL()); + } + + /** + * Remove line separator string. + * + * @param source the source + * @return the string + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 12/24/2020 11:22 AM + */ + private String removeLineSeparator(String source) { + if (StrUtil.isBlank(source)) { + return "source is blank"; + } + return source.replaceAll(System.lineSeparator(), " "); + } +} diff --git a/muscle-and-fitness-server-spring-boot-starter/src/main/java/com/jmsoftware/maf/muscleandfitnessserverspringbootstarter/aspect/WebRequestLogAspect.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/aspect/WebRequestLogAspect.java similarity index 59% rename from muscle-and-fitness-server-spring-boot-starter/src/main/java/com/jmsoftware/maf/muscleandfitnessserverspringbootstarter/aspect/WebRequestLogAspect.java rename to spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/aspect/WebRequestLogAspect.java index 5778a974..3e7356c9 100644 --- a/muscle-and-fitness-server-spring-boot-starter/src/main/java/com/jmsoftware/maf/muscleandfitnessserverspringbootstarter/aspect/WebRequestLogAspect.java +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/aspect/WebRequestLogAspect.java @@ -1,9 +1,10 @@ -package com.jmsoftware.maf.muscleandfitnessserverspringbootstarter.aspect; +package com.jmsoftware.maf.springcloudstarter.aspect; import cn.hutool.json.JSONUtil; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; -import com.jmsoftware.maf.muscleandfitnessserverspringbootstarter.util.RequestUtil; +import com.jmsoftware.maf.springcloudstarter.util.RequestUtil; +import com.jmsoftware.maf.springcloudstarter.util.UsernameUtil; import lombok.extern.slf4j.Slf4j; import lombok.val; import org.aspectj.lang.JoinPoint; @@ -25,7 +26,7 @@ *

No methods in controller need to be decorated with annotation. This aspect would automatically cut the method * decorated with `@GetMapping` or `@PostMapping`.

* - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com * @date 2019-05-05 19:55 **/ @Slf4j @@ -34,22 +35,45 @@ public class WebRequestLogAspect { private static final int MAX_LENGTH_OF_JSON_STRING = 500; private static final String LINE_SEPARATOR = System.lineSeparator(); + private static final String BEFORE_TEMPLATE = LINE_SEPARATOR + + "============ WEB REQUEST LOG AOP (@Before) ============" + LINE_SEPARATOR + + "URL : {}" + LINE_SEPARATOR + + "HTTP Method : {}" + LINE_SEPARATOR + + "Client[IPv46:Port] : {}" + LINE_SEPARATOR + + "Username : {}" + LINE_SEPARATOR + + "Class Method : {}#{}" + LINE_SEPARATOR + + "Request Params :{}{}"; + private static final String AFTER_TEMPLATE = LINE_SEPARATOR + + "============ WEB REQUEST LOG AOP (@After) ============="; + private static final String AROUND_TEMPLATE_FOR_JSON = LINE_SEPARATOR + + "Response :{}{}"; + private static final String AROUND_TEMPLATE_FOR_NON_JSON = LINE_SEPARATOR + + "Response (non-JSON): {}"; + private static final String AROUND_TEMPLATE_END = LINE_SEPARATOR + + "Elapsed time : {} ({} ms)" + LINE_SEPARATOR + + "============ WEB REQUEST LOG AOP (@Around) ============"; + private static final String AFTER_THROWING_TEMPLATE = LINE_SEPARATOR + + "Signature : {}" + LINE_SEPARATOR + + "Exception : {}, message: {}" + LINE_SEPARATOR + + "======== WEB REQUEST LOG AOP (@AfterThrowing) ========="; private final ObjectMapper mapper = new ObjectMapper(); /** * Define pointcut. Pointcut is a predicate or expression that matches join points. In WebRequestLogAspect, we need - * to cut any method annotated with `@GetMapping`, `@PostMapping`, `@PutMapping`, `@DeleteMapping`, `@PatchMapping`, `@RequestMapping`. + * to cut any method annotated with `@GetMapping`, `@PostMapping`, `@PutMapping`, `@DeleteMapping`, + * `@PatchMapping`, `@RequestMapping`. *

* More detail at: Spring aop aspectJ * pointcut expression examples */ @Pointcut("@annotation(org.springframework.web.bind.annotation.GetMapping)" + - " || @annotation(org.springframework.web.bind.annotation.PostMapping)" + - " || @annotation(org.springframework.web.bind.annotation.PutMapping)" + - " || @annotation(org.springframework.web.bind.annotation.DeleteMapping)" + - " || @annotation(org.springframework.web.bind.annotation.PatchMapping)" + - " || @annotation(org.springframework.web.bind.annotation.RequestMapping)") + " || @annotation(org.springframework.web.bind.annotation.PostMapping)" + + " || @annotation(org.springframework.web.bind.annotation.PutMapping)" + + " || @annotation(org.springframework.web.bind.annotation.DeleteMapping)" + + " || @annotation(org.springframework.web.bind.annotation.PatchMapping)" + + " || @annotation(org.springframework.web.bind.annotation.RequestMapping)") public void requestLogPointcut() { + // Do nothing } /** @@ -64,14 +88,18 @@ public void beforeHandleRequest(JoinPoint joinPoint) { val attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); assert attributes != null; val request = attributes.getRequest(); - log.info("============ WEB REQUEST LOG START ============"); - log.info("URL : {}", request.getRequestURL().toString()); - log.info("HTTP Method : {}", request.getMethod()); - log.info("Client IP:Port : {}", RequestUtil.getRequestIpAndPort(request)); - log.info("Class Method : {}#{}", - joinPoint.getSignature().getDeclaringTypeName(), - joinPoint.getSignature().getName()); - log.info("Request Params :{}{}", LINE_SEPARATOR, JSONUtil.toJsonPrettyStr(joinPoint.getArgs())); + log.info(BEFORE_TEMPLATE, request.getRequestURL().toString(), request.getMethod(), + RequestUtil.getRequestIpAndPort(request), UsernameUtil.getCurrentUsername(), + joinPoint.getSignature().getDeclaringTypeName(), joinPoint.getSignature().getName(), LINE_SEPARATOR, + JSONUtil.toJsonPrettyStr(joinPoint.getArgs())); + } + + /** + * `@After` annotated methods run exactly after the all methods matching with pointcut expression. + */ + @After("requestLogPointcut()") + public void afterHandleRequest() { + log.info(AFTER_TEMPLATE); } /** @@ -88,29 +116,21 @@ public Object aroundHandleRequest(ProceedingJoinPoint proceedingJoinPoint) throw val result = proceedingJoinPoint.proceed(); val duration = Duration.between(startInstant, Instant.now()); try { - var formattedJsonString = JSONUtil.formatJsonStr(mapper.writeValueAsString(result)); + var formattedJsonString = JSONUtil.formatJsonStr(this.mapper.writeValueAsString(result)); if (formattedJsonString.length() > MAX_LENGTH_OF_JSON_STRING) { val substring = formattedJsonString.substring(0, MAX_LENGTH_OF_JSON_STRING - 1); formattedJsonString = String.format("%s… [The length(%d) of JSON string is larger than the maximum(%d)]", substring, formattedJsonString.length(), MAX_LENGTH_OF_JSON_STRING); } - log.info("Response :{}{}", LINE_SEPARATOR, formattedJsonString); + log.info(AROUND_TEMPLATE_FOR_JSON, LINE_SEPARATOR, formattedJsonString); } catch (JsonProcessingException e) { - log.info("Response (non-JSON): {}", result); + log.info(AROUND_TEMPLATE_FOR_NON_JSON, result); } - log.info("Elapsed time : {} ({} ms)", duration, duration.toMillis()); + log.info(AROUND_TEMPLATE_END, duration, duration.toMillis()); return result; } - /** - * `@After` annotated methods run exactly after the all methods matching with pointcut expression. - */ - @After("requestLogPointcut()") - public void afterHandleRequest() { - log.info("============= WEB REQUEST LOG END ============="); - } - /** * `@AfterThrowing` annotated methods run after the method (matching with pointcut expression) exits by throwing an * exception. @@ -120,8 +140,6 @@ public void afterHandleRequest() { */ @AfterThrowing(pointcut = "requestLogPointcut()", throwing = "e") public void afterThrowingException(JoinPoint joinPoint, Exception e) { - log.info("Signature : {}", joinPoint.getSignature().toShortString()); - log.error("Exception : {}, message: {}", e.toString(), e.getMessage()); - log.error("====== WEB REQUEST LOG END WITH EXCEPTION ====="); + log.error(AFTER_THROWING_TEMPLATE, joinPoint.getSignature().toShortString(), e.toString(), e.getMessage()); } } diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/configuration/AsyncConfiguration.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/configuration/AsyncConfiguration.java new file mode 100644 index 00000000..ad4d7e73 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/configuration/AsyncConfiguration.java @@ -0,0 +1,38 @@ +package com.jmsoftware.maf.springcloudstarter.configuration; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Bean; +import org.springframework.core.task.AsyncTaskExecutor; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +/** + * Description: AsyncConfiguration, change description here. + * + * @author 钟俊(zhongjun), email: zhongjun@toguide.cn, date: 1/29/2021 4:39 PM + **/ +@Slf4j +@EnableAsync +@RequiredArgsConstructor +public class AsyncConfiguration { + private final MafProjectProperty mafProjectProperty; + + @Bean + public AsyncTaskExecutor asyncTaskExecutor() { + ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + executor.setCorePoolSize(Runtime.getRuntime().availableProcessors() * 2); + executor.setMaxPoolSize(100); + executor.setBeanName("spring-boot-starter-thread-pool-task-executor"); + executor.setThreadNamePrefix(this.mafProjectProperty.getProjectArtifactId()); + // Specify the RejectedExecutionHandler to use for the ExecutorService. + // Default is the ExecutorService's default abort policy. + executor.setRejectedExecutionHandler((runnable, executor1) -> { + log.error("Captured rejected execution. {}", runnable); + // TODO: runnable persistence + }); + executor.initialize(); + log.warn("Initial bean: '{}'", AsyncTaskExecutor.class.getSimpleName()); + return executor; + } +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/configuration/ExcelImportConfiguration.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/configuration/ExcelImportConfiguration.java new file mode 100644 index 00000000..a42307d3 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/configuration/ExcelImportConfiguration.java @@ -0,0 +1,35 @@ +package com.jmsoftware.maf.springcloudstarter.configuration; + +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.PostConstruct; +import javax.validation.constraints.Min; +import javax.validation.constraints.NotNull; + +/** + *

CustomConfiguration

+ *

Custom configurations which are written in .yml files, containing a variety of fragmentary configs. Such as, + * Druid login info, web security switch, web log and so on.

+ * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com + * @date 2019-03-23 14:24 + **/ +@Data +@Slf4j +@Validated +@RefreshScope +@ConfigurationProperties(prefix = "maf.configuration.excel") +public class ExcelImportConfiguration { + @Min(2) + @NotNull + private Integer maximumRowCount; + + @PostConstruct + private void postConstruct() { + log.warn("Initial bean: '{}'", this.getClass().getSimpleName()); + } +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/configuration/JacksonConfiguration.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/configuration/JacksonConfiguration.java new file mode 100644 index 00000000..d3e08463 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/configuration/JacksonConfiguration.java @@ -0,0 +1,47 @@ +package com.jmsoftware.maf.springcloudstarter.configuration; + +import cn.hutool.core.util.StrUtil; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; +import lombok.RequiredArgsConstructor; +import lombok.val; +import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer; +import org.springframework.boot.autoconfigure.jackson.JacksonProperties; +import org.springframework.context.annotation.Bean; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +/** + * Description: LocalDateTimeSerializerConfiguration, change description here. + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 6/27/2021 3:57 PM + **/ +@RequiredArgsConstructor +public class JacksonConfiguration { + public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss"; + private final JacksonProperties jacksonProperties; + + @Bean + public LocalDateTimeSerializer localDateTimeSerializer() { + var pattern = DEFAULT_DATE_FORMAT; + if (StrUtil.isNotBlank(jacksonProperties.getDateFormat())) { + pattern = jacksonProperties.getDateFormat(); + } + return new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(pattern)); + } + + @Bean + public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer(LocalDateTimeSerializer localDateTimeSerializer) { + var pattern = DEFAULT_DATE_FORMAT; + if (StrUtil.isNotBlank(jacksonProperties.getDateFormat())) { + pattern = jacksonProperties.getDateFormat(); + } + val localDateTimeDeserializer = new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(pattern)); + return jackson2ObjectMapperBuilder -> jackson2ObjectMapperBuilder + .serializerByType(LocalDateTime.class, localDateTimeSerializer) + .deserializerByType(LocalDateTime.class, localDateTimeDeserializer) + .serializerByType(Long.class, ToStringSerializer.instance); + } +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/configuration/JwtConfiguration.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/configuration/JwtConfiguration.java new file mode 100644 index 00000000..f595a15b --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/configuration/JwtConfiguration.java @@ -0,0 +1,60 @@ +package com.jmsoftware.maf.springcloudstarter.configuration; + +import lombok.AccessLevel; +import lombok.Data; +import lombok.Setter; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.validation.annotation.Validated; + +import javax.validation.constraints.NotNull; +import java.nio.charset.StandardCharsets; + +/** + *

JwtConfiguration

+ *

+ * Ignored request configuration. + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 3/1/2021 10:28 AM + **/ +@Data +@Slf4j +@Validated +@ConfigurationProperties(prefix = JwtConfiguration.PREFIX) +public class JwtConfiguration { + /** + * The constant PREFIX. + */ + public static final String PREFIX = "maf.configuration.jwt"; + public static final String TOKEN_PREFIX = "Bearer "; + /** + * Key prefix of JWT stored in Redis. + */ + @Setter(AccessLevel.NONE) + private String jwtRedisKeyPrefix; + + public JwtConfiguration(MafProjectProperty mafProjectProperty) { + this.signingKey = String.format("%s@%s", mafProjectProperty.getProjectParentArtifactId(), + mafProjectProperty.getVersion()); + log.info("Initiated JWT signing key: {}. The specified key byte array is {} bits", this.signingKey, + this.signingKey.getBytes(StandardCharsets.UTF_8).length * 8); + jwtRedisKeyPrefix = String.format("%s:jwt:", mafProjectProperty.getProjectParentArtifactId()); + log.warn("Initiated 'jwtRedisKeyPrefix': {}", jwtRedisKeyPrefix); + } + + /** + * JWT signing key. Pattern: [project-parent-artifact-id]@[version] + */ + @Setter(AccessLevel.NONE) + private String signingKey; + /** + * Time to live of JWT. Default: 3 * 600000 milliseconds (1800000 ms, 30 min). + */ + @NotNull + private Long ttl = 3 * 600000L; + /** + * Time to live of JWT for remember me, Default: 7 * 86400000 milliseconds (604800000 ms, 7 day) + */ + @NotNull + private Long ttlForRememberMe = 7 * 86400000L; +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/configuration/MafConfiguration.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/configuration/MafConfiguration.java new file mode 100644 index 00000000..f0dcc586 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/configuration/MafConfiguration.java @@ -0,0 +1,162 @@ +package com.jmsoftware.maf.springcloudstarter.configuration; + +import cn.hutool.core.util.ObjectUtil; +import com.google.common.collect.Lists; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import lombok.val; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.PostConstruct; +import javax.validation.Valid; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Pattern; +import java.util.ArrayList; +import java.util.List; + +/** + *

MafConfiguration

+ *

MAF Configuration which are written in .yml files, containing a variety of fragmentary configs. Such as, + * Druid login info, web security switch, web log and so on.

+ * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com + * @date 2019-03-23 14:24 + **/ +@Data +@Slf4j +@Validated +@ConfigurationProperties(prefix = "maf.configuration") +public class MafConfiguration { + /** + *

The role name of super user (admin) who has no restriction to access any system's resources.

+ *

ATTENTION: The value of role name of super user must be equal to the value that is + * persistent in database.

+ */ + @NotBlank + private String superUserRole = "admin"; + /** + *

The role name of guest user (guest) who has restrictions to access any system's resources. Assigning + * the guest role to new user by default.

+ *

ATTENTION: The value of role of guest user must be equal to the value that is + * persistent in database.

+ */ + @NotBlank + private String guestUserRole = "guest"; + /** + * Ignore URLs, used by web access log filter and web security. + */ + @Valid + private IgnoredUrl ignoredUrl; + /** + *

Web security feature switch. Default is true.

+ * true - disable web security; false - enable web security. + */ + @NotNull + private Boolean webSecurityEnabled = Boolean.TRUE; + /** + * Web request log switch. Default is true. + *

+ * true - disable web request log; false - enable web request log. + */ + @NotNull + private Boolean webRequestLogEnabled = Boolean.TRUE; + /** + * Included package for http api scan, could be base package + */ + @NotBlank + private String includedPackageForHttpApiScan; + /** + * Swagger switch. true: enabled; false: disabled. + */ + @NotNull + private Boolean swaggerEnabled = Boolean.TRUE; + + /** + * Flatten ignored urls string [ ]. + * + * @return the string [ ] + */ + public String[] flattenIgnoredUrls() { + if (ObjectUtil.isNull(ignoredUrl)) { + return new String[0]; + } + val flattenIgnoredUrls = new ArrayList(); + flattenIgnoredUrls.addAll(ignoredUrl.getGet()); + flattenIgnoredUrls.addAll(ignoredUrl.getPost()); + flattenIgnoredUrls.addAll(ignoredUrl.getDelete()); + flattenIgnoredUrls.addAll(ignoredUrl.getPut()); + flattenIgnoredUrls.addAll(ignoredUrl.getHead()); + flattenIgnoredUrls.addAll(ignoredUrl.getPatch()); + flattenIgnoredUrls.addAll(ignoredUrl.getOptions()); + flattenIgnoredUrls.addAll(ignoredUrl.getTrace()); + flattenIgnoredUrls.addAll(ignoredUrl.getPattern()); + return flattenIgnoredUrls.toArray(new String[0]); + } + + @PostConstruct + private void postConstruct() { + log.warn("Initial bean: '{}'", this.getClass().getSimpleName()); + } + + /** + *

IgnoredUrl

+ *

+ * Ignored URL configuration. + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 2/9/2021 9:39 AM + **/ + @Data + public static class IgnoredUrl { + private interface Constant { + String URL_REGEXP = "^(/.+)+$"; + } + + /** + * Ignored URL pattern. + */ + @Valid + private List<@Pattern(regexp = Constant.URL_REGEXP) String> pattern = Lists.newArrayList(); + /** + * Ignored GET request. + */ + @Valid + private List<@Pattern(regexp = Constant.URL_REGEXP) String> get = Lists.newArrayList(); + /** + * Ignored POST request. + */ + @Valid + private List<@Pattern(regexp = Constant.URL_REGEXP) String> post = Lists.newArrayList(); + /** + * Ignored DELETE request. + */ + @Valid + private List<@Pattern(regexp = Constant.URL_REGEXP) String> delete = Lists.newArrayList(); + /** + * Ignored PUT request. + */ + @Valid + private List<@Pattern(regexp = Constant.URL_REGEXP) String> put = Lists.newArrayList(); + /** + * Ignored HEAD request. + */ + @Valid + private List<@Pattern(regexp = Constant.URL_REGEXP) String> head = Lists.newArrayList(); + /** + * Ignored PATCH request. + */ + @Valid + private List<@Pattern(regexp = Constant.URL_REGEXP) String> patch = Lists.newArrayList(); + /** + * Ignored OPTIONS request. + */ + @Valid + private List<@Pattern(regexp = Constant.URL_REGEXP) String> options = Lists.newArrayList(); + /** + * Ignored TRACE request. + */ + @Valid + private List<@Pattern(regexp = Constant.URL_REGEXP) String> trace = Lists.newArrayList(); + } +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/configuration/MafProjectProperty.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/configuration/MafProjectProperty.java new file mode 100644 index 00000000..949e318b --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/configuration/MafProjectProperty.java @@ -0,0 +1,111 @@ +package com.jmsoftware.maf.springcloudstarter.configuration; + +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.boot.info.BuildProperties; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.PostConstruct; +import javax.validation.constraints.NotBlank; + +/** + *

MafProjectProperty

+ *

+ * M&F project property, containing the basic constants of the project. + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 12/29/2020 12:57 PM + */ +@Data +@Slf4j +@Validated +@SuppressWarnings("jol") +@ConfigurationProperties(prefix = "maf.project-property") +public class MafProjectProperty { + private final BuildProperties buildProperties; + /** + * The Base package. + */ + @NotBlank + private String basePackage; + /** + * The Context path. + */ + private String contextPath; + /** + * The Group id. + */ + @NotBlank + private String groupId; + /** + * The Project parent artifact id. + */ + @NotBlank + private String projectParentArtifactId; + /** + * The Project artifact id. + */ + @NotBlank + private String projectArtifactId; + /** + * The Version. + */ + @NotBlank + private String version; + /** + * The Description. + */ + @NotBlank + private String description; + /** + * The Jdk version. + */ + @NotBlank + private String jdkVersion; + /** + * The Environment. + */ + @NotBlank + private String environment; + /** + * The Url. + */ + private String url; + /** + * The Inception year. + */ + private String inceptionYear; + /** + * The Organization name. + */ + private String organizationName; + /** + * The Organization url. + */ + private String organizationUrl; + /** + * The Issue management system. + */ + private String issueManagementSystem; + /** + * The Issue management url. + */ + private String issueManagementUrl; + /** + * The Developer name. + */ + private String developerName; + /** + * The Developer email. + */ + private String developerEmail; + /** + * The Developer url. + */ + private String developerUrl; + + @PostConstruct + private void postConstruct() { + log.warn("Initial bean: '{}'", this.getClass().getSimpleName()); + } +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/configuration/MinioConfiguration.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/configuration/MinioConfiguration.java new file mode 100644 index 00000000..c5011ad5 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/configuration/MinioConfiguration.java @@ -0,0 +1,38 @@ +package com.jmsoftware.maf.springcloudstarter.configuration; + +import com.jmsoftware.maf.springcloudstarter.helper.MinioHelper; +import io.minio.MinioClient; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Import; + +/** + *

MinioConfiguration

+ *

+ * Change description here. + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 6/7/21 9:58 PM + **/ +@Slf4j +@Import({ + MinioProperty.class +}) +@ConditionalOnProperty({"minio.enabled"}) +public class MinioConfiguration { + @Bean + public MinioClient minioClient(MinioProperty minioProperty) { + log.warn("Initial bean: '{}'", MinioClient.class.getSimpleName()); + return MinioClient.builder() + .endpoint(minioProperty.getEndpoint(), minioProperty.getPort(), + minioProperty.getSecure()) + .credentials(minioProperty.getAccessKey(), minioProperty.getSecretKey()) + .build(); + } + + @Bean + public MinioHelper minioHelper(MinioClient minioClient) { + log.warn("Initial bean: '{}'", MinioHelper.class.getSimpleName()); + return new MinioHelper(minioClient); + } +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/configuration/MinioProperty.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/configuration/MinioProperty.java new file mode 100644 index 00000000..18feb96a --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/configuration/MinioProperty.java @@ -0,0 +1,62 @@ +package com.jmsoftware.maf.springcloudstarter.configuration; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.validation.annotation.Validated; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + *

MinioProperty

+ *

+ * Change description here. + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 6/7/21 9:39 PM + */ +@Data +@Validated +@ConfigurationProperties(prefix = MinioProperty.PREFIX) +public class MinioProperty { + /** + * The constant PREFIX. + */ + public static final String PREFIX = "minio"; + /** + * The Enabled. + */ + @NotNull + private Boolean enabled = Boolean.FALSE; + /** + * The Endpoint. + */ + @NotBlank + private String endpoint; + /** + * The Port. + */ + @NotNull + private Integer port; + /** + * The Access key. User ID + */ + @NotBlank + private String accessKey; + /** + * The Secret key. Password + */ + @NotBlank + private String secretKey; + /** + * The Secure. + */ + private Boolean secure = Boolean.FALSE; + /** + * The Bucket name. + */ + private String bucketName; + /** + * The Config dir. + */ + private String configDir; +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/configuration/RabbitmqConfiguration.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/configuration/RabbitmqConfiguration.java new file mode 100644 index 00000000..05e03a77 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/configuration/RabbitmqConfiguration.java @@ -0,0 +1,36 @@ +package com.jmsoftware.maf.springcloudstarter.configuration; + +import lombok.extern.slf4j.Slf4j; +import lombok.val; +import org.springframework.amqp.core.TopicExchange; +import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter; +import org.springframework.amqp.support.converter.MessageConverter; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.context.annotation.Bean; + +/** + * Description: RabbitmqConfiguration, change description here. + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 3/9/2021 11:31 AM + **/ +@Slf4j +@ConditionalOnClass({TopicExchange.class}) +public class RabbitmqConfiguration { + public final String topicExchangeName; + + public RabbitmqConfiguration(MafProjectProperty mafProjectProperty) { + topicExchangeName = String.format("%s-topic-exchange", mafProjectProperty.getProjectParentArtifactId()); + } + + @Bean + TopicExchange topicExchange() { + val exchange = new TopicExchange(topicExchangeName); + log.info("Created topic exchange: {}", exchange); + return exchange; + } + + @Bean + public MessageConverter messageConverter() { + return new Jackson2JsonMessageConverter(); + } +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/configuration/RestTemplateConfiguration.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/configuration/RestTemplateConfiguration.java new file mode 100644 index 00000000..cfb98fdf --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/configuration/RestTemplateConfiguration.java @@ -0,0 +1,39 @@ +package com.jmsoftware.maf.springcloudstarter.configuration; + +import lombok.extern.slf4j.Slf4j; +import lombok.val; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; +import org.springframework.cloud.client.loadbalancer.LoadBalanced; +import org.springframework.context.annotation.Bean; +import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; +import org.springframework.web.client.DefaultResponseErrorHandler; +import org.springframework.web.client.RestTemplate; + +/** + * Description: RestTemplateConfiguration, change description here. + * + * @author 钟俊(zhongjun), email: zhongjun@toguide.cn, date: 1/29/2021 4:29 PM + **/ +@Slf4j +public class RestTemplateConfiguration { + @Bean + @LoadBalanced + public RestTemplate restTemplate() { + val poolingHttpClientConnectionManager = new PoolingHttpClientConnectionManager(); + poolingHttpClientConnectionManager.setMaxTotal(1000); + poolingHttpClientConnectionManager.setDefaultMaxPerRoute(1000); + val httpClientBuilder = HttpClients.custom(); + httpClientBuilder.setConnectionManager(poolingHttpClientConnectionManager); + val httpClient = httpClientBuilder.build(); + val httpComponentsClientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory(httpClient); + httpComponentsClientHttpRequestFactory.setConnectTimeout(6000); + httpComponentsClientHttpRequestFactory.setReadTimeout(6000); + httpComponentsClientHttpRequestFactory.setConnectionRequestTimeout(200); + val restTemplate = new RestTemplate(); + restTemplate.setRequestFactory(httpComponentsClientHttpRequestFactory); + restTemplate.setErrorHandler(new DefaultResponseErrorHandler()); + log.warn("Initial bean: '{}'", restTemplate.getClass().getSimpleName()); + return restTemplate; + } +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/configuration/Swagger2Configuration.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/configuration/Swagger2Configuration.java new file mode 100644 index 00000000..7c43fcd9 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/configuration/Swagger2Configuration.java @@ -0,0 +1,69 @@ +package com.jmsoftware.maf.springcloudstarter.configuration; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import lombok.val; +import org.springframework.context.annotation.Bean; +import springfox.documentation.builders.ApiInfoBuilder; +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.service.ApiInfo; +import springfox.documentation.service.Contact; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spring.web.plugins.Docket; +import springfox.documentation.swagger2.annotations.EnableSwagger2WebMvc; + +import javax.annotation.PostConstruct; + +/** + *

Swagger2Configuration

+ *

+ * Click me to view API documentation + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com + * @date 2019-02-07 16:15 + **/ +@Slf4j +@EnableSwagger2WebMvc +@RequiredArgsConstructor +public class Swagger2Configuration { + private final MafConfiguration mafConfiguration; + private final MafProjectProperty mafProjectProperty; + + @PostConstruct + private void postConstruct() { + log.warn("[UNSAFE] Swagger 2 is enabled, the internal and external APIs will be exposed"); + } + + private ApiInfo apiInfo() { + val projectArtifactId = mafProjectProperty.getProjectArtifactId(); + val version = mafProjectProperty.getVersion(); + val developerEmail = mafProjectProperty.getDeveloperEmail(); + val developerUrl = mafProjectProperty.getDeveloperUrl(); + return new ApiInfoBuilder() + .title(String.format("API for %s@%s", projectArtifactId, version)) + .description(String.format("%s Artifact ID: %s Environment: %s", + mafProjectProperty.getDescription(), + projectArtifactId, + mafProjectProperty.getEnvironment())) + .contact(new Contact(String.format("%s, email: %s Home page: %s", + mafProjectProperty.getDeveloperName(), + developerEmail, + developerUrl), + developerUrl, developerEmail)) + .version(version) + .build(); + } + + @Bean + public Docket docket(MafProjectProperty mafProjectProperty) { + log.warn("Initial bean: '{}'", Docket.class.getSimpleName()); + return new Docket(DocumentationType.SWAGGER_2) + .enable(mafConfiguration.getSwaggerEnabled()) + .apiInfo(apiInfo()) + .select() + .apis(RequestHandlerSelectors.basePackage(mafProjectProperty.getBasePackage())) + .paths(PathSelectors.any()) + .build(); + } +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/configuration/TypeConversionConfiguration.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/configuration/TypeConversionConfiguration.java new file mode 100644 index 00000000..1064bee1 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/configuration/TypeConversionConfiguration.java @@ -0,0 +1,62 @@ +package com.jmsoftware.maf.springcloudstarter.configuration; + +import cn.hutool.core.date.LocalDateTimeUtil; +import cn.hutool.core.util.StrUtil; +import com.jmsoftware.maf.common.constant.UniversalDateTime; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; +import org.springframework.context.annotation.Bean; +import org.springframework.core.convert.converter.Converter; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; + +/** + * Description: TypeConvesionConfiguration, change description here. + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 6/27/2021 9:36 PM + **/ +@Slf4j +public class TypeConversionConfiguration { + @Bean + public StringToLocalDateConverter localDateConverter() { + return source -> { + if (StrUtil.isBlank(source)) { + return null; + } + return LocalDateTimeUtil.parseDate(source, UniversalDateTime.DATE_FORMAT); + }; + } + + @Bean + public StringToLocalTimeConverter localTimeConverter() { + return source -> { + if (StrUtil.isBlank(source)) { + return null; + } + return LocalTime.parse(source, DateTimeFormatter.ofPattern(UniversalDateTime.TIME_FORMAT)); + }; + } + + @Bean + @ConditionalOnBean(name = "requestMappingHandlerAdapter") + public StringToLocalDateTimeConverter localDateTimeConverter() { + return source -> { + if (StrUtil.isBlank(source)) { + return null; + } + return LocalDateTimeUtil.parse(source, UniversalDateTime.DATE_TIME_FORMAT); + }; + } + + interface StringToLocalDateConverter extends Converter { + } + + interface StringToLocalTimeConverter extends Converter { + } + + interface StringToLocalDateTimeConverter extends Converter { + } +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/configuration/WebMvcConfiguration.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/configuration/WebMvcConfiguration.java new file mode 100644 index 00000000..62e18d0e --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/configuration/WebMvcConfiguration.java @@ -0,0 +1,43 @@ +package com.jmsoftware.maf.springcloudstarter.configuration; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +import static org.springframework.web.cors.CorsConfiguration.ALL; + +/** + *

WebMvcConfiguration

+ *

+ * Spring MVC Configurations. + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com + * @date 1/23/20 9:02 AM + **/ +@Slf4j +@RequiredArgsConstructor +public class WebMvcConfiguration implements WebMvcConfigurer { + /** + * Max age: 3600 seconds (1 hour). Configure how long in seconds the response from a pre-flight request + * can be cached by clients. By default this is set to 1800 seconds (30 minutes). + */ + private static final long MAX_AGE_SECS = 3600; + + /** + * Configure cross origin requests processing. + * + * @param registry CORS registry + */ + @SuppressWarnings("BroadCORSAllowOrigin") + @Override + public void addCorsMappings(CorsRegistry registry) { + log.info("Configuring CORS allowedOrigins: {}, allowedMethods: {}, allowedHeaders: {}", ALL, ALL, ALL); + registry.addMapping("/**") + .allowCredentials(true) + .allowedOriginPatterns(ALL) + .allowedMethods(ALL) + .allowedHeaders(ALL) + .maxAge(MAX_AGE_SECS); + } +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/configuration/WebSecurityConfiguration.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/configuration/WebSecurityConfiguration.java new file mode 100644 index 00000000..f3c4475e --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/configuration/WebSecurityConfiguration.java @@ -0,0 +1,45 @@ +package com.jmsoftware.maf.springcloudstarter.configuration; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Bean; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; + +import javax.annotation.PostConstruct; + +/** + *

WebSecurityConfiguration

+ *

+ * Security handler configuration. + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com + * @date 5/2/20 11:41 PM + **/ +@Slf4j +@EnableWebSecurity +public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter { + @PostConstruct + void postConstruct() { + log.warn("Initial bean: '{}'", WebSecurityConfiguration.class.getSimpleName()); + } + + @Override + public AuthenticationManager authenticationManager() throws Exception { + return super.authenticationManagerBean(); + } + + @Override + protected void configure(HttpSecurity http) throws Exception { + // Disable Web Security. + http.authorizeRequests().anyRequest().permitAll().and().csrf().disable().cors().disable(); + } + + @Bean + public BCryptPasswordEncoder bcryptPasswordEncoder() { + log.warn("Initial bean: '{}'", BCryptPasswordEncoder.class.getSimpleName()); + return new BCryptPasswordEncoder(); + } +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/controller/AbstractExcelImportController.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/controller/AbstractExcelImportController.java new file mode 100644 index 00000000..89a5707c --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/controller/AbstractExcelImportController.java @@ -0,0 +1,1127 @@ +package com.jmsoftware.maf.springcloudstarter.controller; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.jmsoftware.maf.common.bean.ExcelImportResult; +import com.jmsoftware.maf.common.bean.ResponseBodyBean; +import com.jmsoftware.maf.springcloudstarter.configuration.ExcelImportConfiguration; +import com.jmsoftware.maf.springcloudstarter.sftp.SftpHelper; +import com.jmsoftware.maf.springcloudstarter.sftp.SftpUploadFile; +import com.jmsoftware.maf.springcloudstarter.util.PoiUtil; +import io.swagger.annotations.ApiOperation; +import lombok.*; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.io.FileUtils; +import org.apache.commons.io.FilenameUtils; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.poifs.filesystem.POIFSFileSystem; +import org.apache.poi.ss.usermodel.*; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.springframework.boot.system.ApplicationHome; +import org.springframework.integration.file.support.FileExistsMode; +import org.springframework.util.Assert; +import org.springframework.util.ReflectionUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.multipart.MultipartHttpServletRequest; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import java.beans.IntrospectionException; +import java.beans.Introspector; +import java.beans.PropertyDescriptor; +import java.io.BufferedInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.lang.reflect.ParameterizedType; +import java.math.BigDecimal; +import java.text.SimpleDateFormat; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; +import java.util.*; + +/** + *

AbstractExcelImportController

+ *

Abstract controller for excel data import.

+ *

Features

+ *
    + *
  1. Row validation. If not valid, will generate error message at the last cell.
  2. + *
  3. Generalization support. AbstractExcelImportController<ExcelImportBeanType>
  4. + *
  5. Using annotation @ExcelColumn for fields can be generating Excel easier than ever.
  6. + *
  7. Support partial data import.
  8. + * + *
+ *

Understanding of the Lifecycle

+ *

Understanding of the lifecycle will help us make less mistakes during programming.

+ *

I. initContext()

+ *

Initialize context. Generate the field name array of ExcelImportBeanType by reflection.

+ *

II. registerBindHandlerMethods()

+ *

Register bind handler methods (starts with ‘“check”, like checkString()).

+ *

III. registerHandlerMethods()

+ *

Register default handler methods (starts with ‘“check”, like checkString()).

+ *

IV. beforeExecute()

+ *

Left black. Can be overridden by sub class.

+ *

V. initLocaleContext()

+ *

Initialize locale context for current thread. Main work below:

+ *
    + *
  • errorMessageList
  • + *
  • beanList
  • + *
  • returnMessageList
  • + *
  • rowLocation
  • + *
  • columnLocation
  • + *
  • sheetLocation
  • + *
  • readingRowCount
  • + * + *
+ *

After initializing, will upload Excel, read and bind data, validate data.

+ *

VI. beforeDatabaseOperation()

+ *

Left black. Can be overridden by sub class.

+ *

VII. executeDatabaseOperation()

+ *

Must be implemented by sub class.

+ *

VIII. onExceptionOccurred()

+ *

If any exceptions occur, this method will be called. Must be implemented by sub class.

+ *

Ⅸ. afterExecute()

+ *

Delete temporary file.

+ *

X. destroyLocaleContext()

+ *

Destroy locale context, in opposite of initLocaleContext().

+ * + * @param Excel import bean type + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 2/19/2021 10:06 AM + */ +@Slf4j +@SuppressWarnings({"unused"}) +public abstract class AbstractExcelImportController { + /** + * Temporary file path + */ + private static final String TEMP_FILE_PATH = + new ApplicationHome(AbstractExcelImportController.class).getSource() + .getParent() + "/temp-file/"; + /** + * SFTP upload directory + */ + private static final String SFTP_DIR = "excels/"; + /** + * File key in MultipartFile + * TODO: check if it's necessary + */ + private static final String FILE_KEY = "upload_file"; + /** + * Default check method prefix + */ + private static final String DEFAULT_CHECK_METHOD_PREFIX = "check"; + /** + * The constant XLS. + */ + private static final String XLS = "xls"; + /** + * The constant XLSX. + */ + private static final String XLSX = "xlsx"; + /** + * The User defined message. + */ + protected ThreadLocal userDefinedMessage = new ThreadLocal<>(); + /** + * Deny all data when data validation fails. Default value is true. + */ + private Boolean denyAll = Boolean.TRUE; + /** + * The class of ExcelImportBeanType + */ + private Class bindClass; + /** + * Data type and bind method + */ + private final Map, Method> bindMethodMap = new HashMap<>(); + /** + * The field names arrays of the ExcelImportBeanType + */ + private String[] fieldNameArray; + /** + * File name + */ + @Getter + @Setter + private String fileName; + /** + * Custom validation method + *

+ * Start with `check`, parameter is List list, return value is String or Boolean. + *

+ * e.g public String checkName(List list) + */ + private final Map checkMethodMap = new HashMap<>(); + /** + * Sheet location when binging data. + */ + private final ThreadLocal sheetLocation = new ThreadLocal<>(); + /** + * Row location + */ + private final ThreadLocal rowLocation = new ThreadLocal<>(); + /** + * Column location + */ + private final ThreadLocal columnLocation = new ThreadLocal<>(); + /** + * Reading row count + */ + private final ThreadLocal readingRowCount = new ThreadLocal<>(); + /** + * Error message list + */ + protected ThreadLocal> errorMessageList = new ThreadLocal<>(); + /** + * Bean list. After reading Excel + */ + protected final ThreadLocal> beanList = new ThreadLocal<>(); + /** + * Return message list + */ + private final ThreadLocal> returnMessageList = new ThreadLocal<>(); + /** + * The Workbook. + */ + protected final ThreadLocal workbook = new ThreadLocal<>(); + /** + * The Workbook with error message. + */ + protected final ThreadLocal workbookWithErrorMessage = new ThreadLocal<>(); + /** + * The Excel file path. + */ + protected final ThreadLocal excelFilePath = new ThreadLocal<>(); + /** + * The Exception occurred. + */ + protected final ThreadLocal exceptionOccurred = new ThreadLocal<>(); + /** + * The File. + */ + protected final ThreadLocal file = new ThreadLocal<>(); + + @Resource + protected SftpHelper sftpHelper; + @Resource + protected ExcelImportConfiguration excelImportConfiguration; + + /** + *

Constructor of AbstractExcelImportController

+ *
    + *
  1. Init context

    + *
  2. + *
  3. Register bind handler methods

    + *
  4. + *
  5. Register handler methods

    + *
  6. + *
+ */ + public AbstractExcelImportController() { + initContext(); + registerBindHandlerMethods(); + registerHandlerMethods(); + } + + /** + * Init locale context. + */ + private void initLocaleContext() { + errorMessageList.set(new LinkedList<>()); + beanList.set(new LinkedList<>()); + returnMessageList.set(new LinkedList<>()); + rowLocation.set(0); + columnLocation.set(0); + sheetLocation.set(0); + readingRowCount.set(0); + userDefinedMessage.set(""); + exceptionOccurred.set(false); + } + + /** + * On exception occurred. + */ + protected abstract void onExceptionOccurred(); + + /** + * Destroy locale context. + */ + private void destroyLocaleContext() { + errorMessageList.remove(); + beanList.remove(); + returnMessageList.remove(); + rowLocation.remove(); + columnLocation.remove(); + sheetLocation.remove(); + readingRowCount.remove(); + userDefinedMessage.remove(); + closeWorkbook(workbook.get()); + workbook.remove(); + closeWorkbook(workbookWithErrorMessage.get()); + workbookWithErrorMessage.remove(); + excelFilePath.remove(); + exceptionOccurred.remove(); + file.remove(); + } + + /** + * Close workbook. + * + * @param workbook the workbook + */ + private void closeWorkbook(Workbook workbook) { + if (workbook != null) { + try { + workbook.close(); + } catch (IOException e) { + log.error("Exception occurred when closing workbook! Exception message: {}, workbook: {}", + e.getMessage(), workbook); + } + } + } + + /** + * Upload excel file. Any exceptions happened in any lifecycle will not interrupt the whole process. + * + * @param request the request + * @return the response body bean + */ + @PostMapping(value = "/upload", headers = "content-type=multipart/form-data") + @ApiOperation(value = "Upload Excel file", notes = "Upload Excel file") + public ResponseBodyBean upload(HttpServletRequest request) { + beforeExecute(); + initLocaleContext(); + try { + setReturnMessageList("Starting - Upload Excel file…"); + file.set(uploadFile((MultipartHttpServletRequest) request)); + setReturnMessageList("Finished - Upload Excel file"); + } catch (IOException e) { + log.error("Exception occurred when uploading file!", e); + setErrorMessage( + String.format("Exception occurred when uploading file! Exception message: %s", e.getMessage())); + } + try { + setReturnMessageList("Starting - Read Excel file…"); + workbook.set(readFile(file.get())); + setReturnMessageList("Finished - Read Excel file"); + } catch (IOException e) { + log.error("Exception occurred when reading Excel file!", e); + setErrorMessage( + String.format("Exception occurred when reading Excel file! Exception message: %s", e.getMessage())); + } + try { + setReturnMessageList("Starting - Validate and bind data…"); + bindData(workbook.get()); + setReturnMessageList("Finished - Validate and bind data"); + } catch (Exception e) { + log.error("Exception occurred when validating and binding data!", e); + setErrorMessage(String.format("Exception occurred when validating and binding data! Exception message: %s", + e.getMessage())); + } + beforeDatabaseOperation(this.beanList.get()); + // if no error message (errorMessageList if empty) or not denyAll, then execute DB operation + if (CollectionUtil.isEmpty(this.errorMessageList.get()) || !denyAll) { + if (CollectionUtil.isNotEmpty(this.beanList.get())) { + setReturnMessageList("Starting - Import data…"); + try { + executeDatabaseOperation(this.beanList.get()); + setReturnMessageList( + String.format("Finished - Import data. Imported count: %d", beanList.get().size())); + } catch (Exception e) { + exceptionOccurred.set(true); + log.error("Exception occurred when executing DB operation!", e); + setErrorMessage( + String.format("Exception occurred when executing DB operation! Exception message: %s", + e.getMessage())); + } + } else { + setReturnMessageList( + String.format("Finished - Import data. Empty list. Imported count: %d", beanList.get().size())); + } + } else { + setReturnMessageList("[Warning] Found not valid data. Data import all failed!"); + } + if (exceptionOccurred.get()) { + onExceptionOccurred(); + } + ExcelImportResult excelImportResult = new ExcelImportResult(); + excelImportResult.setMessageList(this.returnMessageList.get()); + excelImportResult.setExcelFilePath(this.excelFilePath.get()); + afterExecute(); + destroyLocaleContext(); + return ResponseBodyBean.ofSuccess(excelImportResult); + } + + /** + * Before execute. + */ + protected void beforeExecute() { + } + + /** + * After execute. Delete file. + */ + protected void afterExecute() { + Optional optionalFile = Optional.ofNullable(file.get()); + optionalFile.ifPresent(file1 -> { + boolean deleted = file1.delete(); + if (deleted) { + log.warn("Deleted file. File absolute path: {}", file1.getAbsolutePath()); + } else { + log.warn("The file cannot be deleted!File absolute path: {}", file1.getAbsolutePath()); + } + }); + if (optionalFile.isEmpty()) { + log.warn("The file does not exist!"); + } + } + + /** + * Before database operation. + * + * @param beanList the bean list + */ + protected void beforeDatabaseOperation(List beanList) { + } + + /** + *

Register handler methods

+ *
    + *
  • e.g: private Boolean checkXXX(String value,Integer index)
  • + *
  • e.g: private String checkXXX(String value,Integer index), the return value can be empty or + * “true”, or other error message which will be added to errorMessage
  • + *
+ */ + private void registerHandlerMethods() { + this.checkMethodMap.clear(); + // Register valid methods for validation + Method[] methods = this.getClass().getDeclaredMethods(); + for (Method method : methods) { + if (isCheckMethod(method)) { + registerCheckMethod(method); + } + } + } + + /** + *

Check if method is valid for validation.

+ *
    + *
  1. Method name starts with `check`

    + *
  2. + *
  3. Parameter is String value

    + *
  4. + *
  5. Return value is Boolean

    + *
  6. + *
+ * + * @param method the method + * @return the boolean + */ + private Boolean isCheckMethod(Method method) { + val returnType = method.getReturnType(); + if (method.getName().startsWith(DEFAULT_CHECK_METHOD_PREFIX)) { + if (String.class.equals(returnType) || Boolean.class.equals(returnType) || boolean.class.equals( + returnType)) { + Class[] parameterTypes = method.getParameterTypes(); + return parameterTypes.length >= 2 && String.class.equals(parameterTypes[0]) + && (int.class.equals(parameterTypes[1]) || Integer.class.equals(parameterTypes[1])); + } + } + return false; + } + + /** + * Register check method. + * + * @param method the method + */ + private void registerCheckMethod(Method method) { + var fieldName = method.getName(). + substring(DEFAULT_CHECK_METHOD_PREFIX.length()); + fieldName = fieldName.substring(0, 1).toLowerCase() + fieldName.substring(1); + this.checkMethodMap.put(fieldName, method); + log.info("Registered check method [" + method.getName() + "]"); + } + + /** + *

Init context.

+ *
    + *
  1. Call getGenericClass() to set Excel import type;

    + *
  2. + *
  3. Set fieldNameArray

    + *
  4. + *
+ */ + protected void initContext() { + bindClass = this.getGenericClass(); + val declaredFields = bindClass.getDeclaredFields(); + val fieldNameArray = new String[declaredFields.length]; + for (var index = 0; index < declaredFields.length; index++) { + val declaredField = declaredFields[index]; + fieldNameArray[index] = declaredField.getName(); + } + log.info("Generated {} field name array by reflection, fieldNameArray: {}", bindClass.getSimpleName(), + fieldNameArray); + this.setFieldNameArray(fieldNameArray); + } + + /** + * Gets generic class. + * + * @return the generic class + */ + private Class getGenericClass() { + val type = getClass().getGenericSuperclass(); + log.info("Got type by reflection, typeName: {}", type.getTypeName()); + if (type instanceof ParameterizedType) { + val parameterizedType = (ParameterizedType) type; + val typeName = parameterizedType.getActualTypeArguments()[0].getTypeName(); + Class aClass; + try { + //noinspection unchecked + aClass = (Class) Class.forName(typeName); + } catch (ClassNotFoundException e) { + log.error("Exception occurred when looking for class!", e); + throw new RuntimeException( + "Exception occurred when looking for class! Exception message:" + e.getMessage()); + } + return aClass; + } + throw new RuntimeException("Cannot find the type from the generic class!"); + } + + /** + * Execute database operation. + * + * @param beanList the bean list that can be used for DB operations + * @throws Exception the exception + */ + protected abstract void executeDatabaseOperation(List beanList) throws Exception; + + /** + * Validate before adding to bean list boolean. + * + * @param beanList the bean list that contains validated bean + * @param bean the bean that needs to be validated + * @param index the index that is the reference to the row number of the Excel file + * @return the boolean + * @throws IllegalArgumentException the illegal argument exception + */ + protected abstract boolean validateBeforeAddToBeanList(List beanList, + ExcelImportBeanType bean, + int index) throws IllegalArgumentException; + + /** + * Sets field name array. + * + * @param fieldNameArray the field name array + */ + public void setFieldNameArray(String[] fieldNameArray) { + this.fieldNameArray = fieldNameArray; + } + + /** + * 上传文件到本地(暂时) + *

+ * TODO: check the method if is necessary or not + * + * @param itemBytes the item bytes + * @param fileName the file name + * @return File file + */ + private File uploadTempFile(byte[] itemBytes, String fileName) { + val fileFullPath = TEMP_FILE_PATH + fileName; + log.info("上传文件到本地(暂时)。文件绝对路径:{}", fileFullPath); + // 新建文件 + val file = new File(fileFullPath); + if (!file.getParentFile().exists()) { + //noinspection ResultOfMethodCallIgnored + file.getParentFile().mkdir(); + } + // 上传 + // FileCopyUtils.copy(itemBytes, file); + return file; + } + + /** + * Upload file. + * + * @param request the request + * @return File file + * @throws IOException the io exception + * @see + * Upload large files : Spring Boot + */ + @SuppressWarnings("AlibabaRemoveCommentedCode") + private File uploadFile(MultipartHttpServletRequest request) throws IOException { + val multipartFile = request.getFileMap().get(FILE_KEY); + // Don't do this. + // it loads all of the bytes in java heap memory that leads to OutOfMemoryError. We'll use stream instead. + // byte[] fileBytes = multipartFile.getBytes(); + @Cleanup val fileStream = new BufferedInputStream(multipartFile.getInputStream()); + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS")); + val fileName = String.format("%s%s", + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS")), + multipartFile.getOriginalFilename()); + val targetFile = new File(TEMP_FILE_PATH + fileName); + FileUtils.copyInputStreamToFile(fileStream, targetFile); + uploadFileToSftp(targetFile); + return targetFile; + } + + /** + * Read the file into workbook. + * + * @param file the file + * @return the workbook + * @throws IOException the io exception + */ + private Workbook readFile(@NonNull File file) throws IOException { + Workbook workbook = null; + val extension = FilenameUtils.getExtension(file.getName()); + val bufferedInputStream = new BufferedInputStream(new FileInputStream(file)); + if (XLS.equals(extension)) { + POIFSFileSystem poifsFileSystem = new POIFSFileSystem(bufferedInputStream); + workbook = new HSSFWorkbook(poifsFileSystem); + bufferedInputStream.close(); + } else if (XLSX.equals(extension)) { + workbook = new XSSFWorkbook(bufferedInputStream); + } + return workbook; + } + + /** + * Upload file to SFTP + * + * @param file the file + */ + private void uploadFileToSftp(File file) { + val sftpUploadFile = SftpUploadFile.builder() + .fileToBeUploaded(file) + .fileExistsMode(FileExistsMode.REPLACE) + .subDirectory(SFTP_DIR).build(); + try { + sftpHelper.upload(sftpUploadFile); + } catch (Exception e) { + log.error("Exception occurred when uploading file to SFTP! Exception message:{}", e.getMessage()); + } + } + + /** + * Filter sheet. In default, will proceed all sheets. + * + * @param sheet the sheet + * @return the boolean + */ + protected boolean filterSheet(Sheet sheet) { + return true; + } + + /** + *

Bind data from the workbook. Processes below:

+ *
    + *
  • Bind data to the instance of bindClass, according to the fieldNameArray.

    + *
  • + *
  • Validate the field by callback method

    + *
  • + *
+ * + * @param workbook the workbook + * @throws Exception the exception + */ + @SuppressWarnings("RedundantThrows") + private void bindData(Workbook workbook) throws Exception { + for (int index = 0; index < workbook.getNumberOfSheets(); index++) { + val sheet = workbook.getSheetAt(index); + if (!filterSheet(sheet)) { + continue; + } + // Specify current sheet location + sheetLocation.set(index + 1); + sheet.getSheetName(); + // Set Reading row count + readingRowCount.set(readingRowCount.get() + sheet.getLastRowNum() - sheet.getFirstRowNum()); + // Check if exceeding the MAXIMUM_ROW_COUNT + if (readingRowCount.get() > excelImportConfiguration.getMaximumRowCount()) { + setErrorMessage(String.format( + "The amount of importing data cannot be greater than %d (Table head included)! " + + "Current reading row count: %d", excelImportConfiguration.getMaximumRowCount(), + readingRowCount.get())); + continue; + } + // Check if the readingRowCount is equal to zero + if (readingRowCount.get() == 0) { + setErrorMessage("Not available data to import. Check Excel again."); + continue; + } + // Check if the first row is equal to null + if (sheet.getRow(0) == null) { + setErrorMessage(String.format("Sheet [%s] (No. %d) format is invalid: no title! ", sheet.getSheetName(), + sheetLocation.get())); + // If the sheet is not valid, then skip it + continue; + } + val startIndex = sheet.getRow(0).getFirstCellNum(); + val endIndex = sheet.getRow(0).getLastCellNum(); + // Parse from the second row + for (var i = sheet.getFirstRowNum() + 1; i <= sheet.getLastRowNum(); i++) { + // Specify current row location + rowLocation.set(i + 1); + val row = sheet.getRow(i); + if (isBlankRow(row)) { + // Blank row will not be considered as a effective row, not be included in `readingRowCount` + readingRowCount.set(readingRowCount.get() - 1); + continue; + } + // Bind row to bean + bindRowToBean(row, startIndex, endIndex); + } + } + } + + /** + * Check if the row is blank. If there is one cell of the row is not blank, then the row is not blank. + * + * @param row the row + * @return true if the row is blank; or vice versa. + */ + private boolean isBlankRow(Row row) { + if (row == null) { + return true; + } + Cell cell; + var value = ""; + for (var i = row.getFirstCellNum(); i < row.getLastCellNum(); i++) { + cell = row.getCell(i, Row.MissingCellPolicy.RETURN_BLANK_AS_NULL); + if (cell != null) { + switch (cell.getCellType()) { + case STRING: + value = cell.getStringCellValue().trim(); + break; + case NUMERIC: + value = String.valueOf((int) cell.getNumericCellValue()); + break; + case BOOLEAN: + value = String.valueOf(cell.getBooleanCellValue()); + break; + case FORMULA: + value = String.valueOf(cell.getCellFormula()); + break; + default: + break; + } + if (StrUtil.isNotBlank(value)) { + return false; + } + } + } + return true; + } + + /** + * Bind row to bean. + * + * @param row the row + * @param startIndex the start index + * @param endIndex the end index + */ + private void bindRowToBean(Row row, int startIndex, int endIndex) { + Assert.notNull(this.bindClass, "bindClass must not be null!"); + Assert.notNull(this.fieldNameArray, "fieldNameArray must not be null!"); + var bindingResult = false; + try { + // New bean instance + val bean = this.bindClass.getDeclaredConstructor().newInstance(); + val beanInfo = Introspector.getBeanInfo(bean.getClass()); + val propertyDescriptors = beanInfo.getPropertyDescriptors(); + for (var index = startIndex; index < endIndex; index++) { + // If found more data, then binding failed + if (index >= fieldNameArray.length) { + bindingResult = false; + setErrorMessage( + String.format("Found redundant data on row number %d. Check again.", rowLocation.get())); + break; + } + // Get the field that needs binding + val fieldName = fieldNameArray[index]; + PropertyDescriptor propertyDescriptor = null; + for (val pd : propertyDescriptors) { + if (pd.getName().equals(fieldName)) { + propertyDescriptor = pd; + break; + } + } + if (ObjectUtil.isNull(propertyDescriptor)) { + throw new RuntimeException("Cannot find the field in the specify class!"); + } + val value = getCellValue2String(row.getCell(index)); + // Start to bind + // Specify current column location + columnLocation.set(index + 1); + // Execute custom validation method + val customValidationMethod = this.checkMethodMap.get(fieldName); + Object returnObj = null; + if (ObjectUtil.isNotNull(customValidationMethod)) { + returnObj = customValidationMethod.invoke(this, value, rowLocation.get(), bean); + } + val validationResult = returnObj == null ? null : returnObj.toString(); + // If `validationResult` is blank or equal to "true" + if (StrUtil.isBlank(validationResult) || Boolean.TRUE.toString().equals(validationResult)) { + bindingResult = bind(value, propertyDescriptor, bean); + } else { + bindingResult = false; + // If `validationResult` is not equal to "false" then add to error message list + if (!Boolean.FALSE.toString().equals(validationResult)) { + setErrorMessage(validationResult); + } + } + // Finished binding + if (!bindingResult) { + break; + } + } + if (bindingResult) { + bindingResult = validateBeforeAddToBeanList(this.beanList.get(), bean, rowLocation.get()); + } + if (bindingResult) { + this.beanList.get().add(bean); + } + } catch (IntrospectionException + | InvocationTargetException + | InstantiationException + | IllegalAccessException + | NoSuchMethodException e) { + log.error("bindRowToBean method has encountered a problem!", e); + exceptionOccurred.set(true); + val errorMessage = String.format( + "Exception occurred when binding and validating the data of row number %d. " + + "Exception message: %s", rowLocation.get(), e.getMessage()); + setErrorMessage(errorMessage); + val lastCellNum = row.getLastCellNum(); + val errorInformationCell = row.createCell(fieldNameArray.length); + errorInformationCell.setCellValue(errorMessage); + val firstSheet = workbookWithErrorMessage.get().getSheetAt(0); + val row1 = firstSheet.createRow(firstSheet.getLastRowNum() + 1); + PoiUtil.copyRow(true, workbookWithErrorMessage.get(), row, row1); + } + } + + /** + * Gets cell value 2 string. + * + * @param cell the cell + * @return the string + */ + private String getCellValue2String(Cell cell) { + var returnString = ""; + if (ObjectUtil.isNull(cell)) { + return returnString; + } + switch (cell.getCellType()) { + case BLANK: + return ""; + case NUMERIC: + // If it's date + if (DateUtil.isCellDateFormatted(cell)) { + val date = cell.getDateCellValue(); + val dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + returnString = dateFormat.format(date); + return returnString; + } + val bigDecimal = new BigDecimal(String.valueOf(cell.getNumericCellValue()).trim()); + // Keep decimal fraction parts which are not zero + val tempStr = bigDecimal.toPlainString(); + val dotIndex = tempStr.indexOf("."); + if ((bigDecimal.doubleValue() - bigDecimal.longValue()) == 0 && dotIndex > 0) { + returnString = tempStr.substring(0, dotIndex); + } else { + returnString = tempStr; + } + return returnString; + case STRING: + if (cell.getStringCellValue() != null) { + returnString = cell.getStringCellValue().trim(); + } + return returnString; + default: + return returnString; + } + } + + /** + * Register bind handler methods. + */ + private void registerBindHandlerMethods() { + try { + val bindStringField = ReflectionUtils.findMethod(this.getClass(), + "bindStringField", + String.class, + PropertyDescriptor.class, + Object.class); + val bindIntField = ReflectionUtils.findMethod(this.getClass(), + "bindIntField", + String.class, + PropertyDescriptor.class, + Object.class); + val bindLongField = ReflectionUtils.findMethod(this.getClass(), + "bindLongField", + String.class, + PropertyDescriptor.class, + Object.class); + val bindFloatField = ReflectionUtils.findMethod(this.getClass(), + "bindFloatField", + String.class, + PropertyDescriptor.class, + Object.class); + val bindDoubleField = ReflectionUtils.findMethod(this.getClass(), + "bindDoubleField", + String.class, + PropertyDescriptor.class, + Object.class); + val bindLocalDateTimeField = ReflectionUtils.findMethod(this.getClass(), + "bindLocalDateTimeField", + String.class, + PropertyDescriptor.class, + Object.class); + this.bindMethodMap.put(String.class, bindStringField); + this.bindMethodMap.put(Integer.class, bindIntField); + this.bindMethodMap.put(Long.class, bindLongField); + this.bindMethodMap.put(Float.class, bindFloatField); + this.bindMethodMap.put(Double.class, bindDoubleField); + this.bindMethodMap.put(LocalDateTime.class, bindLocalDateTimeField); + } catch (Exception e) { + log.error("The bindMethod required was not found in this class!", e); + } + } + + /** + * Real binding value to the bean's field. + *

+ * + * @param value the string value of the excel cell + * @param propertyDescriptor the the field of the bean + * @param bean the bean + * @return true if the binding succeeded, or vice versa. + * @throws RuntimeException the runtime exception + */ + private Boolean bind(String value, PropertyDescriptor propertyDescriptor, Object bean) throws RuntimeException { + boolean result; + val fieldType = propertyDescriptor.getPropertyType(); + if (!this.bindMethodMap.containsKey(fieldType)) { + throw new RuntimeException( + String.format("The bindMethod required was not found in bindMethodMap! Field type: %s", + fieldType.getSimpleName())); + } + val bindMethod = this.bindMethodMap.get(fieldType); + value = StrUtil.isBlank(value) ? null : value; + try { + // Why is the parameter 'this' required? Because it's this class calling the 'bindMethod', + // and the 'bingMethod' belongs to this class object. + result = (Boolean) bindMethod.invoke(this, value, propertyDescriptor, bean); + } catch (IllegalAccessException + | IllegalArgumentException + | InvocationTargetException e) { + val exceptionMessage = new StringBuilder("Exception occurred when binding! "); + if (!StrUtil.isBlank(e.getMessage())) { + log.error("Exception occurred when invoking method!", e); + exceptionMessage.append(e.getMessage()).append(" "); + } + if (ObjectUtil.isNotNull(e.getCause()) && !StrUtil.isBlank(e.getCause().getMessage())) { + log.error("Exception occurred when invoking method!", e.getCause()); + exceptionMessage.append(e.getCause().getMessage()); + } + throw new RuntimeException(exceptionMessage.toString()); + } + return result; + } + + /** + * Bind int field boolean. + * + * @param value the value + * @param propertyDescriptor the property descriptor + * @param bean the bean + * @return the boolean + * @throws IllegalAccessException the illegal access exception + */ + private Boolean bindIntField(String value, PropertyDescriptor propertyDescriptor, Object bean) throws IllegalAccessException { + try { + var realValue = value == null ? null : Integer.parseInt(value); + if (ObjectUtil.isNull(realValue) && propertyDescriptor.getPropertyType() == int.class) { + realValue = 0; + } + propertyDescriptor.getWriteMethod().invoke(bean, realValue); + } catch (NumberFormatException | InvocationTargetException e) { + log.error("Exception occurred when binding int/Integer field! Exception message: {}, value: {}, field: {}", + e.getMessage(), value, propertyDescriptor.getName()); + val formattedMessage = String.format("Invalid data of the row %d, col %d, must be integer", + rowLocation.get(), columnLocation.get()); + setErrorMessage(formattedMessage); + throw new IllegalArgumentException(formattedMessage); + } + return true; + } + + /** + * Bind long field boolean. + * + * @param value the value + * @param propertyDescriptor the property descriptor + * @param bean the bean + * @return the boolean + * @throws IllegalAccessException the illegal access exception + */ + private Boolean bindLongField(String value, PropertyDescriptor propertyDescriptor, Object bean) throws IllegalAccessException { + try { + var realValue = value == null ? null : (long) Double.parseDouble(value); + if (ObjectUtil.isNull(realValue) && propertyDescriptor.getPropertyType() == long.class) { + realValue = 0L; + } + propertyDescriptor.getWriteMethod().invoke(bean, realValue); + } catch (NumberFormatException | InvocationTargetException e) { + log.error("Exception occurred when binding long/Long field! Exception message: {}, value: {}, field: {}", + e.getMessage(), value, propertyDescriptor.getName()); + val formattedMessage = String.format("Invalid data of the row %d, col %d, must be long integer", + rowLocation.get(), columnLocation.get()); + setErrorMessage(formattedMessage); + throw new IllegalArgumentException(formattedMessage); + } + return true; + } + + /** + * Bind float field boolean. + * + * @param value the value + * @param propertyDescriptor the property descriptor + * @param bean the bean + * @return the boolean + * @throws IllegalAccessException the illegal access exception + */ + private Boolean bindFloatField(String value, PropertyDescriptor propertyDescriptor, Object bean) throws IllegalAccessException { + try { + var realValue = value == null ? null : Float.parseFloat(value); + if (ObjectUtil.isNull(realValue) && propertyDescriptor.getPropertyType() == float.class) { + realValue = 0F; + } + propertyDescriptor.getWriteMethod().invoke(bean, realValue); + } catch (NumberFormatException | InvocationTargetException e) { + log.error("Exception occurred when binding float/Float field! Exception message: {}, value: {}, field: {}", + e.getMessage(), value, propertyDescriptor.getName()); + val formattedMessage = String.format("Invalid data of the row %d, col %d, must be float", + rowLocation.get(), columnLocation.get()); + setErrorMessage(formattedMessage); + throw new IllegalArgumentException(formattedMessage); + } + return true; + } + + /** + * Bind double field boolean. + * + * @param value the value + * @param propertyDescriptor the property descriptor + * @param bean the bean + * @return the boolean + * @throws IllegalAccessException the illegal access exception + */ + private Boolean bindDoubleField(String value, PropertyDescriptor propertyDescriptor, Object bean) throws IllegalAccessException { + try { + var realValue = value == null ? null : Double.parseDouble(value); + if (ObjectUtil.isNull(realValue) && propertyDescriptor.getPropertyType() == double.class) { + realValue = 0D; + } + propertyDescriptor.getWriteMethod().invoke(bean, realValue); + } catch (NumberFormatException | InvocationTargetException e) { + log.error( + "Exception occurred when binding double/Double field! Exception message: {}, value: {}, field: {}", + e.getMessage(), value, propertyDescriptor.getName()); + val formattedMessage = String.format("Invalid data of the row %d, col %d, must be double", + rowLocation.get(), columnLocation.get()); + setErrorMessage(formattedMessage); + throw new IllegalArgumentException(formattedMessage); + } + return true; + } + + /** + * Bind string field boolean. + * + * @param value the value + * @param propertyDescriptor the property descriptor + * @param bean the bean + * @return the boolean + * @throws IllegalAccessException the illegal access exception + */ + private Boolean bindStringField(String value, PropertyDescriptor propertyDescriptor, Object bean) throws IllegalAccessException { + try { + propertyDescriptor.getWriteMethod().invoke(bean, value); + } catch (InvocationTargetException e) { + log.error("Exception occurred when binding String field! Exception message: {}, value: {}, field: {}", + e.getMessage(), value, propertyDescriptor.getName()); + val formattedMessage = String.format("Invalid data of the row %d, col %d, must be string", + rowLocation.get(), columnLocation.get()); + setErrorMessage(formattedMessage); + throw new IllegalArgumentException(formattedMessage); + } + return true; + } + + /** + * Bind local date time field boolean. + * + * @param value the value + * @param propertyDescriptor the property descriptor + * @param bean the bean + * @return the boolean + * @throws IllegalAccessException the illegal access exception + */ + private Boolean bindLocalDateTimeField(String value, PropertyDescriptor propertyDescriptor, Object bean) throws IllegalAccessException { + try { + val date = value == null ? null : LocalDateTime.parse(value, + DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); + propertyDescriptor.getWriteMethod().invoke(bean, date); + } catch (DateTimeParseException | InvocationTargetException e) { + log.error( + "Exception occurred when binding LocalDateTime field! Exception message: {}, value: {}, field: {}", + e.getMessage(), value, propertyDescriptor.getName()); + val formattedMessage = String.format("Invalid data of the row %d, col %d, must be date", + rowLocation.get(), columnLocation.get()); + setErrorMessage(formattedMessage); + throw new IllegalArgumentException(formattedMessage); + } + return true; + } + + /** + * Sets deny all. When exception occurred, deny all data or not + * + * @param denyAll the deny all + */ + public void setDenyAll(Boolean denyAll) { + this.denyAll = denyAll; + } + + /** + * Sets error message. + * + * @param errorInfo the error info + */ + protected void setErrorMessage(String errorInfo) { + this.errorMessageList.get().add(errorInfo); + setReturnMessageList(errorInfo); + } + + /** + * Sets return message list. + * + * @param message the message + */ + protected void setReturnMessageList(String message) { + this.returnMessageList.get().add(message); + } +} diff --git a/gateway/src/main/java/com/jmsoftware/maf/gateway/universal/controller/CommonController.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/controller/CommonController.java similarity index 63% rename from gateway/src/main/java/com/jmsoftware/maf/gateway/universal/controller/CommonController.java rename to spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/controller/CommonController.java index eb0debd9..fb17403d 100644 --- a/gateway/src/main/java/com/jmsoftware/maf/gateway/universal/controller/CommonController.java +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/controller/CommonController.java @@ -1,23 +1,20 @@ -package com.jmsoftware.maf.gateway.universal.controller; +package com.jmsoftware.maf.springcloudstarter.controller; +import cn.hutool.json.JSON; import com.jmsoftware.maf.common.bean.ResponseBodyBean; -import com.jmsoftware.maf.gateway.universal.domain.ValidationTestPayload; -import com.jmsoftware.maf.gateway.universal.service.CommonService; +import com.jmsoftware.maf.common.domain.ValidationTestPayload; +import com.jmsoftware.maf.springcloudstarter.service.CommonService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; -import lombok.val; import org.springframework.web.bind.annotation.*; -import java.util.Map; - /** *

CommonController

*

* Change description here. * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com - * @date 2/4/20 10:29 AM + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 12/29/2020 1:45 PM **/ @RestController @RequiredArgsConstructor @@ -28,9 +25,8 @@ public class CommonController { @GetMapping("/app-info") @ApiOperation(value = "/app-info", notes = "Retrieve application information") - public ResponseBodyBean> applicationInformation() { - val data = commonService.getApplicationInfo(); - return ResponseBodyBean.ofSuccess(data, "Succeed to retrieve app info."); + public ResponseBodyBean applicationInformation() { + return ResponseBodyBean.ofSuccess(commonService.getApplicationInfo(), "Succeed to retrieve app info."); } @PostMapping("/validation-test") diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/controller/ControllerBase.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/controller/ControllerBase.java new file mode 100644 index 00000000..7963dd0d --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/controller/ControllerBase.java @@ -0,0 +1,22 @@ +package com.jmsoftware.maf.springcloudstarter.controller; + +import org.springframework.beans.propertyeditors.CustomDateEditor; +import org.springframework.web.bind.WebDataBinder; +import org.springframework.web.bind.annotation.InitBinder; + +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + * Description: ControllerBase, change description here. + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 6/27/2021 9:20 PM + **/ +public class ControllerBase { +// @InitBinder +// public void initBinder(WebDataBinder binder) { +// final SimpleDateFormat dateFormat = new SimpleDateFormat(DateTimeUniversalFormat.DATE_TIME_PATTERN); +// dateFormat.setLenient(false); +// binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true)); +// } +} diff --git a/service-registry/src/main/java/com/jmsoftware/maf/serviceregistry/universal/controller/ErrorController.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/controller/GlobalErrorController.java similarity index 66% rename from service-registry/src/main/java/com/jmsoftware/maf/serviceregistry/universal/controller/ErrorController.java rename to spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/controller/GlobalErrorController.java index 1a9dc4a9..63b97cab 100644 --- a/service-registry/src/main/java/com/jmsoftware/maf/serviceregistry/universal/controller/ErrorController.java +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/controller/GlobalErrorController.java @@ -1,4 +1,4 @@ -package com.jmsoftware.maf.serviceregistry.universal.controller; +package com.jmsoftware.maf.springcloudstarter.controller; import io.swagger.annotations.Api; import lombok.extern.slf4j.Slf4j; @@ -6,8 +6,8 @@ import org.springframework.boot.autoconfigure.web.ServerProperties; import org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController; import org.springframework.boot.autoconfigure.web.servlet.error.ErrorViewResolver; +import org.springframework.boot.web.error.ErrorAttributeOptions; import org.springframework.boot.web.servlet.error.ErrorAttributes; -import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.RestController; @@ -21,23 +21,22 @@ *

* Error controller. * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com * @date 2019-03-02 16:56 **/ @Slf4j @RestController -@Api(tags = {"Error Controller"}) -public class ErrorController extends BasicErrorController { - public ErrorController(ErrorAttributes errorAttributes, - ServerProperties serverProperties, - List errorViewResolvers) { +@Api(tags = {"Global Error Controller"}) +public class GlobalErrorController extends BasicErrorController { + public GlobalErrorController(ErrorAttributes errorAttributes, ServerProperties serverProperties, + List errorViewResolvers) { super(errorAttributes, serverProperties.getError(), errorViewResolvers); } @Override public ResponseEntity> error(HttpServletRequest request) { - val httpStatus = getStatus(request); - val body = getErrorAttributes(request, isIncludeStackTrace(request, MediaType.ALL)); + val httpStatus = this.getStatus(request); + val body = this.getErrorAttributes(request, ErrorAttributeOptions.defaults()); body.put("message", httpStatus.getReasonPhrase()); val optionalTrace = Optional.ofNullable(body.get("trace")); optionalTrace.ifPresent(trace -> { @@ -45,7 +44,8 @@ public ResponseEntity> error(HttpServletRequest request) { val firstLineOfTrace = trace.toString().split("\\n")[0]; val joinedMessage = String.format("%s %s", message, firstLineOfTrace); body.put("message", joinedMessage); - body.put("trace", "Trace has been simplified. Refer to 'message'"); + body.put("trace", + String.format("Trace has been simplified by %s. Refer to 'message'", this.getClass().getName())); }); log.error("Captured HTTP request error. Response body = {}", body); return new ResponseEntity<>(body, httpStatus); diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/controller/HttpApiResourceRemoteApiController.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/controller/HttpApiResourceRemoteApiController.java new file mode 100644 index 00000000..03cebc99 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/controller/HttpApiResourceRemoteApiController.java @@ -0,0 +1,53 @@ +package com.jmsoftware.maf.springcloudstarter.controller; + +import cn.hutool.core.collection.CollUtil; +import com.jmsoftware.maf.common.bean.ResponseBodyBean; +import com.jmsoftware.maf.common.domain.springbootstarter.HttpApiResourcesResponse; +import com.jmsoftware.maf.springcloudstarter.configuration.MafConfiguration; +import com.jmsoftware.maf.springcloudstarter.helper.HttpApiScanHelper; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.val; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.Objects; +import java.util.Optional; + +/** + * Description: HttpApiResourceRemoteApiController, change description here. + * + * @author 钟俊(zhongjun), email: zhongjun@toguide.cn, date: 12/25/2020 4:33 PM + **/ +@RestController +@RequiredArgsConstructor +@Api(tags = {"HTTP API Resource Remote API"}) +public class HttpApiResourceRemoteApiController { + private final MafConfiguration mafConfiguration; + private final HttpApiScanHelper httpApiScanHelper; + + @GetMapping("/http-api-resources") + @ApiOperation(value = "Get HTTP API resources", notes = "Get HTTP API resources (Remote)") + public ResponseBodyBean getHttpApiResource() { + val handlerMethodMap = this.httpApiScanHelper.scan(this.mafConfiguration.getIncludedPackageForHttpApiScan()); + HttpApiResourcesResponse response = new HttpApiResourcesResponse(); + handlerMethodMap.forEach((requestMappingInfo, handlerMethod) -> { + val requestMethod = Optional.ofNullable( + new ArrayList<>(requestMappingInfo.getMethodsCondition().getMethods()).get(0)) + .orElseThrow(() -> new RuntimeException("Request method mustn't be null!")); + val httpApiResource = new HttpApiResourcesResponse.HttpApiResource(); + httpApiResource.setMethod(requestMethod); + val patterns = Objects.requireNonNull(requestMappingInfo.getPatternsCondition()).getPatterns(); + if (CollUtil.isNotEmpty(patterns)) { + httpApiResource.setUrlPattern(new LinkedList<>(patterns).get(0)); + } else { + httpApiResource.setUrlPattern("/url-pattern-not-found"); + } + response.getList().add(httpApiResource); + }); + return ResponseBodyBean.ofSuccess(response); + } +} diff --git a/muscle-and-fitness-server-spring-boot-starter/src/main/java/com/jmsoftware/maf/muscleandfitnessserverspringbootstarter/controller/RedirectController.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/controller/RedirectController.java similarity index 91% rename from muscle-and-fitness-server-spring-boot-starter/src/main/java/com/jmsoftware/maf/muscleandfitnessserverspringbootstarter/controller/RedirectController.java rename to spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/controller/RedirectController.java index 7f7930d4..24763dfb 100644 --- a/muscle-and-fitness-server-spring-boot-starter/src/main/java/com/jmsoftware/maf/muscleandfitnessserverspringbootstarter/controller/RedirectController.java +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/controller/RedirectController.java @@ -1,4 +1,4 @@ -package com.jmsoftware.maf.muscleandfitnessserverspringbootstarter.controller; +package com.jmsoftware.maf.springcloudstarter.controller; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -16,7 +16,7 @@ *

* HTTP Redirect Controller * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com * @date 1/21/20 1:18 PM **/ @Slf4j diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/database/DataSourceConfiguration.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/database/DataSourceConfiguration.java new file mode 100644 index 00000000..48099cdd --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/database/DataSourceConfiguration.java @@ -0,0 +1,56 @@ +package com.jmsoftware.maf.springcloudstarter.database; + +import com.baomidou.dynamic.datasource.DynamicRoutingDataSource; +import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration; +import lombok.extern.slf4j.Slf4j; +import lombok.val; +import org.springframework.boot.autoconfigure.AutoConfigureBefore; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.autoconfigure.quartz.QuartzDataSource; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Primary; +import org.springframework.jdbc.datasource.DataSourceTransactionManager; +import org.springframework.transaction.PlatformTransactionManager; + +import javax.sql.DataSource; +import java.util.HashMap; + +/** + * Description: DataSourceConfiguration, change description here. + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 6/27/2021 8:15 AM + **/ +@Slf4j +@ConditionalOnClass({MybatisPlusAutoConfiguration.class}) +@AutoConfigureBefore({MybatisPlusAutoConfiguration.class}) +public class DataSourceConfiguration { + @QuartzDataSource + @Bean("quartzDataSource") + @ConditionalOnProperty(prefix = "spring.quartz", name = "job-store-type", havingValue = "jdbc") + public DataSource quartzDataSource(DynamicRoutingDataSource dynamicRoutingDataSource) { + log.warn("Initial bean: quartzDataSource"); + return dynamicRoutingDataSource.getDataSource(DataSourceEnum.QUARTZ.getDataSourceName()); + } + + @Bean + @Primary + public ReadWriteIsolationDynamicRoutingDataSource dynamicDataSource(DynamicRoutingDataSource dynamicRoutingDataSource) { + val targetDataSources = new HashMap<>(4); + targetDataSources.put(DataSourceEnum.MASTER, + dynamicRoutingDataSource.getDataSource(DataSourceEnum.MASTER.getDataSourceName())); + targetDataSources.put(DataSourceEnum.SLAVE1, + dynamicRoutingDataSource.getDataSource(DataSourceEnum.SLAVE1.getDataSourceName())); + val dynamicDataSource = new ReadWriteIsolationDynamicRoutingDataSource(); + dynamicDataSource.setDefaultTargetDataSource(dynamicRoutingDataSource.getDataSource("master")); + dynamicDataSource.setTargetDataSources(targetDataSources); + log.warn("Set 'masterDataSource' and 'slave1DataSource' as {}", + ReadWriteIsolationDynamicRoutingDataSource.class.getSimpleName()); + return dynamicDataSource; + } + + @Bean + public PlatformTransactionManager platformTransactionManager(ReadWriteIsolationDynamicRoutingDataSource readWriteIsolationDynamicRoutingDataSource) { + return new DataSourceTransactionManager(readWriteIsolationDynamicRoutingDataSource); + } +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/database/DataSourceContextHolder.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/database/DataSourceContextHolder.java new file mode 100644 index 00000000..cd3f1955 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/database/DataSourceContextHolder.java @@ -0,0 +1,58 @@ +package com.jmsoftware.maf.springcloudstarter.database; + +import lombok.extern.slf4j.Slf4j; +import lombok.val; + +import java.util.Optional; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * Description: DatabaseContextHolder, thread-safe + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 6/27/2021 12:07 AM + **/ +@Slf4j +public final class DataSourceContextHolder { + protected static final ThreadLocal CONTEXT_HOLDER = + ThreadLocal.withInitial(() -> DataSourceEnum.MASTER); + private static final AtomicInteger COUNTER = new AtomicInteger(-1); + private static final int MAX_COUNT = 9999; + + private DataSourceContextHolder() { + } + + public static DataSourceEnum get() { + return Optional.ofNullable(CONTEXT_HOLDER.get()).orElse(DataSourceEnum.MASTER); + } + + private static void set(DataSourceEnum dbType) { + CONTEXT_HOLDER.set(dbType); + } + + public static void master() { + set(DataSourceEnum.MASTER); + if (log.isDebugEnabled()) { + log.debug("Current data source -> {}", DataSourceEnum.MASTER); + } + } + + public static void slave() { + // Simple load-balance for more slave clusters, assumed we got 2 replicas + val index = COUNTER.getAndIncrement() % 2; + if (COUNTER.get() > MAX_COUNT) { + COUNTER.set(-1); + } + // if replica data sources are more then 1, the data source needs load balance by index + set(DataSourceEnum.SLAVE1); + if (log.isDebugEnabled()) { + log.debug("Current data source -> {}, index: {}", DataSourceEnum.MASTER, index); + } + } + + public static void clear() { + CONTEXT_HOLDER.remove(); + if (log.isDebugEnabled()) { + log.debug("Cleared CONTEXT_HOLDER"); + } + } +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/database/DataSourceEnum.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/database/DataSourceEnum.java new file mode 100644 index 00000000..8422fdd9 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/database/DataSourceEnum.java @@ -0,0 +1,31 @@ +package com.jmsoftware.maf.springcloudstarter.database; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import lombok.ToString; + +/** + * Description: DataSourceEnum, change description here. + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 6/27/2021 12:03 AM + **/ +@Getter +@ToString +@RequiredArgsConstructor +public enum DataSourceEnum { + /** + * Master + */ + MASTER("master"), + /** + * Slave 1 + */ + SLAVE1("slave1"), + /** + * Quartz + */ + QUARTZ("quartz"), + ; + + private final String dataSourceName; +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/database/DynamicDataSourceInterceptor.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/database/DynamicDataSourceInterceptor.java new file mode 100644 index 00000000..7bbbe455 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/database/DynamicDataSourceInterceptor.java @@ -0,0 +1,83 @@ +package com.jmsoftware.maf.springcloudstarter.database; + +import lombok.extern.slf4j.Slf4j; +import lombok.val; +import org.apache.ibatis.executor.Executor; +import org.apache.ibatis.executor.keygen.SelectKeyGenerator; +import org.apache.ibatis.mapping.MappedStatement; +import org.apache.ibatis.mapping.SqlCommandType; +import org.apache.ibatis.plugin.*; +import org.apache.ibatis.session.ResultHandler; +import org.apache.ibatis.session.RowBounds; +import org.springframework.transaction.support.TransactionSynchronizationManager; + +import java.util.Objects; + +/** + * Description: DynamicDataSourceInterceptor, change description here. + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 6/27/2021 12:26 AM + **/ +@Slf4j +@Intercepts({ + @Signature( + type = Executor.class, + method = "update", + args = {MappedStatement.class, Object.class} + ), + @Signature( + type = Executor.class, + method = "query", + args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class + }) +}) +public class DynamicDataSourceInterceptor implements Interceptor { + @Override + public Object intercept(Invocation invocation) throws Throwable { + // Check if the transaction synchronization is active. It it was, would use MASTER data source + val actualTransactionActive = TransactionSynchronizationManager.isActualTransactionActive(); + // MyBatis CRUD args + val args = invocation.getArgs(); + // MappedStatement SqlCommandType + val mappedStatement = (MappedStatement) args[0]; + // Default using master + DataSourceContextHolder.master(); + if (!actualTransactionActive) { + // SqlCommandType.SELECT, UNKNOWN|INSERT|UPDATE|DELETE|SELECT|FLUSH + if (mappedStatement.getSqlCommandType().equals(SqlCommandType.SELECT)) { + // If it's the SQL return primary key as result + if (mappedStatement.getId().contains(SelectKeyGenerator.SELECT_KEY_SUFFIX)) { + log.warn("Calling ID-return SQL, {}", SelectKeyGenerator.SELECT_KEY_SUFFIX); + DataSourceContextHolder.master(); + } else { + if (Objects.deepEquals(SqlCommandType.SELECT, mappedStatement.getSqlCommandType())) { + DataSourceContextHolder.slave(); + } else { + DataSourceContextHolder.master(); + } + } + } + } else { + DataSourceContextHolder.master(); + } + log.warn("SQL statement [{}], SqlCommandType: [{}], using 🐬 [{}] data source", mappedStatement.getId(), + mappedStatement.getSqlCommandType().name(), DataSourceContextHolder.get()); + Object result; + try { + result = invocation.proceed(); + } finally { + DataSourceContextHolder.clear(); + } + return result; + } + + @Override + public Object plugin(Object target) { + if (target instanceof Executor) { + return Plugin.wrap(target, this); + } else { + return target; + } + } +} + diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/database/MyBatisPlusConfiguration.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/database/MyBatisPlusConfiguration.java new file mode 100644 index 00000000..27ebbdc0 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/database/MyBatisPlusConfiguration.java @@ -0,0 +1,76 @@ +package com.jmsoftware.maf.springcloudstarter.database; + +import com.baomidou.mybatisplus.annotation.DbType; +import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration; +import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.BlockAttackInnerInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; +import lombok.extern.slf4j.Slf4j; +import lombok.val; +import org.apache.ibatis.plugin.Interceptor; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; +import org.springframework.core.annotation.Order; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * Description: MyBatisPlusConfiguration, change description here. + * + * @author 钟俊(zhongjun), email: zhongjun@toguide.cn, date: 1/29/2021 1:30 PM + **/ +@Slf4j +@Configuration +@Import({ + DataSourceConfiguration.class +}) +@ConditionalOnClass({MybatisPlusAutoConfiguration.class}) +@EnableTransactionManagement +public class MyBatisPlusConfiguration { + @Bean + public PaginationInnerInterceptor paginationInnerInterceptor() { + log.warn("Initial bean: '{}'", PaginationInnerInterceptor.class.getSimpleName()); + val paginationInnerInterceptor = new PaginationInnerInterceptor(DbType.MYSQL); + paginationInnerInterceptor.setMaxLimit(100L); + return paginationInnerInterceptor; + } + + @Bean + public BlockAttackInnerInterceptor blockAttackInnerInterceptor() { + log.warn("Initial bean: '{}'", BlockAttackInnerInterceptor.class.getSimpleName()); + return new BlockAttackInnerInterceptor(); + } + + /** + * Mybatis plus interceptor mybatis plus interceptor. + * + * @param paginationInnerInterceptor the pagination inner interceptor + * @param blockAttackInnerInterceptor the block attack inner interceptor + * @return the mybatis plus interceptor + * @see MybatisPlusInterceptor + */ + @Bean + @Order(1) + public Interceptor mybatisPlusInterceptor(PaginationInnerInterceptor paginationInnerInterceptor, + BlockAttackInnerInterceptor blockAttackInnerInterceptor) { + log.warn("Initial bean: '{}'", MybatisPlusInterceptor.class.getSimpleName()); + val mybatisPlusInterceptor = new MybatisPlusInterceptor(); + mybatisPlusInterceptor.addInnerInterceptor(paginationInnerInterceptor); + mybatisPlusInterceptor.addInnerInterceptor(blockAttackInnerInterceptor); + return mybatisPlusInterceptor; + } + + @Bean + @Order(2) + public Interceptor dynamicDataSourceInterceptor() { + log.warn("Initial bean: '{}'", DynamicDataSourceInterceptor.class.getSimpleName()); + return new DynamicDataSourceInterceptor(); + } + + @Bean + public MyBatisPlusMetaObjectHandler myBatisPlusConfiguration() { + log.warn("Initial bean: '{}'", MyBatisPlusMetaObjectHandler.class.getSimpleName()); + return new MyBatisPlusMetaObjectHandler(); + } +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/database/MyBatisPlusMetaObjectHandler.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/database/MyBatisPlusMetaObjectHandler.java new file mode 100644 index 00000000..dfccb609 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/database/MyBatisPlusMetaObjectHandler.java @@ -0,0 +1,63 @@ +package com.jmsoftware.maf.springcloudstarter.database; + +import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; +import com.jmsoftware.maf.common.domain.DeletedField; +import com.jmsoftware.maf.springcloudstarter.util.UsernameUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.ibatis.reflection.MetaObject; + +import java.time.LocalDateTime; + +/** + *

MyBatisPlusConfiguration

+ *

+ * Change description here. + *

+ * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com + * @date 2019-05-02 11:57 + **/ +@Slf4j +public class MyBatisPlusMetaObjectHandler implements MetaObjectHandler { + /** + * The Java persistence object field name: createdBy + */ + public static final String CREATED_BY_FIELD_NAME = "createdBy"; + /** + * The Java persistence object field name: createdTime + */ + public static final String CREATED_TIME_FIELD_NAME = "createdTime"; + /** + * The Java persistence object field name: modifiedBy + */ + public static final String MODIFIED_BY_FIELD_NAME = "modifiedBy"; + /** + * The Java persistence object field name: modifiedTime + */ + public static final String MODIFIED_TIME_FIELD_NAME = "modifiedTime"; + /** + * The Java persistence object field name: deleted + */ + public static final String DELETED_FIELD_NAME = "deleted"; + + /** + * {@inheritDoc} + */ + @Override + public void insertFill(MetaObject metaObject) { + // 严格填充,只针对非主键的字段,只有该表注解了fill 并且 字段名和字段属性 能匹配到才会进行填充(null 值不填充) + log.info("Starting to insert fill metaObject: {}", metaObject.getOriginalObject()); + this.strictInsertFill(metaObject, CREATED_BY_FIELD_NAME, String.class, UsernameUtil.getCurrentUsername()) + .strictInsertFill(metaObject, CREATED_TIME_FIELD_NAME, LocalDateTime.class, LocalDateTime.now()) + .strictInsertFill(metaObject, DELETED_FIELD_NAME, Byte.class, DeletedField.NOT_DELETED.getValue()); + log.info("Finished to insert fill metaObject: {}", metaObject.getOriginalObject()); + } + + @Override + public void updateFill(MetaObject metaObject) { + log.info("Starting to update fill metaObject: {}", metaObject.getOriginalObject()); + this.strictUpdateFill(metaObject, MODIFIED_BY_FIELD_NAME, String.class, UsernameUtil.getCurrentUsername()) + .strictUpdateFill(metaObject, MODIFIED_TIME_FIELD_NAME, LocalDateTime.class, LocalDateTime.now()); + log.info("Finished to update fill metaObject: {}", metaObject.getOriginalObject()); + } +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/database/ReadWriteIsolationDynamicRoutingDataSource.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/database/ReadWriteIsolationDynamicRoutingDataSource.java new file mode 100644 index 00000000..7f0854c4 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/database/ReadWriteIsolationDynamicRoutingDataSource.java @@ -0,0 +1,15 @@ +package com.jmsoftware.maf.springcloudstarter.database; + +import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; + +/** + * Description: ReadWriteIsolationDynamicRoutingDataSource, change description here. + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 6/27/2021 12:06 AM + **/ +public class ReadWriteIsolationDynamicRoutingDataSource extends AbstractRoutingDataSource { + @Override + protected Object determineCurrentLookupKey() { + return DataSourceContextHolder.get(); + } +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/filter/AccessLogFilter.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/filter/AccessLogFilter.java new file mode 100644 index 00000000..f1993f1e --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/filter/AccessLogFilter.java @@ -0,0 +1,46 @@ +package com.jmsoftware.maf.springcloudstarter.filter; + +import com.jmsoftware.maf.springcloudstarter.configuration.MafConfiguration; +import com.jmsoftware.maf.springcloudstarter.util.RequestUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.springframework.util.AntPathMatcher; +import org.springframework.web.filter.OncePerRequestFilter; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + *

RequestFilter

+ *

Request filter.

+ * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com + * @date 2019-03-23 14:24 + **/ +@Slf4j +@Component +@RequiredArgsConstructor +public class AccessLogFilter extends OncePerRequestFilter { + private final MafConfiguration mafConfiguration; + private final AntPathMatcher antPathMatcher = new AntPathMatcher(); + + @Override + @SuppressWarnings("NullableProblems") + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, + FilterChain filterChain) throws IOException, ServletException { + // Ignore URL + for (String ignoredUrl : this.mafConfiguration.flattenIgnoredUrls()) { + if (this.antPathMatcher.match(ignoredUrl, request.getRequestURI())) { + filterChain.doFilter(request, response); + return; + } + } + log.info("The requester({}) requested resource. Request URL: [{}] {}", RequestUtil.getRequestIpAndPort(request), + request.getMethod(), request.getRequestURL()); + filterChain.doFilter(request, response); + } +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/helper/HttpApiScanHelper.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/helper/HttpApiScanHelper.java new file mode 100644 index 00000000..5ae0615e --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/helper/HttpApiScanHelper.java @@ -0,0 +1,70 @@ +package com.jmsoftware.maf.springcloudstarter.helper; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import lombok.val; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.method.HandlerMethod; +import org.springframework.web.servlet.mvc.method.RequestMappingInfo; +import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; + +import javax.validation.constraints.NotBlank; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * Description: HttpApiScanHelper, scanning HTTP API for microservice. + * + * @author 钟俊(zhongjun), email: zhongjun@toguide.cn, date: 12/25/2020 2:43 PM + **/ +@Slf4j +@Validated +@RequiredArgsConstructor +public class HttpApiScanHelper { + private static final String EXCLUDED_PACKAGE; + + static { + val splitPackage = HttpApiScanHelper.class.getPackage().getName().split("\\."); + var jointPackage = new StringBuilder(); + for (var index = 0; index < splitPackage.length - 1; index++) { + jointPackage.append(splitPackage[index]).append("."); + } + EXCLUDED_PACKAGE = jointPackage.toString(); + log.warn("EXCLUDED_PACKAGE was generated dynamically. EXCLUDED_PACKAGE = {}", EXCLUDED_PACKAGE); + } + + private final RequestMappingHandlerMapping requestMappingHandlerMapping; + + /** + * Scan map. + * + * @param includedPackage the included package + * @return the map + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 12/25/2020 4:02 PM + */ + public Map scan(@NotBlank String includedPackage) { + Map handlerMethods = this.requestMappingHandlerMapping.getHandlerMethods(); + log.debug("Scanned request mapping info: {}", handlerMethods); + val filteredHandlerMethods = new LinkedHashMap(); + handlerMethods.forEach((requestMappingInfo, handlerMethod) -> { + // filter the Controller APIs that are defined in `spring-cloud-starter` + if (handlerMethod.toString().contains(includedPackage) && + !handlerMethod.toString().contains(EXCLUDED_PACKAGE)) { + try { + val requestMethod = new ArrayList<>( + requestMappingInfo.getMethodsCondition().getMethods()).get(0); + log.debug("Request: [{}] {}, handler method: {}", requestMethod, + requestMappingInfo.getPatternsCondition(), handlerMethod); + filteredHandlerMethods.put(requestMappingInfo, handlerMethod); + } catch (Exception e) { + log.warn( + "Exception occurred when getting request method. Exception message: {}. Request mapping " + + "info: {}", + e.getMessage(), requestMappingInfo); + } + } + }); + return filteredHandlerMethods; + } +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/helper/IpHelper.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/helper/IpHelper.java new file mode 100644 index 00000000..cfa208d0 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/helper/IpHelper.java @@ -0,0 +1,87 @@ +package com.jmsoftware.maf.springcloudstarter.helper; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.http.HttpUtil; +import lombok.*; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.web.context.WebServerInitializedEvent; +import org.springframework.context.ApplicationListener; +import org.springframework.core.env.Environment; +import org.springframework.stereotype.Component; + +import java.net.*; +import java.util.Enumeration; + +/** + *

ServerConfiguration

+ *

+ * Change description here. + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com + * @date 2019-04-26 16:02 + **/ +@Slf4j +@Getter +@Component +@RequiredArgsConstructor +public class IpHelper implements ApplicationListener { + private static final String DEVELOPMENT_ENVIRONMENT = "development"; + @Getter(AccessLevel.NONE) + private final Environment environment; + private int serverPort; + + @Override + public void onApplicationEvent(WebServerInitializedEvent event) { + this.serverPort = event.getWebServer().getPort(); + } + + /** + * Find public IP address. + * + * @return public IP + */ + public String getPublicIp() { + val jointProfiles = String.join(",", this.environment.getActiveProfiles()); + if (StrUtil.containsIgnoreCase(jointProfiles, DEVELOPMENT_ENVIRONMENT)) { + log.debug("Current active profiles for environment contains: {}. U", DEVELOPMENT_ENVIRONMENT); + return this.getInternetIp(); + } + // An API provided by https://whatismyipaddress.com/api + return HttpUtil.get("https://ipv4bot.whatismyipaddress.com/").trim(); + } + + /** + * Get internet IP. + * + * @return internet IP + */ + @SneakyThrows({SocketException.class}) + private String getInternetIp() { + val intranetIp = this.getIntranetIp(); + val networks = NetworkInterface.getNetworkInterfaces(); + InetAddress ip; + Enumeration addresses; + while (networks.hasMoreElements()) { + addresses = networks.nextElement().getInetAddresses(); + while (addresses.hasMoreElements()) { + ip = addresses.nextElement(); + if (ip instanceof Inet4Address + && ip.isSiteLocalAddress() + && !ip.getHostAddress().equals(intranetIp)) { + return ip.getHostAddress(); + } + } + } + return intranetIp; + } + + /** + * Get intranet IP. + * + * @return intranet IP + */ + @SneakyThrows({UnknownHostException.class}) + private String getIntranetIp() { + return InetAddress.getLocalHost().getHostAddress(); + } +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/helper/MinioHelper.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/helper/MinioHelper.java new file mode 100644 index 00000000..5a571e07 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/helper/MinioHelper.java @@ -0,0 +1,219 @@ +package com.jmsoftware.maf.springcloudstarter.helper; + +import cn.hutool.core.util.ObjectUtil; +import io.minio.*; +import io.minio.http.Method; +import io.minio.messages.Bucket; +import io.minio.messages.DeleteObject; +import io.minio.messages.Item; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import lombok.val; +import org.springframework.stereotype.Component; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.multipart.MultipartFile; + +import javax.validation.constraints.Max; +import javax.validation.constraints.Min; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.InputStream; +import java.util.LinkedList; +import java.util.List; +import java.util.stream.Collectors; + +/** + *

MinioHelper

+ *

+ * Change description here. + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 6/7/21 9:52 PM + **/ +@Slf4j +@Validated +@Component +@RequiredArgsConstructor +@SuppressWarnings("unused") +public class MinioHelper { + /** + * 7 days + */ + private static final int DEFAULT_EXPIRY_TIME = 7 * 24 * 3600; + private final MinioClient minioClient; + + @SneakyThrows + public boolean bucketExists(@NotBlank String bucketName) { + return this.minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build()); + } + + @SneakyThrows + @SuppressWarnings("UnusedReturnValue") + public boolean makeBucket(@NotBlank String bucketName) { + if (this.bucketExists(bucketName)) { + log.warn("The bucket named '{}' exists", bucketName); + return false; + } + this.minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build()); + return true; + } + + @SneakyThrows + public ObjectWriteResponse put(@NotBlank String bucketName, @NotBlank String objectName, + @NotNull MultipartFile multipartFile) { + return this.minioClient.putObject( + PutObjectArgs.builder() + .bucket(bucketName) + .object(objectName) + .stream(multipartFile.getInputStream(), multipartFile.getSize(), -1) + .contentType(multipartFile.getContentType()) + .build()); + } + + @SneakyThrows + public ObjectWriteResponse putObject(@NotBlank String bucketName, @NotBlank String objectName, + @NotNull InputStream inputStream, @NotBlank String contentType) { + return this.minioClient.putObject( + PutObjectArgs + .builder() + .bucket(bucketName) + .object(objectName) + .stream(inputStream, inputStream.available(), -1) + .contentType(contentType) + .build()); + } + + @SneakyThrows + public List listBucketNames() { + return this.listBuckets().stream().map(Bucket::name).collect(Collectors.toList()); + } + + @SneakyThrows + public List listBuckets() { + return this.minioClient.listBuckets(); + } + + @SneakyThrows + public boolean removeBucket(@NotBlank String bucketName) { + if (!this.bucketExists(bucketName)) { + return false; + } + val myObjects = this.listObjects(bucketName); + for (val result : myObjects) { + val item = result.get(); + // If item has files, fail to remove + if (item.size() > 0) { + return false; + } + } + // If bucket is empty, then it can be removed + this.minioClient.removeBucket(RemoveBucketArgs.builder().bucket(bucketName).build()); + return !this.bucketExists(bucketName); + } + + @SneakyThrows + public List listObjectNames(@NotBlank String bucketName) { + val listObjectNames = new LinkedList(); + if (!this.bucketExists(bucketName)) { + return listObjectNames; + } + val myObjects = this.listObjects(bucketName); + for (val result : myObjects) { + val item = result.get(); + listObjectNames.add(item.objectName()); + } + return listObjectNames; + } + + @SneakyThrows + public Iterable> listObjects(@NotBlank String bucketName) { + if (!this.bucketExists(bucketName)) { + return null; + } + return this.minioClient.listObjects(ListObjectsArgs.builder().bucket(bucketName).build()); + } + + @SneakyThrows + public GetObjectResponse getObject(@NotBlank String bucketName, @NotBlank String objectName) { + if (!this.bucketExists(bucketName)) { + return null; + } + val statObjectResponse = this.statObject(bucketName, objectName); + if (ObjectUtil.isNull(statObjectResponse) || statObjectResponse.size() == 0) { + return null; + } + return this.minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(objectName).build()); + } + + @SneakyThrows + public GetObjectResponse getObject(@NotBlank String bucketName, @NotBlank String objectName, @Min(0L) long offset, + @NotNull @Min(0L) Long length) { + if (!this.bucketExists(bucketName)) { + return null; + } + val statObjectResponse = this.statObject(bucketName, objectName); + if (ObjectUtil.isNull(statObjectResponse) || statObjectResponse.size() == 0) { + return null; + } + return this.minioClient.getObject( + GetObjectArgs.builder().bucket(bucketName).object(objectName).offset(offset).length(length).build()); + } + + @SneakyThrows + public boolean removeObject(String bucketName, String objectName) { + if (!this.bucketExists(bucketName)) { + return false; + } + this.minioClient.removeObject(RemoveObjectArgs.builder().bucket(bucketName).object(objectName).build()); + return true; + } + + @SneakyThrows + public List removeObject(String bucketName, List objectNames) { + val deleteErrorNameList = new LinkedList(); + if (this.bucketExists(bucketName)) { + val deleteObjectList = objectNames.stream().map(DeleteObject::new).collect(Collectors.toList()); + val results = this.minioClient.removeObjects( + RemoveObjectsArgs.builder().bucket(bucketName).objects(deleteObjectList).build()); + for (val result : results) { + val error = result.get(); + deleteErrorNameList.add(error.objectName()); + } + } + return deleteErrorNameList; + } + + @SneakyThrows + public String getPresignedObjectUrl(@NotBlank String bucketName, @NotBlank String objectName, + @NotNull Method method, + @NotNull @Min(1L) @Max(DEFAULT_EXPIRY_TIME) Integer expiration) { + if (!this.bucketExists(bucketName)) { + return null; + } + return this.minioClient.getPresignedObjectUrl( + GetPresignedObjectUrlArgs + .builder() + .bucket(bucketName) + .object(objectName) + .method(method) + .expiry(expiration) + .build()); + } + + @SneakyThrows + public StatObjectResponse statObject(@NotBlank String bucketName, @NotBlank String objectName) { + if (!this.bucketExists(bucketName)) { + return null; + } + return this.minioClient.statObject(StatObjectArgs.builder().bucket(bucketName).object(objectName).build()); + } + + @SneakyThrows + public String getPresignedObjectUrl(@NotBlank String bucketName, @NotBlank String objectName) { + if (!this.bucketExists(bucketName)) { + return null; + } + return this.minioClient.getPresignedObjectUrl( + GetPresignedObjectUrlArgs.builder().bucket(bucketName).object(objectName).build()); + } +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/helper/SpringBootStartupHelper.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/helper/SpringBootStartupHelper.java new file mode 100644 index 00000000..006e11cc --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/helper/SpringBootStartupHelper.java @@ -0,0 +1,39 @@ +package com.jmsoftware.maf.springcloudstarter.helper; + +import com.jmsoftware.maf.springcloudstarter.configuration.MafProjectProperty; +import lombok.NonNull; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.springframework.util.StopWatch; + +import java.time.Instant; +import java.time.ZoneId; +import java.util.TimeZone; + +/** + * Description: SpringBootStartupHelper, change description here. + * + * @author 钟俊(zhongjun), email: zhongjun@toguide.cn, date: 2/10/2021 10:07 AM + **/ +@Slf4j +@Component +@RequiredArgsConstructor +public class SpringBootStartupHelper { + private static final String LINE_SEPARATOR = System.lineSeparator(); + private final MafProjectProperty mafProjectProperty; + private final IpHelper ipHelper; + + public void stop(@NonNull StopWatch stopWatch) { + stopWatch.stop(); + log.info("🥳 Congratulations! 🎉"); + log.info("🖥 {}@{} started!", this.mafProjectProperty.getProjectArtifactId(), this.mafProjectProperty.getVersion()); + log.info("⚙️ Environment: {}", this.mafProjectProperty.getEnvironment()); + log.info("⏳ Deployment duration: {} seconds ({} ms)", stopWatch.getTotalTimeSeconds(), + stopWatch.getTotalTimeMillis()); + log.info("⏰ App started at {} (timezone - {})", Instant.now().atZone(ZoneId.of("UTC+8")), TimeZone.getDefault().getDisplayName()); + log.info("{} App running at{} - Local: http://localhost:{}{}/{} - Network: http://{}:{}{}/", + LINE_SEPARATOR, LINE_SEPARATOR, this.ipHelper.getServerPort(), this.mafProjectProperty.getContextPath(), + LINE_SEPARATOR, this.ipHelper.getPublicIp(), this.ipHelper.getServerPort(), this.mafProjectProperty.getContextPath()); + } +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/package-info.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/package-info.java new file mode 100644 index 00000000..6073f65a --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/package-info.java @@ -0,0 +1 @@ +package com.jmsoftware.maf.springcloudstarter; diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/GreetingQuartzJobBean.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/GreetingQuartzJobBean.java new file mode 100644 index 00000000..3c7416c6 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/GreetingQuartzJobBean.java @@ -0,0 +1,29 @@ +package com.jmsoftware.maf.springcloudstarter.quartz; + +import com.jmsoftware.maf.springcloudstarter.configuration.MafProjectProperty; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.quartz.JobExecutionContext; +import org.springframework.lang.NonNull; +import org.springframework.scheduling.quartz.QuartzJobBean; + +/** + * Description: GreetingQuartzJobBean, change description here. + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 7/13/2021 10:16 PM + * @see + * Quartz Scheduler + **/ +@Slf4j +@RequiredArgsConstructor +public class GreetingQuartzJobBean extends QuartzJobBean { + /** + * Injected field, spring bean. + */ + private final MafProjectProperty mafProjectProperty; + + @Override + protected void executeInternal(@NonNull JobExecutionContext jobExecutionContext) { + log.info("Greeting from Quartz job, current service is: {}", this.mafProjectProperty.getProjectArtifactId()); + } +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/QuartzConfiguration.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/QuartzConfiguration.java new file mode 100644 index 00000000..f9805ed8 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/QuartzConfiguration.java @@ -0,0 +1,61 @@ +package com.jmsoftware.maf.springcloudstarter.quartz; + +import com.jmsoftware.maf.springcloudstarter.configuration.MafProjectProperty; +import lombok.extern.slf4j.Slf4j; +import lombok.val; +import org.quartz.Scheduler; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.context.annotation.Bean; +import org.springframework.scheduling.quartz.CronTriggerFactoryBean; +import org.springframework.scheduling.quartz.JobDetailFactoryBean; +import org.springframework.scheduling.quartz.SchedulerFactoryBean; +import org.springframework.transaction.PlatformTransactionManager; + +import java.util.Optional; + +/** + * Description: QuartzConfiguration, change description here. + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 7/13/2021 10:44 PM + **/ +@Slf4j +@ConditionalOnClass({Scheduler.class, SchedulerFactoryBean.class, PlatformTransactionManager.class}) +public class QuartzConfiguration { + @Bean + public GreetingQuartzJobBean greetingQuartzJobBean(MafProjectProperty mafProjectProperty) { + log.warn("Initial bean: '{}'", GreetingQuartzJobBean.class.getSimpleName()); + return new GreetingQuartzJobBean(mafProjectProperty); + } + + @Bean("greetingQuartzJobDetailFactoryBean") + public JobDetailFactoryBean greetingQuartzJobDetailFactoryBean(GreetingQuartzJobBean greetingQuartzJobBean) { + val jobDetailFactoryBean = new JobDetailFactoryBean(); + jobDetailFactoryBean.setName("greeting-job-detail"); + jobDetailFactoryBean.setGroup("default"); + jobDetailFactoryBean.setJobClass(greetingQuartzJobBean.getClass()); + jobDetailFactoryBean.setDescription("Greeting job detail created by JobDetailFactoryBean"); + jobDetailFactoryBean.setDurability(true); + log.warn("Initial bean: '{}'", JobDetailFactoryBean.class.getSimpleName()); + return jobDetailFactoryBean; + } + + @Bean("greetingQuartzJobCronTriggerFactoryBean") + public CronTriggerFactoryBean greetingQuartzJobCronTriggerFactoryBean( + @Qualifier("greetingQuartzJobDetailFactoryBean") JobDetailFactoryBean jobDetailFactoryBean) { + val cronTriggerFactoryBean = new CronTriggerFactoryBean(); + cronTriggerFactoryBean.setName("greeting-cron-trigger"); + cronTriggerFactoryBean.setGroup("default"); + cronTriggerFactoryBean.setCronExpression("0 0/1 * 1/1 * ? *"); + val optionalJobDetail = Optional.ofNullable(jobDetailFactoryBean.getObject()); + optionalJobDetail.ifPresent(cronTriggerFactoryBean::setJobDetail); + log.warn("Initial bean: '{}'", CronTriggerFactoryBean.class.getSimpleName()); + return cronTriggerFactoryBean; + } + + @Bean + public QuartzJobService quartzJobService(SchedulerFactoryBean schedulerFactoryBean) { + log.warn("Initial bean: '{}'", QuartzJobServiceImpl.class.getSimpleName()); + return new QuartzJobServiceImpl(schedulerFactoryBean); + } +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/QuartzJobService.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/QuartzJobService.java new file mode 100644 index 00000000..9e341ad0 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/QuartzJobService.java @@ -0,0 +1,90 @@ +package com.jmsoftware.maf.springcloudstarter.quartz; + +import org.springframework.lang.Nullable; +import org.springframework.validation.annotation.Validated; + +import javax.validation.constraints.NotBlank; +import java.util.Map; + +/** + * Description: QuartzJobService, change description here. + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 7/13/2021 10:17 PM + */ +@Validated +public interface QuartzJobService { + /** + * Add job. + * + * @param clazzName the clazz name + * @param jobName the job name + * @param groupName the group name + * @param cronExp the cron exp + * @param param the param + */ + void addJob(@NotBlank String clazzName, @NotBlank String jobName, @NotBlank String groupName, + @NotBlank String cronExp, @Nullable Map param); + + /** + * Pause job. + * + * @param jobName the job name + * @param groupName the group name + */ + void pauseJob(@NotBlank String jobName, @NotBlank String groupName); + + /** + * Resume job. + * + * @param jobName the job name + * @param groupName the group name + */ + void resumeJob(@NotBlank String jobName, @NotBlank String groupName); + + /** + * Run immediately. + * + * @param jobName the job name + * @param groupName the group name + */ + void runImmediately(@NotBlank String jobName, @NotBlank String groupName); + + /** + * Update job. + * + * @param jobName the job name + * @param groupName the group name + * @param cronExp the cron exp + * @param param the param + */ + void updateJob(@NotBlank String jobName, @NotBlank String groupName, @NotBlank String cronExp, + @Nullable Map param); + + /** + * Delete job. + * + * @param jobName the job name + * @param groupName the group name + */ + void deleteJob(@NotBlank String jobName, @NotBlank String groupName); + + /** + * Start all jobs. + */ + void startAllJobs(); + + /** + * Pause all jobs. + */ + void pauseAllJobs(); + + /** + * Resume all jobs. + */ + void resumeAllJobs(); + + /** + * Shutdown all jobs. + */ + void shutdownAllJobs(); +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/QuartzJobServiceImpl.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/QuartzJobServiceImpl.java new file mode 100644 index 00000000..5c0ce1ee --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/QuartzJobServiceImpl.java @@ -0,0 +1,135 @@ +package com.jmsoftware.maf.springcloudstarter.quartz; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import lombok.val; +import org.quartz.*; +import org.springframework.lang.Nullable; +import org.springframework.scheduling.SchedulingException; +import org.springframework.scheduling.quartz.SchedulerFactoryBean; + +import javax.validation.constraints.NotBlank; +import java.util.Map; +import java.util.function.UnaryOperator; + +/** + * Description: QuartzJobServiceImpl, change description here. + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 7/13/2021 10:18 PM + * @see SpringBoot 整合 Quartz 实现分布式调度 + **/ +@Slf4j +@RequiredArgsConstructor +public class QuartzJobServiceImpl implements QuartzJobService { + public static final String JOB_DETAIL_POSTFIX = "-job-detail"; + public static final String TRIGGER_POSTFIX = "-trigger"; + private static final UnaryOperator JOB_DETAIL_NAME_OPERATOR = jobName -> jobName + JOB_DETAIL_POSTFIX; + private static final UnaryOperator TRIGGER_NAME_OPERATOR = jobName -> jobName + TRIGGER_POSTFIX; + private final SchedulerFactoryBean schedulerFactoryBean; + + @Override + @SneakyThrows({ClassNotFoundException.class, SchedulerException.class}) + public void addJob(@NotBlank String clazzName, @NotBlank String jobName, @NotBlank String groupName, + @NotBlank String cronExp, @Nullable Map param) { + val jobDetailName = JOB_DETAIL_NAME_OPERATOR.apply(jobName); + // Build job + val jobClass = Class.forName(clazzName).asSubclass(Job.class); + val jobDetail = JobBuilder.newJob(jobClass).withIdentity(jobDetailName, groupName).build(); + // Build cron-expression schedule + val scheduleBuilder = CronScheduleBuilder.cronSchedule(cronExp); + val triggerName = TRIGGER_NAME_OPERATOR.apply(jobName); + // Build trigger + val trigger = TriggerBuilder + .newTrigger() + .withIdentity(triggerName, groupName) + .withSchedule(scheduleBuilder) + .build(); + if (ObjectUtil.isNotNull(param)) { + trigger.getJobDataMap().putAll(param); + } + this.schedulerFactoryBean.getScheduler().scheduleJob(jobDetail, trigger); + log.info("Added job to scheduler. jobDetailName: {}, triggerName: {}", jobDetailName, triggerName); + } + + @Override + @SneakyThrows({SchedulerException.class}) + public void pauseJob(@NotBlank String jobName, @NotBlank String groupName) { + val jobDetailName = JOB_DETAIL_NAME_OPERATOR.apply(jobName); + this.schedulerFactoryBean.getScheduler().pauseJob(JobKey.jobKey(jobDetailName, groupName)); + log.info("Paused job. jobDetailName: {}", jobDetailName); + } + + @Override + @SneakyThrows({SchedulerException.class}) + public void resumeJob(@NotBlank String jobName, @NotBlank String groupName) { + val jobDetailName = JOB_DETAIL_NAME_OPERATOR.apply(jobName); + this.schedulerFactoryBean.getScheduler().resumeJob(JobKey.jobKey(jobDetailName, groupName)); + log.info("Resumed job. jobDetailName: {}", jobDetailName); + } + + @Override + @SneakyThrows({SchedulerException.class}) + public void runImmediately(@NotBlank String jobName, @NotBlank String groupName) { + val jobDetailName = JOB_DETAIL_NAME_OPERATOR.apply(jobName); + this.schedulerFactoryBean.getScheduler().triggerJob(JobKey.jobKey(jobDetailName, groupName)); + log.info("Triggered the identified JobDetail (execute it now). jobDetailName: {}", jobDetailName); + } + + @Override + @SneakyThrows({SchedulerException.class}) + public void updateJob(@NotBlank String jobName, @NotBlank String groupName, @NotBlank String cronExp, + @Nullable Map param) { + val triggerName = TRIGGER_NAME_OPERATOR.apply(jobName); + val triggerKey = TriggerKey.triggerKey(triggerName, groupName); + var trigger = (CronTrigger) this.schedulerFactoryBean.getScheduler().getTrigger(triggerKey); + if (StrUtil.isNotBlank(cronExp)) { + val scheduleBuilder = CronScheduleBuilder.cronSchedule(cronExp); + trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build(); + } + if (ObjectUtil.isNotNull(param)) { + trigger.getJobDataMap().putAll(param); + } + this.schedulerFactoryBean.getScheduler().rescheduleJob(triggerKey, trigger); + log.info("Updated job. triggerName: {}", triggerName); + } + + @Override + @SneakyThrows({SchedulerException.class}) + public void deleteJob(@NotBlank String jobName, @NotBlank String groupName) { + val triggerName = TRIGGER_NAME_OPERATOR.apply(jobName); + // Pause, Remove the trigger and the job, and then delete the job. + this.schedulerFactoryBean.getScheduler().pauseTrigger(TriggerKey.triggerKey(jobName, groupName)); + this.schedulerFactoryBean.getScheduler().unscheduleJob(TriggerKey.triggerKey(jobName, groupName)); + this.schedulerFactoryBean.getScheduler().deleteJob(JobKey.jobKey(jobName, groupName)); + log.info("Updated job. triggerName: {}", triggerName); + } + + @Override + @SneakyThrows({SchedulingException.class}) + public void startAllJobs() { + this.schedulerFactoryBean.start(); + log.info("Started jobs."); + } + + @Override + @SneakyThrows({SchedulerException.class}) + public void pauseAllJobs() { + this.schedulerFactoryBean.getScheduler().pauseAll(); + log.info("Paused all jobs."); + } + + @Override + @SneakyThrows({SchedulerException.class}) + public void resumeAllJobs() { + this.schedulerFactoryBean.getScheduler().resumeAll(); + log.info("Resumed all jobs."); + } + + @Override + public void shutdownAllJobs() { + throw new IllegalCallerException("Not supported operation!"); + } +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/redis/RedisCachingConfiguration.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/redis/RedisCachingConfiguration.java new file mode 100644 index 00000000..7b0295b2 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/redis/RedisCachingConfiguration.java @@ -0,0 +1,83 @@ +package com.jmsoftware.maf.springcloudstarter.redis; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import lombok.val; +import org.springframework.cache.CacheManager; +import org.springframework.cache.annotation.CachingConfigurerSupport; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.cache.interceptor.*; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.cache.RedisCacheConfiguration; +import org.springframework.data.redis.cache.RedisCacheManager; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer; +import org.springframework.data.redis.serializer.RedisSerializationContext; + +import javax.annotation.PostConstruct; +import java.util.Objects; + +import static org.springframework.data.redis.cache.RedisCacheConfiguration.defaultCacheConfig; + +/** + * Description: RedisCachingConfiguration, change description here. + * + * @author 钟俊(zhongjun), email: zhongjun@toguide.cn, date: 12/30/2020 11:48 AM + * @see + * Spring boot 之 spring-boot-starter-cache (整合 Redis) + **/ +@Slf4j +@Configuration +@EnableCaching +@RequiredArgsConstructor +public class RedisCachingConfiguration extends CachingConfigurerSupport { + private final RedisConnectionFactory redisConnectionFactory; + + @PostConstruct + private void postConstruct() { + log.warn("Initial bean: '{}'", RedisCachingConfiguration.class.getSimpleName()); + } + + @Bean + @Override + public CacheManager cacheManager() { + log.warn("Initial bean: '{}'", CacheManager.class.getSimpleName()); + RedisCacheConfiguration cacheConfiguration = defaultCacheConfig() + .disableCachingNullValues() + .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer( + new GenericJackson2JsonRedisSerializer())); + return RedisCacheManager + .builder(this.redisConnectionFactory) + .cacheDefaults(cacheConfiguration) + .build(); + } + + @Bean + @Override + public CacheResolver cacheResolver() { + log.warn("Initial bean: '{}'", SimpleCacheResolver.class.getSimpleName()); + return new SimpleCacheResolver(Objects.requireNonNull(this.cacheManager())); + } + + @Bean + @Override + public KeyGenerator keyGenerator() { + log.warn("Initial bean: '{}'", KeyGenerator.class.getSimpleName()); + return (target, method, params) -> { + val stringBuilder = new StringBuilder(); + stringBuilder.append(target.getClass().getName()).append("#").append(method.getName()); + for (Object param : params) { + stringBuilder.append(":").append(param.toString()); + } + return stringBuilder.toString(); + }; + } + + @Bean + @Override + public CacheErrorHandler errorHandler() { + log.warn("Initial bean: '{}'", CacheErrorHandler.class.getSimpleName()); + return new SimpleCacheErrorHandler(); + } +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/redis/RedisConfiguration.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/redis/RedisConfiguration.java new file mode 100644 index 00000000..51061a60 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/redis/RedisConfiguration.java @@ -0,0 +1,87 @@ +package com.jmsoftware.maf.springcloudstarter.redis; + +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Import; +import org.springframework.data.redis.connection.ReactiveRedisConnectionFactory; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.core.ReactiveRedisTemplate; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; +import org.springframework.data.redis.serializer.RedisSerializationContext; +import org.springframework.data.redis.serializer.RedisSerializer; +import org.springframework.data.redis.serializer.StringRedisSerializer; + +import javax.annotation.PostConstruct; + +/** + * Description: RedisConfiguration, change description here. + * + * @author 钟俊(zhongjun), email: zhongjun@toguide.cn, date: 12/30/2020 1:08 PM + **/ +@Slf4j +@RequiredArgsConstructor +@Import({ + RedisCachingConfiguration.class +}) +@ConditionalOnClass({RedisConnectionFactory.class}) +public class RedisConfiguration { + private final ObjectMapper objectMapper; + + @PostConstruct + private void postConstruct() { + log.warn("Initial bean: '{}'", RedisConfiguration.class.getSimpleName()); + } + + /** + * RedisTemplate uses JDK byte code serialization (byte[]), which is not that readable and friendly to + * human reading. + *

+ * In order to replace that, we have to customize RedisTemplate. + * + * @param redisConnectionFactory the redis connection factory + * @return RedisTemplate redis template + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 12/30/2020 1:18 PM + */ + @Bean + public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) { + log.warn("Initial bean: '{}'", RedisTemplate.class.getSimpleName()); + + RedisTemplate redisTemplate = new RedisTemplate<>(); + redisTemplate.setConnectionFactory(redisConnectionFactory); + + Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = + new Jackson2JsonRedisSerializer<>(Object.class); + jackson2JsonRedisSerializer.setObjectMapper(this.objectMapper); + + // Set key serializers as StringRedisSerializer + redisTemplate.setKeySerializer(new StringRedisSerializer()); + // Use Jackson2JsonRedisSerialize to replace default JDK serialization + redisTemplate.setValueSerializer(jackson2JsonRedisSerializer); + redisTemplate.afterPropertiesSet(); + return redisTemplate; + } + + /** + * Reactive redis template factory. + * + * @param connectionFactory the reactive redis connection factory + * @return the reactive redis template + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 12/30/2020 1:43 PM + */ + @Bean + ReactiveRedisTemplate reactiveRedisTemplate(ReactiveRedisConnectionFactory connectionFactory) { + log.warn("Initial bean: '{}'", ReactiveRedisTemplate.class.getSimpleName()); + Jackson2JsonRedisSerializer valueSerializer = new Jackson2JsonRedisSerializer<>(Object.class); + RedisSerializationContext serializationContext = RedisSerializationContext + .newSerializationContext( + RedisSerializationContext.SerializationPair.fromSerializer(RedisSerializer.string())) + .value(valueSerializer) + .hashValue(valueSerializer) + .build(); + return new ReactiveRedisTemplate<>(connectionFactory, serializationContext); + } +} diff --git a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/service/CommonService.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/service/CommonService.java similarity index 73% rename from auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/service/CommonService.java rename to spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/service/CommonService.java index 9dc7a7ca..79b4a9c6 100644 --- a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/service/CommonService.java +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/service/CommonService.java @@ -1,17 +1,17 @@ -package com.jmsoftware.maf.authcenter.universal.service; +package com.jmsoftware.maf.springcloudstarter.service; +import cn.hutool.json.JSON; import com.jmsoftware.maf.common.domain.ValidationTestPayload; import org.springframework.validation.annotation.Validated; import javax.validation.Valid; -import java.util.Map; /** *

CommonService

*

* Change description here. * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com * @date 2/4/20 11:15 AM */ @Validated @@ -21,7 +21,7 @@ public interface CommonService { * * @return the application info. */ - Map getApplicationInfo(); + JSON getApplicationInfo(); /** * Validate object. diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/service/impl/CommonServiceImpl.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/service/impl/CommonServiceImpl.java new file mode 100644 index 00000000..42778b44 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/service/impl/CommonServiceImpl.java @@ -0,0 +1,39 @@ +package com.jmsoftware.maf.springcloudstarter.service.impl; + +import cn.hutool.json.JSON; +import cn.hutool.json.JSONUtil; +import com.jmsoftware.maf.common.domain.ValidationTestPayload; +import com.jmsoftware.maf.springcloudstarter.configuration.MafProjectProperty; +import com.jmsoftware.maf.springcloudstarter.service.CommonService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import javax.validation.Valid; + +/** + *

CommonServiceImpl

+ *

+ * Change description here. + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 12/29/2020 1:47 PM + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class CommonServiceImpl implements CommonService { + private final MafProjectProperty mafProjectProperty; + @Value("${greeting:Hello, World! (Embedded in Java)}") + private String greeting; + + @Override + public JSON getApplicationInfo() { + return JSONUtil.parseObj(this.mafProjectProperty).set("greeting", this.greeting); + } + + @Override + public void validateObject(@Valid ValidationTestPayload payload) { + log.info("Validation passed! {}", payload); + } +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/sftp/SftpClientConfiguration.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/sftp/SftpClientConfiguration.java new file mode 100644 index 00000000..86686ee9 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/sftp/SftpClientConfiguration.java @@ -0,0 +1,74 @@ +package com.jmsoftware.maf.springcloudstarter.sftp; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.core.io.Resource; +import org.springframework.stereotype.Component; +import org.springframework.validation.annotation.Validated; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + *

SftpClientConfiguration

+ *

SFTP client configuration

+ * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com + * @date 2019-07-04 18:18 + **/ +@Data +@Component +@Validated +@ConfigurationProperties(prefix = SftpClientConfiguration.PREFIX) +public class SftpClientConfiguration { + /** + * The constant PREFIX. + */ + public static final String PREFIX = "sftp"; + /** + * The Enabled. + */ + @NotNull + private Boolean enabled = Boolean.FALSE; + /** + * SFTP server IP + */ + @NotBlank + private String host; + /** + * SFTP server port + */ + @NotNull + private Integer port; + /** + * Login user + */ + @NotBlank + private String user; + /** + * Login password + */ + @NotBlank + private String password; + /** + * Remote directory + */ + @NotBlank + private String directory; + /** + * Private key + */ + private Resource privateKey; + /** + * Private key pass phrase + */ + private String privateKeyPassPhrase; + /** + * The maximum cache size of session. Default: 10 + */ + private Integer sessionCacheSize = 10; + /** + * The session wait timeout (time unit: MILLISECONDS). Default: 10 * 1000L (10 seconds) + */ + private Long sessionWaitTimeout = 10 * 1000L; +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/sftp/SftpConfiguration.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/sftp/SftpConfiguration.java new file mode 100644 index 00000000..36071494 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/sftp/SftpConfiguration.java @@ -0,0 +1,96 @@ +package com.jmsoftware.maf.springcloudstarter.sftp; + +import com.jcraft.jsch.ChannelSftp; +import lombok.extern.slf4j.Slf4j; +import lombok.val; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; +import org.springframework.expression.common.LiteralExpression; +import org.springframework.integration.annotation.ServiceActivator; +import org.springframework.integration.file.remote.session.CachingSessionFactory; +import org.springframework.integration.file.remote.session.SessionFactory; +import org.springframework.integration.sftp.outbound.SftpMessageHandler; +import org.springframework.integration.sftp.session.DefaultSftpSessionFactory; +import org.springframework.integration.sftp.session.SftpRemoteFileTemplate; +import org.springframework.messaging.MessageHandler; + +import java.io.File; + +/** + * Description: SftpConfiguration, change description here. + * + * @author 钟俊(zhongjun), email: zhongjun@toguide.cn, date: 1/29/2021 2:09 PM + **/ +@Slf4j +@Configuration +@Import({ + SftpClientConfiguration.class +}) +@ConditionalOnProperty({"sftp.enabled"}) +public class SftpConfiguration { + @Bean + public SessionFactory sftpSessionFactory(SftpClientConfiguration sftpClientConfiguration) { + val factory = new DefaultSftpSessionFactory(true); + factory.setHost(sftpClientConfiguration.getHost()); + factory.setPort(sftpClientConfiguration.getPort()); + factory.setUser(sftpClientConfiguration.getUser()); + if (sftpClientConfiguration.getPrivateKey() != null) { + factory.setPrivateKey(sftpClientConfiguration.getPrivateKey()); + factory.setPrivateKeyPassphrase(sftpClientConfiguration.getPrivateKeyPassPhrase()); + } else { + factory.setPassword(sftpClientConfiguration.getPassword()); + } + factory.setAllowUnknownKeys(true); + // We return a caching session factory, so that we don't have to reconnect to SFTP server for each time + val cachingSessionFactory = new CachingSessionFactory<>(factory, sftpClientConfiguration.getSessionCacheSize()); + cachingSessionFactory.setSessionWaitTimeout(sftpClientConfiguration.getSessionWaitTimeout()); + log.warn("Initial bean: '{}'", cachingSessionFactory.getClass().getSimpleName()); + return cachingSessionFactory; + } + + @Bean + @ServiceActivator(inputChannel = "toSftpChannel") + @SuppressWarnings("UnresolvedMessageChannel") + public MessageHandler messageHandler(SessionFactory sftpSessionFactory, + SftpClientConfiguration sftpClientConfiguration) { + val handler = new SftpMessageHandler(sftpSessionFactory); + handler.setRemoteDirectoryExpression(new LiteralExpression(sftpClientConfiguration.getDirectory())); + handler.setFileNameGenerator(message -> { + if (message.getPayload() instanceof File) { + return ((File) message.getPayload()).getName(); + } else { + throw new IllegalArgumentException("File expected as payload."); + } + }); + log.warn("Initial bean: '{}'", handler.getClass().getSimpleName()); + return handler; + } + + @Bean + public SftpRemoteFileTemplate sftpRemoteFileTemplate(SessionFactory sftpSessionFactory, + SftpClientConfiguration sftpClientConfiguration) { + val sftpRemoteFileTemplate = new SftpRemoteFileTemplate(sftpSessionFactory); + sftpRemoteFileTemplate.setRemoteDirectoryExpression( + new LiteralExpression(sftpClientConfiguration.getDirectory())); + sftpRemoteFileTemplate.setAutoCreateDirectory(true); + // sftpRemoteFileTemplate.setBeanFactory(beanFactory); + sftpRemoteFileTemplate.afterPropertiesSet(); + log.warn("Initial bean: '{}'", sftpRemoteFileTemplate.getClass().getSimpleName()); + return sftpRemoteFileTemplate; + } + + @Bean + public SftpSubDirectoryRunner sftpSubDirectoryRunner(SftpRemoteFileTemplate sftpRemoteFileTemplate, + SftpClientConfiguration sftpClientConfiguration) { + log.warn("Initial bean: '{}'", SftpSubDirectoryRunner.class.getSimpleName()); + return new SftpSubDirectoryRunner(sftpRemoteFileTemplate, sftpClientConfiguration); + } + + @Bean + public SftpHelper sftpHelper(SftpRemoteFileTemplate sftpRemoteFileTemplate) { + log.warn("Initial bean: '{}'", SftpHelper.class.getSimpleName()); + return new SftpHelper(sftpRemoteFileTemplate); + } +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/sftp/SftpHelper.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/sftp/SftpHelper.java new file mode 100644 index 00000000..b8df9010 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/sftp/SftpHelper.java @@ -0,0 +1,174 @@ +package com.jmsoftware.maf.springcloudstarter.sftp; + +import com.jcraft.jsch.ChannelSftp; +import com.jmsoftware.maf.springcloudstarter.util.FileUtil; +import javassist.NotFoundException; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import lombok.val; +import org.springframework.integration.file.support.FileExistsMode; +import org.springframework.integration.sftp.session.SftpRemoteFileTemplate; +import org.springframework.integration.support.MessageBuilder; +import org.springframework.messaging.Message; +import org.springframework.stereotype.Component; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.multipart.MultipartFile; + +import javax.validation.Valid; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.BufferedInputStream; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.atomic.AtomicReference; + +/** + * Description: Sftp Helper + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 2/26/2021 3:47 PM + */ +@Slf4j +@Validated +@Component +@RequiredArgsConstructor +@SuppressWarnings("unused") +public class SftpHelper { + /** + * The Sftp remote file template. + */ + private final SftpRemoteFileTemplate sftpRemoteFileTemplate; + + /** + * List all files under the full path + * + * @param fullPath directory full path + * @return file names + */ + public List listFiles(@NotBlank String fullPath) { + log.info("Listing files, full path: {}", fullPath); + return sftpRemoteFileTemplate.execute(session -> { + var strings = new String[0]; + try { + strings = session.listNames(fullPath); + } catch (IOException e) { + log.error("Exception occurred when listing files. Exception message: {}", e.getMessage(), e); + } + return Arrays.asList(strings); + }); + } + + /** + * Check whether file exists according to file path + * + * @param fileFullPath file's full path + * @return true - file exists; false - file not exists + */ + public boolean exist(@NotBlank String fileFullPath) { + log.info("Checking whether file exists in SFTP server, file full path: {}", fileFullPath); + return sftpRemoteFileTemplate.execute(session -> session.exists(fileFullPath)); + } + + /** + * Get file size + * + * @param fileFullPath file's full path + * @return file size (size unit: byte). Null if the file does not exist or path refers to a directory + * @throws IllegalArgumentException when file does not exist + */ + public Long getFileSize(@NotBlank String fileFullPath) throws IllegalArgumentException { + if (!exist(fileFullPath)) { + throw new IllegalArgumentException( + "Cannot get file size from SFTP server. Caused by: file does not exist, full path: " + fileFullPath); + } + String[] splits = fileFullPath.split("/"); + String fileName = splits[splits.length - 1]; + String listPath = fileFullPath.substring(0, fileFullPath.lastIndexOf(fileName) - 1); + log.info("Retrieve file size from SFTP server, full path: {}", fileFullPath); + final Long[] fileSize = new Long[1]; + sftpRemoteFileTemplate.execute(session -> { + ChannelSftp.LsEntry[] lsEntries = session.list(listPath); + for (ChannelSftp.LsEntry lsEntry : lsEntries) { + if (lsEntry.getFilename().equals(fileName)) { + fileSize[0] = lsEntry.getAttrs().getSize(); + } + } + return null; + }); + return fileSize[0]; + } + + /** + * Upload single file + * + * @param sftpUploadFile encapsulated object + * @return file 's full path if successful, else null + */ + public String upload(@Valid SftpUploadFile sftpUploadFile) { + log.info("Uploading single file to SFTP server. SftpUploadFile: {}", sftpUploadFile); + Message message = MessageBuilder.withPayload(sftpUploadFile.getFileToBeUploaded()).build(); + return sftpRemoteFileTemplate.send(message, sftpUploadFile.getSubDirectory(), + sftpUploadFile.getFileExistsMode()); + } + + /** + * Upload file + * + * @param multipartFile multipart file + * @param subDirectory SFTP server's sub directory (if sub directory doesn't exist, will be auto created). Not + * empty and it looks like this: "/some/sub/directory/" + * @param fileExistsMode This enumeration indicates what action shall be taken in case the destination file + * already exists. In default, it should be set as: FileExistsMode.REPLACE + * @param deleteSource true - delete source file; false - not delete source file + * @return file full path if successful, else null + * @throws IOException IO exception + */ + public String upload(@NotNull MultipartFile multipartFile, @NotBlank String subDirectory, + @NotNull FileExistsMode fileExistsMode, boolean deleteSource) throws IOException { + log.info("Uploading single multipart file to SFTP server. File name: {}", multipartFile.getOriginalFilename()); + File file = FileUtil.convertFrom(multipartFile); + SftpUploadFile sftpUploadFile = SftpUploadFile.builder() + .fileToBeUploaded(file) + .subDirectory(subDirectory) + .fileExistsMode(fileExistsMode) + .build(); + String fileFullPath = this.upload(sftpUploadFile); + if (deleteSource) { + val deleted = file.delete(); + log.debug("File deleted: {}, {}", deleted, file); + } + return fileFullPath; + } + + /** + * Read file from SFTP server + * + * @param fileFullPath file's full path + * @return buffered file stream + * @throws NotFoundException when file does not exist + */ + public BufferedInputStream read(@NotBlank String fileFullPath) throws NotFoundException { + log.info("Read file from SFTP server, file full path: {}", fileFullPath); + val inputStream = new AtomicReference(); + val got = sftpRemoteFileTemplate.get(fileFullPath, inputStream::set); + if (!got) { + val errorMessage = String.format("Cannot find the file! fileFullPath: %s", fileFullPath); + log.error(errorMessage); + throw new NotFoundException(errorMessage); + } + return new BufferedInputStream(inputStream.get()); + } + + /** + * Delete file according to file path + * + * @param fileFullPath file's full path + * @return true - file deleted; false - file not deleted + */ + public boolean delete(@NotBlank String fileFullPath) { + log.warn("Deleting SFTP server's file by file full path: {}", fileFullPath); + return sftpRemoteFileTemplate.remove(fileFullPath); + } +} diff --git a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/domain/SftpSubDirectory.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/sftp/SftpSubDirectory.java similarity index 78% rename from auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/domain/SftpSubDirectory.java rename to spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/sftp/SftpSubDirectory.java index 190dd63f..86bc2ef0 100644 --- a/auth-center/src/main/java/com/jmsoftware/maf/authcenter/universal/domain/SftpSubDirectory.java +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/sftp/SftpSubDirectory.java @@ -1,4 +1,4 @@ -package com.jmsoftware.maf.authcenter.universal.domain; +package com.jmsoftware.maf.springcloudstarter.sftp; import lombok.Getter; @@ -6,7 +6,9 @@ *

SftpSubDirectory

*

Reminder: if you want to add more custom sub directories in the future, please add en enum item in this class

* - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com + * TODO: think of another better way to configure the directory + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com * @date 2019-07-04 23:10 **/ @Getter diff --git a/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/configuration/SftpSubDirectoryRunner.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/sftp/SftpSubDirectoryRunner.java similarity index 77% rename from api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/configuration/SftpSubDirectoryRunner.java rename to spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/sftp/SftpSubDirectoryRunner.java index 91bd197e..6792b143 100644 --- a/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/configuration/SftpSubDirectoryRunner.java +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/sftp/SftpSubDirectoryRunner.java @@ -1,6 +1,5 @@ -package com.jmsoftware.maf.apiportal.universal.configuration; +package com.jmsoftware.maf.springcloudstarter.sftp; -import com.jmsoftware.maf.apiportal.universal.domain.SftpSubDirectory; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import lombok.val; @@ -11,10 +10,10 @@ /** *

SftpSubDirectoryRunner

- *

After dependency injection finished, we must inti the SFTP server's sub directory for out business. If you want + *

After dependency injection finished, we must inti the SFTP server's sub-directory for out business. If you want * to customize initialization configuration, config SftpSubDirectory.

* - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com * @date 2019-07-05 08:51 * @see SftpSubDirectory **/ @@ -38,19 +37,19 @@ public void run(ApplicationArguments args) { return null; }); - log.info("Staring to initial SFTP server sub directory."); + log.info("Staring to initial SFTP server sub-directory."); sftpRemoteFileTemplate.execute(session -> { for (val sftpSubDirectory : SftpSubDirectory.values()) { val fullPath = sftpClientConfiguration.getDirectory() + sftpSubDirectory.getSubDirectory(); if (!session.exists(fullPath)) { - log.info("SFTP server sub directory does not exist. Creating sub directory: {}", fullPath); + log.info("SFTP server sub-directory does not exist. Creating sub-directory: {}", fullPath); session.mkdir(fullPath); } else { - log.info("SFTP server sub directory exists. Path: {}", fullPath); + log.info("SFTP server sub-directory exists. Path: {}", fullPath); } } return null; }); - log.info("Initialing SFTP server sub directory is done."); + log.warn("Initialing SFTP server sub-directory is done."); } } diff --git a/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/domain/SftpUploadFile.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/sftp/SftpUploadFile.java similarity index 83% rename from api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/domain/SftpUploadFile.java rename to spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/sftp/SftpUploadFile.java index bb2e1d4d..22e92125 100644 --- a/api-portal/src/main/java/com/jmsoftware/maf/apiportal/universal/domain/SftpUploadFile.java +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/sftp/SftpUploadFile.java @@ -1,10 +1,10 @@ -package com.jmsoftware.maf.apiportal.universal.domain; +package com.jmsoftware.maf.springcloudstarter.sftp; import lombok.Builder; import lombok.Data; import org.springframework.integration.file.support.FileExistsMode; -import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; import java.io.File; @@ -12,7 +12,7 @@ *

SftpUploadFile

*

Change description here

* - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com * @date 2019-07-06 11:22 **/ @Data @@ -27,7 +27,7 @@ public class SftpUploadFile { * SFTP server's sub directory (if sub directory does'nt exist, will be auto created). Not empty and it looks * like this: "/some/sub/directory/" */ - @NotEmpty + @NotBlank private String subDirectory; /** * This enumeration indicates what action shall be taken in case the destination file already exists. In default, diff --git a/muscle-and-fitness-server-spring-boot-starter/src/main/java/com/jmsoftware/maf/muscleandfitnessserverspringbootstarter/util/CaseConversionUtil.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/util/CaseConversionUtil.java similarity index 98% rename from muscle-and-fitness-server-spring-boot-starter/src/main/java/com/jmsoftware/maf/muscleandfitnessserverspringbootstarter/util/CaseConversionUtil.java rename to spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/util/CaseConversionUtil.java index 0fa0afc2..17f5ec1c 100644 --- a/muscle-and-fitness-server-spring-boot-starter/src/main/java/com/jmsoftware/maf/muscleandfitnessserverspringbootstarter/util/CaseConversionUtil.java +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/util/CaseConversionUtil.java @@ -1,4 +1,4 @@ -package com.jmsoftware.maf.muscleandfitnessserverspringbootstarter.util; +package com.jmsoftware.maf.springcloudstarter.util; import java.util.Random; import java.util.regex.Pattern; @@ -10,7 +10,7 @@ * "https://en.toolpage.org/cat/text-conversion">https://en.toolpage.org/cat/text-conversion * * @author Yves Sorge - * @author Johnny Miller (鍾俊), e-mail: johnnysviva@outlook.com + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com * @date 2/27/20 9:45 AM * @see * Source diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/util/FileUtil.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/util/FileUtil.java new file mode 100644 index 00000000..49b5bcc7 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/util/FileUtil.java @@ -0,0 +1,84 @@ +package com.jmsoftware.maf.springcloudstarter.util; + +import cn.hutool.core.util.StrUtil; +import lombok.NonNull; +import lombok.extern.slf4j.Slf4j; +import lombok.val; +import org.apache.commons.io.FileUtils; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.time.LocalDate; +import java.util.Objects; +import java.util.UUID; + +/** + *

FileUtil

+ *

Change description here

+ * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com + * @date 2 /27/20 9:45 AM + */ +@Slf4j +@SuppressWarnings("unused") +public class FileUtil { + /** + * Convert multipart file to file + * + * @param multipartFile multipart file + * @return file file + * @throws IOException IO exception + */ + public static File convertFrom(@NonNull final MultipartFile multipartFile) throws IOException { + log.info("Converting MultipartFile, original multipart file name: {}", multipartFile.getOriginalFilename()); + val newFile = new File(Objects.requireNonNull(multipartFile.getOriginalFilename())); + multipartFile.transferTo(newFile); + log.info("Converted MultipartFile to newFile: {}", newFile); + return newFile; + } + + /** + * Convert input stream to file + * + * @param inputStream input stream + * @param savePath path for saving file + * @return file file + * @throws IOException the io exception + */ + public static File convertFrom(final InputStream inputStream, final String savePath) throws IOException { + log.info("Converting InputStream to file, save path: {}", savePath); + val newFile = new File(savePath); + FileUtils.copyInputStreamToFile(inputStream, newFile); + log.info("Converted MultipartFile to newFile: {}", newFile); + return newFile; + } + + /** + * Generate date-format storage path (relative path, w/o SFTP server directory) + * + * @param sftpSubDirectory SFTP server's sub directory + * @return full storage path (absolute path). Null if file name is empty. + */ + public static String generateDateFormatStoragePath(@NonNull final String sftpSubDirectory) { + val localDate = LocalDate.now(); + return String.format("%s%d/%d/%d/", sftpSubDirectory, localDate.getYear(), localDate.getMonth().getValue(), + localDate.getDayOfMonth()); + } + + /** + * Generate unique file name for file + * + * @param file file + * @return unique file name (UUID.fileExtension) + */ + public static String generateUniqueFileName(final File file) { + var fileName = file.getName(); + if (StrUtil.isBlank(fileName)) { + return null; + } + var fileExtension = fileName.substring(fileName.lastIndexOf(".")); + return UUID.randomUUID() + "." + fileExtension; + } +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/util/PoiUtil.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/util/PoiUtil.java new file mode 100644 index 00000000..6785e694 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/util/PoiUtil.java @@ -0,0 +1,211 @@ +package com.jmsoftware.maf.springcloudstarter.util; + +import lombok.val; +import org.apache.poi.hssf.usermodel.*; +import org.apache.poi.ss.usermodel.*; +import org.apache.poi.ss.util.CellRangeAddress; + +/** + *

PoiUtil

+ *

+ * Change description here. + * + * @author @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 2/18/2021 5:37 PM + */ +@SuppressWarnings({"AlibabaRemoveCommentedCode", "unused"}) +public class PoiUtil { + /** + * Copy cell style. + * + * @param sourceCellStyle the source cell style + * @param targetCellStyle the target cell style + */ + public static void copyCellStyle(HSSFCellStyle sourceCellStyle, HSSFCellStyle targetCellStyle) { + targetCellStyle.setAlignment(sourceCellStyle.getAlignment()); + // Boarder style + targetCellStyle.setBorderBottom(sourceCellStyle.getBorderBottom()); + targetCellStyle.setBorderLeft(sourceCellStyle.getBorderLeft()); + targetCellStyle.setBorderRight(sourceCellStyle.getBorderRight()); + targetCellStyle.setBorderTop(sourceCellStyle.getBorderTop()); + targetCellStyle.setTopBorderColor(sourceCellStyle.getTopBorderColor()); + targetCellStyle.setBottomBorderColor(sourceCellStyle.getBottomBorderColor()); + targetCellStyle.setRightBorderColor(sourceCellStyle.getRightBorderColor()); + targetCellStyle.setLeftBorderColor(sourceCellStyle.getLeftBorderColor()); + // Background and foreground + targetCellStyle.setFillBackgroundColor(sourceCellStyle.getFillBackgroundColor()); + targetCellStyle.setFillForegroundColor(sourceCellStyle.getFillForegroundColor()); + // Data format + targetCellStyle.setDataFormat(sourceCellStyle.getDataFormat()); + targetCellStyle.setFillPattern(sourceCellStyle.getFillPattern()); + // toStyle.setFont(fromStyle.getFont(null)); + targetCellStyle.setHidden(sourceCellStyle.getHidden()); + targetCellStyle.setIndention(sourceCellStyle.getIndention()); + targetCellStyle.setLocked(sourceCellStyle.getLocked()); + targetCellStyle.setRotation(sourceCellStyle.getRotation()); + targetCellStyle.setVerticalAlignment(sourceCellStyle.getVerticalAlignment()); + targetCellStyle.setWrapText(sourceCellStyle.getWrapText()); + } + + /** + * Copy sheet. + * + * @param workbook the workbook + * @param sourceSheet the source sheet + * @param targetSheet the target sheet + * @param copyValue the copy value + */ + public static void copySheet(HSSFWorkbook workbook, HSSFSheet sourceSheet, HSSFSheet targetSheet, + boolean copyValue) { + mergerRegion(sourceSheet, targetSheet); + sourceSheet.rowIterator().forEachRemaining(oldRow -> { + val newRow = targetSheet.createRow(oldRow.getRowNum()); + copyRow(workbook, (HSSFRow) oldRow, newRow, copyValue); + }); + } + + /** + * Copy row. + * + * @param workbook the workbook + * @param sourceRow the source row + * @param targetRow the target row + * @param copyValue the copy value + */ + public static void copyRow(HSSFWorkbook workbook, HSSFRow sourceRow, HSSFRow targetRow, boolean copyValue) { + sourceRow.cellIterator().forEachRemaining(oldCell -> { + val newCell = targetRow.createCell(oldCell.getColumnIndex()); + copyCell(workbook, oldCell, newCell, copyValue); + }); + } + + /** + * Merger region. + * + * @param sourceSheet the source sheet + * @param targetSheet the target sheet + */ + public static void mergerRegion(HSSFSheet sourceSheet, HSSFSheet targetSheet) { + val sheetMergerCount = sourceSheet.getNumMergedRegions(); + for (var i = 0; i < sheetMergerCount; i++) { + val mergedRegionAt = sourceSheet.getMergedRegion(i); + targetSheet.addMergedRegion(mergedRegionAt); + } + } + + /** + * Copy cell. + * + * @param workbook the workbook + * @param sourceCell the source cell + * @param targetCell the target cell + * @param copyValue the copy value + */ + public static void copyCell(HSSFWorkbook workbook, HSSFCell sourceCell, HSSFCell targetCell, boolean copyValue) { + val newStyle = workbook.createCellStyle(); + copyCellStyle(sourceCell.getCellStyle(), newStyle); + targetCell.setCellStyle(newStyle); + if (sourceCell.getCellComment() != null) { + targetCell.setCellComment(sourceCell.getCellComment()); + } + val srcCellType = sourceCell.getCellType(); + targetCell.setCellType(srcCellType); + if (copyValue) { + switch (srcCellType) { + case NUMERIC: + if (DateUtil.isCellDateFormatted(sourceCell)) { + targetCell.setCellValue(sourceCell.getDateCellValue()); + } else { + targetCell.setCellValue(sourceCell.getNumericCellValue()); + } + break; + case STRING: + targetCell.setCellValue(sourceCell.getRichStringCellValue()); + break; + case BLANK: + break; + case BOOLEAN: + targetCell.setCellValue(sourceCell.getBooleanCellValue()); + break; + case ERROR: + targetCell.setCellErrorValue(FormulaError.forInt(sourceCell.getErrorCellValue())); + break; + case FORMULA: + targetCell.setCellFormula(sourceCell.getCellFormula()); + break; + default: + } + } + } + + /** + * Copy row. + * + * @param copyValue the copy value + * @param workbook the workbook + * @param sourceRow the source row + * @param targetRow the target row + */ + public static void copyRow(boolean copyValue, Workbook workbook, Row sourceRow, Row targetRow) { + targetRow.setHeight(sourceRow.getHeight()); + + sourceRow.cellIterator().forEachRemaining(oldCell -> { + Cell newCell = targetRow.createCell(oldCell.getColumnIndex()); + copyCell(workbook, oldCell, newCell, copyValue); + }); + + val worksheet = sourceRow.getSheet(); + + for (var i = 0; i < worksheet.getNumMergedRegions(); i++) { + val cellRangeAddress = worksheet.getMergedRegion(i); + if (cellRangeAddress.getFirstRow() == sourceRow.getRowNum()) { + val newCellRangeAddress = + new CellRangeAddress(targetRow.getRowNum(), + (targetRow.getRowNum() + (cellRangeAddress.getLastRow() - cellRangeAddress.getFirstRow())), + cellRangeAddress.getFirstColumn(), + cellRangeAddress.getLastColumn()); + worksheet.addMergedRegion(newCellRangeAddress); + } + } + } + + /** + * Copy cell. + * + * @param workbook the workbook + * @param sourceCell the source cell + * @param targetCell the target cell + * @param copyValue the copy value + */ + public static void copyCell(Workbook workbook, Cell sourceCell, Cell targetCell, boolean copyValue) { + if (sourceCell.getCellComment() != null) { + targetCell.setCellComment(sourceCell.getCellComment()); + } + val srcCellType = sourceCell.getCellType(); + if (copyValue) { + switch (srcCellType) { + case NUMERIC: + if (DateUtil.isCellDateFormatted(sourceCell)) { + targetCell.setCellValue(sourceCell.getDateCellValue()); + } else { + targetCell.setCellValue(sourceCell.getNumericCellValue()); + } + break; + case STRING: + targetCell.setCellValue(sourceCell.getRichStringCellValue()); + break; + case BLANK: + break; + case BOOLEAN: + targetCell.setCellValue(sourceCell.getBooleanCellValue()); + break; + case ERROR: + targetCell.setCellErrorValue(sourceCell.getErrorCellValue()); + break; + case FORMULA: + targetCell.setCellFormula(sourceCell.getCellFormula()); + break; + default: + } + } + } +} diff --git a/muscle-and-fitness-server-spring-boot-starter/src/main/java/com/jmsoftware/maf/muscleandfitnessserverspringbootstarter/util/RequestUtil.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/util/RequestUtil.java similarity index 89% rename from muscle-and-fitness-server-spring-boot-starter/src/main/java/com/jmsoftware/maf/muscleandfitnessserverspringbootstarter/util/RequestUtil.java rename to spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/util/RequestUtil.java index 73539d01..c338bbc6 100644 --- a/muscle-and-fitness-server-spring-boot-starter/src/main/java/com/jmsoftware/maf/muscleandfitnessserverspringbootstarter/util/RequestUtil.java +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/util/RequestUtil.java @@ -1,4 +1,4 @@ -package com.jmsoftware.maf.muscleandfitnessserverspringbootstarter.util; +package com.jmsoftware.maf.springcloudstarter.util; import cn.hutool.core.util.StrUtil; @@ -10,7 +10,7 @@ *

* Request util. * - * @author Johnny Miller (鍾俊), e-mail: johnnysviva@outlook.com + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com * @date 2/27/20 9:45 AM **/ public class RequestUtil { diff --git a/muscle-and-fitness-server-spring-boot-starter/src/main/java/com/jmsoftware/maf/muscleandfitnessserverspringbootstarter/util/ResponseUtil.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/util/ResponseUtil.java similarity index 77% rename from muscle-and-fitness-server-spring-boot-starter/src/main/java/com/jmsoftware/maf/muscleandfitnessserverspringbootstarter/util/ResponseUtil.java rename to spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/util/ResponseUtil.java index 99709cf1..5a676d11 100644 --- a/muscle-and-fitness-server-spring-boot-starter/src/main/java/com/jmsoftware/maf/muscleandfitnessserverspringbootstarter/util/ResponseUtil.java +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/util/ResponseUtil.java @@ -1,22 +1,23 @@ -package com.jmsoftware.maf.muscleandfitnessserverspringbootstarter.util; +package com.jmsoftware.maf.springcloudstarter.util; import com.fasterxml.jackson.databind.ObjectMapper; import com.jmsoftware.maf.common.bean.ResponseBodyBean; -import com.jmsoftware.maf.common.constant.HttpStatus; import com.jmsoftware.maf.common.exception.BaseException; import lombok.extern.slf4j.Slf4j; import lombok.val; +import org.springframework.http.HttpStatus; import javax.servlet.http.HttpServletResponse; import java.io.IOException; +import static org.springframework.web.cors.CorsConfiguration.ALL; + /** *

ResponseUtil

*

* Response util * - * @author Johnny Miller (鍾俊), e-mail: johnnysviva@outlook.com - * @date 2/27/20 9:45 AM + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 2/27/20 9:45 AM **/ @Slf4j @SuppressWarnings("unused") @@ -32,8 +33,8 @@ public class ResponseUtil { */ public static void renderJson(final HttpServletResponse response, final HttpStatus httpStatus, final Object data) { standardizeHttpServletResponse(response, httpStatus); - val responseBodyBean = ResponseBodyBean.ofStatus(httpStatus.getCode(), - httpStatus.getMessage(), data); + val responseBodyBean = ResponseBodyBean.ofStatus(httpStatus.value(), + httpStatus.getReasonPhrase(), data); try { response.getWriter().write(MAPPER.writeValueAsString(responseBodyBean)); } catch (IOException e) { @@ -51,7 +52,7 @@ public static void renderJson(final HttpServletResponse response, final HttpStat public static void renderJson(final HttpServletResponse response, final HttpStatus httpStatus, final String message) { standardizeHttpServletResponse(response, httpStatus); - val responseBodyBean = ResponseBodyBean.ofStatus(httpStatus.getCode(), message, null); + val responseBodyBean = ResponseBodyBean.ofStatus(httpStatus.value(), message, null); try { response.getWriter().write(MAPPER.writeValueAsString(responseBodyBean)); } catch (IOException e) { @@ -66,11 +67,11 @@ public static void renderJson(final HttpServletResponse response, final HttpStat * @param exception Exception */ public static void renderJson(final HttpServletResponse response, final BaseException exception) { - val httpStatus = HttpStatus.fromCode(exception.getCode()); + val httpStatus = HttpStatus.valueOf(exception.getCode()); standardizeHttpServletResponse(response, httpStatus); val responseBodyBean = ResponseBodyBean.ofStatus(exception.getCode(), - exception.getMessage(), - exception.getData()); + exception.getMessage(), + exception.getData()); try { response.getWriter().write(MAPPER.writeValueAsString(responseBodyBean)); } catch (IOException e) { @@ -86,9 +87,9 @@ public static void renderJson(final HttpServletResponse response, final BaseExce */ private static void standardizeHttpServletResponse(final HttpServletResponse response, final HttpStatus httpStatus) { - response.setHeader("Access-Control-Allow-Origin", "*"); - response.setHeader("Access-Control-Allow-Methods", "*"); + response.setHeader("Access-Control-Allow-Origin", ALL); + response.setHeader("Access-Control-Allow-Methods", ALL); response.setContentType("application/json;charset=UTF-8"); - response.setStatus(httpStatus.getCode()); + response.setStatus(httpStatus.value()); } } diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/util/TreeElementType.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/util/TreeElementType.java new file mode 100644 index 00000000..f4ea7d89 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/util/TreeElementType.java @@ -0,0 +1,21 @@ +package com.jmsoftware.maf.springcloudstarter.util; + +/** + * Description: TreeElementType, change description here. + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 5/28/2021 4:29 PM + **/ +public enum TreeElementType { + /** + * Identical field + */ + ID, + /** + * Parent identical field + */ + PARENT_ID, + /** + * Children list + */ + CHILDREN_LIST, +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/util/TreeUtil.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/util/TreeUtil.java new file mode 100644 index 00000000..c48018b1 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/util/TreeUtil.java @@ -0,0 +1,133 @@ +package com.jmsoftware.maf.springcloudstarter.util; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import com.google.common.collect.Maps; +import com.jmsoftware.maf.springcloudstarter.annotation.TreeElement; + +import java.beans.BeanInfo; +import java.beans.IntrospectionException; +import java.beans.Introspector; +import java.beans.PropertyDescriptor; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Objects; + +/** + * Description: TreeUtil + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 5/28/2021 4:27 PM + */ +@SuppressWarnings("unused") +public class TreeUtil { + /** + * Convert List to Tree + * + * @param the type parameter + * @param list t + * @param rootNode the root node + * @return result list + * @throws IllegalAccessException result + * @throws IntrospectionException the introspection exception + * @throws InvocationTargetException the invocation target exception + */ + public static List listToTree(List list, String rootNode) throws IllegalAccessException, + IntrospectionException, InvocationTargetException { + // Root node collection + List rootList = new ArrayList<>(); + HashMap> parentIdToTree = Maps.newHashMap(); + for (final T t : list) { + Object value = getValue(t, TreeElementType.PARENT_ID); + if (ObjectUtil.isNotNull(value)) { + if (ObjectUtil.isNotNull(parentIdToTree.get(value))) { + parentIdToTree.get(value).add(t); + } else { + parentIdToTree.put(value, CollUtil.newArrayList(t)); + } + if (rootNode.equals(value)) { + rootList.add(t); + } + } + } + buildChildTree(rootList, parentIdToTree); + return rootList; + } + + /** + * Gets value. + * + * @param the type parameter + * @param t the t + * @param treeElementType the tree element type + * @return the value + * @throws IllegalAccessException the illegal access exception + * @throws IntrospectionException the introspection exception + * @throws InvocationTargetException the invocation target exception + */ + private static Object getValue(T t, TreeElementType treeElementType) throws IllegalAccessException, + IntrospectionException, + InvocationTargetException { + final BeanInfo beanInfo = Introspector.getBeanInfo(t.getClass()); + final PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors(); + for (PropertyDescriptor propertyDescriptor : propertyDescriptors) { + String propertyName = propertyDescriptor.getName(); + final Field treeElementField = getTreeElementField(t, propertyName, treeElementType); + if (treeElementField != null) { + Method readMethod = propertyDescriptor.getReadMethod(); + return readMethod.invoke(t); + } + } + return null; + } + + + /** + * Gets tree element field. + * + * @param the type parameter + * @param t the t + * @param fieldName the field name + * @param treeElementType the tree element type + * @return the tree element field + */ + private static Field getTreeElementField(T t, String fieldName, TreeElementType treeElementType) { + Field[] fields = t.getClass().getDeclaredFields(); + for (Field field : fields) { + TreeElement treeElement = field.getAnnotation(TreeElement.class); + if (ObjectUtil.isNull(treeElement)) { + continue; + } + if (fieldName.equals(field.getName()) && treeElementType.equals(treeElement.type())) { + return field; + } + } + return null; + } + + + /** + * Build child tree. + * + * @param the type parameter + * @param currentTree the current tree + * @param parentIdToTree the parent id to tree + * @throws IllegalAccessException the illegal access exception + * @throws IntrospectionException the introspection exception + * @throws InvocationTargetException the invocation target exception + */ + private static void buildChildTree(List currentTree, HashMap> parentIdToTree) throws IllegalAccessException, IntrospectionException, InvocationTargetException { + for (T t : currentTree) { + Object currentId = getValue(t, TreeElementType.ID); + // Data exists with current ID as PARENT_ID + if (parentIdToTree.get(currentId) != null) { + @SuppressWarnings("unchecked") List list = (List) getValue(t, TreeElementType.CHILDREN_LIST); + Objects.requireNonNull(list).addAll(parentIdToTree.get(currentId)); + buildChildTree(parentIdToTree.get(currentId), parentIdToTree); + } + } + } +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/util/UsernameUtil.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/util/UsernameUtil.java new file mode 100644 index 00000000..d1ea1780 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/util/UsernameUtil.java @@ -0,0 +1,18 @@ +package com.jmsoftware.maf.springcloudstarter.util; + +import com.jmsoftware.maf.common.constant.MafHttpHeader; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +/** + * Description: UsernameUtil, change description here. + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 6/28/2021 1:40 PM + **/ +public class UsernameUtil { + public static String getCurrentUsername() { + final ServletRequestAttributes servletRequestAttributes = + (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes(); + return servletRequestAttributes.getRequest().getHeader(MafHttpHeader.X_USERNAME.getHeader()); + } +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/validation/annotation/DateTimeRangeConstraints.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/validation/annotation/DateTimeRangeConstraints.java new file mode 100644 index 00000000..06e1b48d --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/validation/annotation/DateTimeRangeConstraints.java @@ -0,0 +1,24 @@ +package com.jmsoftware.maf.springcloudstarter.validation.annotation; + +import com.jmsoftware.maf.springcloudstarter.validation.validator.DateTimeRangeValidator; + +import javax.validation.Constraint; +import javax.validation.Payload; +import java.lang.annotation.*; + +/** + * Description: DateTimeRangeConstraints, change description here. + * + * @author 钟俊(zhongjun), email: zhongjun@toguide.cn, date: 6/3/2021 2:08 PM + **/ +@Documented +@Constraint(validatedBy = DateTimeRangeValidator.class) +@Target({ElementType.TYPE}) +@Retention(RetentionPolicy.RUNTIME) +public @interface DateTimeRangeConstraints { + String message() default "Invalid date time range"; + + Class[] groups() default {}; + + Class[] payload() default {}; +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/validation/annotation/DateTimeRangeGroup.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/validation/annotation/DateTimeRangeGroup.java new file mode 100644 index 00000000..1e408fc3 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/validation/annotation/DateTimeRangeGroup.java @@ -0,0 +1,19 @@ +package com.jmsoftware.maf.springcloudstarter.validation.annotation; + +import java.lang.annotation.*; + +/** + * Description: DateTimeRangeGroup, change description here. + *

+ * TODO: to support nullable value + * + * @author 钟俊(zhongjun), email: zhongjun@toguide.cn, date: 6/3/2021 2:58 PM + **/ +@Documented +@Target({ElementType.FIELD}) +@Retention(RetentionPolicy.RUNTIME) +public @interface DateTimeRangeGroup { + String groupName() default "defaultDateTimeRangeGroup"; + + DateTimeRangeType type() default DateTimeRangeType.START_TIME; +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/validation/annotation/DateTimeRangeType.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/validation/annotation/DateTimeRangeType.java new file mode 100644 index 00000000..2cc7d4ab --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/validation/annotation/DateTimeRangeType.java @@ -0,0 +1,17 @@ +package com.jmsoftware.maf.springcloudstarter.validation.annotation; + +/** + * Description: DateTimeRangeType, change description here. + * + * @author 钟俊 (zhongjun), email: zhongjun@toguide.cn, date: 6/3/2021 3:07 PM + */ +public enum DateTimeRangeType { + /** + * Start time + */ + START_TIME, + /** + * End time + */ + END_TIME, +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/validation/annotation/ValidEnumValue.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/validation/annotation/ValidEnumValue.java new file mode 100644 index 00000000..8a7a92fe --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/validation/annotation/ValidEnumValue.java @@ -0,0 +1,37 @@ +package com.jmsoftware.maf.springcloudstarter.validation.annotation; + +import com.jmsoftware.maf.springcloudstarter.validation.validator.EnumValueValidator; + +import javax.validation.Constraint; +import javax.validation.Payload; +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +import static java.lang.annotation.ElementType.FIELD; +import static java.lang.annotation.ElementType.PARAMETER; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +/** + *

ValidEnumValue

+ *

+ * Change description here. + * + * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com + * @date 5/29/21 12:31 PM + **/ +@Documented +@Retention(RUNTIME) +@Target({FIELD, PARAMETER}) +@Constraint(validatedBy = EnumValueValidator.class) +public @interface ValidEnumValue { + String message() default "Invalid enumeration value"; + + Class[] groups() default {}; + + Class[] payload() default {}; + + Class targetEnum() default Class.class; + + boolean ignoreNull() default false; +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/validation/validator/DateTimeRangeValidator.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/validation/validator/DateTimeRangeValidator.java new file mode 100644 index 00000000..cb964004 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/validation/validator/DateTimeRangeValidator.java @@ -0,0 +1,103 @@ +package com.jmsoftware.maf.springcloudstarter.validation.validator; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.ReflectUtil; +import com.jmsoftware.maf.springcloudstarter.validation.annotation.DateTimeRangeConstraints; +import com.jmsoftware.maf.springcloudstarter.validation.annotation.DateTimeRangeGroup; +import lombok.extern.slf4j.Slf4j; +import lombok.val; + +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; +import java.lang.reflect.Field; +import java.time.LocalDateTime; +import java.util.Date; +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedList; + +/** + * Description: DateTimeRangeValidator, change description here. + * + * @author 钟俊(zhongjun), email: zhongjun@toguide.cn, date: 6/3/2021 2:10 PM + **/ +@Slf4j +public class DateTimeRangeValidator implements ConstraintValidator { + public static final int MAX_GROUP_SIZE = 2; + private static final int DEFAULT_HASH_MAP_CAPACITY = 8; + + @Override + public boolean isValid(Object value, ConstraintValidatorContext context) { + final HashSet annotatedFieldSet = this.getAnnotatedFieldSet(value); + if (CollUtil.isEmpty(annotatedFieldSet)) { + log.warn("There is not fields annotated by {} in the class({})", value.getClass().getName(), + DateTimeRangeGroup.class.getSimpleName()); + return true; + } + val dateTimeRangeGroupMap = new HashMap>(DEFAULT_HASH_MAP_CAPACITY); + for (val field : annotatedFieldSet) { + val annotation = field.getAnnotation(DateTimeRangeGroup.class); + if (!dateTimeRangeGroupMap.containsKey(annotation.groupName())) { + dateTimeRangeGroupMap.put(annotation.groupName(), CollUtil.newLinkedList(field)); + } else { + dateTimeRangeGroupMap.get(annotation.groupName()).add(field); + if (dateTimeRangeGroupMap.get(annotation.groupName()).size() > MAX_GROUP_SIZE) { + log.error("The length of DateTimeRangeGroup({}) cannot exceed {}!", annotation.groupName(), + MAX_GROUP_SIZE); + return false; + } + } + } + return this.validate(value, dateTimeRangeGroupMap); + } + + private HashSet getAnnotatedFieldSet(Object value) { + val fields = value.getClass().getDeclaredFields(); + final HashSet annotatedFieldSet = CollUtil.newHashSet(); + for (val field : fields) { + val annotation = field.getAnnotation(DateTimeRangeGroup.class); + if (ObjectUtil.isNotNull(annotation)) { + annotatedFieldSet.add(field); + } + } + return annotatedFieldSet; + } + + private boolean validate(Object value, HashMap> dateTimeRangeGroupMap) { + for (val entry : dateTimeRangeGroupMap.entrySet()) { + val groupName = entry.getKey(); + val fieldList = entry.getValue(); + if (fieldList.size() != MAX_GROUP_SIZE) { + log.error("The length of DateTimeRangeGroup({}) is not correct!", groupName); + return false; + } + val dateTimeRangeGroup = fieldList.get(0).getAnnotation(DateTimeRangeGroup.class); + Object startTime = null; + Object endTime = null; + switch (dateTimeRangeGroup.type()) { + case START_TIME: + startTime = ReflectUtil.getFieldValue(value, fieldList.get(0)); + endTime = ReflectUtil.getFieldValue(value, fieldList.get(1)); + break; + case END_TIME: + startTime = ReflectUtil.getFieldValue(value, fieldList.get(1)); + endTime = ReflectUtil.getFieldValue(value, fieldList.get(0)); + break; + default: + } + if (ObjectUtil.hasNull(startTime, endTime)) { + return true; + } + if (startTime instanceof Date && endTime instanceof Date + && ((Date) startTime).after((Date) endTime)) { + return false; + } + if (startTime instanceof LocalDateTime && endTime instanceof LocalDateTime + && ((LocalDateTime) startTime).isAfter((LocalDateTime) endTime)) { + return false; + } + } + return true; + } +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/validation/validator/EnumValueValidator.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/validation/validator/EnumValueValidator.java new file mode 100644 index 00000000..9f573830 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/validation/validator/EnumValueValidator.java @@ -0,0 +1,81 @@ +package com.jmsoftware.maf.springcloudstarter.validation.validator; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.ReflectUtil; +import com.jmsoftware.maf.common.bean.EnumerationBase; +import com.jmsoftware.maf.springcloudstarter.validation.annotation.ValidEnumValue; +import lombok.extern.slf4j.Slf4j; +import lombok.val; + +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.Objects; + +/** + *

EnumValueValidator

+ *

+ * Change description here. + * + * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com + * @date 5/29/21 12:34 PM + **/ +@Slf4j +public class EnumValueValidator implements ConstraintValidator { + private String methodName; + private ValidEnumValue validEnumValue; + + /** + * {@inheritDoc} + */ + @Override + public void initialize(ValidEnumValue constraintAnnotation) { + ConstraintValidator.super.initialize(constraintAnnotation); + this.validEnumValue = constraintAnnotation; + final Method getValue = ReflectUtil.getMethodByName(EnumerationBase.class, "getValue"); + this.methodName = getValue.getName(); + } + + /** + * {@inheritDoc} + */ + @Override + public boolean isValid(Number value, ConstraintValidatorContext context) { + val enumClass = this.validEnumValue.targetEnum(); + val ignoreNull = this.validEnumValue.ignoreNull(); + if (!enumClass.isEnum()) { + log.warn("The given target enum class is not enum! {}", enumClass.getName()); + return false; + } + if (ignoreNull && ObjectUtil.isNull(value)) { + return true; + } + val enumConstantArray = enumClass.getEnumConstants(); + Method method; + try { + method = enumClass.getMethod(this.methodName); + } catch (NoSuchMethodException | SecurityException e) { + log.warn("Did not find the method {} in the class {}", this.methodName, enumClass.getName()); + return false; + } + var validResult = false; + try { + for (var obj : enumConstantArray) { + Object valueDeclaredInEnum = method.invoke(obj); + if (!(valueDeclaredInEnum instanceof Number)) { + log.error("The value declared in enum is not an instance of Number!"); + throw new IllegalArgumentException("The value declared in enum is not an instance of Number!"); + } + if (Objects.deepEquals(value, valueDeclaredInEnum)) { + validResult = true; + break; + } + } + } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { + log.error("Exception occurred when invoking method! Exception message: {}", e.getMessage()); + return false; + } + return validResult; + } +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/websocket/ChatRoomController.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/websocket/ChatRoomController.java new file mode 100644 index 00000000..449e82eb --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/websocket/ChatRoomController.java @@ -0,0 +1,30 @@ +package com.jmsoftware.maf.springcloudstarter.websocket; + +import com.jmsoftware.maf.common.websocket.WebSocketMessagePayload; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.springframework.messaging.handler.annotation.Headers; +import org.springframework.messaging.handler.annotation.MessageMapping; +import org.springframework.messaging.handler.annotation.Payload; +import org.springframework.stereotype.Controller; + +import java.util.Map; + +/** + * Description: ChatRoomController, change description here. + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 7/15/2021 5:24 PM + **/ +@Slf4j +@Controller +@RequiredArgsConstructor +public class ChatRoomController { + private final ChatRoomService chatRoomService; + + @SneakyThrows + @MessageMapping("/send-message") + public void sendMessage(@Payload WebSocketMessagePayload payload, @Headers Map headers) { + this.chatRoomService.sendMessage(payload, headers); + } +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/websocket/ChatRoomService.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/websocket/ChatRoomService.java new file mode 100644 index 00000000..30aec294 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/websocket/ChatRoomService.java @@ -0,0 +1,22 @@ +package com.jmsoftware.maf.springcloudstarter.websocket; + +import com.jmsoftware.maf.common.websocket.WebSocketMessagePayload; +import org.springframework.validation.annotation.Validated; + +import java.util.Map; + +/** + * Description: ChatRoomService, change description here. + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 7/16/2021 8:14 AM + **/ +@Validated +public interface ChatRoomService { + /** + * Send message. + * + * @param payload the payload + * @param headers the headers + */ + void sendMessage(WebSocketMessagePayload payload, Map headers); +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/websocket/ChatRoomServiceImpl.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/websocket/ChatRoomServiceImpl.java new file mode 100644 index 00000000..f7a0517f --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/websocket/ChatRoomServiceImpl.java @@ -0,0 +1,45 @@ +package com.jmsoftware.maf.springcloudstarter.websocket; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.jmsoftware.maf.common.websocket.WebSocketMessagePayload; +import com.jmsoftware.maf.common.websocket.WebSocketMessageResponse; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import lombok.val; +import org.springframework.messaging.simp.SimpMessagingTemplate; +import org.springframework.stereotype.Service; + +import java.util.Map; + +/** + * Description: ChatRoomServiceImpl, change description here. + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 7/16/2021 8:14 AM + **/ +@Slf4j +@Service +@RequiredArgsConstructor +public class ChatRoomServiceImpl implements ChatRoomService { + /** + *

"'/public/broadcast' is not a valid topic destination\n"

+ *

RabbitMQ does not support "/" as a separator.

+ * + * @see + * Stomp client fails to connect to a dynamic controller destination that has a @DestinationVariable when I switch to use a StompBrokerRelay but it works with SimpleBroker + */ + public static final String BROADCAST_CHANNEL = "/topic/public-broadcast"; + private final SimpMessagingTemplate simpMessagingTemplate; + private final ObjectMapper objectMapper; + + @Override + @SneakyThrows + public void sendMessage(WebSocketMessagePayload payload, Map headers) { + val response = new WebSocketMessageResponse(); + response.setSender(payload.getSender()); + response.setReceiver(payload.getReceiver()); + response.setContent(payload.getContent()); + this.simpMessagingTemplate.convertAndSend(BROADCAST_CHANNEL, this.objectMapper.writeValueAsString(response)); + log.info("Got message from client. simpSessionId: {}, payload: {}", headers.get("simpSessionId"), payload); + } +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/websocket/WebSocketConfiguration.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/websocket/WebSocketConfiguration.java new file mode 100644 index 00000000..000b3136 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/websocket/WebSocketConfiguration.java @@ -0,0 +1,82 @@ +package com.jmsoftware.maf.springcloudstarter.websocket; + +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.boot.autoconfigure.amqp.RabbitProperties; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.context.annotation.Bean; +import org.springframework.messaging.simp.SimpMessagingTemplate; +import org.springframework.messaging.simp.config.MessageBrokerRegistry; +import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker; +import org.springframework.web.socket.config.annotation.StompEndpointRegistry; +import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer; +import org.springframework.web.socket.server.standard.ServerEndpointExporter; + +import static org.springframework.web.cors.CorsConfiguration.ALL; + +/** + * Description: WebSocketConfiguration, change description here. + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 7/15/2021 12:15 AM + * @see + * Using Spring Boot for WebSocket Implementation with STOMP + * @see STOMP Over WebSocket + * @see + * ENABLING USER FEEDBACK WITH WEBSOCKETS ON RABBITMQ AND SPRING CLOUD + **/ +@Slf4j +@RequiredArgsConstructor +@EnableWebSocketMessageBroker +@ConditionalOnClass({ServerEndpointExporter.class, RabbitTemplate.class}) +public class WebSocketConfiguration implements WebSocketMessageBrokerConfigurer { + private final RabbitProperties rabbitProperties; + + @Bean + public ChatRoomController greetingController(ChatRoomService chatRoomService) { + log.warn("Initial bean: '{}'", ChatRoomController.class.getSimpleName()); + return new ChatRoomController(chatRoomService); + } + + @Bean + public ChatRoomService chatRoomService(SimpMessagingTemplate simpMessagingTemplate, + ObjectMapper objectMapper) { + log.warn("Initial bean: '{}'", ChatRoomService.class.getSimpleName()); + return new ChatRoomServiceImpl(simpMessagingTemplate, objectMapper); + } + + @Override + public void registerStompEndpoints(StompEndpointRegistry registry) { + registry.addEndpoint("/web-socket", "/websocket", "/ws") + .setAllowedOriginPatterns(ALL) + .withSockJS(); + } + + /** + * {@inheritDoc} + * + *

There are two destination prefixes defined: topic and queue. They follow the convention that destinations + * for messages to be carried on to all subscribed clients via the pub-sub model should be prefixed with " + * topic". On the other hand, destinations for private messages are typically prefixed by "queue" + * .

+ *
registry.enableSimpleBroker("/topic/", "/queue/");
+     * 
+ *

Defines the prefix app that is used to filter destinations handled by methods annotated with + * @MessageMapping which you will implement in a controller. The controller, after processing the + * message, will send it to the broker.

+ */ + @Override + public void configureMessageBroker(MessageBrokerRegistry registry) { + // Use RabbitMQ as broker instead of in-memory message broker, enabling a full featured broker like RabbitMQ + registry.enableStompBrokerRelay("/topic/", "/queue/") + // We need to specify the host but not the port, cuz we're using the default STOMP relay port, which + // is "61613" + .setRelayHost(this.rabbitProperties.getHost()) + .setClientLogin(this.rabbitProperties.getUsername()) + .setClientPasscode(this.rabbitProperties.getPassword()) + .setSystemLogin(this.rabbitProperties.getUsername()) + .setSystemPasscode(this.rabbitProperties.getPassword()); + registry.setApplicationDestinationPrefixes("/app"); + } +} diff --git a/spring-cloud-starter/src/main/resources/META-INF/spring.factories b/spring-cloud-starter/src/main/resources/META-INF/spring.factories new file mode 100644 index 00000000..5911ff21 --- /dev/null +++ b/spring-cloud-starter/src/main/resources/META-INF/spring.factories @@ -0,0 +1,3 @@ +# Auto Configure +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ + com.jmsoftware.maf.springcloudstarter.MafAutoConfiguration diff --git a/universal-ui/pom.xml b/universal-ui/pom.xml new file mode 100644 index 00000000..acd11658 --- /dev/null +++ b/universal-ui/pom.xml @@ -0,0 +1,25 @@ + + + 4.0.0 + + universal-ui + Muscle and Fitness Server :: Universal UI + Universal UI for Muscle and Fitness Server + + + muscle-and-fitness-server + com.jmsoftware.maf + 0.0.2 + + + + + + ${project.basedir}/src/main/resources + META-INF/resources/ + + + + diff --git a/api-portal/src/main/resources/static/home.html b/universal-ui/src/main/resources/static/home.html similarity index 83% rename from api-portal/src/main/resources/static/home.html rename to universal-ui/src/main/resources/static/home.html index e7599316..3ebba95f 100644 --- a/api-portal/src/main/resources/static/home.html +++ b/universal-ui/src/main/resources/static/home.html @@ -4,8 +4,8 @@ UNSET - - + +
@@ -14,11 +14,11 @@ Welcome to {{ projectArtifactId }}@{{ version }}! - - + + {{ applicationName }} - +
Create New Person diff --git a/api-portal/src/main/resources/static/icon/favicon.ico b/universal-ui/src/main/resources/static/icon/favicon.ico similarity index 100% rename from api-portal/src/main/resources/static/icon/favicon.ico rename to universal-ui/src/main/resources/static/icon/favicon.ico diff --git a/api-portal/src/main/resources/static/image/muscle-and-fitness-server-social-image.png b/universal-ui/src/main/resources/static/image/muscle-and-fitness-server-social-image.png similarity index 100% rename from api-portal/src/main/resources/static/image/muscle-and-fitness-server-social-image.png rename to universal-ui/src/main/resources/static/image/muscle-and-fitness-server-social-image.png diff --git a/api-portal/src/main/resources/static/script/404.js b/universal-ui/src/main/resources/static/script/404.js similarity index 100% rename from api-portal/src/main/resources/static/script/404.js rename to universal-ui/src/main/resources/static/script/404.js diff --git a/gateway/src/main/resources/static/script/home.js b/universal-ui/src/main/resources/static/script/home.js similarity index 98% rename from gateway/src/main/resources/static/script/home.js rename to universal-ui/src/main/resources/static/script/home.js index a191d8c5..efdf57ee 100644 --- a/gateway/src/main/resources/static/script/home.js +++ b/universal-ui/src/main/resources/static/script/home.js @@ -67,6 +67,6 @@ const vm = new Vue({ } }, mounted: async function () { - this.getAppInfo(); + await this.getAppInfo(); } }); diff --git a/api-portal/src/main/resources/static/script/video.js b/universal-ui/src/main/resources/static/script/video.js similarity index 100% rename from api-portal/src/main/resources/static/script/video.js rename to universal-ui/src/main/resources/static/script/video.js diff --git a/universal-ui/src/main/resources/static/script/websocket.js b/universal-ui/src/main/resources/static/script/websocket.js new file mode 100644 index 00000000..bdbea8cd --- /dev/null +++ b/universal-ui/src/main/resources/static/script/websocket.js @@ -0,0 +1,122 @@ +'use strict'; + +const usernamePage = document.querySelector('#username-page'); +const chatPage = document.querySelector('#chat-page'); +const usernameForm = document.querySelector('#usernameForm'); +const messageForm = document.querySelector('#messageForm'); +const messageInput = document.querySelector('#message'); +const messageArea = document.querySelector('#messageArea'); +const connectingElement = document.querySelector('.connecting'); + +let stompClient = null; +let username = null; + +const colors = [ + '#2196F3', '#32c787', '#00BCD4', '#ff5652', + '#ffc107', '#ff85af', '#FF9800', '#39bbb0' +]; + +function connect(event) { + username = document.querySelector('#name').value.trim(); + + if (username) { + usernamePage.classList.add('hidden'); + chatPage.classList.remove('hidden'); + + const splitUrl = window.location.href.split('/'); + const ws = `${splitUrl[0]}//${splitUrl[2]}/${splitUrl[3]}/web-socket`; + const socket = new SockJS(ws); + stompClient = Stomp.over(socket); + + stompClient.connect({}, onConnected, onError); + } + event.preventDefault(); +} + + +function onConnected() { + // Subscribe to the Public Topic + stompClient.subscribe('/topic/public-broadcast', onMessageReceived); + + // Tell your username to the server + // stompClient.send(`/app/join/${username}`, {},) + + connectingElement.classList.add('hidden'); +} + + +function onError(error) { + connectingElement.textContent = 'Could not connect to WebSocket server. Please refresh this page to try again!'; + connectingElement.style.color = 'red'; + console.error('Error occurred!', error); +} + + +function sendMessage(event) { + const messageContent = messageInput.value.trim(); + + if (messageContent && stompClient) { + const chatMessage = { + sender: username, + receiver: null, + content: messageInput.value + }; + + stompClient.send("/app/send-message", {}, JSON.stringify(chatMessage)); + messageInput.value = ''; + } + event.preventDefault(); +} + + +function onMessageReceived(payload) { + const body = JSON.parse(payload.body); + console.info('body', body); + + const messageElement = document.createElement('li'); + + if (body.type === 'JOIN') { + messageElement.classList.add('event-message'); + body.content = body.sender + ' joined!'; + } else if (body.type === 'LEAVE') { + messageElement.classList.add('event-message'); + body.content = body.sender + ' left!'; + } else { + messageElement.classList.add('chat-message'); + + const avatarElement = document.createElement('i'); + const avatarText = document.createTextNode(body.sender[0]); + avatarElement.appendChild(avatarText); + avatarElement.style['background-color'] = getAvatarColor(body.sender); + + messageElement.appendChild(avatarElement); + + const usernameElement = document.createElement('span'); + const usernameText = document.createTextNode(body.sender); + usernameElement.appendChild(usernameText); + messageElement.appendChild(usernameElement); + } + + const textElement = document.createElement('p'); + const messageText = document.createTextNode(body.content); + textElement.appendChild(messageText); + + messageElement.appendChild(textElement); + + messageArea.appendChild(messageElement); + messageArea.scrollTop = messageArea.scrollHeight; +} + + +function getAvatarColor(messageSender) { + let hash = 0; + for (let i = 0; i < messageSender.length; i++) { + hash = 31 * hash + messageSender.charCodeAt(i); + } + + const index = Math.abs(hash % colors.length); + return colors[index]; +} + +usernameForm.addEventListener('submit', connect, true) +messageForm.addEventListener('submit', sendMessage, true) diff --git a/api-portal/src/main/resources/static/styles/404.css b/universal-ui/src/main/resources/static/style/404.css similarity index 100% rename from api-portal/src/main/resources/static/styles/404.css rename to universal-ui/src/main/resources/static/style/404.css diff --git a/api-portal/src/main/resources/static/styles/home.css b/universal-ui/src/main/resources/static/style/home.css similarity index 100% rename from api-portal/src/main/resources/static/styles/home.css rename to universal-ui/src/main/resources/static/style/home.css diff --git a/api-portal/src/main/resources/static/styles/video.css b/universal-ui/src/main/resources/static/style/video.css similarity index 100% rename from api-portal/src/main/resources/static/styles/video.css rename to universal-ui/src/main/resources/static/style/video.css diff --git a/universal-ui/src/main/resources/static/style/websocket.css b/universal-ui/src/main/resources/static/style/websocket.css new file mode 100644 index 00000000..384b3cd8 --- /dev/null +++ b/universal-ui/src/main/resources/static/style/websocket.css @@ -0,0 +1,298 @@ +* { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +html,body { + height: 100%; + overflow: hidden; +} + +body { + margin: 0; + padding: 0; + font-weight: 400; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 1rem; + line-height: 1.58; + color: #333; + background-color: #f4f4f4; + height: 100%; +} + +body:before { + height: 50%; + width: 100%; + position: absolute; + top: 0; + left: 0; + background: #128ff2; + content: ""; + z-index: 0; +} + +.clearfix:after { + display: block; + content: ""; + clear: both; +} + +.hidden { + display: none; +} + +.form-control { + width: 100%; + min-height: 38px; + font-size: 15px; + border: 1px solid #c8c8c8; +} + +.form-group { + margin-bottom: 15px; +} + +input { + padding-left: 10px; + outline: none; +} + +h1, h2, h3, h4, h5, h6 { + margin-top: 20px; + margin-bottom: 20px; +} + +h1 { + font-size: 1.7em; +} + +a { + color: #128ff2; +} + +button { + box-shadow: none; + border: 1px solid transparent; + font-size: 14px; + outline: none; + line-height: 100%; + white-space: nowrap; + vertical-align: middle; + padding: 0.6rem 1rem; + border-radius: 2px; + transition: all 0.2s ease-in-out; + cursor: pointer; + min-height: 38px; +} + +button.default { + background-color: #e8e8e8; + color: #333; + box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.12); +} + +button.primary { + background-color: #128ff2; + box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.12); + color: #fff; +} + +button.accent { + background-color: #ff4743; + box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.12); + color: #fff; +} + +#username-page { + text-align: center; +} + +.username-page-container { + background: #fff; + box-shadow: 0 1px 11px rgba(0, 0, 0, 0.27); + border-radius: 2px; + width: 100%; + max-width: 500px; + display: inline-block; + margin-top: 42px; + vertical-align: middle; + position: relative; + padding: 35px 55px 35px; + min-height: 250px; + position: absolute; + top: 50%; + left: 0; + right: 0; + margin: 0 auto; + margin-top: -160px; +} + +.username-page-container .username-submit { + margin-top: 10px; +} + + +#chat-page { + position: relative; + height: 100%; +} + +.chat-container { + max-width: 700px; + margin-left: auto; + margin-right: auto; + background-color: #fff; + box-shadow: 0 1px 11px rgba(0, 0, 0, 0.27); + margin-top: 30px; + height: calc(100% - 60px); + max-height: 600px; + position: relative; +} + +#chat-page ul { + list-style-type: none; + background-color: #FFF; + margin: 0; + overflow: auto; + overflow-y: scroll; + padding: 0 20px 0px 20px; + height: calc(100% - 150px); +} + +#chat-page #messageForm { + padding: 20px; +} + +#chat-page ul li { + line-height: 1.5rem; + padding: 10px 20px; + margin: 0; + border-bottom: 1px solid #f4f4f4; +} + +#chat-page ul li p { + margin: 0; +} + +#chat-page .event-message { + width: 100%; + text-align: center; + clear: both; +} + +#chat-page .event-message p { + color: #777; + font-size: 14px; + word-wrap: break-word; +} + +#chat-page .chat-message { + padding-left: 68px; + position: relative; +} + +#chat-page .chat-message i { + position: absolute; + width: 42px; + height: 42px; + overflow: hidden; + left: 10px; + display: inline-block; + vertical-align: middle; + font-size: 18px; + line-height: 42px; + color: #fff; + text-align: center; + border-radius: 50%; + font-style: normal; + text-transform: uppercase; +} + +#chat-page .chat-message span { + color: #333; + font-weight: 600; +} + +#chat-page .chat-message p { + color: #43464b; +} + +#messageForm .input-group input { + float: left; + width: calc(100% - 85px); +} + +#messageForm .input-group button { + float: left; + width: 80px; + height: 38px; + margin-left: 5px; +} + +.chat-header { + text-align: center; + padding: 15px; + border-bottom: 1px solid #ececec; +} + +.chat-header h2 { + margin: 0; + font-weight: 500; +} + +.connecting { + padding-top: 5px; + text-align: center; + color: #777; + position: absolute; + top: 65px; + width: 100%; +} + + +@media screen and (max-width: 730px) { + + .chat-container { + margin-left: 10px; + margin-right: 10px; + margin-top: 10px; + } +} + +@media screen and (max-width: 480px) { + .chat-container { + height: calc(100% - 30px); + } + + .username-page-container { + width: auto; + margin-left: 15px; + margin-right: 15px; + padding: 25px; + } + + #chat-page ul { + height: calc(100% - 120px); + } + + #messageForm .input-group button { + width: 65px; + } + + #messageForm .input-group input { + width: calc(100% - 70px); + } + + .chat-header { + padding: 10px; + } + + .connecting { + top: 60px; + } + + .chat-header h2 { + font-size: 1.1em; + } +} \ No newline at end of file diff --git a/api-portal/src/main/resources/static/video.html b/universal-ui/src/main/resources/static/video.html similarity index 80% rename from api-portal/src/main/resources/static/video.html rename to universal-ui/src/main/resources/static/video.html index 9a186caa..8377d095 100644 --- a/api-portal/src/main/resources/static/video.html +++ b/universal-ui/src/main/resources/static/video.html @@ -4,8 +4,8 @@ ExRx.net Crawler Server - - + +
@@ -14,7 +14,7 @@ Hello, World! Welcome to {{ appInfo.projectArtifactId }}@{{ appInfo.version }}! -
diff --git a/universal-ui/src/main/resources/static/websocket.html b/universal-ui/src/main/resources/static/websocket.html new file mode 100644 index 00000000..a9a476e0 --- /dev/null +++ b/universal-ui/src/main/resources/static/websocket.html @@ -0,0 +1,54 @@ + + + + + Spring Boot WebSocket Chat Application | CalliCoder + + + + + +
+
+

Type your username

+
+
+ +
+
+ +
+
+
+
+ + + + + + + +