diff --git a/.editorconfig b/.editorconfig index 12314efa..599402b9 100644 --- a/.editorconfig +++ b/.editorconfig @@ -2,7 +2,7 @@ root = true [*] charset = utf-8 -end_of_line = crlf +end_of_line = lf indent_size = 4 indent_style = space insert_final_newline = true @@ -267,6 +267,89 @@ ij_java_wrap_comments = false ij_java_wrap_first_method_in_call_chain = false ij_java_wrap_long_lines = true +[{*.gradle.kts,*.kt,*.kts,*.main.kts,*.space.kts}] +ij_kotlin_align_in_columns_case_branch = false +ij_kotlin_align_multiline_binary_operation = false +ij_kotlin_align_multiline_extends_list = false +ij_kotlin_align_multiline_method_parentheses = false +ij_kotlin_align_multiline_parameters = true +ij_kotlin_align_multiline_parameters_in_calls = false +ij_kotlin_allow_trailing_comma = false +ij_kotlin_allow_trailing_comma_on_call_site = false +ij_kotlin_assignment_wrap = normal +ij_kotlin_blank_lines_after_class_header = 0 +ij_kotlin_blank_lines_around_block_when_branches = 0 +ij_kotlin_blank_lines_before_declaration_with_comment_or_annotation_on_separate_line = 1 +ij_kotlin_block_comment_add_space = false +ij_kotlin_block_comment_at_first_column = true +ij_kotlin_call_parameters_new_line_after_left_paren = true +ij_kotlin_call_parameters_right_paren_on_new_line = true +ij_kotlin_call_parameters_wrap = on_every_item +ij_kotlin_catch_on_new_line = false +ij_kotlin_class_annotation_wrap = split_into_lines +ij_kotlin_code_style_defaults = KOTLIN_OFFICIAL +ij_kotlin_continuation_indent_for_chained_calls = false +ij_kotlin_continuation_indent_for_expression_bodies = false +ij_kotlin_continuation_indent_in_argument_lists = false +ij_kotlin_continuation_indent_in_elvis = false +ij_kotlin_continuation_indent_in_if_conditions = false +ij_kotlin_continuation_indent_in_parameter_lists = false +ij_kotlin_continuation_indent_in_supertype_lists = false +ij_kotlin_else_on_new_line = false +ij_kotlin_enum_constants_wrap = off +ij_kotlin_extends_list_wrap = normal +ij_kotlin_field_annotation_wrap = split_into_lines +ij_kotlin_finally_on_new_line = false +ij_kotlin_if_rparen_on_new_line = true +ij_kotlin_import_nested_classes = false +ij_kotlin_imports_layout = *,java.**,javax.**,kotlin.**,^ +ij_kotlin_insert_whitespaces_in_simple_one_line_method = true +ij_kotlin_keep_blank_lines_before_right_brace = 2 +ij_kotlin_keep_blank_lines_in_code = 2 +ij_kotlin_keep_blank_lines_in_declarations = 2 +ij_kotlin_keep_first_column_comment = true +ij_kotlin_keep_indents_on_empty_lines = false +ij_kotlin_keep_line_breaks = true +ij_kotlin_lbrace_on_next_line = false +ij_kotlin_line_comment_add_space = false +ij_kotlin_line_comment_at_first_column = true +ij_kotlin_method_annotation_wrap = split_into_lines +ij_kotlin_method_call_chain_wrap = normal +ij_kotlin_method_parameters_new_line_after_left_paren = true +ij_kotlin_method_parameters_right_paren_on_new_line = true +ij_kotlin_method_parameters_wrap = on_every_item +ij_kotlin_name_count_to_use_star_import = 5 +ij_kotlin_name_count_to_use_star_import_for_members = 3 +ij_kotlin_packages_to_use_import_on_demand = java.util.*,kotlinx.android.synthetic.**,io.ktor.** +ij_kotlin_parameter_annotation_wrap = off +ij_kotlin_space_after_comma = true +ij_kotlin_space_after_extend_colon = true +ij_kotlin_space_after_type_colon = true +ij_kotlin_space_before_catch_parentheses = true +ij_kotlin_space_before_comma = false +ij_kotlin_space_before_extend_colon = true +ij_kotlin_space_before_for_parentheses = true +ij_kotlin_space_before_if_parentheses = true +ij_kotlin_space_before_lambda_arrow = true +ij_kotlin_space_before_type_colon = false +ij_kotlin_space_before_when_parentheses = true +ij_kotlin_space_before_while_parentheses = true +ij_kotlin_spaces_around_additive_operators = true +ij_kotlin_spaces_around_assignment_operators = true +ij_kotlin_spaces_around_equality_operators = true +ij_kotlin_spaces_around_function_type_arrow = true +ij_kotlin_spaces_around_logical_operators = true +ij_kotlin_spaces_around_multiplicative_operators = true +ij_kotlin_spaces_around_range = false +ij_kotlin_spaces_around_relational_operators = true +ij_kotlin_spaces_around_unary_operator = false +ij_kotlin_spaces_around_when_arrow = true +ij_kotlin_variable_annotation_wrap = off +ij_kotlin_while_on_new_line = false +ij_kotlin_wrap_elvis_expressions = 1 +ij_kotlin_wrap_expression_body_functions = 1 +ij_kotlin_wrap_first_method_in_call_chain = false + [.editorconfig] ij_editorconfig_align_group_field_declarations = false ij_editorconfig_space_after_colon = false @@ -460,7 +543,7 @@ 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_explicit_js_extension = auto ij_javascript_use_path_mapping = always ij_javascript_use_public_modifier = false ij_javascript_use_semicolon_after_statement = true diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index f5dd6a14..25e63f87 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -20,16 +20,16 @@ jobs: DOCKER_HUB_PASSWORD: ${{secrets.DOCKER_HUB_PASSWORD}} steps: - uses: actions/checkout@v2 - - name: Set up AdoptOpenJDK - uses: actions/setup-java@v2.3.0 + - name: Set up Java + uses: actions/setup-java@v3.1.0 with: - java-version: '11.0.11' - distribution: 'adopt-hotspot' - - name: Grant execute permission for mvnw + java-version: '17.0.2+8' + distribution: 'temurin' + - name: Grant Execution Permission for `mvnw` run: chmod +x mvnw - name: Build with Maven - run: ./mvnw clean install -V -q -DskipTests=true -Dmaven.javadoc.skip=true -Djib.to.auth.username=$DOCKER_HUB_USERNAME -Djib.to.auth.password=$DOCKER_HUB_PASSWORD - - name: Display built artifacts + run: ./mvnw clean install --show-version -Djunit.jupiter.execution.parallel.enabled=true -Dmaven.javadoc.skip=true -Djib.to.auth.username=$DOCKER_HUB_USERNAME -Djib.to.auth.password=$DOCKER_HUB_PASSWORD + - name: Display Built Artifacts run: | dir ls -R -l -h | grep -i ".jar$" @@ -38,9 +38,10 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - - uses: actions/setup-java@v2.3.0 + - name: Set up Java + uses: actions/setup-java@v3.1.0 with: - java-version: '11.0.10' - distribution: 'adopt-hotspot' - - name: Check Dependencies version with Versions Maven Plugin + java-version: '17.0.2+8' + distribution: 'temurin' + - name: Check Dependencies Version with Versions Maven Plugin run: mvn versions:display-dependency-updates versions:display-parent-updates -f pom.xml diff --git a/.shellscript/install.sh b/.shellscript/install.sh index 0225fc4b..9a886e21 100644 --- a/.shellscript/install.sh +++ b/.shellscript/install.sh @@ -15,7 +15,7 @@ command "ls" logInfo "[INSTALL] Start to run Maven clean, install…" # Run the Maven clean install -./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 +./mvnw clean install --batch-mode --show-version --quiet -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 logInfo "[INSTALL] Installation succeed. INSTALL_COMMAND_RESULT: $INSTALL_COMMAND_RESULT" diff --git a/CHANGELOG.md b/CHANGELOG.md index 61fd3201..3afed7ae 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,95 @@ +# [0.0.9](https://github.com/johnnymillergh/muscle-and-fitness-server/compare/0.0.8.1...0.0.9) (2022-04-17) + + +### Bug Fixes + +* **$ELK:** correct Elasticsearch index ([fcefc44](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/fcefc446f8a534d8fc787874c547f3d0e823b26e)) +* **$Kotlin:** fix Kotlin building error `cannot find symbol` ([f7a3259](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/f7a3259519b92cb57fc712e1c93e036eca550071)) +* **$MinIO:** record -> class ([f593f94](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/f593f94c10638bb79d767b70469a0ac1d390423e)) +* **$Quartz:** correct `StackOverflowError` from inappropriate Hutool usage ([ae086dc](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/ae086dceab4e5276ec3a8a4ece096a73623b6400)) +* **$Quartz:** correct job execution to avoid NPE ([f8932b0](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/f8932b07bc79ed4846139d95e59e6c09b55d9500)) +* **$starter:** correct configuration properties ([2208e18](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/2208e18e476f860e052a459a571535ae0d3e0b40)) +* **$starter:** correct configuration properties 2 ([8820316](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/8820316982d3c1e8628c70cfd3d6bc34de069fe7)) +* **$starter:** correct configuration properties 3 ([5e2c41a](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/5e2c41aa7a004593a0af5b2635827bea001846cf)) +* **$starter:** fix `StringIndexOutOfBoundsException` issue ([c240246](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/c2402468dfca206485ebfa12256a20d78bd13ebe)) + + +### Build System + +* **$Consul:** update the name of MySQL data source ([6af11bd](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/6af11bdf18f580ad5a9b27b97c9a070fecbaf4b9)) +* **$Maven:** support parallel JUnit 5 tests ([1b0a3e8](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/1b0a3e884ae0af936df400c679bf481494843251)) +* **$MySQL:** migrate single table to sharding table ([0d7ddd6](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/0d7ddd6eda4dd5f336b027f7cc77ddade4b12a48)) + + +### Features + +* **$Enum:** abstract common methods for enum ([c8305fb](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/c8305fb67e834c9a5d013ce35d3b81890be77612)) +* **$JaCoCo:** integrate JaCoCo for code coverage report ([92d6297](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/92d629750b62b6aca987a49df3f6fb9568bc6ed8)) +* **$Kotlin:** support Kotlin 1.6.10 with Java 17 ([d363c5c](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/d363c5c86b82da8dfe985e6c24badf823c07e2b0)) +* **$POM:** import `MapStruct@1.4.2.Final` as global dependency ([6e5121a](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/6e5121ae75f9cbd6539bdb7ccb37b28fd2e5f004)) +* **$Redis:** create the demo for Redis distributed lock ([74c54b3](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/74c54b373af62a1826a108711d9d4f19fa6aa47b)) +* **$Redis:** integrate with Redis distributed lock for concurrency control ([85bf9bc](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/85bf9bc506a459cb72636aec49489586074815b6)) +* **$Redis:** switch back to Redis standalone mode ([2e0ce94](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/2e0ce9421e08f1a6dbc0f5821407951f6e479c7f)) +* **$ShardingSphere:** fully support ShardingSphere for better database capacity ([8afa4a8](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/8afa4a8cecc2cef6a60c975e8ab413aa81268ec9)) +* **$ShardingSphere:** support read-write load balancer for database ([3ef9765](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/3ef9765d2723399b23ab375dcc8700783e8277cb)) +* **$Sleuth:** record trance ID and span ID in logs ([a3f4811](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/a3f48112ca4a456899696d0a56ab92f4c9e87afd)) +* **$Slf4j:** support functional lazy debug ([4887857](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/4887857dca36326830b297b377a2b77ca797ad22)) +* **$starter:** remove the usage of BeanUtil ([3e2872e](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/3e2872e94754d8b817448f40a91cf126f9e18b46)) +* **$starter:** support dynamic autoconfiguration for Redis lock ([f03a337](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/f03a337cbff5d5b0aa953d85be02d464f83c9a99)) +* **$Zipkin:** support trackable HTTP response ([ee8dab4](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/ee8dab4883115bdcb66150fe3c2294c162929378)) + + +### Performance Improvements + +* **$auth-center:** create fallback for remote API ([c445d6f](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/c445d6fba501c4b8f73f45860cf4ae9ff4beff65)) +* **$DDD:** decouple and aggregate permission ([87845e7](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/87845e7fd0e230726144b3c0524218103efb2023)) +* **$Hikari:** set Hikari CP as default connection pool ([7fdce5a](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/7fdce5abec0ae2b1042c21c9e04996fd5a107422)) +* **$Java:** upgrade Java (Temurin) to 17.0.2+8 ([0b5a979](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/0b5a97910efb355251cbe6402446c356773a22e1)) +* **$JDK:** migrate AdoptOpenJDK to the Eclipse Adoptium Temurin™ ([fb14be5](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/fb14be52ab1b6d392736bfcdeff571d1849c1174)) +* **$MinIO:** update MinIO dependency version to 8.3.7 ([d77c2a2](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/d77c2a2d1a38a1d0feb3af5eef6c3b58caea0dcc)) +* **$MySQL:** unify database style ([67c8967](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/67c8967a0053f72190d63d79f6ce0c38f3a21852)) +* **$POM:** update dependencies to latest version ([4fe767b](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/4fe767b34a2f584f12e87edc23e01437980d64b8)) +* **$POM:** upgrade dependencies ([ea13e27](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/ea13e27dc11af0dff45e40b517e34bd5813cefc7)) +* **$POM:** upgrade dependencies ([e0fc588](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/e0fc5881d05861ed6005c6ca4c6ad6cb240185bd)) +* **$POM:** upgrade dependencies to latest release ([617e06f](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/617e06f479ffe7b6cfb7abe0d2a324d2097978f3)) +* **$POM:** upgrade ShardingSphere@5.1.1 ([25ee8be](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/25ee8be7c94d73cfd7057af838a3f6d77a7a8ae6)) +* **$POM:** upgrade Spring Boot 2.6.3 and Spring Cloud 2021.0.1 ([c1a57db](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/c1a57db0eeb9e2d8916f46ab03b24a783ecef424)) +* **$ShardingSphere:** integrate with ShardingSphere ([5ba4a42](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/5ba4a42e5fc2e101ed19f9390e3f32ddf5fd197e)) +* **$ShardingSphere:** support table sharding strategy ([aef374b](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/aef374b70fd34de613b9f69544ccea28850c1922)) +* **$starter:** integrate with spring-boot-starter-data-elasticsearch ([0f4dff5](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/0f4dff51ab2a905ec62756522bf3c404ee797224)) +* upgrade infrastructures version to latest release ([cfddf94](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/cfddf947f38ab2053ddcde3b3937cf1beea3af9e)) + + +### Tests + +* **$auth-center:** create unit tests for `auth-center-biz` ([a7519c7](https://github.com/johnnymillergh/muscle-and-fitness-server/commit/a7519c7794f34ed7fd5fdc34eecea806c3b7cca3)) + + +### BREAKING CHANGES + +* **$Kotlin:** support Kotlin 1.6.10 with Java 17 +* **$Java:** upgrade Java (Temurin) to 17.0.2+8 +* **$JaCoCo:** integrate JaCoCo for code coverage report; refine global Maven dependencies +* **$Maven:** support parallel JUnit 5 tests +* **$auth-center:** use Mockito for unit test; create unit tests for `auth-center-biz` +* **$Consul:** use source/replica terms for MySQL clusters, instead of master/slave + +[skip ci] +* **$ShardingSphere:** fully support ShardingSphere for better database capacity +* **$MySQL:** migrate single table to sharding table + +[skip ci] +* **$ShardingSphere:** remove dependency `dynamic-datasource-spring-boot-starter` + +[skip ci] +* **$Zipkin:** support trackable HTTP response +* **$Hikari:** removed Alibaba Druid +* **$Sleuth:** support trace ID and span ID in logs +* **$Redis:** integrate with Redis distributed lock for concurrency control +* **$starter:** ban using any packages of BeanUtil; the package name of MyBatis mappers has changed to `repository` + + + # [0.0.8.1](https://github.com/johnnymillergh/muscle-and-fitness-server/compare/0.0.8...0.0.8.1) (2022-02-04) diff --git a/README.md b/README.md index 1a120827..c60478e9 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ # Muscle and Fitness Server -**Muscle and Fitness Server** a Spring Cloud microservice based, DDD structured, back-end server for managing data of muscle and fitness. +**Muscle and Fitness Server** a Spring Cloud microservice based, DDD structured, back-end server for managing data of muscle and fitness. [Official Docker Image](https://hub.docker.com/u/ijohnnymiller) @@ -19,9 +19,9 @@ Here is the highlights of **Muscle and Fitness Server**: -1. Each microservice is organized by [Domain Driven Design](https://en.wikipedia.org/wiki/Domain-driven_design) (DDD) structure. +1. Each microservice is organized by [Domain Driven Design](https://en.wikipedia.org/wiki/Domain-driven_design) (DDD) structure. -1. Inherited from the most modern and newest Spring frameworks: +1. Based on Java - [![](https://img.shields.io/badge/OpenJDK-Temurin%2017.0.2+8-informational?style=flat&logo=java&logoColor=white&color=2bbc8a)](https://github.com/adoptium/temurin17-binaries/releases/tag/jdk-17.0.2%2B8) and Kotlin - [![](https://img.shields.io/badge/Kotlin-1.6.10-informational?style=flat&logo=kotlin&logoColor=white&color=2bbc8a)](https://github.com/JetBrains/kotlin/releases/tag/v1.6.10). 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/) @@ -39,13 +39,21 @@ Here is the highlights of **Muscle and Fitness Server**: - For Spring MVC, [spring-cloud-starter](https://github.com/johnnymillergh/muscle-and-fitness-server/tree/master/spring-cloud-starter) - For Spring WebFlux, [reactive-spring-cloud-starter](https://github.com/johnnymillergh/muscle-and-fitness-server/tree/master/reactive-spring-cloud-starter) -4. PMD code quality check for each every CI (during Maven verify phase), with [Alibaba-p3c](https://github.com/alibaba/p3c) rulesets. - 5. Advocate 𝛌 Java Functional Programming, provide developers with powerful and useful functions to make Java more sweeter. 6. Secured API. [RBAC](https://en.wikipedia.org/wiki/Role-based_access_control) by API gateway and Auth Center. JWT authentication, and RBAC authorization. -7. [MySQL Replication for High Availability](https://severalnines.com/resources/database-management-tutorials/mysql-replication-high-availability-tutorial). Multi data source. [Dynamic SQL read-write isolation](https://baomidou.com/guide/dynamic-datasource.html). [MyBatis-Plus](https://github.com/baomidou/mybatis-plus) is the integrated ORM library. [Druid](https://github.com/alibaba/druid) is the database connection pool. Dynamically enhance connection pool size by CPU count (logical processor count). Read more at [How to Find the Optimal Database Connection Pool Size](https://wiki.postgresql.org/wiki/Number_Of_Database_Connections#How_to_Find_the_Optimal_Database_Connection_Pool_Size), [Sizing the Connection Pool](https://dev.mysql.com/doc/connector-j/5.1/en/connector-j-usagenotes-j2ee-concepts-connection-pooling.html#idm46216069663472). +8. [MySQL Replication for High Availability](https://severalnines.com/resources/database-management-tutorials/mysql-replication-high-availability-tutorial). ShardingSphere as database access middleware to boost the database capacity better. + + - Multi data source managed by ShardingSphere, including main, replica and Quartz 3 data sources. + + - [Dynamic SQL read-write isolation](https://shardingsphere.apache.org/document/current/en/features/readwrite-splitting/) and [table sharding](https://shardingsphere.apache.org/document/current/en/features/sharding/concept/table/) provided by [ShardingSphere](https://shardingsphere.apache.org/). + + - [MyBatis-Plus](https://github.com/baomidou/mybatis-plus) is the integrated ORM library. + + - [光 HikariCP](https://github.com/brettwooldridge/HikariCP) is the database connection pool. + + - TODO: Dynamically enhance connection pool size by CPU count (logical processor count). Read more at [How to Find the Optimal Database Connection Pool Size](https://wiki.postgresql.org/wiki/Number_Of_Database_Connections#How_to_Find_the_Optimal_Database_Connection_Pool_Size), [Sizing the Connection Pool](https://dev.mysql.com/doc/connector-j/5.1/en/connector-j-usagenotes-j2ee-concepts-connection-pooling.html#idm46216069663472). 8. Redis 6.x support. [Master-slave replication for high availability](https://redis.io/topics/replication). Redis cluster. @@ -65,6 +73,10 @@ Here is the highlights of **Muscle and Fitness Server**: 16. [Async log output](https://examples.javacodegeeks.com/enterprise-java/logback/logback-ayncappender-example/). Log file compressed by standard GNU zip ([gzip](https://en.wikipedia.org/wiki/Gzip)) compression algorithm. [ELK](https://www.elastic.co/what-is/elk-stack) log aggregation. +16. PMD code quality check for each every CI (during Maven verify phase), with [Alibaba-p3c](https://github.com/alibaba/p3c) rulesets. + +16. [JaCoCo](https://github.com/jacoco/jacoco) for JUnit code coverage. + 17. JVM log configuration for JVM garbage collection. 18. AOP based request log, configurable for turning on or off. @@ -92,7 +104,7 @@ Here is the highlights of **Muscle and Fitness Server**: $ git clone https://github.com/johnnymillergh/muscle-and-fitness-server.git ``` -2. Build with newest Intellij IDEA. +2. Build with newest IntelliJ IDEA. 3. Click the green triangle to Run. @@ -109,7 +121,7 @@ Here is the highlights of **Muscle and Fitness Server**: 2. Package: ```shell - $ mvn clean package --batch-mode --show-version --quiet -f pom.xml + $ mvn clean package -Djunit.jupiter.execution.parallel.enabled=true --batch-mode --show-version --quiet -f pom.xml ``` 3. Set Version: @@ -173,8 +185,8 @@ Here is the highlights of **Muscle and Fitness Server**: ## 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. +- [GitHub Actions](https://github.com/johnnymillergh/media-streaming/actions) is for building and publishing Docker images, also checking dependency updates and tests. +- ~~[Travis CI](https://travis-ci.com/github/johnnymillergh/media-streaming) is for publishing Docker Hub images of SNAPSHOT and RELEASE.~~ ## Maintainers diff --git a/api-gateway/api-gateway-biz/pom.xml b/api-gateway/api-gateway-biz/pom.xml index 2b3a6d1c..50ff342e 100644 --- a/api-gateway/api-gateway-biz/pom.xml +++ b/api-gateway/api-gateway-biz/pom.xml @@ -10,7 +10,7 @@ com.jmsoftware.maf api-gateway - 0.0.8.1 + 0.0.9 diff --git a/api-gateway/api-gateway-biz/src/main/java/com/jmsoftware/maf/apigateway/package-info.java b/api-gateway/api-gateway-biz/src/main/java/com/jmsoftware/maf/apigateway/package-info.java deleted file mode 100644 index 1f6f99b5..00000000 --- a/api-gateway/api-gateway-biz/src/main/java/com/jmsoftware/maf/apigateway/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package com.jmsoftware.maf.apigateway; diff --git a/api-gateway/api-gateway-biz/src/main/java/com/jmsoftware/maf/apigateway/package-info.kt b/api-gateway/api-gateway-biz/src/main/java/com/jmsoftware/maf/apigateway/package-info.kt new file mode 100644 index 00000000..7e8d17b3 --- /dev/null +++ b/api-gateway/api-gateway-biz/src/main/java/com/jmsoftware/maf/apigateway/package-info.kt @@ -0,0 +1,2 @@ +package com.jmsoftware.maf.apigateway + diff --git a/api-gateway/api-gateway-biz/src/main/java/com/jmsoftware/maf/apigateway/security/impl/GatewayServerAccessDeniedHandlerImpl.java b/api-gateway/api-gateway-biz/src/main/java/com/jmsoftware/maf/apigateway/security/impl/GatewayServerAccessDeniedHandlerImpl.java deleted file mode 100644 index 96a736f5..00000000 --- a/api-gateway/api-gateway-biz/src/main/java/com/jmsoftware/maf/apigateway/security/impl/GatewayServerAccessDeniedHandlerImpl.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.jmsoftware.maf.apigateway.security.impl; - -import com.jmsoftware.maf.reactivespringcloudstarter.util.ResponseUtil; -import lombok.RequiredArgsConstructor; -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 -@RequiredArgsConstructor -public class GatewayServerAccessDeniedHandlerImpl implements ServerAccessDeniedHandler { - private final ResponseUtil responseUtil; - - @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 this.responseUtil.renderJson(exchange, HttpStatus.FORBIDDEN, denied.getMessage(), null); - } -} diff --git a/api-gateway/api-gateway-biz/src/main/java/com/jmsoftware/maf/apigateway/security/impl/GatewayServerAccessDeniedHandlerImpl.kt b/api-gateway/api-gateway-biz/src/main/java/com/jmsoftware/maf/apigateway/security/impl/GatewayServerAccessDeniedHandlerImpl.kt new file mode 100644 index 00000000..31492442 --- /dev/null +++ b/api-gateway/api-gateway-biz/src/main/java/com/jmsoftware/maf/apigateway/security/impl/GatewayServerAccessDeniedHandlerImpl.kt @@ -0,0 +1,32 @@ +package com.jmsoftware.maf.apigateway.security.impl + +import com.jmsoftware.maf.common.util.logger +import com.jmsoftware.maf.reactivespringcloudstarter.util.ResponseUtil +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 + +/** + * # GatewayServerAccessDeniedHandlerImpl + * + * Implementation os gateway server access denied handler + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/16/22 8:03 PM + */ +open class GatewayServerAccessDeniedHandlerImpl( + private val responseUtil: ResponseUtil +) : ServerAccessDeniedHandler { + companion object { + private val log = logger() + } + + override fun handle(exchange: ServerWebExchange, denied: AccessDeniedException): Mono { + log.error( + "Access denied! Exception message: {}. Request URL: [{}] {}", denied.message, + exchange.request.method, exchange.request.uri + ) + return responseUtil.renderJson(exchange, HttpStatus.FORBIDDEN, denied.message, null) + } +} diff --git a/api-gateway/api-gateway-biz/src/main/java/com/jmsoftware/maf/apigateway/security/impl/JwtReactiveAuthenticationManagerImpl.java b/api-gateway/api-gateway-biz/src/main/java/com/jmsoftware/maf/apigateway/security/impl/JwtReactiveAuthenticationManagerImpl.java deleted file mode 100644 index 5adcaad6..00000000 --- a/api-gateway/api-gateway-biz/src/main/java/com/jmsoftware/maf/apigateway/security/impl/JwtReactiveAuthenticationManagerImpl.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.jmsoftware.maf.apigateway.security.impl; - -import cn.hutool.core.util.StrUtil; -import com.jmsoftware.maf.apigateway.remote.AuthCenterRemoteApi; -import com.jmsoftware.maf.common.domain.authcenter.security.UserPrincipal; -import com.jmsoftware.maf.common.exception.BizException; -import com.jmsoftware.maf.common.exception.SecurityException; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -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 - **/ -@Slf4j -@RequiredArgsConstructor -public class JwtReactiveAuthenticationManagerImpl implements ReactiveAuthenticationManager { - 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 this.authCenterRemoteApi.getUserByLoginToken(username) - .switchIfEmpty(Mono.error(new BizException("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/api-gateway-biz/src/main/java/com/jmsoftware/maf/apigateway/security/impl/JwtReactiveAuthenticationManagerImpl.kt b/api-gateway/api-gateway-biz/src/main/java/com/jmsoftware/maf/apigateway/security/impl/JwtReactiveAuthenticationManagerImpl.kt new file mode 100644 index 00000000..b50d9f75 --- /dev/null +++ b/api-gateway/api-gateway-biz/src/main/java/com/jmsoftware/maf/apigateway/security/impl/JwtReactiveAuthenticationManagerImpl.kt @@ -0,0 +1,73 @@ +package com.jmsoftware.maf.apigateway.security.impl + +import cn.hutool.core.util.StrUtil +import com.jmsoftware.maf.apigateway.remote.AuthCenterWebClientService +import com.jmsoftware.maf.common.domain.authcenter.security.UserPrincipal +import com.jmsoftware.maf.common.domain.authcenter.user.GetUserByLoginTokenResponse +import com.jmsoftware.maf.common.exception.InternalServerException +import com.jmsoftware.maf.common.exception.SecurityException +import com.jmsoftware.maf.common.util.logger +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 + +/** + * # JwtReactiveAuthenticationManagerImpl + * + * Implementation of JWT reactive authentication manager + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/16/22 8:03 PM + */ +open class JwtReactiveAuthenticationManagerImpl( + private val authCenterWebClientService: AuthCenterWebClientService +) : ReactiveAuthenticationManager { + companion object { + private val log = logger() + } + + private val preAuthenticationChecks = UserDetailsChecker { user: UserDetails -> + if (!user.isAccountNonLocked) { + log.error("User account is locked") + throw LockedException("User account is locked") + } + if (!user.isEnabled) { + log.error("User account is disabled") + throw DisabledException("User is disabled") + } + if (!user.isAccountNonExpired) { + log.error("User account is expired") + throw AccountExpiredException("User account has expired") + } + } + private val postAuthenticationChecks = UserDetailsChecker { user: UserDetails -> + if (!user.isCredentialsNonExpired) { + log.error("User account credentials have expired") + throw CredentialsExpiredException("User credentials have expired") + } + } + + private fun retrieveUser(username: String): Mono { + if (StrUtil.isBlank(username)) { + log.warn("Authentication failure! Cause: the username mustn't be blank") + return Mono.error( + SecurityException(HttpStatus.NETWORK_AUTHENTICATION_REQUIRED, "Username mustn't be blank") + ) + } + return authCenterWebClientService.getUserByLoginToken(username) + .switchIfEmpty(Mono.error(InternalServerException("Authentication failure! Cause: User not found"))) + .map { data: GetUserByLoginTokenResponse -> + log.info("Authentication success! Found $data") + UserPrincipal.create(data) + } + } + + override fun authenticate(authentication: Authentication): Mono { + return retrieveUser(authentication.name) + .doOnNext { toCheck: UserDetails -> preAuthenticationChecks.check(toCheck) } + .doOnNext { toCheck: UserDetails -> postAuthenticationChecks.check(toCheck) } + .map { userDetails: UserDetails -> UsernamePasswordAuthenticationToken(userDetails, null) } + } +} diff --git a/api-gateway/api-gateway-biz/src/main/java/com/jmsoftware/maf/apigateway/security/impl/JwtReactiveServerSecurityContextRepositoryImpl.java b/api-gateway/api-gateway-biz/src/main/java/com/jmsoftware/maf/apigateway/security/impl/JwtReactiveServerSecurityContextRepositoryImpl.java deleted file mode 100644 index 2b18c879..00000000 --- a/api-gateway/api-gateway-biz/src/main/java/com/jmsoftware/maf/apigateway/security/impl/JwtReactiveServerSecurityContextRepositoryImpl.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.jmsoftware.maf.apigateway.security.impl; - -import cn.hutool.core.util.StrUtil; -import com.jmsoftware.maf.apigateway.remote.AuthCenterRemoteApi; -import com.jmsoftware.maf.common.domain.authcenter.security.UserPrincipal; -import com.jmsoftware.maf.common.exception.SecurityException; -import com.jmsoftware.maf.reactivespringcloudstarter.property.JwtConfigurationProperties; -import com.jmsoftware.maf.reactivespringcloudstarter.property.MafConfigurationProperties; -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 MafConfigurationProperties mafConfigurationProperties; - 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 (val ignoredUrl : this.mafConfigurationProperties.flattenIgnoredUrls()) { - if (this.antPathMatcher.match(ignoredUrl, request.getURI().getPath())) { - return Mono.empty(); - } - } - val authorization = request.getHeaders().getFirst(HttpHeaders.AUTHORIZATION); - if (StrUtil.isBlank(authorization) || !StrUtil.startWith(authorization, JwtConfigurationProperties.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 this.authCenterRemoteApi.parse(authorization) - .map(parseJwtResponse -> { - log.info("parseJwtResponse: {}", parseJwtResponse); - val userPrincipal = UserPrincipal.createByUsername(parseJwtResponse.getUsername()); - userPrincipal.setId(parseJwtResponse.getId()); - 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/api-gateway-biz/src/main/java/com/jmsoftware/maf/apigateway/security/impl/JwtReactiveServerSecurityContextRepositoryImpl.kt b/api-gateway/api-gateway-biz/src/main/java/com/jmsoftware/maf/apigateway/security/impl/JwtReactiveServerSecurityContextRepositoryImpl.kt new file mode 100644 index 00000000..48848acb --- /dev/null +++ b/api-gateway/api-gateway-biz/src/main/java/com/jmsoftware/maf/apigateway/security/impl/JwtReactiveServerSecurityContextRepositoryImpl.kt @@ -0,0 +1,76 @@ +package com.jmsoftware.maf.apigateway.security.impl + +import cn.hutool.core.util.StrUtil +import com.jmsoftware.maf.apigateway.remote.AuthCenterWebClientService +import com.jmsoftware.maf.common.domain.authcenter.security.ParseJwtResponse +import com.jmsoftware.maf.common.domain.authcenter.security.UserPrincipal.Companion.createByUsername +import com.jmsoftware.maf.common.exception.SecurityException +import com.jmsoftware.maf.common.util.logger +import com.jmsoftware.maf.reactivespringcloudstarter.property.JwtConfigurationProperties.Companion.TOKEN_PREFIX +import com.jmsoftware.maf.reactivespringcloudstarter.property.MafConfigurationProperties +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.Authentication +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 + +/** + * # JwtReactiveServerSecurityContextRepositoryImpl + * + * Implementation of JWT reactive server security context repository + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/16/22 8:04 PM + */ +open class JwtReactiveServerSecurityContextRepositoryImpl( + private val mafConfigurationProperties: MafConfigurationProperties, + private val authenticationManager: ReactiveAuthenticationManager, + private val authCenterWebClientService: AuthCenterWebClientService +) : ServerSecurityContextRepository { + private val antPathMatcher = AntPathMatcher() + + companion object { + private val log = logger() + } + + override fun save(exchange: ServerWebExchange, context: SecurityContext): Mono { + log.error("Unsupported operation exception: Not supported yet.") + throw UnsupportedOperationException("Not supported yet.") + } + + override fun load(exchange: ServerWebExchange): Mono { + val request = exchange.request + // Ignore allowed URL + for (ignoredUrl in mafConfigurationProperties.flattenIgnoredUrls()) { + if (antPathMatcher.match(ignoredUrl, request.uri.path)) { + return Mono.empty() + } + } + val authorization = request.headers.getFirst(HttpHeaders.AUTHORIZATION) + if (StrUtil.isBlank(authorization) || !StrUtil.startWith(authorization, TOKEN_PREFIX)) { + log.warn("Pre-authentication failure! Cause: `${HttpHeaders.AUTHORIZATION}` in HTTP headers not found. Request URL: [${request.method}] ${request.uri}") + return Mono.error(SecurityException(HttpStatus.NETWORK_AUTHENTICATION_REQUIRED, "JWT Required")) + } + return authCenterWebClientService.parse(authorization!!) + .map { parseJwtResponse: ParseJwtResponse -> + log.info("parseJwtResponse: {}", parseJwtResponse) + val userPrincipal = createByUsername(parseJwtResponse.username) + userPrincipal.id = parseJwtResponse.id + val authentication = UsernamePasswordAuthenticationToken(userPrincipal, null) + log.warn("About to authenticate… Authentication is created. $authentication") + authentication + }.flatMap { authentication: UsernamePasswordAuthenticationToken -> + authenticationManager.authenticate(authentication) + .map { authentication2: Authentication -> + SecurityContextImpl( + authentication2 + ) + } + } + } +} diff --git a/api-gateway/api-gateway-biz/src/main/java/com/jmsoftware/maf/apigateway/security/impl/RbacReactiveAuthorizationManagerImpl.java b/api-gateway/api-gateway-biz/src/main/java/com/jmsoftware/maf/apigateway/security/impl/RbacReactiveAuthorizationManagerImpl.java deleted file mode 100644 index 708d51aa..00000000 --- a/api-gateway/api-gateway-biz/src/main/java/com/jmsoftware/maf/apigateway/security/impl/RbacReactiveAuthorizationManagerImpl.java +++ /dev/null @@ -1,151 +0,0 @@ -package com.jmsoftware.maf.apigateway.security.impl; - -import cn.hutool.core.util.StrUtil; -import com.google.common.collect.Lists; -import com.jmsoftware.maf.apigateway.remote.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_ID.getHeader(), String.valueOf(userPrincipal.getId())); - 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/api-gateway-biz/src/main/java/com/jmsoftware/maf/apigateway/security/impl/RbacReactiveAuthorizationManagerImpl.kt b/api-gateway/api-gateway-biz/src/main/java/com/jmsoftware/maf/apigateway/security/impl/RbacReactiveAuthorizationManagerImpl.kt new file mode 100644 index 00000000..2cbc8577 --- /dev/null +++ b/api-gateway/api-gateway-biz/src/main/java/com/jmsoftware/maf/apigateway/security/impl/RbacReactiveAuthorizationManagerImpl.kt @@ -0,0 +1,148 @@ +package com.jmsoftware.maf.apigateway.security.impl + +import cn.hutool.core.util.StrUtil +import com.jmsoftware.maf.apigateway.remote.AuthCenterWebClientService +import com.jmsoftware.maf.common.constant.MafHttpHeader.X_ID +import com.jmsoftware.maf.common.constant.MafHttpHeader.X_USERNAME +import com.jmsoftware.maf.common.domain.authcenter.permission.GetPermissionListByRoleIdListPayload +import com.jmsoftware.maf.common.domain.authcenter.permission.Permission +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 com.jmsoftware.maf.common.util.logger +import org.springframework.http.HttpHeaders +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.util.AntPathMatcher +import reactor.core.publisher.Flux +import reactor.core.publisher.Mono +import reactor.util.function.Tuple2 + +/** + * # RbacReactiveAuthorizationManagerImpl + * + * Implementation of RBAC (Role-based access control) reactive authorization manager + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/16/22 8:57 PM + * @see [Role-based access control](https://en.wikipedia.org/wiki/Role-based_access_control) + */ +open class RbacReactiveAuthorizationManagerImpl( + private val authCenterWebClientService: AuthCenterWebClientService +) : ReactiveAuthorizationManager { + companion object { + private val log = logger() + } + + private val antPathMatcher = AntPathMatcher() + + /** + * Retrieve roles flux. + * + * @param userPrincipalMono the user principal mono + * @return the flux + */ + private fun retrieveRoles(userPrincipalMono: Mono): Flux { + // Get role list by user ID, and then convert to Flux + return userPrincipalMono + .flatMap { userPrincipal: UserPrincipal -> authCenterWebClientService.getRoleListByUserId(userPrincipal.id!!) } + .flatMapMany { Flux.fromIterable(it) } + .switchIfEmpty(Flux.error(SecurityException(HttpStatus.UNAUTHORIZED, "Roles not assigned!"))) + } + + /** + * Filter roles mono. + * + * @param roleFlux the role flux + * @return the mono + */ + private fun mapRole(roleFlux: Flux): Mono> { + return roleFlux + .map(GetRoleListByUserIdSingleResponse::id) + .collectList() + .switchIfEmpty(roleFlux.map(GetRoleListByUserIdSingleResponse::id).collectList()) + } + + /** + * Retrieve permissions mono. + * + * @param roleIdListMono the role id list mono + * @return the mono + */ + private fun retrievePermissions(roleIdListMono: Mono>): Mono> { + // Get permission list based on the Mono> + // auth-center will respond /** for role "admin" + return roleIdListMono.flatMap { roleIdList: List -> + val payload = GetPermissionListByRoleIdListPayload() + payload.roleIdList = roleIdList + payload.permissionTypeList = listOf(PermissionType.BUTTON) + authCenterWebClientService.getPermissionListByRoleIdList(payload) + } + .switchIfEmpty(Mono.error(SecurityException(HttpStatus.FORBIDDEN, "Permission not found!"))) + } + + override fun check( + authentication: Mono, + `object`: AuthorizationContext + ): Mono { + val request = `object`.exchange.request + val userPrincipalMono = authentication.map { auth: Authentication -> auth.principal as UserPrincipal } + val roleFlux = retrieveRoles(userPrincipalMono) + val roleIdListMono = mapRole(roleFlux) + val permissionListMono = retrievePermissions(roleIdListMono) + // Aggregate 2 Mono + val zip = Mono.zip(permissionListMono, userPrincipalMono) + return zip.map { mapper: Tuple2, UserPrincipal> -> + val userPrincipal = mapper.t2 + val anyMatched = mapper.t1.stream() + .filter { permission: Permission -> StrUtil.isNotBlank(permission.url) } + .filter { permission: Permission -> StrUtil.isNotBlank(permission.method) } + .anyMatch { permission: Permission -> + checkRestfulAccess(permission, request) + } + if (anyMatched) { + log.info("Authorization success! Resource [${request.method}] ${request.uri} is accessible for user(username: ${userPrincipal.username})") + request.mutate() + .headers { httpHeaders: HttpHeaders -> + httpHeaders[X_ID.header] = userPrincipal.id.toString() + httpHeaders[X_USERNAME.header] = userPrincipal.username + }.build() + AuthorizationDecision(true) + } else { + log.warn("Authorization failure! Resource [${request.method}] ${request.uri} is not accessible for user(username: ${userPrincipal.username})") + AuthorizationDecision(false) + } + } + } + + /** + * + * Check Restful access. + * + * * Check if the URL is matched + * * Check if the HTTP method is matched + * + * + * @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 fun checkRestfulAccess( + buttonPermission: Permission, + request: ServerHttpRequest + ): Boolean { + val urlMatched = antPathMatcher.match(buttonPermission.url!!, request.uri.path) + // "*" is for super user. Super user's permission is like URL: "/**", method: "*" + val allMethods = StrUtil.equals(buttonPermission.method, "*") + if (allMethods) { + return urlMatched + } + val methodMatched = request.method!!.matches(buttonPermission.method!!) + return urlMatched && methodMatched + } +} diff --git a/api-gateway/api-gateway-biz/src/main/java/com/jmsoftware/maf/apigateway/security/impl/ServerAuthenticationEntryPointImpl.java b/api-gateway/api-gateway-biz/src/main/java/com/jmsoftware/maf/apigateway/security/impl/ServerAuthenticationEntryPointImpl.java deleted file mode 100644 index b18b581a..00000000 --- a/api-gateway/api-gateway-biz/src/main/java/com/jmsoftware/maf/apigateway/security/impl/ServerAuthenticationEntryPointImpl.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.jmsoftware.maf.apigateway.security.impl; - -import com.jmsoftware.maf.reactivespringcloudstarter.util.ResponseUtil; -import lombok.RequiredArgsConstructor; -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 -@RequiredArgsConstructor -public class ServerAuthenticationEntryPointImpl implements ServerAuthenticationEntryPoint { - private final ResponseUtil responseUtil; - - @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 this.responseUtil.renderJson(exchange, HttpStatus.NETWORK_AUTHENTICATION_REQUIRED, e.getMessage(), null); - } -} diff --git a/api-gateway/api-gateway-biz/src/main/java/com/jmsoftware/maf/apigateway/security/impl/ServerAuthenticationEntryPointImpl.kt b/api-gateway/api-gateway-biz/src/main/java/com/jmsoftware/maf/apigateway/security/impl/ServerAuthenticationEntryPointImpl.kt new file mode 100644 index 00000000..1332d393 --- /dev/null +++ b/api-gateway/api-gateway-biz/src/main/java/com/jmsoftware/maf/apigateway/security/impl/ServerAuthenticationEntryPointImpl.kt @@ -0,0 +1,29 @@ +package com.jmsoftware.maf.apigateway.security.impl + +import com.jmsoftware.maf.common.util.logger +import com.jmsoftware.maf.reactivespringcloudstarter.util.ResponseUtil +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 + +/** + * # ServerAuthenticationEntryPointImpl + * + * Description: ServerAuthenticationEntryPointImpl, change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/16/22 8:57 PM + */ +open class ServerAuthenticationEntryPointImpl( + private val responseUtil: ResponseUtil +) : ServerAuthenticationEntryPoint { + companion object { + private val log = logger() + } + + override fun commence(exchange: ServerWebExchange, e: AuthenticationException): Mono { + log.error("Exception occurred when authenticating! Exception message: ${e.message}. Request URL: [${exchange.request.method}] ${exchange.request.uri}") + return responseUtil.renderJson(exchange, HttpStatus.NETWORK_AUTHENTICATION_REQUIRED, e.message, null) + } +} diff --git a/api-gateway/api-gateway-biz/src/main/java/com/jmsoftware/maf/apigateway/security/package-info.java b/api-gateway/api-gateway-biz/src/main/java/com/jmsoftware/maf/apigateway/security/package-info.java deleted file mode 100644 index 30dd5fd2..00000000 --- a/api-gateway/api-gateway-biz/src/main/java/com/jmsoftware/maf/apigateway/security/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package com.jmsoftware.maf.apigateway.security; diff --git a/api-gateway/api-gateway-biz/src/main/java/com/jmsoftware/maf/apigateway/security/package-info.kt b/api-gateway/api-gateway-biz/src/main/java/com/jmsoftware/maf/apigateway/security/package-info.kt new file mode 100644 index 00000000..f519c1cf --- /dev/null +++ b/api-gateway/api-gateway-biz/src/main/java/com/jmsoftware/maf/apigateway/security/package-info.kt @@ -0,0 +1,2 @@ +package com.jmsoftware.maf.apigateway.security + diff --git a/api-gateway/api-gateway-biz/src/test/java/com/jmsoftware/maf/apigateway/package-info.java b/api-gateway/api-gateway-biz/src/test/java/com/jmsoftware/maf/apigateway/package-info.java deleted file mode 100644 index 1f6f99b5..00000000 --- a/api-gateway/api-gateway-biz/src/test/java/com/jmsoftware/maf/apigateway/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package com.jmsoftware.maf.apigateway; diff --git a/api-gateway/api-gateway-biz/src/test/java/com/jmsoftware/maf/apigateway/package-info.kt b/api-gateway/api-gateway-biz/src/test/java/com/jmsoftware/maf/apigateway/package-info.kt new file mode 100644 index 00000000..238d8d7a --- /dev/null +++ b/api-gateway/api-gateway-biz/src/test/java/com/jmsoftware/maf/apigateway/package-info.kt @@ -0,0 +1 @@ +package com.jmsoftware.maf.apigateway diff --git a/api-gateway/api-gateway-bootstrap/pom.xml b/api-gateway/api-gateway-bootstrap/pom.xml index fdbda28e..8d1bc2d1 100644 --- a/api-gateway/api-gateway-bootstrap/pom.xml +++ b/api-gateway/api-gateway-bootstrap/pom.xml @@ -10,7 +10,7 @@ com.jmsoftware.maf api-gateway - 0.0.8.1 + 0.0.9 @@ -30,44 +30,6 @@ - - org.apache.maven.plugins - maven-pmd-plugin - ${maven-pmd-plugin.version} - - ${project.build.sourceEncoding} - ${java.version} - true - - rulesets/java/ali-comment.xml - rulesets/java/ali-concurrent.xml - rulesets/java/ali-constant.xml - rulesets/java/ali-exception.xml - rulesets/java/ali-flowcontrol.xml - rulesets/java/ali-naming.xml - rulesets/java/ali-oop.xml - rulesets/java/ali-orm.xml - rulesets/java/ali-other.xml - rulesets/java/ali-set.xml - - - - - verify - - check - - - - - - com.alibaba.p3c - p3c-pmd - ${p3c-pmd.version} - - - - com.google.cloud.tools @@ -100,12 +62,16 @@ - - adoptopenjdk/openjdk11:${adoptopenjdk11.tag} + + eclipse-temurin:${temurin.tag} docker.io/ijohnnymiller/${project.baseArtifactId}.${project.parent.artifactId} + ${git.commit.id.abbrev}-${project.version} @@ -132,31 +98,6 @@ - - - - io.github.git-commit-id - git-commit-id-maven-plugin - 5.0.0 - - - get-the-git-info - - revision - - initialize - - - - true - ${project.build.outputDirectory}/git.properties - - ^git.build.(time|version)$ - ^git.commit.id.(abbrev|full)$ - - full - - diff --git a/api-gateway/api-gateway-bootstrap/src/main/java/com/jmsoftware/maf/apigateway/ApiGatewayApplication.java b/api-gateway/api-gateway-bootstrap/src/main/java/com/jmsoftware/maf/apigateway/ApiGatewayApplication.java deleted file mode 100644 index b148d84f..00000000 --- a/api-gateway/api-gateway-bootstrap/src/main/java/com/jmsoftware/maf/apigateway/ApiGatewayApplication.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.jmsoftware.maf.apigateway; - -import com.jmsoftware.maf.reactivespringcloudstarter.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.util.StopWatch; - -/** - *

ApiGatewayApplication

- *

- * Change description here. - * - * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 12/22/2020 3:39 PM - **/ -@Slf4j -@EnableDiscoveryClient -@SpringBootApplication -@SuppressWarnings("scwjava_Createprivateconstructorforutilityclassallfieldsmethodsarestatic") -public class ApiGatewayApplication { - public static void main(String[] args) { - val stopWatch = new StopWatch(); - stopWatch.start(); - val configurableApplicationContext = SpringApplication.run(ApiGatewayApplication.class, args); - val springBootStartupHelper = configurableApplicationContext.getBean(SpringBootStartupHelper.class); - springBootStartupHelper.stop(stopWatch); - } -} diff --git a/api-gateway/api-gateway-bootstrap/src/main/java/com/jmsoftware/maf/apigateway/ApiGatewayApplication.kt b/api-gateway/api-gateway-bootstrap/src/main/java/com/jmsoftware/maf/apigateway/ApiGatewayApplication.kt new file mode 100644 index 00000000..ed6638eb --- /dev/null +++ b/api-gateway/api-gateway-bootstrap/src/main/java/com/jmsoftware/maf/apigateway/ApiGatewayApplication.kt @@ -0,0 +1,28 @@ +package com.jmsoftware.maf.apigateway + +import com.jmsoftware.maf.reactivespringcloudstarter.helper.SpringBootStartupHelper +import org.springframework.boot.autoconfigure.SpringBootApplication +import org.springframework.boot.runApplication +import org.springframework.cloud.client.discovery.EnableDiscoveryClient +import org.springframework.util.StopWatch + +/** + * # ApiGatewayApplication + * + * Change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/17/22 8:48 AM + */ +@EnableDiscoveryClient +@SpringBootApplication +class ApiGatewayApplication + +fun main(args: Array) { + StopWatch().let { + it.start() + runApplication(*args) + .getBean(SpringBootStartupHelper::class.java) + .stop(it) + } +} + diff --git a/api-gateway/api-gateway-bootstrap/src/main/resources/application.yml b/api-gateway/api-gateway-bootstrap/src/main/resources/application.yml index ffcfe31a..e5eba1d9 100644 --- a/api-gateway/api-gateway-bootstrap/src/main/resources/application.yml +++ b/api-gateway/api-gateway-bootstrap/src/main/resources/application.yml @@ -21,7 +21,7 @@ spring: config: # `default-context` should not be modified, keeps "application" for common configuration. # Properties in the config/application folder are applicable to all applications using consul for configuration. - profile-separator: "::" + profile-separator: "@" format: YAML data-key: "data" watch: diff --git a/api-gateway/api-gateway-bootstrap/src/test/java/com/jmsoftware/maf/apigateway/ApiGatewayApplicationTests.java b/api-gateway/api-gateway-bootstrap/src/test/java/com/jmsoftware/maf/apigateway/ApiGatewayApplicationTests.java deleted file mode 100644 index 2ffb2727..00000000 --- a/api-gateway/api-gateway-bootstrap/src/test/java/com/jmsoftware/maf/apigateway/ApiGatewayApplicationTests.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.jmsoftware.maf.apigateway; - -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -class ApiGatewayApplicationTests { - - @Test - void contextLoads() { - } - -} diff --git a/api-gateway/api-gateway-bootstrap/src/test/java/com/jmsoftware/maf/apigateway/AuthorizationTests.java b/api-gateway/api-gateway-bootstrap/src/test/java/com/jmsoftware/maf/apigateway/AuthorizationTests.java deleted file mode 100644 index d5f826ce..00000000 --- a/api-gateway/api-gateway-bootstrap/src/test/java/com/jmsoftware/maf/apigateway/AuthorizationTests.java +++ /dev/null @@ -1,25 +0,0 @@ -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 -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-gateway/api-gateway-bootstrap/src/test/java/com/jmsoftware/maf/apigateway/AuthorizationTests.kt b/api-gateway/api-gateway-bootstrap/src/test/java/com/jmsoftware/maf/apigateway/AuthorizationTests.kt new file mode 100644 index 00000000..efd74a74 --- /dev/null +++ b/api-gateway/api-gateway-bootstrap/src/test/java/com/jmsoftware/maf/apigateway/AuthorizationTests.kt @@ -0,0 +1,30 @@ +package com.jmsoftware.maf.apigateway + +import com.jmsoftware.maf.common.util.logger +import org.junit.jupiter.api.Assertions.assertTrue +import org.junit.jupiter.api.Test +import org.springframework.util.AntPathMatcher + +/** + * # AuthorizationTests + * + * Description: AuthorizationTests, change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/16/22 10:15 PM + */ +internal class AuthorizationTests { + companion object { + private val log = logger() + } + + @Test + fun antPathMatcherTests() { + val antPathMatcher = AntPathMatcher() + val urlMatched1 = antPathMatcher.match("/spring-boot-admin/**", "/spring-boot-admin/common/app-info") + log.info("urlMatched1: $urlMatched1") + assertTrue(urlMatched1) + val urlMatched2 = antPathMatcher.match("/**", "/spring-boot-admin/common/app-info") + log.info("urlMatched2: $urlMatched2") + assertTrue(urlMatched2) + } +} diff --git a/api-gateway/api-gateway-domain/pom.xml b/api-gateway/api-gateway-domain/pom.xml index 4c558fee..12820d7b 100644 --- a/api-gateway/api-gateway-domain/pom.xml +++ b/api-gateway/api-gateway-domain/pom.xml @@ -10,7 +10,7 @@ com.jmsoftware.maf api-gateway - 0.0.8.1 + 0.0.9 diff --git a/api-gateway/api-gateway-domain/src/main/java/com/jmsoftware/maf/apigateway/package-info.java b/api-gateway/api-gateway-domain/src/main/java/com/jmsoftware/maf/apigateway/package-info.java deleted file mode 100644 index 1f6f99b5..00000000 --- a/api-gateway/api-gateway-domain/src/main/java/com/jmsoftware/maf/apigateway/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package com.jmsoftware.maf.apigateway; diff --git a/api-gateway/api-gateway-domain/src/main/java/com/jmsoftware/maf/apigateway/package-info.kt b/api-gateway/api-gateway-domain/src/main/java/com/jmsoftware/maf/apigateway/package-info.kt new file mode 100644 index 00000000..238d8d7a --- /dev/null +++ b/api-gateway/api-gateway-domain/src/main/java/com/jmsoftware/maf/apigateway/package-info.kt @@ -0,0 +1 @@ +package com.jmsoftware.maf.apigateway diff --git a/api-gateway/api-gateway-domain/src/main/java/com/jmsoftware/maf/apigateway/remote/AuthCenterWebClientService.kt b/api-gateway/api-gateway-domain/src/main/java/com/jmsoftware/maf/apigateway/remote/AuthCenterWebClientService.kt new file mode 100644 index 00000000..cf2ed24a --- /dev/null +++ b/api-gateway/api-gateway-domain/src/main/java/com/jmsoftware/maf/apigateway/remote/AuthCenterWebClientService.kt @@ -0,0 +1,57 @@ +package com.jmsoftware.maf.apigateway.remote + +import com.jmsoftware.maf.common.domain.authcenter.permission.GetPermissionListByRoleIdListPayload +import com.jmsoftware.maf.common.domain.authcenter.permission.Permission +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 org.springframework.validation.annotation.Validated +import reactor.core.publisher.Mono +import javax.validation.Valid +import javax.validation.constraints.Min +import javax.validation.constraints.NotBlank +import javax.validation.constraints.NotNull + +/** + * # AuthCenterWebClientService + * + * Change description here. + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, 4/16/22 9:37 PM + **/ +@Validated +interface AuthCenterWebClientService { + /** + * Get user by login token + * + * @param loginToken + * @return + */ + fun getUserByLoginToken(loginToken: @NotBlank String): Mono + + /** + * Get role list by user id + * + * @param userId + * @return role list + */ + fun getRoleListByUserId(userId: @NotNull @Min(1L) Long): Mono> + + /** + * Get permission list by role id list + * + * @param payload + * @return permission list + */ + fun getPermissionListByRoleIdList( + payload: @Valid @NotNull GetPermissionListByRoleIdListPayload + ): Mono> + + /** + * Parse + * + * @param authorization + * @return jwt + */ + fun parse(authorization: @NotBlank String): Mono +} diff --git a/api-gateway/api-gateway-domain/src/main/java/com/jmsoftware/maf/apigateway/remote/impl/AuthCenterWebClientServiceImpl.kt b/api-gateway/api-gateway-domain/src/main/java/com/jmsoftware/maf/apigateway/remote/impl/AuthCenterWebClientServiceImpl.kt new file mode 100644 index 00000000..b84e777f --- /dev/null +++ b/api-gateway/api-gateway-domain/src/main/java/com/jmsoftware/maf/apigateway/remote/impl/AuthCenterWebClientServiceImpl.kt @@ -0,0 +1,39 @@ +package com.jmsoftware.maf.apigateway.remote.impl + +import com.jmsoftware.maf.apigateway.remote.AuthCenterWebClient +import com.jmsoftware.maf.apigateway.remote.AuthCenterWebClientService +import com.jmsoftware.maf.common.domain.authcenter.permission.GetPermissionListByRoleIdListPayload +import com.jmsoftware.maf.common.domain.authcenter.permission.Permission +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 org.springframework.stereotype.Service +import reactor.core.publisher.Mono +import javax.validation.Valid +import javax.validation.constraints.Min +import javax.validation.constraints.NotBlank +import javax.validation.constraints.NotNull + +/** + * # AuthCenterWebClientServiceImpl + * + * Change description here. + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, 4/16/22 9:40 PM + **/ +@Service +class AuthCenterWebClientServiceImpl( + private val authCenterWebClient: AuthCenterWebClient +) : AuthCenterWebClientService { + override fun getUserByLoginToken(loginToken: @NotBlank String): Mono = + authCenterWebClient.getUserByLoginToken(loginToken) + + override fun getRoleListByUserId(userId: @NotNull @Min(1L) Long): Mono> = + authCenterWebClient.getRoleListByUserId(userId) + + override fun getPermissionListByRoleIdList( + payload: @Valid @NotNull GetPermissionListByRoleIdListPayload + ): Mono> = authCenterWebClient.getPermissionListByRoleIdList(payload) + + override fun parse(authorization: String): Mono = authCenterWebClient.parse(authorization) +} diff --git a/api-gateway/api-gateway-domain/src/test/java/com/jmsoftware/maf/apigateway/package-info.java b/api-gateway/api-gateway-domain/src/test/java/com/jmsoftware/maf/apigateway/package-info.java deleted file mode 100644 index 1f6f99b5..00000000 --- a/api-gateway/api-gateway-domain/src/test/java/com/jmsoftware/maf/apigateway/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package com.jmsoftware.maf.apigateway; diff --git a/api-gateway/api-gateway-domain/src/test/java/com/jmsoftware/maf/apigateway/package-info.kt b/api-gateway/api-gateway-domain/src/test/java/com/jmsoftware/maf/apigateway/package-info.kt new file mode 100644 index 00000000..238d8d7a --- /dev/null +++ b/api-gateway/api-gateway-domain/src/test/java/com/jmsoftware/maf/apigateway/package-info.kt @@ -0,0 +1 @@ +package com.jmsoftware.maf.apigateway diff --git a/api-gateway/api-gateway-infra/pom.xml b/api-gateway/api-gateway-infra/pom.xml index cd6697ee..fb19a183 100644 --- a/api-gateway/api-gateway-infra/pom.xml +++ b/api-gateway/api-gateway-infra/pom.xml @@ -10,6 +10,6 @@ com.jmsoftware.maf api-gateway - 0.0.8.1 + 0.0.9 diff --git a/api-gateway/api-gateway-infra/src/main/java/com/jmsoftware/maf/apigateway/package-info.java b/api-gateway/api-gateway-infra/src/main/java/com/jmsoftware/maf/apigateway/package-info.java deleted file mode 100644 index 1f6f99b5..00000000 --- a/api-gateway/api-gateway-infra/src/main/java/com/jmsoftware/maf/apigateway/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package com.jmsoftware.maf.apigateway; diff --git a/api-gateway/api-gateway-infra/src/main/java/com/jmsoftware/maf/apigateway/package-info.kt b/api-gateway/api-gateway-infra/src/main/java/com/jmsoftware/maf/apigateway/package-info.kt new file mode 100644 index 00000000..7e8d17b3 --- /dev/null +++ b/api-gateway/api-gateway-infra/src/main/java/com/jmsoftware/maf/apigateway/package-info.kt @@ -0,0 +1,2 @@ +package com.jmsoftware.maf.apigateway + diff --git a/api-gateway/api-gateway-infra/src/main/java/com/jmsoftware/maf/apigateway/remote/AuthCenterRemoteApi.java b/api-gateway/api-gateway-infra/src/main/java/com/jmsoftware/maf/apigateway/remote/AuthCenterRemoteApi.java deleted file mode 100644 index 86f2799a..00000000 --- a/api-gateway/api-gateway-infra/src/main/java/com/jmsoftware/maf/apigateway/remote/AuthCenterRemoteApi.java +++ /dev/null @@ -1,115 +0,0 @@ -package com.jmsoftware.maf.apigateway.remote; - -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.reactive.function.client.WebClient; -import reactor.core.publisher.Mono; - -import javax.validation.Valid; -import javax.validation.constraints.Min; -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 webClient; - - /** - * 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(@NotBlank String loginToken) { - return this.webClient - .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 @Min(1L) Long userId) { - return this.webClient - .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 @NotNull GetPermissionListByRoleIdListPayload payload - ) { - return this.webClient - .get() - .uri(uriBuilder -> uriBuilder - .host(SERVICE_NAME) - .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 this.webClient - .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/api-gateway/api-gateway-infra/src/main/java/com/jmsoftware/maf/apigateway/remote/AuthCenterWebClient.kt b/api-gateway/api-gateway-infra/src/main/java/com/jmsoftware/maf/apigateway/remote/AuthCenterWebClient.kt new file mode 100644 index 00000000..b19ef257 --- /dev/null +++ b/api-gateway/api-gateway-infra/src/main/java/com/jmsoftware/maf/apigateway/remote/AuthCenterWebClient.kt @@ -0,0 +1,121 @@ +package com.jmsoftware.maf.apigateway.remote + +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.Permission +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 org.springframework.http.HttpHeaders +import org.springframework.stereotype.Service +import org.springframework.validation.annotation.Validated +import org.springframework.web.reactive.function.client.WebClient +import org.springframework.web.util.UriBuilder +import reactor.core.publisher.Mono +import javax.validation.Valid +import javax.validation.constraints.Min +import javax.validation.constraints.NotBlank +import javax.validation.constraints.NotNull + +/** + * # AuthCenterWebClient + * + * Change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/16/22 9:36 PM + */ +@Service +@Validated +@Suppress("HttpUrlsUsage") +class AuthCenterWebClient( + private val webClient: WebClient +) { + companion object { + private const val SERVICE_NAME = "auth-center" + } + + /** + * Gets user by login token. + * + * @param loginToken the login token, e.q. username, email or phone number + * @return the user by login token + */ + fun getUserByLoginToken(loginToken: @NotBlank String): Mono { + return webClient + .get() + .uri("http://$SERVICE_NAME/user-remote-api/users/{loginToken}", loginToken) + .retrieve() + .bodyToMono(ResponseBodyBean::class.java) + .mapNotNull(ResponseBodyBean<*>::data) + .map { data: Any? -> JSONUtil.toBean(JSONUtil.parseObj(data), GetUserByLoginTokenResponse::class.java) } + } + + /** + * Gets role list by user id. + * + * @param userId the user id + * @return the role list by user id + */ + fun getRoleListByUserId(userId: @NotNull @Min(1L) Long): Mono> { + return webClient + .get() + .uri("http://$SERVICE_NAME/role-remote-api/roles/{userId}", userId) + .retrieve() + .bodyToMono(ResponseBodyBean::class.java) + .mapNotNull(ResponseBodyBean<*>::data) + .map { data: Any? -> + JSONUtil.toList( + JSONUtil.parseObj(data).getJSONArray("roleList"), + GetRoleListByUserIdSingleResponse::class.java + ) + } + } + + /** + * Get permission list by role id list + * + * @param payload the payload + * @return the response body bean + */ + fun getPermissionListByRoleIdList( + payload: @Valid @NotNull GetPermissionListByRoleIdListPayload + ): Mono> { + return webClient + .get() + .uri { uriBuilder: UriBuilder -> + uriBuilder + .host(SERVICE_NAME) + .path("/permission-remote-api/permissions") + .queryParam("roleIdList", payload.roleIdList.joinToString(",")) + .queryParam("permissionTypeList", payload.permissionTypeList.joinToString(",")) + .build() + } + .retrieve() + .bodyToMono(ResponseBodyBean::class.java) + .mapNotNull(ResponseBodyBean<*>::data) + .map { data: Any? -> + JSONUtil.toList( + JSONUtil.parseObj(data).getJSONArray("permissionList"), + Permission::class.java + ) + } + } + + /** + * Parse JWT. + * + * @param authorization the authorization + * @return the mono + */ + fun parse(authorization: @NotBlank String): Mono { + return webClient + .get() + .uri("http://auth-center/jwt-remote-api/parse") + .headers { httpHeaders: HttpHeaders -> httpHeaders[HttpHeaders.AUTHORIZATION] = authorization } + .retrieve() + .bodyToMono(ResponseBodyBean::class.java) + .mapNotNull(ResponseBodyBean<*>::data) + .map { data: Any? -> JSONUtil.toBean(JSONUtil.parseObj(data), ParseJwtResponse::class.java) } + } +} diff --git a/api-gateway/api-gateway-infra/src/test/java/com/jmsoftware/maf/apigateway/package-info.java b/api-gateway/api-gateway-infra/src/test/java/com/jmsoftware/maf/apigateway/package-info.java deleted file mode 100644 index 1f6f99b5..00000000 --- a/api-gateway/api-gateway-infra/src/test/java/com/jmsoftware/maf/apigateway/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package com.jmsoftware.maf.apigateway; diff --git a/api-gateway/api-gateway-infra/src/test/java/com/jmsoftware/maf/apigateway/package-info.kt b/api-gateway/api-gateway-infra/src/test/java/com/jmsoftware/maf/apigateway/package-info.kt new file mode 100644 index 00000000..238d8d7a --- /dev/null +++ b/api-gateway/api-gateway-infra/src/test/java/com/jmsoftware/maf/apigateway/package-info.kt @@ -0,0 +1 @@ +package com.jmsoftware.maf.apigateway diff --git a/api-gateway/api-gateway-message/pom.xml b/api-gateway/api-gateway-message/pom.xml index a1332911..4b881bbb 100644 --- a/api-gateway/api-gateway-message/pom.xml +++ b/api-gateway/api-gateway-message/pom.xml @@ -10,7 +10,7 @@ com.jmsoftware.maf api-gateway - 0.0.8.1 + 0.0.9 diff --git a/api-gateway/api-gateway-message/src/main/java/com/jmsoftware/maf/apigateway/package-info.java b/api-gateway/api-gateway-message/src/main/java/com/jmsoftware/maf/apigateway/package-info.java deleted file mode 100644 index 1f6f99b5..00000000 --- a/api-gateway/api-gateway-message/src/main/java/com/jmsoftware/maf/apigateway/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package com.jmsoftware.maf.apigateway; diff --git a/api-gateway/api-gateway-message/src/main/java/com/jmsoftware/maf/apigateway/package-info.kt b/api-gateway/api-gateway-message/src/main/java/com/jmsoftware/maf/apigateway/package-info.kt new file mode 100644 index 00000000..238d8d7a --- /dev/null +++ b/api-gateway/api-gateway-message/src/main/java/com/jmsoftware/maf/apigateway/package-info.kt @@ -0,0 +1 @@ +package com.jmsoftware.maf.apigateway diff --git a/api-gateway/api-gateway-message/src/test/java/com/jmsoftware/maf/apigateway/package-info.java b/api-gateway/api-gateway-message/src/test/java/com/jmsoftware/maf/apigateway/package-info.java deleted file mode 100644 index 1f6f99b5..00000000 --- a/api-gateway/api-gateway-message/src/test/java/com/jmsoftware/maf/apigateway/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package com.jmsoftware.maf.apigateway; diff --git a/api-gateway/api-gateway-message/src/test/java/com/jmsoftware/maf/apigateway/package-info.kt b/api-gateway/api-gateway-message/src/test/java/com/jmsoftware/maf/apigateway/package-info.kt new file mode 100644 index 00000000..238d8d7a --- /dev/null +++ b/api-gateway/api-gateway-message/src/test/java/com/jmsoftware/maf/apigateway/package-info.kt @@ -0,0 +1 @@ +package com.jmsoftware.maf.apigateway diff --git a/api-gateway/api-gateway-web/pom.xml b/api-gateway/api-gateway-web/pom.xml index 5d43cd7b..69bab109 100644 --- a/api-gateway/api-gateway-web/pom.xml +++ b/api-gateway/api-gateway-web/pom.xml @@ -10,7 +10,7 @@ com.jmsoftware.maf api-gateway - 0.0.8.1 + 0.0.9 diff --git a/api-gateway/api-gateway-web/src/main/java/com/jmsoftware/maf/apigateway/configuration/DiscoveryRouteConfiguration.java b/api-gateway/api-gateway-web/src/main/java/com/jmsoftware/maf/apigateway/configuration/DiscoveryRouteConfiguration.java deleted file mode 100644 index dec84897..00000000 --- a/api-gateway/api-gateway-web/src/main/java/com/jmsoftware/maf/apigateway/configuration/DiscoveryRouteConfiguration.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.jmsoftware.maf.apigateway.configuration; - -import cn.hutool.core.util.ObjectUtil; -import com.jmsoftware.maf.apigateway.property.RedisRateLimiterConfigurationProperties; -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 RedisRateLimiterConfigurationProperties redisRateLimiterConfigurationProperties; - - /** - * 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.redisRateLimiterConfigurationProperties.getReplenishRate()); - filter.addArg(BURST_CAPACITY_KEY, this.redisRateLimiterConfigurationProperties.getBurstCapacity()); - filter.addArg(REQUESTED_TOKENS_KEY, this.redisRateLimiterConfigurationProperties.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/api-gateway/api-gateway-web/src/main/java/com/jmsoftware/maf/apigateway/configuration/DiscoveryRouteConfiguration.kt b/api-gateway/api-gateway-web/src/main/java/com/jmsoftware/maf/apigateway/configuration/DiscoveryRouteConfiguration.kt new file mode 100644 index 00000000..6cd8d302 --- /dev/null +++ b/api-gateway/api-gateway-web/src/main/java/com/jmsoftware/maf/apigateway/configuration/DiscoveryRouteConfiguration.kt @@ -0,0 +1,112 @@ +package com.jmsoftware.maf.apigateway.configuration + +import com.jmsoftware.maf.apigateway.property.RedisRateLimiterConfigurationProperties +import com.jmsoftware.maf.common.util.logger +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 org.springframework.web.server.ServerWebExchange +import reactor.core.publisher.Mono +import javax.annotation.PostConstruct + +/** + * # DiscoveryRouteConfiguration + * + * Description: DiscoveryRouteConfiguration, change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/16/22 10:19 PM + */ +@Configuration +class DiscoveryRouteConfiguration( + private val discoveryLocatorProperties: DiscoveryLocatorProperties, + private val redisRateLimiterConfigurationProperties: RedisRateLimiterConfigurationProperties +) { + companion object { + private val log = logger() + const val 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. + */ + const val 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. + */ + const val 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`. + */ + const val REQUESTED_TOKENS_KEY = "redis-rate-limiter.requestedTokens" + } + + /** + * Configure + * [The Redis `RateLimiter`](https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#the-redis-ratelimiter). + * + * ## Algorithm + * + * The token bucket algorithm can be conceptually understood as follows: + * + * - A token is added to the bucket every 1 / r {\\displaystyle 1/r} ![1/r](https://wikimedia.org/api/rest_v1/media/math/render/svg/2ab96580d23ec5eff6bb0e666531eccb7a8035d6) seconds. + * - The bucket can hold at the most b {\\displaystyle b} ![b](https://wikimedia.org/api/rest_v1/media/math/render/svg/f11423fbb2e967f986e36804a8ae4271734917c3) tokens. If a token arrives when the bucket is full, it is discarded. + * - When a packet (network layer [PDU](https://en.wikipedia.org/wiki/Protocol_data_unit "Protocol data unit")) of _n_ bytes arrives, + * - if at least _n_ tokens are in the bucket, _n_ tokens are removed from the bucket, and the packet is sent to the network. + * - if fewer than _n_ tokens are available, no tokens are removed from the bucket, and the packet is considered to be _non-conformant_. + * + * ### Variations + * + * Implementers of this algorithm on platforms lacking the clock resolution necessary to add a single token to the bucket every 1 / r {\\displaystyle 1/r} ![1/r](https://wikimedia.org/api/rest_v1/media/math/render/svg/2ab96580d23ec5eff6bb0e666531eccb7a8035d6) seconds may want to consider an alternative formulation. Given the ability to update the token bucket every S milliseconds, the number of tokens to add every S milliseconds = ( r ∗ S ) / 1000 {\\displaystyle (r\*S)/1000} ![(r*S)/1000](https://wikimedia.org/api/rest_v1/media/math/render/svg/8346b25098bc785ea08018e719e9073e308d1bed) . + * + * ### Properties + * + * #### Average rate + * + * Over the long run the output of conformant packets is limited by the token rate, r {\\displaystyle r} ![r](https://wikimedia.org/api/rest_v1/media/math/render/svg/0d1ecb613aa2984f0576f70f86650b7c2a132538) . + * + * #### Burst size + * + * Let M {\\displaystyle M} ![M](https://wikimedia.org/api/rest_v1/media/math/render/svg/f82cade9898ced02fdd08712e5f0c0151758a0dd) be the maximum possible transmission rate in bytes/second. + * + * Then T max \= { b / ( M − r ) if r < M ∞ otherwise {\\displaystyle T\_{\\text{max}}={\\begin{cases}b/(M-r)&{\\text{ if }}rThe Redis RateLimiter + */ + @PostConstruct + fun postConstruct() { + val filter = FilterDefinition() + filter.name = REQUEST_RATE_LIMITER_FILTER_NAME + filter.addArg(REPLENISH_RATE_KEY, redisRateLimiterConfigurationProperties.replenishRate) + filter.addArg(BURST_CAPACITY_KEY, redisRateLimiterConfigurationProperties.burstCapacity) + filter.addArg(REQUESTED_TOKENS_KEY, redisRateLimiterConfigurationProperties.requestedTokens) + discoveryLocatorProperties.filters.add(filter) + log.info("Added filter [$REQUEST_RATE_LIMITER_FILTER_NAME] for discovery services, filters: ${discoveryLocatorProperties.filters}") + } + + @Bean + @Primary + fun ipKeyResolver(): KeyResolver { + return KeyResolver { exchange: ServerWebExchange -> + val remoteAddress = exchange.request.remoteAddress + if (remoteAddress != null) { + Mono.just(remoteAddress.hostName) + } else { + Mono.just("unknown-address") + } + } + } +} diff --git a/api-gateway/api-gateway-web/src/main/java/com/jmsoftware/maf/apigateway/configuration/OpenApiConfiguration.java b/api-gateway/api-gateway-web/src/main/java/com/jmsoftware/maf/apigateway/configuration/OpenApiConfiguration.java deleted file mode 100644 index 9f2ac4ce..00000000 --- a/api-gateway/api-gateway-web/src/main/java/com/jmsoftware/maf/apigateway/configuration/OpenApiConfiguration.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.jmsoftware.maf.apigateway.configuration; - -import cn.hutool.core.collection.CollUtil; -import com.jmsoftware.maf.apigateway.property.SwaggerConfigurationProperties; -import com.jmsoftware.maf.reactivespringcloudstarter.property.MafProjectProperties; -import io.swagger.v3.oas.models.OpenAPI; -import io.swagger.v3.oas.models.info.Contact; -import io.swagger.v3.oas.models.info.Info; -import io.swagger.v3.oas.models.info.License; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import lombok.val; -import org.springdoc.core.AbstractSwaggerUiConfigProperties; -import org.springdoc.core.GroupedOpenApi; -import org.springdoc.core.SwaggerUiConfigProperties; -import org.springframework.cloud.client.discovery.DiscoveryClient; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import java.util.List; - -/** - *

OpenApiConfiguration

- *

- * Change description here. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com, 2/1/22 11:51 PM - **/ -@Slf4j -@Configuration -@RequiredArgsConstructor -public class OpenApiConfiguration { - private static final String SWAGGER_API_URI = "/v3/api-docs"; - private final SwaggerConfigurationProperties swaggerConfigurationProperties; - private final SwaggerUiConfigProperties swaggerUiConfigProperties; - private final MafProjectProperties mafProjectProperties; - private final DiscoveryClient discoveryClient; - - @Bean - public OpenAPI openApi() { - val projectArtifactId = this.mafProjectProperties.getProjectArtifactId(); - val version = this.mafProjectProperties.getVersion(); - val developerEmail = this.mafProjectProperties.getDeveloperEmail(); - val developerUrl = this.mafProjectProperties.getDeveloperUrl(); - return new OpenAPI() - .info( - new Info() - .title(String.format("API for %s@%s", projectArtifactId, version)) - .description( - String.format("%s, artifact ID: %s, environment: %s", - this.mafProjectProperties.getDescription(), - projectArtifactId, - this.mafProjectProperties.getEnvironment()) - ) - .contact( - new Contact() - .name(this.mafProjectProperties.getDeveloperName()) - .email(developerEmail) - .url(developerUrl) - ) - .version(version) - .license(new License().name("LinkedIn").url(developerUrl)) - ); - } - - @Bean - public List groupedOpenApiList() { - val services = CollUtil.newArrayList(this.discoveryClient.getServices()); - services.add(this.mafProjectProperties.getProjectArtifactId()); - val groups = CollUtil.newArrayList(); - this.swaggerUiConfigProperties.setUrls(CollUtil.newHashSet()); - services.forEach(serviceName -> { - if (!CollUtil.contains(this.swaggerConfigurationProperties.getIgnoredServiceIds(), serviceName)) { - log.warn("Found discovery client. Service name: {}", serviceName); - groups.add(GroupedOpenApi.builder().pathsToMatch("/" + serviceName + "/**").group(serviceName).build()); - val swaggerUrl = new AbstractSwaggerUiConfigProperties.SwaggerUrl(); - swaggerUrl.setUrl(serviceName + SWAGGER_API_URI); - swaggerUrl.setName(serviceName); - this.swaggerUiConfigProperties.getUrls().add(swaggerUrl); - } - }); - return groups; - } -} diff --git a/api-gateway/api-gateway-web/src/main/java/com/jmsoftware/maf/apigateway/configuration/OpenApiConfiguration.kt b/api-gateway/api-gateway-web/src/main/java/com/jmsoftware/maf/apigateway/configuration/OpenApiConfiguration.kt new file mode 100644 index 00000000..92cedeea --- /dev/null +++ b/api-gateway/api-gateway-web/src/main/java/com/jmsoftware/maf/apigateway/configuration/OpenApiConfiguration.kt @@ -0,0 +1,79 @@ +package com.jmsoftware.maf.apigateway.configuration + +import cn.hutool.core.collection.CollUtil +import com.jmsoftware.maf.apigateway.property.SwaggerConfigurationProperties +import com.jmsoftware.maf.common.util.logger +import com.jmsoftware.maf.reactivespringcloudstarter.property.MafProjectProperties +import io.swagger.v3.oas.models.OpenAPI +import io.swagger.v3.oas.models.info.Contact +import io.swagger.v3.oas.models.info.Info +import io.swagger.v3.oas.models.info.License +import org.springdoc.core.AbstractSwaggerUiConfigProperties.SwaggerUrl +import org.springdoc.core.GroupedOpenApi +import org.springdoc.core.SwaggerUiConfigProperties +import org.springframework.cloud.client.discovery.DiscoveryClient +import org.springframework.context.annotation.Bean +import org.springframework.context.annotation.Configuration + +/** + *

OpenApiConfiguration

+ * + * + * Change description here. + * + * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com, 2/1/22 11:51 PM + */ +@Configuration +class OpenApiConfiguration( + private val swaggerConfigurationProperties: SwaggerConfigurationProperties, + private val swaggerUiConfigProperties: SwaggerUiConfigProperties, + private val mafProjectProperties: MafProjectProperties, + private val discoveryClient: DiscoveryClient +) { + companion object { + private const val SWAGGER_API_URI = "/v3/api-docs" + private val log = logger() + } + + @Bean + fun openApi(): OpenAPI { + val projectArtifactId = mafProjectProperties.projectArtifactId + val version = mafProjectProperties.version + val developerEmail = mafProjectProperties.developerEmail + val developerUrl = mafProjectProperties.developerUrl + return OpenAPI() + .info( + Info() + .title("API for $projectArtifactId@$version") + .description("$mafProjectProperties.description, artifact ID: $projectArtifactId, environment: ${mafProjectProperties.environment}") + .contact( + Contact() + .name(mafProjectProperties.developerName) + .email(developerEmail) + .url(developerUrl) + ) + .version(version) + .license(License().name("LinkedIn").url(developerUrl)) + ) + } + + @Bean + fun groupedOpenApiList(): List { + val groups = mutableListOf() + swaggerUiConfigProperties.urls = mutableSetOf() + mutableListOf().apply { + this.addAll(discoveryClient.services) + this.add(mafProjectProperties.projectArtifactId) + }.forEach { serviceName: String -> + if (!CollUtil.contains(swaggerConfigurationProperties.ignoredServiceIds, serviceName)) { + log.warn("Found discovery client. Service name: $serviceName") + groups.add(GroupedOpenApi.builder().pathsToMatch("/$serviceName/**").group(serviceName).build()) + val swaggerUrl = SwaggerUrl() + swaggerUrl.url = serviceName + SWAGGER_API_URI + swaggerUrl.name = serviceName + swaggerUiConfigProperties.urls.add(swaggerUrl) + } + } + return groups + } +} diff --git a/api-gateway/api-gateway-web/src/main/java/com/jmsoftware/maf/apigateway/configuration/RedirectConfiguration.java b/api-gateway/api-gateway-web/src/main/java/com/jmsoftware/maf/apigateway/configuration/RedirectConfiguration.java deleted file mode 100644 index 844d927c..00000000 --- a/api-gateway/api-gateway-web/src/main/java/com/jmsoftware/maf/apigateway/configuration/RedirectConfiguration.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.jmsoftware.maf.apigateway.configuration; - -import lombok.extern.slf4j.Slf4j; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.reactive.function.server.RouterFunction; -import org.springframework.web.reactive.function.server.ServerResponse; - -import javax.annotation.PostConstruct; -import java.net.URI; - -import static org.springframework.web.reactive.function.server.RequestPredicates.GET; -import static org.springframework.web.reactive.function.server.RouterFunctions.route; - -/** - *

RedirectConfiguration

- *

- * Redirect Configuration. - * - * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com - * @date 2/15/20 11:54 PM - **/ -@Slf4j -@Configuration -public class RedirectConfiguration { - @PostConstruct - private void postConstruct() { - log.info("URL redirect service initialized."); - } - - @Bean - public RouterFunction home() { - return route(GET("/"), request -> { - log.info("Redirect to Home page."); - return ServerResponse.temporaryRedirect(URI.create("/static/home.html")).build(); - }); - } - - @Bean - public RouterFunction doc() { - return route(GET("/doc"), request -> { - log.info("Redirect to Bootstrap Swagger API documentation."); - return ServerResponse.temporaryRedirect(URI.create("/doc.html")).build(); - }); - } - - @Bean - public RouterFunction favicon() { - return route(GET("/favicon.ico"), request -> { - log.info("Redirect to favicon."); - return ServerResponse.temporaryRedirect(URI.create("/static/asset/favicon.ico")).build(); - }); - } -} diff --git a/api-gateway/api-gateway-web/src/main/java/com/jmsoftware/maf/apigateway/configuration/RedirectConfiguration.kt b/api-gateway/api-gateway-web/src/main/java/com/jmsoftware/maf/apigateway/configuration/RedirectConfiguration.kt new file mode 100644 index 00000000..6735b318 --- /dev/null +++ b/api-gateway/api-gateway-web/src/main/java/com/jmsoftware/maf/apigateway/configuration/RedirectConfiguration.kt @@ -0,0 +1,54 @@ +package com.jmsoftware.maf.apigateway.configuration + +import com.jmsoftware.maf.common.util.logger +import org.springframework.context.annotation.Bean +import org.springframework.context.annotation.Configuration +import org.springframework.web.reactive.function.server.RequestPredicates +import org.springframework.web.reactive.function.server.RouterFunction +import org.springframework.web.reactive.function.server.RouterFunctions +import org.springframework.web.reactive.function.server.ServerResponse +import java.net.URI +import javax.annotation.PostConstruct + +/** + * # RedirectConfiguration + * + * Redirect Configuration. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/16/22 10:31 PM + */ +@Configuration +class RedirectConfiguration { + companion object { + private val log = logger() + } + + @PostConstruct + private fun postConstruct() { + log.info("URL redirect service initialized.") + } + + @Bean + fun home(): RouterFunction { + return RouterFunctions.route(RequestPredicates.GET("/")) { + log.info("Redirect to Home page.") + ServerResponse.temporaryRedirect(URI.create("/static/home.html")).build() + } + } + + @Bean + fun doc(): RouterFunction { + return RouterFunctions.route(RequestPredicates.GET("/doc")) { + log.info("Redirect to Bootstrap Swagger API documentation.") + ServerResponse.temporaryRedirect(URI.create("/doc.html")).build() + } + } + + @Bean + fun favicon(): RouterFunction { + return RouterFunctions.route(RequestPredicates.GET("/favicon.ico")) { + log.info("Redirect to favicon.") + ServerResponse.temporaryRedirect(URI.create("/static/asset/favicon.ico")).build() + } + } +} diff --git a/api-gateway/api-gateway-web/src/main/java/com/jmsoftware/maf/apigateway/configuration/WebFluxSecurityConfiguration.java b/api-gateway/api-gateway-web/src/main/java/com/jmsoftware/maf/apigateway/configuration/WebFluxSecurityConfiguration.java deleted file mode 100644 index 2c029700..00000000 --- a/api-gateway/api-gateway-web/src/main/java/com/jmsoftware/maf/apigateway/configuration/WebFluxSecurityConfiguration.java +++ /dev/null @@ -1,112 +0,0 @@ -package com.jmsoftware.maf.apigateway.configuration; - -import cn.hutool.core.util.BooleanUtil; -import com.google.common.collect.Lists; -import com.jmsoftware.maf.apigateway.remote.AuthCenterRemoteApi; -import com.jmsoftware.maf.apigateway.security.impl.*; -import com.jmsoftware.maf.reactivespringcloudstarter.property.MafConfigurationProperties; -import com.jmsoftware.maf.reactivespringcloudstarter.util.ResponseUtil; -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 MafConfigurationProperties mafConfigurationProperties; - private final AuthCenterRemoteApi authCenterRemoteApi; - - @Bean - SecurityWebFilterChain springWebFilterChain(ServerHttpSecurity http, - ServerAuthenticationEntryPoint serverAuthenticationEntryPoint, - ServerAccessDeniedHandler serverAccessDeniedHandler, - ServerSecurityContextRepository serverSecurityContextRepository, - ReactiveAuthenticationManager reactiveAuthenticationManager, - ReactiveAuthorizationManager reactiveAuthorizationManager) { - if (BooleanUtil.isFalse(this.mafConfigurationProperties.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.mafConfigurationProperties.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.mafConfigurationProperties.flattenIgnoredUrls()).permitAll() - .pathMatchers(HttpMethod.OPTIONS).permitAll() - // Authorization - .anyExchange().access(reactiveAuthorizationManager) - .and() - .build(); - } - - @Bean - public ServerAuthenticationEntryPoint serverAuthenticationEntryPoint(ResponseUtil responseUtil) { - return new ServerAuthenticationEntryPointImpl(responseUtil); - } - - @Bean - public ServerAccessDeniedHandler serverAccessDeniedHandler(ResponseUtil responseUtil) { - return new GatewayServerAccessDeniedHandlerImpl(responseUtil); - } - - @Bean - public PasswordEncoder passwordEncoder() { - return new BCryptPasswordEncoder(); - } - - @Bean - public ServerSecurityContextRepository serverSecurityContextRepository(ReactiveAuthenticationManager reactiveAuthenticationManager) { - return new JwtReactiveServerSecurityContextRepositoryImpl(this.mafConfigurationProperties, 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/api-gateway-web/src/main/java/com/jmsoftware/maf/apigateway/configuration/WebFluxSecurityConfiguration.kt b/api-gateway/api-gateway-web/src/main/java/com/jmsoftware/maf/apigateway/configuration/WebFluxSecurityConfiguration.kt new file mode 100644 index 00000000..f1f9c7bb --- /dev/null +++ b/api-gateway/api-gateway-web/src/main/java/com/jmsoftware/maf/apigateway/configuration/WebFluxSecurityConfiguration.kt @@ -0,0 +1,118 @@ +package com.jmsoftware.maf.apigateway.configuration + +import cn.hutool.core.util.BooleanUtil +import com.jmsoftware.maf.apigateway.remote.AuthCenterWebClientService +import com.jmsoftware.maf.apigateway.security.impl.* +import com.jmsoftware.maf.common.util.logger +import com.jmsoftware.maf.reactivespringcloudstarter.property.MafConfigurationProperties +import com.jmsoftware.maf.reactivespringcloudstarter.util.ResponseUtil +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 + +/** + * # WebFluxSecurityConfiguration + * + * Description: WebFluxSecurityConfiguration, change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/17/22 7:52 AM + * @see Kotlin Configuration + * @see + * Spring Secirity Reference - Reactive Applications + * @see + * Securing Spring WebFlux Reactive APIs with JWT Auth + * @see + * SpringCloud Gateway 整合 Spring Security Webflux 的关键点(痛点解析),及示例项目 + */ +@Configuration +@EnableWebFluxSecurity +class WebFluxSecurityConfiguration( + private val mafConfigurationProperties: MafConfigurationProperties, + private val authCenterWebClientService: AuthCenterWebClientService +) { + companion object { + private val log = logger() + } + + @Bean + fun springWebFilterChain( + http: ServerHttpSecurity, + serverAuthenticationEntryPoint: ServerAuthenticationEntryPoint, + serverAccessDeniedHandler: ServerAccessDeniedHandler, + serverSecurityContextRepository: ServerSecurityContextRepository, + reactiveAuthenticationManager: ReactiveAuthenticationManager, + reactiveAuthorizationManager: ReactiveAuthorizationManager + ): SecurityWebFilterChain { + if (BooleanUtil.isFalse(mafConfigurationProperties.webSecurityEnabled)) { + log.warn("Web security was disabled.") + return http + .cors().disable() + .csrf().disable() + .build() + } + val ignoredUrls = mafConfigurationProperties.flattenIgnoredUrls().toTypedArray() + log.warn("Spring Security will ignore following URLs: $ignoredUrls") + return http + .cors().disable() + .csrf().disable() + .formLogin().disable() + .httpBasic().disable() + .exceptionHandling() + .authenticationEntryPoint(serverAuthenticationEntryPoint) + .accessDeniedHandler(serverAccessDeniedHandler) + .and() // Authentication + .securityContextRepository(serverSecurityContextRepository) + .authenticationManager(reactiveAuthenticationManager) + .authorizeExchange() + .pathMatchers(*ignoredUrls).permitAll() + .pathMatchers(HttpMethod.OPTIONS).permitAll() // Authorization + .anyExchange().access(reactiveAuthorizationManager) + .and() + .build() + } + + @Bean + fun serverAuthenticationEntryPoint(responseUtil: ResponseUtil): ServerAuthenticationEntryPoint { + return ServerAuthenticationEntryPointImpl(responseUtil) + } + + @Bean + fun serverAccessDeniedHandler(responseUtil: ResponseUtil): ServerAccessDeniedHandler { + return GatewayServerAccessDeniedHandlerImpl(responseUtil) + } + + @Bean + fun passwordEncoder(): PasswordEncoder { + return BCryptPasswordEncoder() + } + + @Bean + fun serverSecurityContextRepository(reactiveAuthenticationManager: ReactiveAuthenticationManager): ServerSecurityContextRepository { + return JwtReactiveServerSecurityContextRepositoryImpl( + mafConfigurationProperties, + reactiveAuthenticationManager, + authCenterWebClientService + ) + } + + @Bean + fun reactiveAuthenticationManager(): ReactiveAuthenticationManager { + return JwtReactiveAuthenticationManagerImpl(authCenterWebClientService) + } + + @Bean + fun reactiveAuthorizationManager(): ReactiveAuthorizationManager { + return RbacReactiveAuthorizationManagerImpl(authCenterWebClientService) + } +} diff --git a/api-gateway/api-gateway-web/src/main/java/com/jmsoftware/maf/apigateway/handler/GlobalExceptionHandler.java b/api-gateway/api-gateway-web/src/main/java/com/jmsoftware/maf/apigateway/handler/GlobalExceptionHandler.java deleted file mode 100644 index c366c6d6..00000000 --- a/api-gateway/api-gateway-web/src/main/java/com/jmsoftware/maf/apigateway/handler/GlobalExceptionHandler.java +++ /dev/null @@ -1,94 +0,0 @@ -package com.jmsoftware.maf.apigateway.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/api-gateway-web/src/main/java/com/jmsoftware/maf/apigateway/handler/GlobalExceptionHandler.kt b/api-gateway/api-gateway-web/src/main/java/com/jmsoftware/maf/apigateway/handler/GlobalExceptionHandler.kt new file mode 100644 index 00000000..d3741528 --- /dev/null +++ b/api-gateway/api-gateway-web/src/main/java/com/jmsoftware/maf/apigateway/handler/GlobalExceptionHandler.kt @@ -0,0 +1,88 @@ +package com.jmsoftware.maf.apigateway.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.common.util.logger +import com.jmsoftware.maf.reactivespringcloudstarter.util.getRequesterIpAndPort +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, 4/16/22 11:49 AM + **/ +@Order(-1) +@Component +class GlobalExceptionHandler( + private val objectMapper: ObjectMapper +) : ErrorWebExceptionHandler { + companion object { + private val log = logger() + } + + override fun handle(exchange: ServerWebExchange, ex: Throwable): Mono { + val request = exchange.request + log.error("Exception occurred when [${getRequesterIpAndPort(request)}] requested access. Exception message: ${ex.message}. Request URL: [${request.method}] ${request.uri}") + val response = exchange.response + 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.headers.contentType = MediaType.APPLICATION_JSON + return response.writeWith(Mono.fromSupplier { + val bufferFactory = response.bufferFactory() + val responseBody: ResponseBodyBean<*> = setResponseBody(response, ex) + try { + return@fromSupplier bufferFactory.wrap(objectMapper.writeValueAsBytes(responseBody)) + } catch (e: JsonProcessingException) { + log.warn("Exception occurred when writing response", e) + return@fromSupplier bufferFactory.wrap(e.message!!.toByteArray(StandardCharsets.UTF_8)) + } + }) + } + + private fun setResponseBody(response: ServerHttpResponse, ex: Throwable): ResponseBodyBean<*> { + when (ex) { + is ResponseStatusException -> { + response.statusCode = ex.status + return ResponseBodyBean.ofStatus(ex.status) + } + is SecurityException -> { + val status = HttpStatus.valueOf(ex.code) + response.statusCode = status + return ResponseBodyBean.ofStatus(status, ex.message) + } + is WebClientResponseException -> { + response.statusCode = ex.statusCode + return try { + objectMapper.readValue(ex.responseBodyAsString, ResponseBodyBean::class.java) + } catch (e: JsonProcessingException) { + log.warn("Exception occurred when writing response. Exception message: ${e.message}") + ResponseBodyBean.ofStatus(ex.statusCode, ex.getResponseBodyAsString(StandardCharsets.UTF_8)) + } + } + else -> { + response.statusCode = HttpStatus.INTERNAL_SERVER_ERROR + return ResponseBodyBean.ofStatus( + HttpStatus.INTERNAL_SERVER_ERROR, + "Exception message: ${ex.message}" + ) + } + } + } +} diff --git a/api-gateway/api-gateway-web/src/main/java/com/jmsoftware/maf/apigateway/property/RedisRateLimiterConfigurationProperties.java b/api-gateway/api-gateway-web/src/main/java/com/jmsoftware/maf/apigateway/property/RedisRateLimiterConfigurationProperties.java deleted file mode 100644 index 899a9b67..00000000 --- a/api-gateway/api-gateway-web/src/main/java/com/jmsoftware/maf/apigateway/property/RedisRateLimiterConfigurationProperties.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.jmsoftware.maf.apigateway.property; - -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; - -/** - *

RedisRateLimiterConfigurationProperties

- * - * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 3/1/2021 9:59 AM - */ -@Data -@Validated -@RefreshScope -@Configuration -@ConfigurationProperties(prefix = RedisRateLimiterConfigurationProperties.PREFIX) -public class RedisRateLimiterConfigurationProperties { - /** - * 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/api-gateway-web/src/main/java/com/jmsoftware/maf/apigateway/property/RedisRateLimiterConfigurationProperties.kt b/api-gateway/api-gateway-web/src/main/java/com/jmsoftware/maf/apigateway/property/RedisRateLimiterConfigurationProperties.kt new file mode 100644 index 00000000..6897a0b0 --- /dev/null +++ b/api-gateway/api-gateway-web/src/main/java/com/jmsoftware/maf/apigateway/property/RedisRateLimiterConfigurationProperties.kt @@ -0,0 +1,40 @@ +package com.jmsoftware.maf.apigateway.property + +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 + +/** + * # RedisRateLimiterConfigurationProperties + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/16/22 10:34 PM + */ +@Validated +@RefreshScope +@Configuration +@ConfigurationProperties(prefix = RedisRateLimiterConfigurationProperties.PREFIX) +class RedisRateLimiterConfigurationProperties { + companion object { + /** + * The constant PREFIX. + */ + const val PREFIX = "maf.configuration.redis-rate-limiter" + } + + /** + * The Replenish rate. + */ + lateinit var replenishRate: @NotBlank String + + /** + * The Burst capacity. + */ + lateinit var burstCapacity: @NotBlank String + + /** + * The Requested tokens. + */ + lateinit var requestedTokens: @NotBlank String +} diff --git a/api-gateway/api-gateway-web/src/main/java/com/jmsoftware/maf/apigateway/property/SwaggerConfigurationProperties.java b/api-gateway/api-gateway-web/src/main/java/com/jmsoftware/maf/apigateway/property/SwaggerConfigurationProperties.java deleted file mode 100644 index dda03fe0..00000000 --- a/api-gateway/api-gateway-web/src/main/java/com/jmsoftware/maf/apigateway/property/SwaggerConfigurationProperties.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.jmsoftware.maf.apigateway.property; - -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; - -/** - *

SwaggerConfigurationProperties

- * - * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 2/7/2021 3:28 PM - **/ -@Data -@Validated -@RefreshScope -@Configuration -@ConfigurationProperties(prefix = SwaggerConfigurationProperties.PREFIX) -public class SwaggerConfigurationProperties { - public static final String PREFIX = "maf.configuration.swagger"; - /** - * Ignored service id set - */ - @NotEmpty - private Set<@NotBlank String> ignoredServiceIds; -} diff --git a/api-gateway/api-gateway-web/src/main/java/com/jmsoftware/maf/apigateway/property/SwaggerConfigurationProperties.kt b/api-gateway/api-gateway-web/src/main/java/com/jmsoftware/maf/apigateway/property/SwaggerConfigurationProperties.kt new file mode 100644 index 00000000..73a5f3a9 --- /dev/null +++ b/api-gateway/api-gateway-web/src/main/java/com/jmsoftware/maf/apigateway/property/SwaggerConfigurationProperties.kt @@ -0,0 +1,27 @@ +package com.jmsoftware.maf.apigateway.property + +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.NotEmpty + +/** + *

SwaggerConfigurationProperties

+ * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 2/7/2021 3:28 PM + */ +@Validated +@RefreshScope +@Configuration +@ConfigurationProperties(prefix = SwaggerConfigurationProperties.PREFIX) +class SwaggerConfigurationProperties { + companion object { + const val PREFIX = "maf.configuration.swagger" + } + + /** + * Ignored service id set + */ + lateinit var ignoredServiceIds: @NotEmpty Set +} diff --git a/api-gateway/api-gateway-web/src/test/java/com/jmsoftware/maf/apigateway/package-info.java b/api-gateway/api-gateway-web/src/test/java/com/jmsoftware/maf/apigateway/package-info.java deleted file mode 100644 index 1f6f99b5..00000000 --- a/api-gateway/api-gateway-web/src/test/java/com/jmsoftware/maf/apigateway/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package com.jmsoftware.maf.apigateway; diff --git a/api-gateway/api-gateway-web/src/test/java/com/jmsoftware/maf/apigateway/package-info.kt b/api-gateway/api-gateway-web/src/test/java/com/jmsoftware/maf/apigateway/package-info.kt new file mode 100644 index 00000000..238d8d7a --- /dev/null +++ b/api-gateway/api-gateway-web/src/test/java/com/jmsoftware/maf/apigateway/package-info.kt @@ -0,0 +1 @@ +package com.jmsoftware.maf.apigateway diff --git a/api-gateway/pom.xml b/api-gateway/pom.xml index 89851117..de1daff0 100644 --- a/api-gateway/pom.xml +++ b/api-gateway/pom.xml @@ -10,7 +10,7 @@ com.jmsoftware.maf muscle-and-fitness-server - 0.0.8.1 + 0.0.9 pom @@ -82,17 +82,6 @@ - - org.springframework.boot - spring-boot-starter-test - test - - - org.junit.vintage - junit-vintage-engine - - - io.projectreactor reactor-test diff --git a/auth-center/auth-center-biz/pom.xml b/auth-center/auth-center-biz/pom.xml index b07a966c..e9b53ca2 100644 --- a/auth-center/auth-center-biz/pom.xml +++ b/auth-center/auth-center-biz/pom.xml @@ -10,7 +10,7 @@ com.jmsoftware.maf auth-center - 0.0.8.1 + 0.0.9 diff --git a/auth-center/auth-center-biz/src/main/java/com/jmsoftware/maf/authcenter/permission/configuration/PermissionConfiguration.java b/auth-center/auth-center-biz/src/main/java/com/jmsoftware/maf/authcenter/permission/configuration/PermissionConfiguration.java deleted file mode 100644 index 73567962..00000000 --- a/auth-center/auth-center-biz/src/main/java/com/jmsoftware/maf/authcenter/permission/configuration/PermissionConfiguration.java +++ /dev/null @@ -1,27 +0,0 @@ -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/auth-center-biz/src/main/java/com/jmsoftware/maf/authcenter/permission/package-info.kt b/auth-center/auth-center-biz/src/main/java/com/jmsoftware/maf/authcenter/permission/package-info.kt new file mode 100644 index 00000000..9bd0fd89 --- /dev/null +++ b/auth-center/auth-center-biz/src/main/java/com/jmsoftware/maf/authcenter/permission/package-info.kt @@ -0,0 +1 @@ +package com.jmsoftware.maf.authcenter.permission diff --git a/auth-center/auth-center-biz/src/main/java/com/jmsoftware/maf/authcenter/permission/service/PermissionService.java b/auth-center/auth-center-biz/src/main/java/com/jmsoftware/maf/authcenter/permission/service/PermissionService.java deleted file mode 100644 index 53abc5c9..00000000 --- a/auth-center/auth-center-biz/src/main/java/com/jmsoftware/maf/authcenter/permission/service/PermissionService.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.jmsoftware.maf.authcenter.permission.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.jmsoftware.maf.authcenter.permission.response.GetServicesInfoResponse; -import com.jmsoftware.maf.authcenter.permission.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.PermissionType; -import com.jmsoftware.maf.common.exception.BizException; -import org.springframework.validation.annotation.Validated; - -import javax.validation.Valid; -import javax.validation.constraints.NotEmpty; -import java.util.List; - -/** - *

PermissionService

- *

- * Service of Permission.(Permission) - * - * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com - * @date 5 /11/20 8:34 AM - */ -@Validated -public interface PermissionService extends IService { - /** - * Gets permission list by role id list. - * - * @param payload the payload - * @return the permission list by role id list - */ - GetPermissionListByRoleIdListResponse getPermissionListByRoleIdList(@Valid GetPermissionListByRoleIdListPayload payload); - - /** - * Gets permission list by 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(@NotEmpty List roleIdList, - @NotEmpty List permissionTypeList); - - /** - * Gets services info. - * - * @return the services info - * @throws BizException the business exception - */ - GetServicesInfoResponse getServicesInfo() throws BizException; -} diff --git a/auth-center/auth-center-biz/src/main/java/com/jmsoftware/maf/authcenter/permission/service/PermissionService.kt b/auth-center/auth-center-biz/src/main/java/com/jmsoftware/maf/authcenter/permission/service/PermissionService.kt new file mode 100644 index 00000000..60a37997 --- /dev/null +++ b/auth-center/auth-center-biz/src/main/java/com/jmsoftware/maf/authcenter/permission/service/PermissionService.kt @@ -0,0 +1,33 @@ +package com.jmsoftware.maf.authcenter.permission.service + +import com.jmsoftware.maf.authcenter.permission.response.GetServicesInfoResponse +import com.jmsoftware.maf.common.domain.authcenter.permission.GetPermissionListByRoleIdListPayload +import com.jmsoftware.maf.common.domain.authcenter.permission.GetPermissionListByRoleIdListResponse +import org.springframework.validation.annotation.Validated +import javax.validation.Valid +import javax.validation.constraints.NotNull + +/** + * Description: PermissionServiceImpl, change description here. + * + * @author Johnny Miller (鍾俊), e-mail: johnnysviva@outlook.com, date: 2/18/2022 11:22 PM + **/ +@Validated +interface PermissionService { + /** + * Gets permission list by role id list. + * + * @param payload the payload + * @return the permission list by role id list + */ + fun getPermissionListByRoleIdList( + payload: @Valid @NotNull GetPermissionListByRoleIdListPayload + ): GetPermissionListByRoleIdListResponse + + /** + * Gets services info. + * + * @return the services info + */ + fun getServicesInfo(): GetServicesInfoResponse +} diff --git a/auth-center/auth-center-biz/src/main/java/com/jmsoftware/maf/authcenter/permission/service/impl/PermissionServiceImpl.java b/auth-center/auth-center-biz/src/main/java/com/jmsoftware/maf/authcenter/permission/service/impl/PermissionServiceImpl.java deleted file mode 100644 index 391976d6..00000000 --- a/auth-center/auth-center-biz/src/main/java/com/jmsoftware/maf/authcenter/permission/service/impl/PermissionServiceImpl.java +++ /dev/null @@ -1,108 +0,0 @@ -package com.jmsoftware.maf.authcenter.permission.service.impl; - -import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.collection.CollUtil; -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.response.GetServicesInfoResponse; -import com.jmsoftware.maf.authcenter.permission.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.PermissionType; -import com.jmsoftware.maf.common.domain.springbootstarter.HttpApiResourcesResponse; -import com.jmsoftware.maf.common.exception.BizException; -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.validation.Valid; -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 - * @date 5/11/20 8:34 AM - */ -@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 adminRole = this.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 -> { - val permission = new GetPermissionListByRoleIdListResponse.Permission(); - BeanUtil.copyProperties(permissionPersistence, permission); - response.getPermissionList().add(permission); - }); - return response; - } - - @Override - public List getPermissionListByRoleIdList(@NotEmpty List roleIdList, - @NotEmpty List permissionTypeList) { - return this.getBaseMapper().selectPermissionListByRoleIdList(roleIdList, permissionTypeList); - } - - @Override - public GetServicesInfoResponse getServicesInfo() throws BizException { - val serviceIdList = this.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: {}", this.permissionConfiguration.getIgnoredServiceIds()); - for (String serviceId : serviceIdList) { - if (CollUtil.contains(this.permissionConfiguration.getIgnoredServiceIds(), serviceId)) { - log.warn("Ignored service ID: {}", serviceId); - continue; - } - ResponseBodyBean responseBodyBean = Optional.ofNullable(this.restTemplate.getForObject( - String.format("http://%s/http-api-resources", serviceId), ResponseBodyBean.class)) - .orElseThrow(() -> new BizException("Internal service mustn't respond null")); - val data = Optional.of(responseBodyBean.getData()) - .orElseThrow(() -> new BizException("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; - } -} diff --git a/auth-center/auth-center-biz/src/main/java/com/jmsoftware/maf/authcenter/permission/service/impl/PermissionServiceImpl.kt b/auth-center/auth-center-biz/src/main/java/com/jmsoftware/maf/authcenter/permission/service/impl/PermissionServiceImpl.kt new file mode 100644 index 00000000..f6c2007f --- /dev/null +++ b/auth-center/auth-center-biz/src/main/java/com/jmsoftware/maf/authcenter/permission/service/impl/PermissionServiceImpl.kt @@ -0,0 +1,110 @@ +@file:Suppress("HttpUrlsUsage") + +package com.jmsoftware.maf.authcenter.permission.service.impl + +import cn.hutool.core.collection.CollUtil +import cn.hutool.core.text.CharSequenceUtil.format +import com.fasterxml.jackson.databind.ObjectMapper +import com.google.common.collect.Lists +import com.jmsoftware.maf.authcenter.permission.configuration.PermissionConfiguration +import com.jmsoftware.maf.authcenter.permission.converter.PermissionMapStructMapper +import com.jmsoftware.maf.authcenter.permission.response.GetServicesInfoResponse +import com.jmsoftware.maf.authcenter.permission.response.GetServicesInfoResponse.ServiceInfo +import com.jmsoftware.maf.authcenter.permission.service.PermissionDomainService +import com.jmsoftware.maf.authcenter.permission.service.PermissionService +import com.jmsoftware.maf.authcenter.role.service.RoleDomainService +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.Permission +import com.jmsoftware.maf.common.domain.authcenter.permission.PermissionType +import com.jmsoftware.maf.common.domain.springbootstarter.HttpApiResourcesResponse +import com.jmsoftware.maf.common.util.logger +import com.jmsoftware.maf.springcloudstarter.function.lazyDebug +import org.springframework.cloud.client.discovery.DiscoveryClient +import org.springframework.stereotype.Service +import org.springframework.web.client.RestTemplate +import java.util.* +import javax.validation.Valid +import javax.validation.constraints.NotNull + +/** + * # PermissionServiceImpl + * + * Change description here. + * + * @author Johnny Miller (鍾俊), e-mail: johnnysviva@outlook.com, date: 2/18/2022 11:37 PM + */ +@Service +class PermissionServiceImpl( + private val permissionDomainService: PermissionDomainService, + private val roleDomainService: RoleDomainService, + private val discoveryClient: DiscoveryClient, + private val restTemplate: RestTemplate, + private val permissionConfiguration: PermissionConfiguration, + private val objectMapper: ObjectMapper, +) : PermissionService { + companion object { + private val log = logger() + } + + override fun getPermissionListByRoleIdList( + payload: @Valid @NotNull GetPermissionListByRoleIdListPayload + ): GetPermissionListByRoleIdListResponse { + val adminRole = roleDomainService.checkAdmin(payload.roleIdList) + val response = GetPermissionListByRoleIdListResponse() + response.permissionList = Lists.newArrayList() + if (adminRole) { + log.warn("Admin role checked. The role can access any resources") + val permission = Permission() + permission.url = "/**" + permission.type = PermissionType.BUTTON.type + permission.permissionExpression = "admin-permission" + permission.method = "*" + response.permissionList.add(permission) + return response + } + return response.apply { + this.permissionList.addAll( + permissionDomainService.getPermissionListByRoleIdList( + payload.roleIdList, payload.permissionTypeList + ).stream() + .map { permission -> PermissionMapStructMapper.INSTANCE.of(permission) } + .toList() + ) + } + } + + override fun getServicesInfo(): GetServicesInfoResponse { + val serviceIdList = discoveryClient.services + log.info("Getting service info from Service ID list: {}", serviceIdList) + val response = GetServicesInfoResponse() + log.info("Ignored service ID: {}", permissionConfiguration.ignoredServiceIds) + response.list = serviceIdList.stream() + .filter { serviceId: String -> + !CollUtil.contains( + permissionConfiguration.ignoredServiceIds, + serviceId + ) + } + .parallel() + .map { serviceId: String -> + val responseBodyBean = restTemplate.getForObject( + format("http://{}/http-api-resources", serviceId), ResponseBodyBean::class.java, + )!! + val httpApiResourcesResponse = objectMapper.convertValue( + Objects.requireNonNull(responseBodyBean).data, + HttpApiResourcesResponse::class.java + ) + val serviceInfo = ServiceInfo() + serviceInfo.serviceId = serviceId + serviceInfo.httpApiResources = httpApiResourcesResponse + lazyDebug(log) { "Added serviceInfo: $serviceInfo" } + serviceInfo + }.toList() + if (CollUtil.isEmpty(response.list)) { + log.warn("Got am empty ServiceInfo list") + } + return response + } +} diff --git a/auth-center/auth-center-biz/src/main/java/com/jmsoftware/maf/authcenter/permission/service/package-info.kt b/auth-center/auth-center-biz/src/main/java/com/jmsoftware/maf/authcenter/permission/service/package-info.kt new file mode 100644 index 00000000..7095635a --- /dev/null +++ b/auth-center/auth-center-biz/src/main/java/com/jmsoftware/maf/authcenter/permission/service/package-info.kt @@ -0,0 +1 @@ +package com.jmsoftware.maf.authcenter.permission.service diff --git a/auth-center/auth-center-biz/src/main/java/com/jmsoftware/maf/authcenter/role/package-info.java b/auth-center/auth-center-biz/src/main/java/com/jmsoftware/maf/authcenter/role/package-info.java deleted file mode 100644 index abf521f5..00000000 --- a/auth-center/auth-center-biz/src/main/java/com/jmsoftware/maf/authcenter/role/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package com.jmsoftware.maf.authcenter.role; diff --git a/auth-center/auth-center-biz/src/main/java/com/jmsoftware/maf/authcenter/role/package-info.kt b/auth-center/auth-center-biz/src/main/java/com/jmsoftware/maf/authcenter/role/package-info.kt new file mode 100644 index 00000000..a937619c --- /dev/null +++ b/auth-center/auth-center-biz/src/main/java/com/jmsoftware/maf/authcenter/role/package-info.kt @@ -0,0 +1 @@ +package com.jmsoftware.maf.authcenter.role diff --git a/auth-center/auth-center-biz/src/main/java/com/jmsoftware/maf/authcenter/role/service/RoleService.java b/auth-center/auth-center-biz/src/main/java/com/jmsoftware/maf/authcenter/role/service/RoleService.java deleted file mode 100644 index 0c798e78..00000000 --- a/auth-center/auth-center-biz/src/main/java/com/jmsoftware/maf/authcenter/role/service/RoleService.java +++ /dev/null @@ -1,75 +0,0 @@ -package com.jmsoftware.maf.authcenter.role.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.jmsoftware.maf.authcenter.role.RoleExcelBean; -import com.jmsoftware.maf.authcenter.role.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.Valid; -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; -import java.util.List; - -/** - *

RoleService

- *

- * Service of Role.(Role) - * - * @author Johnny Miller (锺俊) - * @date 2020 -05-10 22:39:49 - */ -@Validated -public interface RoleService extends IService { - String ROLE_TEMPLATE_EXCEL = "role-stat.xlsx"; - - /** - * Gets role list by user id. - * - * @param userId the user id - * @return the role list by user id - */ - GetRoleListByUserIdResponse getRoleList(@NotNull Long userId); - - /** - * Gets role list by user id. - * - * @param userId the user id - * @return the role list by user id - */ - List getRoleListByUserId(@NonNull Long userId); - - /** - * Check admin boolean. - * - * @param roleIdList the role id list - * @return the boolean - */ - boolean checkAdmin(@NotEmpty List<@NotNull Long> roleIdList); - - /** - * Gets list for exporting. - * - * @return the list for exporting - */ - List getListForExporting(); - - /** - * Validate before add to bean list boolean. - * - * @param beanList the bean list - * @param bean the bean - * @param index the index - * @throws IllegalArgumentException the illegal argument exception - */ - void validateBeforeAddToBeanList(List beanList, RoleExcelBean bean, int index) throws IllegalArgumentException; - - /** - * Save. - * - * @param beanList the bean list - */ - void save(@NotEmpty List<@Valid RoleExcelBean> beanList); -} diff --git a/auth-center/auth-center-biz/src/main/java/com/jmsoftware/maf/authcenter/role/service/impl/RoleServiceImpl.java b/auth-center/auth-center-biz/src/main/java/com/jmsoftware/maf/authcenter/role/service/impl/RoleServiceImpl.java deleted file mode 100644 index a9892e5d..00000000 --- a/auth-center/auth-center-biz/src/main/java/com/jmsoftware/maf/authcenter/role/service/impl/RoleServiceImpl.java +++ /dev/null @@ -1,126 +0,0 @@ -package com.jmsoftware.maf.authcenter.role.service.impl; - -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 cn.hutool.extra.validation.ValidationUtil; -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.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.jmsoftware.maf.authcenter.role.RoleExcelBean; -import com.jmsoftware.maf.authcenter.role.constant.RoleRedisKey; -import com.jmsoftware.maf.authcenter.role.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.GetRoleListByUserIdResponse; -import com.jmsoftware.maf.common.domain.authcenter.role.GetRoleListByUserIdSingleResponse; -import com.jmsoftware.maf.springcloudstarter.property.MafConfigurationProperties; -import com.jmsoftware.maf.springcloudstarter.property.MafProjectProperties; -import lombok.NonNull; -import lombok.RequiredArgsConstructor; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import lombok.val; -import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import javax.validation.Valid; -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 (锺俊) - * @date 2020-05-10 22:39:50 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class RoleServiceImpl - extends ServiceImpl - implements RoleService { - private final MafProjectProperties mafProjectProperties; - private final MafConfigurationProperties mafConfigurationProperties; - private final RedisTemplate redisTemplate; - private final ObjectMapper objectMapper; - - @Override - @SneakyThrows({JsonProcessingException.class}) - public GetRoleListByUserIdResponse getRoleList(@NotNull Long userId) { - val key = String.format(String.format("%s%s", this.mafProjectProperties.getProjectParentArtifactId(), - RoleRedisKey.GET_ROLE_LIST_BY_USER_ID.getKeyInfixFormat()), userId); - val hasKey = this.redisTemplate.hasKey(key); - if (BooleanUtil.isTrue(hasKey)) { - return this.objectMapper.readValue(this.redisTemplate.opsForValue().get(key), - GetRoleListByUserIdResponse.class); - } - val response = new GetRoleListByUserIdResponse(); - response.setRoleList(this.getRoleListByUserId(userId)); - this.redisTemplate.opsForValue().set(key, this.objectMapper.writeValueAsString(response), - RandomUtil.randomLong(1, 7), - TimeUnit.DAYS); - return response; - } - - @Override - public List getRoleListByUserId(@NonNull Long userId) { - return this.getBaseMapper().selectRoleListByUserId(userId); - } - - @Override - 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(this.mafConfigurationProperties.getSuperUserRole(), roleName)) - .collect(Collectors.toSet()); - // If roleNameSet is not empty (contains "admin") - return CollUtil.isNotEmpty(roleNameSet); - } - - @Override - public List getListForExporting() { - val rolePage = new Page(1, 500); - this.page(rolePage); - return rolePage - .getRecords() - .stream() - .map(RoleExcelBean::transformBy) - .collect(Collectors.toList()); - } - - @Override - public void validateBeforeAddToBeanList(List beanList, RoleExcelBean bean, int index) throws IllegalArgumentException { - val beanValidationResult = ValidationUtil.warpValidate(bean); - if (!beanValidationResult.isSuccess()) { - log.warn("Validation failed! beanList: {}, bean: {}, index: {}", beanList, bean, index); - val firstErrorMessage = CollUtil.getFirst(beanValidationResult.getErrorMessages()); - throw new IllegalArgumentException( - String.format("%s %s", firstErrorMessage.getPropertyName(), firstErrorMessage.getMessage())); - } - } - - @Override - @Transactional(rollbackFor = Throwable.class) - public void save(@NotEmpty List<@Valid RoleExcelBean> beanList) { - val roleList = beanList.stream().map(RoleExcelBean::transformTo).collect(Collectors.toList()); - val saved = this.saveBatch(roleList); - if (!saved) { - log.error("Cannot save batch role list. {}", roleList); - } - } -} diff --git a/auth-center/auth-center-biz/src/main/java/com/jmsoftware/maf/authcenter/security/package-info.java b/auth-center/auth-center-biz/src/main/java/com/jmsoftware/maf/authcenter/security/package-info.java deleted file mode 100644 index 7b8988ba..00000000 --- a/auth-center/auth-center-biz/src/main/java/com/jmsoftware/maf/authcenter/security/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package com.jmsoftware.maf.authcenter.security; diff --git a/auth-center/auth-center-biz/src/main/java/com/jmsoftware/maf/authcenter/security/service/impl/JwtServiceImpl.java b/auth-center/auth-center-biz/src/main/java/com/jmsoftware/maf/authcenter/security/service/impl/JwtServiceImpl.java deleted file mode 100644 index 7c00d499..00000000 --- a/auth-center/auth-center-biz/src/main/java/com/jmsoftware/maf/authcenter/security/service/impl/JwtServiceImpl.java +++ /dev/null @@ -1,172 +0,0 @@ -package com.jmsoftware.maf.authcenter.security.service.impl; - -import cn.hutool.core.date.DateUtil; -import cn.hutool.core.text.CharSequenceUtil; -import cn.hutool.core.util.ObjectUtil; -import com.jmsoftware.maf.authcenter.security.service.JwtService; -import com.jmsoftware.maf.common.domain.authcenter.security.ParseJwtResponse; -import com.jmsoftware.maf.common.domain.authcenter.security.UserPrincipal; -import com.jmsoftware.maf.common.exception.SecurityException; -import com.jmsoftware.maf.springcloudstarter.property.JwtConfigurationProperties; -import io.jsonwebtoken.*; -import io.jsonwebtoken.security.Keys; -import lombok.RequiredArgsConstructor; -import lombok.SneakyThrows; -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; - -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 JwtConfigurationProperties jwtConfigurationProperties; - private final RedisTemplate redisTemplate; - private SecretKey secretKey; - private JwtParser jwtParser; - - @PostConstruct - private void init() { - log.info("Start to init class members of {}.", this.getClass().getSimpleName()); - this.secretKey = Keys.hmacShaKeyFor(this.jwtConfigurationProperties.getSigningKey().getBytes(StandardCharsets.UTF_8)); - log.warn("Secret key for JWT was generated. Algorithm: {}", this.secretKey.getAlgorithm()); - this.jwtParser = Jwts.parserBuilder().setSigningKey(this.secretKey).build(); - } - - @Override - public String createJwt(Authentication authentication, Boolean rememberMe) { - val userPrincipal = (UserPrincipal) authentication.getPrincipal(); - return this.createJwt(rememberMe, userPrincipal.getId(), userPrincipal.getUsername(), userPrincipal.getRoles(), - userPrincipal.getAuthorities()); - } - - @Override - @SuppressWarnings("scwjava-time_ReplacenewDatewithjava.time") - public String createJwt(Boolean rememberMe, Long id, String subject, List roles, - Collection authorities) { - val now = new Date(); - val builder = Jwts.builder() - .setId(id.toString()) - .setSubject(subject) - .setIssuedAt(now) - .signWith(this.secretKey) - .claim("roles", roles); - // Don't generate authority information in JWT. - // .claim("authorities", authorities) - // Set expire duration of JWT. - val ttl = Boolean.TRUE.equals(rememberMe) ? - this.jwtConfigurationProperties.getTtlForRememberMe() : this.jwtConfigurationProperties.getTtl(); - if (ttl > 0) { - builder.setExpiration(DateUtil.offsetMillisecond(now, ttl.intValue())); - } - val jwt = builder.compact(); - // Store new JWT in Redis - String redisKeyOfJwt = String.format("%s%s", this.jwtConfigurationProperties.getJwtRedisKeyPrefix(), subject); - this.redisTemplate.opsForValue().set(redisKeyOfJwt, jwt, ttl, TimeUnit.MILLISECONDS); - log.info("Storing JWT in Redis. Key: {}, Value: {}", redisKeyOfJwt, jwt); - return jwt; - } - - @Override - public Claims parseJwt(String jwt) throws SecurityException { - Claims claims; - try { - claims = Optional.ofNullable(this.jwtParser.parseClaimsJws(jwt).getBody()) - .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.UNAUTHORIZED, "JWT is expired (JWT itself)"); - } catch (UnsupportedJwtException e) { - log.error("JWT is unsupported. Message: {} JWT: {}", e.getMessage(), jwt); - 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.UNAUTHORIZED, "JWT is invalid"); - } catch (IllegalArgumentException e) { - log.error("The parameter of JWT is invalid. Message: {} JWT: {}", e.getMessage(), jwt); - throw new SecurityException(HttpStatus.UNAUTHORIZED, "The parameter of JWT is invalid"); - } - val username = claims.getSubject(); - val redisKeyOfJwt = this.jwtConfigurationProperties.getJwtRedisKeyPrefix() + username; - // Check if JWT exists - val expire = this.redisTemplate.opsForValue().getOperations().getExpire(redisKeyOfJwt, TimeUnit.MILLISECONDS); - if (ObjectUtil.isNull(expire) || expire <= 0) { - 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 = (String) this.redisTemplate.opsForValue().get(redisKeyOfJwt); - if (!CharSequenceUtil.equals(jwt, jwtInRedis)) { - throw new SecurityException(HttpStatus.UNAUTHORIZED, "JWT is expired (Not equaled)"); - } - return claims; - } - - @Override - public void invalidateJwt(HttpServletRequest request) throws SecurityException { - val jwt = this.getJwtFromRequest(request); - val username = this.getUsernameFromJwt(jwt); - // Delete JWT from redis - String redisKeyOfJwt = String.format("%s%s", this.jwtConfigurationProperties.getJwtRedisKeyPrefix(), username); - val deletedKeyNumber = this.redisTemplate.opsForValue().getOperations().delete(redisKeyOfJwt); - log.error("Invalidate JWT. Redis key of JWT = {}, deleted = {}", redisKeyOfJwt, deletedKeyNumber); - } - - @Override - public String getUsernameFromJwt(String jwt) throws SecurityException { - val claims = this.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(HttpHeaders.AUTHORIZATION); - if (CharSequenceUtil.isNotBlank(bearerToken) - && bearerToken.startsWith(JwtConfigurationProperties.TOKEN_PREFIX)) { - return bearerToken.substring(JwtConfigurationProperties.TOKEN_PREFIX.length()); - } - return null; - } - - @Override - @SneakyThrows - public ParseJwtResponse parse(HttpServletRequest request) { - val jwt = this.getJwtFromRequest(request); - val claims = this.parseJwt(jwt); - val parseJwtResponse = new ParseJwtResponse(); - parseJwtResponse.setId(Long.parseLong(claims.getId())); - parseJwtResponse.setUsername(claims.getSubject()); - return parseJwtResponse; - } -} diff --git a/auth-center/auth-center-biz/src/main/java/com/jmsoftware/maf/authcenter/user/package-info.java b/auth-center/auth-center-biz/src/main/java/com/jmsoftware/maf/authcenter/user/package-info.java deleted file mode 100644 index 069059ce..00000000 --- a/auth-center/auth-center-biz/src/main/java/com/jmsoftware/maf/authcenter/user/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package com.jmsoftware.maf.authcenter.user; diff --git a/auth-center/auth-center-biz/src/main/java/com/jmsoftware/maf/authcenter/user/package-info.kt b/auth-center/auth-center-biz/src/main/java/com/jmsoftware/maf/authcenter/user/package-info.kt new file mode 100644 index 00000000..b707e02d --- /dev/null +++ b/auth-center/auth-center-biz/src/main/java/com/jmsoftware/maf/authcenter/user/package-info.kt @@ -0,0 +1 @@ +package com.jmsoftware.maf.authcenter.user diff --git a/auth-center/auth-center-biz/src/main/java/com/jmsoftware/maf/authcenter/user/service/UserRoleService.java b/auth-center/auth-center-biz/src/main/java/com/jmsoftware/maf/authcenter/user/service/UserRoleService.java deleted file mode 100644 index 2f56a80c..00000000 --- a/auth-center/auth-center-biz/src/main/java/com/jmsoftware/maf/authcenter/user/service/UserRoleService.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.jmsoftware.maf.authcenter.user.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.jmsoftware.maf.authcenter.user.persistence.User; -import com.jmsoftware.maf.authcenter.user.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/auth-center-biz/src/main/java/com/jmsoftware/maf/authcenter/user/service/UserService.java b/auth-center/auth-center-biz/src/main/java/com/jmsoftware/maf/authcenter/user/service/UserService.java deleted file mode 100644 index 6dbab97b..00000000 --- a/auth-center/auth-center-biz/src/main/java/com/jmsoftware/maf/authcenter/user/service/UserService.java +++ /dev/null @@ -1,75 +0,0 @@ -package com.jmsoftware.maf.authcenter.user.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.jmsoftware.maf.authcenter.user.payload.GetUserPageListPayload; -import com.jmsoftware.maf.authcenter.user.payload.GetUserStatusPayload; -import com.jmsoftware.maf.authcenter.user.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 javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; - -/** - *

UserService

- *

- * Service of UserPersistence.(UserPersistence) - * - * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 5/10/20 12:31 PM - */ -@Validated -public interface UserService extends IService { - /** - * Gets user by login token. - * - * @param loginToken the login token - * @return the user by login token - */ - GetUserByLoginTokenResponse getUserByLoginToken(@NotBlank String loginToken); - - /** - * Save user for registering save user for registering response. - * - * @param payload the payload - * @return the save user for registering response - */ - SignupResponse saveUserForSignup(@Valid SignupPayload payload); - - /** - * Login login response. - * - * @param payload the payload - * @return the login response - * @throws SecurityException the security exception - */ - LoginResponse login(@Valid LoginPayload payload) throws SecurityException; - - /** - * Logout boolean. - * - * @param request the request - * @return the boolean - * @throws SecurityException the security exception - */ - boolean logout(HttpServletRequest request) throws SecurityException; - - /** - * Gets user status. - * - * @param payload the payload - * @return the user status - */ - String getUserStatus(@Valid @NotNull GetUserStatusPayload payload); - - /** - * Gets user page list. - * - * @param payload the payload - * @return the user page list - */ - PageResponseBodyBean getUserPageList(@Valid @NotNull GetUserPageListPayload payload); -} diff --git a/auth-center/auth-center-biz/src/main/java/com/jmsoftware/maf/authcenter/user/service/impl/UserRoleServiceImpl.java b/auth-center/auth-center-biz/src/main/java/com/jmsoftware/maf/authcenter/user/service/impl/UserRoleServiceImpl.java deleted file mode 100644 index 99a7ad13..00000000 --- a/auth-center/auth-center-biz/src/main/java/com/jmsoftware/maf/authcenter/user/service/impl/UserRoleServiceImpl.java +++ /dev/null @@ -1,51 +0,0 @@ -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.persistence.Role; -import com.jmsoftware.maf.authcenter.role.service.RoleService; -import com.jmsoftware.maf.authcenter.user.mapper.UserRoleMapper; -import com.jmsoftware.maf.authcenter.user.persistence.User; -import com.jmsoftware.maf.authcenter.user.persistence.UserRole; -import com.jmsoftware.maf.authcenter.user.service.UserRoleService; -import com.jmsoftware.maf.common.exception.BizException; -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({BizException.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(this.roleService.getOne(queryWrapper)) - .orElseThrow(() -> new BizException("Cannot find the role: " + roleName)); - val userRole = new UserRole(); - userRole.setUserId(user.getId()); - userRole.setRoleId(role.getId()); - val saved = this.save(userRole); - if (!saved) { - throw new BizException(String.format("Cannot assign role (%s) to user (%s)", roleName, user.getUsername())); - } - } -} diff --git a/auth-center/auth-center-biz/src/main/java/com/jmsoftware/maf/authcenter/user/service/impl/UserServiceImpl.java b/auth-center/auth-center-biz/src/main/java/com/jmsoftware/maf/authcenter/user/service/impl/UserServiceImpl.java deleted file mode 100644 index 21ce6205..00000000 --- a/auth-center/auth-center-biz/src/main/java/com/jmsoftware/maf/authcenter/user/service/impl/UserServiceImpl.java +++ /dev/null @@ -1,152 +0,0 @@ -package com.jmsoftware.maf.authcenter.user.service.impl; - -import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.collection.ListUtil; -import cn.hutool.core.text.CharSequenceUtil; -import cn.hutool.core.util.BooleanUtil; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.RandomUtil; -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.constant.UserRedisKey; -import com.jmsoftware.maf.authcenter.user.mapper.UserMapper; -import com.jmsoftware.maf.authcenter.user.payload.GetUserPageListPayload; -import com.jmsoftware.maf.authcenter.user.payload.GetUserStatusPayload; -import com.jmsoftware.maf.authcenter.user.persistence.User; -import com.jmsoftware.maf.authcenter.user.service.UserRoleService; -import com.jmsoftware.maf.authcenter.user.service.UserService; -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.property.MafConfigurationProperties; -import com.jmsoftware.maf.springcloudstarter.property.MafProjectProperties; -import com.jmsoftware.maf.springcloudstarter.util.UserUtil; -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.servlet.http.HttpServletRequest; -import javax.validation.Valid; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; -import java.util.concurrent.TimeUnit; - -/** - *

UserServiceImpl

- *

- * Service implementation of UserPersistence.(UserPersistence) - * - * @author Johnny Miller (锺俊) - * @date 2020-05-10 12:08:28 - */ -@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 MafProjectProperties mafProjectProperties; - private final RedisTemplate redisTemplate; - private final UserRoleService userRoleService; - private final MafConfigurationProperties mafConfigurationProperties; - - @Override - public GetUserByLoginTokenResponse getUserByLoginToken(@NotBlank String loginToken) { - val key = String.format(String.format("%s%s", this.mafProjectProperties.getProjectParentArtifactId(), - UserRedisKey.GET_USER_BY_LOGIN_TOKEN.getKeyInfixFormat()), loginToken); - val hasKey = this.redisTemplate.hasKey(key); - if (BooleanUtil.isTrue(hasKey)) { - return JSONUtil.toBean(this.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); - this.redisTemplate.opsForValue().set(key, JSONUtil.toJsonStr(response), RandomUtil.randomLong(1, 7), - TimeUnit.DAYS); - return response; - } - - @Override - @Transactional(rollbackFor = Throwable.class) - public SignupResponse saveUserForSignup(@Valid SignupPayload payload) { - val user = new User(); - user.setUsername(payload.getUsername()); - user.setEmail(payload.getEmail()); - user.setPassword(this.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); - this.userRoleService.assignRoleByRoleName(user, this.mafConfigurationProperties.getGuestUserRole()); - val response = new SignupResponse(); - response.setUserId(user.getId()); - return response; - } - - @Override - 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 = this.bCryptPasswordEncoder.matches(payload.getPassword(), user.getPassword()); - if (!matched) { - throw new SecurityException(HttpStatus.UNAUTHORIZED); - } - val jwt = this.jwtService.createJwt(payload.getRememberMe(), user.getId(), user.getUsername(), null, null); - val response = new LoginResponse(); - response.setGreeting(this.messageSource.getMessage("greeting", null, LocaleContextHolder.getLocale())); - response.setJwt(jwt); - return response; - } - - @Override - public boolean logout(HttpServletRequest request) throws SecurityException { - this.jwtService.invalidateJwt(request); - return true; - } - - @Override - public String getUserStatus(@Valid @NotNull GetUserStatusPayload payload) { - log.info("Current username: {}", UserUtil.getCurrentUsername()); - return UserStatus.ofValue(payload.getStatus()).getDescription(); - } - - @Override - 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 (CharSequenceUtil.isNotBlank(payload.getUsername())) { - queryWrapper.like(User::getUsername, payload.getUsername()); - } - page.setOrders(ListUtil.of(OrderItem.desc(payload.getOrderBy()))); - this.page(page, queryWrapper); - return PageResponseBodyBean.ofSuccess(page.getRecords(), page.getTotal()); - } -} diff --git a/auth-center/auth-center-biz/src/test/java/com/jmsoftware/maf/authcenter/package-info.java b/auth-center/auth-center-biz/src/test/java/com/jmsoftware/maf/authcenter/package-info.java deleted file mode 100644 index e702ef59..00000000 --- a/auth-center/auth-center-biz/src/test/java/com/jmsoftware/maf/authcenter/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package com.jmsoftware.maf.authcenter; diff --git a/auth-center/auth-center-biz/src/test/java/com/jmsoftware/maf/authcenter/package-info.kt b/auth-center/auth-center-biz/src/test/java/com/jmsoftware/maf/authcenter/package-info.kt new file mode 100644 index 00000000..b7191a36 --- /dev/null +++ b/auth-center/auth-center-biz/src/test/java/com/jmsoftware/maf/authcenter/package-info.kt @@ -0,0 +1 @@ +package com.jmsoftware.maf.authcenter diff --git a/auth-center/auth-center-biz/src/test/java/com/jmsoftware/maf/authcenter/permission/service/impl/PermissionServiceImplTest.kt b/auth-center/auth-center-biz/src/test/java/com/jmsoftware/maf/authcenter/permission/service/impl/PermissionServiceImplTest.kt new file mode 100644 index 00000000..734cc581 --- /dev/null +++ b/auth-center/auth-center-biz/src/test/java/com/jmsoftware/maf/authcenter/permission/service/impl/PermissionServiceImplTest.kt @@ -0,0 +1,137 @@ +package com.jmsoftware.maf.authcenter.permission.service.impl + +import cn.hutool.core.util.StrUtil +import com.fasterxml.jackson.databind.ObjectMapper +import com.google.common.collect.Lists +import com.jmsoftware.maf.authcenter.permission.configuration.PermissionConfiguration +import com.jmsoftware.maf.authcenter.permission.response.GetServicesInfoResponse.ServiceInfo +import com.jmsoftware.maf.authcenter.permission.service.PermissionDomainService +import com.jmsoftware.maf.authcenter.role.service.RoleDomainService +import com.jmsoftware.maf.common.bean.ResponseBodyBean +import com.jmsoftware.maf.common.domain.authcenter.permission.GetPermissionListByRoleIdListPayload +import com.jmsoftware.maf.common.domain.springbootstarter.HttpApiResourcesResponse +import com.jmsoftware.maf.common.util.logger +import org.junit.jupiter.api.AfterEach +import org.junit.jupiter.api.Assertions.* +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.extension.ExtendWith +import org.junit.jupiter.api.parallel.Execution +import org.junit.jupiter.api.parallel.ExecutionMode +import org.mockito.ArgumentMatchers.* +import org.mockito.InjectMocks +import org.mockito.Mock +import org.mockito.Mockito.`when` +import org.mockito.Mockito.verify +import org.mockito.junit.jupiter.MockitoExtension +import org.springframework.cloud.client.discovery.DiscoveryClient +import org.springframework.web.bind.annotation.RequestMethod +import org.springframework.web.client.RestTemplate + +/** + * # PermissionServiceImplTest + * + * Description: PermissionServiceImplTest, change description here. + * + * ## Mockito JUnit 5 Extension + * + * There is also a Mockito extension for JUnit 5 that will make the initialization even simpler. + * + * **Pros:** + * + * * No need to call `MockitoAnnotations.openMocks()` + * * Validates framework usage and detects incorrect stubbing + * * Easy to create mocks + * * Very readable + * + * **Cons:** + * + * * Need an extra dependency on `org.mockito:mockito-junit-jupiter`, which has been included by Spring. + * So we don't have to worry about this. + * + * @author Johnny Miller (鍾俊), e-mail: johnnysviva@outlook.com, date: 4/3/22 10:19 PM + * @see Using Mockito with JUnit 5 + * @see YouTube - Using Mockito with JUnit 5 + */ +@Suppress("unused") +@ExtendWith(MockitoExtension::class) +@Execution(ExecutionMode.CONCURRENT) +internal class PermissionServiceImplTest { + companion object { + private val log = logger() + } + + @InjectMocks + lateinit var permissionService: PermissionServiceImpl + + @Mock + lateinit var permissionDomainService: PermissionDomainService + + @Mock + lateinit var roleDomainService: RoleDomainService + + @Mock + lateinit var discoveryClient: DiscoveryClient + + @Mock + lateinit var restTemplate: RestTemplate + + @Mock + lateinit var permissionConfiguration: PermissionConfiguration + + @Mock + lateinit var objectMapper: ObjectMapper + + @BeforeEach + fun setUp() { + log.info("{} setUp", this.javaClass.simpleName) + } + + @AfterEach + fun tearDown() { + log.info("{} tearDown", this.javaClass.simpleName) + } + + @Test + fun getPermissionListByRoleIdList() { + `when`(roleDomainService.checkAdmin(anyList())).thenReturn(false) + `when`(permissionDomainService.getPermissionListByRoleIdList(anyList(), anyList())) + .thenReturn(Lists.newArrayList()) + val payload = GetPermissionListByRoleIdListPayload() + payload.roleIdList = Lists.newArrayList() + payload.permissionTypeList = Lists.newArrayList() + val response = permissionService.getPermissionListByRoleIdList(payload) + log.info("Permission list response: {}", response) + verify(roleDomainService).checkAdmin(anyList()) + verify(permissionDomainService).getPermissionListByRoleIdList(anyList(), anyList()) + assertEquals(0, response.permissionList.size) + } + + @Test + fun getServicesInfo() { + `when`(discoveryClient.services) + .thenReturn(listOf("auth-center", "oss-center", "maf-mis", "api-gateway", "spring-boot-admin")) + `when`(permissionConfiguration.ignoredServiceIds) + .thenReturn(setOf("api-gateway", "spring-boot-admin")) + val httpApiResourcesResponse = HttpApiResourcesResponse() + val element = HttpApiResourcesResponse.HttpApiResource() + element.method = RequestMethod.GET + element.urlPattern = "/api/v1/**" + httpApiResourcesResponse.list.add(element) + `when`(objectMapper.convertValue(any(), any>())) + .thenReturn(httpApiResourcesResponse) + `when`(restTemplate.getForObject(anyString(), any>())) + .thenReturn(ResponseBodyBean.ofSuccess(httpApiResourcesResponse)) + val servicesInfo = permissionService.getServicesInfo() + log.info("Services info: {}", servicesInfo) + verify(discoveryClient).services + assertNotEquals(0, servicesInfo.list.size) + assertTrue( + servicesInfo.list + .stream() + .anyMatch { service: ServiceInfo -> + StrUtil.equalsAnyIgnoreCase(service.serviceId, "auth-center") + } + ) + } +} diff --git a/auth-center/auth-center-bootstrap/pom.xml b/auth-center/auth-center-bootstrap/pom.xml index 00c8801d..0469e2f6 100644 --- a/auth-center/auth-center-bootstrap/pom.xml +++ b/auth-center/auth-center-bootstrap/pom.xml @@ -10,7 +10,7 @@ com.jmsoftware.maf auth-center - 0.0.8.1 + 0.0.9 @@ -30,44 +30,6 @@ - - org.apache.maven.plugins - maven-pmd-plugin - ${maven-pmd-plugin.version} - - ${project.build.sourceEncoding} - ${java.version} - true - - rulesets/java/ali-comment.xml - rulesets/java/ali-concurrent.xml - rulesets/java/ali-constant.xml - rulesets/java/ali-exception.xml - rulesets/java/ali-flowcontrol.xml - rulesets/java/ali-naming.xml - rulesets/java/ali-oop.xml - rulesets/java/ali-orm.xml - rulesets/java/ali-other.xml - rulesets/java/ali-set.xml - - - - - verify - - check - - - - - - com.alibaba.p3c - p3c-pmd - ${p3c-pmd.version} - - - - com.google.cloud.tools @@ -100,12 +62,16 @@ - - adoptopenjdk/openjdk11:${adoptopenjdk11.tag} + + eclipse-temurin:${temurin.tag} docker.io/ijohnnymiller/${project.baseArtifactId}.${project.parent.artifactId} + ${git.commit.id.abbrev}-${project.version} @@ -132,32 +98,6 @@ - - - - io.github.git-commit-id - git-commit-id-maven-plugin - 5.0.0 - - - get-the-git-info - - revision - - initialize - - - - true - ${project.build.outputDirectory}/git.properties - - - ^git.build.(time|version)$ - ^git.commit.id.(abbrev|full)$ - - full - - diff --git a/auth-center/auth-center-bootstrap/src/main/java/com/jmsoftware/maf/authcenter/AuthCenterApplication.java b/auth-center/auth-center-bootstrap/src/main/java/com/jmsoftware/maf/authcenter/AuthCenterApplication.java deleted file mode 100644 index 365fbf03..00000000 --- a/auth-center/auth-center-bootstrap/src/main/java/com/jmsoftware/maf/authcenter/AuthCenterApplication.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.jmsoftware.maf.authcenter; - -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 org.springframework.util.StopWatch; - -/** - *

AuthCenterApplication

- *

- * Change description here. - * - * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 3/12/20 9:57 AM - **/ -@Slf4j -@EnableFeignClients -@EnableDiscoveryClient -@SpringBootApplication -@SuppressWarnings("scwjava_Createprivateconstructorforutilityclassallfieldsmethodsarestatic") -public class AuthCenterApplication { - public static void main(String[] args) { - val stopWatch = new StopWatch(); - stopWatch.start(); - val configurableApplicationContext = SpringApplication.run(AuthCenterApplication.class, args); - val springBootStartupHelper = configurableApplicationContext.getBean(SpringBootStartupHelper.class); - springBootStartupHelper.stop(stopWatch); - } -} diff --git a/auth-center/auth-center-bootstrap/src/main/java/com/jmsoftware/maf/authcenter/AuthCenterApplication.kt b/auth-center/auth-center-bootstrap/src/main/java/com/jmsoftware/maf/authcenter/AuthCenterApplication.kt new file mode 100644 index 00000000..b691506a --- /dev/null +++ b/auth-center/auth-center-bootstrap/src/main/java/com/jmsoftware/maf/authcenter/AuthCenterApplication.kt @@ -0,0 +1,28 @@ +package com.jmsoftware.maf.authcenter + +import com.jmsoftware.maf.springcloudstarter.helper.SpringBootStartupHelper +import org.springframework.boot.autoconfigure.SpringBootApplication +import org.springframework.boot.runApplication +import org.springframework.cloud.client.discovery.EnableDiscoveryClient +import org.springframework.cloud.openfeign.EnableFeignClients +import org.springframework.util.StopWatch + +/** + * # AuthCenterApplication + * + * Change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/10/22 11:44 AM + */ +@EnableFeignClients +@EnableDiscoveryClient +@SpringBootApplication +class AuthCenterApplication + +fun main(args: Array) { + val stopWatch = StopWatch() + stopWatch.start() + runApplication(*args) + .getBean(SpringBootStartupHelper::class.java) + .stop(stopWatch) +} diff --git a/auth-center/auth-center-bootstrap/src/main/resources/application.yml b/auth-center/auth-center-bootstrap/src/main/resources/application.yml index 0c15a5eb..8730fe33 100644 --- a/auth-center/auth-center-bootstrap/src/main/resources/application.yml +++ b/auth-center/auth-center-bootstrap/src/main/resources/application.yml @@ -21,7 +21,7 @@ spring: config: # `default-context` should not be modified, keeps "application" for common configuration. # Properties in the config/application folder are applicable to all applications using consul for configuration. - profile-separator: "::" + profile-separator: "@" format: YAML data-key: "data" watch: @@ -29,6 +29,7 @@ spring: delay: 1000 prefixes: - config + - shardingsphere discovery: register: true instance-id: ${spring.application.name}-${spring.cloud.client.hostname}-${vcap.application.instance_id:${spring.application.instance_id:${random.value}}} @@ -39,19 +40,15 @@ spring: health-check-critical-timeout: 15s 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: @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 logging: config: classpath:logback-configuration/logback-${spring.profiles.active}.xml + level: + org.springframework.data.elasticsearch.client.WIRE: DEBUG maf: project-properties: @@ -59,7 +56,7 @@ maf: context-path: ${server.servlet.context-path} group-id: @project.groupId@ project-parent-artifact-id: @project.parent.artifactId@ - project-artifact-id: @project.artifactId@ + project-artifact-id: @project.parent.artifactId@ version: @project.version@ description: @project.description@ jdk-version: @java.version@ diff --git a/auth-center/auth-center-bootstrap/src/test/java/com/jmsoftware/maf/authcenter/AuthCenterApplicationTests.java b/auth-center/auth-center-bootstrap/src/test/java/com/jmsoftware/maf/authcenter/AuthCenterApplicationTests.java deleted file mode 100644 index 7fa17004..00000000 --- a/auth-center/auth-center-bootstrap/src/test/java/com/jmsoftware/maf/authcenter/AuthCenterApplicationTests.java +++ /dev/null @@ -1,41 +0,0 @@ -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 - @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/auth-center-bootstrap/src/test/java/com/jmsoftware/maf/authcenter/mybatis/MyBatisPlusTests.java b/auth-center/auth-center-bootstrap/src/test/java/com/jmsoftware/maf/authcenter/mybatis/MyBatisPlusTests.java deleted file mode 100644 index dab7b16b..00000000 --- a/auth-center/auth-center-bootstrap/src/test/java/com/jmsoftware/maf/authcenter/mybatis/MyBatisPlusTests.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.jmsoftware.maf.authcenter.mybatis; - -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.jmsoftware.maf.authcenter.role.mapper.RoleMapper; -import com.jmsoftware.maf.authcenter.role.persistence.Role; -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) -class MyBatisPlusTests { - private static final int AFFECTED = 0; - @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(AFFECTED, inserted); - } - - @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(AFFECTED, deleted); - 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/auth-center/auth-center-bootstrap/src/test/java/com/jmsoftware/maf/authcenter/package-info.kt b/auth-center/auth-center-bootstrap/src/test/java/com/jmsoftware/maf/authcenter/package-info.kt new file mode 100644 index 00000000..b7191a36 --- /dev/null +++ b/auth-center/auth-center-bootstrap/src/test/java/com/jmsoftware/maf/authcenter/package-info.kt @@ -0,0 +1 @@ +package com.jmsoftware.maf.authcenter diff --git a/auth-center/auth-center-domain/pom.xml b/auth-center/auth-center-domain/pom.xml index 71d5601b..62f51c2f 100644 --- a/auth-center/auth-center-domain/pom.xml +++ b/auth-center/auth-center-domain/pom.xml @@ -11,7 +11,7 @@ com.jmsoftware.maf auth-center - 0.0.8.1 + 0.0.9 diff --git a/auth-center/auth-center-domain/src/main/java/com/jmsoftware/maf/authcenter/package-info.java b/auth-center/auth-center-domain/src/main/java/com/jmsoftware/maf/authcenter/package-info.java deleted file mode 100644 index e702ef59..00000000 --- a/auth-center/auth-center-domain/src/main/java/com/jmsoftware/maf/authcenter/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package com.jmsoftware.maf.authcenter; diff --git a/auth-center/auth-center-domain/src/main/java/com/jmsoftware/maf/authcenter/package-info.kt b/auth-center/auth-center-domain/src/main/java/com/jmsoftware/maf/authcenter/package-info.kt new file mode 100644 index 00000000..b7191a36 --- /dev/null +++ b/auth-center/auth-center-domain/src/main/java/com/jmsoftware/maf/authcenter/package-info.kt @@ -0,0 +1 @@ +package com.jmsoftware.maf.authcenter diff --git a/auth-center/auth-center-domain/src/main/java/com/jmsoftware/maf/authcenter/permission/package-info.kt b/auth-center/auth-center-domain/src/main/java/com/jmsoftware/maf/authcenter/permission/package-info.kt new file mode 100644 index 00000000..9bd0fd89 --- /dev/null +++ b/auth-center/auth-center-domain/src/main/java/com/jmsoftware/maf/authcenter/permission/package-info.kt @@ -0,0 +1 @@ +package com.jmsoftware.maf.authcenter.permission diff --git a/auth-center/auth-center-domain/src/main/java/com/jmsoftware/maf/authcenter/permission/service/PermissionDomainService.kt b/auth-center/auth-center-domain/src/main/java/com/jmsoftware/maf/authcenter/permission/service/PermissionDomainService.kt new file mode 100644 index 00000000..d5856c20 --- /dev/null +++ b/auth-center/auth-center-domain/src/main/java/com/jmsoftware/maf/authcenter/permission/service/PermissionDomainService.kt @@ -0,0 +1,29 @@ +package com.jmsoftware.maf.authcenter.permission.service + +import com.baomidou.mybatisplus.extension.service.IService +import com.jmsoftware.maf.authcenter.permission.persistence.Permission +import com.jmsoftware.maf.common.domain.authcenter.permission.PermissionType +import org.springframework.validation.annotation.Validated +import javax.validation.constraints.NotEmpty + +/** + * # PermissionDomainService + * + * Domain Service of Permission. (Permission) + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/10/22 11:50 AM + */ +@Validated +interface PermissionDomainService : IService { + /** + * Gets permission list by role id list. + * + * @param roleIdList the role id list + * @param permissionTypeList the permission type list + * @return the permission list by role id list + */ + fun getPermissionListByRoleIdList( + roleIdList: @NotEmpty List, + permissionTypeList: @NotEmpty List + ): List +} diff --git a/auth-center/auth-center-domain/src/main/java/com/jmsoftware/maf/authcenter/permission/service/impl/PermissionDomainServiceImpl.kt b/auth-center/auth-center-domain/src/main/java/com/jmsoftware/maf/authcenter/permission/service/impl/PermissionDomainServiceImpl.kt new file mode 100644 index 00000000..af7d8245 --- /dev/null +++ b/auth-center/auth-center-domain/src/main/java/com/jmsoftware/maf/authcenter/permission/service/impl/PermissionDomainServiceImpl.kt @@ -0,0 +1,27 @@ +package com.jmsoftware.maf.authcenter.permission.service.impl + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl +import com.jmsoftware.maf.authcenter.permission.mapper.PermissionMapper +import com.jmsoftware.maf.authcenter.permission.persistence.Permission +import com.jmsoftware.maf.authcenter.permission.service.PermissionDomainService +import com.jmsoftware.maf.common.domain.authcenter.permission.PermissionType +import org.springframework.stereotype.Service +import javax.validation.constraints.NotEmpty + +/** + * # PermissionDomainServiceImpl + * + * Domain Service implementation of Permission. (Permission) + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/10/22 11:53 AM + */ +@Service +class PermissionDomainServiceImpl + : ServiceImpl(), PermissionDomainService { + override fun getPermissionListByRoleIdList( + roleIdList: @NotEmpty List, + permissionTypeList: @NotEmpty List + ): List { + return getBaseMapper().selectPermissionListByRoleIdList(roleIdList, permissionTypeList) + } +} diff --git a/auth-center/auth-center-domain/src/main/java/com/jmsoftware/maf/authcenter/remote/OssCenterFeignService.kt b/auth-center/auth-center-domain/src/main/java/com/jmsoftware/maf/authcenter/remote/OssCenterFeignService.kt new file mode 100644 index 00000000..82db98ce --- /dev/null +++ b/auth-center/auth-center-domain/src/main/java/com/jmsoftware/maf/authcenter/remote/OssCenterFeignService.kt @@ -0,0 +1,24 @@ +package com.jmsoftware.maf.authcenter.remote + +import com.jmsoftware.maf.common.domain.osscenter.write.ObjectResponse +import org.springframework.validation.annotation.Validated +import org.springframework.web.multipart.MultipartFile +import javax.validation.constraints.NotNull + +/** + * # OssCenterFeignService + * + * Description: OssCenterFeignService, change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/10/22 11:57 AM + */ +@Validated +interface OssCenterFeignService { + /** + * Upload single resource object response. + * + * @param multipartFile the multipart file + * @return the object response + */ + fun uploadSingleResource(multipartFile: @NotNull MultipartFile): ObjectResponse +} diff --git a/auth-center/auth-center-domain/src/main/java/com/jmsoftware/maf/authcenter/remote/impl/OssCenterFeignServiceImpl.kt b/auth-center/auth-center-domain/src/main/java/com/jmsoftware/maf/authcenter/remote/impl/OssCenterFeignServiceImpl.kt new file mode 100644 index 00000000..a46d1b65 --- /dev/null +++ b/auth-center/auth-center-domain/src/main/java/com/jmsoftware/maf/authcenter/remote/impl/OssCenterFeignServiceImpl.kt @@ -0,0 +1,37 @@ +package com.jmsoftware.maf.authcenter.remote.impl + +import com.jmsoftware.maf.authcenter.remote.OssCenterFeignClient +import com.jmsoftware.maf.authcenter.remote.OssCenterFeignService +import com.jmsoftware.maf.common.domain.osscenter.write.ObjectResponse +import com.jmsoftware.maf.common.exception.InternalServerException +import com.jmsoftware.maf.common.util.logger +import org.springframework.stereotype.Service +import org.springframework.web.multipart.MultipartFile +import java.util.* +import javax.validation.constraints.NotNull + +/** + * # OssCenterFeignServiceImpl + * + * Description: OssCenterFeignServiceImpl, change description here. + * + * @author Johnny Miller (鍾俊), e-mail: johnnysviva@outlook.com, date: 2/5/2022 7:47 PM + */ +@Service +class OssCenterFeignServiceImpl( + private val ossCenterFeignClient: OssCenterFeignClient +) : OssCenterFeignService { + companion object { + private val log = logger() + } + + override fun uploadSingleResource(multipartFile: @NotNull MultipartFile): ObjectResponse { + log.info("Uploading single resource to oss center. multipartFile: {}", multipartFile) + return Optional.ofNullable(ossCenterFeignClient.uploadSingleResource(multipartFile)) + .map { response -> response.data!! } + .orElseThrow { + log.error("Failed to upload single resource to oss center. multipartFile: ${multipartFile.name}") + InternalServerException("Failed to upload single resource to oss center") + } + } +} diff --git a/auth-center/auth-center-domain/src/main/java/com/jmsoftware/maf/authcenter/role/package-info.kt b/auth-center/auth-center-domain/src/main/java/com/jmsoftware/maf/authcenter/role/package-info.kt new file mode 100644 index 00000000..a937619c --- /dev/null +++ b/auth-center/auth-center-domain/src/main/java/com/jmsoftware/maf/authcenter/role/package-info.kt @@ -0,0 +1 @@ +package com.jmsoftware.maf.authcenter.role diff --git a/auth-center/auth-center-domain/src/main/java/com/jmsoftware/maf/authcenter/role/service/RoleDomainService.kt b/auth-center/auth-center-domain/src/main/java/com/jmsoftware/maf/authcenter/role/service/RoleDomainService.kt new file mode 100644 index 00000000..74b963bb --- /dev/null +++ b/auth-center/auth-center-domain/src/main/java/com/jmsoftware/maf/authcenter/role/service/RoleDomainService.kt @@ -0,0 +1,73 @@ +package com.jmsoftware.maf.authcenter.role.service + +import com.baomidou.mybatisplus.extension.service.IService +import com.jmsoftware.maf.authcenter.role.RoleExcelBean +import com.jmsoftware.maf.authcenter.role.persistence.Role +import com.jmsoftware.maf.common.domain.authcenter.role.GetRoleListByUserIdResponse +import com.jmsoftware.maf.common.domain.authcenter.role.GetRoleListByUserIdSingleResponse +import org.springframework.validation.annotation.Validated +import javax.validation.constraints.NotEmpty +import javax.validation.constraints.NotNull + +/** + * # RoleDomainService + * + * Domain Service of Role. (Role) + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/10/22 5:23 PM + */ +@Validated +interface RoleDomainService : IService { + companion object { + const val ROLE_TEMPLATE_EXCEL = "role-stat.xlsx" + } + + /** + * Gets role list by user id. + * + * @param userId the user id + * @return the role list by user id + */ + fun getRoleList(userId: @NotNull Long): GetRoleListByUserIdResponse + + /** + * Gets role list by user id. + * + * @param userId the user id + * @return the role list by user id + */ + fun getRoleListByUserId(userId: Long): List + + /** + * Check admin boolean. + * + * @param roleIdList the role id list + * @return the boolean + * @see Kotlin Wrapper for MyBatis Plus + */ + fun checkAdmin(roleIdList: @NotEmpty List): Boolean + + /** + * Gets list for exporting. + * + * @return the list for exporting + */ + fun getListForExporting(): List + + /** + * Validate before add to bean list boolean. + * + * @param beanList the bean list + * @param bean the bean + * @param index the index + * @throws IllegalArgumentException the illegal argument exception + */ + fun validateBeforeAddToBeanList(beanList: List, bean: RoleExcelBean, index: Int) + + /** + * Save. + * + * @param beanList the bean list + */ + fun save(beanList: @NotEmpty List) +} diff --git a/auth-center/auth-center-domain/src/main/java/com/jmsoftware/maf/authcenter/role/service/impl/RoleDomainServiceImpl.kt b/auth-center/auth-center-domain/src/main/java/com/jmsoftware/maf/authcenter/role/service/impl/RoleDomainServiceImpl.kt new file mode 100644 index 00000000..8df5d3c8 --- /dev/null +++ b/auth-center/auth-center-domain/src/main/java/com/jmsoftware/maf/authcenter/role/service/impl/RoleDomainServiceImpl.kt @@ -0,0 +1,110 @@ +package com.jmsoftware.maf.authcenter.role.service.impl + +import cn.hutool.core.collection.CollUtil +import cn.hutool.core.text.CharSequenceUtil +import cn.hutool.core.util.RandomUtil +import cn.hutool.core.util.StrUtil +import cn.hutool.extra.validation.ValidationUtil +import com.baomidou.mybatisplus.extension.plugins.pagination.Page +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl +import com.fasterxml.jackson.databind.ObjectMapper +import com.jmsoftware.maf.authcenter.role.RoleExcelBean +import com.jmsoftware.maf.authcenter.role.constant.RoleRedisKey.GET_ROLE_LIST_BY_USER_ID +import com.jmsoftware.maf.authcenter.role.mapper.RoleMapper +import com.jmsoftware.maf.authcenter.role.persistence.Role +import com.jmsoftware.maf.authcenter.role.service.RoleDomainService +import com.jmsoftware.maf.common.domain.authcenter.role.GetRoleListByUserIdResponse +import com.jmsoftware.maf.common.domain.authcenter.role.GetRoleListByUserIdSingleResponse +import com.jmsoftware.maf.common.exception.InternalServerException +import com.jmsoftware.maf.common.util.logger +import com.jmsoftware.maf.springcloudstarter.function.lazyDebug +import com.jmsoftware.maf.springcloudstarter.function.requireTrue +import com.jmsoftware.maf.springcloudstarter.property.MafConfigurationProperties +import com.jmsoftware.maf.springcloudstarter.property.MafProjectProperties +import org.springframework.data.redis.core.RedisTemplate +import org.springframework.stereotype.Service +import org.springframework.transaction.annotation.Transactional +import java.util.concurrent.TimeUnit +import javax.validation.constraints.NotEmpty +import javax.validation.constraints.NotNull + +/** + * # RoleDomainServiceImpl + * + * Domain Service implementation of Role. (Role) + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/10/22 5:25 PM + */ +@Service +class RoleDomainServiceImpl( + private val mafProjectProperties: MafProjectProperties, + private val mafConfigurationProperties: MafConfigurationProperties, + private val redisTemplate: RedisTemplate, + private val objectMapper: ObjectMapper +) : ServiceImpl(), RoleDomainService { + companion object { + private val logger = logger() + } + + override fun getRoleList(userId: @NotNull Long): GetRoleListByUserIdResponse { + val key = "${mafProjectProperties.projectParentArtifactId}${GET_ROLE_LIST_BY_USER_ID.keyInfixFormat}$userId" + val hadKey = redisTemplate.hasKey(key) + if (hadKey) { + return objectMapper.readValue(redisTemplate.opsForValue()[key], GetRoleListByUserIdResponse::class.java) + } + val response = GetRoleListByUserIdResponse() + response.roleList = getRoleListByUserId(userId) + redisTemplate.opsForValue()[key, objectMapper.writeValueAsString(response), RandomUtil.randomLong(1, 7)] = + TimeUnit.DAYS + return response + } + + override fun getRoleListByUserId(userId: Long): List { + return getBaseMapper().selectRoleListByUserId(userId) + } + + override fun checkAdmin(roleIdList: @NotEmpty List): Boolean { + // If roleNameSet is not empty (contains "admin") + return this.ktQuery() + .select(Role::name) + .`in`(Role::id, roleIdList) + .list() + .stream() + .map { item -> item.name } + .anyMatch { roleName: String -> + StrUtil.equals(mafConfigurationProperties.superUserRole, roleName) + } + } + + override fun getListForExporting(): List { + return this.page(Page(1, 500)) + .records + .stream() + .map { role: Role -> RoleExcelBean.transformBy(role) } + .toList() + } + + override fun validateBeforeAddToBeanList(beanList: List, bean: RoleExcelBean, index: Int) { + val beanValidationResult = ValidationUtil.warpValidate(bean) + if (!beanValidationResult.isSuccess) { + logger.warn("Validation failed! beanList: $beanList, bean: $bean, index: $index") + val firstErrorMessage = CollUtil.getFirst(beanValidationResult.errorMessages) + throw IllegalArgumentException( + CharSequenceUtil.format("{} {}", firstErrorMessage.propertyName, firstErrorMessage.message) + ) + } + } + + @Transactional(rollbackFor = [Throwable::class]) + override fun save(beanList: @NotEmpty List) { + val roleList = beanList + .stream() + .map { roleExcelBean: RoleExcelBean -> RoleExcelBean.transformTo(roleExcelBean) } + .toList() + lazyDebug(logger) { "Saving roleList: $roleList" } + requireTrue(this.saveBatch(roleList)) { saved: Boolean -> + logger.info("Saved role list: $saved") + }.orElseThrow { InternalServerException("Failed to save roles! Transaction rollback") } + } +} + diff --git a/auth-center/auth-center-domain/src/main/java/com/jmsoftware/maf/authcenter/security/package-info.kt b/auth-center/auth-center-domain/src/main/java/com/jmsoftware/maf/authcenter/security/package-info.kt new file mode 100644 index 00000000..70ab7551 --- /dev/null +++ b/auth-center/auth-center-domain/src/main/java/com/jmsoftware/maf/authcenter/security/package-info.kt @@ -0,0 +1 @@ +package com.jmsoftware.maf.authcenter.security diff --git a/auth-center/auth-center-biz/src/main/java/com/jmsoftware/maf/authcenter/security/service/JwtService.java b/auth-center/auth-center-domain/src/main/java/com/jmsoftware/maf/authcenter/security/service/JwtService.kt similarity index 53% rename from auth-center/auth-center-biz/src/main/java/com/jmsoftware/maf/authcenter/security/service/JwtService.java rename to auth-center/auth-center-domain/src/main/java/com/jmsoftware/maf/authcenter/security/service/JwtService.kt index ed8dd38d..02a9d42c 100644 --- a/auth-center/auth-center-biz/src/main/java/com/jmsoftware/maf/authcenter/security/service/JwtService.java +++ b/auth-center/auth-center-domain/src/main/java/com/jmsoftware/maf/authcenter/security/service/JwtService.kt @@ -1,25 +1,24 @@ -package com.jmsoftware.maf.authcenter.security.service; +package com.jmsoftware.maf.authcenter.security.service -import com.jmsoftware.maf.common.domain.authcenter.security.ParseJwtResponse; -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; -import java.util.List; +import com.jmsoftware.maf.common.domain.authcenter.security.ParseJwtResponse +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 javax.validation.constraints.NotBlank +import javax.validation.constraints.NotNull /** - *

JwtService

- *

+ * # JwtService + * * Change description here. * - * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 12/29/2020 10:44 AM + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/11/22 8:47 PM */ @Validated -public interface JwtService { +interface JwtService { /** * Create JWT string. * @@ -27,7 +26,7 @@ public interface JwtService { * @param rememberMe the remember me * @return the string */ - String createJwt(Authentication authentication, Boolean rememberMe); + fun createJwt(@NotNull authentication: Authentication, @NotNull rememberMe: Boolean): String /** * Create JWT string. @@ -39,8 +38,13 @@ public interface JwtService { * @param authorities the authorities * @return the JWT string */ - String createJwt(Boolean rememberMe, Long id, String subject, List roles, Collection authorities); + fun createJwt( + @NotNull rememberMe: Boolean, + @NotNull id: Long, + @NotBlank subject: String, + roles: List, + authorities: Collection + ): String /** * Parse JWT. @@ -49,7 +53,7 @@ String createJwt(Boolean rememberMe, Long id, String subject, List roles * @return the claims * @throws SecurityException the security exception */ - Claims parseJwt(String jwt) throws SecurityException; + fun parseJwt(@NotBlank jwt: String): Claims /** * Invalidate jwt. @@ -57,7 +61,7 @@ String createJwt(Boolean rememberMe, Long id, String subject, List roles * @param request the request * @throws SecurityException the security exception */ - void invalidateJwt(HttpServletRequest request) throws SecurityException; + fun invalidateJwt(@NotNull request: HttpServletRequest) /** * Gets username from jwt. @@ -66,7 +70,7 @@ String createJwt(Boolean rememberMe, Long id, String subject, List roles * @return the username from jwt * @throws SecurityException the security exception */ - String getUsernameFromJwt(String jwt) throws SecurityException; + fun getUsernameFromJwt(@NotBlank jwt: String): String /** * Gets username from request. @@ -75,7 +79,7 @@ String createJwt(Boolean rememberMe, Long id, String subject, List roles * @return the username from request * @throws SecurityException the security exception */ - String getUsernameFromRequest(HttpServletRequest request) throws SecurityException; + fun getUsernameFromRequest(@NotNull request: HttpServletRequest): String /** * Gets jwt from request. @@ -83,7 +87,7 @@ String createJwt(Boolean rememberMe, Long id, String subject, List roles * @param request the request * @return the jwt from request */ - String getJwtFromRequest(HttpServletRequest request); + fun getJwtFromRequest(@NotNull request: HttpServletRequest): String /** * Parse parse jwt response. @@ -91,5 +95,5 @@ String createJwt(Boolean rememberMe, Long id, String subject, List roles * @param request the request * @return the parse jwt response */ - ParseJwtResponse parse(HttpServletRequest request); + fun parse(@NotNull request: HttpServletRequest): ParseJwtResponse } diff --git a/auth-center/auth-center-domain/src/main/java/com/jmsoftware/maf/authcenter/security/service/impl/JwtServiceImpl.kt b/auth-center/auth-center-domain/src/main/java/com/jmsoftware/maf/authcenter/security/service/impl/JwtServiceImpl.kt new file mode 100644 index 00000000..acbd2ac8 --- /dev/null +++ b/auth-center/auth-center-domain/src/main/java/com/jmsoftware/maf/authcenter/security/service/impl/JwtServiceImpl.kt @@ -0,0 +1,170 @@ +package com.jmsoftware.maf.authcenter.security.service.impl + +import cn.hutool.core.date.DateUtil +import cn.hutool.core.text.CharSequenceUtil +import cn.hutool.core.util.ObjectUtil +import com.jmsoftware.maf.authcenter.security.service.JwtService +import com.jmsoftware.maf.common.domain.authcenter.security.ParseJwtResponse +import com.jmsoftware.maf.common.domain.authcenter.security.UserPrincipal +import com.jmsoftware.maf.common.exception.SecurityException +import com.jmsoftware.maf.common.util.logger +import com.jmsoftware.maf.springcloudstarter.property.JwtConfigurationProperties +import io.jsonwebtoken.* +import io.jsonwebtoken.security.Keys +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 +import java.nio.charset.StandardCharsets +import java.util.* +import java.util.concurrent.TimeUnit +import javax.annotation.PostConstruct +import javax.crypto.SecretKey +import javax.servlet.http.HttpServletRequest +import javax.validation.constraints.NotBlank +import javax.validation.constraints.NotNull + +/** + * # JwtServiceImpl + * + * Change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/11/22 9:27 PM + */ +@Service +class JwtServiceImpl( + private val jwtConfigurationProperties: JwtConfigurationProperties, + private val redisTemplate: RedisTemplate +) : JwtService { + companion object { + private val log = logger() + } + + private lateinit var secretKey: SecretKey + private lateinit var jwtParser: JwtParser + + @PostConstruct + fun init() { + log.info("Start to init class members of ${this.javaClass.simpleName}") + secretKey = Keys.hmacShaKeyFor( + jwtConfigurationProperties.signingKey.toByteArray(StandardCharsets.UTF_8) + ) + jwtParser = Jwts.parserBuilder().setSigningKey(secretKey).build() + log.warn("Secret key for JWT parser was generated. Algorithm: ${secretKey.algorithm}") + } + + override fun createJwt(@NotNull authentication: Authentication, @NotNull rememberMe: Boolean): String { + val userPrincipal = authentication.principal as UserPrincipal + return this.createJwt( + rememberMe, + userPrincipal.id!!, + userPrincipal.usernameProperty!!, + userPrincipal.roles!!, + userPrincipal.authoritiesProperty!! + ) + } + + override fun createJwt( + @NotNull rememberMe: Boolean, + @NotNull id: Long, + @NotNull subject: String, + roles: List, + authorities: Collection + ): String { + val now = Date() + val builder = Jwts.builder() + .setId(id.toString()) + .setSubject(subject) + .setIssuedAt(now) + .signWith(secretKey) + .claim("roles", roles) + // Don't generate authority information in JWT. + // .claim("authorities", authorities) + // Set expire duration of JWT. + val ttl = if (rememberMe) jwtConfigurationProperties.ttlForRememberMe else jwtConfigurationProperties.ttl + if (ttl > 0) { + builder.setExpiration(DateUtil.offsetMillisecond(now, ttl.toInt())) + } + val jwt = builder.compact() + // Store new JWT in Redis + val redisKeyOfJwt = "${jwtConfigurationProperties.jwtRedisKeyPrefix}$subject" + redisTemplate.opsForValue()[redisKeyOfJwt, jwt, ttl] = TimeUnit.MILLISECONDS + log.info("Storing JWT in Redis. Key: $redisKeyOfJwt, Value: $jwt") + return jwt + } + + override fun parseJwt(@NotBlank jwt: String): Claims { + val claims: Claims = try { + Optional.ofNullable(jwtParser.parseClaimsJws(jwt).body) + .orElseThrow { + SecurityException(HttpStatus.INTERNAL_SERVER_ERROR, "The JWT Claims Set is null") + } + } catch (e: ExpiredJwtException) { + log.error("JWT is expired. Message: ${e.message}, JWT: $jwt") + throw SecurityException(HttpStatus.UNAUTHORIZED, "JWT is expired (JWT itself)") + } catch (e: UnsupportedJwtException) { + log.error("JWT is unsupported. Message: ${e.message}, JWT: $jwt") + throw SecurityException(HttpStatus.UNAUTHORIZED, "JWT is unsupported") + } catch (e: MalformedJwtException) { + log.error("JWT is invalid. Message: ${e.message}, JWT: $jwt") + throw SecurityException(HttpStatus.UNAUTHORIZED, "JWT is invalid") + } catch (e: IllegalArgumentException) { + log.error("The parameter of JWT is invalid. Message: ${e.message}, JWT: $jwt") + throw SecurityException(HttpStatus.UNAUTHORIZED, "The parameter of JWT is invalid") + } + val username = claims.subject + val redisKeyOfJwt = jwtConfigurationProperties.jwtRedisKeyPrefix + username + // Check if JWT exists + val expire = redisTemplate.opsForValue().operations.getExpire(redisKeyOfJwt, TimeUnit.MILLISECONDS) + if (ObjectUtil.isNull(expire) || expire!! <= 0) { + throw 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 = redisTemplate.opsForValue()[redisKeyOfJwt] as String? + if (!CharSequenceUtil.equals(jwt, jwtInRedis)) { + throw SecurityException(HttpStatus.UNAUTHORIZED, "JWT is expired (Not equaled)") + } + return claims + } + + override fun invalidateJwt(@NotNull request: HttpServletRequest) { + val jwt = getJwtFromRequest(request) + val username = getUsernameFromJwt(jwt) + // Delete JWT from redis + val redisKeyOfJwt = "${jwtConfigurationProperties.jwtRedisKeyPrefix}$username" + val deletedKeyNumber = redisTemplate.opsForValue().operations.delete(redisKeyOfJwt) + log.error("Invalidate JWT. Redis key of JWT = $redisKeyOfJwt, deleted = $deletedKeyNumber") + } + + override fun getUsernameFromJwt(@NotBlank jwt: String): String { + val claims = parseJwt(jwt) + return claims.subject + } + + override fun getUsernameFromRequest(@NotNull request: HttpServletRequest): String { + val jwt = getJwtFromRequest(request) + return getUsernameFromJwt(jwt) + } + + override fun getJwtFromRequest(@NotNull request: HttpServletRequest): String { + val bearerToken = request.getHeader(HttpHeaders.AUTHORIZATION) + return if (CharSequenceUtil.isNotBlank(bearerToken) + && bearerToken.startsWith(JwtConfigurationProperties.TOKEN_PREFIX) + ) { + bearerToken.substring(JwtConfigurationProperties.TOKEN_PREFIX.length) + } else null.toString() + } + + override fun parse(@NotNull request: HttpServletRequest): ParseJwtResponse { + val jwt = getJwtFromRequest(request) + val claims = parseJwt(jwt) + val parseJwtResponse = ParseJwtResponse() + parseJwtResponse.id = claims.id.toLong() + parseJwtResponse.username = claims.subject + return parseJwtResponse + } +} diff --git a/auth-center/auth-center-domain/src/main/java/com/jmsoftware/maf/authcenter/user/package-info.kt b/auth-center/auth-center-domain/src/main/java/com/jmsoftware/maf/authcenter/user/package-info.kt new file mode 100644 index 00000000..b707e02d --- /dev/null +++ b/auth-center/auth-center-domain/src/main/java/com/jmsoftware/maf/authcenter/user/package-info.kt @@ -0,0 +1 @@ +package com.jmsoftware.maf.authcenter.user diff --git a/auth-center/auth-center-domain/src/main/java/com/jmsoftware/maf/authcenter/user/service/UserDomainService.kt b/auth-center/auth-center-domain/src/main/java/com/jmsoftware/maf/authcenter/user/service/UserDomainService.kt new file mode 100644 index 00000000..20f58abe --- /dev/null +++ b/auth-center/auth-center-domain/src/main/java/com/jmsoftware/maf/authcenter/user/service/UserDomainService.kt @@ -0,0 +1,74 @@ +package com.jmsoftware.maf.authcenter.user.service + +import com.baomidou.mybatisplus.extension.service.IService +import com.jmsoftware.maf.authcenter.user.payload.GetUserPageListPayload +import com.jmsoftware.maf.authcenter.user.payload.GetUserStatusPayload +import com.jmsoftware.maf.authcenter.user.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 javax.validation.constraints.NotBlank +import javax.validation.constraints.NotNull + +/** + * # UserDomainService + * + * Service of UserPersistence. (UserPersistence) + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/12/22 7:41 AM + */ +@Validated +interface UserDomainService : IService { + /** + * Gets user by login token. + * + * @param loginToken the login token + * @return the user by login token + */ + fun getUserByLoginToken(loginToken: @NotBlank String): GetUserByLoginTokenResponse? + + /** + * Save user for registering save user for registering response. + * + * @param payload the payload + * @return the save user for registering response + */ + fun saveUserForSignup(payload: @Valid SignupPayload): SignupResponse + + /** + * Login login response. + * + * @param payload the payload + * @return the login response + * @throws SecurityException the security exception + */ + fun login(payload: @Valid LoginPayload): LoginResponse + + /** + * Logout boolean. + * + * @param request the request + * @return the boolean + * @throws SecurityException the security exception + */ + fun logout(request: HttpServletRequest): Boolean + + /** + * Gets user status. + * + * @param payload the payload + * @return the user status + */ + fun getUserStatus(payload: @Valid @NotNull GetUserStatusPayload): String + + /** + * Gets user page list. + * + * @param payload the payload + * @return the user page list + */ + fun getUserPageList(payload: @Valid @NotNull GetUserPageListPayload): PageResponseBodyBean +} diff --git a/auth-center/auth-center-domain/src/main/java/com/jmsoftware/maf/authcenter/user/service/UserRoleDomainService.kt b/auth-center/auth-center-domain/src/main/java/com/jmsoftware/maf/authcenter/user/service/UserRoleDomainService.kt new file mode 100644 index 00000000..67b113da --- /dev/null +++ b/auth-center/auth-center-domain/src/main/java/com/jmsoftware/maf/authcenter/user/service/UserRoleDomainService.kt @@ -0,0 +1,23 @@ +package com.jmsoftware.maf.authcenter.user.service + +import com.baomidou.mybatisplus.extension.service.IService +import com.jmsoftware.maf.authcenter.user.persistence.User +import com.jmsoftware.maf.authcenter.user.persistence.UserRole +import org.springframework.validation.annotation.Validated +import javax.validation.constraints.NotBlank + +/** + * # UserRoleDomainService + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/12/22 10:09 AM + */ +@Validated +interface UserRoleDomainService : IService { + /** + * Assign role by role name. + * + * @param user the user + * @param roleName the role name + */ + fun assignRoleByRoleName(user: User, roleName: @NotBlank String) +} diff --git a/auth-center/auth-center-domain/src/main/java/com/jmsoftware/maf/authcenter/user/service/impl/UserDomainServiceImpl.kt b/auth-center/auth-center-domain/src/main/java/com/jmsoftware/maf/authcenter/user/service/impl/UserDomainServiceImpl.kt new file mode 100644 index 00000000..1b8cc8a4 --- /dev/null +++ b/auth-center/auth-center-domain/src/main/java/com/jmsoftware/maf/authcenter/user/service/impl/UserDomainServiceImpl.kt @@ -0,0 +1,140 @@ +package com.jmsoftware.maf.authcenter.user.service.impl + +import cn.hutool.core.collection.ListUtil +import cn.hutool.core.text.CharSequenceUtil +import cn.hutool.core.util.ObjectUtil +import cn.hutool.core.util.RandomUtil +import cn.hutool.json.JSONUtil +import com.baomidou.mybatisplus.core.metadata.OrderItem +import com.baomidou.mybatisplus.core.toolkit.Wrappers +import com.baomidou.mybatisplus.core.toolkit.support.SFunction +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.constant.UserRedisKey +import com.jmsoftware.maf.authcenter.user.converter.UserMapStructMapper +import com.jmsoftware.maf.authcenter.user.mapper.UserMapper +import com.jmsoftware.maf.authcenter.user.payload.GetUserPageListPayload +import com.jmsoftware.maf.authcenter.user.payload.GetUserStatusPayload +import com.jmsoftware.maf.authcenter.user.persistence.User +import com.jmsoftware.maf.authcenter.user.service.UserDomainService +import com.jmsoftware.maf.authcenter.user.service.UserRoleDomainService +import com.jmsoftware.maf.common.bean.PageResponseBodyBean +import com.jmsoftware.maf.common.domain.authcenter.user.* +import com.jmsoftware.maf.common.enumeration.ValueDescriptionBaseEnum +import com.jmsoftware.maf.common.exception.SecurityException +import com.jmsoftware.maf.common.util.logger +import com.jmsoftware.maf.springcloudstarter.property.MafConfigurationProperties +import com.jmsoftware.maf.springcloudstarter.property.MafProjectProperties +import com.jmsoftware.maf.springcloudstarter.util.currentUsername +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 java.util.concurrent.TimeUnit +import javax.servlet.http.HttpServletRequest +import javax.validation.Valid +import javax.validation.constraints.NotBlank +import javax.validation.constraints.NotNull + +/** + * # UserDomainServiceImpl + * + * Service implementation of UserPersistence.(UserPersistence) + * + * @author Johnny Miller (锺俊), date 2020-05-10 12:08:28 + */ +@Service +@CacheConfig(cacheNames = ["user-service-cache"]) +class UserDomainServiceImpl( + private val bCryptPasswordEncoder: BCryptPasswordEncoder, + private val jwtService: JwtService, + private val messageSource: MessageSource, + private val mafProjectProperties: MafProjectProperties, + private val redisTemplate: RedisTemplate, + private val userRoleDomainService: UserRoleDomainService, + private val mafConfigurationProperties: MafConfigurationProperties, +) : ServiceImpl(), UserDomainService { + companion object { + private val logger = logger() + } + + override fun getUserByLoginToken(loginToken: @NotBlank String): GetUserByLoginTokenResponse? { + val key = + "${mafProjectProperties.projectParentArtifactId}${UserRedisKey.GET_USER_BY_LOGIN_TOKEN.keyInfixFormat}$loginToken" + val hasKey = redisTemplate.hasKey(key) + if (hasKey) { + return JSONUtil.toBean(redisTemplate.opsForValue()[key], GetUserByLoginTokenResponse::class.java) + } + val user = this.ktQuery().eq(User::username, loginToken).one() + if (ObjectUtil.isNull(user)) { + return null + } + val response = UserMapStructMapper.INSTANCE.of(user) + redisTemplate.opsForValue()[key, JSONUtil.toJsonStr(response), RandomUtil.randomLong(1, 7)] = TimeUnit.DAYS + return response + } + + @Transactional(rollbackFor = [Throwable::class]) + override fun saveUserForSignup(payload: @Valid SignupPayload): SignupResponse { + val user = User() + user.username = payload.username + user.email = payload.email + user.password = bCryptPasswordEncoder.encode(payload.password) + user.status = UserStatus.ENABLED.value + save(user) + logger.warn("Saved user for signup, going to assign guest role to user. $user") + userRoleDomainService.assignRoleByRoleName(user, mafConfigurationProperties.guestUserRole) + val response = SignupResponse() + response.userId = user.id + return response + } + + override fun login(payload: @Valid LoginPayload): LoginResponse { + val user = getUserByLoginToken(payload.loginToken) ?: throw SecurityException(HttpStatus.UNAUTHORIZED) + logger.info("User login: $user") + val matched = bCryptPasswordEncoder.matches(payload.password, user.password) + if (!matched) { + throw SecurityException(HttpStatus.UNAUTHORIZED) + } + val jwt = jwtService.createJwt(payload.rememberMe, user.id!!, user.username!!, listOf(), listOf()) + val response = LoginResponse() + response.greeting = messageSource.getMessage( + "greeting", + null, + LocaleContextHolder.getLocale() + ) + response.jwt = jwt + return response + } + + override fun logout(request: HttpServletRequest): Boolean { + jwtService.invalidateJwt(request) + return true + } + + override fun getUserStatus(payload: @Valid @NotNull GetUserStatusPayload): String { + logger.info("Current username: {}", currentUsername()) + return ValueDescriptionBaseEnum.getDescriptionByValue(UserStatus::class.java, payload.status) + } + + override fun getUserPageList(payload: @Valid @NotNull GetUserPageListPayload): PageResponseBodyBean { + logger.info("{}", payload) + val page = Page( + payload.currentPage.toLong(), payload.pageSize.toLong() + ) + val queryWrapper = Wrappers.lambdaQuery( + User::class.java + ) + if (CharSequenceUtil.isNotBlank(payload.username)) { + queryWrapper.like(SFunction { obj: User -> obj.username }, payload.username) + } + page.orders = ListUtil.of(OrderItem.desc(payload.orderBy)) + this.page(page, queryWrapper) + return PageResponseBodyBean.ofSuccess(page.records, page.total) + } +} diff --git a/auth-center/auth-center-domain/src/main/java/com/jmsoftware/maf/authcenter/user/service/impl/UserRoleDomainServiceImpl.kt b/auth-center/auth-center-domain/src/main/java/com/jmsoftware/maf/authcenter/user/service/impl/UserRoleDomainServiceImpl.kt new file mode 100644 index 00000000..23417f63 --- /dev/null +++ b/auth-center/auth-center-domain/src/main/java/com/jmsoftware/maf/authcenter/user/service/impl/UserRoleDomainServiceImpl.kt @@ -0,0 +1,40 @@ +package com.jmsoftware.maf.authcenter.user.service.impl + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl +import com.jmsoftware.maf.authcenter.role.persistence.Role +import com.jmsoftware.maf.authcenter.role.service.RoleDomainService +import com.jmsoftware.maf.authcenter.user.mapper.UserRoleMapper +import com.jmsoftware.maf.authcenter.user.persistence.User +import com.jmsoftware.maf.authcenter.user.persistence.UserRole +import com.jmsoftware.maf.authcenter.user.service.UserRoleDomainService +import com.jmsoftware.maf.common.exception.InternalServerException +import com.jmsoftware.maf.springcloudstarter.function.requireTrue +import org.springframework.stereotype.Service +import java.util.* + +/** + * # UserRoleDomainServiceImplKt + * + * Change description here. + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, 4/12/22 10:28 AM + **/ +@Service +class UserRoleDomainServiceImpl( + private val roleDomainService: RoleDomainService +) : ServiceImpl(), UserRoleDomainService { + override fun assignRoleByRoleName(user: User, roleName: String) { + val role = Optional.ofNullable( + roleDomainService.ktQuery() + .select(Role::id) + .eq(Role::name, roleName) + .one() + ).orElseThrow { InternalServerException("Cannot find the role: $roleName") } + val userRole = UserRole() + userRole.userId = user.id + userRole.roleId = role.id + requireTrue(save(userRole), null).orElseThrow { + InternalServerException("Cannot assign role ($roleName) to user (${user.username})") + } + } +} diff --git a/auth-center/auth-center-domain/src/test/java/com/jmsoftware/maf/authcenter/package-info.java b/auth-center/auth-center-domain/src/test/java/com/jmsoftware/maf/authcenter/package-info.java deleted file mode 100644 index e702ef59..00000000 --- a/auth-center/auth-center-domain/src/test/java/com/jmsoftware/maf/authcenter/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package com.jmsoftware.maf.authcenter; diff --git a/auth-center/auth-center-domain/src/test/java/com/jmsoftware/maf/authcenter/permission/service/impl/PermissionDomainServiceImplTest.kt b/auth-center/auth-center-domain/src/test/java/com/jmsoftware/maf/authcenter/permission/service/impl/PermissionDomainServiceImplTest.kt new file mode 100644 index 00000000..d0f3b21b --- /dev/null +++ b/auth-center/auth-center-domain/src/test/java/com/jmsoftware/maf/authcenter/permission/service/impl/PermissionDomainServiceImplTest.kt @@ -0,0 +1,79 @@ +package com.jmsoftware.maf.authcenter.permission.service.impl + +import com.jmsoftware.maf.authcenter.permission.mapper.PermissionMapper +import com.jmsoftware.maf.authcenter.permission.persistence.Permission +import com.jmsoftware.maf.common.util.logger +import org.junit.jupiter.api.AfterEach +import org.junit.jupiter.api.Assertions.assertNotNull +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.extension.ExtendWith +import org.junit.jupiter.api.parallel.Execution +import org.junit.jupiter.api.parallel.ExecutionMode +import org.mockito.InjectMocks +import org.mockito.Mock +import org.mockito.Mockito.* +import org.mockito.junit.jupiter.MockitoExtension + +/** + * # PermissionDomainServiceImplTest + * + * Description: PermissionDomainServiceImplTest, change description here. + * + * ## Mockito JUnit 5 Extension + * + * There is also a Mockito extension for JUnit 5 that will make the initialization even simpler. + * + * **Pros:** + * + * * No need to call `MockitoAnnotations.openMocks()` + * * Validates framework usage and detects incorrect stubbing + * * Easy to create mocks + * * Very readable + * + * **Cons:** + * + * * Need an extra dependency on `org.mockito:mockito-junit-jupiter`, which has been included by Spring. + * So we don't have to worry about this. + * + * + * @author Johnny Miller (鍾俊), e-mail: johnnysviva@outlook.com, date: 4/4/2022 8:40 AM + * @see Using Mockito with JUnit 5 + * @see YouTube - Using Mockito with JUnit 5 + */ +@ExtendWith(MockitoExtension::class) +@Execution(ExecutionMode.CONCURRENT) +internal class PermissionDomainServiceImplTest { + companion object { + private val log = logger() + } + + @InjectMocks + private lateinit var permissionDomainService: PermissionDomainServiceImpl + + @Mock + private lateinit var permissionMapper: PermissionMapper + + @BeforeEach + fun setUp() { + log.info("${this.javaClass.simpleName} setUp") + } + + @AfterEach + fun tearDown() { + log.info("${this.javaClass.simpleName} tearDown") + } + + @Test + fun getPermissionListByRoleIdList() { + val permission = Permission() + permission.id = 1 + `when`(permissionMapper.selectPermissionListByRoleIdList(anyList(), anyList())) + .thenReturn(listOf(permission)) + val permissionList = permissionDomainService.getPermissionListByRoleIdList(listOf(), listOf()) + log.info("permissionList: $permissionList") + verify(permissionMapper) + .selectPermissionListByRoleIdList(anyList(), anyList()) + assertNotNull(permissionList) + } +} diff --git a/auth-center/auth-center-domain/src/test/java/com/jmsoftware/maf/authcenter/remote/impl/OssCenterFeignServiceImplTest.kt b/auth-center/auth-center-domain/src/test/java/com/jmsoftware/maf/authcenter/remote/impl/OssCenterFeignServiceImplTest.kt new file mode 100644 index 00000000..287e02af --- /dev/null +++ b/auth-center/auth-center-domain/src/test/java/com/jmsoftware/maf/authcenter/remote/impl/OssCenterFeignServiceImplTest.kt @@ -0,0 +1,82 @@ +package com.jmsoftware.maf.authcenter.remote.impl + +import com.jmsoftware.maf.authcenter.remote.OssCenterFeignClient +import com.jmsoftware.maf.common.bean.ResponseBodyBean +import com.jmsoftware.maf.common.domain.osscenter.write.ObjectResponse +import com.jmsoftware.maf.common.util.logger +import org.junit.jupiter.api.AfterEach +import org.junit.jupiter.api.Assertions.assertNotNull +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.extension.ExtendWith +import org.junit.jupiter.api.parallel.Execution +import org.junit.jupiter.api.parallel.ExecutionMode +import org.mockito.InjectMocks +import org.mockito.Mock +import org.mockito.Mockito.`when` +import org.mockito.junit.jupiter.MockitoExtension +import org.springframework.mock.web.MockMultipartFile + +/** + * # OssCenterFeignServiceImplTest + * + * Description: OssCenterFeignServiceImplTest, change description here. + * + * ## Mockito JUnit 5 Extension + * + * There is also a Mockito extension for JUnit 5 that will make the initialization even simpler. + * + * **Pros:** + * + * * No need to call `MockitoAnnotations.openMocks()` + * * Validates framework usage and detects incorrect stubbing + * * Easy to create mocks + * * Very readable + * + * **Cons:** + * + * * Need an extra dependency on `org.mockito:mockito-junit-jupiter`, which has been included by Spring. + * So we don't have to worry about this. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/10/22 12:38 PM + * @see Using Mockito with JUnit 5 + * @see YouTube - Using Mockito with JUnit 5 + */ +@ExtendWith(MockitoExtension::class) +@Execution(ExecutionMode.CONCURRENT) +internal class OssCenterFeignServiceImplTest { + companion object { + private val log = logger() + } + + @InjectMocks + private lateinit var ossCenterFeignService: OssCenterFeignServiceImpl + + @Mock + private lateinit var ossCenterFeignClient: OssCenterFeignClient + + @BeforeEach + fun setUp() { + log.info("{} setUp", this.javaClass.simpleName) + } + + @AfterEach + fun tearDown() { + log.info("{} tearDown", this.javaClass.simpleName) + } + + @Test + fun uploadSingleResource() { + val multipartFile = MockMultipartFile( + "name-for-unit-test.txt", + "original-filename.txt", + null, + null + ) + `when`(ossCenterFeignClient.uploadSingleResource(multipartFile)) + .thenReturn(ResponseBodyBean.ofSuccess(ObjectResponse())) + val objectResponse = ossCenterFeignService.uploadSingleResource(multipartFile) + assertNotNull(objectResponse) + log.info("Pass: PermissionServiceImplTest#uploadSingleResource. $objectResponse") + } +} diff --git a/auth-center/auth-center-domain/src/test/java/com/jmsoftware/maf/authcenter/role/service/impl/RoleDomainServiceImplTest.kt b/auth-center/auth-center-domain/src/test/java/com/jmsoftware/maf/authcenter/role/service/impl/RoleDomainServiceImplTest.kt new file mode 100644 index 00000000..baa506a4 --- /dev/null +++ b/auth-center/auth-center-domain/src/test/java/com/jmsoftware/maf/authcenter/role/service/impl/RoleDomainServiceImplTest.kt @@ -0,0 +1,155 @@ +package com.jmsoftware.maf.authcenter.role.service.impl + +import cn.hutool.core.collection.CollUtil +import com.baomidou.mybatisplus.core.MybatisConfiguration +import com.baomidou.mybatisplus.core.metadata.TableInfoHelper +import com.fasterxml.jackson.databind.ObjectMapper +import com.jmsoftware.maf.authcenter.role.RoleExcelBean +import com.jmsoftware.maf.authcenter.role.mapper.RoleMapper +import com.jmsoftware.maf.authcenter.role.persistence.Role +import com.jmsoftware.maf.common.exception.InternalServerException +import com.jmsoftware.maf.common.util.logger +import com.jmsoftware.maf.springcloudstarter.property.MafConfigurationProperties +import com.jmsoftware.maf.springcloudstarter.property.MafProjectProperties +import org.apache.ibatis.builder.MapperBuilderAssistant +import org.junit.jupiter.api.AfterEach +import org.junit.jupiter.api.Assertions.* +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.extension.ExtendWith +import org.junit.jupiter.api.parallel.Execution +import org.junit.jupiter.api.parallel.ExecutionMode +import org.mockito.InjectMocks +import org.mockito.Mock +import org.mockito.Mockito.* +import org.mockito.Spy +import org.mockito.junit.jupiter.MockitoExtension +import org.springframework.data.redis.core.RedisTemplate +import org.springframework.data.redis.core.ValueOperations + +/** + * # RoleDomainServiceImplTest + * + * Description: RoleDomainServiceImplTest, change description here. + * + * ## Mockito JUnit 5 Extension + * + * There is also a Mockito extension for JUnit 5 that will make the initialization even simpler. + * + * **Pros:** + * + * * No need to call `MockitoAnnotations.openMocks()` + * * Validates framework usage and detects incorrect stubbing + * * Easy to create mocks + * * Very readable + * + * **Cons:** + * + * * Need an extra dependency on `org.mockito:mockito-junit-jupiter`, which has been included by Spring. + * So we don't have to worry about this. + * + * @author Johnny Miller (鍾俊), e-mail: johnnysviva@outlook.com, date: 4/4/2022 8:40 AM + * @see Using Mockito with JUnit 5 + * @see YouTube - Using Mockito with JUnit 5 + * WrapperTest.kt - MyBatis Plus + */ +@Suppress("unused") +@ExtendWith(MockitoExtension::class) +@Execution(ExecutionMode.CONCURRENT) +internal class RoleDomainServiceImplTest { + companion object { + private val log = logger() + } + + @Spy + @InjectMocks + private lateinit var roleDomainService: RoleDomainServiceImpl + + @Mock + private lateinit var roleMapper: RoleMapper + + @Mock + private lateinit var mafProjectProperties: MafProjectProperties + + @Mock + private lateinit var mafConfigurationProperties: MafConfigurationProperties + + @Mock + private lateinit var redisTemplate: RedisTemplate + + @Mock + private lateinit var valueOperations: ValueOperations + + @Mock + private lateinit var objectMapper: ObjectMapper + + /** + * Set up + * + * @see WrapperTest.kt - MyBatis Plus + */ + @BeforeEach + fun setUp() { + log.info("{} setUp", this.javaClass.simpleName) + TableInfoHelper.initTableInfo(MapperBuilderAssistant(MybatisConfiguration(), ""), Role::class.java) + } + + @AfterEach + fun tearDown() { + log.info("{} tearDown", this.javaClass.simpleName) + } + + @Test + fun getRoleList() { + doReturn(roleMapper).`when`(roleDomainService).baseMapper + `when`(redisTemplate.hasKey(anyString())).thenReturn(false) + `when`(redisTemplate.opsForValue()).thenReturn(valueOperations) + val response = roleDomainService.getRoleList(1L) + log.info("roleListResponse: $response") + assertNotNull(response) + assertTrue(CollUtil.isEmpty(response.roleList)) + } + + @Test + fun roleListByUserId() { + doReturn(roleMapper).`when`(roleDomainService).baseMapper + val roleList = roleDomainService.getRoleListByUserId(1L) + log.info("roleList: $roleList") + assertNotNull(roleList) + assertTrue(CollUtil.isEmpty(roleList)) + } + + @Test + fun checkAdmin() { + doReturn(roleMapper).`when`(roleDomainService).baseMapper + val admin = roleDomainService.checkAdmin(listOf(1L)) + log.info("admin: $admin") + assertFalse(admin) + } + + @Test + fun listForExporting() { + doReturn(roleMapper).`when`(roleDomainService).baseMapper + val thrownException = assertThrows(NullPointerException::class.java) { roleDomainService.getListForExporting() } + log.warn("thrownException for listForExporting(): $thrownException") + } + + @Test + fun validateBeforeAddToBeanList() { + val roleExcelBean = RoleExcelBean() + val thrownException = assertThrows(IllegalArgumentException::class.java) { + roleDomainService.validateBeforeAddToBeanList( + listOf(roleExcelBean), + roleExcelBean, + 0 + ) + } + log.info("Exception thrown: ${thrownException.message}") + } + + @Test + fun save() { + val thrownException = assertThrows(InternalServerException::class.java) { roleDomainService.save(listOf()) } + log.warn("thrownException for save(): $thrownException") + } +} diff --git a/auth-center/auth-center-domain/src/test/java/com/jmsoftware/maf/authcenter/security/service/impl/JwtServiceImplTest.kt b/auth-center/auth-center-domain/src/test/java/com/jmsoftware/maf/authcenter/security/service/impl/JwtServiceImplTest.kt new file mode 100644 index 00000000..f132e058 --- /dev/null +++ b/auth-center/auth-center-domain/src/test/java/com/jmsoftware/maf/authcenter/security/service/impl/JwtServiceImplTest.kt @@ -0,0 +1,148 @@ +package com.jmsoftware.maf.authcenter.security.service.impl + +import cn.hutool.core.util.StrUtil +import com.jmsoftware.maf.common.exception.SecurityException +import com.jmsoftware.maf.common.util.logger +import com.jmsoftware.maf.springcloudstarter.property.JwtConfigurationProperties +import io.jsonwebtoken.Claims +import org.junit.jupiter.api.AfterEach +import org.junit.jupiter.api.Assertions.* +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.extension.ExtendWith +import org.junit.jupiter.api.parallel.Execution +import org.junit.jupiter.api.parallel.ExecutionMode +import org.mockito.InjectMocks +import org.mockito.Mock +import org.mockito.Mockito.* +import org.mockito.Spy +import org.mockito.junit.jupiter.MockitoExtension +import org.springframework.data.redis.core.RedisTemplate +import org.springframework.data.redis.core.ValueOperations +import java.util.concurrent.atomic.AtomicReference +import javax.servlet.http.HttpServletRequest + + +/** + * # JwtServiceImplTest + * + * Description: JwtServiceImplTest, change description here. + * + * ## Mockito JUnit 5 Extension + * + * There is also a Mockito extension for JUnit 5 that will make the initialization even simpler. + * + * **Pros:** + * + * * No need to call `MockitoAnnotations.openMocks()` + * * Validates framework usage and detects incorrect stubbing + * * Easy to create mocks + * * Very readable + * + * **Cons:** + * + * * Need an extra dependency on `org.mockito:mockito-junit-jupiter`, which has been included by Spring. + * So we don't have to worry about this. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/11/22 9:29 PM + * @see Using Mockito with JUnit 5 + * @see YouTube - Using Mockito with JUnit 5 + */ +@ExtendWith(MockitoExtension::class) +@Execution(ExecutionMode.CONCURRENT) +internal class JwtServiceImplTest { + companion object { + private val log = logger() + private const val USER_ID = 1L + private const val USERNAME = "ijohnnymiller" + private const val JWT = "eyJhbGciOiJIUzM4NCJ9" + + ".eyJqdGkiOiIxIiwic3ViIjoiaWpvaG5ueW1pbGxlciIsImlhdCI6MTY0OTA0NTgzMiwicm9sZXMiOltdfQ" + + ".lMQDOTnNsZTaopDBf7O_4zlhPJTZmGB3v6MpjmWnPuMEb2Aj-bXciDh4m2pAYtEp" + } + + @Spy + @InjectMocks + private lateinit var jwtService: JwtServiceImpl + + @Mock + private lateinit var jwtConfigurationProperties: JwtConfigurationProperties + + @Mock + private lateinit var redisTemplate: RedisTemplate + + @Mock + private lateinit var valueOperations: ValueOperations + + @Mock + private lateinit var httpServletRequest: HttpServletRequest + + @BeforeEach + fun setUp() { + log.info("${this.javaClass.simpleName} setUp") + `when`(jwtConfigurationProperties.signingKey) + .thenReturn("signing-key-for-unit-test-only-do-not-use-in-production") + jwtService.init() + } + + @AfterEach + fun tearDown() { + log.info("{} tearDown", this.javaClass.simpleName) + } + + @Test + fun createJwt() { + `when`(redisTemplate.opsForValue()).thenReturn(valueOperations) + doNothing().`when`(valueOperations)[anyString(), anyString(), anyLong()] = any() + val jwt = jwtService.createJwt(true, USER_ID, USERNAME, listOf(), listOf()) + assertNotEquals(0, jwt.length) + } + + @Test + fun parseJwt() { + `when`(redisTemplate.opsForValue()).thenReturn(valueOperations) + `when`(valueOperations.operations).thenReturn(redisTemplate) + val claimsAtomicReference = AtomicReference() + assertThrows(SecurityException::class.java) { claimsAtomicReference.set(jwtService.parseJwt(JWT)) } + log.info("Parse JWT. claimsAtomicReference: ${claimsAtomicReference.hashCode()}") + assertNotNull(claimsAtomicReference) + assertNull(claimsAtomicReference.get()) + } + + @Test + fun invalidateJwt() { + `when`(redisTemplate.opsForValue()).thenReturn(valueOperations) + `when`(valueOperations.operations).thenReturn(redisTemplate) + doReturn(JWT).`when`(jwtService).getJwtFromRequest(httpServletRequest) + assertThrows(SecurityException::class.java) { jwtService.invalidateJwt(httpServletRequest) } + } + + @Test + fun usernameFromJwt() { + `when`(redisTemplate.opsForValue()).thenReturn(valueOperations) + `when`(valueOperations.operations).thenReturn(redisTemplate) + assertThrows(SecurityException::class.java) { jwtService.getUsernameFromJwt(JWT) } + } + + @Test + fun getUsernameFromRequest() { + `when`(redisTemplate.opsForValue()).thenReturn(valueOperations) + `when`(valueOperations.operations).thenReturn(redisTemplate) + doReturn(JWT).`when`(jwtService).getJwtFromRequest(httpServletRequest) + val thrownException = + assertThrows(SecurityException::class.java) { jwtService.getUsernameFromRequest(httpServletRequest) } + log.warn("Thrown exception: ${thrownException.message}") + } + + @Test + fun jwtFromRequest() { + val jwt = jwtService.getJwtFromRequest(httpServletRequest) + log.info("JWT: $jwt") + assertTrue(StrUtil.isNotBlank(jwt)) + } + + @Test + fun parse() { + val thrownException = assertThrows(SecurityException::class.java) { jwtService.parse(httpServletRequest) } + log.warn("Thrown exception: ${thrownException.message}") + } +} diff --git a/auth-center/auth-center-domain/src/test/java/com/jmsoftware/maf/authcenter/user/service/impl/UserDomainServiceImplTest.kt b/auth-center/auth-center-domain/src/test/java/com/jmsoftware/maf/authcenter/user/service/impl/UserDomainServiceImplTest.kt new file mode 100644 index 00000000..0a820fae --- /dev/null +++ b/auth-center/auth-center-domain/src/test/java/com/jmsoftware/maf/authcenter/user/service/impl/UserDomainServiceImplTest.kt @@ -0,0 +1,167 @@ +package com.jmsoftware.maf.authcenter.user.service.impl + +import cn.hutool.core.collection.CollUtil +import com.baomidou.mybatisplus.core.MybatisConfiguration +import com.baomidou.mybatisplus.core.metadata.TableInfoHelper +import com.jmsoftware.maf.authcenter.security.service.JwtService +import com.jmsoftware.maf.authcenter.user.mapper.UserMapper +import com.jmsoftware.maf.authcenter.user.payload.GetUserPageListPayload +import com.jmsoftware.maf.authcenter.user.payload.GetUserStatusPayload +import com.jmsoftware.maf.authcenter.user.persistence.User +import com.jmsoftware.maf.authcenter.user.service.UserRoleDomainService +import com.jmsoftware.maf.common.domain.authcenter.user.LoginPayload +import com.jmsoftware.maf.common.domain.authcenter.user.SignupPayload +import com.jmsoftware.maf.common.exception.SecurityException +import com.jmsoftware.maf.common.util.logger +import com.jmsoftware.maf.springcloudstarter.property.MafConfigurationProperties +import com.jmsoftware.maf.springcloudstarter.property.MafProjectProperties +import org.apache.ibatis.builder.MapperBuilderAssistant +import org.junit.jupiter.api.AfterEach +import org.junit.jupiter.api.Assertions.* +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.extension.ExtendWith +import org.junit.jupiter.api.parallel.Execution +import org.junit.jupiter.api.parallel.ExecutionMode +import org.mockito.InjectMocks +import org.mockito.Mock +import org.mockito.Mockito.* +import org.mockito.Spy +import org.mockito.junit.jupiter.MockitoExtension +import org.springframework.context.MessageSource +import org.springframework.data.redis.core.RedisTemplate +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder +import javax.servlet.http.HttpServletRequest + +/** + * # UserDomainServiceImplTest + * + * Description: UserDomainServiceImplTest, change description here. + * + * ## Mockito JUnit 5 Extension + * + * There is also a Mockito extension for JUnit 5 that will make the initialization even simpler. + * + * **Pros:** + * + * * No need to call `MockitoAnnotations.openMocks()` + * * Validates framework usage and detects incorrect stubbing + * * Easy to create mocks + * * Very readable + * + * **Cons:** + * + * * Need an extra dependency on `org.mockito:mockito-junit-jupiter`, which has been included by Spring. + * So we don't have to worry about this. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/12/22 7:46 AM + * @see Using Mockito with JUnit 5 + * @see YouTube - Using Mockito with JUnit 5 + */ +@Suppress("unused") +@ExtendWith(MockitoExtension::class) +@Execution(ExecutionMode.CONCURRENT) +internal class UserDomainServiceImplTest { + companion object { + private const val USERNAME = "ijohnnymiller" + private val log = logger() + } + + @Spy + @InjectMocks + lateinit var userDomainService: UserDomainServiceImpl + + @Mock + lateinit var userMapper: UserMapper + + @Mock + lateinit var bCryptPasswordEncoder: BCryptPasswordEncoder + + @Mock + lateinit var jwtService: JwtService + + @Mock + lateinit var messageSource: MessageSource + + @Mock + lateinit var mafProjectProperties: MafProjectProperties + + @Mock + lateinit var redisTemplate: RedisTemplate + + @Mock + lateinit var userRoleDomainService: UserRoleDomainService + + @Mock + lateinit var mafConfigurationProperties: MafConfigurationProperties + + @Mock + lateinit var httpServletRequest: HttpServletRequest + + @BeforeEach + fun setUp() { + log.info("{} setUp", this.javaClass.simpleName) + TableInfoHelper.initTableInfo(MapperBuilderAssistant(MybatisConfiguration(), ""), User::class.java) + } + + @AfterEach + fun tearDown() { + log.info("{} tearDown", this.javaClass.simpleName) + } + + @Test + fun getUserByLoginToken() { + doReturn(userMapper).`when`(userDomainService).baseMapper + val user = userDomainService.getUserByLoginToken(USERNAME) + log.info("User: {}", user) + assertNull(user) + } + + @Test + fun saveUserForSignup() { + doReturn(userMapper).`when`(userDomainService).baseMapper + `when`(bCryptPasswordEncoder.encode(anyString())).thenReturn("encrypted-password-for-unit-test") + `when`(mafConfigurationProperties.guestUserRole).thenReturn("guest") + val payload = SignupPayload() + payload.username = USERNAME + payload.email = "johnnysviva@outlook.com" + payload.password = "password-for-unit-test" + val signupResponse = userDomainService.saveUserForSignup(payload) + log.info("Signup response: {}", signupResponse) + assertNotNull(signupResponse) + } + + @Test + fun login() { + doReturn(userMapper).`when`(userDomainService).baseMapper + val payload = LoginPayload() + payload.loginToken = USERNAME + val thrownException = assertThrows(SecurityException::class.java) { userDomainService.login(payload) } + log.warn("Thrown exception: ${thrownException.message}") + } + + @Test + fun logout() { + val logout = userDomainService.logout(httpServletRequest) + assertTrue(logout) + } + + @Test + fun getUserStatus() { + val payload = GetUserStatusPayload() + payload.status = 1.toByte() + payload.status2 = 0.toByte() + val thrownException = + assertThrows(IllegalStateException::class.java) { userDomainService.getUserStatus(payload) } + log.warn("Thrown exception: ${thrownException.message}") + } + + @Test + fun getUserPageList() { + doReturn(userMapper).`when`(userDomainService).baseMapper + val response = userDomainService.getUserPageList(GetUserPageListPayload()) + log.info("User page list: {}", response) + assertNotNull(response) + assertTrue(CollUtil.isEmpty(response.list)) + } +} diff --git a/auth-center/auth-center-domain/src/test/java/com/jmsoftware/maf/authcenter/user/service/impl/UserRoleDomainServiceImplTest.kt b/auth-center/auth-center-domain/src/test/java/com/jmsoftware/maf/authcenter/user/service/impl/UserRoleDomainServiceImplTest.kt new file mode 100644 index 00000000..928c67bb --- /dev/null +++ b/auth-center/auth-center-domain/src/test/java/com/jmsoftware/maf/authcenter/user/service/impl/UserRoleDomainServiceImplTest.kt @@ -0,0 +1,96 @@ +package com.jmsoftware.maf.authcenter.user.service.impl + +import com.baomidou.mybatisplus.core.MybatisConfiguration +import com.baomidou.mybatisplus.core.metadata.TableInfoHelper +import com.baomidou.mybatisplus.extension.kotlin.KtQueryChainWrapper +import com.jmsoftware.maf.authcenter.role.mapper.RoleMapper +import com.jmsoftware.maf.authcenter.role.persistence.Role +import com.jmsoftware.maf.authcenter.role.service.RoleDomainService +import com.jmsoftware.maf.authcenter.user.mapper.UserRoleMapper +import com.jmsoftware.maf.authcenter.user.persistence.User +import com.jmsoftware.maf.authcenter.user.persistence.UserRole +import com.jmsoftware.maf.common.exception.InternalServerException +import com.jmsoftware.maf.common.util.logger +import org.apache.ibatis.builder.MapperBuilderAssistant +import org.junit.jupiter.api.AfterEach +import org.junit.jupiter.api.Assertions.assertThrows +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.extension.ExtendWith +import org.junit.jupiter.api.parallel.Execution +import org.junit.jupiter.api.parallel.ExecutionMode +import org.mockito.InjectMocks +import org.mockito.Mock +import org.mockito.Mockito.`when` +import org.mockito.Spy +import org.mockito.junit.jupiter.MockitoExtension + +/** + * # UserRoleDomainServiceImplTest + * + * Description: UserRoleDomainServiceImplTest, change description here. + * + * ## Mockito JUnit 5 Extension + * + * There is also a Mockito extension for JUnit 5 that will make the initialization even simpler. + * + * **Pros:** + * + * * No need to call `MockitoAnnotations.openMocks()` + * * Validates framework usage and detects incorrect stubbing + * * Easy to create mocks + * * Very readable + * + * **Cons:** + * + * * Need an extra dependency on `org.mockito:mockito-junit-jupiter`, which has been included by Spring. + * So we don't have to worry about this. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/12/22 10:23 AM + * @see Using Mockito with JUnit 5 + * @see YouTube - Using Mockito with JUnit 5 + */ +@Suppress("unused") +@ExtendWith(MockitoExtension::class) +@Execution(ExecutionMode.CONCURRENT) +internal class UserRoleDomainServiceImplTest { + companion object { + private val log = logger() + } + + @Spy + @InjectMocks + private lateinit var userRoleDomainService: UserRoleDomainServiceImpl + + @Mock + private lateinit var userRoleMapper: UserRoleMapper + + @Mock + private lateinit var roleMapper: RoleMapper + + @Mock + private lateinit var roleDomainService: RoleDomainService + + @BeforeEach + fun setUp() { + log.info("{} setUp", this.javaClass.simpleName) + TableInfoHelper.initTableInfo(MapperBuilderAssistant(MybatisConfiguration(), ""), UserRole::class.java) + TableInfoHelper.initTableInfo(MapperBuilderAssistant(MybatisConfiguration(), ""), Role::class.java) + } + + @AfterEach + fun tearDown() { + log.info("{} tearDown", this.javaClass.simpleName) + } + + @Test + fun assignRoleByRoleName() { + `when`(roleDomainService.ktQuery()).thenReturn(KtQueryChainWrapper(roleMapper, Role::class.java)) + val user = User() + user.username = "johnny" + val thrownException = assertThrows(InternalServerException::class.java) { + userRoleDomainService.assignRoleByRoleName(user, "ROLE_ADMIN_FOR_UNIT_TEST") + } + log.warn("Exception: ${thrownException.message}") + } +} diff --git a/auth-center/auth-center-infra/pom.xml b/auth-center/auth-center-infra/pom.xml index 307eadc2..14255f21 100644 --- a/auth-center/auth-center-infra/pom.xml +++ b/auth-center/auth-center-infra/pom.xml @@ -11,6 +11,6 @@ com.jmsoftware.maf auth-center - 0.0.8.1 + 0.0.9 diff --git a/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/permission/configuration/PermissionConfiguration.kt b/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/permission/configuration/PermissionConfiguration.kt new file mode 100644 index 00000000..28c29711 --- /dev/null +++ b/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/permission/configuration/PermissionConfiguration.kt @@ -0,0 +1,24 @@ +package com.jmsoftware.maf.authcenter.permission.configuration + +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.NotEmpty + +/** + * Description: PermissionConfiguration, change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/11/22 5:35 PM + */ +@Validated +@RefreshScope +@Configuration +@ConfigurationProperties(prefix = PermissionConfiguration.PREFIX) +class PermissionConfiguration( + @NotEmpty var ignoredServiceIds: Set +) { + companion object { + const val PREFIX = "maf.configuration.permission" + } +} diff --git a/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/permission/converter/PermissionMapStructMapper.kt b/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/permission/converter/PermissionMapStructMapper.kt new file mode 100644 index 00000000..a1da8c6c --- /dev/null +++ b/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/permission/converter/PermissionMapStructMapper.kt @@ -0,0 +1,25 @@ +package com.jmsoftware.maf.authcenter.permission.converter + +import com.jmsoftware.maf.authcenter.permission.persistence.Permission +import org.mapstruct.Mapper +import org.mapstruct.factory.Mappers.getMapper + +/** + * Description: PermissionMapStructMapper, change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/11/22 6:04 PM + */ +@Mapper +interface PermissionMapStructMapper { + companion object { + val INSTANCE: PermissionMapStructMapper = getMapper(PermissionMapStructMapper::class.java) + } + + /** + * Permission -> GetPermissionListByRoleIdListResponse.Permission + * + * @param permission the permission + * @return the get permission list by role id list response . permission + */ + fun of(permission: Permission): com.jmsoftware.maf.common.domain.authcenter.permission.Permission +} diff --git a/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/permission/mapper/PermissionMapper.java b/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/permission/mapper/PermissionMapper.java deleted file mode 100644 index c4d72251..00000000 --- a/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/permission/mapper/PermissionMapper.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.jmsoftware.maf.authcenter.permission.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.jmsoftware.maf.authcenter.permission.persistence.Permission; -import com.jmsoftware.maf.common.domain.authcenter.permission.PermissionType; -import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Param; - -import java.util.List; - -/** - *

PermissionMapper

- *

- * Mapper of Permission.(Permission) - * - * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com - * @date 5 /11/20 8:34 AM - */ -@Mapper -public interface PermissionMapper extends BaseMapper { - /** - * Select permission list by role id list list. - * - * @param roleIdList the role id list - * @param permissionTypeList the permission type list - * @return the list - */ - List selectPermissionListByRoleIdList( - @Param("roleIdList") List roleIdList, - @Param("permissionTypeList") List permissionTypeList - ); -} diff --git a/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/permission/mapper/PermissionMapper.kt b/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/permission/mapper/PermissionMapper.kt new file mode 100644 index 00000000..4709433b --- /dev/null +++ b/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/permission/mapper/PermissionMapper.kt @@ -0,0 +1,29 @@ +package com.jmsoftware.maf.authcenter.permission.mapper + +import com.baomidou.mybatisplus.core.mapper.BaseMapper +import com.jmsoftware.maf.authcenter.permission.persistence.Permission +import com.jmsoftware.maf.common.domain.authcenter.permission.PermissionType +import org.apache.ibatis.annotations.Mapper +import org.apache.ibatis.annotations.Param + +/** + * # PermissionMapper + * + * Mapper of Permission. (Permission) + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/11/22 6:06 PM + */ +@Mapper +interface PermissionMapper : BaseMapper { + /** + * Select permission list by role id list. + * + * @param roleIdList the role id list + * @param permissionTypeList the permission type list + * @return the list + */ + fun selectPermissionListByRoleIdList( + @Param("roleIdList") roleIdList: List, + @Param("permissionTypeList") permissionTypeList: List + ): List +} diff --git a/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/permission/persistence/Permission.java b/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/permission/persistence/Permission.java deleted file mode 100644 index 7323ac92..00000000 --- a/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/permission/persistence/Permission.java +++ /dev/null @@ -1,103 +0,0 @@ -package com.jmsoftware.maf.authcenter.permission.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.time.LocalDateTime; - -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 { - 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"; - /** - * 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 LocalDateTime createdTime; - /** - * Modified by - */ - @TableField(value = COL_MODIFIED_BY, fill = UPDATE) - private Long modifiedBy; - /** - * Modified time - */ - @TableField(value = COL_MODIFIED_TIME, fill = UPDATE) - private LocalDateTime modifiedTime; - /** - * Deleted flag - */ - @TableField(value = COL_DELETED, fill = INSERT) - private Byte deleted; -} diff --git a/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/permission/persistence/Permission.kt b/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/permission/persistence/Permission.kt new file mode 100644 index 00000000..4ba287cc --- /dev/null +++ b/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/permission/persistence/Permission.kt @@ -0,0 +1,68 @@ +package com.jmsoftware.maf.authcenter.permission.persistence + +import com.baomidou.mybatisplus.annotation.TableField +import com.baomidou.mybatisplus.annotation.TableName +import com.jmsoftware.maf.springcloudstarter.database.BasePersistenceEntity + +/** + * # Permission + * + * Permission Persistence object class + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/11/22 4:19 PM + */ +@TableName(value = Permission.TABLE_NAME) +class Permission : BasePersistenceEntity() { + companion object { + const val TABLE_NAME = "permission" + const val COL_URL = "url" + const val COL_DESCRIPTION = "description" + const val COL_TYPE = "type" + const val COL_PERMISSION_EXPRESSION = "permission_expression" + const val COL_METHOD = "method" + const val COL_SORT = "`sort`" + const val COL_PARENT_ID = "parent_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) + lateinit var url: String + + /** + * Permission description + */ + @TableField(value = COL_DESCRIPTION) + lateinit var description: String + + /** + * Permission type. 1 - page; 2 - button + */ + @TableField(value = COL_TYPE) + var type: Byte = 0 + + /** + * Permission expression + */ + @TableField(value = COL_PERMISSION_EXPRESSION) + lateinit var permissionExpression: String + + /** + * HTTP method of API + */ + @TableField(value = COL_METHOD) + lateinit var method: String + + /** + * Sort number + */ + @TableField(value = COL_SORT) + var sort: Int = 0 + + /** + * Primary key of parent + */ + @TableField(value = COL_PARENT_ID) + var parentId: Long? = null +} diff --git a/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/permission/response/GetServicesInfoResponse.java b/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/permission/response/GetServicesInfoResponse.java deleted file mode 100644 index 6bebf385..00000000 --- a/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/permission/response/GetServicesInfoResponse.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.jmsoftware.maf.authcenter.permission.response; - -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/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/permission/response/GetServicesInfoResponse.kt b/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/permission/response/GetServicesInfoResponse.kt new file mode 100644 index 00000000..0df452db --- /dev/null +++ b/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/permission/response/GetServicesInfoResponse.kt @@ -0,0 +1,17 @@ +package com.jmsoftware.maf.authcenter.permission.response + +import com.jmsoftware.maf.common.domain.springbootstarter.HttpApiResourcesResponse + +/** + * Description: GetServicesInfoResponse, change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/11/22 6:08 PM + */ +class GetServicesInfoResponse { + lateinit var list: List + + class ServiceInfo { + lateinit var serviceId: String + lateinit var httpApiResources: HttpApiResourcesResponse + } +} diff --git a/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/remote/OssCenterFeignClient.kt b/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/remote/OssCenterFeignClient.kt new file mode 100644 index 00000000..64e694dd --- /dev/null +++ b/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/remote/OssCenterFeignClient.kt @@ -0,0 +1,53 @@ +package com.jmsoftware.maf.authcenter.remote + +import com.jmsoftware.maf.authcenter.remote.OssCenterFeignClient.OssCenterFeignClientFallback +import com.jmsoftware.maf.common.bean.ResponseBodyBean +import com.jmsoftware.maf.common.domain.osscenter.write.ObjectResponse +import com.jmsoftware.maf.common.util.logger +import org.springframework.cloud.openfeign.FeignClient +import org.springframework.context.annotation.Primary +import org.springframework.http.MediaType +import org.springframework.stereotype.Component +import org.springframework.validation.annotation.Validated +import org.springframework.web.bind.annotation.PostMapping +import org.springframework.web.bind.annotation.RequestPart +import org.springframework.web.multipart.MultipartFile +import javax.validation.constraints.NotNull + +/** + * # OssCenterFeignClient + * + * Description: OssCenterFeignClient, change description here. + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 9/15/2021 11:10 AM + * @see Spring Cloud OpenFeign + */ +@Primary +@Validated +@FeignClient(value = OssCenterFeignClient.SERVICE_NAME, fallback = OssCenterFeignClientFallback::class) +interface OssCenterFeignClient { + companion object { + const val SERVICE_NAME = "oss-center" + } + + /** + * Upload single resource response body bean. + * + * @param multipartFile the multipart file + * @return the response body bean + */ + @PostMapping(value = ["/upload/single"], consumes = [MediaType.MULTIPART_FORM_DATA_VALUE]) + fun uploadSingleResource(@RequestPart("file") multipartFile: @NotNull MultipartFile): ResponseBodyBean + + @Component + class OssCenterFeignClientFallback : OssCenterFeignClient { + companion object { + private val log = logger() + } + + override fun uploadSingleResource(multipartFile: @NotNull MultipartFile): ResponseBodyBean { + log.error("Fallback -> OssCenterFeignClient#uploadSingleResource()") + return ResponseBodyBean.ofFailureMessage("Fell back uploading single resource") + } + } +} diff --git a/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/remote/OssCenterRemoteApi.java b/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/remote/OssCenterRemoteApi.java deleted file mode 100644 index a7460390..00000000 --- a/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/remote/OssCenterRemoteApi.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.jmsoftware.maf.authcenter.remote; - -import com.jmsoftware.maf.common.bean.ResponseBodyBean; -import com.jmsoftware.maf.common.domain.osscenter.write.ObjectResponse; -import lombok.extern.slf4j.Slf4j; -import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.http.MediaType; -import org.springframework.stereotype.Component; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestPart; -import org.springframework.web.multipart.MultipartFile; - -import javax.validation.constraints.NotNull; - -/** - * Description: OssCenterRemoteApi, change description here. - * - * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 9/15/2021 11:10 AM - * @see Spring Cloud OpenFeign - **/ -@Validated -@FeignClient(value = OssCenterRemoteApi.SERVICE_NAME, fallback = OssCenterRemoteApi.OssCenterRemoteApiFallback.class) -public interface OssCenterRemoteApi { - String SERVICE_NAME = "oss-center"; - - /** - * Upload single resource response body bean. - * - * @param multipartFile the multipart file - * @return the response body bean - */ - @PostMapping(value = "/upload/single", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) - ResponseBodyBean uploadSingleResource(@NotNull @RequestPart("file") MultipartFile multipartFile); - - @Slf4j - @Component - class OssCenterRemoteApiFallback implements OssCenterRemoteApi { - @Override - public ResponseBodyBean uploadSingleResource(@NotNull MultipartFile multipartFile) { - log.error("Fallback -> OssCenterRemoteApi#uploadSingleResource()"); - return null; - } - } -} diff --git a/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/role/RoleExcelBean.java b/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/role/RoleExcelBean.java deleted file mode 100644 index 526101e9..00000000 --- a/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/role/RoleExcelBean.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.jmsoftware.maf.authcenter.role; - -import com.jmsoftware.maf.authcenter.role.persistence.Role; -import com.jmsoftware.maf.springcloudstarter.poi.ExcelColumn; -import lombok.Data; -import lombok.val; - -import javax.validation.constraints.NotBlank; - -/** - * Description: RoleExcelBean, change description here. - * - * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 8/22/2021 10:52 AM - **/ -@Data -public class RoleExcelBean { - /** - * Role name - */ - @NotBlank - @ExcelColumn(name = "Name") - private String name; - /** - * Role description - */ - @NotBlank - @ExcelColumn(name = "Description") - private String description; - - /** - * Transform by role. - * - * @param role the role - * @return the role excel import - */ - public static RoleExcelBean transformBy(Role role) { - val roleExcelImport = new RoleExcelBean(); - roleExcelImport.setName(role.getName()); - roleExcelImport.setDescription(role.getDescription()); - return roleExcelImport; - } - - /** - * Transform by role. - * - * @param roleExcelBean the role excel import - * @return the role excel import - */ - public static Role transformTo(RoleExcelBean roleExcelBean) { - val role = new Role(); - role.setName(roleExcelBean.getName()); - role.setDescription(roleExcelBean.getDescription()); - return role; - } -} diff --git a/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/role/RoleExcelBean.kt b/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/role/RoleExcelBean.kt new file mode 100644 index 00000000..cec524a0 --- /dev/null +++ b/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/role/RoleExcelBean.kt @@ -0,0 +1,56 @@ +package com.jmsoftware.maf.authcenter.role + +import com.jmsoftware.maf.authcenter.role.persistence.Role +import com.jmsoftware.maf.springcloudstarter.poi.ExcelColumn +import javax.validation.constraints.NotBlank + +/** + * # RoleExcelBean + * + * Description: RoleExcelBean, change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/12/22 12:40 PM + */ +class RoleExcelBean { + /** + * Role name + */ + @NotBlank + @ExcelColumn(name = "Name") + private lateinit var name: String + + /** + * Role description + */ + @NotBlank + @ExcelColumn(name = "Description") + private lateinit var description: String + + companion object { + /** + * Transform by role. + * + * @param role the role + * @return the role excel import + */ + fun transformBy(role: Role): RoleExcelBean { + val roleExcelImport = RoleExcelBean() + roleExcelImport.name = role.name + roleExcelImport.description = role.description + return roleExcelImport + } + + /** + * Transform by role. + * + * @param roleExcelBean the role excel import + * @return the role excel import + */ + fun transformTo(roleExcelBean: RoleExcelBean): Role { + val role = Role() + role.name = roleExcelBean.name + role.description = roleExcelBean.description + return role + } + } +} diff --git a/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/role/constant/RoleRedisKey.java b/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/role/constant/RoleRedisKey.java deleted file mode 100644 index baff6d64..00000000 --- a/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/role/constant/RoleRedisKey.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.jmsoftware.maf.authcenter.role.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/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/role/constant/RoleRedisKey.kt b/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/role/constant/RoleRedisKey.kt new file mode 100644 index 00000000..6c2ec625 --- /dev/null +++ b/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/role/constant/RoleRedisKey.kt @@ -0,0 +1,17 @@ +package com.jmsoftware.maf.authcenter.role.constant + +/** + * # RoleRedisKey + * + * Change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/12/22 12:37 PM + */ +enum class RoleRedisKey( + val keyInfixFormat: String +) { + /** + * 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:"); +} diff --git a/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/role/mapper/RoleMapper.java b/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/role/mapper/RoleMapper.java deleted file mode 100644 index 928d531e..00000000 --- a/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/role/mapper/RoleMapper.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.jmsoftware.maf.authcenter.role.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.jmsoftware.maf.authcenter.role.persistence.Role; -import com.jmsoftware.maf.common.domain.authcenter.role.GetRoleListByUserIdSingleResponse; -import org.apache.ibatis.annotations.Mapper; - -import java.util.List; - -/** - *

RoleMapper

- *

- * Mapper of Role.(Role) - * - * @author Johnny Miller (锺俊) - * @date 2020 -05-10 22:39:48 - */ -@Mapper -public interface RoleMapper extends BaseMapper { - /** - * Select role list by user id list. - * - * @param userId the user id - * @return the list - */ - List selectRoleListByUserId(Long userId); - - /** - * Select by id role persistence. - * - * @param roleName the role name - * @return the role persistence - */ - Role selectByName(String roleName); -} diff --git a/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/role/mapper/RoleMapper.kt b/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/role/mapper/RoleMapper.kt new file mode 100644 index 00000000..d6f2e558 --- /dev/null +++ b/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/role/mapper/RoleMapper.kt @@ -0,0 +1,32 @@ +package com.jmsoftware.maf.authcenter.role.mapper + +import com.baomidou.mybatisplus.core.mapper.BaseMapper +import com.jmsoftware.maf.authcenter.role.persistence.Role +import com.jmsoftware.maf.common.domain.authcenter.role.GetRoleListByUserIdSingleResponse +import org.apache.ibatis.annotations.Mapper + +/** + * # RoleMapper + * + * MyBatis Mapper of Role. (Role) + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/12/22 12:39 PM + */ +@Mapper +interface RoleMapper : BaseMapper { + /** + * Select role list by user id list. + * + * @param userId the user id + * @return the list + */ + fun selectRoleListByUserId(userId: Long): List + + /** + * Select by id role persistence. + * + * @param roleName the role name + * @return the role persistence + */ + fun selectByName(roleName: String): Role +} diff --git a/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/role/persistence/Role.java b/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/role/persistence/Role.java deleted file mode 100644 index 2503ae3f..00000000 --- a/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/role/persistence/Role.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.jmsoftware.maf.authcenter.role.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.time.LocalDateTime; - -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 { - 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"; - /** - * 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 LocalDateTime createdTime; - /** - * Modified by - */ - @TableField(value = COL_MODIFIED_BY, fill = UPDATE) - private Long modifiedBy; - /** - * Modified time - */ - @TableField(value = COL_MODIFIED_TIME, fill = UPDATE) - private LocalDateTime modifiedTime; - /** - * Deleted flag. - */ - @TableField(value = COL_DELETED, fill = INSERT) - private Byte deleted; -} diff --git a/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/role/persistence/Role.kt b/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/role/persistence/Role.kt new file mode 100644 index 00000000..9095885a --- /dev/null +++ b/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/role/persistence/Role.kt @@ -0,0 +1,34 @@ +package com.jmsoftware.maf.authcenter.role.persistence + +import com.baomidou.mybatisplus.annotation.TableField +import com.baomidou.mybatisplus.annotation.TableName +import com.jmsoftware.maf.springcloudstarter.database.BasePersistenceEntity + +/** + * # Role + * + * Role Persistence object class + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/10/22 7:15 PM + * @see MySQL Keywords and Reserved Words + */ +@TableName(value = Role.TABLE_NAME) +class Role : BasePersistenceEntity() { + companion object { + const val TABLE_NAME = "role" + const val COL_NAME = "`name`" + const val COL_DESCRIPTION = "`description`" + } + + /** + * Role name + */ + @TableField(value = COL_NAME) + lateinit var name: String + + /** + * Role description + */ + @TableField(value = COL_DESCRIPTION) + lateinit var description: String +} diff --git a/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/user/constant/UserRedisKey.java b/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/user/constant/UserRedisKey.java deleted file mode 100644 index 5c906b55..00000000 --- a/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/user/constant/UserRedisKey.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.jmsoftware.maf.authcenter.user.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/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/user/constant/UserRedisKey.kt b/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/user/constant/UserRedisKey.kt new file mode 100644 index 00000000..3da7a3e1 --- /dev/null +++ b/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/user/constant/UserRedisKey.kt @@ -0,0 +1,17 @@ +package com.jmsoftware.maf.authcenter.user.constant + +/** + * # UserRedisKey + * + * Description: UserRedisKey, change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/12/22 12:43 PM + */ +enum class UserRedisKey( + val keyInfixFormat: String +) { + /** + * 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"); +} diff --git a/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/user/converter/UserMapStructMapper.kt b/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/user/converter/UserMapStructMapper.kt new file mode 100644 index 00000000..0b5aeaa3 --- /dev/null +++ b/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/user/converter/UserMapStructMapper.kt @@ -0,0 +1,27 @@ +package com.jmsoftware.maf.authcenter.user.converter + +import com.jmsoftware.maf.authcenter.user.converter.UserMapStructMapper +import com.jmsoftware.maf.authcenter.user.persistence.User +import com.jmsoftware.maf.common.domain.authcenter.user.GetUserByLoginTokenResponse +import org.mapstruct.Mapper +import org.mapstruct.factory.Mappers + +/** + * Description: UserMapStructMapper, change description here. + * + * @author Johnny Miller (鍾俊), e-mail: johnnysviva@outlook.com, date: 2/5/2022 7:15 PM + */ +@Mapper +interface UserMapStructMapper { + companion object { + val INSTANCE: UserMapStructMapper = Mappers.getMapper(UserMapStructMapper::class.java) + } + + /** + * User -> response. + * + * @param user the user + * @return the get user by login token response + */ + fun of(user: User): GetUserByLoginTokenResponse +} diff --git a/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/user/mapper/UserMapper.java b/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/user/mapper/UserMapper.java deleted file mode 100644 index 0a832051..00000000 --- a/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/user/mapper/UserMapper.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.jmsoftware.maf.authcenter.user.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.jmsoftware.maf.authcenter.user.persistence.User; -import org.apache.ibatis.annotations.Mapper; - -/** - *

UserMapper

- *

- * Mapper of UserPersistence.(UserPersistence) - * - * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com - * @date 5 /10/20 12:17 PM - */ -@Mapper -public interface UserMapper extends BaseMapper { -} diff --git a/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/user/mapper/UserMapper.kt b/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/user/mapper/UserMapper.kt new file mode 100644 index 00000000..da6fdfce --- /dev/null +++ b/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/user/mapper/UserMapper.kt @@ -0,0 +1,15 @@ +package com.jmsoftware.maf.authcenter.user.mapper + +import com.baomidou.mybatisplus.core.mapper.BaseMapper +import com.jmsoftware.maf.authcenter.user.persistence.User +import org.apache.ibatis.annotations.Mapper + +/** + * # UserMapper + * + * Mapper of UserPersistence.(UserPersistence) + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/12/22 12:45 PM + */ +@Mapper +interface UserMapper : BaseMapper diff --git a/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/user/mapper/UserRoleMapper.java b/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/user/mapper/UserRoleMapper.java deleted file mode 100644 index c2253e90..00000000 --- a/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/user/mapper/UserRoleMapper.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.jmsoftware.maf.authcenter.user.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.jmsoftware.maf.authcenter.user.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/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/user/mapper/UserRoleMapper.kt b/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/user/mapper/UserRoleMapper.kt new file mode 100644 index 00000000..b0e182f6 --- /dev/null +++ b/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/user/mapper/UserRoleMapper.kt @@ -0,0 +1,15 @@ +package com.jmsoftware.maf.authcenter.user.mapper + +import com.baomidou.mybatisplus.core.mapper.BaseMapper +import com.jmsoftware.maf.authcenter.user.persistence.UserRole +import org.apache.ibatis.annotations.Mapper + +/** + * # UserRoleMapper + * + * Mapper of user_role. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/12/22 12:45 PM + */ +@Mapper +interface UserRoleMapper : BaseMapper diff --git a/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/user/payload/GetUserPageListPayload.java b/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/user/payload/GetUserPageListPayload.java deleted file mode 100644 index f4ace9fc..00000000 --- a/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/user/payload/GetUserPageListPayload.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.jmsoftware.maf.authcenter.user.payload; - -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/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/user/payload/GetUserPageListPayload.kt b/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/user/payload/GetUserPageListPayload.kt new file mode 100644 index 00000000..9b5abe64 --- /dev/null +++ b/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/user/payload/GetUserPageListPayload.kt @@ -0,0 +1,23 @@ +package com.jmsoftware.maf.authcenter.user.payload + +import com.jmsoftware.maf.common.bean.PaginationBase +import com.jmsoftware.maf.springcloudstarter.validation.annotation.DateTimeRangeGroup +import com.jmsoftware.maf.springcloudstarter.validation.annotation.DateTimeRangeType +import java.time.LocalDateTime + +/** + * # GetUserPageListPayload + * + * Description: GetUserPageList, change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/12/22 12:46 PM + */ +class GetUserPageListPayload : PaginationBase() { + var username: String? = null + + @DateTimeRangeGroup(type = DateTimeRangeType.START_TIME) + val startTime: LocalDateTime? = null + + @DateTimeRangeGroup(type = DateTimeRangeType.END_TIME) + val endTime: LocalDateTime? = null +} diff --git a/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/user/payload/GetUserStatusPayload.java b/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/user/payload/GetUserStatusPayload.java deleted file mode 100644 index 178259cd..00000000 --- a/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/user/payload/GetUserStatusPayload.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.jmsoftware.maf.authcenter.user.payload; - -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/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/user/payload/GetUserStatusPayload.kt b/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/user/payload/GetUserStatusPayload.kt new file mode 100644 index 00000000..eea82f1a --- /dev/null +++ b/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/user/payload/GetUserStatusPayload.kt @@ -0,0 +1,20 @@ +package com.jmsoftware.maf.authcenter.user.payload + +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 + +/** + * # GetUserStatusPayload + * + * Change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/12/22 12:50 PM + */ +class GetUserStatusPayload { + @ValidEnumValue(targetEnum = UserStatus::class) + var status: Byte? = null + + @ValidEnumValue(targetEnum = UserStatus2::class) + var status2: Byte? = null +} diff --git a/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/user/persistence/User.java b/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/user/persistence/User.java deleted file mode 100644 index bd00675a..00000000 --- a/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/user/persistence/User.java +++ /dev/null @@ -1,117 +0,0 @@ -package com.jmsoftware.maf.authcenter.user.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.time.LocalDate; -import java.time.LocalDateTime; - -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 { - 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"; - /** - * 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 LocalDate 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 LocalDateTime createdTime; - /** - * Modified by - */ - @TableField(value = COL_MODIFIED_BY, fill = UPDATE) - private Long modifiedBy; - /** - * Modified time - */ - @TableField(value = COL_MODIFIED_TIME, fill = UPDATE) - private LocalDateTime modifiedTime; - /** - * Delete flag. - */ - @TableField(value = COL_DELETED, fill = INSERT) - private Byte deleted; -} diff --git a/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/user/persistence/User.kt b/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/user/persistence/User.kt new file mode 100644 index 00000000..4158028b --- /dev/null +++ b/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/user/persistence/User.kt @@ -0,0 +1,83 @@ +package com.jmsoftware.maf.authcenter.user.persistence + +import com.baomidou.mybatisplus.annotation.TableField +import com.baomidou.mybatisplus.annotation.TableName +import com.jmsoftware.maf.springcloudstarter.database.BasePersistenceEntity +import java.time.LocalDate + +/** + * # User + * + * User Persistence object class + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/12/22 7:31 AM + */ +@TableName(value = User.TABLE_NAME) +class User : BasePersistenceEntity() { + companion object { + const val TABLE_NAME = "user" + const val COL_USERNAME = "username" + const val COL_EMAIL = "email" + const val COL_CELLPHONE = "cellphone" + const val COL_PASSWORD = "password" + const val COL_FULL_NAME = "full_name" + const val COL_BIRTHDAY = "birthday" + const val COL_GENDER = "gender" + const val COL_AVATAR = "avatar" + const val COL_STATUS = "status" + } + + /** + * Username + */ + @TableField(value = COL_USERNAME) + lateinit var username: String + + /** + * Email + */ + @TableField(value = COL_EMAIL) + lateinit var email: String + + /** + * Cellphone number + */ + @TableField(value = COL_CELLPHONE) + lateinit var cellphone: String + + /** + * Password + */ + @TableField(value = COL_PASSWORD) + lateinit var password: String + + /** + * Full name + */ + @TableField(value = COL_FULL_NAME) + lateinit var fullName: String + + /** + * Birthday + */ + @TableField(value = COL_BIRTHDAY) + lateinit var birthday: LocalDate + + /** + * 26 gender options + */ + @TableField(value = COL_GENDER) + lateinit var gender: String + + /** + * User avatar full path on SFTP server + */ + @TableField(value = COL_AVATAR) + lateinit var avatar: String + + /** + * Status. 1 - enabled, 2 - disabled + */ + @TableField(value = COL_STATUS) + var status: Byte = 0 +} diff --git a/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/user/persistence/UserRole.java b/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/user/persistence/UserRole.java deleted file mode 100644 index 8fe9bf03..00000000 --- a/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/user/persistence/UserRole.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.jmsoftware.maf.authcenter.user.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/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/user/persistence/UserRole.kt b/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/user/persistence/UserRole.kt new file mode 100644 index 00000000..c29e6097 --- /dev/null +++ b/auth-center/auth-center-infra/src/main/java/com/jmsoftware/maf/authcenter/user/persistence/UserRole.kt @@ -0,0 +1,41 @@ +package com.jmsoftware.maf.authcenter.user.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 + +/** + * # UserRole + * + * User-role Relation. Roles that users have. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/12/22 12:51 PM + */ +@TableName(value = UserRole.TABLE_NAME) +class UserRole { + companion object { + const val TABLE_NAME = "user_role" + const val COL_ID = "id" + const val COL_USER_ID = "user_id" + const val COL_ROLE_ID = "role_id" + } + + /** + * The primary key + */ + @TableId(value = COL_ID, type = IdType.AUTO) + var id: Long? = null + + /** + * The primary key of user + */ + @TableField(value = COL_USER_ID) + var userId: Long? = null + + /** + * The primary key of role + */ + @TableField(value = COL_ROLE_ID) + var roleId: Long? = null +} diff --git a/auth-center/auth-center-infra/src/test/java/com/jmsoftware/maf/authcenter/package-info.java b/auth-center/auth-center-infra/src/test/java/com/jmsoftware/maf/authcenter/package-info.java deleted file mode 100644 index e702ef59..00000000 --- a/auth-center/auth-center-infra/src/test/java/com/jmsoftware/maf/authcenter/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package com.jmsoftware.maf.authcenter; diff --git a/auth-center/auth-center-infra/src/test/java/com/jmsoftware/maf/authcenter/package-info.kt b/auth-center/auth-center-infra/src/test/java/com/jmsoftware/maf/authcenter/package-info.kt new file mode 100644 index 00000000..b7191a36 --- /dev/null +++ b/auth-center/auth-center-infra/src/test/java/com/jmsoftware/maf/authcenter/package-info.kt @@ -0,0 +1 @@ +package com.jmsoftware.maf.authcenter diff --git a/auth-center/auth-center-infra/src/test/java/com/jmsoftware/maf/authcenter/remote/OssCenterFeignClientTest.kt b/auth-center/auth-center-infra/src/test/java/com/jmsoftware/maf/authcenter/remote/OssCenterFeignClientTest.kt new file mode 100644 index 00000000..eb587e4d --- /dev/null +++ b/auth-center/auth-center-infra/src/test/java/com/jmsoftware/maf/authcenter/remote/OssCenterFeignClientTest.kt @@ -0,0 +1,75 @@ +package com.jmsoftware.maf.authcenter.remote + +import com.jmsoftware.maf.common.util.logger +import org.junit.jupiter.api.AfterEach +import org.junit.jupiter.api.Assertions.assertNull +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.extension.ExtendWith +import org.junit.jupiter.api.parallel.Execution +import org.junit.jupiter.api.parallel.ExecutionMode +import org.mockito.Mock +import org.mockito.junit.jupiter.MockitoExtension +import org.springframework.mock.web.MockMultipartFile + +/** + * # OssCenterFeignClientTest + * + * Description: PermissionDomainServiceImplTest, change description here. + * + * ## Mockito JUnit 5 Extension + * + * There is also a Mockito extension for JUnit 5 that will make the initialization even simpler. + * + * **Pros:** + * + * * No need to call `MockitoAnnotations.openMocks()` + * * Validates framework usage and detects incorrect stubbing + * * Easy to create mocks + * * Very readable + * + * **Cons:** + * + * * Need an extra dependency on `org.mockito:mockito-junit-jupiter`, which has been included by Spring. + * So we don't have to worry about this. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/16/22 10:43 AM + * @see Using Mockito With JUnit 5 + * @see YouTube - Using Mockito With JUnit 5 + */ +@ExtendWith(MockitoExtension::class) +@Execution(ExecutionMode.CONCURRENT) +internal class OssCenterFeignClientTest { + companion object { + private val log = logger() + } + + @Mock + private lateinit var ossCenterFeignClient: OssCenterFeignClient + + @Mock + private lateinit var ossCenterFeignClientFallback: OssCenterFeignClient.OssCenterFeignClientFallback + + @BeforeEach + fun setUp() { + log.info("${this.javaClass.simpleName} setUp") + } + + @AfterEach + fun tearDown() { + log.info("${this.javaClass.simpleName} tearDown") + } + + @Test + fun uploadSingleResource() { + val multipartFile = MockMultipartFile( + "name-for-unit-test.txt", + "original-filename.txt", + null, + null + ) + val response = ossCenterFeignClient.uploadSingleResource(multipartFile) + log.info("Response: $response") + assertNull(response) + } +} diff --git a/auth-center/auth-center-message/pom.xml b/auth-center/auth-center-message/pom.xml index 768045fd..c1ee5e5a 100644 --- a/auth-center/auth-center-message/pom.xml +++ b/auth-center/auth-center-message/pom.xml @@ -10,7 +10,7 @@ com.jmsoftware.maf auth-center - 0.0.8.1 + 0.0.9 diff --git a/auth-center/auth-center-message/src/main/java/com/jmsoftware/maf/authcenter/DelayedMessageSender.java b/auth-center/auth-center-message/src/main/java/com/jmsoftware/maf/authcenter/DelayedMessageSender.java deleted file mode 100644 index 96b08fcb..00000000 --- a/auth-center/auth-center-message/src/main/java/com/jmsoftware/maf/authcenter/DelayedMessageSender.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.jmsoftware.maf.authcenter; - -import com.google.common.collect.Maps; -import com.jmsoftware.maf.springcloudstarter.property.MafProjectProperties; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import lombok.val; -import org.springframework.amqp.rabbit.core.RabbitTemplate; -import org.springframework.scheduling.annotation.Scheduled; -import org.springframework.stereotype.Component; - -import java.time.LocalDateTime; -import java.util.concurrent.TimeUnit; - -import static cn.hutool.core.text.CharSequenceUtil.format; -import static com.jmsoftware.maf.springcloudstarter.rabbitmq.DelayedMessageConfiguration.*; - -/** - *

DelayedMessageSender

- *

- * Change description here. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com, 10/2/21 1:27 PM - **/ -@Slf4j -@Component -@RequiredArgsConstructor -public class DelayedMessageSender { - private final RabbitTemplate rabbitTemplate; - private final MafProjectProperties mafProjectProperties; - - @Scheduled(fixedDelay = 2L, timeUnit = TimeUnit.MINUTES) - public void sendMessage() { - val message = format("{} - {}", this.mafProjectProperties.getProjectArtifactId(), LocalDateTime.now()); - val messageMap = Maps.newHashMap(); - messageMap.put("message", message); - this.rabbitTemplate.convertAndSend( - DELAYED_MESSAGE_EXCHANGE_NAME, - DELAYED_MESSAGE_ROUTING_KEY, - messageMap, - messagePostProcessor -> { - // Make it be consumed after 30 seconds - messagePostProcessor.getMessageProperties().setDelay(30 * 1000); - return messagePostProcessor; - } - ); - log.info("Sent a delayed message into queue: {}, messageMap: {}", DELAYED_MESSAGE_QUEUE_NAME, messageMap); - } -} diff --git a/auth-center/auth-center-message/src/main/java/com/jmsoftware/maf/authcenter/DelayedMessageSender.kt b/auth-center/auth-center-message/src/main/java/com/jmsoftware/maf/authcenter/DelayedMessageSender.kt new file mode 100644 index 00000000..874d71ad --- /dev/null +++ b/auth-center/auth-center-message/src/main/java/com/jmsoftware/maf/authcenter/DelayedMessageSender.kt @@ -0,0 +1,44 @@ +package com.jmsoftware.maf.authcenter + +import com.jmsoftware.maf.common.util.logger +import com.jmsoftware.maf.springcloudstarter.property.MafProjectProperties +import com.jmsoftware.maf.springcloudstarter.rabbitmq.DelayedMessageConfiguration +import org.springframework.amqp.core.Message +import org.springframework.amqp.rabbit.core.RabbitTemplate +import org.springframework.scheduling.annotation.Scheduled +import org.springframework.stereotype.Component +import java.time.LocalDateTime +import java.util.concurrent.TimeUnit + +/** + * # DelayedMessageSender + * + * Change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/12/22 12:55 PM + */ +@Component +class DelayedMessageSender( + private val rabbitTemplate: RabbitTemplate, + private val mafProjectProperties: MafProjectProperties +) { + companion object { + private val log = logger() + } + + @Scheduled(fixedDelay = 2L, timeUnit = TimeUnit.MINUTES) + fun sendMessage() { + val message = "${mafProjectProperties.projectArtifactId} - ${LocalDateTime.now()}" + val messageMap = mapOf("message" to message) + rabbitTemplate.convertAndSend( + DelayedMessageConfiguration.DELAYED_MESSAGE_EXCHANGE_NAME, + DelayedMessageConfiguration.DELAYED_MESSAGE_ROUTING_KEY, + messageMap + ) { messagePostProcessor: Message -> + // Make it be consumed after 30 seconds + messagePostProcessor.messageProperties.delay = 30 * 1000 + messagePostProcessor + } + log.info("Sent a delayed message into queue: ${DelayedMessageConfiguration.DELAYED_MESSAGE_QUEUE_NAME}, messageMap: $messageMap") + } +} diff --git a/auth-center/auth-center-message/src/test/java/com/jmsoftware/maf/authcenter/package-info.java b/auth-center/auth-center-message/src/test/java/com/jmsoftware/maf/authcenter/package-info.java deleted file mode 100644 index e702ef59..00000000 --- a/auth-center/auth-center-message/src/test/java/com/jmsoftware/maf/authcenter/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package com.jmsoftware.maf.authcenter; diff --git a/auth-center/auth-center-message/src/test/java/com/jmsoftware/maf/authcenter/package-info.kt b/auth-center/auth-center-message/src/test/java/com/jmsoftware/maf/authcenter/package-info.kt new file mode 100644 index 00000000..b7191a36 --- /dev/null +++ b/auth-center/auth-center-message/src/test/java/com/jmsoftware/maf/authcenter/package-info.kt @@ -0,0 +1 @@ +package com.jmsoftware.maf.authcenter diff --git a/auth-center/auth-center-web/pom.xml b/auth-center/auth-center-web/pom.xml index 0946fbba..e0508c4d 100644 --- a/auth-center/auth-center-web/pom.xml +++ b/auth-center/auth-center-web/pom.xml @@ -10,7 +10,7 @@ com.jmsoftware.maf auth-center - 0.0.8.1 + 0.0.9 diff --git a/auth-center/auth-center-web/src/main/java/com/jmsoftware/maf/authcenter/configuration/OssConfiguration.java b/auth-center/auth-center-web/src/main/java/com/jmsoftware/maf/authcenter/configuration/OssConfiguration.java deleted file mode 100644 index a6a89fcf..00000000 --- a/auth-center/auth-center-web/src/main/java/com/jmsoftware/maf/authcenter/configuration/OssConfiguration.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.jmsoftware.maf.authcenter.configuration; - -import com.jmsoftware.maf.authcenter.remote.OssCenterRemoteApi; -import com.jmsoftware.maf.springcloudstarter.poi.OssUploader; -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.mock.web.MockMultipartFile; - -/** - * Description: OssConfiguration, change description here. - * - * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 9/15/2021 11:51 AM - **/ -@Slf4j -@Configuration -@RequiredArgsConstructor -public class OssConfiguration { - private final OssCenterRemoteApi ossCenterRemoteApi; - - @Bean - public OssUploader ossUploader() { - return (name, inputStream) -> { - val multipartFile = new MockMultipartFile(name, name, null, inputStream); - val response = this.ossCenterRemoteApi.uploadSingleResource(multipartFile); - log.info("Called {} to upload multipartFile. {}", OssCenterRemoteApi.SERVICE_NAME, response); - return String.format("%s/%s", response.getData().getBucket(), response.getData().getObject()); - }; - } -} diff --git a/auth-center/auth-center-web/src/main/java/com/jmsoftware/maf/authcenter/configuration/OssConfiguration.kt b/auth-center/auth-center-web/src/main/java/com/jmsoftware/maf/authcenter/configuration/OssConfiguration.kt new file mode 100644 index 00000000..e3cda259 --- /dev/null +++ b/auth-center/auth-center-web/src/main/java/com/jmsoftware/maf/authcenter/configuration/OssConfiguration.kt @@ -0,0 +1,37 @@ +package com.jmsoftware.maf.authcenter.configuration + +import com.jmsoftware.maf.authcenter.remote.OssCenterFeignService +import com.jmsoftware.maf.common.util.logger +import com.jmsoftware.maf.springcloudstarter.poi.OssUploader +import org.springframework.context.annotation.Bean +import org.springframework.context.annotation.Configuration +import org.springframework.mock.web.MockMultipartFile +import java.io.InputStream + +/** + * # OssConfiguration + * + * Description: OssConfiguration, change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/12/22 5:51 PM + */ +@Configuration +class OssConfiguration( + private val ossCenterFeignService: OssCenterFeignService +) { + companion object { + private val log = logger() + } + + @Bean + fun ossUploader(): OssUploader { + return OssUploader { name: String, inputStream: InputStream -> + val multipartFile = MockMultipartFile(name, name, null, inputStream) + val objectResponse = ossCenterFeignService.uploadSingleResource(multipartFile) + log.info("Uploaded multipartFile. objectResponse: $objectResponse") + "${objectResponse.bucket}/${objectResponse.`object`}".apply { + log.info("Uploaded multipartFile. Path: $this") + } + } + } +} diff --git a/auth-center/auth-center-web/src/main/java/com/jmsoftware/maf/authcenter/permission/PermissionController.java b/auth-center/auth-center-web/src/main/java/com/jmsoftware/maf/authcenter/permission/PermissionController.java deleted file mode 100644 index 70eedb38..00000000 --- a/auth-center/auth-center-web/src/main/java/com/jmsoftware/maf/authcenter/permission/PermissionController.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.jmsoftware.maf.authcenter.permission; - -import com.jmsoftware.maf.authcenter.permission.response.GetServicesInfoResponse; -import com.jmsoftware.maf.authcenter.permission.service.PermissionService; -import com.jmsoftware.maf.common.bean.ResponseBodyBean; -import com.jmsoftware.maf.common.exception.BizException; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RestController; - -/** - *

PermissionController

- *

- * Controller implementation of Permission.(Permission) - * - * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com - * @date 5/11/20 8:34 AM - */ -@Slf4j -@RestController -@RequiredArgsConstructor -public class PermissionController { - private final PermissionService permissionService; - - /** - * 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") - public ResponseBodyBean getServicesInfo() throws BizException { - return ResponseBodyBean.ofSuccess(this.permissionService.getServicesInfo()); - } -} diff --git a/auth-center/auth-center-web/src/main/java/com/jmsoftware/maf/authcenter/permission/PermissionController.kt b/auth-center/auth-center-web/src/main/java/com/jmsoftware/maf/authcenter/permission/PermissionController.kt new file mode 100644 index 00000000..6bed2333 --- /dev/null +++ b/auth-center/auth-center-web/src/main/java/com/jmsoftware/maf/authcenter/permission/PermissionController.kt @@ -0,0 +1,24 @@ +package com.jmsoftware.maf.authcenter.permission + +import com.jmsoftware.maf.authcenter.permission.response.GetServicesInfoResponse +import com.jmsoftware.maf.authcenter.permission.service.PermissionService +import com.jmsoftware.maf.common.bean.ResponseBodyBean +import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.RestController + +/** + * # PermissionController + * + * Controller implementation of Permission.(Permission) + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/12/22 2:53 PM + */ +@RestController +class PermissionController( + private val permissionService: PermissionService +) { + @GetMapping("/permissions/services-info") + fun getServicesInfo(): ResponseBodyBean = + ResponseBodyBean.ofSuccess(permissionService.getServicesInfo()) +} + diff --git a/auth-center/auth-center-web/src/main/java/com/jmsoftware/maf/authcenter/permission/PermissionRemoteApiController.java b/auth-center/auth-center-web/src/main/java/com/jmsoftware/maf/authcenter/permission/PermissionRemoteApiController.java deleted file mode 100644 index 9ce0c316..00000000 --- a/auth-center/auth-center-web/src/main/java/com/jmsoftware/maf/authcenter/permission/PermissionRemoteApiController.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.jmsoftware.maf.authcenter.permission; - -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 lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import javax.validation.Valid; - -/** - *

PermissionRemoteApiController

- *

- * Change description here. - * - * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com - * @date 5/11/20 8:24 AM - **/ -@RestController -@RequiredArgsConstructor -@RequestMapping("/permission-remote-api") -public class PermissionRemoteApiController { - private final PermissionService permissionService; - - @GetMapping("/permissions") - public ResponseBodyBean getPermissionListByRoleIdList(@Valid GetPermissionListByRoleIdListPayload payload) { - return ResponseBodyBean.ofSuccess(this.permissionService.getPermissionListByRoleIdList(payload)); - } -} diff --git a/auth-center/auth-center-web/src/main/java/com/jmsoftware/maf/authcenter/permission/PermissionRemoteApiController.kt b/auth-center/auth-center-web/src/main/java/com/jmsoftware/maf/authcenter/permission/PermissionRemoteApiController.kt new file mode 100644 index 00000000..29ec7289 --- /dev/null +++ b/auth-center/auth-center-web/src/main/java/com/jmsoftware/maf/authcenter/permission/PermissionRemoteApiController.kt @@ -0,0 +1,30 @@ +package com.jmsoftware.maf.authcenter.permission + +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 org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.RequestMapping +import org.springframework.web.bind.annotation.RestController +import javax.validation.Valid + +/** + *

PermissionRemoteApiController

+ * + * + * Change description here. + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com + * @date 5/11/20 8:24 AM + */ +@RestController +@RequestMapping("/permission-remote-api") +class PermissionRemoteApiController( + private val permissionService: PermissionService +) { + @GetMapping("/permissions") + fun getPermissionListByRoleIdList(payload: @Valid GetPermissionListByRoleIdListPayload) + : ResponseBodyBean = + ResponseBodyBean.ofSuccess(permissionService.getPermissionListByRoleIdList(payload)) +} diff --git a/auth-center/auth-center-web/src/main/java/com/jmsoftware/maf/authcenter/role/RoleController.java b/auth-center/auth-center-web/src/main/java/com/jmsoftware/maf/authcenter/role/RoleController.java deleted file mode 100644 index f49c75cb..00000000 --- a/auth-center/auth-center-web/src/main/java/com/jmsoftware/maf/authcenter/role/RoleController.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.jmsoftware.maf.authcenter.role; - -import com.jmsoftware.maf.authcenter.role.service.RoleService; -import com.jmsoftware.maf.springcloudstarter.poi.AbstractExcelDataController; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.time.Instant; -import java.util.List; - -/** - * Description: RoleController, change description here. - * - * @author 钟俊(zhongjun), email: zhongjun@toguide.cn, date: 12/17/2020 4:44 PM - **/ -@Slf4j -@RestController -@RequiredArgsConstructor -@RequestMapping("/roles") -public class RoleController extends AbstractExcelDataController { - private final RoleService roleService; - - @Override - public void onExceptionOccurred() { - log.error("Exception occurred when uploading excel for role."); - this.fileName.set("role-stat" + Instant.now() + ".xlsx"); - } - - @Override - protected void beforeDatabaseOperation(List beanList) { - log.info("BeforeDatabaseOperation: {}", beanList); - } - - @Override - protected void executeDatabaseOperation(List beanList) { - log.info("ExecuteDatabaseOperation: {}", beanList); - this.roleService.save(beanList); - } - - @Override - protected String getTemplateFileName() { - return RoleService.ROLE_TEMPLATE_EXCEL; - } - - @Override - protected List getListForExporting() { - return this.roleService.getListForExporting(); - } - - @Override - protected void validateBeforeAddToBeanList(List beanList, RoleExcelBean bean, int index) throws IllegalArgumentException { - this.roleService.validateBeforeAddToBeanList(beanList, bean, index); - } -} diff --git a/auth-center/auth-center-web/src/main/java/com/jmsoftware/maf/authcenter/role/RoleController.kt b/auth-center/auth-center-web/src/main/java/com/jmsoftware/maf/authcenter/role/RoleController.kt new file mode 100644 index 00000000..287b4087 --- /dev/null +++ b/auth-center/auth-center-web/src/main/java/com/jmsoftware/maf/authcenter/role/RoleController.kt @@ -0,0 +1,53 @@ +package com.jmsoftware.maf.authcenter.role + +import com.jmsoftware.maf.authcenter.role.service.RoleDomainService +import com.jmsoftware.maf.common.util.logger +import com.jmsoftware.maf.springcloudstarter.poi.AbstractExcelDataController +import org.springframework.web.bind.annotation.RequestMapping +import org.springframework.web.bind.annotation.RestController +import java.time.Instant + +/** + * Description: RoleController, change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/16/22 8:08 PM + */ +@RestController +@RequestMapping("/roles") +class RoleController( + private val roleDomainService: RoleDomainService +) : AbstractExcelDataController() { + companion object { + private val log = logger() + } + + override fun onExceptionOccurred() { + log.error("Exception occurred when uploading excel for role.") + fileName.set("role-stat-${Instant.now()}.xlsx") + } + + override fun executeDatabaseOperation(beanList: List) { + log.info("ExecuteDatabaseOperation: {}", beanList) + roleDomainService.save(beanList) + } + + override fun validateBeforeAddToBeanList( + beanList: List, + bean: RoleExcelBean, + index: Int + ) { + roleDomainService.validateBeforeAddToBeanList(beanList, bean, index) + } + + override fun beforeDatabaseOperation(beanList: List) { + log.info("BeforeDatabaseOperation: {}", beanList) + } + + override fun getTemplateFileName(): String { + return RoleDomainService.ROLE_TEMPLATE_EXCEL + } + + override fun getListForExporting(): List { + return roleDomainService.getListForExporting() + } +} diff --git a/auth-center/auth-center-web/src/main/java/com/jmsoftware/maf/authcenter/role/RoleRemoteApiController.java b/auth-center/auth-center-web/src/main/java/com/jmsoftware/maf/authcenter/role/RoleRemoteApiController.java deleted file mode 100644 index bb09815e..00000000 --- a/auth-center/auth-center-web/src/main/java/com/jmsoftware/maf/authcenter/role/RoleRemoteApiController.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.jmsoftware.maf.authcenter.role; - -import com.jmsoftware.maf.authcenter.role.service.RoleService; -import com.jmsoftware.maf.common.bean.ResponseBodyBean; -import com.jmsoftware.maf.common.domain.authcenter.role.GetRoleListByUserIdResponse; -import lombok.RequiredArgsConstructor; -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; - -/** - *

RoleRemoteApiController

- *

- * Change description here. - * - * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com - * @date 5/10/20 10:43 PM - **/ -@RestController -@RequiredArgsConstructor -@RequestMapping("/role-remote-api") -public class RoleRemoteApiController { - private final RoleService roleService; - - @GetMapping("/roles/{userId}") - public ResponseBodyBean getRoleList(@PathVariable Long userId) { - return ResponseBodyBean.ofSuccess(this.roleService.getRoleList(userId)); - } -} diff --git a/auth-center/auth-center-web/src/main/java/com/jmsoftware/maf/authcenter/role/RoleRemoteApiController.kt b/auth-center/auth-center-web/src/main/java/com/jmsoftware/maf/authcenter/role/RoleRemoteApiController.kt new file mode 100644 index 00000000..7e7871dd --- /dev/null +++ b/auth-center/auth-center-web/src/main/java/com/jmsoftware/maf/authcenter/role/RoleRemoteApiController.kt @@ -0,0 +1,26 @@ +package com.jmsoftware.maf.authcenter.role + +import com.jmsoftware.maf.authcenter.role.service.RoleDomainService +import com.jmsoftware.maf.common.bean.ResponseBodyBean +import com.jmsoftware.maf.common.domain.authcenter.role.GetRoleListByUserIdResponse +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 + +/** + * # RoleRemoteApiController + * + * Change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/12/22 3:08 PM + */ +@RestController +@RequestMapping("/role-remote-api") +class RoleRemoteApiController( + private val roleDomainService: RoleDomainService +) { + @GetMapping("/roles/{userId}") + fun getRoleList(@PathVariable userId: Long): ResponseBodyBean = + ResponseBodyBean.ofSuccess(roleDomainService.getRoleList(userId)) +} diff --git a/auth-center/auth-center-web/src/main/java/com/jmsoftware/maf/authcenter/security/JwtRemoteApiController.java b/auth-center/auth-center-web/src/main/java/com/jmsoftware/maf/authcenter/security/JwtRemoteApiController.java deleted file mode 100644 index 37c6049a..00000000 --- a/auth-center/auth-center-web/src/main/java/com/jmsoftware/maf/authcenter/security/JwtRemoteApiController.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.jmsoftware.maf.authcenter.security; - -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 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 -@RequestMapping("/jwt-remote-api") -public class JwtRemoteApiController { - private final JwtService jwtService; - - /** - * Parse response body bean. - * - * @return the response body bean - */ - @GetMapping("/parse") - public ResponseBodyBean parse(HttpServletRequest request) { - return ResponseBodyBean.ofSuccess(this.jwtService.parse(request)); - } -} diff --git a/auth-center/auth-center-web/src/main/java/com/jmsoftware/maf/authcenter/security/JwtRemoteApiController.kt b/auth-center/auth-center-web/src/main/java/com/jmsoftware/maf/authcenter/security/JwtRemoteApiController.kt new file mode 100644 index 00000000..6397d62c --- /dev/null +++ b/auth-center/auth-center-web/src/main/java/com/jmsoftware/maf/authcenter/security/JwtRemoteApiController.kt @@ -0,0 +1,31 @@ +package com.jmsoftware.maf.authcenter.security + +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 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 + +/** + * # JwtRemoteApiController + * + * Description: JwtRemoteApiController, change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/12/22 3:09 PM + */ +@RestController +@RequestMapping("/jwt-remote-api") +class JwtRemoteApiController( + private val jwtService: JwtService +) { + /** + * Parse response body bean. + * + * @return the response body bean + */ + @GetMapping("/parse") + fun parse(request: HttpServletRequest): ResponseBodyBean = + ResponseBodyBean.ofSuccess(jwtService.parse(request)) +} diff --git a/auth-center/auth-center-web/src/main/java/com/jmsoftware/maf/authcenter/user/UserController.java b/auth-center/auth-center-web/src/main/java/com/jmsoftware/maf/authcenter/user/UserController.java deleted file mode 100644 index 91b4544c..00000000 --- a/auth-center/auth-center-web/src/main/java/com/jmsoftware/maf/authcenter/user/UserController.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.jmsoftware.maf.authcenter.user; - -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 lombok.RequiredArgsConstructor; -import org.springframework.validation.annotation.Validated; -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 (锺俊) - * @date 2020-05-10 12:08:28 - */ -@Validated -@RestController -@RequiredArgsConstructor -public class UserController { - private final UserService userService; - - @PostMapping("/users/signup") - public ResponseBodyBean signup(@Valid @RequestBody SignupPayload payload) { - return ResponseBodyBean.ofSuccess(this.userService.saveUserForSignup(payload)); - } - - @PostMapping("/users/login") - public ResponseBodyBean login(@Valid @RequestBody LoginPayload payload) throws SecurityException { - return ResponseBodyBean.ofSuccess(this.userService.login(payload)); - } - - @PostMapping("/users/logout") - public ResponseBodyBean logout(HttpServletRequest request) throws SecurityException { - return ResponseBodyBean.ofSuccess(this.userService.logout(request)); - } -} diff --git a/auth-center/auth-center-web/src/main/java/com/jmsoftware/maf/authcenter/user/UserController.kt b/auth-center/auth-center-web/src/main/java/com/jmsoftware/maf/authcenter/user/UserController.kt new file mode 100644 index 00000000..d7fde96c --- /dev/null +++ b/auth-center/auth-center-web/src/main/java/com/jmsoftware/maf/authcenter/user/UserController.kt @@ -0,0 +1,39 @@ +package com.jmsoftware.maf.authcenter.user + +import com.jmsoftware.maf.authcenter.user.service.UserDomainService +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 org.springframework.validation.annotation.Validated +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 (锺俊), e-mail: johnnysviva@outlook.com, date: 4/12/22 3:10 PM + */ +@Validated +@RestController +class UserController( + private val userDomainService: UserDomainService +) { + @PostMapping("/users/signup") + fun signup(@Valid @RequestBody payload: SignupPayload): ResponseBodyBean = + ResponseBodyBean.ofSuccess(userDomainService.saveUserForSignup(payload)) + + @PostMapping("/users/login") + fun login(@Valid @RequestBody payload: LoginPayload): ResponseBodyBean = + ResponseBodyBean.ofSuccess(userDomainService.login(payload)) + + @PostMapping("/users/logout") + fun logout(request: HttpServletRequest): ResponseBodyBean = + ResponseBodyBean.ofSuccess(userDomainService.logout(request)) +} diff --git a/auth-center/auth-center-web/src/main/java/com/jmsoftware/maf/authcenter/user/UserRemoteApiController.java b/auth-center/auth-center-web/src/main/java/com/jmsoftware/maf/authcenter/user/UserRemoteApiController.java deleted file mode 100644 index 541659a4..00000000 --- a/auth-center/auth-center-web/src/main/java/com/jmsoftware/maf/authcenter/user/UserRemoteApiController.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.jmsoftware.maf.authcenter.user; - -import com.jmsoftware.maf.authcenter.user.payload.GetUserPageListPayload; -import com.jmsoftware.maf.authcenter.user.payload.GetUserStatusPayload; -import com.jmsoftware.maf.authcenter.user.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 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") -public class UserRemoteApiController { - private final UserService userService; - - @GetMapping("/users/{loginToken}") - public ResponseBodyBean getUserByLoginToken(@PathVariable String loginToken) { - return ResponseBodyBean.ofSuccess(this.userService.getUserByLoginToken(loginToken)); - } - - @GetMapping("/users") - public PageResponseBodyBean getUserPageList(@Valid GetUserPageListPayload payload) { - return this.userService.getUserPageList(payload); - } - - @GetMapping("/users/status") - public ResponseBodyBean getUserStatus(@Valid GetUserStatusPayload payload) { - return ResponseBodyBean.ofSuccess(this.userService.getUserStatus(payload), "Correct enum value"); - } -} diff --git a/auth-center/auth-center-web/src/main/java/com/jmsoftware/maf/authcenter/user/UserRemoteApiController.kt b/auth-center/auth-center-web/src/main/java/com/jmsoftware/maf/authcenter/user/UserRemoteApiController.kt new file mode 100644 index 00000000..65dbd1d1 --- /dev/null +++ b/auth-center/auth-center-web/src/main/java/com/jmsoftware/maf/authcenter/user/UserRemoteApiController.kt @@ -0,0 +1,41 @@ +package com.jmsoftware.maf.authcenter.user + +import com.jmsoftware.maf.authcenter.user.payload.GetUserPageListPayload +import com.jmsoftware.maf.authcenter.user.payload.GetUserStatusPayload +import com.jmsoftware.maf.authcenter.user.persistence.User +import com.jmsoftware.maf.authcenter.user.service.UserDomainService +import com.jmsoftware.maf.common.bean.PageResponseBodyBean +import com.jmsoftware.maf.common.bean.ResponseBodyBean +import com.jmsoftware.maf.common.domain.authcenter.user.GetUserByLoginTokenResponse +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 (锺俊), e-mail: johnnysviva@outlook.com, date: 4/12/22 3:21 PM + */ +@Validated +@RestController +@RequestMapping("/user-remote-api") +class UserRemoteApiController( + private val userDomainService: UserDomainService +) { + @GetMapping("/users/{loginToken}") + fun getUserByLoginToken(@PathVariable loginToken: String): ResponseBodyBean = + ResponseBodyBean.ofSuccess(userDomainService.getUserByLoginToken(loginToken)) + + @GetMapping("/users") + fun getUserPageList(@Valid payload: GetUserPageListPayload): PageResponseBodyBean = + userDomainService.getUserPageList(payload) + + @GetMapping("/users/status") + fun getUserStatus(@Valid payload: GetUserStatusPayload): ResponseBodyBean = + ResponseBodyBean.ofSuccess(userDomainService.getUserStatus(payload), "Correct enum value") +} diff --git a/auth-center/auth-center-web/src/test/java/com/jmsoftware/maf/authcenter/package-info.java b/auth-center/auth-center-web/src/test/java/com/jmsoftware/maf/authcenter/package-info.java deleted file mode 100644 index 4bc2a3b9..00000000 --- a/auth-center/auth-center-web/src/test/java/com/jmsoftware/maf/authcenter/package-info.java +++ /dev/null @@ -1,10 +0,0 @@ -/* - * Copyright By ZATI - * Copyright By 3a3c88295d37870dfd3b25056092d1a9209824b256c341f2cdc296437f671617 - * All rights reserved. - * - * If you are not the intended user, you are hereby notified that any use, disclosure, copying, printing, forwarding or - * dissemination of this property is strictly prohibited. If you have got this file in error, delete it from your - * system. - */ -package com.jmsoftware.maf.authcenter; diff --git a/auth-center/auth-center-web/src/test/java/com/jmsoftware/maf/authcenter/package-info.kt b/auth-center/auth-center-web/src/test/java/com/jmsoftware/maf/authcenter/package-info.kt new file mode 100644 index 00000000..b7191a36 --- /dev/null +++ b/auth-center/auth-center-web/src/test/java/com/jmsoftware/maf/authcenter/package-info.kt @@ -0,0 +1 @@ +package com.jmsoftware.maf.authcenter diff --git a/auth-center/pom.xml b/auth-center/pom.xml index ed325f84..fac2d3cc 100644 --- a/auth-center/pom.xml +++ b/auth-center/pom.xml @@ -10,7 +10,7 @@ com.jmsoftware.maf muscle-and-fitness-server - 0.0.8.1 + 0.0.9 pom @@ -75,6 +75,10 @@ org.springframework.boot spring-boot-starter-data-redis + + org.springframework.boot + spring-boot-starter-data-elasticsearch + org.springframework.boot spring-boot-starter-amqp @@ -96,52 +100,37 @@ org.springframework.boot spring-boot-starter-reactor-netty - - org.springframework.boot - spring-boot-starter-test - test - - - org.junit.vintage - junit-vintage-engine - - - org.springframework spring-test - - - com.baomidou - mybatis-plus-boot-starter - ${mybatis-plus-boot-starter.version} + org.mockito + mockito-inline + test + + - com.baomidou - dynamic-datasource-spring-boot-starter - ${dynamic-datasource-spring-boot-starter.version} + org.springframework.integration + spring-integration-redis + + mysql mysql-connector-java runtime - com.alibaba - druid-spring-boot-starter - ${druid-spring-boot-starter.version} - - - com.sun - tools - - - com.sun - jconsole - - + com.baomidou + mybatis-plus-boot-starter + ${mybatis-plus-boot-starter.version} + + + org.apache.shardingsphere + shardingsphere-jdbc-core-spring-boot-starter + ${shardingsphere.version} diff --git a/auto-run-mac.sh b/auto-run-mac.sh index bb15fe8d..6f9aca40 100755 --- a/auto-run-mac.sh +++ b/auto-run-mac.sh @@ -174,7 +174,7 @@ function executePreBuildPhase() { function executeBuildPhase() { logInfo "[BUILD] Maven is staring to build" if [ "$skipBuild" = false ]; then - mvn clean package --show-version -Dmaven.javadoc.skip=true -DskipTests=true -P $mavenActiveProfile + mvn clean package --show-version -Dmaven.javadoc.skip=true -P $mavenActiveProfile buildCommandResult=$? # After the command that might error, instead of || exit 1... if [ "$buildCommandResult" -ne 0 ]; then diff --git a/common/pom.xml b/common/pom.xml index 866a379f..83aa837f 100644 --- a/common/pom.xml +++ b/common/pom.xml @@ -10,7 +10,7 @@ com.jmsoftware.maf muscle-and-fitness-server - 0.0.8.1 + 0.0.9 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 deleted file mode 100644 index 4d56b063..00000000 --- a/common/src/main/java/com/jmsoftware/maf/common/bean/EnumerationBase.java +++ /dev/null @@ -1,18 +0,0 @@ -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 deleted file mode 100644 index 17cd9bc6..00000000 --- a/common/src/main/java/com/jmsoftware/maf/common/bean/ExcelImportResult.java +++ /dev/null @@ -1,19 +0,0 @@ -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/ExcelImportResult.kt b/common/src/main/java/com/jmsoftware/maf/common/bean/ExcelImportResult.kt new file mode 100644 index 00000000..37496a5a --- /dev/null +++ b/common/src/main/java/com/jmsoftware/maf/common/bean/ExcelImportResult.kt @@ -0,0 +1,13 @@ +package com.jmsoftware.maf.common.bean + +/** + * # ExcelImportResult + * + * Change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/16/22 11:01 AM + */ +class ExcelImportResult { + var messageList: List? = null + var excelFilePath: String? = null +} 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 deleted file mode 100644 index c26aadd5..00000000 --- a/common/src/main/java/com/jmsoftware/maf/common/bean/PageResponseBodyBean.java +++ /dev/null @@ -1,326 +0,0 @@ -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.UniversalDateTime; -import com.jmsoftware.maf.common.exception.BaseException; -import com.jmsoftware.maf.common.exception.BizException; -import lombok.*; -import org.springframework.http.HttpStatus; -import org.springframework.lang.Nullable; - -import java.io.Serializable; -import java.time.LocalDateTime; -import java.util.Collections; -import java.util.List; - -/** - *

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 List 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 List 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 List 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 List 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 List 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 List 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 BizException the business exception - */ - public static PageResponseBodyBean ofFailure(@NonNull final String message) throws BizException { - throw new BizException(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 BizException the business exception - */ - public static PageResponseBodyBean ofFailure(final List data) throws BizException { - throw new BizException(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 BizException the business exception - */ - public static PageResponseBodyBean ofFailure(final List data, - @NonNull final String message) throws BizException { - throw new BizException(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 Subclass of {@link BaseException} - * @param throwable exception - * @return the response body bean - * @throws BaseException the base exception - */ - public static PageResponseBodyBean ofException(@NonNull final B 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 List 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/PageResponseBodyBean.kt b/common/src/main/java/com/jmsoftware/maf/common/bean/PageResponseBodyBean.kt new file mode 100644 index 00000000..e611cffd --- /dev/null +++ b/common/src/main/java/com/jmsoftware/maf/common/bean/PageResponseBodyBean.kt @@ -0,0 +1,350 @@ +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.UniversalDateTime +import com.jmsoftware.maf.common.exception.BaseException +import com.jmsoftware.maf.common.exception.InternalServerException +import org.springframework.http.HttpStatus +import org.springframework.lang.Nullable +import java.io.Serial +import java.io.Serializable +import java.time.LocalDateTime + +/** + * # PageResponseBodyBean + * + * Page Response body bean. + * + * @param the response body data type + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/16/22 11:02 AM + */ +class PageResponseBodyBean private constructor() : TrackableBean(), Serializable { + /** + * 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 = UniversalDateTime.DATE_TIME_FORMAT) + val timestamp: LocalDateTime = LocalDateTime.now() + + /** + * Default status is 200 OK. + */ + var status = HttpStatus.OK.value() + + /** + * The Message. Default: 200 OK. + */ + var message = HttpStatus.OK.reasonPhrase + + /** + * The List. + */ + var list = emptyList() + + /** + * The Total. + */ + var total: Long = 0 + + companion object { + /** + * The constant serialVersionUID. + */ + @Serial + var serialVersionUID = 4645461634548783641L + + /** + * 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) + */ + fun ofStatus(status: HttpStatus): PageResponseBodyBean { + val responseBodyBean = PageResponseBodyBean() + responseBodyBean.status = status.value() + responseBodyBean.message = status.reasonPhrase + return responseBodyBean + } + + /** + * Of status response body bean. + * + * @param the type parameter + * @param status the status + * @param message the message + * @return the response body bean + */ + fun ofStatus( + status: HttpStatus, + message: String + ): PageResponseBodyBean { + val responseBodyBean = PageResponseBodyBean() + responseBodyBean.status = status.value() + responseBodyBean.message = 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 + */ + fun ofStatus( + status: HttpStatus, + data: List?, + total: Long + ): PageResponseBodyBean { + val responseBodyBean = PageResponseBodyBean() + responseBodyBean.status = status.value() + responseBodyBean.message = status.reasonPhrase + data?.let { responseBodyBean.list = it } + responseBodyBean.total = 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 + */ + fun ofStatus( + status: Int, + message: String, + data: List?, + total: Long + ): PageResponseBodyBean { + val responseBodyBean = PageResponseBodyBean() + responseBodyBean.status = status + responseBodyBean.message = message + data?.let { responseBodyBean.list = it } + responseBodyBean.total = 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 + */ + @Throws(BaseException::class) + fun setResponse( + status: Int, + message: String, + data: List?, + total: Long + ): PageResponseBodyBean { + if (!HttpStatus.valueOf(status).is2xxSuccessful) { + throw BaseException(status, message, data) + } + val responseBodyBean = PageResponseBodyBean() + responseBodyBean.status = status + responseBodyBean.message = message + data?.let { responseBodyBean.list = it } + responseBodyBean.total = total + return responseBodyBean + } + + /** + * Respond null data, and status is OK. + * + * @param the response body data type + * @return response body + */ + fun ofSuccess(): PageResponseBodyBean { + return 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 + */ + fun ofSuccess( + data: List?, + total: Long + ): PageResponseBodyBean { + val responseBodyBean = PageResponseBodyBean() + data?.let { responseBodyBean.list = it } + responseBodyBean.total = 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 + */ + fun ofSuccess(message: String): PageResponseBodyBean { + val responseBodyBean = PageResponseBodyBean() + responseBodyBean.message = 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 + */ + fun ofSuccess( + data: List?, + message: String, + total: Long + ): PageResponseBodyBean { + val responseBodyBean = PageResponseBodyBean() + responseBodyBean.message = message + data?.let { responseBodyBean.list = it } + responseBodyBean.total = 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 InternalServerException the business exception + */ + fun ofFailure(message: String): PageResponseBodyBean { + throw InternalServerException(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 InternalServerException the business exception + */ + fun ofFailure(data: List?): PageResponseBodyBean { + throw InternalServerException(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 InternalServerException the business exception + */ + fun ofFailure( + data: List?, + message: String + ): PageResponseBodyBean { + throw InternalServerException(data, message) + } + + /** + * Respond an ERROR(500). + * + * @param the response body data type + * @return response body + * @throws BaseException the base exception + */ + fun ofError(): PageResponseBodyBean { + return setResponse( + HttpStatus.INTERNAL_SERVER_ERROR.value(), + HttpStatus.INTERNAL_SERVER_ERROR.reasonPhrase, + 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 + */ + fun ofError(status: HttpStatus): PageResponseBodyBean { + return setResponse(status.value(), status.reasonPhrase, null, 0) + } + + /** + * Response an exception. + * + * @param the response body data type + * @param Subclass of [BaseException] + * @param throwable exception + * @return the response body bean + * @throws BaseException the base exception + */ + fun ofException(throwable: B): PageResponseBodyBean { + 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 + */ + fun of( + message: String, + @Nullable data: List?, + total: Long, status: Int + ): JSON { + val responseBodyBean = ofStatus(status, message, data, total) + val config = JSONConfig() + config.setIgnoreNullValue(false).dateFormat = "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 deleted file mode 100644 index 30ff793d..00000000 --- a/common/src/main/java/com/jmsoftware/maf/common/bean/PaginationBase.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.jmsoftware.maf.common.bean; - -import cn.hutool.core.text.CharSequenceUtil; -import cn.hutool.core.util.NumberUtil; -import com.fasterxml.jackson.annotation.JsonIgnore; -import lombok.Data; -import org.hibernate.validator.constraints.Range; - -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 - * @date 2/17/20 11:18 PM - **/ -@Data -@SuppressWarnings("unused") -public class PaginationBase { - /** - * The current page. Default: 1 - */ - @JsonIgnore - @NotNull(message = "The current page is required!") - @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 = 10L, max = 100L, message = "The rage of page size: 10 <= page size <= 100!") - private Integer pageSize = 10; - /** - * The order-by. (for table's field) - */ - @JsonIgnore - private String orderBy; - /** - * The order rule. Default: DESC - */ - @JsonIgnore - @Pattern(regexp = "^(ASC|DESC)$") - private String orderRule = "DESC"; - /** - * The order-by statement needs to be joined. - */ - @JsonIgnore - private String orderByStatement; - - @JsonIgnore - public String getOrderByStatement() { - if (!CharSequenceUtil.isBlank(this.orderBy)) { - return String.format("%s `%s` %s", "ORDER BY", this.orderBy, this.orderRule); - } - return this.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) this.currentPage * this.pageSize) > 0) { - this.currentPage += 1; - return true; - } - return false; - } -} diff --git a/common/src/main/java/com/jmsoftware/maf/common/bean/PaginationBase.kt b/common/src/main/java/com/jmsoftware/maf/common/bean/PaginationBase.kt new file mode 100644 index 00000000..98388bc2 --- /dev/null +++ b/common/src/main/java/com/jmsoftware/maf/common/bean/PaginationBase.kt @@ -0,0 +1,79 @@ +package com.jmsoftware.maf.common.bean + +import cn.hutool.core.util.NumberUtil +import com.fasterxml.jackson.annotation.JsonIgnore +import org.hibernate.validator.constraints.Range +import javax.validation.constraints.Min +import javax.validation.constraints.NotNull +import javax.validation.constraints.Pattern + +/** + * PaginationBase + * + * Pagination Base. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/16/22 11:13 AM + */ +open class PaginationBase { + /** + * The current page. Default: 1 + */ + @JsonIgnore + @NotNull(message = "The current page is required!") + @Min(value = 1L, message = "The current page is not less then 1!") + var currentPage: Int = 1 + + /** + * The page size. Default: 10 + */ + @JsonIgnore + @NotNull(message = "The page size is required!") + @Range(min = 10L, max = 100L, message = "The rage of page size: 10 <= page size <= 100!") + var pageSize: Int = 10 + + /** + * The order-by. (for table's field) + */ + @JsonIgnore + var orderBy: String? = null + + /** + * The order rule. Default: DESC + */ + @JsonIgnore + @Pattern(regexp = "^(ASC|DESC)$") + var orderRule: String = "DESC" + + /** + * The order-by statement needs to be joined. + */ + @JsonIgnore + var orderByStatement: String? = null + + /** + * The order-by statement needs to be joined. + */ + @JsonIgnore + fun orderByStatement(): String { + orderByStatement?.isBlank() + if (orderBy?.isNotBlank() == true) { + return "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 + */ + fun hasNextPage(pageResponseBodyBean: @NotNull PageResponseBodyBean<*>?): Boolean { + if (NumberUtil.compare(pageResponseBodyBean!!.total, currentPage.toLong() * 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 deleted file mode 100644 index 4130bf49..00000000 --- a/common/src/main/java/com/jmsoftware/maf/common/bean/ResponseBodyBean.java +++ /dev/null @@ -1,290 +0,0 @@ -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.UniversalDateTime; -import com.jmsoftware.maf.common.exception.BaseException; -import com.jmsoftware.maf.common.exception.BizException; -import lombok.*; -import org.springframework.http.HttpStatus; -import org.springframework.lang.Nullable; - -import java.io.Serializable; -import java.time.LocalDateTime; - -/** - *

ResponseBodyBean

- *

- * Response body bean. - * - * @param the response body data type - * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com - * @date 2/27/20 9:24 AM - */ -@Data -@SuppressWarnings("unused") -public class ResponseBodyBean implements Serializable { - private static final long serialVersionUID = 4645469240048361965L; - - /** - * 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) - private final LocalDateTime timestamp = LocalDateTime.now(); - /** - * Default status is 200 OK. - */ - private int status = HttpStatus.OK.value(); - /** - * The Message. Default: 200 OK. - */ - private String message = HttpStatus.OK.getReasonPhrase(); - /** - * The Data. - */ - private T data; - - private ResponseBodyBean() { - } - - /** - *

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 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; - } - - /** - *

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 - * @return response body for ExceptionControllerAdvice - */ - public static ResponseBodyBean ofStatus(@NonNull final HttpStatus status, @Nullable final T data) { - ResponseBodyBean responseBodyBean = new ResponseBodyBean<>(); - responseBodyBean.setStatus(status.value()); - responseBodyBean.setMessage(status.getReasonPhrase()); - responseBodyBean.setData(data); - 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 - * @return response body for ExceptionControllerAdvice - */ - public static ResponseBodyBean ofStatus(final int status, @NonNull final String message, - @Nullable final T data) { - ResponseBodyBean responseBodyBean = new ResponseBodyBean<>(); - responseBodyBean.setStatus(status); - responseBodyBean.setMessage(message); - responseBodyBean.setData(data); - 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 - * @return response body - */ - public static ResponseBodyBean setResponse(final int status, @NonNull final String message, - @Nullable final T data) - throws BaseException { - if (!HttpStatus.valueOf(status).is2xxSuccessful()) { - throw new BaseException(status, message, data); - } - ResponseBodyBean responseBodyBean = new ResponseBodyBean<>(); - responseBodyBean.setStatus(status); - responseBodyBean.setMessage(message); - responseBodyBean.setData(data); - return responseBodyBean; - } - - /** - * Respond null data, and status is OK. - * - * @param the response body data type - * @return response body - */ - public static ResponseBodyBean ofSuccess() { - return new ResponseBodyBean<>(); - } - - /** - * Respond data and status is OK. - * - * @param the response body data type - * @param data data to be responded to client. - * @return response body - */ - public static ResponseBodyBean ofSuccess(@Nullable final T data) { - ResponseBodyBean responseBodyBean = new ResponseBodyBean<>(); - responseBodyBean.setData(data); - 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 ResponseBodyBean ofSuccessMessage(@NonNull final String message) { - ResponseBodyBean responseBodyBean = new ResponseBodyBean<>(); - 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 - * @return response body - */ - public static ResponseBodyBean ofSuccess(@Nullable final T data, - @NonNull final String message) { - ResponseBodyBean responseBodyBean = new ResponseBodyBean<>(); - responseBodyBean.setMessage(message); - responseBodyBean.setData(data); - 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 - */ - public static ResponseBodyBean ofFailureMessage(@NonNull final String message) throws BizException { - throw new BizException(message); - } - - /** - * Respond a message and status is FAILURE(464). - * - * @param the response body data type - * @param data data to be responded - * @return response body - */ - public static ResponseBodyBean ofFailure(final T data) throws BizException { - throw new BizException(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 - */ - public static ResponseBodyBean ofFailure(final T data, @NonNull final String message) throws BizException { - throw new BizException(data, message); - } - - /** - * Respond an ERROR(500). - * - * @param the response body data type - * @return response body - */ - public static ResponseBodyBean ofError() throws BaseException { - return setResponse(HttpStatus.INTERNAL_SERVER_ERROR.value(), HttpStatus.INTERNAL_SERVER_ERROR.getReasonPhrase(), - null); - } - - /** - * Respond a custom error. - * - * @param the response body data type - * @param status Error status, not OK(200) - * @return response body - */ - public static ResponseBodyBean ofError(@NonNull final HttpStatus status) - throws BaseException { - return setResponse(status.value(), status.getReasonPhrase(), null); - } - - /** - * Response an exception. - * - * @param the response body data type - * @param Sub-class of {@link BaseException} - * @param throwable exception - * @return the response body bean - */ - public static ResponseBodyBean ofException(@NonNull final B throwable) - 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, int status) { - val responseBodyBean = ResponseBodyBean.ofStatus(status, message, data); - val config = new JSONConfig(); - config.setIgnoreNullValue(false).setDateFormat(UniversalDateTime.DATE_TIME_FORMAT); - return JSONUtil.parse(responseBodyBean, config); - } -} diff --git a/common/src/main/java/com/jmsoftware/maf/common/bean/ResponseBodyBean.kt b/common/src/main/java/com/jmsoftware/maf/common/bean/ResponseBodyBean.kt new file mode 100644 index 00000000..35c481c2 --- /dev/null +++ b/common/src/main/java/com/jmsoftware/maf/common/bean/ResponseBodyBean.kt @@ -0,0 +1,303 @@ +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.UniversalDateTime +import com.jmsoftware.maf.common.exception.BaseException +import com.jmsoftware.maf.common.exception.InternalServerException +import org.springframework.http.HttpStatus +import java.io.Serial +import java.io.Serializable +import java.time.LocalDateTime + +/** + * # ResponseBodyBean + * + * Response body bean. + * + * @param the response body data type + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/16/22 11:23 AM + */ +@Suppress("unused") +class ResponseBodyBean private constructor() : TrackableBean(), Serializable { + /** + * 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 = UniversalDateTime.DATE_TIME_FORMAT) + val timestamp: LocalDateTime = LocalDateTime.now() + + /** + * Default status is 200 OK. + */ + var status = HttpStatus.OK.value() + + /** + * The Message. Default: 200 OK. + */ + var message = HttpStatus.OK.reasonPhrase + + /** + * The Data. + */ + var data: T? = null + + companion object { + @Serial + var serialVersionUID = 4645469240048361965L + + /** + * 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) + */ + fun ofStatus(status: HttpStatus): ResponseBodyBean { + val responseBodyBean = ResponseBodyBean() + responseBodyBean.status = status.value() + responseBodyBean.message = status.reasonPhrase + return responseBodyBean + } + + /** + * Of status response body bean. + * + * @param the type parameter + * @param status the status + * @param message the message + * @return the response body bean + */ + fun ofStatus(status: HttpStatus, message: String): ResponseBodyBean { + val responseBodyBean = ResponseBodyBean() + responseBodyBean.status = status.value() + responseBodyBean.message = 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 + * @return response body for ExceptionControllerAdvice + */ + fun ofStatus(status: HttpStatus, data: T?): ResponseBodyBean { + val responseBodyBean = ResponseBodyBean() + responseBodyBean.status = status.value() + responseBodyBean.message = status.reasonPhrase + responseBodyBean.data = data + 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 + * @return response body for ExceptionControllerAdvice + */ + fun ofStatus( + status: Int, + message: String, + data: T? + ): ResponseBodyBean { + val responseBodyBean = ResponseBodyBean() + responseBodyBean.status = status + responseBodyBean.message = message + responseBodyBean.data = data + 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 + * @return response body + */ + fun setResponse( + status: Int, + message: String, + data: T? + ): ResponseBodyBean { + if (!HttpStatus.valueOf(status).is2xxSuccessful) { + throw BaseException(status, message, data) + } + val responseBodyBean = ResponseBodyBean() + responseBodyBean.status = status + responseBodyBean.message = message + responseBodyBean.data = data + return responseBodyBean + } + + /** + * Respond null data, and status is OK. + * + * @param the response body data type + * @return response body + */ + fun ofSuccess(): ResponseBodyBean { + return ResponseBodyBean() + } + + /** + * Respond data and status is OK. + * + * @param the response body data type + * @param data data to be responded to client. + * @return response body + */ + fun ofSuccess(data: T?): ResponseBodyBean { + val responseBodyBean = ResponseBodyBean() + responseBodyBean.data = data + return responseBodyBean + } + + /** + * Respond a message and status is OK. + * + * @param the response body data type + * @param message message to be responded + * @return response body + */ + fun ofSuccessMessage(message: String): ResponseBodyBean { + val responseBodyBean = ResponseBodyBean() + responseBodyBean.message = 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 + * @return response body + */ + fun ofSuccess( + data: T?, + message: String + ): ResponseBodyBean { + val responseBodyBean = ResponseBodyBean() + responseBodyBean.data = data + responseBodyBean.message = message + 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 + */ + fun ofFailureMessage(message: String): ResponseBodyBean { + throw InternalServerException(message) + } + + /** + * Respond a message and status is FAILURE(464). + * + * @param the response body data type + * @param data data to be responded + * @return response body + */ + fun ofFailure(data: T): ResponseBodyBean { + throw InternalServerException(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 + */ + fun ofFailure(data: T, message: String): ResponseBodyBean { + throw InternalServerException(data, message) + } + + /** + * Respond an ERROR(500). + * + * @param the response body data type + * @return response body + */ + fun ofError(): ResponseBodyBean { + return setResponse( + HttpStatus.INTERNAL_SERVER_ERROR.value(), + HttpStatus.INTERNAL_SERVER_ERROR.reasonPhrase, + null + ) + } + + /** + * Respond a custom error. + * + * @param the response body data type + * @param status Error status, not OK(200) + * @return response body + */ + fun ofError(status: HttpStatus): ResponseBodyBean { + return setResponse(status.value(), status.reasonPhrase, null) + } + + /** + * Response an exception. + * + * @param the response body data type + * @param Sub-class of [BaseException] + * @param throwable exception + * @return the response body bean + */ + fun ofException(throwable: B): ResponseBodyBean { + 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 + */ + fun of(message: String, data: Any?, status: Int): JSON { + val responseBodyBean = ofStatus(status, message, data) + val config = JSONConfig() + config.setIgnoreNullValue(false).dateFormat = UniversalDateTime.DATE_TIME_FORMAT + return JSONUtil.parse(responseBodyBean, config) + } + } +} diff --git a/common/src/main/java/com/jmsoftware/maf/common/bean/TrackableBean.kt b/common/src/main/java/com/jmsoftware/maf/common/bean/TrackableBean.kt new file mode 100644 index 00000000..d22a065d --- /dev/null +++ b/common/src/main/java/com/jmsoftware/maf/common/bean/TrackableBean.kt @@ -0,0 +1,15 @@ +package com.jmsoftware.maf.common.bean + +/** + * # TrackableBean + * + * Change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/12/22 9:50 PM + */ +open class TrackableBean { + /** + * The Track. Pattern: [Zipkin trace id]#[Span id] + */ + var track: String? = null +} 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 deleted file mode 100644 index b29c5aad..00000000 --- a/common/src/main/java/com/jmsoftware/maf/common/constant/MafHttpHeader.java +++ /dev/null @@ -1,27 +0,0 @@ -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-Id - */ - X_ID("X-Id"), - /** - * 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/MafHttpHeader.kt b/common/src/main/java/com/jmsoftware/maf/common/constant/MafHttpHeader.kt new file mode 100644 index 00000000..0a841b8f --- /dev/null +++ b/common/src/main/java/com/jmsoftware/maf/common/constant/MafHttpHeader.kt @@ -0,0 +1,20 @@ +package com.jmsoftware.maf.common.constant + +/** + * # MafHttpHeader + * + * Description: MafHttpHeader, change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/16/22 6:38 PM + */ +enum class MafHttpHeader(val header: String) { + /** + * X-Id + */ + X_ID("X-Id"), + + /** + * X-Username + */ + X_USERNAME("X-Username"); +} 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 deleted file mode 100644 index 87b49661..00000000 --- a/common/src/main/java/com/jmsoftware/maf/common/constant/UniversalDateTime.java +++ /dev/null @@ -1,12 +0,0 @@ -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/constant/UniversalDateTime.kt b/common/src/main/java/com/jmsoftware/maf/common/constant/UniversalDateTime.kt new file mode 100644 index 00000000..4d70dbf7 --- /dev/null +++ b/common/src/main/java/com/jmsoftware/maf/common/constant/UniversalDateTime.kt @@ -0,0 +1,14 @@ +package com.jmsoftware.maf.common.constant + +/** + * # UniversalDateTime + * + * Description: UniversalDateTime, change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/16/22 6:38 PM + */ +object UniversalDateTime{ + const val DATE_FORMAT = "yyyy-MM-dd" + const val TIME_FORMAT = "HH:mm:ss" + const val 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 deleted file mode 100644 index 013aec65..00000000 --- a/common/src/main/java/com/jmsoftware/maf/common/domain/DeletedField.java +++ /dev/null @@ -1,42 +0,0 @@ -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/DeletedField.kt b/common/src/main/java/com/jmsoftware/maf/common/domain/DeletedField.kt new file mode 100644 index 00000000..7e6c66c5 --- /dev/null +++ b/common/src/main/java/com/jmsoftware/maf/common/domain/DeletedField.kt @@ -0,0 +1,29 @@ +package com.jmsoftware.maf.common.domain + +/** + * # DeletedField + * + * Description: DeletedField, change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/16/22 8:17 PM + */ +enum class DeletedField( + /** + * The Value. + */ + val value: String, + /** + * The Description. + */ + val description: String +) { + /** + * Not deleted + */ + NOT_DELETED("N", "not deleted"), + + /** + * Deleted + */ + DELETED("Y", "deleted"); +} 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 deleted file mode 100644 index 741d099d..00000000 --- a/common/src/main/java/com/jmsoftware/maf/common/domain/ValidationTestPayload.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.jmsoftware.maf.common.domain; - -import lombok.Data; - -import javax.validation.constraints.Min; -import javax.validation.constraints.NotBlank; -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; - @NotBlank - private String name; -} diff --git a/common/src/main/java/com/jmsoftware/maf/common/domain/ValidationTestPayload.kt b/common/src/main/java/com/jmsoftware/maf/common/domain/ValidationTestPayload.kt new file mode 100644 index 00000000..5d0b81cd --- /dev/null +++ b/common/src/main/java/com/jmsoftware/maf/common/domain/ValidationTestPayload.kt @@ -0,0 +1,23 @@ +package com.jmsoftware.maf.common.domain + +import javax.validation.constraints.Min +import javax.validation.constraints.NotBlank +import javax.validation.constraints.NotNull + +/** + *

ValidationTestPayload

+ * + * + * Change description here. + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com + * @date 2/14/20 11:34 AM + */ +class ValidationTestPayload { + @NotNull + @Min(value = 1L) + var id: Long = 0L + + @NotBlank + lateinit var name: String +} 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 deleted file mode 100644 index 82974478..00000000 --- a/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/permission/GetPermissionListByRoleIdListPayload.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.jmsoftware.maf.common.domain.authcenter.permission; - -import lombok.Data; - -import javax.validation.constraints.NotEmpty; -import java.util.List; - -/** - *

GetPermissionListByRoleIdListPayload

- *

- * Change description here. - * - * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com - * @date 5/11/20 8:38 AM - **/ -@Data -public class GetPermissionListByRoleIdListPayload { - /** - * The Role id list. - */ - @NotEmpty - private List roleIdList; - @NotEmpty - private List permissionTypeList; -} diff --git a/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/permission/GetPermissionListByRoleIdListPayload.kt b/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/permission/GetPermissionListByRoleIdListPayload.kt new file mode 100644 index 00000000..31d29b6b --- /dev/null +++ b/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/permission/GetPermissionListByRoleIdListPayload.kt @@ -0,0 +1,18 @@ +package com.jmsoftware.maf.common.domain.authcenter.permission + +import javax.validation.constraints.NotEmpty + +/** + * # GetPermissionListByRoleIdListPayload + * + * Change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/16/22 6:41 PM + */ +class GetPermissionListByRoleIdListPayload { + @NotEmpty + lateinit var roleIdList: List + + @NotEmpty + lateinit var permissionTypeList: List +} 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 deleted file mode 100644 index 6f6fd3df..00000000 --- a/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/permission/GetPermissionListByRoleIdListResponse.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; - -/** - *

GetPermissionListByRoleIdListResponse

- *

- * Change description here. - * - * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com - * @date 5 /11/20 8:38 AM - */ -@Data -public class GetPermissionListByRoleIdListResponse { - /** - * The Permission list. - */ - private final List permissionList = new LinkedList<>(); - - @Data - public static class Permission { - /** - * The Url. - */ - private String url; - /** - * The Type. - */ - private Byte 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/GetPermissionListByRoleIdListResponse.kt b/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/permission/GetPermissionListByRoleIdListResponse.kt new file mode 100644 index 00000000..d7694fa7 --- /dev/null +++ b/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/permission/GetPermissionListByRoleIdListResponse.kt @@ -0,0 +1,37 @@ +package com.jmsoftware.maf.common.domain.authcenter.permission + +/** + * # GetPermissionListByRoleIdListResponse + * + * Change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/16/22 6:43 PM + */ +class GetPermissionListByRoleIdListResponse { + /** + * The Permission list. + */ + var permissionList: MutableList = mutableListOf() +} + +class Permission { + /** + * The Url. + */ + var url: String? = null + + /** + * The Type. + */ + var type: Byte? = null + + /** + * The Permission expression. + */ + var permissionExpression: String? = null + + /** + * The Method. + */ + var method: String? = null +} 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 deleted file mode 100644 index 77433a70..00000000 --- a/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/permission/PermissionType.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.jmsoftware.maf.common.domain.authcenter.permission; - -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((byte) 0, "Controller"), - /** - * Page - */ - PAGE((byte) 1, "Page"), - /** - * Button - */ - BUTTON((byte) 2, "Button (API)"); - - private final Byte type; - private final String description; - - PermissionType(Byte type, String description) { - this.type = type; - this.description = description; - } - - public static PermissionType getByType(Byte 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/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/permission/PermissionType.kt b/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/permission/PermissionType.kt new file mode 100644 index 00000000..d07325d5 --- /dev/null +++ b/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/permission/PermissionType.kt @@ -0,0 +1,56 @@ +package com.jmsoftware.maf.common.domain.authcenter.permission + +import com.jmsoftware.maf.common.util.logger + +/** + * # PermissionType + * + * Change description here + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/16/22 6:44 PM + */ +enum class PermissionType(val type: Byte, val description: String) { + /** + * Controller + */ + CONTROLLER(0.toByte(), "Controller"), + + /** + * Page + */ + PAGE(1.toByte(), "Page"), + + /** + * Button + */ + BUTTON(2.toByte(), "Button (API)"); + + companion object { + private val log = logger() + fun getByType(type: Byte): PermissionType? { + var permissionType: PermissionType? = null + val values = values() + for (pt in values) { + if (pt.type == type) { + permissionType = pt + } + } + return permissionType + } + + /** + * Get enum by name + * + * @param name enum name + * @return enum + */ + fun getByName(name: String): PermissionType? { + return try { + valueOf(name) + } catch (e: IllegalArgumentException) { + log.error("Invalid enum name: $name", e) + null + } + } + } +} 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 deleted file mode 100644 index eaa9b126..00000000 --- a/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/role/GetRoleListByUserIdResponse.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.jmsoftware.maf.common.domain.authcenter.role; - -import lombok.Data; - -import java.io.Serializable; -import java.util.LinkedList; -import java.util.List; - -/** - *

GetRoleListByUserIdResponse

- *

- * Change description here. - * - * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com - * @date 5/10/20 10:55 PM - **/ -@Data -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/GetRoleListByUserIdResponse.kt b/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/role/GetRoleListByUserIdResponse.kt new file mode 100644 index 00000000..d06e1c4e --- /dev/null +++ b/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/role/GetRoleListByUserIdResponse.kt @@ -0,0 +1,38 @@ +package com.jmsoftware.maf.common.domain.authcenter.role + +import java.io.Serial +import java.io.Serializable + +/** + * # GetRoleListByUserIdResponse + * + * Change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/16/22 6:52 PM + */ +class GetRoleListByUserIdResponse : Serializable { + companion object { + @Serial + private const val serialVersionUID = -8462678958191383914L + } + + lateinit var roleList: List +} + +/** + * # GetRoleListByUserIdSingleResponse + * + * Description: GetRoleListByUserIdSingleResponse, change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/16/22 6:56 PM + */ +class GetRoleListByUserIdSingleResponse : Serializable { + companion object { + @Serial + private const val serialVersionUID = 3758434255123050684L + } + + var id: Long = 0L + + lateinit var name: String +} 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 deleted file mode 100644 index 0d5202aa..00000000 --- a/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/role/GetRoleListByUserIdSingleResponse.java +++ /dev/null @@ -1,17 +0,0 @@ -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 deleted file mode 100644 index a3ef5bad..00000000 --- a/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/security/ParseJwtResponse.java +++ /dev/null @@ -1,16 +0,0 @@ -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 Long id; - private String username; -} diff --git a/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/security/ParseJwtResponse.kt b/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/security/ParseJwtResponse.kt new file mode 100644 index 00000000..431d7eab --- /dev/null +++ b/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/security/ParseJwtResponse.kt @@ -0,0 +1,13 @@ +package com.jmsoftware.maf.common.domain.authcenter.security + +/** + * # ParseJwtResponse + * + * Description: ParseJwtResponse, change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/16/22 7:24 PM + */ +class ParseJwtResponse { + var id: Long = 0L + lateinit var username: String +} diff --git a/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/security/UserPrincipal.java b/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/security/UserPrincipal.java deleted file mode 100644 index 48db9960..00000000 --- a/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/security/UserPrincipal.java +++ /dev/null @@ -1,167 +0,0 @@ -package com.jmsoftware.maf.common.domain.authcenter.security; - -import cn.hutool.core.util.StrUtil; -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.jmsoftware.maf.common.domain.authcenter.permission.GetPermissionListByRoleIdListResponse; -import com.jmsoftware.maf.common.domain.authcenter.user.GetUserByLoginTokenResponse; -import com.jmsoftware.maf.common.domain.authcenter.user.UserStatus; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.val; -import org.springframework.security.core.GrantedAuthority; -import org.springframework.security.core.authority.SimpleGrantedAuthority; -import org.springframework.security.core.userdetails.UserDetails; - -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 - * @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 LocalDate birthday; - /** - * Gender - */ - private String gender; - /** - * Status - */ - private Byte status; - /** - * Create time - */ - private LocalDateTime gmtCreated; - /** - * Modify time - */ - private LocalDateTime gmtModified; - /** - * Roles that user has - */ - private List roles; - /** - * Authorities that user has - */ - 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 - * - * @param user user - * @param roleNameList role name list - * @param permissionList permission po list - * @return user principal - */ - public static UserPrincipal create(GetUserByLoginTokenResponse user, List roleNameList, - List permissionList) { - 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(), - user.getEmail(), - user.getCellphone(), - user.getPassword(), - user.getFullName(), - user.getBirthday(), - user.getGender(), - user.getStatus(), - user.getCreatedTime(), - user.getModifiedTime(), - roleNameList, - 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.getValue()); - } -} diff --git a/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/security/UserPrincipal.kt b/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/security/UserPrincipal.kt new file mode 100644 index 00000000..918d36bd --- /dev/null +++ b/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/security/UserPrincipal.kt @@ -0,0 +1,168 @@ +package com.jmsoftware.maf.common.domain.authcenter.security + +import cn.hutool.core.util.StrUtil +import com.fasterxml.jackson.annotation.JsonIgnore +import com.jmsoftware.maf.common.domain.authcenter.permission.Permission +import com.jmsoftware.maf.common.domain.authcenter.user.GetUserByLoginTokenResponse +import com.jmsoftware.maf.common.domain.authcenter.user.UserStatus +import org.springframework.security.core.GrantedAuthority +import org.springframework.security.core.authority.SimpleGrantedAuthority +import org.springframework.security.core.userdetails.UserDetails +import java.io.Serial +import java.time.LocalDate +import java.time.LocalDateTime + +/** + * # UserPrincipal + * + * Custom user details. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/16/22 7:26 PM + */ +class UserPrincipal : UserDetails { + /** + * Primary key + */ + var id: Long? = null + + /** + * Username + */ + var usernameProperty: String? = null + + /** + * Email + */ + var email: String? = null + + /** + * Phone + */ + var cellphone: String? = null + + /** + * Password + */ + @JsonIgnore + var passwordProperty: String? = null + + /** + * Nickname + */ + var fullName: String? = null + + /** + * Birthday + */ + var birthday: LocalDate? = null + + /** + * Gender + */ + var gender: String? = null + + /** + * Status + */ + var status: Byte? = null + + /** + * Create time + */ + var gmtCreated: LocalDateTime? = null + + /** + * Modify time + */ + var gmtModified: LocalDateTime? = null + + /** + * Roles that user has + */ + var roles: List? = null + + /** + * Authorities that user has + */ + var authoritiesProperty: Collection? = null + + override fun getAuthorities(): Collection { + return authoritiesProperty!! + } + + override fun getPassword(): String { + return passwordProperty!! + } + + override fun getUsername(): String { + return usernameProperty!! + } + + override fun isAccountNonExpired(): Boolean { + return true + } + + override fun isAccountNonLocked(): Boolean { + return true + } + + override fun isCredentialsNonExpired(): Boolean { + return true + } + + override fun isEnabled(): Boolean { + return status == UserStatus.ENABLED.value + } + + companion object { + @Serial + private const val serialVersionUID = -53353171692896501L + + /** + * 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 + */ + fun createByUsername(username: String): UserPrincipal { + val userPrincipal = UserPrincipal() + userPrincipal.usernameProperty = username + return userPrincipal + } + + /** + * Create user principal + * + * @param user user + * @param roleNameList role name list + * @param permissionList permission po list + * @return user principal + */ + fun create( + user: GetUserByLoginTokenResponse, + roleNameList: List = listOf(), + permissionList: List = listOf() + ): UserPrincipal { + val authorities = permissionList.stream() + .filter { permission: Permission -> StrUtil.isNotBlank(permission.permissionExpression) } + .map { permission: Permission -> SimpleGrantedAuthority(permission.permissionExpression) } + .toList() + return UserPrincipal().apply { + this.id = user.id + this.usernameProperty = user.username + this.email = user.email + this.cellphone = user.cellphone + this.passwordProperty = user.password + this.fullName = user.fullName + this.birthday = user.birthday + this.gender = user.gender + this.status = user.status + this.gmtCreated = user.createdTime + this.gmtModified = user.modifiedTime + this.roles = roleNameList + this.authoritiesProperty = authorities + } + } + } +} 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 deleted file mode 100644 index e02f9d71..00000000 --- a/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/user/GetUserByLoginTokenResponse.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.jmsoftware.maf.common.domain.authcenter.user; - -import lombok.Data; - -import java.time.LocalDate; -import java.time.LocalDateTime; - -/** - *

GetUserByLoginTokenResponse

- *

- * Change description here. - * - * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com - * @date 5/10/20 12:45 PM - **/ -@Data -public class GetUserByLoginTokenResponse { - /** - * 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 LocalDate birthday; - /** - * 58 gender options - */ - private String gender; - /** - * User avatar full path on SFTP server - */ - private String avatar; - /** - * Status. 1 - enabled, 2 - disabled - */ - private Byte status; - /** - * Create time - */ - private LocalDateTime createdTime; - /** - * Modify time - */ - private LocalDateTime modifiedTime; -} diff --git a/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/user/GetUserByLoginTokenResponse.kt b/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/user/GetUserByLoginTokenResponse.kt new file mode 100644 index 00000000..55c44945 --- /dev/null +++ b/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/user/GetUserByLoginTokenResponse.kt @@ -0,0 +1,73 @@ +package com.jmsoftware.maf.common.domain.authcenter.user + +import java.time.LocalDate +import java.time.LocalDateTime + +/** + * # GetUserByLoginTokenResponse + * + * Change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/16/22 7:37 PM + */ +class GetUserByLoginTokenResponse { + /** + * Primary key + */ + var id: Long? = null + + /** + * Username + */ + var username: String? = null + + /** + * Email + */ + var email: String? = null + + /** + * Cellphone number + */ + var cellphone: String? = null + + /** + * Password + */ + var password: String? = null + + /** + * Nickname + */ + var fullName: String? = null + + /** + * Birthday (yyyy-MM-dd) + */ + var birthday: LocalDate? = null + + /** + * 58 gender options + */ + var gender: String? = null + + /** + * User avatar full path on SFTP server + */ + var avatar: String? = null + + /** + * Status. 1 - enabled, 2 - disabled + */ + var status: Byte? = null + + /** + * Create time + */ + var createdTime: LocalDateTime? = null + + /** + * Modify time + */ + var modifiedTime: LocalDateTime? = null +} diff --git a/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/user/LoginPayload.java b/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/user/LoginPayload.java deleted file mode 100644 index ac353a6d..00000000 --- a/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/user/LoginPayload.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.jmsoftware.maf.common.domain.authcenter.user; - -import lombok.Data; -import org.hibernate.validator.constraints.Length; - -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; - -/** - * Description: LoginPayload, change description here. - * - * @author 钟俊(zhongjun), email: zhongjun@toguide.cn, date: 12/22/2020 6:26 PM - **/ -@Data -public class LoginPayload { - /** - * The Login token: username / email - */ - @NotBlank - @Length(max = 100) - private String loginToken; - /** - * The Password. - */ - @NotBlank - @Length(max = 60) - private String password; - /** - * Remember me - */ - @NotNull - private Boolean rememberMe; -} diff --git a/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/user/LoginPayload.kt b/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/user/LoginPayload.kt new file mode 100644 index 00000000..d67bf139 --- /dev/null +++ b/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/user/LoginPayload.kt @@ -0,0 +1,32 @@ +package com.jmsoftware.maf.common.domain.authcenter.user + +import org.hibernate.validator.constraints.Length +import javax.validation.constraints.NotBlank +import javax.validation.constraints.NotNull + +/** + * Description: LoginPayload, change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/16/22 8:08 PM + */ +class LoginPayload { + /** + * The Login token: username / email + */ + @NotBlank + @Length(max = 100) + lateinit var loginToken: String + + /** + * The Password. + */ + @NotBlank + @Length(max = 60) + lateinit var password: String + + /** + * Remember me + */ + @NotNull + var rememberMe: Boolean = false +} 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 deleted file mode 100644 index 6e4b874a..00000000 --- a/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/user/LoginResponse.java +++ /dev/null @@ -1,14 +0,0 @@ -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/LoginResponse.kt b/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/user/LoginResponse.kt new file mode 100644 index 00000000..2bdc8cc6 --- /dev/null +++ b/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/user/LoginResponse.kt @@ -0,0 +1,13 @@ +package com.jmsoftware.maf.common.domain.authcenter.user + +/** + * # LoginResponse + * + * Description: LoginResponse, change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/16/22 8:10 PM + */ +class LoginResponse { + var greeting: String? = null + var jwt: String? = null +} 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 deleted file mode 100644 index 9738ed0d..00000000 --- a/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/user/LogoutPayload.java +++ /dev/null @@ -1,13 +0,0 @@ -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/LogoutPayload.kt b/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/user/LogoutPayload.kt new file mode 100644 index 00000000..71edc8da --- /dev/null +++ b/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/user/LogoutPayload.kt @@ -0,0 +1,12 @@ +package com.jmsoftware.maf.common.domain.authcenter.user + +/** + * # LogoutPayload + * + * Description: LogoutPayload, change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/16/22 8:11 PM + */ +class LogoutPayload { + var jwt: String? = null +} diff --git a/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/user/SignupPayload.java b/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/user/SignupPayload.java deleted file mode 100644 index babf5df8..00000000 --- a/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/user/SignupPayload.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.jmsoftware.maf.common.domain.authcenter.user; - -import lombok.Data; -import org.hibernate.validator.constraints.Length; - -import javax.validation.constraints.NotBlank; - -/** - *

SignupPayload

- *

- * Change description here. - * - * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com - * @date 5/11/20 5:34 AM - **/ -@Data -public class SignupPayload { - /** - * The Username. - */ - @NotBlank - @Length(min = 4, max = 50) - private String username; - /** - * The Email. - */ - @NotBlank - @Length(max = 100) - private String email; - /** - * The Encoded password. - */ - @NotBlank - @Length(min = 8, max = 60) - private String password; -} diff --git a/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/user/SignupPayload.kt b/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/user/SignupPayload.kt new file mode 100644 index 00000000..1cbfd501 --- /dev/null +++ b/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/user/SignupPayload.kt @@ -0,0 +1,36 @@ +package com.jmsoftware.maf.common.domain.authcenter.user + +import org.hibernate.validator.constraints.Length +import javax.validation.constraints.Email +import javax.validation.constraints.NotBlank + +/** + * # SignupPayload + * + * Change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/16/22 8:11 PM + */ +class SignupPayload { + /** + * The Username. + */ + @NotBlank + @Length(min = 4, max = 50) + lateinit var username: String + + /** + * The Email. + */ + @Email + @NotBlank + @Length(max = 100) + lateinit var email: String + + /** + * The Encoded password. + */ + @NotBlank + @Length(min = 8, max = 60) + lateinit var password: String +} diff --git a/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/user/SignupResponse.java b/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/user/SignupResponse.kt similarity index 55% rename from common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/user/SignupResponse.java rename to common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/user/SignupResponse.kt index 2441acf7..340561d9 100644 --- a/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/user/SignupResponse.java +++ b/common/src/main/java/com/jmsoftware/maf/common/domain/authcenter/user/SignupResponse.kt @@ -1,19 +1,17 @@ -package com.jmsoftware.maf.common.domain.authcenter.user; - -import lombok.Data; +package com.jmsoftware.maf.common.domain.authcenter.user /** *

SignupResponse

- *

+ * + * * Change description here. * * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com * @date 5/11/20 5:37 AM - **/ -@Data -public class SignupResponse { + */ +class SignupResponse { /** * The User id. */ - private Long userId; + var userId: Long? = null } 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 6a802679..25c90fb6 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,7 +1,8 @@ package com.jmsoftware.maf.common.domain.authcenter.user; -import com.jmsoftware.maf.common.bean.EnumerationBase; +import com.jmsoftware.maf.common.enumeration.ValueDescriptionBaseEnum; import lombok.Getter; +import lombok.ToString; /** * Description: UserStatus, change description here. @@ -10,7 +11,8 @@ * @date 2019-03-23 18:48 **/ @Getter -public enum UserStatus implements EnumerationBase { +@ToString +public enum UserStatus implements ValueDescriptionBaseEnum { /** * Enabled user */ @@ -27,21 +29,4 @@ public enum UserStatus implements EnumerationBase { this.value = value; this.description = description; } - - /** - * Get user value enum by value value - * - * @param value value value - * @return user value enum - */ - public static UserStatus ofValue(Byte value) { - UserStatus result = UserStatus.DISABLED; - UserStatus[] userStatuses = UserStatus.values(); - for (UserStatus userStatus : userStatuses) { - if (userStatus.value.equals(value)) { - result = userStatus; - } - } - return result; - } } 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 index e7ad7307..cd1b6795 100644 --- 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 @@ -1,7 +1,8 @@ package com.jmsoftware.maf.common.domain.authcenter.user; -import com.jmsoftware.maf.common.bean.EnumerationBase; +import com.jmsoftware.maf.common.enumeration.ValueDescriptionBaseEnum; import lombok.Getter; +import lombok.ToString; /** * Description: UserStatus, change description here. @@ -10,7 +11,8 @@ * @date 2019-03-23 18:48 **/ @Getter -public enum UserStatus2 implements EnumerationBase { +@ToString +public enum UserStatus2 implements ValueDescriptionBaseEnum { /** * Enabled user */ @@ -27,21 +29,4 @@ public enum UserStatus2 implements EnumerationBase { 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/osscenter/package-info.java b/common/src/main/java/com/jmsoftware/maf/common/domain/osscenter/package-info.java deleted file mode 100644 index 3b746346..00000000 --- a/common/src/main/java/com/jmsoftware/maf/common/domain/osscenter/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package com.jmsoftware.maf.common.domain.osscenter; diff --git a/common/src/main/java/com/jmsoftware/maf/common/domain/osscenter/package-info.kt b/common/src/main/java/com/jmsoftware/maf/common/domain/osscenter/package-info.kt new file mode 100644 index 00000000..274f3518 --- /dev/null +++ b/common/src/main/java/com/jmsoftware/maf/common/domain/osscenter/package-info.kt @@ -0,0 +1 @@ +package com.jmsoftware.maf.common.domain.osscenter diff --git a/common/src/main/java/com/jmsoftware/maf/common/domain/osscenter/write/ObjectResponse.java b/common/src/main/java/com/jmsoftware/maf/common/domain/osscenter/write/ObjectResponse.java deleted file mode 100644 index e2a2cba7..00000000 --- a/common/src/main/java/com/jmsoftware/maf/common/domain/osscenter/write/ObjectResponse.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.jmsoftware.maf.common.domain.osscenter.write; - -import lombok.Data; - -/** - * Description: ObjectResponse, change description here. - * - * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 8/12/2021 9:27 PM - **/ -@Data -public class ObjectResponse { - private String bucket; - private String object; - private String etag; -} diff --git a/common/src/main/java/com/jmsoftware/maf/common/domain/osscenter/write/ObjectResponse.kt b/common/src/main/java/com/jmsoftware/maf/common/domain/osscenter/write/ObjectResponse.kt new file mode 100644 index 00000000..73686879 --- /dev/null +++ b/common/src/main/java/com/jmsoftware/maf/common/domain/osscenter/write/ObjectResponse.kt @@ -0,0 +1,14 @@ +package com.jmsoftware.maf.common.domain.osscenter.write + +/** + * # ObjectResponse + * + * Description: ObjectResponse, change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/16/22 12:08 PM + */ +class ObjectResponse { + var bucket: String? = null + var `object`: String? = null + var etag: String? = null +} 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 deleted file mode 100644 index e104b0a8..00000000 --- a/common/src/main/java/com/jmsoftware/maf/common/domain/springbootstarter/HttpApiResourcesResponse.java +++ /dev/null @@ -1,23 +0,0 @@ -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/domain/springbootstarter/HttpApiResourcesResponse.kt b/common/src/main/java/com/jmsoftware/maf/common/domain/springbootstarter/HttpApiResourcesResponse.kt new file mode 100644 index 00000000..60f2fa34 --- /dev/null +++ b/common/src/main/java/com/jmsoftware/maf/common/domain/springbootstarter/HttpApiResourcesResponse.kt @@ -0,0 +1,19 @@ +package com.jmsoftware.maf.common.domain.springbootstarter + +import org.springframework.web.bind.annotation.RequestMethod + +/** + * # HttpApiResourcesResponse + * + * Description: HttpApiResourcesResponse, change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/13/22 1:48 PM + */ +class HttpApiResourcesResponse { + val list: MutableList = mutableListOf() + + class HttpApiResource { + var method: RequestMethod? = null + var urlPattern: String? = null + } +} diff --git a/common/src/main/java/com/jmsoftware/maf/common/enumeration/ValueDescriptionBaseEnum.java b/common/src/main/java/com/jmsoftware/maf/common/enumeration/ValueDescriptionBaseEnum.java new file mode 100644 index 00000000..16cee950 --- /dev/null +++ b/common/src/main/java/com/jmsoftware/maf/common/enumeration/ValueDescriptionBaseEnum.java @@ -0,0 +1,175 @@ +package com.jmsoftware.maf.common.enumeration; + +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.EnumUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import lombok.NonNull; +import lombok.val; + +/** + *

ValueDescriptionBaseEnum

+ *

+ * Change description here. + * + * @param the type of value + * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com, 2/27/22 11:32 AM + */ +@SuppressWarnings("unused") +public interface ValueDescriptionBaseEnum { + /** + * Gets value, which represents the value stored in database + * + * @return the value + */ + V getValue(); + + /** + * Gets description, which indicates what the value represents for. + * + * @return the description + */ + String getDescription(); + + /** + * Check if the value exists in the enums. + * + * @param the type parameter + * @param enums the enums + * @param value the value + * @return the boolean + */ + static boolean exists(@NonNull ValueDescriptionBaseEnum[] enums, T value) { + if (!EnumUtil.isEnum(enums[0])) { + throw new IllegalArgumentException("Not an enum type"); + } + if (value == null) { + return false; + } + if (ArrayUtil.isEmpty(enums)) { + return false; + } + for (ValueDescriptionBaseEnum e : enums) { + if (value.equals(e.getValue())) { + return true; + } + } + return false; + } + + /** + * Exists boolean. + * + * @param the type of enum + * @param the type of value + * @param enumClass the enum class + * @param value the value + * @return the boolean + */ + @SuppressWarnings("unchecked") + static >, V> boolean exists(@NonNull Class enumClass, V value) { + for (Enum> e : enumClass.getEnumConstants()) { + if (((ValueDescriptionBaseEnum) e).getValue().equals(value)) { + return true; + } + } + return false; + } + + /** + * Gets description by value. + * + * @param the type parameter + * @param the type parameter + * @param enumClass the enum class + * @param value the value + * @return the description by value + */ + @SuppressWarnings("unchecked") + static >, V> String getDescriptionByValue(@NonNull Class enumClass, V value) { + if (value == null) { + return null; + } + for (Enum> e : enumClass.getEnumConstants()) { + if (((ValueDescriptionBaseEnum) e).getValue().equals(value)) { + return ((ValueDescriptionBaseEnum) e).getDescription(); + } + } + return null; + } + + /** + * Gets by enum name. + * + * @param the type parameter + * @param the type parameter + * @param enumClass the enum class + * @param enumName the enum name + * @return the by enum name + */ + @SuppressWarnings("unchecked") + static >, V> E getByEnumName( + @NonNull Class enumClass, + String enumName + ) { + if (StrUtil.isEmpty(enumName)) { + return null; + } + for (val e : enumClass.getEnumConstants()) { + if (StrUtil.equalsIgnoreCase(e.name(), enumName)) { + return e; + } + } + return null; + } + + + /** + * Gets value by enum name. + * + * @param the type parameter + * @param the type parameter + * @param enumClass the enum class + * @param enumName the enum name + * @return the value by enum name + */ + @SuppressWarnings("unchecked") + static >, V> V getValueByEnumName( + @NonNull Class enumClass, + String enumName + ) { + if (StrUtil.isEmpty(enumName)) { + return null; + } + val e = ((ValueDescriptionBaseEnum) getByEnumName(enumClass, enumName)); + if (e != null) { + return e.getValue(); + } + return null; + } + + /** + * Gets by value. + * + * @param the type parameter + * @param the type parameter + * @param enumClass the enum class + * @param value the value + * @return the by value + */ + @SuppressWarnings("unchecked") + static >, V> E getByValue( + @NonNull Class enumClass, + V value + ) { + if (ObjectUtil.isNull(value)) { + return null; + } + for (val e : enumClass.getEnumConstants()) { + if (((ValueDescriptionBaseEnum) e).getValue().equals(value)) { + return e; + } + } + return null; + } +} 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 deleted file mode 100644 index 7b2db924..00000000 --- a/common/src/main/java/com/jmsoftware/maf/common/exception/BaseException.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.jmsoftware.maf.common.exception; - -import lombok.Data; -import lombok.EqualsAndHashCode; -import org.springframework.http.HttpStatus; - -/** - *

BaseException

- *

- * Base exception. - * - * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com - * @date 2019-03-23 16:23 - **/ -@Data -@EqualsAndHashCode(callSuper = true) -public class BaseException extends Exception { - private static final long serialVersionUID = 5049763892480652887L; - - /** - * Code is REQUIRED. Default code is 500 (Internal Server Error). - */ - 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. - */ - private String message = HttpStatus.INTERNAL_SERVER_ERROR.getReasonPhrase(); - private Object data; - - public BaseException(HttpStatus httpStatus) { - this.code = httpStatus.value(); - this.message = httpStatus.getReasonPhrase(); - } - - public BaseException(Object data, HttpStatus httpStatus) { - this(httpStatus); - this.data = data; - } - - public BaseException(HttpStatus status, Object data) { - this(status); - this.data = data; - } - - public BaseException(HttpStatus httpStatus, String message) { - this(httpStatus); - this.message = message; - } - - public BaseException(String message) { - this.message = message; - } - - public BaseException(Integer status, String message, Object data) { - this.code = status; - this.message = message; - this.data = data; - } - - public BaseException(String message, Throwable throwable) { - this(message); - super.setStackTrace(throwable.getStackTrace()); - } - - public BaseException(Object data) { - this.data = data; - } - - public BaseException(Throwable throwable) { - this(throwable.getMessage()); - super.setStackTrace(throwable.getStackTrace()); - } - - public BaseException(Object data, String message) { - this.data = data; - this.message = message; - } -} diff --git a/common/src/main/java/com/jmsoftware/maf/common/exception/BaseException.kt b/common/src/main/java/com/jmsoftware/maf/common/exception/BaseException.kt new file mode 100644 index 00000000..e7e0a100 --- /dev/null +++ b/common/src/main/java/com/jmsoftware/maf/common/exception/BaseException.kt @@ -0,0 +1,61 @@ +package com.jmsoftware.maf.common.exception + +import org.springframework.http.HttpStatus +import java.io.Serial + +/** + * # BaseException + * + * Base exception. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/16/22 8:20 PM + */ +open class BaseException : Exception { + /** + * Code is REQUIRED. Default code is 500 (Internal Server Error). + */ + var code = HttpStatus.INTERNAL_SERVER_ERROR.value() + + /** + * Message is REQUIRED. Default message is: Error. A generic status for an error in the server itself. + */ + var msg: String = HttpStatus.INTERNAL_SERVER_ERROR.reasonPhrase + var data: Any? = null + + constructor(httpStatus: HttpStatus) { + this.code = httpStatus.value() + msg = httpStatus.reasonPhrase + } + + constructor(data: Any?, httpStatus: HttpStatus) : this(httpStatus) { + this.data = data + } + + constructor(message: String) { + this.msg = message + } + + constructor(status: Int, message: String, data: Any?) { + this.code = status + this.msg = message + this.data = data + } + + constructor(data: Any?) { + this.data = data + } + + constructor(throwable: Throwable) : this(throwable.message) { + super.setStackTrace(throwable.stackTrace) + } + + constructor(data: Any?, message: String) { + this.data = data + this.msg = message + } + + companion object { + @Serial + private val serialVersionUID = 5049763892480652887L + } +} diff --git a/common/src/main/java/com/jmsoftware/maf/common/exception/BizException.java b/common/src/main/java/com/jmsoftware/maf/common/exception/BizException.java deleted file mode 100644 index 409e19bd..00000000 --- a/common/src/main/java/com/jmsoftware/maf/common/exception/BizException.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.jmsoftware.maf.common.exception; - -import org.springframework.http.HttpStatus; - -/** - *

BizException

- *

- * Business Exception - * - * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com - * @date 2019-03-02 17:15 - **/ -public class BizException extends BaseException { - private static final long serialVersionUID = 6403325238832002908L; - - public BizException(HttpStatus httpStatus) { - super(httpStatus); - } - - public BizException(HttpStatus httpStatus, Object data) { - super(httpStatus, data); - } - - public BizException(HttpStatus httpStatus, String message) { - super(httpStatus, message); - } - - public BizException(String message) { - super(message); - } - - public BizException(Throwable throwable) { - super(throwable); - } - - public BizException(Integer status, String message, Object data) { - super(status, message, data); - } - - public BizException(Object data) { - super(data); - } - - public BizException(Object data, String message) { - super(data, message); - } -} diff --git a/common/src/main/java/com/jmsoftware/maf/common/exception/InternalServerException.kt b/common/src/main/java/com/jmsoftware/maf/common/exception/InternalServerException.kt new file mode 100644 index 00000000..1ef9ecdf --- /dev/null +++ b/common/src/main/java/com/jmsoftware/maf/common/exception/InternalServerException.kt @@ -0,0 +1,27 @@ +package com.jmsoftware.maf.common.exception + +import org.springframework.http.HttpStatus +import java.io.Serial + +/** + * # InternalServerException + * + * Business Exception + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/16/22 8:24 PM + */ +class InternalServerException : BaseException { + constructor(httpStatus: HttpStatus) : super(httpStatus) + constructor(httpStatus: HttpStatus, data: Any?) : super(data, httpStatus) + constructor(httpStatus: HttpStatus, message: String) : super(httpStatus, message) + constructor(message: String) : super(message) + constructor(throwable: Throwable) : super(throwable) + constructor(status: Int, message: String, data: Any?) : super(status, message, data) + constructor(data: Any?) : super(data) + constructor(data: Any?, message: String) : super(data, message) + + companion object { + @Serial + private val serialVersionUID = 6403325238832002908L + } +} diff --git a/common/src/main/java/com/jmsoftware/maf/common/exception/ResourceNotFoundException.kt b/common/src/main/java/com/jmsoftware/maf/common/exception/ResourceNotFoundException.kt new file mode 100644 index 00000000..58a72d9e --- /dev/null +++ b/common/src/main/java/com/jmsoftware/maf/common/exception/ResourceNotFoundException.kt @@ -0,0 +1,21 @@ +package com.jmsoftware.maf.common.exception + +import org.springframework.http.HttpStatus +import java.io.Serial + +/** + *

ResourceNotFoundException

+ * + * + * Resource not found exception + * + * @author Johnny Miller (鍾俊), e-mail: johnnysviva@outlook.com, date: 2/19/2022 5:05 PM + */ +class ResourceNotFoundException : BaseException { + constructor(message: String) : super(HttpStatus.NOT_FOUND, message) + + companion object { + @Serial + private val serialVersionUID = -1706570460684455863L + } +} 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 deleted file mode 100644 index 8f38c79a..00000000 --- a/common/src/main/java/com/jmsoftware/maf/common/exception/SecurityException.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.jmsoftware.maf.common.exception; - -import lombok.Data; -import lombok.EqualsAndHashCode; -import org.springframework.http.HttpStatus; - -/** - *

SecurityException

- *

- * Change description here. - * - * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com - * @date 3/12/20 3:15 PM - **/ -@Data -@EqualsAndHashCode(callSuper = true) -public class SecurityException extends BaseException { - private static final long serialVersionUID = -767157443094687237L; - - 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.value(), message, data); - } -} diff --git a/common/src/main/java/com/jmsoftware/maf/common/exception/SecurityException.kt b/common/src/main/java/com/jmsoftware/maf/common/exception/SecurityException.kt new file mode 100644 index 00000000..cb6cfbce --- /dev/null +++ b/common/src/main/java/com/jmsoftware/maf/common/exception/SecurityException.kt @@ -0,0 +1,23 @@ +package com.jmsoftware.maf.common.exception + +import org.springframework.http.HttpStatus +import java.io.Serial + +/** + *

SecurityException

+ * + * + * Change description here. + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date 3/12/20 3:15 PM + */ +class SecurityException : BaseException { + constructor(httpStatus: HttpStatus) : super(httpStatus) + constructor(httpStatus: HttpStatus, message: String) : super(httpStatus, message) + constructor(httpStatus: HttpStatus, message: String, data: Any?) : super(httpStatus.value(), message, data) + + companion object { + @Serial + private val serialVersionUID = -767157443094687237L + } +} diff --git a/common/src/main/java/com/jmsoftware/maf/common/util/KotlinLogging.kt b/common/src/main/java/com/jmsoftware/maf/common/util/KotlinLogging.kt new file mode 100644 index 00000000..a2fdfdad --- /dev/null +++ b/common/src/main/java/com/jmsoftware/maf/common/util/KotlinLogging.kt @@ -0,0 +1,40 @@ +package com.jmsoftware.maf.common.util + +import org.slf4j.Logger +import org.slf4j.LoggerFactory +import kotlin.properties.ReadOnlyProperty +import kotlin.reflect.KProperty + +/** + * # KotlinLogging + * + * Change description here. + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, 4/10/22 4:47 PM + * @see SLF4J loggers in 3 ways + **/ +@Suppress("unused") +inline fun T.logger(): Logger { + return if (T::class.isCompanion) { + LoggerFactory.getLogger(T::class.java.enclosingClass) + } else { + LoggerFactory.getLogger(T::class.java) + } +} + +class LoggerDelegate : ReadOnlyProperty { + companion object { + private fun createLogger(clazz: Class): Logger { + return LoggerFactory.getLogger(clazz) + } + } + + private var logger: Logger? = null + + override operator fun getValue(thisRef: Any?, property: KProperty<*>): Logger { + if (logger == null) { + logger = createLogger(thisRef!!.javaClass) + } + return logger!! + } +} 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 deleted file mode 100644 index 63c5f67f..00000000 --- a/common/src/main/java/com/jmsoftware/maf/common/websocket/WebSocketMessagePayload.java +++ /dev/null @@ -1,15 +0,0 @@ -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/WebSocketMessagePayload.kt b/common/src/main/java/com/jmsoftware/maf/common/websocket/WebSocketMessagePayload.kt new file mode 100644 index 00000000..99d6308a --- /dev/null +++ b/common/src/main/java/com/jmsoftware/maf/common/websocket/WebSocketMessagePayload.kt @@ -0,0 +1,14 @@ +package com.jmsoftware.maf.common.websocket + +/** + * # WebSocketMessagePayload + * + * Description: WebSocketMessagePayload, change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/16/22 8:41 PM + */ +class WebSocketMessagePayload { + var sender: String? = null + var receiver: String? = null + var content: Any? = null +} 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 deleted file mode 100644 index ea6d3845..00000000 --- a/common/src/main/java/com/jmsoftware/maf/common/websocket/WebSocketMessageResponse.java +++ /dev/null @@ -1,18 +0,0 @@ -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/main/java/com/jmsoftware/maf/common/websocket/WebSocketMessageResponse.kt b/common/src/main/java/com/jmsoftware/maf/common/websocket/WebSocketMessageResponse.kt new file mode 100644 index 00000000..33e257b5 --- /dev/null +++ b/common/src/main/java/com/jmsoftware/maf/common/websocket/WebSocketMessageResponse.kt @@ -0,0 +1,17 @@ +package com.jmsoftware.maf.common.websocket + +import java.time.LocalDateTime + +/** + * # WebSocketMessageResponse + * + * Description: WebSocketMessagePayload, change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/16/22 8:41 PM + */ +class WebSocketMessageResponse { + var timestamp: LocalDateTime = LocalDateTime.now() + var sender: String? = null + var receiver: String? = null + var content: Any? = null +} diff --git a/docker/.env b/docker/.env index a476d1fe..d300bdf0 100644 --- a/docker/.env +++ b/docker/.env @@ -6,19 +6,19 @@ MAF_TAG=0.0.7 ################################################## # Container version # ################################################## -MYSQL_SERVER_TAG=8.0.26 +MYSQL_SERVER_TAG=8.0.28 REDIS_TAG=6.2.5-alpine REDIS_CLUSTER_TAG=6.2.5 +MINIO_TAG=RELEASE.2022-04-01T03-41-39Z ATMOZ_SFTP_TAG=alpine -MINIO_TAG=RELEASE.2021-06-17T00-10-46Z -RABBITMQ_TAG=3.9.5-management-alpine +RABBITMQ_TAG=3.9.14-management-alpine ZIPKIN_MYSQL_TAG=2.22.2 -ZIPKIN_DEPENDENCIES_TAG=2.6.3 -ZIPKIN_TAG=2.23.4 -CONSUL_TAG=1.11.2 -ELASTICSEARCH_TAG=7.17.0 -LOGSTASH_TAG=7.17.0 -KIBANA_TAG=7.17.0 +ZIPKIN_DEPENDENCIES_TAG=2.6.4 +ZIPKIN_TAG=2.23.16 +CONSUL_TAG=1.11.4 +ELASTICSEARCH_TAG=7.17.2 +LOGSTASH_TAG=7.17.2 +KIBANA_TAG=7.17.2 ################################################## # SPRING_ENVIRONMENT available values: # diff --git a/docker/configuration/micro-service-config-on-consul/api-gateway/application-development-docker.yml b/docker/configuration/consul-yaml-configuration/config/api-gateway@development-docker/data.yml similarity index 100% rename from docker/configuration/micro-service-config-on-consul/api-gateway/application-development-docker.yml rename to docker/configuration/consul-yaml-configuration/config/api-gateway@development-docker/data.yml diff --git a/docker/configuration/micro-service-config-on-consul/api-gateway/application-development-local.yml b/docker/configuration/consul-yaml-configuration/config/api-gateway@development-local/data.yml similarity index 100% rename from docker/configuration/micro-service-config-on-consul/api-gateway/application-development-local.yml rename to docker/configuration/consul-yaml-configuration/config/api-gateway@development-local/data.yml diff --git a/docker/configuration/micro-service-config-on-consul/api-gateway/application-production.yml b/docker/configuration/consul-yaml-configuration/config/api-gateway@production/data.yml similarity index 100% rename from docker/configuration/micro-service-config-on-consul/api-gateway/application-production.yml rename to docker/configuration/consul-yaml-configuration/config/api-gateway@production/data.yml diff --git a/docker/configuration/micro-service-config-on-consul/api-gateway/application-stage.yml b/docker/configuration/consul-yaml-configuration/config/api-gateway@stage/data.yml similarity index 100% rename from docker/configuration/micro-service-config-on-consul/api-gateway/application-stage.yml rename to docker/configuration/consul-yaml-configuration/config/api-gateway@stage/data.yml diff --git a/docker/configuration/micro-service-config-on-consul/api-gateway/application-test.yml b/docker/configuration/consul-yaml-configuration/config/api-gateway@test/data.yml similarity index 100% rename from docker/configuration/micro-service-config-on-consul/api-gateway/application-test.yml rename to docker/configuration/consul-yaml-configuration/config/api-gateway@test/data.yml diff --git a/docker/configuration/consul-yaml-configuration/config/application@development-docker/data.yml b/docker/configuration/consul-yaml-configuration/config/application@development-docker/data.yml new file mode 100644 index 00000000..842d3f8c --- /dev/null +++ b/docker/configuration/consul-yaml-configuration/config/application@development-docker/data.yml @@ -0,0 +1,103 @@ +# https://docs.spring.io/spring-cloud-consul/docs/current/reference/html/index.html#spring-cloud-consul-config +# 1. Multiple PropertySource instances are created based on the application’s name and the active profiles +# that mimics the Spring Cloud Config order of resolving properties. +# 2. Properties in the config/application folder are applicable to all applications using consul for configuration. + +spring: + 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 + devtools: + add-properties: true + zipkin: + base-url: http://maf-zipkin:9411 + rabbitmq: + host: maf-rabbitmq + port: 5672 + username: maf_rabbitmq_su + password: maf@rabbitmq + redis: + host: maf-redis-master + port: 6379 + password: maf@redis + database: 0 + timeout: 10000ms + client-type: LETTUCE + lettuce: + pool: + max-active: 20 + max-idle: 10 + max-wait: -1ms + min-idle: 0 + elasticsearch: + uris: + - http://maf-elasticsearch:9200 + username: elastic + password: maf@elasticsearch + quartz: + job-store-type: JDBC + jdbc: + initialize-schema: NEVER + properties: + org: + quartz: + scheduler: + instanceId: AUTO + jobStore: + tablePrefix: QRTZ_ + isClustered: true + clusterCheckinInterval: 3000 + useProperties: false + +minio: + endpoint: http://maf-minio + port: 9000 + access-key: maf_minio_root_user + secret-key: jm@minio + bucket-name: maf + +feign: + circuitbreaker: + enabled: true + httpclient: + enabled: false + okhttp: + enabled: true + client: + config: + default: + connectTimeout: 5000 + readTimeout: 10000 + loggerLevel: full + compression: + request: + enabled: true + response: + enabled: true + +management: + endpoints: + web: + exposure: + include: "*" + endpoint: + health: + show-details: ALWAYS + +mybatis-plus: + global-config: + db-config: + logic-delete-field: deleted + logic-delete-value: "Y" + logic-not-delete-value: "N" + 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 diff --git a/docker/configuration/micro-service-config-on-consul/application/application-development-local.yml b/docker/configuration/consul-yaml-configuration/config/application@development-local/data.yml similarity index 50% rename from docker/configuration/micro-service-config-on-consul/application/application-development-local.yml rename to docker/configuration/consul-yaml-configuration/config/application@development-local/data.yml index 8d898649..d11dbb04 100644 --- a/docker/configuration/micro-service-config-on-consul/application/application-development-local.yml +++ b/docker/configuration/consul-yaml-configuration/config/application@development-local/data.yml @@ -16,73 +16,15 @@ spring: add-properties: true zipkin: base-url: http://localhost:9411 - datasource: - type: com.alibaba.druid.pool.DruidDataSource - druid: - driver-class-name: com.mysql.cj.jdbc.Driver - 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: - dynamic: - primary: master_1 - druid: - # connection pool size will be determined by DruidDataSourceCreatorPostProcessor.java - 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-pool-prepared-statement-per-connection-size: 20 - keep-alive: true - datasource: - master_1: - 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 - slave_1: - 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 rabbitmq: host: localhost port: 5672 username: maf_rabbitmq_su password: maf@rabbitmq redis: + host: localhost + port: 6379 + password: maf@redis database: 0 timeout: 10000ms client-type: LETTUCE @@ -92,6 +34,11 @@ spring: max-idle: 10 max-wait: -1ms min-idle: 0 + elasticsearch: + uris: + - http://localhost:9200 + username: elastic + password: maf@elasticsearch quartz: job-store-type: JDBC jdbc: @@ -107,19 +54,9 @@ spring: clusterCheckinInterval: 3000 useProperties: false -redis: - master: - host: localhost - port: 6379 - password: maf@redis - slaves: - - host: localhost - port: 6380 - password: maf@redis - minio: endpoint: http://localhost - port: 9000 + port: 9900 access-key: maf_minio_root_user secret-key: jm@minio bucket-name: maf @@ -156,6 +93,8 @@ mybatis-plus: global-config: db-config: logic-delete-field: deleted + logic-delete-value: "Y" + logic-not-delete-value: "N" configuration: map-underscore-to-camel-case: true log-impl: org.apache.ibatis.logging.stdout.StdOutImpl diff --git a/docker/configuration/micro-service-config-on-consul/application/application-stage.yml b/docker/configuration/consul-yaml-configuration/config/application@production/data.yml similarity index 50% rename from docker/configuration/micro-service-config-on-consul/application/application-stage.yml rename to docker/configuration/consul-yaml-configuration/config/application@production/data.yml index eaced713..63c3d611 100644 --- a/docker/configuration/micro-service-config-on-consul/application/application-stage.yml +++ b/docker/configuration/consul-yaml-configuration/config/application@production/data.yml @@ -16,73 +16,15 @@ spring: add-properties: true zipkin: base-url: http://maf-zipkin:9411 - datasource: - type: com.alibaba.druid.pool.DruidDataSource - druid: - driver-class-name: com.mysql.cj.jdbc.Driver - 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: - dynamic: - primary: master_1 - druid: - # connection pool size will be determined by DruidDataSourceCreatorPostProcessor.java - 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-pool-prepared-statement-per-connection-size: 20 - keep-alive: true - datasource: - master_1: - url: jdbc:mysql://maf-mysql-server-source:3306/muscle_and_fitness?useSSL=true&useUnicode=true - username: maf_mysql_rw - password: maf@mysql - driver-class-name: com.mysql.cj.jdbc.Driver - slave_1: - url: jdbc:mysql://maf-mysql-server-replica-1: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-source:3306/QUARTZ_DB?useSSL=true&useUnicode=true - username: maf_mysql_rw - password: maf@mysql - driver-class-name: com.mysql.cj.jdbc.Driver rabbitmq: host: maf-rabbitmq port: 5672 username: maf_rabbitmq_su password: maf@rabbitmq redis: + host: maf-redis-master + port: 6379 + password: maf@redis database: 0 timeout: 10000ms client-type: LETTUCE @@ -92,6 +34,11 @@ spring: max-idle: 10 max-wait: -1ms min-idle: 0 + elasticsearch: + uris: + - http://maf-elasticsearch:9200 + username: elastic + password: maf@elasticsearch quartz: job-store-type: JDBC jdbc: @@ -107,16 +54,6 @@ spring: clusterCheckinInterval: 3000 useProperties: false -redis: - master: - host: maf-redis-master - port: 6379 - password: maf@redis - slaves: - - host: maf-redis-slave-1 - port: 6379 - password: maf@redis - minio: endpoint: http://maf-minio port: 9000 @@ -160,6 +97,8 @@ mybatis-plus: global-config: db-config: logic-delete-field: deleted + logic-delete-value: "Y" + logic-not-delete-value: "N" configuration: map-underscore-to-camel-case: true log-impl: org.apache.ibatis.logging.stdout.StdOutImpl diff --git a/docker/configuration/micro-service-config-on-consul/application/application-production.yml b/docker/configuration/consul-yaml-configuration/config/application@stage/data.yml similarity index 50% rename from docker/configuration/micro-service-config-on-consul/application/application-production.yml rename to docker/configuration/consul-yaml-configuration/config/application@stage/data.yml index eaced713..63c3d611 100644 --- a/docker/configuration/micro-service-config-on-consul/application/application-production.yml +++ b/docker/configuration/consul-yaml-configuration/config/application@stage/data.yml @@ -16,73 +16,15 @@ spring: add-properties: true zipkin: base-url: http://maf-zipkin:9411 - datasource: - type: com.alibaba.druid.pool.DruidDataSource - druid: - driver-class-name: com.mysql.cj.jdbc.Driver - 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: - dynamic: - primary: master_1 - druid: - # connection pool size will be determined by DruidDataSourceCreatorPostProcessor.java - 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-pool-prepared-statement-per-connection-size: 20 - keep-alive: true - datasource: - master_1: - url: jdbc:mysql://maf-mysql-server-source:3306/muscle_and_fitness?useSSL=true&useUnicode=true - username: maf_mysql_rw - password: maf@mysql - driver-class-name: com.mysql.cj.jdbc.Driver - slave_1: - url: jdbc:mysql://maf-mysql-server-replica-1: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-source:3306/QUARTZ_DB?useSSL=true&useUnicode=true - username: maf_mysql_rw - password: maf@mysql - driver-class-name: com.mysql.cj.jdbc.Driver rabbitmq: host: maf-rabbitmq port: 5672 username: maf_rabbitmq_su password: maf@rabbitmq redis: + host: maf-redis-master + port: 6379 + password: maf@redis database: 0 timeout: 10000ms client-type: LETTUCE @@ -92,6 +34,11 @@ spring: max-idle: 10 max-wait: -1ms min-idle: 0 + elasticsearch: + uris: + - http://maf-elasticsearch:9200 + username: elastic + password: maf@elasticsearch quartz: job-store-type: JDBC jdbc: @@ -107,16 +54,6 @@ spring: clusterCheckinInterval: 3000 useProperties: false -redis: - master: - host: maf-redis-master - port: 6379 - password: maf@redis - slaves: - - host: maf-redis-slave-1 - port: 6379 - password: maf@redis - minio: endpoint: http://maf-minio port: 9000 @@ -160,6 +97,8 @@ mybatis-plus: global-config: db-config: logic-delete-field: deleted + logic-delete-value: "Y" + logic-not-delete-value: "N" configuration: map-underscore-to-camel-case: true log-impl: org.apache.ibatis.logging.stdout.StdOutImpl diff --git a/docker/configuration/consul-yaml-configuration/config/application@test/data.yml b/docker/configuration/consul-yaml-configuration/config/application@test/data.yml new file mode 100644 index 00000000..842d3f8c --- /dev/null +++ b/docker/configuration/consul-yaml-configuration/config/application@test/data.yml @@ -0,0 +1,103 @@ +# https://docs.spring.io/spring-cloud-consul/docs/current/reference/html/index.html#spring-cloud-consul-config +# 1. Multiple PropertySource instances are created based on the application’s name and the active profiles +# that mimics the Spring Cloud Config order of resolving properties. +# 2. Properties in the config/application folder are applicable to all applications using consul for configuration. + +spring: + 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 + devtools: + add-properties: true + zipkin: + base-url: http://maf-zipkin:9411 + rabbitmq: + host: maf-rabbitmq + port: 5672 + username: maf_rabbitmq_su + password: maf@rabbitmq + redis: + host: maf-redis-master + port: 6379 + password: maf@redis + database: 0 + timeout: 10000ms + client-type: LETTUCE + lettuce: + pool: + max-active: 20 + max-idle: 10 + max-wait: -1ms + min-idle: 0 + elasticsearch: + uris: + - http://maf-elasticsearch:9200 + username: elastic + password: maf@elasticsearch + quartz: + job-store-type: JDBC + jdbc: + initialize-schema: NEVER + properties: + org: + quartz: + scheduler: + instanceId: AUTO + jobStore: + tablePrefix: QRTZ_ + isClustered: true + clusterCheckinInterval: 3000 + useProperties: false + +minio: + endpoint: http://maf-minio + port: 9000 + access-key: maf_minio_root_user + secret-key: jm@minio + bucket-name: maf + +feign: + circuitbreaker: + enabled: true + httpclient: + enabled: false + okhttp: + enabled: true + client: + config: + default: + connectTimeout: 5000 + readTimeout: 10000 + loggerLevel: full + compression: + request: + enabled: true + response: + enabled: true + +management: + endpoints: + web: + exposure: + include: "*" + endpoint: + health: + show-details: ALWAYS + +mybatis-plus: + global-config: + db-config: + logic-delete-field: deleted + logic-delete-value: "Y" + logic-not-delete-value: "N" + 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 diff --git a/docker/configuration/micro-service-config-on-consul/auth-center/application.yml b/docker/configuration/consul-yaml-configuration/config/auth-center@development-docker/data.yml similarity index 100% rename from docker/configuration/micro-service-config-on-consul/auth-center/application.yml rename to docker/configuration/consul-yaml-configuration/config/auth-center@development-docker/data.yml diff --git a/docker/configuration/consul-yaml-configuration/config/auth-center@development-local/data.yml b/docker/configuration/consul-yaml-configuration/config/auth-center@development-local/data.yml new file mode 100644 index 00000000..27e5fcf6 --- /dev/null +++ b/docker/configuration/consul-yaml-configuration/config/auth-center@development-local/data.yml @@ -0,0 +1,16 @@ +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 + +logging: + level: + org.springframework.boot.context.config: TRACE diff --git a/docker/configuration/consul-yaml-configuration/config/auth-center@production/data.yml b/docker/configuration/consul-yaml-configuration/config/auth-center@production/data.yml new file mode 100644 index 00000000..27e5fcf6 --- /dev/null +++ b/docker/configuration/consul-yaml-configuration/config/auth-center@production/data.yml @@ -0,0 +1,16 @@ +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 + +logging: + level: + org.springframework.boot.context.config: TRACE diff --git a/docker/configuration/consul-yaml-configuration/config/auth-center@stage/data.yml b/docker/configuration/consul-yaml-configuration/config/auth-center@stage/data.yml new file mode 100644 index 00000000..27e5fcf6 --- /dev/null +++ b/docker/configuration/consul-yaml-configuration/config/auth-center@stage/data.yml @@ -0,0 +1,16 @@ +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 + +logging: + level: + org.springframework.boot.context.config: TRACE diff --git a/docker/configuration/consul-yaml-configuration/config/auth-center@test/data.yml b/docker/configuration/consul-yaml-configuration/config/auth-center@test/data.yml new file mode 100644 index 00000000..27e5fcf6 --- /dev/null +++ b/docker/configuration/consul-yaml-configuration/config/auth-center@test/data.yml @@ -0,0 +1,16 @@ +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 + +logging: + level: + org.springframework.boot.context.config: TRACE diff --git a/docker/configuration/micro-service-config-on-consul/maf-mis/application.yml b/docker/configuration/consul-yaml-configuration/config/maf-mis@development-docker/data.yml similarity index 100% rename from docker/configuration/micro-service-config-on-consul/maf-mis/application.yml rename to docker/configuration/consul-yaml-configuration/config/maf-mis@development-docker/data.yml diff --git a/docker/configuration/micro-service-config-on-consul/oss-center/application.yml b/docker/configuration/consul-yaml-configuration/config/maf-mis@development-local/data.yml similarity index 100% rename from docker/configuration/micro-service-config-on-consul/oss-center/application.yml rename to docker/configuration/consul-yaml-configuration/config/maf-mis@development-local/data.yml diff --git a/docker/configuration/consul-yaml-configuration/config/maf-mis@production/data.yml b/docker/configuration/consul-yaml-configuration/config/maf-mis@production/data.yml new file mode 100644 index 00000000..d7f8feeb --- /dev/null +++ b/docker/configuration/consul-yaml-configuration/config/maf-mis@production/data.yml @@ -0,0 +1,4 @@ +maf: + configuration: + excel: + maximum-row-count: 3000 diff --git a/docker/configuration/consul-yaml-configuration/config/maf-mis@stage/data.yml b/docker/configuration/consul-yaml-configuration/config/maf-mis@stage/data.yml new file mode 100644 index 00000000..d7f8feeb --- /dev/null +++ b/docker/configuration/consul-yaml-configuration/config/maf-mis@stage/data.yml @@ -0,0 +1,4 @@ +maf: + configuration: + excel: + maximum-row-count: 3000 diff --git a/docker/configuration/consul-yaml-configuration/config/maf-mis@test/data.yml b/docker/configuration/consul-yaml-configuration/config/maf-mis@test/data.yml new file mode 100644 index 00000000..d7f8feeb --- /dev/null +++ b/docker/configuration/consul-yaml-configuration/config/maf-mis@test/data.yml @@ -0,0 +1,4 @@ +maf: + configuration: + excel: + maximum-row-count: 3000 diff --git a/docker/configuration/consul-yaml-configuration/config/oss-center@development-docker/data.yml b/docker/configuration/consul-yaml-configuration/config/oss-center@development-docker/data.yml new file mode 100644 index 00000000..d7f8feeb --- /dev/null +++ b/docker/configuration/consul-yaml-configuration/config/oss-center@development-docker/data.yml @@ -0,0 +1,4 @@ +maf: + configuration: + excel: + maximum-row-count: 3000 diff --git a/docker/configuration/consul-yaml-configuration/config/oss-center@development-local/data.yml b/docker/configuration/consul-yaml-configuration/config/oss-center@development-local/data.yml new file mode 100644 index 00000000..d7f8feeb --- /dev/null +++ b/docker/configuration/consul-yaml-configuration/config/oss-center@development-local/data.yml @@ -0,0 +1,4 @@ +maf: + configuration: + excel: + maximum-row-count: 3000 diff --git a/docker/configuration/consul-yaml-configuration/config/oss-center@production/data.yml b/docker/configuration/consul-yaml-configuration/config/oss-center@production/data.yml new file mode 100644 index 00000000..d7f8feeb --- /dev/null +++ b/docker/configuration/consul-yaml-configuration/config/oss-center@production/data.yml @@ -0,0 +1,4 @@ +maf: + configuration: + excel: + maximum-row-count: 3000 diff --git a/docker/configuration/consul-yaml-configuration/config/oss-center@stage/data.yml b/docker/configuration/consul-yaml-configuration/config/oss-center@stage/data.yml new file mode 100644 index 00000000..d7f8feeb --- /dev/null +++ b/docker/configuration/consul-yaml-configuration/config/oss-center@stage/data.yml @@ -0,0 +1,4 @@ +maf: + configuration: + excel: + maximum-row-count: 3000 diff --git a/docker/configuration/consul-yaml-configuration/config/oss-center@test/data.yml b/docker/configuration/consul-yaml-configuration/config/oss-center@test/data.yml new file mode 100644 index 00000000..d7f8feeb --- /dev/null +++ b/docker/configuration/consul-yaml-configuration/config/oss-center@test/data.yml @@ -0,0 +1,4 @@ +maf: + configuration: + excel: + maximum-row-count: 3000 diff --git a/docker/configuration/micro-service-config-on-consul/spring-boot-admin/application.yml b/docker/configuration/consul-yaml-configuration/config/spring-boot-admin@development-docker/data.yml similarity index 100% rename from docker/configuration/micro-service-config-on-consul/spring-boot-admin/application.yml rename to docker/configuration/consul-yaml-configuration/config/spring-boot-admin@development-docker/data.yml diff --git a/docker/configuration/consul-yaml-configuration/config/spring-boot-admin@development-local/data.yml b/docker/configuration/consul-yaml-configuration/config/spring-boot-admin@development-local/data.yml new file mode 100644 index 00000000..c16a9d4c --- /dev/null +++ b/docker/configuration/consul-yaml-configuration/config/spring-boot-admin@development-local/data.yml @@ -0,0 +1,6 @@ +greeting: "Hello, World! From Consul config center!" + +maf: + configuration: + excel: + maximum-row-count: 3000 diff --git a/docker/configuration/consul-yaml-configuration/config/spring-boot-admin@production/data.yml b/docker/configuration/consul-yaml-configuration/config/spring-boot-admin@production/data.yml new file mode 100644 index 00000000..c16a9d4c --- /dev/null +++ b/docker/configuration/consul-yaml-configuration/config/spring-boot-admin@production/data.yml @@ -0,0 +1,6 @@ +greeting: "Hello, World! From Consul config center!" + +maf: + configuration: + excel: + maximum-row-count: 3000 diff --git a/docker/configuration/consul-yaml-configuration/config/spring-boot-admin@stage/data.yml b/docker/configuration/consul-yaml-configuration/config/spring-boot-admin@stage/data.yml new file mode 100644 index 00000000..c16a9d4c --- /dev/null +++ b/docker/configuration/consul-yaml-configuration/config/spring-boot-admin@stage/data.yml @@ -0,0 +1,6 @@ +greeting: "Hello, World! From Consul config center!" + +maf: + configuration: + excel: + maximum-row-count: 3000 diff --git a/docker/configuration/consul-yaml-configuration/config/spring-boot-admin@test/data.yml b/docker/configuration/consul-yaml-configuration/config/spring-boot-admin@test/data.yml new file mode 100644 index 00000000..c16a9d4c --- /dev/null +++ b/docker/configuration/consul-yaml-configuration/config/spring-boot-admin@test/data.yml @@ -0,0 +1,6 @@ +greeting: "Hello, World! From Consul config center!" + +maf: + configuration: + excel: + maximum-row-count: 3000 diff --git a/docker/configuration/consul-yaml-configuration/shardingsphere/application@development-docker/data.yml b/docker/configuration/consul-yaml-configuration/shardingsphere/application@development-docker/data.yml new file mode 100644 index 00000000..61b80dc8 --- /dev/null +++ b/docker/configuration/consul-yaml-configuration/shardingsphere/application@development-docker/data.yml @@ -0,0 +1,263 @@ +spring: + shardingsphere: + props: + sql-show: false + datasource: + source: + type: com.zaxxer.hikari.HikariDataSource + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://maf-mysql-server-source:3306/muscle_and_fitness_0?useSSL=true&useUnicode=true + username: maf_mysql_rw + password: maf@mysql + replica-1: + type: com.zaxxer.hikari.HikariDataSource + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://maf-mysql-server-replica-1:3306/muscle_and_fitness_0?useSSL=true&useUnicode=true + username: maf_mysql_r + password: maf@mysql + quartz: + type: com.zaxxer.hikari.HikariDataSource + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://maf-mysql-server-source:3306/QUARTZ_DB?useSSL=true&useUnicode=true + username: maf_mysql_rw + password: maf@mysql + names: source,replica-1,quartz + rules: + readwrite-splitting: + data-sources: + readwrite-data-sources: + type: Static + props: + write-data-source-name: source + read-data-source-names: replica-1 + load-balancer-name: readwrite-load-balancer + load-balancers: + readwrite-load-balancer: + type: ROUND_ROBIN + sharding: + key-generators: + snowflake: + type: SNOWFLAKE + sharding-algorithms: + body-part-sharding-algorithm: + type: INLINE + props: + algorithm-expression: body_part_$->{id % 2} + equipment-sharding-algorithm: + type: INLINE + props: + algorithm-expression: equipment_$->{id % 2} + exercise-sharding-algorithm: + type: INLINE + props: + algorithm-expression: exercise_$->{id % 2} + exercise-classification-sharding-algorithm: + type: INLINE + props: + algorithm-expression: exercise_classification_$->{id % 2} + exercise-comment-sharding-algorithm: + type: INLINE + props: + algorithm-expression: exercise_comment_$->{id % 2} + exercise-related-classification-sharding-algorithm: + type: INLINE + props: + algorithm-expression: exercise_related_classification_$->{id % 2} + exercise-related-muscle-sharding-algorithm: + type: INLINE + props: + algorithm-expression: exercise_related_muscle_$->{id % 2} + kinesiology-glossary-sharding-algorithm: + type: INLINE + props: + algorithm-expression: kinesiology_glossary_$->{id % 2} + muscle-sharding-algorithm: + type: INLINE + props: + algorithm-expression: muscle_$->{id % 2} + muscle-image-sharding-algorithm: + type: INLINE + props: + algorithm-expression: muscle_image_$->{id % 2} + permission-sharding-algorithm: + type: INLINE + props: + algorithm-expression: permission_$->{id % 2} + quartz-job-configuration-sharding-algorithm: + type: INLINE + props: + algorithm-expression: quartz_job_configuration_$->{id % 2} + related-muscle-sharding-algorithm: + type: INLINE + props: + algorithm-expression: related_muscle_$->{id % 2} + role-sharding-algorithm: + type: INLINE + props: + algorithm-expression: role_$->{id % 2} + role-permission-sharding-algorithm: + type: INLINE + props: + algorithm-expression: role_permission_$->{id % 2} + user-sharding-algorithm: + type: INLINE + props: + algorithm-expression: user_$->{id % 2} + user-role-sharding-algorithm: + type: INLINE + props: + algorithm-expression: user_role_$->{id % 2} + tables: + body_part: + actual-data-nodes: readwrite-data-sources.body_part_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: body-part-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake + equipment: + actual-data-nodes: readwrite-data-sources.equipment_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: equipment-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake + exercise: + actual-data-nodes: readwrite-data-sources.exercise_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: exercise-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake + exercise_classification: + actual-data-nodes: readwrite-data-sources.exercise_classification_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: exercise-classification-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake + exercise_comment: + actual-data-nodes: readwrite-data-sources.exercise_comment_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: exercise-comment-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake + exercise_related_classification: + actual-data-nodes: readwrite-data-sources.exercise_related_classification_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: exercise-related-classification-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake + exercise_related_muscle: + actual-data-nodes: readwrite-data-sources.exercise_related_muscle_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: exercise-related-muscle-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake + kinesiology_glossary: + actual-data-nodes: readwrite-data-sources.kinesiology_glossary_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: kinesiology-glossary-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake + muscle: + actual-data-nodes: readwrite-data-sources.muscle_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: muscle-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake + muscle_image: + actual-data-nodes: readwrite-data-sources.muscle_image_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: muscle-image-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake + permission: + actual-data-nodes: readwrite-data-sources.permission_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: permission-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake + quartz_job_configuration: + actual-data-nodes: readwrite-data-sources.quartz_job_configuration_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: quartz-job-configuration-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake + related_muscle: + actual-data-nodes: readwrite-data-sources.related_muscle_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: related-muscle-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake + role: + actual-data-nodes: readwrite-data-sources.role_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: role-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake + role_permission: + actual-data-nodes: readwrite-data-sources.role_permission_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: role-permission-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake + user: + actual-data-nodes: readwrite-data-sources.user_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: user-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake + user_role: + actual-data-nodes: readwrite-data-sources.user_role_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: user-role-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake diff --git a/docker/configuration/consul-yaml-configuration/shardingsphere/application@development-local/data.yml b/docker/configuration/consul-yaml-configuration/shardingsphere/application@development-local/data.yml new file mode 100644 index 00000000..01b050f6 --- /dev/null +++ b/docker/configuration/consul-yaml-configuration/shardingsphere/application@development-local/data.yml @@ -0,0 +1,263 @@ +spring: + shardingsphere: + props: + sql-show: true + datasource: + source: + type: com.zaxxer.hikari.HikariDataSource + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://localhost:3306/muscle_and_fitness_0?useSSL=true&useUnicode=true + username: maf_mysql_rw + password: maf@mysql + replica-1: + type: com.zaxxer.hikari.HikariDataSource + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://localhost:3307/muscle_and_fitness_0?useSSL=true&useUnicode=true + username: maf_mysql_r + password: maf@mysql + quartz: + type: com.zaxxer.hikari.HikariDataSource + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://localhost:3306/QUARTZ_DB?useSSL=true&useUnicode=true + username: maf_mysql_rw + password: maf@mysql + names: source,replica-1,quartz + rules: + readwrite-splitting: + data-sources: + readwrite-data-sources: + type: Static + props: + write-data-source-name: source + read-data-source-names: replica-1 + load-balancer-name: readwrite-load-balancer + load-balancers: + readwrite-load-balancer: + type: ROUND_ROBIN + sharding: + key-generators: + snowflake: + type: SNOWFLAKE + sharding-algorithms: + body-part-sharding-algorithm: + type: INLINE + props: + algorithm-expression: body_part_$->{id % 2} + equipment-sharding-algorithm: + type: INLINE + props: + algorithm-expression: equipment_$->{id % 2} + exercise-sharding-algorithm: + type: INLINE + props: + algorithm-expression: exercise_$->{id % 2} + exercise-classification-sharding-algorithm: + type: INLINE + props: + algorithm-expression: exercise_classification_$->{id % 2} + exercise-comment-sharding-algorithm: + type: INLINE + props: + algorithm-expression: exercise_comment_$->{id % 2} + exercise-related-classification-sharding-algorithm: + type: INLINE + props: + algorithm-expression: exercise_related_classification_$->{id % 2} + exercise-related-muscle-sharding-algorithm: + type: INLINE + props: + algorithm-expression: exercise_related_muscle_$->{id % 2} + kinesiology-glossary-sharding-algorithm: + type: INLINE + props: + algorithm-expression: kinesiology_glossary_$->{id % 2} + muscle-sharding-algorithm: + type: INLINE + props: + algorithm-expression: muscle_$->{id % 2} + muscle-image-sharding-algorithm: + type: INLINE + props: + algorithm-expression: muscle_image_$->{id % 2} + permission-sharding-algorithm: + type: INLINE + props: + algorithm-expression: permission_$->{id % 2} + quartz-job-configuration-sharding-algorithm: + type: INLINE + props: + algorithm-expression: quartz_job_configuration_$->{id % 2} + related-muscle-sharding-algorithm: + type: INLINE + props: + algorithm-expression: related_muscle_$->{id % 2} + role-sharding-algorithm: + type: INLINE + props: + algorithm-expression: role_$->{id % 2} + role-permission-sharding-algorithm: + type: INLINE + props: + algorithm-expression: role_permission_$->{id % 2} + user-sharding-algorithm: + type: INLINE + props: + algorithm-expression: user_$->{id % 2} + user-role-sharding-algorithm: + type: INLINE + props: + algorithm-expression: user_role_$->{id % 2} + tables: + body_part: + actual-data-nodes: readwrite-data-sources.body_part_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: body-part-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake + equipment: + actual-data-nodes: readwrite-data-sources.equipment_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: equipment-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake + exercise: + actual-data-nodes: readwrite-data-sources.exercise_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: exercise-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake + exercise_classification: + actual-data-nodes: readwrite-data-sources.exercise_classification_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: exercise-classification-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake + exercise_comment: + actual-data-nodes: readwrite-data-sources.exercise_comment_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: exercise-comment-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake + exercise_related_classification: + actual-data-nodes: readwrite-data-sources.exercise_related_classification_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: exercise-related-classification-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake + exercise_related_muscle: + actual-data-nodes: readwrite-data-sources.exercise_related_muscle_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: exercise-related-muscle-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake + kinesiology_glossary: + actual-data-nodes: readwrite-data-sources.kinesiology_glossary_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: kinesiology-glossary-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake + muscle: + actual-data-nodes: readwrite-data-sources.muscle_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: muscle-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake + muscle_image: + actual-data-nodes: readwrite-data-sources.muscle_image_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: muscle-image-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake + permission: + actual-data-nodes: readwrite-data-sources.permission_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: permission-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake + quartz_job_configuration: + actual-data-nodes: readwrite-data-sources.quartz_job_configuration_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: quartz-job-configuration-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake + related_muscle: + actual-data-nodes: readwrite-data-sources.related_muscle_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: related-muscle-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake + role: + actual-data-nodes: readwrite-data-sources.role_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: role-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake + role_permission: + actual-data-nodes: readwrite-data-sources.role_permission_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: role-permission-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake + user: + actual-data-nodes: readwrite-data-sources.user_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: user-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake + user_role: + actual-data-nodes: readwrite-data-sources.user_role_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: user-role-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake diff --git a/docker/configuration/consul-yaml-configuration/shardingsphere/application@production/data.yml b/docker/configuration/consul-yaml-configuration/shardingsphere/application@production/data.yml new file mode 100644 index 00000000..61b80dc8 --- /dev/null +++ b/docker/configuration/consul-yaml-configuration/shardingsphere/application@production/data.yml @@ -0,0 +1,263 @@ +spring: + shardingsphere: + props: + sql-show: false + datasource: + source: + type: com.zaxxer.hikari.HikariDataSource + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://maf-mysql-server-source:3306/muscle_and_fitness_0?useSSL=true&useUnicode=true + username: maf_mysql_rw + password: maf@mysql + replica-1: + type: com.zaxxer.hikari.HikariDataSource + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://maf-mysql-server-replica-1:3306/muscle_and_fitness_0?useSSL=true&useUnicode=true + username: maf_mysql_r + password: maf@mysql + quartz: + type: com.zaxxer.hikari.HikariDataSource + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://maf-mysql-server-source:3306/QUARTZ_DB?useSSL=true&useUnicode=true + username: maf_mysql_rw + password: maf@mysql + names: source,replica-1,quartz + rules: + readwrite-splitting: + data-sources: + readwrite-data-sources: + type: Static + props: + write-data-source-name: source + read-data-source-names: replica-1 + load-balancer-name: readwrite-load-balancer + load-balancers: + readwrite-load-balancer: + type: ROUND_ROBIN + sharding: + key-generators: + snowflake: + type: SNOWFLAKE + sharding-algorithms: + body-part-sharding-algorithm: + type: INLINE + props: + algorithm-expression: body_part_$->{id % 2} + equipment-sharding-algorithm: + type: INLINE + props: + algorithm-expression: equipment_$->{id % 2} + exercise-sharding-algorithm: + type: INLINE + props: + algorithm-expression: exercise_$->{id % 2} + exercise-classification-sharding-algorithm: + type: INLINE + props: + algorithm-expression: exercise_classification_$->{id % 2} + exercise-comment-sharding-algorithm: + type: INLINE + props: + algorithm-expression: exercise_comment_$->{id % 2} + exercise-related-classification-sharding-algorithm: + type: INLINE + props: + algorithm-expression: exercise_related_classification_$->{id % 2} + exercise-related-muscle-sharding-algorithm: + type: INLINE + props: + algorithm-expression: exercise_related_muscle_$->{id % 2} + kinesiology-glossary-sharding-algorithm: + type: INLINE + props: + algorithm-expression: kinesiology_glossary_$->{id % 2} + muscle-sharding-algorithm: + type: INLINE + props: + algorithm-expression: muscle_$->{id % 2} + muscle-image-sharding-algorithm: + type: INLINE + props: + algorithm-expression: muscle_image_$->{id % 2} + permission-sharding-algorithm: + type: INLINE + props: + algorithm-expression: permission_$->{id % 2} + quartz-job-configuration-sharding-algorithm: + type: INLINE + props: + algorithm-expression: quartz_job_configuration_$->{id % 2} + related-muscle-sharding-algorithm: + type: INLINE + props: + algorithm-expression: related_muscle_$->{id % 2} + role-sharding-algorithm: + type: INLINE + props: + algorithm-expression: role_$->{id % 2} + role-permission-sharding-algorithm: + type: INLINE + props: + algorithm-expression: role_permission_$->{id % 2} + user-sharding-algorithm: + type: INLINE + props: + algorithm-expression: user_$->{id % 2} + user-role-sharding-algorithm: + type: INLINE + props: + algorithm-expression: user_role_$->{id % 2} + tables: + body_part: + actual-data-nodes: readwrite-data-sources.body_part_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: body-part-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake + equipment: + actual-data-nodes: readwrite-data-sources.equipment_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: equipment-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake + exercise: + actual-data-nodes: readwrite-data-sources.exercise_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: exercise-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake + exercise_classification: + actual-data-nodes: readwrite-data-sources.exercise_classification_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: exercise-classification-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake + exercise_comment: + actual-data-nodes: readwrite-data-sources.exercise_comment_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: exercise-comment-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake + exercise_related_classification: + actual-data-nodes: readwrite-data-sources.exercise_related_classification_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: exercise-related-classification-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake + exercise_related_muscle: + actual-data-nodes: readwrite-data-sources.exercise_related_muscle_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: exercise-related-muscle-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake + kinesiology_glossary: + actual-data-nodes: readwrite-data-sources.kinesiology_glossary_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: kinesiology-glossary-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake + muscle: + actual-data-nodes: readwrite-data-sources.muscle_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: muscle-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake + muscle_image: + actual-data-nodes: readwrite-data-sources.muscle_image_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: muscle-image-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake + permission: + actual-data-nodes: readwrite-data-sources.permission_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: permission-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake + quartz_job_configuration: + actual-data-nodes: readwrite-data-sources.quartz_job_configuration_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: quartz-job-configuration-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake + related_muscle: + actual-data-nodes: readwrite-data-sources.related_muscle_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: related-muscle-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake + role: + actual-data-nodes: readwrite-data-sources.role_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: role-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake + role_permission: + actual-data-nodes: readwrite-data-sources.role_permission_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: role-permission-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake + user: + actual-data-nodes: readwrite-data-sources.user_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: user-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake + user_role: + actual-data-nodes: readwrite-data-sources.user_role_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: user-role-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake diff --git a/docker/configuration/consul-yaml-configuration/shardingsphere/application@stage/data.yml b/docker/configuration/consul-yaml-configuration/shardingsphere/application@stage/data.yml new file mode 100644 index 00000000..61b80dc8 --- /dev/null +++ b/docker/configuration/consul-yaml-configuration/shardingsphere/application@stage/data.yml @@ -0,0 +1,263 @@ +spring: + shardingsphere: + props: + sql-show: false + datasource: + source: + type: com.zaxxer.hikari.HikariDataSource + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://maf-mysql-server-source:3306/muscle_and_fitness_0?useSSL=true&useUnicode=true + username: maf_mysql_rw + password: maf@mysql + replica-1: + type: com.zaxxer.hikari.HikariDataSource + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://maf-mysql-server-replica-1:3306/muscle_and_fitness_0?useSSL=true&useUnicode=true + username: maf_mysql_r + password: maf@mysql + quartz: + type: com.zaxxer.hikari.HikariDataSource + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://maf-mysql-server-source:3306/QUARTZ_DB?useSSL=true&useUnicode=true + username: maf_mysql_rw + password: maf@mysql + names: source,replica-1,quartz + rules: + readwrite-splitting: + data-sources: + readwrite-data-sources: + type: Static + props: + write-data-source-name: source + read-data-source-names: replica-1 + load-balancer-name: readwrite-load-balancer + load-balancers: + readwrite-load-balancer: + type: ROUND_ROBIN + sharding: + key-generators: + snowflake: + type: SNOWFLAKE + sharding-algorithms: + body-part-sharding-algorithm: + type: INLINE + props: + algorithm-expression: body_part_$->{id % 2} + equipment-sharding-algorithm: + type: INLINE + props: + algorithm-expression: equipment_$->{id % 2} + exercise-sharding-algorithm: + type: INLINE + props: + algorithm-expression: exercise_$->{id % 2} + exercise-classification-sharding-algorithm: + type: INLINE + props: + algorithm-expression: exercise_classification_$->{id % 2} + exercise-comment-sharding-algorithm: + type: INLINE + props: + algorithm-expression: exercise_comment_$->{id % 2} + exercise-related-classification-sharding-algorithm: + type: INLINE + props: + algorithm-expression: exercise_related_classification_$->{id % 2} + exercise-related-muscle-sharding-algorithm: + type: INLINE + props: + algorithm-expression: exercise_related_muscle_$->{id % 2} + kinesiology-glossary-sharding-algorithm: + type: INLINE + props: + algorithm-expression: kinesiology_glossary_$->{id % 2} + muscle-sharding-algorithm: + type: INLINE + props: + algorithm-expression: muscle_$->{id % 2} + muscle-image-sharding-algorithm: + type: INLINE + props: + algorithm-expression: muscle_image_$->{id % 2} + permission-sharding-algorithm: + type: INLINE + props: + algorithm-expression: permission_$->{id % 2} + quartz-job-configuration-sharding-algorithm: + type: INLINE + props: + algorithm-expression: quartz_job_configuration_$->{id % 2} + related-muscle-sharding-algorithm: + type: INLINE + props: + algorithm-expression: related_muscle_$->{id % 2} + role-sharding-algorithm: + type: INLINE + props: + algorithm-expression: role_$->{id % 2} + role-permission-sharding-algorithm: + type: INLINE + props: + algorithm-expression: role_permission_$->{id % 2} + user-sharding-algorithm: + type: INLINE + props: + algorithm-expression: user_$->{id % 2} + user-role-sharding-algorithm: + type: INLINE + props: + algorithm-expression: user_role_$->{id % 2} + tables: + body_part: + actual-data-nodes: readwrite-data-sources.body_part_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: body-part-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake + equipment: + actual-data-nodes: readwrite-data-sources.equipment_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: equipment-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake + exercise: + actual-data-nodes: readwrite-data-sources.exercise_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: exercise-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake + exercise_classification: + actual-data-nodes: readwrite-data-sources.exercise_classification_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: exercise-classification-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake + exercise_comment: + actual-data-nodes: readwrite-data-sources.exercise_comment_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: exercise-comment-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake + exercise_related_classification: + actual-data-nodes: readwrite-data-sources.exercise_related_classification_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: exercise-related-classification-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake + exercise_related_muscle: + actual-data-nodes: readwrite-data-sources.exercise_related_muscle_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: exercise-related-muscle-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake + kinesiology_glossary: + actual-data-nodes: readwrite-data-sources.kinesiology_glossary_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: kinesiology-glossary-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake + muscle: + actual-data-nodes: readwrite-data-sources.muscle_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: muscle-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake + muscle_image: + actual-data-nodes: readwrite-data-sources.muscle_image_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: muscle-image-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake + permission: + actual-data-nodes: readwrite-data-sources.permission_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: permission-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake + quartz_job_configuration: + actual-data-nodes: readwrite-data-sources.quartz_job_configuration_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: quartz-job-configuration-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake + related_muscle: + actual-data-nodes: readwrite-data-sources.related_muscle_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: related-muscle-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake + role: + actual-data-nodes: readwrite-data-sources.role_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: role-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake + role_permission: + actual-data-nodes: readwrite-data-sources.role_permission_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: role-permission-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake + user: + actual-data-nodes: readwrite-data-sources.user_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: user-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake + user_role: + actual-data-nodes: readwrite-data-sources.user_role_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: user-role-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake diff --git a/docker/configuration/consul-yaml-configuration/shardingsphere/application@test/data.yml b/docker/configuration/consul-yaml-configuration/shardingsphere/application@test/data.yml new file mode 100644 index 00000000..61b80dc8 --- /dev/null +++ b/docker/configuration/consul-yaml-configuration/shardingsphere/application@test/data.yml @@ -0,0 +1,263 @@ +spring: + shardingsphere: + props: + sql-show: false + datasource: + source: + type: com.zaxxer.hikari.HikariDataSource + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://maf-mysql-server-source:3306/muscle_and_fitness_0?useSSL=true&useUnicode=true + username: maf_mysql_rw + password: maf@mysql + replica-1: + type: com.zaxxer.hikari.HikariDataSource + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://maf-mysql-server-replica-1:3306/muscle_and_fitness_0?useSSL=true&useUnicode=true + username: maf_mysql_r + password: maf@mysql + quartz: + type: com.zaxxer.hikari.HikariDataSource + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://maf-mysql-server-source:3306/QUARTZ_DB?useSSL=true&useUnicode=true + username: maf_mysql_rw + password: maf@mysql + names: source,replica-1,quartz + rules: + readwrite-splitting: + data-sources: + readwrite-data-sources: + type: Static + props: + write-data-source-name: source + read-data-source-names: replica-1 + load-balancer-name: readwrite-load-balancer + load-balancers: + readwrite-load-balancer: + type: ROUND_ROBIN + sharding: + key-generators: + snowflake: + type: SNOWFLAKE + sharding-algorithms: + body-part-sharding-algorithm: + type: INLINE + props: + algorithm-expression: body_part_$->{id % 2} + equipment-sharding-algorithm: + type: INLINE + props: + algorithm-expression: equipment_$->{id % 2} + exercise-sharding-algorithm: + type: INLINE + props: + algorithm-expression: exercise_$->{id % 2} + exercise-classification-sharding-algorithm: + type: INLINE + props: + algorithm-expression: exercise_classification_$->{id % 2} + exercise-comment-sharding-algorithm: + type: INLINE + props: + algorithm-expression: exercise_comment_$->{id % 2} + exercise-related-classification-sharding-algorithm: + type: INLINE + props: + algorithm-expression: exercise_related_classification_$->{id % 2} + exercise-related-muscle-sharding-algorithm: + type: INLINE + props: + algorithm-expression: exercise_related_muscle_$->{id % 2} + kinesiology-glossary-sharding-algorithm: + type: INLINE + props: + algorithm-expression: kinesiology_glossary_$->{id % 2} + muscle-sharding-algorithm: + type: INLINE + props: + algorithm-expression: muscle_$->{id % 2} + muscle-image-sharding-algorithm: + type: INLINE + props: + algorithm-expression: muscle_image_$->{id % 2} + permission-sharding-algorithm: + type: INLINE + props: + algorithm-expression: permission_$->{id % 2} + quartz-job-configuration-sharding-algorithm: + type: INLINE + props: + algorithm-expression: quartz_job_configuration_$->{id % 2} + related-muscle-sharding-algorithm: + type: INLINE + props: + algorithm-expression: related_muscle_$->{id % 2} + role-sharding-algorithm: + type: INLINE + props: + algorithm-expression: role_$->{id % 2} + role-permission-sharding-algorithm: + type: INLINE + props: + algorithm-expression: role_permission_$->{id % 2} + user-sharding-algorithm: + type: INLINE + props: + algorithm-expression: user_$->{id % 2} + user-role-sharding-algorithm: + type: INLINE + props: + algorithm-expression: user_role_$->{id % 2} + tables: + body_part: + actual-data-nodes: readwrite-data-sources.body_part_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: body-part-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake + equipment: + actual-data-nodes: readwrite-data-sources.equipment_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: equipment-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake + exercise: + actual-data-nodes: readwrite-data-sources.exercise_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: exercise-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake + exercise_classification: + actual-data-nodes: readwrite-data-sources.exercise_classification_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: exercise-classification-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake + exercise_comment: + actual-data-nodes: readwrite-data-sources.exercise_comment_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: exercise-comment-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake + exercise_related_classification: + actual-data-nodes: readwrite-data-sources.exercise_related_classification_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: exercise-related-classification-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake + exercise_related_muscle: + actual-data-nodes: readwrite-data-sources.exercise_related_muscle_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: exercise-related-muscle-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake + kinesiology_glossary: + actual-data-nodes: readwrite-data-sources.kinesiology_glossary_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: kinesiology-glossary-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake + muscle: + actual-data-nodes: readwrite-data-sources.muscle_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: muscle-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake + muscle_image: + actual-data-nodes: readwrite-data-sources.muscle_image_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: muscle-image-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake + permission: + actual-data-nodes: readwrite-data-sources.permission_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: permission-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake + quartz_job_configuration: + actual-data-nodes: readwrite-data-sources.quartz_job_configuration_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: quartz-job-configuration-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake + related_muscle: + actual-data-nodes: readwrite-data-sources.related_muscle_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: related-muscle-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake + role: + actual-data-nodes: readwrite-data-sources.role_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: role-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake + role_permission: + actual-data-nodes: readwrite-data-sources.role_permission_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: role-permission-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake + user: + actual-data-nodes: readwrite-data-sources.user_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: user-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake + user_role: + actual-data-nodes: readwrite-data-sources.user_role_$->{0..1} + table-strategy: + standard: + sharding-column: id + sharding-algorithm-name: user-role-sharding-algorithm + keyGenerateStrategy: + column: id + keyGeneratorName: snowflake diff --git a/docker/configuration/micro-service-config-on-consul/application/application-development-docker.yml b/docker/configuration/micro-service-config-on-consul/application/application-development-docker.yml deleted file mode 100644 index adf1936d..00000000 --- a/docker/configuration/micro-service-config-on-consul/application/application-development-docker.yml +++ /dev/null @@ -1,164 +0,0 @@ -# https://docs.spring.io/spring-cloud-consul/docs/current/reference/html/index.html#spring-cloud-consul-config -# 1. Multiple PropertySource instances are created based on the application’s name and the active profiles -# that mimics the Spring Cloud Config order of resolving properties. -# 2. Properties in the config/application folder are applicable to all applications using consul for configuration. - -spring: - 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 - devtools: - add-properties: true - zipkin: - base-url: http://maf-zipkin:9411 - datasource: - type: com.alibaba.druid.pool.DruidDataSource - druid: - driver-class-name: com.mysql.cj.jdbc.Driver - 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: - dynamic: - primary: master_1 - druid: - # connection pool size will be determined by DruidDataSourceCreatorPostProcessor.java - 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-pool-prepared-statement-per-connection-size: 20 - keep-alive: true - datasource: - master_1: - url: jdbc:mysql://maf-mysql-server-source:3306/muscle_and_fitness?useSSL=true&useUnicode=true - username: maf_mysql_rw - password: maf@mysql - driver-class-name: com.mysql.cj.jdbc.Driver - slave_1: - url: jdbc:mysql://maf-mysql-server-replica-1: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-source:3306/QUARTZ_DB?useSSL=true&useUnicode=true - username: maf_mysql_rw - password: maf@mysql - driver-class-name: com.mysql.cj.jdbc.Driver - rabbitmq: - host: maf-rabbitmq - port: 5672 - username: maf_rabbitmq_su - password: maf@rabbitmq - 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 - jdbc: - initialize-schema: NEVER - properties: - org: - quartz: - scheduler: - instanceId: AUTO - jobStore: - tablePrefix: QRTZ_ - isClustered: true - clusterCheckinInterval: 3000 - useProperties: false - -redis: - master: - host: maf-redis-master - port: 6379 - password: maf@redis - slaves: - - host: maf-redis-slave-1 - port: 6379 - password: maf@redis - -minio: - endpoint: http://maf-minio - port: 9000 - access-key: maf_minio_root_user - secret-key: jm@minio - bucket-name: maf - -feign: - circuitbreaker: - enabled: true - httpclient: - enabled: false - okhttp: - enabled: true - client: - config: - default: - connectTimeout: 5000 - readTimeout: 10000 - loggerLevel: full - compression: - request: - enabled: true - response: - enabled: 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 diff --git a/docker/configuration/micro-service-config-on-consul/application/application-test.yml b/docker/configuration/micro-service-config-on-consul/application/application-test.yml deleted file mode 100644 index adf1936d..00000000 --- a/docker/configuration/micro-service-config-on-consul/application/application-test.yml +++ /dev/null @@ -1,164 +0,0 @@ -# https://docs.spring.io/spring-cloud-consul/docs/current/reference/html/index.html#spring-cloud-consul-config -# 1. Multiple PropertySource instances are created based on the application’s name and the active profiles -# that mimics the Spring Cloud Config order of resolving properties. -# 2. Properties in the config/application folder are applicable to all applications using consul for configuration. - -spring: - 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 - devtools: - add-properties: true - zipkin: - base-url: http://maf-zipkin:9411 - datasource: - type: com.alibaba.druid.pool.DruidDataSource - druid: - driver-class-name: com.mysql.cj.jdbc.Driver - 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: - dynamic: - primary: master_1 - druid: - # connection pool size will be determined by DruidDataSourceCreatorPostProcessor.java - 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-pool-prepared-statement-per-connection-size: 20 - keep-alive: true - datasource: - master_1: - url: jdbc:mysql://maf-mysql-server-source:3306/muscle_and_fitness?useSSL=true&useUnicode=true - username: maf_mysql_rw - password: maf@mysql - driver-class-name: com.mysql.cj.jdbc.Driver - slave_1: - url: jdbc:mysql://maf-mysql-server-replica-1: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-source:3306/QUARTZ_DB?useSSL=true&useUnicode=true - username: maf_mysql_rw - password: maf@mysql - driver-class-name: com.mysql.cj.jdbc.Driver - rabbitmq: - host: maf-rabbitmq - port: 5672 - username: maf_rabbitmq_su - password: maf@rabbitmq - 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 - jdbc: - initialize-schema: NEVER - properties: - org: - quartz: - scheduler: - instanceId: AUTO - jobStore: - tablePrefix: QRTZ_ - isClustered: true - clusterCheckinInterval: 3000 - useProperties: false - -redis: - master: - host: maf-redis-master - port: 6379 - password: maf@redis - slaves: - - host: maf-redis-slave-1 - port: 6379 - password: maf@redis - -minio: - endpoint: http://maf-minio - port: 9000 - access-key: maf_minio_root_user - secret-key: jm@minio - bucket-name: maf - -feign: - circuitbreaker: - enabled: true - httpclient: - enabled: false - okhttp: - enabled: true - client: - config: - default: - connectTimeout: 5000 - readTimeout: 10000 - loggerLevel: full - compression: - request: - enabled: true - response: - enabled: 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 diff --git a/docker/configuration/mysql-server/README.md b/docker/configuration/mysql-server/README.md index aac83cda..fe443d8e 100644 --- a/docker/configuration/mysql-server/README.md +++ b/docker/configuration/mysql-server/README.md @@ -9,7 +9,7 @@ These files below are MySQL initialization scripts: ``` script mysql-server-master - 1_init_user.sql + 1_init_mysql_user.sql 2_mysql_and_fitness_structure_and_data_20210627.sql ``` diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 2a9204e2..c454a09a 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -10,7 +10,6 @@ services: environment: MYSQL_ROOT_HOST: "%" MYSQL_ROOT_PASSWORD: ${MAF_MYSQL_ROOT_PASSWORD} - MYSQL_DATABASE: ${MAF_MYSQL_DATABASE} TZ: ${MAF_TIMEZONE} ports: - "3306:3306" @@ -35,7 +34,6 @@ services: environment: MYSQL_ROOT_HOST: "%" MYSQL_ROOT_PASSWORD: ${MAF_MYSQL_ROOT_PASSWORD} - MYSQL_DATABASE: ${MAF_MYSQL_DATABASE} TZ: ${MAF_TIMEZONE} ports: - "3307:3306" @@ -96,33 +94,19 @@ services: 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" + - "9901:9900" restart: always volumes: - "~/docker-file-mapping/${MINIO_CONTAINER_NAME}:/data" environment: MINIO_ROOT_USER: ${MAF_MINIO_ROOT_USER} MINIO_ROOT_PASSWORD: ${MAF_MINIO_ROOT_PASSWORD} - command: server /data + command: server /data --console-address ":9900" healthcheck: test: [ "CMD", "curl", "-f", "http://localhost:9000/minio/health/live" ] interval: 30s @@ -131,6 +115,21 @@ services: 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: + rabbitmq: container_name: ${RABBITMQ_CONTAINER_NAME} hostname: ${RABBITMQ_CONTAINER_NAME} diff --git a/docker/script/mysql-server-replica-1/1_init_user.sql b/docker/script/mysql-server-replica-1/1_init_mysql_user.sql similarity index 100% rename from docker/script/mysql-server-replica-1/1_init_user.sql rename to docker/script/mysql-server-replica-1/1_init_mysql_user.sql diff --git a/docker/script/mysql-server-replica-1/2_Dump20210926.sql b/docker/script/mysql-server-replica-1/2_Dump20210926.sql deleted file mode 100644 index f217b9eb..00000000 --- a/docker/script/mysql-server-replica-1/2_Dump20210926.sql +++ /dev/null @@ -1,549 +0,0 @@ --- MySQL dump 10.13 Distrib 8.0.26, for Win64 (x86_64) --- --- Host: 127.0.0.1 Database: muscle_and_fitness --- ------------------------------------------------------ --- Server version 8.0.26 - -/*!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 unsigned 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 unsigned 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 unsigned 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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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','image/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.','image/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.','image/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.','image/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.','image/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','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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 .','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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:','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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:','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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 unsigned 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 unsigned 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 unsigned 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 unsigned 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 unsigned 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,'image/AdductorAnteriorSmall.png','Adductors',1,'2021-06-27 13:54:16',NULL,NULL,0),(2,1,'image/AdductorPosteriorSmall.png','Adductors',1,'2021-06-27 13:54:16',NULL,NULL,0),(3,2,'image/BicepsInsideSmall.gif','Biceps Brachii',1,'2021-06-27 13:54:16',NULL,NULL,0),(4,3,'image/BrachialisInsideSmall.gif','Brachialis',1,'2021-06-27 13:54:16',NULL,NULL,0),(5,3,'image/BrachialisUpperArmSegmentSmall.gif','Brachialis',1,'2021-06-27 13:54:16',NULL,NULL,0),(6,4,'image/BrachioradialisoutsideSmall.png','Brachioradialis',1,'2021-06-27 13:54:16',NULL,NULL,0),(7,6,'image/DeltoidAnteriorFront.gif','Anterior',1,'2021-06-27 13:54:16',NULL,NULL,0),(8,7,'image/DeltoidLateralBack.gif','Lateral',1,'2021-06-27 13:54:16',NULL,NULL,0),(9,8,'image/DeltoidPosteriorBack.gif','Posterior',1,'2021-06-27 13:54:16',NULL,NULL,0),(10,9,'image/DeepHipRotators.gif','Deep Hip External Rotators',1,'2021-06-27 13:54:16',NULL,NULL,0),(11,10,'image/96a0e9eeb4ad8418eff179a9c59bc713.png','Erector Spinae',1,'2021-06-27 13:54:16',NULL,NULL,0),(12,10,'image/ErectorSpinaeCrossSection.gif','Erector Spinae',1,'2021-06-27 13:54:16',NULL,NULL,0),(13,11,'image/GastrocnemiusLateral.gif','Gastrocnemius',1,'2021-06-27 13:54:16',NULL,NULL,0),(14,13,'image/80a4754b254e159c4cd5474b063d096e.png','Maximus',1,'2021-06-27 13:54:16',NULL,NULL,0),(15,14,'image/GluteusMediusPosterior.gif','Medius',1,'2021-06-27 13:54:16',NULL,NULL,0),(16,15,'image/bf94c6ef8b7ca1c02323779e1fe3b837.png','Minimus',1,'2021-06-27 13:54:16',NULL,NULL,0),(17,15,'image/GluteusMinimusSide.gif','Minimus',1,'2021-06-27 13:54:16',NULL,NULL,0),(18,16,'image/69c90b7fb98b9c863015a90b3ff3173c.png','Gracilis',1,'2021-06-27 13:54:16',NULL,NULL,0),(19,17,'image/1c94da8f4db345d0343c3db475d2d84d.png','Hamstrings',1,'2021-06-27 13:54:16',NULL,NULL,0),(20,18,'image/99beae51baa19dc3d8ef62c04b469133.png','Iliopsoas',1,'2021-06-27 13:54:16',NULL,NULL,0),(21,18,'image/ed4205586bfaf0b1603ad8e70dae6706.png','Iliopsoas',1,'2021-06-27 13:54:16',NULL,NULL,0),(22,19,'image/3e3d3ded3335c56a7f932c6e38a3ed53.png','Infraspinatus',1,'2021-06-27 13:54:16',NULL,NULL,0),(23,20,'image/67f687e9482a2a6bca9a38544e45d31c.png','Latissimus Dorsi',1,'2021-06-27 13:54:16',NULL,NULL,0),(24,20,'image/LatSmall.png','Latissimus Dorsi',1,'2021-06-27 13:54:16',NULL,NULL,0),(25,21,'image/5083bc6f81d7a598832a5cb53340fb4a.png','Levator Scapulae',1,'2021-06-27 13:54:16',NULL,NULL,0),(26,22,'image/1d421470bb1b8650b68a055d15704abe.png','Obliques',1,'2021-06-27 13:54:16',NULL,NULL,0),(27,22,'image/ObliqueCrossSection.gif','Obliques',1,'2021-06-27 13:54:16',NULL,NULL,0),(28,23,'image/52d884ea5ad22f197b0335468e4ca6e7.png','Pectineous',1,'2021-06-27 13:54:16',NULL,NULL,0),(29,25,'image/11a9ea1af4fa3e206ec2eecc7e60100e.png','Clavicular Head',1,'2021-06-27 13:54:16',NULL,NULL,0),(30,25,'image/0e1ed54440e102b3ec973207ea371964.png','Clavicular Head',1,'2021-06-27 13:54:16',NULL,NULL,0),(31,26,'image/5a6b344e7b8a52c715adf8b091461f7d.png','Sternal Head',1,'2021-06-27 13:54:16',NULL,NULL,0),(32,26,'image/PectoralAttachmentSmall.png','Sternal Head',1,'2021-06-27 13:54:16',NULL,NULL,0),(33,28,'image/TeresMajorSmall.png','Major',1,'2021-06-27 13:54:16',NULL,NULL,0),(34,29,'image/TeresMinorSmall.png','Minor',1,'2021-06-27 13:54:16',NULL,NULL,0),(35,30,'image/TibialisAnteriorSmall.png','Tibialis Anterior',1,'2021-06-27 13:54:16',NULL,NULL,0),(36,31,'image/TransverseAbdominisCrossSectionNew.jpg','Transverse Abdominus',1,'2021-06-27 13:54:16',NULL,NULL,0),(37,33,'image/TrapLowerHalfSmall.png','Lower Fibers',1,'2021-06-27 13:54:16',NULL,NULL,0),(38,34,'image/TrapMiddleHalfSmall.png','Middle Fibers',1,'2021-06-27 13:54:16',NULL,NULL,0),(39,35,'image/TrapUpperHalfSmall.png','Upper Fibers',1,'2021-06-27 13:54:16',NULL,NULL,0),(40,36,'image/TricepsOutsideSmall.gif','Triceps Brachii',1,'2021-06-27 13:54:16',NULL,NULL,0),(41,38,'image/WristExtensorsSupSmall.gif','Extensors',1,'2021-06-27 13:54:16',NULL,NULL,0),(42,39,'image/WristFlexorNeutSmall.gif','Flexors',1,'2021-06-27 13:54:16',NULL,NULL,0),(43,40,'image/e7cda9218a2e2c84a31a7ca32e98c3a9.png','Pectoralis Minor',1,'2021-06-27 13:54:16',NULL,NULL,0),(44,41,'image/PopliteusSmall.png','Popliteus',1,'2021-06-27 13:54:16',NULL,NULL,0),(45,42,'image/QuadratusLumborumSmall.png','Quadratus Lumborum',1,'2021-06-27 13:54:16',NULL,NULL,0),(46,43,'image/QuadricepsAnteriorSmall.png','Quadriceps',1,'2021-06-27 13:54:16',NULL,NULL,0),(47,44,'image/RectusAbdominisWaistSmall.png','Rectus Abdominis',1,'2021-06-27 13:54:16',NULL,NULL,0),(48,44,'image/RectusAbdominalCrossSectionNew.jpg','Rectus Abdominis',1,'2021-06-27 13:54:16',NULL,NULL,0),(49,45,'image/RhomboidsHalfSmall.png','Rhomboids',1,'2021-06-27 13:54:16',NULL,NULL,0),(50,46,'image/SartoriusAnteriorSmall.png','Sartorius',1,'2021-06-27 13:54:16',NULL,NULL,0),(51,47,'image/SerratusAnteriorSideSmall.png','Serratus Anterior',1,'2021-06-27 13:54:16',NULL,NULL,0),(52,47,'image/SerratusAnteriorPullSmall.png','Serratus Anterior',1,'2021-06-27 13:54:16',NULL,NULL,0),(53,47,'image/SerratusScapulaTransverseCu.gif','Serratus Anterior',1,'2021-06-27 13:54:16',NULL,NULL,0),(54,48,'image/SoleusLateralSmall.png','Soleus',1,'2021-06-27 13:54:16',NULL,NULL,0),(55,49,'image/SpleniusSpineSmall.png','Splenius',1,'2021-06-27 13:54:16',NULL,NULL,0),(56,49,'image/SpeniusHalfSmall.png','Splenius',1,'2021-06-27 13:54:16',NULL,NULL,0),(57,50,'image/SternoSideSmall.png','Sternocleidomastoid',1,'2021-06-27 13:54:16',NULL,NULL,0),(58,51,'image/SubscapularisSmall.png','Subscapularis',1,'2021-06-27 13:54:16',NULL,NULL,0),(59,52,'image/SupraspinatusBackSmall.png','Supraspinatus',1,'2021-06-27 13:54:16',NULL,NULL,0),(60,53,'image/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 unsigned NOT NULL DEFAULT '0' COMMENT 'Deleted', - 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 `quartz_job_configuration` --- - -DROP TABLE IF EXISTS `quartz_job_configuration`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `quartz_job_configuration` ( - `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'The primary key ID', - `name` varchar(50) COLLATE utf8mb4_general_ci NOT NULL COMMENT 'Name of job', - `group` varchar(200) COLLATE utf8mb4_general_ci NOT NULL COMMENT 'Group of job', - `service_name` varchar(50) COLLATE utf8mb4_general_ci NOT NULL COMMENT 'Service name, equal to artifact-id', - `invoke_target` varchar(500) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'Invoke target', - `cron_expression` varchar(50) COLLATE utf8mb4_general_ci NOT NULL COMMENT 'Cron Expressions', - `misfire_policy` tinyint NOT NULL COMMENT 'Trigger''s misfire policy', - `concurrent` tinyint unsigned NOT NULL DEFAULT '0' COMMENT 'Concurrent. true(1): is concurrent, false(0): not concurrent', - `description` varchar(1000) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'Description', - `status` tinyint NOT NULL COMMENT 'Status', - `created_by` bigint unsigned NOT NULL COMMENT 'Created by', - `created_time` datetime NOT NULL COMMENT 'Craeted time', - `modified_by` bigint unsigned DEFAULT NULL COMMENT 'Modified by', - `modified_time` datetime DEFAULT NULL COMMENT 'Modified time', - `deleted` tinyint unsigned NOT NULL DEFAULT '0' COMMENT 'Deleted', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='Quartz Job Configuration'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `quartz_job_configuration` --- - -LOCK TABLES `quartz_job_configuration` WRITE; -/*!40000 ALTER TABLE `quartz_job_configuration` DISABLE KEYS */; -INSERT INTO `quartz_job_configuration` VALUES (1,'greeting-schedule-job','auth-center-default-group','auth-center','greetingBean.hello()','0 0/1 * 1/1 * ? *',0,0,'Greeting task. It\'s a demo Quartz schedule job.',0,1,'2021-09-26 00:20:37',NULL,NULL,0),(2,'greeting-schedule-job','maf-mis-default-group','maf-mis','greetingBean.hello()','0 0/1 * 1/1 * ? *',0,0,'Greeting task. It\'s a demo Quartz schedule job.',0,1,'2021-09-26 00:20:37',NULL,NULL,0); -/*!40000 ALTER TABLE `quartz_job_configuration` 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 unsigned NOT NULL DEFAULT '0' COMMENT 'Deleted', - 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 unsigned NOT NULL DEFAULT '0' COMMENT 'Deleted', - 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-09-26 10:48:15 diff --git a/docker/script/mysql-server-replica-1/2_Dump20220402.sql b/docker/script/mysql-server-replica-1/2_Dump20220402.sql new file mode 100644 index 00000000..5d8a00d9 --- /dev/null +++ b/docker/script/mysql-server-replica-1/2_Dump20220402.sql @@ -0,0 +1,1083 @@ +-- MySQL dump 10.13 Distrib 8.0.28, for Win64 (x86_64) +-- +-- Host: 127.0.0.1 Database: muscle_and_fitness_0 +-- ------------------------------------------------------ +-- Server version 8.0.26 + +/*!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; + +DROP DATABASE IF EXISTS `muscle_and_fitness_0`; +CREATE SCHEMA `muscle_and_fitness_0` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +USE `muscle_and_fitness_0`; + +-- +-- Table structure for table `body_part_0` +-- + +DROP TABLE IF EXISTS `body_part_0`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `body_part_0` ( + `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` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'system' COMMENT 'Created by.', + `created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Created time', + `modified_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT 'system' COMMENT 'Modified by', + `modified_time` datetime DEFAULT NULL COMMENT 'Modified time', + `version` int unsigned NOT NULL DEFAULT '0' COMMENT 'Optimistic locking', + `deleted` enum('N','Y') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'N' COMMENT 'Deleted. ''N'' - not deleted; ''Y'' - 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_0` +-- + +LOCK TABLES `body_part_0` WRITE; +/*!40000 ALTER TABLE `body_part_0` DISABLE KEYS */; +INSERT INTO `body_part_0` VALUES (1,'Neck','system','2021-06-27 13:31:48',NULL,NULL,0,'N'),(2,'Shoulders','system','2021-06-27 13:31:48',NULL,NULL,0,'N'),(3,'Upper Arms','system','2021-06-27 13:31:48',NULL,NULL,0,'N'),(4,'Forearms','system','2021-06-27 13:31:48',NULL,NULL,0,'N'),(5,'Back','system','2021-06-27 13:31:48',NULL,NULL,0,'N'),(6,'Chest','system','2021-06-27 13:31:48',NULL,NULL,0,'N'),(7,'Waist','system','2021-06-27 13:31:48',NULL,NULL,0,'N'),(8,'Hips','system','2021-06-27 13:31:48',NULL,NULL,0,'N'),(9,'Thighs','system','2021-06-27 13:31:48',NULL,NULL,0,'N'),(10,'Calves','system','2021-06-27 13:31:48',NULL,NULL,0,'N'),(11,'Other Exercises','system','2021-06-27 13:31:48',NULL,NULL,0,'N'); +/*!40000 ALTER TABLE `body_part_0` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `body_part_1` +-- + +DROP TABLE IF EXISTS `body_part_1`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `body_part_1` ( + `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` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'system' COMMENT 'Created by.', + `created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Created time', + `modified_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT 'system' COMMENT 'Modified by', + `modified_time` datetime DEFAULT NULL COMMENT 'Modified time', + `version` int unsigned NOT NULL DEFAULT '0' COMMENT 'Optimistic locking', + `deleted` enum('N','Y') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'N' COMMENT 'Deleted. ''N'' - not deleted; ''Y'' - deleted', + PRIMARY KEY (`id`), + UNIQUE KEY `body_part_name_uindex` (`name`) +) ENGINE=InnoDB 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_1` +-- + +LOCK TABLES `body_part_1` WRITE; +/*!40000 ALTER TABLE `body_part_1` DISABLE KEYS */; +/*!40000 ALTER TABLE `body_part_1` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `equipment_0` +-- + +DROP TABLE IF EXISTS `equipment_0`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `equipment_0` ( + `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` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'system' COMMENT 'Created by', + `created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Created time', + `modified_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT 'system' COMMENT 'Modified by', + `modified_time` datetime DEFAULT NULL COMMENT 'Modified time', + `version` int unsigned NOT NULL DEFAULT '0' COMMENT 'Optimistic locking', + `deleted` enum('N','Y') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'N' 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_0` +-- + +LOCK TABLES `equipment_0` WRITE; +/*!40000 ALTER TABLE `equipment_0` DISABLE KEYS */; +/*!40000 ALTER TABLE `equipment_0` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `equipment_1` +-- + +DROP TABLE IF EXISTS `equipment_1`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `equipment_1` ( + `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` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'system' COMMENT 'Created by', + `created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Created time', + `modified_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT 'system' COMMENT 'Modified by', + `modified_time` datetime DEFAULT NULL COMMENT 'Modified time', + `version` int unsigned NOT NULL DEFAULT '0' COMMENT 'Optimistic locking', + `deleted` enum('N','Y') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'N' 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_1` +-- + +LOCK TABLES `equipment_1` WRITE; +/*!40000 ALTER TABLE `equipment_1` DISABLE KEYS */; +/*!40000 ALTER TABLE `equipment_1` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `exercise_0` +-- + +DROP TABLE IF EXISTS `exercise_0`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `exercise_0` ( + `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` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'system' COMMENT 'Created by', + `created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Created time', + `modified_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT 'system' COMMENT 'Modified by', + `modified_time` datetime DEFAULT NULL COMMENT 'Modified time', + `version` int unsigned NOT NULL DEFAULT '0' COMMENT 'Optimistic locking', + `deleted` enum('N','Y') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'N' COMMENT 'Deleted. ''N'' - not deleted; ''Y'' - 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_0` +-- + +LOCK TABLES `exercise_0` WRITE; +/*!40000 ALTER TABLE `exercise_0` DISABLE KEYS */; +INSERT INTO `exercise_0` 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.','image/CBNeckFlexionBelt.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBNeckFlexion.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVNeckFlexionH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBNeckRotationBelt.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVNeckLateralFlexion.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBLateralNeckFlexionBelt.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVLateralNeckFlexionH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVNeckFlexion.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WtNeckFlexion.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTNeckFlexionCrossBench.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTLateralNeckFlexion.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(12,'Neck Rotation Stretch','Stand or sit.','Turn head over shoulder to one side. Hold stretch. Repeat to other side.','image/2fbe7e69b265b483d2414574acf6142e.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWWallSideNeckBridge.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(14,'Neck Retraction Stretch','Stand or sit.','Pull head back as far possible while looking slightly down and hold stretch.','image/360cb46b3b96821a6d08e84228e08c07.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STNeckFlexion.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWFrontNeckBridge.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWWallFrontNeckBridge.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STNeckLateralExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBNeckExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVNeckExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVNeckExtensionH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTLyingNeckExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTNeckExtensionCrossBench.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBNeckExtensionBelt.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTNeckExtensionHarness.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WtNeckExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(27,'Band Resistive Neck Retraction','Execution\nPush back of neck into band by retracting head. Returning head to neutral postion and repeat.','Comments','image/BRNeckRetraction.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWWallRearNeckBridge.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWRearNeckBridge.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/0b4142cf0100659361840fb8e05756e4.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STNeckExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(32,'Lying Neck Retraction Isometric','Execution\nPush head into mat and hold position. Relax and repeat.','Comments','image/IsometricNeckRetraction.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBSeatedBehindNeckPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBInclineFrontRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBMilitaryPressBentLeg.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBFrontRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBShoulderPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBBarBehindNeckPressSide.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBBarMilitaryPressSide.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBBarMilitaryPressSide.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBSeatedMilitaryPressFF.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBSeatedFrontRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBAlternatingFrontLateralRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBAlternatingSeatedFrontRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBFrontRaiseRope.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBShoulderPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBFrontRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBAlternInclineFrontRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBTwistingOverheadPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBStandingShoulderPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBFrontRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBAlternatingFrontRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBArnoldPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBShoulderPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVReclinedShoulderPressPL.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVBehindNeckShoulderPressH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSMSeatedBehindNeckPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVMilitaryInclinePressH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBOneArmShoulderPressLean.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVOneArmFrontRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVShoulderPressH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSMSeatedShoulderPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVOneArmShoulderPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVReclinedShoulderPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVReclinedShoulderPressParGrip.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SLShoulderPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVShoulderPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SLShoulderPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVAlternatingShoulderPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVClosWidParGripShouldPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SMShoulderPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SMBehindNeckPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWHandstandPressBenches.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/55ab2c829aa0fcebd5d58d00c31dd5cb.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/653009242a6a02fb25ad40c66eb2737b.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/5616f45948903873fa68bfd777cf1388.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWPikePress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWPikePressDeclined.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STFrontRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/ff15584ed4d354bd3c44c8e22fae9f77.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBLateralRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBWideGripUprightRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBOneArmLateralRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBUprightRowM.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBSeatedLateralRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBUprightRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBBarUprightRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBUprightRowDoublePulley.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBOneArmUprightRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBUprightRowRope.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBLateralRaiseClose.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBSeatedYRowRope.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBYRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBOneArmLateralRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBWideGripUprightRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBInclineLateralRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBSeatedYRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBUprightRowStirrups.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBLateralRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBLyingLateralRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBOneArmSeatedLateralRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSMUprightRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBRaise8.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBUprightRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBOneArmUprightRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVLateralRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVLateralRaiseH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBOneArmSeatedUprightRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVExtendedArmLateralRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVExtendedArmKneelingLateralRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(112,'Side Deltoid Stretch','Position arm across chest. Place opposite hand on elbow.','Push elbow toward chest. Hold stretch. Repeat with opposite arm.','image/217101e410d8d1d25cfc6478d0115ad1.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/d9fca31f579fd29d33241749ea84f365.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STYShoulderRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SMWideGripUprightRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SMUprightRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBLyingRearDeltRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBStandingRearDeltFly.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBStandingRearDeltRowRope.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBSupineRearLateralPull_.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBRearDeltRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBSeatedRearDeltPull.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBRearDeltRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBRearDeltRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBRearDeltPull.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBRearDeltRowStirrups.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBOneArmRearDeltRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBSeatedRearDeltRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBSeatedRearLateralRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBRearLateralRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBStandingRearDeltRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBLyingRearLateralRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBLyingRearDeltRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CableBentOverLateralRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBStandingCrossRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBOneArmCrossRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBLyingRearDeltRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBRearLateralRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBOneArmLyingLateralRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBRearDeltRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVInclineRearDeltRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVLyingRearDeltRaiseH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVRearDeltRowH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBSeatedRearLateralRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVRearRaiseH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedRearLateralRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVBentOverExtArmLateralRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedRearDeltRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedReverseFlyParallelGrip.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVRearLateralRaiseOnLatRsMch.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVTBarRearDeltRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVLyingRearLateralRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedRearDeltFlyOnPecDeck.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVRearDeltFlyOverhandGrip.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedRearDeltFlyInsideParallelGrip.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedRearDeltFly.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWRearDeltInvertedRowHigh.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWRearDeltInvertedRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SMBentoverRearDeltRowSideView.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STReverseFlyStaggered.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STRearDeltRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(164,'Rear Deltoid Stretch','Position arm across neck. Place opposite hand on elbow.','Push elbow toward neck. Hold stretch. Repeat with opposite arm.','image/e804bc162a98017991aec45287ea60f3.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/277fbfe41e0114de998ccabb0af995e7.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBOneArmSeatedFrontLateralRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBFrontLateralRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBFullCanLateralRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBFrontLateralRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBSeatedFrontLateralRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBCloseGripBenchPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/ASTricepsDip.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBJMPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/ASTricepsDipKneeling.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBLyingTricepsExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBCloseGripInclineBenchPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBLyingTricepsExtensionSC.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBInclineTricepsExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBSeatedTricepsExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBDeclineTricepsExt.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBOverheadTricepsExt.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBOneArmForwardTricepsExt.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBInclineTricepsExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBOverheadTricepsExtRope.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBLyingTricepsExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBKneelingTricepsExt.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBDeclineTricepsExt.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBForwardLeaningPushdown.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBBarPushdown.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBPushdown.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBAlternatingSeatedPushdown.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBPushdownV.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBOneArmSideTricepsExt.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBPushdownRope.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBStandingTricepsExtensionBackSupport.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBOneArmPushdown.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBInclinePushdown.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBSeatedTricepsExtSupGrip.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBTricepsDip.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBSeatedTricepsExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBOneArmTricepsExtensionPronated.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBSeatedTricepsExtBackSupport.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBLyingTricepsExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBKickback.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBDeclineTricepsExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBTricepsExtensionRope.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBInclineTricepsExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBTricepsExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBOneArmTricepsExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVCloseGripBenchPressH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSMCloseGripBenchPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVOverheadTricepsExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVInclineTricepsExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVPushdown.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVTricepsExtensionNoSeatPL.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVTricepsDipH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVTriExtGripless.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVTricepsDip2.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVCloseGripChestPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVCloseGripInclineBenchPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVAlternatingTricepsExtensionS.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVTricepsExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SLStandingTricepsDip.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SMCloseGripBenchPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVTricepsDipOverhand.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SMCloseGripInclineBenchPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTBenchDip.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WtTricepsDip.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTCloseGripPushUp.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWCloseGripPushUpKnees.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWBenchDipLegsElevated.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWCloseGripPush.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWBenchDipFloor.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/ASTricepsDipFootBand.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWBenchDipBentKnee.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWTricepsDip.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWSuspendedTricepsExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWCloseGripInclinePushUpOnBar.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWDoubleBenchDipsTriceps.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STSelfAssistedDipOnToes.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWDoubleBenchDipBentKneeTriceps.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STTricepsExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STDip.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/3799ed8a83c8eac5efb901d9b10cdba5.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/edeae1cee9ffa6dc4c5e5fed632f9bba.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/389b7b9e3728a886909b6b7a5f9a6e8a.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/ASTricepsDipSelf.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBSeatedAlternatingCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBAlternatingCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBDragCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBSeatedCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBBarCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBOneArmCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBCurlStirrups.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBSupineArmCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWSupineRowUnderhandHigh.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVAlternatingCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/43d668452405c4e4fc3558c7198e186a.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/055a2e3f70a4c9da644902025b37f71d.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBInclineCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWUnderhandChinup.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWSupineRowUnderhand.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/6cb903dd82c279b928786e7c041a8650.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/7fb262891ac5c6933385580cfca31e8d.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/e56394f43d421e81a3dcd5db1bc18917.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBPreacherCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBAlternatingPreacherCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBConcentrationCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBPreacherCurlStirrups.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBOneArmStandingPreacherCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBProneInclineCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBStandingPreacherCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBStandingPreacherCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBPreacherCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBProneInclineCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBOneArmPreacherCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBPreacherCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBConcentrationCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVPreacherCurlH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVHighPreacherCurlArmsHighPL.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBProneInclineCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBStandingOneArmPreacherCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVAlternatingHighPreacherCurlArmsHighPL.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVStandingPreacherCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVHighPreacherCurlS.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVPreacherCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVAlternatingHighPreacherCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STArmCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVPreacherCurlSeatless.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBStandingReversePreacherCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBHammerCurlRope.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBReverseCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBReverseCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBBarReverseCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBHammerCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVReverseCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVHammerPreacherCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBStandingReversePreacherCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBReversePreacherCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBReversePreacherCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(310,'Standing Brachioradialis Stretch','Cross wrists, point thumbs downward, and clasp hands.','Straighten arms and externally rotate shoulders by back. Hold stretch.','image/e5de318835474e554b63aa69f6b28291.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVReversePreacherCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CableRollerWristFlexion.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVWristCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBOneArmWristCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBWristCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBUlnarFlexion.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBWristCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBWristCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVGripper.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedGripper.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedWristCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVUlnarDeviation.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SLGripper.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SLOneHandGripPinchPL.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SLGripPL.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVRollerAlternatingWristFlexion.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/687f3c5f65553be7ab1ce1453499fdf2.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SLOneHandGripPL.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/0e6c9ab24bc1acaa9bbb811fa0f0f70a.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/87d4e6a3bad34ced76d50c60a6b2fbf8.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/f4b4e6a42d8874f9e70106cf09e141d9.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVWristRollerUlnarFlexion.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBRadialDeviation.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBReverseWristCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBReverseWristCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVRadialDeviation.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBOneArmReverseWristCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBReverseWristCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVReverseWristCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CableRollerWristExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedReverseWristCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVWristRollerRadialFlexion.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/1ef1476e3bcaf5b7a89a2cbfcc3bdd8f.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/KneelingWristExtensor.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBPronationUp.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBSeatedPronation.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedPronation.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(348,'Lever Standing Forearm Pronation','Grasp open handle at end of shaft with underhand grip.','Rotate shaft by turning palm downward. Return and repeat.','image/LVWristPronation.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBPronationDown.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(350,'Lever Standing Forearm Supination','Grasp open handle at end of shaft with overhand grip.','Rotate shaft by turning palm upward. Return and repeat.','image/LVForearmSupination.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBSupinateDown.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBSupinationUp.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBSeatedSupination.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedSupination.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBBentOverRowClose.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBInclineRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CMBLyingRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBStraightBackInclineRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBBentOverRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBUnderhandBentOverRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBOneArmKneelingRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBLyingRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBOneArmBentOverRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBOneArmRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBOneArmTwistingRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBOneArmHighRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBHighRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBOneArmTwistingHighRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBAlternatingHighRowLeanBack.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBSeatedRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBOneArmStrBackHighRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBWideGripSeatedRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBSeatedRowStraightBack.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBSeatedRowWideGripStrBack.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBOneArmStandingRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBBentoverRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBStandingLowRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBLyingRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBStandingTwistingRowOpStance.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVBentOverRowH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVWideGripBentOverRowH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSMBentoverRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVInclineRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVOneArmBentOverRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVCloseGripInclineRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVOneArmStandingRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedRowLowNarrowH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVAlternatingWideGripSeatedRowH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedRowAlternatingNarrowH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVWideGripSeatedRowH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedRowWideH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedHighRowH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVStrBackSeatedRowNoPadPL.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedLowRowH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedRowNoPadPL.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVCloseGripTBarRowPL.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVBentOverRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVAlternatingSeatedUnderhandRowH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVHighRowB.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVAlternatingHighRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedUnderhandRowH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVWideGripSeatedRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVAlternatingUnderhandSeatedRowS.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVUnderhandSeatedRowS.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedRowNoPad.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVStraightBackSeatedRowNoPad.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWSupineRowFeetElevated.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SMBentoverRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWSupineRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTInvertedRowFeetElevated.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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','image/BWSupineRowOnHip.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWSupineRowHigh.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/2febe4db68138ccd83658bc2e5387d62.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STInvertedRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STInvertedRowLowKneesBent.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/PCCrosshand8.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STPowerPull.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBPullover.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/ASPullUpKneelingOpen.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/AsCloseGripPullup.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/ASPullupKneeling.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/AsPullup.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/ASUnderhandChinupKneeling.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBOneArmPulldown.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBBentArmPullover.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBCloseGripPulldown.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/ASCloseGripPullUpKneeling.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVAlternatingCloseGripPulldown.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBOneArmKneelingPulldown.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBFrontPulldown.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBCloseGripPulldownStirrups.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/KneelingBentOverPulldown.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBParallelGripPulldown.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBAlternatingPulldown.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBPullover.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBFrontPulldownProBar.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBPulldownStirrups.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBStraightArmPullDown.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBParallelCloseGripPullup.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBChinup.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVPullup.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBSeatedStraightArmPulldown.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBRearPullup.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBPullup.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBRearPulldown.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVCloseGripPulldownPL.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBStandTwistPulldownOpStance.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBUnderhandPulldown.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVRearPulldownPL.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVPulldownH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVUnderhandPulldownH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVFrontPulldownPL.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVPulloverH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVCloseGripPulldown.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVFrontPulldown.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVIronCross.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVBiLateralUnderhandPulldownS.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVPullover.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVPullDown.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVPullDownParallelGrip.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTCloseGripChinup.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTChinUpUnderhand.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVAlternatingUnderhandPulldownS.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTChinUp.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/ASPullupFootBand.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTPullUpDB.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/ASChinupFootBand.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTRearPullup.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/ASParallelGripPullupFootBand.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTPullUpN.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/ASNeutralGripPullupFootBand.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWCloseGripPullup.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/ASRearPullupFootBand.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWWideGripChinup.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/AsRearPullupPartner.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWPullUp.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWPullUpN.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWRearPullup.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/AsUnderhandChinupPartner.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/AsChinupPartner.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWRearPullupSelfAssistedRear.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWChinupSelfAssistedFront.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWUnderHandChinupSelfAssistedFront.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWKneelingWheelRollout.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STKneelingRollout.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STSelfAssistedPullup.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/01d980e27b31196413c44429d1bf8e00.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STPullup.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/Bentover.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWRolloutBall.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/PCUnderhand8.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BentoverFloorLat.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/StandingSideBendLat.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/524bb061bc1d45f04e9d210ca87e864b.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/7926682b1fd64e1118a13f8b734fecef.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/8ba64011570f73050fcd1c3d26fe4b02.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/af32125548f8472201151459ae3d6336.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CMBSeatedShrug.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/TBShrug.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBBarShrug.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBShrug.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SBShrugStand.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBShrugStirrups.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBShrug.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBOneArmShrug.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(519,'Dumbbell Shrug','Stand holding dumbbells to sides.','Elevate shoulders as high as possible. Lower and repeat.','image/DBShrug.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBShrugDualPulley.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(521,'Lever Gripless Shrug (plate loaded)','Stand with shoulders under padded lever.','Elevate shoulders as high as possible. Lower and repeat.','image/LVGriplessShrugPL.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVShrugNarrow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVShrugH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(524,'Lever Seated Gripless Shrug','Sit on seat and place forearms in padded bars.','Elevate shoulders as high as possible. Lower and repeat.','image/LVSeatedGriplessShrug.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSMShrug.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(526,'Lever Shrug','Stand holding lever bar with shoulder width overhand or mixed grip.','Elevate shoulders as high as possible. Lower and repeat.','image/LVShrug.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SMShrug.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedShrugH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWBentKneeInvertedShrug.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(530,'Sled Gripless Shrug','Stand with shoulders under padded bar.','Elevate shoulders as high as possible. Lower and repeat.','image/SLGriplessShrug.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(531,'Lever Gripless Shrug','Stand with shoulders under padded lever.','Elevate shoulders as high as possible. Lower and repeat.','image/LVGriplessShrug.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/90b391614b804836394c8232d1f1bc8b.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWInvertedShrugsRings.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/d3bb866a867c108318859f20ac343f44.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/247d61a1ccbd2df25a96521b4a9f1d46.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBSeatedShoulderExternalRotation.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBSeatedExternalRotation.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBLyingExternalRotation.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBExternalRotationDecline.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBExternalShoulderRotation2.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBUprightShoulderExtRotation.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBStandingExternalRotation.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVShoulderExternalRotation.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBStandingExternalRotationSupport.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVUprightExternalRotation.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVShoulderExternalRotationPL.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/e83cc4e80c252e68fe01e3d0a4891143.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/681599629550fe54ecfdc24bff39e6db.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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 .','image/af975066da66427c3e87e4ed52c67e18.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/ae28a6393c675efab53e9fbae0240a63.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/f9fdd43b88238a8e619a6d655b251781.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STShoulderExternalRotation.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBInternalRotationFloor.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBStandingInternalRotation.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBInternalRotation.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVShoulderInternalRotation.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBInternalRotation.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVShoulderInternalRotationPL.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/7e7c92a3099c3dc0c2eb456ebadd0a5e.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/04ab06bb0ae4639867ed65834a7aff6a.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVUprightInternalRotation.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/AsChestDip.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/ASChestDipKneeling.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBBoardPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBBenchPressGuillotine.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBBenchPressPowerlift.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBBenchPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBFloorPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBDeclineBenchPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBChestDip.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBDeclineFly.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBBenchPressChain.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBSeatedFly.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBLyingFly.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBBenchPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBStandingFly.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBOneArmChestPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBBarStandingChestPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBTwistingChestPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBBarBenchPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBChestPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBStandingChestPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBBenchPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBDeclineChestPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBStandingTwistingChestPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBStandingDeclinePress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBBarStandingDeclineChestPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBDeclineBenchPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBDeclineFly.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBPulloverBench.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBFly.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBPullover.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSMBenchPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVDeclineChestPressHighH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVChestPressH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBPulloverArchedBench.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVBenchPressH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVChestDipH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVChestDip.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVWideGripChestPressSeatLowH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVDeclineFly.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVFly.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVBentOverFly.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedDeclineFly.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedFlyIronCross.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedFlyGripless.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedFly2.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVLyingFly.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVBenchPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVAlternatingChestPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVDeclineChestPress2.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVChestPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVAlternatingDeclineChestPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVParallelGripBenchPressB.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SLStandingChestDipWideHorizontalGrip.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SLStandingChestDip.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SMBenchPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVDeclineBenchPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WtPushup.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWChestDip.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/ASChestDipFootBand.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SMDeclineBenchPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTPushupHandles.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWPushupWide.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTChestDip.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWDoubleBenchDips.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWDoubleBenchDipsBentKnee.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWPushupOnBox.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STDip.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWPushupOnBar.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STSelfAssistedChestDip.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STChestPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(637,'Behind Head Chest Stretch','Place hands behind head.','Pull elbows back further behind ears. Hold stretch.','image/31a7b461c0ecbd48cc96c1d82724df4e.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/ASChestDipSelfAssisted.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STChestFly.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWPushupWideKnee.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/35105281f94e7095770bdd334abaf11b.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/9d5fa017ad5d4a4b9ccaad68c16a6db6.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/fd41223d6c4bf840b668fe7cd1810421.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/274cce510915d8b305b711f55c0f015c.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBInclineChestPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBBarInclineBenchPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBStandingInclinePress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBInclineBenchPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBInclineBenchPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBBarStandingInclineChestPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBInclineFly.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBInclineBenchPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBStandingInclineFly.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBStandTwistInclineChestPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBInclineFly.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVInclineChestPressOnHammerMilitaryPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVInclineChestPressSeatLowH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSMInclineBenchPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVInclineBenchPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVParellelGripInclineBenchPressNPL.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVInclineBenchPressNPL.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVInclineParallelGripBenchPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVParallelGripInclineChestPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVAlternatingInclineChestPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVInclineChestPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SMInclineBenchPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWDeclinePushup.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVInclineFly.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWFarPikePress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DeclinePushUpOnBall.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/81c9c6613602c71360e4ca55e904cf66.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/fac48a97a71ddfde86c8d863dcbd396d.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WallShoulderGirdle.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVInclineShoulderRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBInclineShoulderRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBInclineShoulderRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBShoulderRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVInclineShoulderRaisePL.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBOneArmInclinePush.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SMInclineShoulderRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWPushUpPlus.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBPushCrunch.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBLyingCrunchStabBall.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBLyingLegHipRaiseBench.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBInclineSitup.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBInclineCrunch.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBLyingLegHipRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBLyingStraightLegHipRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBSeatedCrunch.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBKneelingCrunch.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBOverheadSeatedCrunch.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBStandingCrunch.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBPushCrunch.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVLyingCrunchArmsSide.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBStandingOverheadCrunchMultiBar.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBStandingOverheadCrunch.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBInclineSitup.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVLyingCrunch.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVLyingLegHipRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVCrunchLegRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVVerticalLegHipRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedLegRaiseCrunchPL.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVCrunchHipRaiseN.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVCrunchChestPad.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVPushCrunch.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedCrunchArmPad.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SLLegHipRaiseAbCoaster.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedCrunch.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedCrunchArmsForward.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSideLyingLegHipRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTCrunch.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WtCrunchChestX.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTInclineCrunchX.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTInclineSitupX.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WtInclineSitUp.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTOverheadBallCrunch.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WtInclineCrunch.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTBallCrunch.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/MBSitupChest.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTSitUp.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTSitUpX.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/Absolo.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTVerticalLegHipRaiseConvex.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WtVerticalLegHipRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTVerticalLegHipRaiseDipBar.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTLyingLegHipRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTHangingLegHipRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTSideCrunch.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTInclineTwistingCrunch.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBStandingTwistingCrunch.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedTwistingLegRaiseCrunch.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WtInclineLegHipRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WtInclineTwistingSitUp.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTTwistingCrunch.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTSideCrunchOnBall.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WtInclineTwistingSitUpChest.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CrunchArmsStraight.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWCrunchHead.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTTwistingSitUp.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWCrunchX.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTTwistingCrunchOnBall.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTTwistingSitUpX.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CrunchUps.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WtJacknifeSitUp.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWInclineCrunchHead.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWBallCrunch.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWCrunchBallX.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWInclineCrunchDown.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWHangingHipLegRaiseAbStrap.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWHangingStraightLegHipRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWInclineLegHipRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWLyingLegHipRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTVerticalLegHipRaisePB.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWLegHipRaiseExerciseBall.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWVerticalLegHipRaiseConvex.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWVertStraightLegHipRaiseDipBar.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWVerticalLegHipRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWInclineSitups.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWInclineSitupX.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWInvertedSitup.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWSitupNeck.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWSitupShoulder.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STJackknife.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWSitupArmsSides.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STPullThrough.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWVup.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/c3e400f67216ec0dad67111d3c0e6460.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STJackknifePike.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/FrontPlank.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/8c63d5a850f5767f5c7fde0838087164.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/31b12e7d0a1eda93f9822786a1ea0687.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/bd73ab9130ed13b74774ee88fc716f62.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(782,'Abdominal Vacuum','Sit, kneel, lie, or stand.','Pull navel into spine and hold.','image/AbdominalVacuum.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBSideBend.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBSeatedCrossArmTwist.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBSeatedTwistB.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBKneelingTwistingCrunch.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBSideCrunch.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVStandingTwistingCrunchSingle.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBRussianTwistBall.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBTwist.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBDownUpTwist.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBUpDownTwist.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSMSideBend.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBRussianTwistBall.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSideBend.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedSideLegRaiseCrunchOblique.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVKneelingTwist.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBSideBend.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DB45SideBend.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVTwist.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVLyingTwist.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVTwistGripless.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SLSideHipRaiseAbCoaster.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSideCrunch.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVStandingSideBend.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTLyingBentKneeTwist.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/EBLyingTwist.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/Wt45SideBend.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/MBRussianTwistBall.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTSideBendOnBall.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBOneArmStraightlegDeadlift.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWLyingBentKneeTwist.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWAngledSideBridgeRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWLyingStraightLegTwist1.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWSideBridgeRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWBentKneeSideBridgeRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/EBSideBend.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWExerciseBallPlankTwist.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWInclineTwistingCrunchNeck.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWTwistingSitupShoulders.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWInclineTwistingSitupChest.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWTwistingSitupNeck.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWInclineTwistingCrunchChest.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWTwistingSitupsNeck.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWTwistingCrunchBallHead.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWSideCrunchOneArm.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STSideBend.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWTwistingCrunchHead.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STSideBridge.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STTwist.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWSideCrunchOnBall.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STTwistingJackknife.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWTwistingCrunchChest.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/f606be3198fbe65c3c1136f9a1c73c4e.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/dad74d1575d3cc3c6a0ba8f858c3a909.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/0431eaab87f7ddf8f7f0806f3a80d345.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/190c5905bcd45a2c9a98a05429b1c8d6.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SidePlankElbow.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SidePlankElbowKnee.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBBackExtention.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBBentKneeGoodMorning.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBDeadlift.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBHyperExtention.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBSumoDeadlift.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBHyperextension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBBackExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBBlockPull.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBBlockSumoPull.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBDeficitDeadlift.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBRackPullLow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBStiffLegDeadlift.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBStiffLegDeadlift.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/TBDeadlift.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/TBStiffLegDeadlift.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBStraightLegDeadlift.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/TBStraightLegDeadlift.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBStraightLegDeadlift.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVDeadliftA.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBStraightLegDeadlift.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVKneelingBackExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVBackExtensionN.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVStiffLegDeadlift.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVStraightLegDeadlift.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SMDeadlift.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SMStiffLegDeadlift.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SMBentkneeGoodmorning.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SMStraightLegDeadlift.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTHyperExtension3.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTBackExtension2.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WtHyperExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SBHyperextention.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTBackExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWHyperextensionBallArmsCrossed.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWHyperextensionBallArmsUp.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWHyperextensionBall.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWBirdDog.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWAlternatingBirdDog.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWHangingHyperextension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWAlternBirdDogHyperExBall.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWHyperExtensionX.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWBirdDogHyperExBall.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/Superman.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/ContraLateralSuperman.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWHyperExtensionHead.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWHyperExtensionHips.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(906,'Cat Stretch','Kneel on mat or floor. Place hands shoulder width apart.','Flex spine by hunching back up. Hold stretch.','image/85a341a1a24012749fe473a1106c6984.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/RearInclineBridge.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(908,'Bent-over Cat Stretch','Bend over with hands just above bent knees.','Flex spine by hunching back up. Hold stretch.','image/b5749d48d4c58dbce20b4c492af82004.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CatMovement.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/ef0e66c71170773cedd6aaa015f334af.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/d852814763a527dc7329c405e0155655.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/PCLowBack8.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STHyperextension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/RearDeclineBridge.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/764b4335143f6a5842325004e906a3f8.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/a1bb91259e95d163254658e3d2d1d6a2.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(918,'Plow Stretch','Lie on back and lift legs and hip overhead.','Allow knees to drop toward floor to sides of head. Hold stretch.','image/81ec4b57c0839751142053459f41f27c.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBSeatedGoodMorning.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBSingleLegStiffLegDeadlift_.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBStraightBackStiffLegDeadlift.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBHipThrust.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBSingleLegSplitSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBLungeGlute.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBRearLunge.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBSingleLegSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBSideLunge.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBSquatPowerlift.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBWalkingLunge.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBSplitSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SBSquatC.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBFullSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SBSquatHandles.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBHackSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBBoxSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBZercherSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SBSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/TBSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBSquatChains.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBFrontSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBLateralStepUp.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBRearLunge.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBStepUp.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/TBStraightBackStiffLegDeadlift.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBSingleLegSplitSquatOneArm.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBLungeFar.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBRearLunge.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBSingleLegSplitSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBBarSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBLungeOneArm.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBStandingHipExtentionFM.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBLungeGlute.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBSquatBeltGlute.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBStandingHipExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBStraightBackStifLegDeadlift.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBStepUp.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBSingleLegStiffLegDeadlift.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBSingleLegSplitSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBRearLunge.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBLungeGlute.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBSideLunge.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBSplitSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBFrontSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBWalkingLunge.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBSingleLegSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVBentOverRearKickPL.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBLateralStepUp.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBStepDown.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBStepUp.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVHackPressWide.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LV45DegLegPressWide.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVStraightBackStiffLegDeadlift.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSingleLeg45DegLegPressGluteL.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSingleLegLyingLegPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVLyingLegPressH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVAlternatingLegPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSingleLegSeatedLegPress2.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedLegPresWideH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVLyingHipExtentionH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVPowerRunnerPL.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVLyingLegPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSMReverseLunge.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVRearLunge.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSingleLegSplitSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSMSingleLegSplitSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSplitSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSMReverseLunge.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVReverseHyperExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSquatGlutePL2.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSingleLegSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSlidingSplitSquatPL.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSMSplitSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVBentOverHipExtention.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVHackSquatGlute.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVKneelingHipExtensionRoller.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVFullSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVFrontSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVStandingHipExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVLyingHipExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVLyingHipExtensionN.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVVSquatGluteH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVAlternatingKneelingHipExtRoller.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVStandingHipExtension2.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVKneelingHipExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSingleLegPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedLegPressGlute.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSquatGlute.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVStandingSingleLegPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVBentOverRearKick.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVAlternatingLyingLegPressN.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVVSquatGluteFM.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSingleLegVSquatGlute.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SLSingleLeg45DegreeLegPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSingleLegSplitVSquatGlute.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SL45DegLegPressWide.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVAlternatingSingleLegSplitVSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SLAlternating45LegPressGlute.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SLSeatedHackPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SLLyingLegPressPLGlute.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SLLyingSingleLegPressPL.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SLLyingLegPressGlute.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SLSingleLegLyingLegPressGlute.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SLStandingHipExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SLSeatedLegPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SLVerticalLegPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SLVerticalSingleLegPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SLSingleLegHackSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SLHackSquatGlute.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SLRearLunge.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SLSquatGlute.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SLKneelingHipExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SMSingleLegSplitSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SMStrBackStiffLegDeadlift.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SMSplitSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SMSingleLegSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SMRearLunge.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SMHackSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SMSquatGlutes.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SMFrontSquatGlute.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTFrontSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTPistolSquatFarLeg.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WtReverseHyperExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SMSquatWide.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWReverseHyperExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWLunge.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWSupineSingleLegHipBridge.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWSingleLegBenchSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWRecliningSingleLegPistolSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWReverseHyperExtensionBall.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWSingleLegSquatLegBack.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWSingleLegSquatPistol_.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWSingleLegStiffLegDeadlift_.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWSplitSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWSingleLegSplitSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWStepDown.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWStepUp.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/ASSingleLegSquatPistolSelf.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWSingleLegSquatSelfAssistLeg.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWLateralStepUp.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/ASStepDownSelf.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/ASVerticalPoleRecliningPistolSquats.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STHipBridge.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWAlternatingStepDown.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/30ef1c4275fd2c4cfaeeeb0d8dd02dc8.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STSingleLegSplitSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STPistolSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/601b4db67e8babb5ca963871f631d7d4.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/PCGlute8.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/596a1075c3ba2b462bf9673be6694ae9.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/432530b69b09c56a29da7a22cc0e8d08.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/777cefd67a1e210b525426dcbbb4e67d.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STSplitSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/9272e1aa7795cd6d69eeec84008ae2bc.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/054db6718469ffb535af273b9a17cc98.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/136d4f4b1a6032c4ea14eea7427436c6.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/58ce4a640c1833fb4a7f4e526d24f68e.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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','image/accfd2eb6746dc16fab0a4b4236c178f.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/66e6dd21450b69f03bbc492bafd6961d.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/9571fa8af0d75d538ce0eaa398a67954.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/KneeHug.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WalkingAnkleGrab.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVLyingAbduction.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBSeatedHipInternalRotation.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBLyingHipAbduction.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVStandingHipAbduction.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBLyingInternalHipRotation.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBHipAbduction.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedHipAbductionH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedHipAbduction.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WtLyingHipAbductionRear.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWBentKneeSideBridgeHipAbduction.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STHipAbduction.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWAngledSideBridgeHipAbduction.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWSideBridgeHipAbduction.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/44b37e1aab348eb93bafb89080cea192.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/dab35e72da31b59d94623a0640b1926c.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/9b05f865c78abdf92295a759ccbceacd.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/7a5b64ba949b42e3a72e160f92c2f955.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/f66b7fdbd9075369b00d1c2e07a25a7e.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/4d256a130280ed534e17716ef102c5fd.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/9d854b4a82b260b4f3808518acb59a7b.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/d82859f560a16796c812d0a3e19e610e.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/b579aa254b37411388e062c381fe3de2.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/c16a7f0b42ff96059d3f4ef4fec6107b.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/8afc9098cde1ca0a010ebc1a6d9df8b8.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBLyingLegRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBLyingLegRaiseBench.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBLegRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBStraightLegRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/ASKneelingWheelRollout.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVHipFlexion.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBStandingStraightLegRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVVerticalLegRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WtDeclineSitUp.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTHangingLegRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVLyingLegRaiseN.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WtInclineStraightLegRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WtInclineLegRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTInclineStraightLegRaiseArmPads.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WtLyingLegRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WtHangingStraightLegRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WtSeatedLegRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WtLegRaiseArmsPads.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTVerticalLegRaisePB.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WtVerticalLegRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTRomanChairSitup.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWHangingLegRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWHangingStraightLegRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWHangingLegRaiseAbStraps.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWInclineLegRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWInclineStraightLegRaiseArmPads.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WtVerticalStraightLegRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWLegRaiseArmsPads.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWLyingLegRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWInclineStraightLegRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWSimultaneousAlternatingLegRaises.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWVerticalLegRaisePB.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWVerticalLegRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWLyingStraightLegRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWSeatedLegRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWScissorsKicks.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWSimultaneousAltStraightLegRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWLyingBentLegRaiseFloor.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWRomanChairBench.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWVerticalStraightLegRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWJackKnifeBall.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWWheelPike.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWDiscPike.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWWheelJackknife.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/5dec96831a3cb85fb04c2c192e699f8c.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/7e0821bc06976b844c669e3e4c5a5b8f.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/96a7d17ea46181c828f7be181175434e.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STMountainClimber.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/PCHipFlexors8.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STPike.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/99a9392130283de0ac595065ad21a3f0.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/1acff9d0c5a6577673d144f23b4eb36e.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/80b72e66f678fe1c106d3f51c422d3f3.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBSeatedHipExternalRotation.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/6814ad0e04c771d1ee315fbce56de8fa.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/c4ab7a481b05c4dc34fc5daa95e2f72d.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/PCPeriformis8.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/c49b018ec1b80983d7d0e8c378f751d1.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBLyingExternalHipRotation.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/3bc2bfb10ed4b6ecdd493e2dacf3dcc4.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/eb19a49ba33c584eb6e916e0faf87d3b.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/ff6c6e39d18091125b4ce72a9c98d2e9.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/b1562667bd54d0e5b91470e22135b530.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/cd0fa842e5cae16357d90b063855ba67.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBSideSplitSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBSquatHigh.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBThreeQuarterSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBStandingLegExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBStepDown.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVLegExtensionH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVAlternatingLegExtensionPL.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVStandingSingleLegPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVFrontSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVAlternatingLegExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVAlternatingLegExtensionUnilateral.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVLegExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVAlternatingLyingLegPressN.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SLSeatedHackPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SMStepDownQuad.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTSissySquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTSissySquatAp.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWSissySquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SissySquatAp.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWAlternatingStepDown.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/59c68250d668fa021bf4756f0d834455.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/f5d0adea1ef2e6f57ffb075662e5b805.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/8650332bac4a78ee12233f7f381967a7.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/PCQuadriceps8.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/2bfdf923775985d2c43a391f4974ac29.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/9e704875a65e1a3cec886b2d49e7212b.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/98c53b178d92d5e8dd7f7f0de119bc49.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/ad26b1a7a309d91749d8a2a408dc3bf0.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WalkingQuadStretch.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBGoodMorning.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBHipExtention.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBStraightBackStraightLegDeadlift.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/TBStrtBackStrtLegDeadlift.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBGluteHamRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBHamRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBHipExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBStraightBackStraightLegDeadlift.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBLyingLegCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBBentOverLegCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVKneelingLegCurlH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBStandingLegCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBStraightBackStraightLegDeadlift.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVLyingLegCurlH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVAlternatingLyingLegCurlH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVBentOverLegCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVLyingLegCurlRevHyperMachPL.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVStraightBackStraightLegDeadlift.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedLegCurlH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSingleLegSeatedLegCurlH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVAlternatingBentoverLegCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVKneelingLegCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVLyingLegCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVAlternatingLegCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVAlternatingStandingLegCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVStandingLegCurlonExt.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVStandingLegCurlHipMach.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedLegCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVStandingLegCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SMStrtBackStrtLegDeadlift.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SMGoodmorning.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVStraightLegLyingHipExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTHipExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTHipExtension2.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTHamRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWSingleLegHangingHamstringBridge.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWHangingHamstringBridge.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWHangingStraightHipLegCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWBallLegCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWWheelLegCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWHamRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWHangingLegCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/AsHamstringRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/ASHamstringRaiseSelf.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STHangingLegCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STHangingStraightHipLegCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STLegCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/d343918f30680d3ba702ed5afa8e8f06.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/f2666aa2a800fc2fe6dc36dee892faf1.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/ad3b598f490e6b8b995cb1340055bfb4.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STHamstringRunner2.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STHamstringCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/PCHamstring8.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(1539,'Seated Hamstring Stretch','Sit on floor or mat with knees straight.','Reach toward or beyond toes or bring torso toward legs. Hold stretch.','image/a422b3586f6873533c458303bf5eb3e4.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/57dc517f31121e83c57b6105b4a2ed96.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/5b56995e644b0d712ba1b67b2f8db277.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/7dc8003e4a2f4d121769db944044da4e.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/98bd050fcb0ea0c6998fb6de92b4d2e2.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LyingVerticalHamstringStretch.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(1545,'Standing Hamstring Stretch','Stand and bend over with knees straight.','Reach toward toes or floor or bring torso toward legs. Hold stretch.','image/91a7ef2697a2704d3c1a7d86d33aa879.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/a2bc88ca82564c16bdc1bc7f5d1c5ec0.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/ec248e61d0b6bbd886eeecbf4ef669b5.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/983c5c33d55888967b68cf2cb93db26c.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/2165e6dfac69ea56cf98ac8a23b1ccd7.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/f3a004d8d78c90f707422c91c7fefcf9.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SoldierKick.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SoldierKickIntermittent.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVStandingHipAdduction.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedHipAdduction.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBLyingHipAdduction.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVLyingAdduction.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WtLyingHipAdduction.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVHipAdductionH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBHipAdduction.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/e9193c7fc71f76f33a62c8b12d86ffa6.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/47cbe592bfdf56a5990239826ca76ad7.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/d183ca3634ed1a15ce4e86750dc12769.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/c048a0741ded61fa0dda2a92ef77b95c.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/495b5c75dd3cd406a20b460c59d9554b.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/2e5747087dc8bafff113bf6b80a668eb.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/PCGroin8.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/a27b9cca96504dabff67b776873d74e1.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/4a953ad380e1760b3e40028a0fdca304.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/34c9835255b7324f033509782d62fa19.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/517f3409f5a115f38d544800a5a1ffad.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/e6c0cc8d037dc5ec14ae367e397bf998.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/079df26ca2d76ff727a699a7a908aeb7.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/62c0cef1a94cf836a047d8c587d39a21.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/079df26ca2d76ff727a699a7a908aeb7.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/2fb387607233825c08f29be65f8612b2.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/95f43547ca7605ef764baea16ba1b9cc.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(1582,'Bent-over Adductor Magnus Stretch','Stand with one foot on chair or bench. Bend over.','Reach toward floor. Hold stretch.','image/81c5dc1f1d715c1f451f378fe03b9427.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/606b95ba87532c1a4ce991be5c7a6f0a.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/3e224ee57a9ee6e20edcd66d60ab1f14.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SFStandingCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBStandingCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBStandingCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBSingleLegCalfRaiseStirrup.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBSingleLegCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBSingleLegCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LV45DegCalfPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedCalfExtensionH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVDonkeyCalfRaisePL.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVCalfRaiseHackPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVVCalfRaisePL.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedCalfPressH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedCalfExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVStandingCalfRaisePL.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LV45DegreeCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVDonkeyCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVAlterSeatedCalfExtStrLeg.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedCalfPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedCalfExtensionBentKnees.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVStandingCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVStandingCalfRaiseBelt.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SL45DegAlternCalfPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SL45DegreeCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SL45DegCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVForwardAngledCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SLDonkeyCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/HackCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SLLyingCalfPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SLLyingCalfPressPL.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SL45DegCalfPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SLSeatedCalfPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SLVerticalCalfPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SMStandCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SMDonkeyCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SLStandingCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTSingleLegCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SLFrontCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WtDonkeyCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWSingleLegCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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:','image/2148f0312430e4335a53af5b850a45d7.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/a0e542a3b6a5a73791a91a9581d07a03.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/ASSingleLegCalfRaiseSelfPull.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/ASSingleLegCalfRaiseSelfFoot.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/72e16e3fd573bcad77e28416da6e9be4.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWSingleLegForwardAngledCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/ad4308a843d634d40a8009930853b52c.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/4ce1dd65b26d1b568fad686821e5f401.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/c9a754ea29b499f34e3b68b97a279195.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/0ab540f8815536fe46c029b18f1aee83.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedCalfRaiseExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SBSeatedCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVBentKneeSeatedCalfExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/d2e7c4e33d630b74700bd7539f474b55.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/10fd5c6c923c1b4f5aa350ab1ae994ff.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVAltBentKneeSeatedCalfExt.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedCalfRaiseH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SMSeatedCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/824cb4509c44d51beaef7d84c2bdd8dc.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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:','image/9ec26b4ff7c9ddfd683bc06970ad16e7.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/a76413823656f25915cf5e643ee9ee78.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/8102281e325bb7441e79e5f13d306c10.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/c779d0bfc0ebedf9c3a06e0392788c32.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/6735c80e66fbedcb5332915a053127b5.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/9fccaf897f02ea7677d2fd16d72d5716.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBSingleLegReverseCalfRaise1.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBReverseCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBSingleLegReverseCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedReverseCalfExtensionH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LV45ReverseCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SBReverseCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBReverseCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBReverseCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LV45DegReverseCalfPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVReverseVCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVReverseCalfRaisePL.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVReverseCalfExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVDonkeyReverseCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSSeatedTibiaRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVReverseCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSingleLegSeatedTibiaRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SL45ReverseCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVStandingTibiaRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SL45DegReverseCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SL45DegReverseCalfPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedReverseCalfPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SLDonkeyReverseCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SLLyingReverseCalfPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SL45ReverseCalfRaiseHackPressPL.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SLHackReverseCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SLStandingReverseCalfRaisePL.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SLLyingReverseCalfPressPL.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SLStandingReverseCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SMReverseCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBReverseCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SLSeatedReverseCalfPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/6f8914a8ffb2d11f8beb1556ceaeeffb.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/5cdf2831c84a57c531f5f6fbd084bcdf.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/54b780357143690c4f905794962e7e29.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(1686,'Lying Shin Stretch','Lie on one side. Grasp top forefoot behind.','Pull forefoot to lower back. Hold stretch. Repeat with opposite foot.','image/db4e77e1aa267a1a61f9d75ad4d27030.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWSingleLegReverseCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'); +/*!40000 ALTER TABLE `exercise_0` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `exercise_1` +-- + +DROP TABLE IF EXISTS `exercise_1`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `exercise_1` ( + `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` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'system' COMMENT 'Created by', + `created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Created time', + `modified_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT 'system' COMMENT 'Modified by', + `modified_time` datetime DEFAULT NULL COMMENT 'Modified time', + `version` int unsigned NOT NULL DEFAULT '0' COMMENT 'Optimistic locking', + `deleted` enum('N','Y') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'N' COMMENT 'Deleted. ''N'' - not deleted; ''Y'' - deleted', + PRIMARY KEY (`id`), + UNIQUE KEY `exercise_name_uindex` (`name`) +) ENGINE=InnoDB 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_1` +-- + +LOCK TABLES `exercise_1` WRITE; +/*!40000 ALTER TABLE `exercise_1` DISABLE KEYS */; +/*!40000 ALTER TABLE `exercise_1` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `exercise_classification_0` +-- + +DROP TABLE IF EXISTS `exercise_classification_0`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `exercise_classification_0` ( + `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` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'system' COMMENT 'Created by', + `created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Created time', + `modified_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT 'system' COMMENT 'Modified by', + `modified_time` datetime DEFAULT NULL COMMENT 'Modified time', + `version` int unsigned NOT NULL DEFAULT '0' COMMENT 'Optimistic locking', + `deleted` enum('N','Y') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'N' COMMENT 'Deleted. ''N'' - not deleted; ''Y'' - 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_0` +-- + +LOCK TABLES `exercise_classification_0` WRITE; +/*!40000 ALTER TABLE `exercise_classification_0` DISABLE KEYS */; +INSERT INTO `exercise_classification_0` 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','system','2021-06-27 13:38:55',NULL,NULL,0,'N'),(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','system','2021-06-27 13:38:55',NULL,NULL,0,'N'),(3,'Compound','An exercise that involves two or more joint movements.','system','2021-06-27 13:38:55',NULL,NULL,0,'N'),(4,'Isolated','An exercise that involves just one discernible joint movement.\nPull','system','2021-06-27 13:38:55',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:38:55',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:38:55',NULL,NULL,0,'N'),(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).','system','2021-06-27 13:38:55',NULL,NULL,0,'N'),(8,'Push','Movement away from center of body during the concentric contraction of the target muscle. Isolated movements are classified by their compound counterparts.','system','2021-06-27 13:38:55',NULL,NULL,0,'N'),(9,'Pull','Movement toward center of body during the concentric contraction of the target muscle. Isolated movements are classified by their compound counterparts.','system','2021-06-27 13:38:55',NULL,NULL,0,'N'); +/*!40000 ALTER TABLE `exercise_classification_0` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `exercise_classification_1` +-- + +DROP TABLE IF EXISTS `exercise_classification_1`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `exercise_classification_1` ( + `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` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'system' COMMENT 'Created by', + `created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Created time', + `modified_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT 'system' COMMENT 'Modified by', + `modified_time` datetime DEFAULT NULL COMMENT 'Modified time', + `version` int unsigned NOT NULL DEFAULT '0' COMMENT 'Optimistic locking', + `deleted` enum('N','Y') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'N' COMMENT 'Deleted. ''N'' - not deleted; ''Y'' - deleted', + PRIMARY KEY (`id`), + UNIQUE KEY `exercise_classification_name_uindex` (`name`) +) ENGINE=InnoDB 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_1` +-- + +LOCK TABLES `exercise_classification_1` WRITE; +/*!40000 ALTER TABLE `exercise_classification_1` DISABLE KEYS */; +/*!40000 ALTER TABLE `exercise_classification_1` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `exercise_comment_0` +-- + +DROP TABLE IF EXISTS `exercise_comment_0`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `exercise_comment_0` ( + `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` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'system' COMMENT 'Created by', + `created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Created time', + `modified_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT 'system' COMMENT 'Modified by', + `modified_time` datetime DEFAULT NULL COMMENT 'Modified time', + `version` int unsigned NOT NULL DEFAULT '0' COMMENT 'Optimistic locking', + `deleted` enum('N','Y') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'N' COMMENT 'Deleted. ''N'' - not deleted; ''Y'' - 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_0` +-- + +LOCK TABLES `exercise_comment_0` WRITE; +/*!40000 ALTER TABLE `exercise_comment_0` DISABLE KEYS */; +INSERT INTO `exercise_comment_0` 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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(3,3,'None','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(5,5,'See all muscle used in Lateral Flexion:','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(7,7,'See all muscle used in Lateral Flexion:','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(8,8,'None','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(11,11,'See all muscle used in Lateral Flexion:','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(12,12,'Head can be pulled toward back.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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:','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(16,16,'Exercise involves neck flexors as well as neck extensors. See controversial exercises.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(19,19,'No comment.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(20,20,'None','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(21,21,'None','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(24,25,'Exercise can also be performed by bending over with hands on bent knees.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(27,28,'See controversial exercises.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(29,29,'Also known as wrestler\'s bridge. See controversial exercises.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(30,30,'None.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(34,34,'Movement can also be performed on old fashioned incline bench without seat.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(38,38,'Exercise may also be performed seated, straddling bench or on weight chair with back support.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(47,46,'Wrists maintain their approximate position above each elbow throughout movement.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(48,48,'Movement can also be performed on old fashion incline bench without seat.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(49,49,'Internal rotation of far hip (opposite side with resistance) is much greater than spinal rotation.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(54,54,'See suggested mount and dismount when using heavy dumbbells.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(55,55,'Range of motion will be compromised if grip is too wide.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(57,57,'Range of motion will be compromised if grip is too wide.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(58,59,'Torso can lean away for balance as shown or torso can maintain upright posture. Also see Kettlebell Press.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(61,61,'Range of motion will be compromised if grip is too wide.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(62,62,'Pull head back slightly so bar does not head. Range of motion will be compromised if grip is too wide.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(63,63,'Keep back straight when lifting end of barbell from floor. Also see Lever One Arm Press for power.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(64,64,'Range of motion will be compromised if grip is too wide.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(65,65,'Range of motion will be compromised if grip is too wide.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(66,66,'Range of motion will be compromised if grip is too wide.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(67,67,'Range of motion will be compromised if grip is too wide.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(68,68,'Parallel grip can be used for variety or when flexibility does not permit standard overhand grip further back.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(69,69,'Range of motion will be compromised if grip is too wide.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(70,70,'Parallel grip can be used for variety or when flexibility does not permit standard overhand grip further back.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(71,71,'Pull head back slightly so bar does not head. Range of motion will be compromised if grip is too wide.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(72,72,'Range of motion will be compromised if grip is too wide.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(74,74,'Instead of scooting hips forward, hands can be eased backwards.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(75,75,'See PNF stretch techniques. Also see Seated Front Deltoid Stretch for similar static stretch.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(76,76,'A stationary bar can also be used instead of wall.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(78,78,'Keep knees and back straight. A slight curve (spinal flexion) is acceptable if hamstrings are tight.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(80,80,'A stationary bar can also be used instead of wall.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(82,82,'Bar can be received from barbell rack, standing behind bar\nmid-thigh height. See\nUpright\nRow Safety.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(83,84,'Bar can be recieved from barbell rack, standing behind bar mid-thigh height. See Upright Row Safety.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(84,86,'See Upright Row Safety.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(85,83,'Maintain fixed elbow position (10° to 30° angle) throughout exercise. Stirrup is raised by shoulder abduction, not external rotation.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(87,87,'See Upright Row Safety.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(89,89,'See Upright Row Safety.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(90,90,'See\nUpright Row Safety.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(91,91,'Maintain fixed slightly bent elbow position throughout exercise. Stirrup is raised by shoulder abduction, not external rotation.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(94,95,'See Upright\nRow Safety. Also see side view.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(98,98,'Setup requires attaching two stirrup attachments to single pulley cable. Also see Cable Upright Row with dual pulley. See Upright Row Safety.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(100,100,'Dumbbell is raised by shoulder abduction, not external rotation.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(102,102,'See Upright Row Safety.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(103,103,'When dumbbells are raised, wrist can be flexed, extended, or keep neutral.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(105,105,'See Upright Row Safety. Also see Seated Upright Row.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(106,107,'None.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(108,106,'If necessary, lean forward slightly to keep elbows directly lateral to body. Also see alternative machine.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(110,110,'If elbows drop much lower than wrists, front deltoids become primary mover instead of lateral deltoids.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(111,112,'Positioning arm on upper chest stretches rear deltoid. See Rear Delt Stretch.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(112,113,'None','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(114,115,'See Upright\nRow Safety.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(115,116,'See Upright Row Safety.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(117,118,'Upper arms should travel in horizontal path at shoulder height (not downward) to minimize Latissimus Dorsi involvement.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(118,119,'The relatively powerful Latissimus\nDorsi\n becomes involved:','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(120,121,'Flexion of wrist can allow for slightly greater range of movement near top, but this movement optional.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(121,122,'Upper arms should travel in horizontal path at shoulder height (not downward) to minimize Latissimus Dorsi involvement.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(122,123,'Elbow width is determined when elbows are raised at height of shoulders out to sides. The relatively powerful Latissimus Dorsi becomes involved:','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(124,125,'Upper arm should travel in horizontal path at shoulder height (not downward) to minimize Latissimus Dorsi involvement.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(125,126,'Dual pulley cables should be positioned approximately shoulder height or not much lower.\n\n\nThe relatively powerful Latissimus Dorsi becomes involved:','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(126,127,'The relatively powerful Latissimus Dorsi becomes involved:','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(127,128,'The relatively powerful Latissimus Dorsi becomes involved:','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(129,130,'Upper arm should travel in perpendicular path to torso to minimize Latissimus Dorsi involvement.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(130,131,'The relatively powerful Latissimus Dorsi becomes involved:','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(134,135,'Latissimus Dorsi becomes involved if elbows drop below shoulders.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(135,136,'The relatively powerful Latissimus Dorsi becomes involved:','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(136,137,'Maintain fixed elbow position straight or slightly bent and keep upper arm perpendicular to trunk throughout exercise.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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).','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(142,145,'None.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(145,147,'Upper arm should travel in perpendicular path to torso to minimize Latissimus Dorsi involvement.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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).','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(161,164,'Positioning arm on lower chest stretches side deltoid. See Side Delt Stretch.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(162,165,'None','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(167,171,'Maintain straight or nearly straight elbow position with elbows pointing outward throughout exercise.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(169,173,'See mount and dismount. Some assisted machines require you to kneel on pad. Also see Assisted Chest Dip.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(171,175,'See mount and dismount. Some assisted machines require you to stand on bar. Also see Assisted Chest Dip.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(172,177,'Grip can be slightly narrower than shoulder width but not too close. Also see Bench Press Analysis.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(178,182,'Let cable resistance pull arm back to maintain degree of shoulder flexion, dependent upon flexibility.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(179,183,'Keep elbow approximately same position throughout movement.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(181,185,'Let cable resistance pull arm back to maintain degree of shoulder flexion, dependent upon flexibility.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(182,186,'With arms fully extended, shoulders can be internally rotated between repetitions as needed to allow for relative release of tension in muscles.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(183,187,'Let cable attachment pull arm back to maintain full shoulder flexion.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(186,190,'The elbow can travel up slightly at top of motion. Stay close to cable to provide resistance at top of motion.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(187,191,'The elbow can travel up slightly at top of motion. Stay close to cable to provide resistance at top of motion.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(188,192,'If seat is positioned back behind pulleys as shown, bending forward can provide resistance at top of motion. See Angle of Pull.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(190,194,'Stand far enough away from pulley to keep cable taut in lowered position. Keep elbow approximately same position throughout movement.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(191,195,'The elbow can travel up slightly at top of motion. Stay close to cable to provide resistance at top of motion.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(192,197,'The elbow can travel up few inches at top of motion. Step close to cable to provide resistance at top of motion.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(193,196,'Keep back against back pad throughout exercise.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(197,201,'Let cable attachment pull arm back to maintain full shoulder flexion.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(198,202,'Let cable pull arm back to maintain full shoulder flexion. Also see exercise with Supinated Grip.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(201,205,'For greater range of motion, upper arm can be positioned with elbow slightly higher than shoulder. Also see Triceps Kickback Errors.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(202,206,'Keep elbows pointed up or just slightly back throughout movement.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(204,208,'Movement can also be performed on old fashioned incline bench without seat.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(206,210,'Let dumbbell pull back arm to maintain full shoulder flexion. Consider using seat with back support.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(208,212,'Grip can be slightly narrower than shoulder width but not too close. Also see Bench Press Analysis.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(209,213,'When finished, push foot lever down, release handles, then release foot lever.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(210,214,'When finished, push foot lever down, release handles, then release foot lever.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(211,215,'Also see movement performed on alternative machine.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(213,217,'Also see Lever Chest Dip.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(215,219,'See exercise on alternative machine. Also see Lever Chest Dip on machine facing away from fulcrum and Lever Chest Dip.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(217,222,'Also Lever Parallel Grip Incline Bench Press for upper chest.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(218,223,'If machine has secondary lever (as shown), elbows do not have to be exactly aligned with primary fulcrum.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(220,225,'This particular machine design is rare. See typical dip machines:​​​​','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(221,226,'Grip can be slightly narrower than shoulder width but not too close. Also see Bench Press Analysis.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(222,228,'Also see parallel grip Lever Triceps Dip and Lever Chest Dip.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(223,229,'Grip can be slightly narrower than shoulder width but not too close. Also see Bench Press Analysis.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(225,231,'Also see Weighted Chest Dips.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(228,234,'Bench height should allow for full range of motion.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(229,235,'Both upper and lower body must be kept straight throughout movement. See wider grip push-up.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(230,236,'Bench height should allow for full range of motion.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(231,237,'Also see Band-assisted Chest Dips.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(232,238,'Bench height should allow for full range of motion.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(233,240,'Also see Chest Dips.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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).','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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).','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(241,249,'None.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(242,250,'See Overhead Lat Stretch for similar exercise which can be performed with this stretch.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(258,267,'A stationary bar can also be used instead of wall.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(259,268,'Instead of scooting hips forward, hands can be eased backwards.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(263,270,'Easier','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(264,272,'None.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(265,273,'Participant\'s wrists must continue to face downward. See PNF stretch techniques. Also see Seated Biceps Stretch for similar static stretch.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(266,274,'A stationary bar can also be used instead of wall.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(291,299,'Body should be positioned to allow arm pit to rest near top of pad. Back of upper arm should remain on pad.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(300,308,'Seat should be adjusted to allow arm pit to rest near top of pad. Back of upper arm should remain on pad.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(304,312,'None.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(306,314,'Hand may be placed under wrist (as demonstrated) to offer stability and to maintain horizontal orientation of forearm.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(307,315,'Keep elbows approximately wrist height to maintain resistance through full range of motion.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(308,316,'If half loaded dumbbell is not available, one of two substitutes can be used.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(309,317,'None.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(310,319,'Also see muscles for finger articulations and thumb articulations.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(312,320,'Also see muscles for finger articulations and thumb articulations. See lever grip up close.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(313,321,'Keep forearms horizontal, flat on arm pads throughout exercise. See wrist curl up close.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(314,322,'None.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(315,323,'See sled grip up close. Also see muscles for finger articulations and thumb articulations.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(316,324,'Also see muscles for finger articulations and thumb articulations.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(317,325,'Also see muscles for finger articulations and thumb articulations.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(318,326,'Also see Lever Roller Wrist Extension.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(319,327,'None','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(320,329,'Keep arms straight.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(321,330,'None','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(322,331,'Keep elbows straight.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(323,332,'Exercise is performed on specialized piece of equipment which includes knobs at each end of wrist roller.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(324,328,'See exercise on alternative machine. Also see muscles for finger articulations and thumb articulations.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(325,333,'If half loaded dumbbell is not available, one of two substitutes can be used.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(326,334,'Do not allow elbows to rise.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(328,336,'None.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(330,338,'Keep elbows approximately wrist height to maintain resistance through full range of motion.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(331,340,'None.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(333,341,'Keep forearms horizontal, flat on arm pads throughout exercise. See reverse wrist curl up close.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(334,342,'Exercise is performed on specialized piece of equipment which includes knobs at each end of wrist roller.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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)','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(336,344,'Keep elbows straight.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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).','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(349,357,'Bench should be high enough to allow shoulders to stretch forward without barbell hitting floor.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(350,358,'Also see Cable Incline Row.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(354,361,'Allow scapula to articulate, but do not rotate torso.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(357,365,'Also see Cable One Arm Seated Row.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(365,373,'Also see Cable Seated Row.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(366,374,'Also see Cable Wide Grip Seated Row.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(369,377,'Also see Cable Standing Row with medium height pulley.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(370,378,'Bench should be high enough to allow shoulders to stretch forward without dumbbells hitting floor.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(378,386,'Unique apparatus designed and built by Tracey Cheuvront.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(380,389,'None.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(381,388,'None.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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).','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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).','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(390,399,'Seat or grip should be adjusted to allow wrists to follow elbows.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(391,401,'Seat should be adjusted to allow for full range of motion. Also see Lever Seated Hammer High Row.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(396,407,'Seat or grip should be adjusted to allow wrists to follow elbows.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(397,408,'Seat or grip should be adjusted to allow wrists to follow elbows.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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).','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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).','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(407,421,'None','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(409,424,'To intensify stretch, look up or to one side.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(418,432,'Muscles listed as Stabilizers become Synergists if spinal lateral flexion occurs during exercise.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(420,434,'Exercise can be performed with V-Bar or Multi-exercise Bar.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(422,436,'Stirrups are attached to split pulley.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(423,437,'Muscles listed as Stabilizers become Synergists if spinal lateral flexion occurs during exercise.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(424,438,'Range of motion will be compromised if grip is too wide.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(425,440,'Keep hips and torso in same position throughout movement.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(426,439,'Stirrups are attached to split pulley.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(427,441,'Parallel Grip Cable Attachment is shorter than Pro Lat Bar, yet longer than Close Grip Cable Attachments.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(428,442,'Stirrups are attached to split pulley.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(430,444,'Range of motion will be compromised if grip is too wide.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(431,445,'Stirrups are attached to split pulley.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(432,446,'Fix elbows approximately 30° throughout exercise. Also known as Straight Arm Pulldown.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(433,447,'If weight bottoms out at bottom of movement, attach cable on chain links nearer ends of dip belt.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(434,448,'If weight bottoms out at bottom, attach cable on chain links nearer ends of dip belt.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(439,453,'Range of motion will be compromised if grip is too wide.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(440,454,'Erector Spinae can become slightly engaged when torso arches back.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(442,456,'None','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(443,457,'Range of motion will be compromised if grip is too wide.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(444,458,'None','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(445,459,'See pad kick down on Hammer Machine. Also see movement on alternative machine.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(446,460,'Range of motion will be compromised if grip is too wide.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(447,462,'Actual range of motion is dependent upon individual shoulder flexibility.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(448,463,'Erector Spinae can become slightly engaged when torso arches back.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(449,464,'None','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(451,467,'See pad kick down on Hammer Machine. Also see exercise on alternative machine.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(454,471,'Also see Lever Pulldown.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(455,473,'Added weight can be placed on dip belt or dumbbell can be placed between ankles.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(456,474,'Added weight can be placed on dip belt or dumbbell can be placed between ankles.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(458,475,'See pad kick down on Hammer Machine.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(466,485,'Easier','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(468,487,'Range of motion will be compromised if grip is too wide.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(469,489,'Range of motion will be compromised if grip is too wide.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(471,490,'Special angled pull-up bar assembly is shown.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(472,491,'Range of motion will be compromised if grip is too wide.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(473,492,'Partner can assist as needed by pulling ankles or top feet up from behind. Also see self-assisted technique.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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 .','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(480,500,'Triceps become more involved if shoulders are keep close to wrists.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(483,502,'None.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(484,504,'To intensify stretch, look up or to one side.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(485,503,'Try to keep elbows nearly straight throughout exercise. Also known as Stability Ball Kneeling Rollout.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(486,505,'None.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(487,506,'Avoid overstressing neck anteriorly. See Overhead Triceps Stretch for similar exercise which can be performed with this stretch.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(488,507,'Allow shoulder to raise toward side of head for greater stretch.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(489,509,'Alternatively, forearms can be placed on wall, parallel with elbows pointed downward.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(490,508,'Allow shoulder to raise toward side of head for greater stretch.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(513,532,'None.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(515,534,'None','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(516,535,'None','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(517,536,'Throughout movement, keep bent elbow (approximately 90°) in front of body, chest or shoulder height.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(519,537,'Maintain elbow against side and fixed elbow position (90° angle) throughout exercise. Exercise may be performed standing with medium high pulley.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(521,541,'Throughout movement, keep bent elbow (approximately 90°) out to side, shoulder height.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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:','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(524,543,'Adjust lever and body orientation to achieve full range of motion.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(525,544,'Throughout movement, keep bent elbow (approximately 90°) out to side, shoulder height.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(528,547,'Lean torso toward positioned arm if stretch is not yet felt.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(529,548,'None.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(530,549,'Keep back straight.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(531,550,'None.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(532,551,'None.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(537,556,'Adjust lever and body orientation to achieve full range of motion.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(538,559,'Bent knees slightly so stretch is not limited by hamstring flexibility and to keep shoulder from being pushed forward.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(540,557,'Maintain elbow against side and fixed elbow position throughout exercise. Exercise may be performed standing with medium high / adjustable pulley','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(541,560,'None.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(544,563,'See mount and dismount. Some assisted machines require you to standing on bar. Also see Assisted Triceps Dip.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(548,567,'Range of motion will be compromised if grip is too wide.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(554,573,'Shoulders are kept internally rotated so elbows are pointing back\n\n\nand out to sides.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(560,579,'The effective range of motion of Pectoralis Major is only about half of what it is in non-twisting movement.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(561,580,'Range of motion will be compromised if grip is too wide. Also see Bench Press Analysis and Cable Bar Standing Bench Press.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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).','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(576,595,'Range of motion will be compromised if grip is too wide. Also see Bench Press Analysis.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(577,596,'Actual range of motion is dependent upon individual shoulder flexibility. Keep elbows fixed at small bend throughout exercise. See suggested mount & dismount.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(578,597,'Range of motion will be compromised if grip is too wide. Also see Bench Press Analysis.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(579,598,'Also see Lever Triceps Dip.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(580,599,'See Lever Chest Dip on machine facing fulcrum. Also see Lever Triceps Dip.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(581,602,'Range of motion will be compromised if grip is too wide. Also see Bench Press Analysis.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(582,603,'None.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(583,604,'None','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(585,606,'Shoulders should be internally rotated so elbows are pointing back at beginning of motion and outward at end of motion.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(586,608,'Shoulders should be internally rotated so elbows are pointing backwards at beginning of motion and forward at completion of motion.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(589,611,'Shoulders should be internally rotated so elbows are pointing downward at bottom of motion and outward at top of motion.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(590,612,'Range of motion will be compromised if grip is too wide. Also see Bench Press Analysis.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(591,613,'Range of motion will be compromised if grip is too wide.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(595,619,'Both the machine design and handle orientation are rare. See typical dip machines:','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(596,617,'Range of motion will be compromised if grip is too wide.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(597,621,'Range of motion will be compromised if grip is too wide. Also see Bench Press Analysis.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(598,620,'This particular machine design is rare. See typical dip machines:','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(600,624,'Also see Triceps Dip.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(602,625,'Also see Band-assisted Triceps Dip.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(603,628,'Both upper and lower body must be kept straight throughout movement. See close grip push-up. Also see push-up test calculator.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(606,629,'Added weight can be placed on dip belt or dumbbell can be placed between ankles. Also see Weighted Triceps Dip.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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).','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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).','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(614,637,'Hands may be clasped. Keep head upright.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(618,641,'Upper chest becomes more stretched with elbow lower. Lower chest and pectoralis minor become more stretched with elbow higher.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(619,642,'None','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(620,643,'Participants hands can be clasped. See PNF stretch techniques. Also see Behind Head Chest Stretch for similar static stretch.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(621,644,'Upper chest becomes more stretched with elbow lower. Lower chest and pectoralis minor become more stretched with elbow higher.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(623,646,'Range of motion will be compromised if grip is too wide.\n\n\nAlso see Bench Press Analysis.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(626,649,'Stirrup should follow slight arch pattern, above upper arm between elbow and chest at bottom, traveling inward over each shoulder at top.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(627,648,'Range of motion will be compromised if grip is too wide. Also see Bench Press Analysis.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(631,653,'None','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(633,657,'Range of motion will be compromised if grip is too wide.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(642,664,'Range of motion will be compromised if grip is too wide.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(643,668,'Elbows should be pointing downward at bottom of motion and outward on top of motion.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(644,666,'Range of motion will be compromised if grip is too wide.\n\n\nAlso see Bench Press Analysis.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(649,677,'None.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(651,679,'Keep arms straight throughout execution. For convenience, exercise can be performed immediately after warm up on Lever Incline Chest Press.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(652,680,'Keep arms straight throughout execution. For convenience, exercise can be performed immediately after warm up on Barbell Incline Chest Press.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(653,681,'Keep arms straight throughout execution. For convenience, exercise can be performed immediately after warm up on Dumbbell Incline Chest Press.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(654,685,'None','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(655,682,'Keep arms straight throughout execution. For convenience, exercise can be performed immediately after warm up on Cable Incline Chest Press.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(657,686,'Keep arms straight throughout execution. For convenience, exercise can be performed immediately after warm up on Smith Incline Chest Press.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(658,687,'Both upper and lower body must be kept straight throughout movement. See similar Push-up exercises targeting Pectoralis Major.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(663,693,'See Spot Reduction Myth. Also see movement performed on selectorized apparatus.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(666,696,'See Spot Reduction Myth. Also see movement performed on dedicated apparatus or plate loaded apparatus.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(668,698,'Keep arms fixed in position keeping them close to body throughout movement. See Spot Reduction Myth.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(671,701,'Lever fulcrum should be aligned with waist, not hips. See Spot Reduction Myth.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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:','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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:','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(675,707,'See Spot Reduction Myth.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(676,705,'Lever fulcrum should be aligned with waist, not hips. Some lever lying crunch machines have handles to sides. See Spot Reduction Myth.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(680,710,'See Spot Reduction Myth.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(681,711,'On some models, feet can be positioned behind pad under seat. See Spot Reduction Myth.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(685,716,'Taller individuals will place feet on floor, whereas shorter individuals will place feet on feet bars. See Spot Reduction Myth.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(686,715,'See Spot Reduction Myth.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(687,717,'See Spot Reduction Myth.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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).','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(708,738,'Seat can also be locked straight or to one side. See Spot Reduction Myth.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(716,745,'Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. See Spot Reduction Myth.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(717,747,'Leg elevation keeps pelvis tilted back, keeping low back on mat. See Spot Reduction Myth.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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 .','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(737,767,'See Arm Position During Waist Exercises.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(742,775,'None.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(746,778,'Muscles are exercised isometrically. Exercise can also be performed with straight supporting arms in pushup stance. Also see Spot Reduction Myth.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(748,780,'The lying (supine) stretch may be more appropriate for certain populations than other more advanced abdominal stretches .','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(749,781,'Pelvis may anteriorly rotate slightly.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(751,783,'See Spot Reduction Myth.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(755,788,'Keep stirrup attachment near side of shoulder with elbow down to side. See Spot Reduction Myth.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(761,794,'See Spot Reduction Myth.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(763,796,'Maintain shoulder fixed at approximately 90º so upper arm and upper back are perpendicular. See Spot Reduction Myth.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(765,800,'See Spot Reduction Myth.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(766,799,'See Spot Reduction Myth.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(767,801,'Keep arm holding dumbbell approximately vertical (below shoulder) throughout movement. See Spot Reduction Myth and Arm Position During Waist Exercises.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(768,802,'See Spot Reduction Myth.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(770,805,'See Spot Reduction Myth.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(772,809,'Stand on platform if lever is too high to allow for full range of movement. See Spot Reduction Myth.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(775,812,'See Spot Reduction Myth and Arm Position During Waist Exercises.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(781,827,'Maintain knee position throughout movement. See Spot Reduction Myth.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(782,829,'Maintain knee position throughout movement. See Spot Reduction Myth.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(785,832,'See alternative form. Also see Spot Reduction Myth and Arm Position During Waist Exercises.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(786,833,'See Spot Reduction Myth.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(793,841,'Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. See Spot Reduction Myth.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(801,848,'Leg elevation keeps pelvis tilted back keeping low back on mat. See Spot Reduction Myth.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(802,849,'Maintain 90° flexion in hip with both shoulders flat on floor.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(803,850,'Also see Pretzel Stretch for Hip Abductors for similar exercise which can be performed with this stretch.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(813,859,'Target muscle is exercised isometrically. Heavy barbell deadlifts significantly engages Latissmus Dorsi.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(821,868,'Target muscle is exercised isometrically\n\n\n. Throughout lift, keep hips low, shoulders high, arms and back straight.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(828,876,'Apparatus shown does not allow for full spinal flexion, only allowing for last half of spinal extension.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(836,886,'If weight is positioned behind head, neck extensors act as stabilizers:','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(838,889,'If weight is positioned behind head, neck extensors act as stabilizers:','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(844,896,'Lift leg and arm deliberately with no jerking. Also see Alternating Bird Dog.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(845,897,'Lift legs and arms deliberately with no jerking. Also see Bird Dog.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(847,899,'Lift leg and arm deliberately with no jerking. Also see Bird Dog (on exercise ball).','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(849,901,'Lift leg and arm deliberately with no jerking. Also see Alternating Bird Dog (one exercise ball).','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(850,902,'Lift legs and upper body slowly with no jerking or fast movements. Also see Contralateral Superman.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(851,903,'Lift legs and arms deliberately with no jerking. Also see bilateral movement: Superman.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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:','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(854,906,'Also see Cat Movement.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(855,907,'Muscles are exercised isometrically.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(856,908,'None','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(857,909,'Also see Cat Stretch.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(858,910,'Upper back can also be lifted off of floor to stretch Splenius and cervical portion of Erector Spinae.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(859,911,'Elbows can be lowered to floor.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(860,912,'None','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(862,915,'Muscles are exercised isometrically.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(863,916,'None','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(864,917,'Keep knees pointed same direction as toes. The Soleus may be slightly stretched before leaning back.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(865,918,'Avoid overstressing neck anteriorly.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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:','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(898,961,'Also see Cable Bent-over Hip Extension for more bent over posture.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(902,966,'Also see Cable Standing Hip Extension for more upright posture.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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 .','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(915,979,'None','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(928,995,'Adjust yoke position to accommodate near full range of motion without forcing hips to bend at waist. Also see Lever Sprint Machine.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(930,994,'Also see Lever Lying Hip Extension on selectorized machine.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(944,1011,'Exercise can be performed alternating between sides.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(946,1014,'None','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(948,1015,'Also Lever Lying Hip Extension on plate loaded machine and Lever Alternating Lying Hip Extension on another selectorized machine.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(951,1018,'Exercise can be performed with one leg, then other leg. See Lever Kneeling Hip Extension (roller pad).','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(952,1019,'Shorter individuals should stand on higher platform and may be bent over more.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(953,1020,'None','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(956,1024,'With greater resistances, more effort is required to pull on handle bars to keep body from rising upward.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(958,1025,'None','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(972,1039,'None','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(980,1048,'None','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(994,1064,'Also see Reverse Hyper-extension performed with exercise ball on bench.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(999,1069,'Since knee is initially bent significantly, hamstrings are not significantly involved. Also see Reverse Hyper-extension performed with exercise ball on bench.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1006,1076,'Keep torso upright during exercise. Knee of exercised leg should point same direction as foot. See front view.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1009,1079,'Supporting knee should point same direction as foot throughout movement.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1015,1085,'Notice knee extends out to side more than Lying Piriformis Stretch. Also see Lying Glute Stretch for alternative form.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1018,1090,'Ankle can be placed on top edge of shin pad if it can not be positioned above knee.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1019,1089,'See PNF stretch techniques. Also see Modified Lying Glute Stretch for similar static stretch.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1020,1091,'None.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1021,1092,'Allow hip to straighten toward floor for additional hip flexor stretch.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1022,1093,'This exercise can be performed if thigh can not be reached or held on to during Lying Glute Stretch.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1025,1096,'Spine may be kept straight. Pelvis may be tilted forward to intensify stretch.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1026,1097,'Spine may be kept straight. Pelvis may be tilted forward to intensify stretch.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1027,1098,'Spine may be kept straight. Pelvis may be tilted forward to intensify stretch.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1028,1099,'See PNF stretch techniques. The Seated Glute Stretch can also be performed as static stretch.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1029,1100,'Spine may be kept straight. Pelvis may be tilted forward to intensify stretch.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1030,1101,'Spine may be kept straight. Pelvis may be tilted forward to intensify stretch.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1031,1102,'This Dynamic Stretch can performed before athletic event or sports training session.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1032,1103,'This Dynamic Stretch can performed before athletic event or sports training session. Also stretches muscles involved in Foot Eversion.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1033,1104,'See ROM Criteria and Spot Reduction Myth.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1035,1106,'Do not allow upper hip to fall behind upper hip throughout movement. See ROM Criteria and Spot Reduction Myth.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1036,1107,'See ROM Criteria and Spot Reduction Myth.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1038,1110,'See ROM Criteria and Spot Reduction Myth.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1039,1109,'See ROM Criteria and Spot Reduction Myth.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1040,1111,'Mount machine with leg levers apart. Use lever to position legs together. See ROM Criteria and Spot Reduction Myth.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1041,1113,'Do not allow upper hip to fall behind upper hip throughout movement. See ROM Criteria and Spot Reduction Myth.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1044,1117,'Keep feet pointed forward. See ROM Criteria and Spot Reduction Myth.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1046,1124,'None.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1047,1125,'None.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1048,1126,'Hand nearest foot can be placed be behind on floor so torso can be reclined back slightly.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1050,1128,'Hand nearest foot can be placed be behind on floor so torso can be reclined back slightly.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1051,1130,'None','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1052,1131,'Keep hip of straight leg extended by leaning pelvis slightly forward.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1053,1132,'Also see Pretzel Stretch for Obliques for similar exercise which can be performed with this stretch.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1054,1133,'Alternatively, upper leg maybe extended straight inline with torso.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1055,1134,'Keep hip extended by leaning pelvis slightly forward and contracting Gluteus Maximus.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1056,1135,'None','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1059,1138,'See Spot Reduction Myth and Lower Ab Myth.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1101,1181,'Position foot further beyond knee if stretch is felt in Adductor Magnus of forward thigh.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1105,1185,'Keep foot away from fully extended hip to keep emphasis on Iliopsoas. See Lever Quadriceps Stretch for similar movement.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1111,1195,'Body may be reclined with support of arms as demonstrated (lower right). Also see Seated External Rotator Stretch.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1113,1199,'Low back may be stretched if hips and low back muscles are tight.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1116,1202,'Also see Lying External Rotator Stretch.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1118,1204,'Notice knee is keep over torso in contrast to Lying Glute Stretch. Also see Lying Piriformis Stretch for alternative form.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1119,1205,'Low back may be stretched if hips and low back muscles are tight.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1120,1206,'See PNF stretch techniques. A static Seated Piriformis Stretch can also be performed without assistance.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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:','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1126,1249,'Stabilizers may be used during heavy resistances to prevent body rising off of seat.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1127,1254,'Stabilizers may be used during heavy resistances to prevent body rising off of seat. Also see exercise perfomed on bilateral machine.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1128,1262,'With greater resistances, more effort is required to pull on handle bars to keep body from rising upward.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1130,1279,'Stabilizers may be used during heavy resistances to prevent body rising off of seat.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1131,1281,'Stabilizers may be used during heavy resistances to prevent body from rising off of seat. Also see exercises performed on bilateral machine.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1132,1285,'Stabilizers may be used during heavy resistances to prevent body rising off of seat.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1138,1324,'Keep waist and hips straight throughout exercise. Knees should point same direction as feet throughout movement. Also see Sissy Squat on apparatus.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1141,1466,'None.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1144,1469,'Rear knee should be completely flexed to keep emphasis on Quadriceps, particularly Rectus Femoris. See Lever Hip Flexor Stretch for similar movement.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1149,1474,'Pull knee in if it initially flares outward to side. This Dynamic Stretch can performed before athletic event or sports training session.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1154,1481,'Exercise can be performed without added weight until more resistance is needed.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1160,1491,'Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius allowing it to assist in knee flexion.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1169,1503,'Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius allowing it to assist in knee flexion.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1170,1500,'Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius allowing it to assist in knee flexion.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1188,1523,'Keep hips straight throughout movement. Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius allowing it to assist in knee flexion.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1199,1535,'See PNF stretch techniques. Also see Lying Hamstring Stretch for similar static stretch.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1206,1542,'Far leg can be straightened keep hip from rolling up or bent for comfort. Also see Lying Hamstring Stretch without towel.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1207,1543,'See PNF stretch techniques. Also see Seated Hamstring Stretch for similar static stretch.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1208,1545,'Keep knees straight by tensing Quadriceps. Spine may be kept straight. Pelvis may be tilted forward to intensify stretch.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1211,1548,'Keep rear knee straight. If necessary, tense Quadriceps. Spine may be kept straight. Pelvis may be tilted forward to intensify stretch.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1217,1553,'See Spot Reduction Myth.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1218,1554,'Mount machine with leg levers together. Use lever to extend legs apart. See Spot Reduction Myth.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1219,1558,'See Spot Reduction Myth and ROM Criteria.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1220,1556,'See Spot Reduction Myth.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1222,1559,'See Spot Reduction Myth.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1223,1557,'Mount machine with leg levers together. Use lever to extend legs apart. See Spot Reduction Myth.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1224,1564,'Arms can push legs down if preferred.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1225,1565,'See PNF stretch techniques. Also see Lying Wall Groin Stretch for similar static stretch.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1226,1566,'Push elbow into side of knee for added stretch.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1227,1567,'None.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1228,1569,'Keep back of legs against wall.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1229,1570,'Erector Spinae may be stretched if spine is flexed during stretch. Gluteus Maximus may be stretched if hip is flexed enough.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1230,1571,'emphasizes Adductor Magnus, ischial fibers by flexing hip.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1231,1572,'Keep legs and back straight.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1233,1574,'Keep feet flat on floor and knees pointed same direction as toes. emphasizes Adductor Magnus, ischial fibers by flexing hip.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1234,1575,'Keep back straight during stretch. Gracilis is stretched on straight leg.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1236,1577,'Adductor Magnus is stretched more as torso is lowered as in Seated Adductor Magnus Stretch.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1237,1576,'Place hands on hips or keep hand on elevated surface or other stable structure for balance.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1238,1579,'Back may be keep straight. Other heads of Hip Adductors can be stretched if legs are positioned out as far as possible.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1239,1580,'Other heads of hip adductors may be stretched if knee of upper leg travels out to side during stretch.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1241,1582,'None.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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).','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1243,1584,'Other heads of hip adductors can be stretched if knee of upper leg travels out to side during stretch.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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).','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1286,1627,'None.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1291,1632,'Soleus may also be stretched in forward bent leg if it is placed far enough back to be sufficiently stretched.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1292,1633,'None.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1293,1634,'None','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1294,1635,'Opposite leg may be keep bent or straight off to side.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1297,1638,'Movement is predominately Soleus. Gastrocnemius are in active insufficiency since knees are significantly bent. See Calf Exercise Analyses.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1299,1640,'Keep knee of stretched leg bent.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1300,1642,'Movement is predominately Soleus. Gastrocnemius are in active insufficiency since knees are significantly bent. See Calf Exercise Analyses.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1303,1644,'Soleus may also be stretched in forward bent leg if it is placed far enough back to be sufficiently stretched.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1304,1645,'None.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1306,1647,'None.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1307,1648,'Keep foot flat on floor.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1308,1649,'None.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1309,1650,'Opposite leg may be keep bent or straight off to side. Also see similar exercise Seated Plantar Fascia Stretch.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1310,1651,'Opposite leg may be keep bent or straight off to side.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1340,1681,'Keep knees and hips straight throughout exercise. See Dorsal Flexor Calf Exercise Analyses.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1342,1684,'None.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1343,1683,'See Standing Quadriceps Stretch for similar exercise which can be combined with this stretch and performed simultaneously.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1344,1685,'Do not allow feet to wing out and do not sit between ankles. Certain knee problems maybe aggravated by this stretch.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1345,1686,'See Lying (side) Quadriceps Stretch for similar exercise which can be combined with this stretch and performed simultaneously.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'); +/*!40000 ALTER TABLE `exercise_comment_0` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `exercise_comment_1` +-- + +DROP TABLE IF EXISTS `exercise_comment_1`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `exercise_comment_1` ( + `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` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'system' COMMENT 'Created by', + `created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Created time', + `modified_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT 'system' COMMENT 'Modified by', + `modified_time` datetime DEFAULT NULL COMMENT 'Modified time', + `version` int unsigned NOT NULL DEFAULT '0' COMMENT 'Optimistic locking', + `deleted` enum('N','Y') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'N' COMMENT 'Deleted. ''N'' - not deleted; ''Y'' - 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_1` +-- + +LOCK TABLES `exercise_comment_1` WRITE; +/*!40000 ALTER TABLE `exercise_comment_1` DISABLE KEYS */; +/*!40000 ALTER TABLE `exercise_comment_1` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `exercise_related_classification_0` +-- + +DROP TABLE IF EXISTS `exercise_related_classification_0`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `exercise_related_classification_0` ( + `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_0` +-- + +LOCK TABLES `exercise_related_classification_0` WRITE; +/*!40000 ALTER TABLE `exercise_related_classification_0` DISABLE KEYS */; +INSERT INTO `exercise_related_classification_0` 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_0` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `exercise_related_classification_1` +-- + +DROP TABLE IF EXISTS `exercise_related_classification_1`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `exercise_related_classification_1` ( + `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 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_1` +-- + +LOCK TABLES `exercise_related_classification_1` WRITE; +/*!40000 ALTER TABLE `exercise_related_classification_1` DISABLE KEYS */; +/*!40000 ALTER TABLE `exercise_related_classification_1` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `exercise_related_muscle_0` +-- + +DROP TABLE IF EXISTS `exercise_related_muscle_0`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `exercise_related_muscle_0` ( + `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_0` +-- + +LOCK TABLES `exercise_related_muscle_0` WRITE; +/*!40000 ALTER TABLE `exercise_related_muscle_0` DISABLE KEYS */; +INSERT INTO `exercise_related_muscle_0` 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_0` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `exercise_related_muscle_1` +-- + +DROP TABLE IF EXISTS `exercise_related_muscle_1`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `exercise_related_muscle_1` ( + `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 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_1` +-- + +LOCK TABLES `exercise_related_muscle_1` WRITE; +/*!40000 ALTER TABLE `exercise_related_muscle_1` DISABLE KEYS */; +/*!40000 ALTER TABLE `exercise_related_muscle_1` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `kinesiology_glossary_0` +-- + +DROP TABLE IF EXISTS `kinesiology_glossary_0`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `kinesiology_glossary_0` ( + `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` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'system' COMMENT 'Created by', + `created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Created time', + `modified_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT 'system' COMMENT 'Modified by', + `modified_time` datetime DEFAULT NULL COMMENT 'Modified time', + `version` int unsigned NOT NULL DEFAULT '0' COMMENT 'Optimistic locking', + `deleted` enum('N','Y') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'N' COMMENT 'Deleted. ''N'' - not deleted; ''Y'' - 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_0` +-- + +LOCK TABLES `kinesiology_glossary_0` WRITE; +/*!40000 ALTER TABLE `kinesiology_glossary_0` DISABLE KEYS */; +/*!40000 ALTER TABLE `kinesiology_glossary_0` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `kinesiology_glossary_1` +-- + +DROP TABLE IF EXISTS `kinesiology_glossary_1`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `kinesiology_glossary_1` ( + `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` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'system' COMMENT 'Created by', + `created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Created time', + `modified_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT 'system' COMMENT 'Modified by', + `modified_time` datetime DEFAULT NULL COMMENT 'Modified time', + `version` int unsigned NOT NULL DEFAULT '0' COMMENT 'Optimistic locking', + `deleted` enum('N','Y') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'N' COMMENT 'Deleted. ''N'' - not deleted; ''Y'' - 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_1` +-- + +LOCK TABLES `kinesiology_glossary_1` WRITE; +/*!40000 ALTER TABLE `kinesiology_glossary_1` DISABLE KEYS */; +/*!40000 ALTER TABLE `kinesiology_glossary_1` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `muscle_0` +-- + +DROP TABLE IF EXISTS `muscle_0`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `muscle_0` ( + `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` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'system' COMMENT 'Created by', + `created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Created time', + `modified_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT 'system' COMMENT 'Modified by', + `modified_time` datetime DEFAULT NULL COMMENT 'Modified time', + `version` int unsigned NOT NULL DEFAULT '0' COMMENT 'Optimistic locking', + `deleted` enum('N','Y') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'N' COMMENT 'Deleted. ''N'' - not deleted; ''Y'' - 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_0` +-- + +LOCK TABLES `muscle_0` WRITE; +/*!40000 ALTER TABLE `muscle_0` DISABLE KEYS */; +INSERT INTO `muscle_0` VALUES (1,'Adductors','Inner Thigh',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(2,'Biceps Brachii','Arm (Front),Biceps,Biceps Cubiti',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(3,'Brachialis','Arm (Side),Lower Biceps',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(4,'Brachioradialis','Forearm (Upper-outer),Supinator longus (out dated)',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(5,'Deltoid',NULL,NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(6,'Anterior','Shoulder (Front),Front Delts',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(7,'Lateral','Shoulder (Side),Side Delts',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(8,'Posterior','Shoulder (Rear),Rear Delts',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(9,'Deep Hip External Rotators','Six Deep Lateral Rotator Hip Muscles',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(10,'Erector Spinae','Lower Back',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(11,'Gastrocnemius','Calf',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(12,'Gluteus',NULL,NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(13,'Maximus','Butt,Hips (Rear),Glutes',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(14,'Medius','Hip,Hip Abductor',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(15,'Minimus','Hip,Hip Abductor',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(16,'Gracilis','Inner Thigh,Hip Adductor',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(17,'Hamstrings','Thigh (Rear)',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(18,'Iliopsoas','Hip,Hip Flexors',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(19,'Infraspinatus','Rotatory Cuff,Back',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(20,'Latissimus Dorsi','Back (Middle, Outer),Lats',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(21,'Levator Scapulae','Shoulder (Upper),Neck (Rear)',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(22,'Obliques','Hips (Upper),Waist (Sides),Obliques',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(23,'Pectineous','Thigh (upper),Hip Flexors',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(24,'Pectoralis Major',NULL,NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(25,'Clavicular Head','Chest (Upper),Upper Pecs',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(26,'Sternal Head','Chest,Lower Pecs',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(27,'Teres',NULL,NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(28,'Major','Back (Outer),Lats little helper',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(29,'Minor','Rotatory Cuff,Back',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(30,'Tibialis Anterior','Shin,Tibias,Tibialis Anticus',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(31,'Transverse Abdominus','Transverse Abs',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(32,'Trapezius',NULL,NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(33,'Lower Fibers','Back (Middle),Lower Traps',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(34,'Middle Fibers','Back (Upper),Traps',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(35,'Upper Fibers','Shoulder (Upper),Upper Traps',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(36,'Triceps Brachii','Arm (Rear),Triceps',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(37,'Wrist',NULL,NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(38,'Extensors','Forearm (outer or back),Hand Extensors',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(39,'Flexors','Forearm (Inner),Hand Flexors',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(40,'Pectoralis Minor','Chest,Shoulder',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(41,'Popliteus','Knee flexor',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(42,'Quadratus Lumborum','Deep Low Back Lateral Flexor',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(43,'Quadriceps','Thigh (Front),Quads',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(44,'Rectus Abdominis','Waist (Belly),Abdominal,Abs',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(45,'Rhomboids','Back (Middle)',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(46,'Sartorius','Thigh (Inner),Tailor\'s muscle,Longest muscle in body',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(47,'Serratus Anterior','Serratus Magnus,Boxer\'s Muscle',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(48,'Soleus','Calf,Soleus',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(49,'Splenius','Neck (Rear),Neck Extensors',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(50,'Sternocleidomastoid','Sterno-mastoid,Neck (Front / Sides),Neck Flexors',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(51,'Subscapularis','Rotator Cuff,Back',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(52,'Supraspinatus','Rotatory Cuff,Shoulder',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(53,'Tensor Fasciae Latae','Hip,Hip Abductor/Flexor,Tensor Fasciae Femoris',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'); +/*!40000 ALTER TABLE `muscle_0` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `muscle_1` +-- + +DROP TABLE IF EXISTS `muscle_1`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `muscle_1` ( + `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` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'system' COMMENT 'Created by', + `created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Created time', + `modified_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT 'system' COMMENT 'Modified by', + `modified_time` datetime DEFAULT NULL COMMENT 'Modified time', + `version` int unsigned NOT NULL DEFAULT '0' COMMENT 'Optimistic locking', + `deleted` enum('N','Y') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'N' COMMENT 'Deleted. ''N'' - not deleted; ''Y'' - deleted', + PRIMARY KEY (`id`), + UNIQUE KEY `muscle_name_uindex` (`name`) +) ENGINE=InnoDB 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_1` +-- + +LOCK TABLES `muscle_1` WRITE; +/*!40000 ALTER TABLE `muscle_1` DISABLE KEYS */; +/*!40000 ALTER TABLE `muscle_1` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `muscle_image_0` +-- + +DROP TABLE IF EXISTS `muscle_image_0`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `muscle_image_0` ( + `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` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'system' COMMENT 'Created by', + `created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Created time', + `modified_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT 'system' COMMENT 'Modified by', + `modified_time` datetime DEFAULT NULL COMMENT 'Modified time', + `version` int unsigned NOT NULL DEFAULT '0' COMMENT 'Optimistic locking', + `deleted` enum('N','Y') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'N' COMMENT 'Deleted. ''N'' - not deleted; ''Y'' - 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_0` +-- + +LOCK TABLES `muscle_image_0` WRITE; +/*!40000 ALTER TABLE `muscle_image_0` DISABLE KEYS */; +INSERT INTO `muscle_image_0` VALUES (1,1,'image/AdductorAnteriorSmall.png','Adductors','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(2,1,'image/AdductorPosteriorSmall.png','Adductors','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(3,2,'image/BicepsInsideSmall.gif','Biceps Brachii','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(4,3,'image/BrachialisInsideSmall.gif','Brachialis','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(5,3,'image/BrachialisUpperArmSegmentSmall.gif','Brachialis','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(6,4,'image/BrachioradialisoutsideSmall.png','Brachioradialis','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(7,6,'image/DeltoidAnteriorFront.gif','Anterior','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(8,7,'image/DeltoidLateralBack.gif','Lateral','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(9,8,'image/DeltoidPosteriorBack.gif','Posterior','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(10,9,'image/DeepHipRotators.gif','Deep Hip External Rotators','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(11,10,'image/96a0e9eeb4ad8418eff179a9c59bc713.png','Erector Spinae','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(12,10,'image/ErectorSpinaeCrossSection.gif','Erector Spinae','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(13,11,'image/GastrocnemiusLateral.gif','Gastrocnemius','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(14,13,'image/80a4754b254e159c4cd5474b063d096e.png','Maximus','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(15,14,'image/GluteusMediusPosterior.gif','Medius','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(16,15,'image/bf94c6ef8b7ca1c02323779e1fe3b837.png','Minimus','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(17,15,'image/GluteusMinimusSide.gif','Minimus','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(18,16,'image/69c90b7fb98b9c863015a90b3ff3173c.png','Gracilis','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(19,17,'image/1c94da8f4db345d0343c3db475d2d84d.png','Hamstrings','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(20,18,'image/99beae51baa19dc3d8ef62c04b469133.png','Iliopsoas','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(21,18,'image/ed4205586bfaf0b1603ad8e70dae6706.png','Iliopsoas','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(22,19,'image/3e3d3ded3335c56a7f932c6e38a3ed53.png','Infraspinatus','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(23,20,'image/67f687e9482a2a6bca9a38544e45d31c.png','Latissimus Dorsi','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(24,20,'image/LatSmall.png','Latissimus Dorsi','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(25,21,'image/5083bc6f81d7a598832a5cb53340fb4a.png','Levator Scapulae','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(26,22,'image/1d421470bb1b8650b68a055d15704abe.png','Obliques','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(27,22,'image/ObliqueCrossSection.gif','Obliques','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(28,23,'image/52d884ea5ad22f197b0335468e4ca6e7.png','Pectineous','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(29,25,'image/11a9ea1af4fa3e206ec2eecc7e60100e.png','Clavicular Head','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(30,25,'image/0e1ed54440e102b3ec973207ea371964.png','Clavicular Head','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(31,26,'image/5a6b344e7b8a52c715adf8b091461f7d.png','Sternal Head','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(32,26,'image/PectoralAttachmentSmall.png','Sternal Head','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(33,28,'image/TeresMajorSmall.png','Major','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(34,29,'image/TeresMinorSmall.png','Minor','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(35,30,'image/TibialisAnteriorSmall.png','Tibialis Anterior','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(36,31,'image/TransverseAbdominisCrossSectionNew.jpg','Transverse Abdominus','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(37,33,'image/TrapLowerHalfSmall.png','Lower Fibers','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(38,34,'image/TrapMiddleHalfSmall.png','Middle Fibers','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(39,35,'image/TrapUpperHalfSmall.png','Upper Fibers','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(40,36,'image/TricepsOutsideSmall.gif','Triceps Brachii','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(41,38,'image/WristExtensorsSupSmall.gif','Extensors','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(42,39,'image/WristFlexorNeutSmall.gif','Flexors','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(43,40,'image/e7cda9218a2e2c84a31a7ca32e98c3a9.png','Pectoralis Minor','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(44,41,'image/PopliteusSmall.png','Popliteus','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(45,42,'image/QuadratusLumborumSmall.png','Quadratus Lumborum','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(46,43,'image/QuadricepsAnteriorSmall.png','Quadriceps','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(47,44,'image/RectusAbdominisWaistSmall.png','Rectus Abdominis','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(48,44,'image/RectusAbdominalCrossSectionNew.jpg','Rectus Abdominis','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(49,45,'image/RhomboidsHalfSmall.png','Rhomboids','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(50,46,'image/SartoriusAnteriorSmall.png','Sartorius','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(51,47,'image/SerratusAnteriorSideSmall.png','Serratus Anterior','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(52,47,'image/SerratusAnteriorPullSmall.png','Serratus Anterior','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(53,47,'image/SerratusScapulaTransverseCu.gif','Serratus Anterior','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(54,48,'image/SoleusLateralSmall.png','Soleus','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(55,49,'image/SpleniusSpineSmall.png','Splenius','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(56,49,'image/SpeniusHalfSmall.png','Splenius','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(57,50,'image/SternoSideSmall.png','Sternocleidomastoid','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(58,51,'image/SubscapularisSmall.png','Subscapularis','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(59,52,'image/SupraspinatusBackSmall.png','Supraspinatus','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(60,53,'image/TensorFasciaeLataeASmall.png','Tensor Fasciae Latae','system','2021-06-27 13:54:16',NULL,NULL,0,'N'); +/*!40000 ALTER TABLE `muscle_image_0` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `muscle_image_1` +-- + +DROP TABLE IF EXISTS `muscle_image_1`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `muscle_image_1` ( + `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` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'system' COMMENT 'Created by', + `created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Created time', + `modified_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT 'system' COMMENT 'Modified by', + `modified_time` datetime DEFAULT NULL COMMENT 'Modified time', + `version` int unsigned NOT NULL DEFAULT '0' COMMENT 'Optimistic locking', + `deleted` enum('N','Y') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'N' COMMENT 'Deleted. ''N'' - not deleted; ''Y'' - deleted', + PRIMARY KEY (`id`), + UNIQUE KEY `muscle_image_image_path_uindex` (`image_path`) +) ENGINE=InnoDB 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_1` +-- + +LOCK TABLES `muscle_image_1` WRITE; +/*!40000 ALTER TABLE `muscle_image_1` DISABLE KEYS */; +/*!40000 ALTER TABLE `muscle_image_1` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `permission_0` +-- + +DROP TABLE IF EXISTS `permission_0`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `permission_0` ( + `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` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'system' COMMENT 'Created by', + `created_time` datetime NOT NULL COMMENT 'Created time', + `modified_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT 'system' COMMENT 'Modified by', + `modified_time` datetime DEFAULT NULL COMMENT 'Modified time', + `version` int unsigned NOT NULL DEFAULT '0' COMMENT 'Optimistic locking', + `deleted` enum('N','Y') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'N' COMMENT 'Deleted. ''N'' - not deleted; ''Y'' - deleted', + 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_0` +-- + +LOCK TABLES `permission_0` WRITE; +/*!40000 ALTER TABLE `permission_0` DISABLE KEYS */; +/*!40000 ALTER TABLE `permission_0` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `permission_1` +-- + +DROP TABLE IF EXISTS `permission_1`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `permission_1` ( + `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` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'system' COMMENT 'Created by', + `created_time` datetime NOT NULL COMMENT 'Created time', + `modified_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT 'system' COMMENT 'Modified by', + `modified_time` datetime DEFAULT NULL COMMENT 'Modified time', + `version` int unsigned NOT NULL DEFAULT '0' COMMENT 'Optimistic locking', + `deleted` enum('N','Y') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'N' COMMENT 'Deleted. ''N'' - not deleted; ''Y'' - deleted', + 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_1` +-- + +LOCK TABLES `permission_1` WRITE; +/*!40000 ALTER TABLE `permission_1` DISABLE KEYS */; +/*!40000 ALTER TABLE `permission_1` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `quartz_job_configuration_0` +-- + +DROP TABLE IF EXISTS `quartz_job_configuration_0`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `quartz_job_configuration_0` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'The primary key ID', + `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'Name of job', + `group` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'Group of job', + `service_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'Service name, equal to artifact-id', + `invoke_target` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'Invoke target', + `cron_expression` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'Cron Expressions', + `misfire_policy` tinyint NOT NULL COMMENT 'Trigger''s misfire policy', + `concurrent` tinyint unsigned NOT NULL DEFAULT '0' COMMENT 'Concurrent. true(1): is concurrent, false(0): not concurrent', + `description` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'Description', + `status` tinyint NOT NULL COMMENT 'Status', + `created_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'system' COMMENT 'Created by', + `created_time` datetime NOT NULL COMMENT 'Craeted time', + `modified_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'system' COMMENT 'Modified by', + `modified_time` datetime DEFAULT NULL COMMENT 'Modified time', + `version` int unsigned NOT NULL DEFAULT '0' COMMENT 'Optimistic locking', + `deleted` enum('N','Y') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'N' COMMENT 'Deleted. ''N'' - not deleted; ''Y'' - deleted', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='Quartz Job Configuration'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `quartz_job_configuration_0` +-- + +LOCK TABLES `quartz_job_configuration_0` WRITE; +/*!40000 ALTER TABLE `quartz_job_configuration_0` DISABLE KEYS */; +INSERT INTO `quartz_job_configuration_0` VALUES (1,'greeting-schedule-job','auth-center-default-group','auth-center','greetingBean.hello()','0 0/1 * 1/1 * ? *',0,0,'Greeting task. It\'s a demo Quartz schedule job.',0,'system','2021-09-26 00:20:37',NULL,NULL,0,'N'),(2,'greeting-schedule-job','maf-mis-default-group','maf-mis','greetingBean.hello()','0 0/1 * 1/1 * ? *',0,0,'Greeting task. It\'s a demo Quartz schedule job.',0,'system','2021-09-26 00:20:37',NULL,NULL,0,'N'); +/*!40000 ALTER TABLE `quartz_job_configuration_0` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `quartz_job_configuration_1` +-- + +DROP TABLE IF EXISTS `quartz_job_configuration_1`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `quartz_job_configuration_1` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'The primary key ID', + `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'Name of job', + `group` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'Group of job', + `service_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'Service name, equal to artifact-id', + `invoke_target` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'Invoke target', + `cron_expression` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'Cron Expressions', + `misfire_policy` tinyint NOT NULL COMMENT 'Trigger''s misfire policy', + `concurrent` tinyint unsigned NOT NULL DEFAULT '0' COMMENT 'Concurrent. true(1): is concurrent, false(0): not concurrent', + `description` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'Description', + `status` tinyint NOT NULL COMMENT 'Status', + `created_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'system' COMMENT 'Created by', + `created_time` datetime NOT NULL COMMENT 'Craeted time', + `modified_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'system' COMMENT 'Modified by', + `modified_time` datetime DEFAULT NULL COMMENT 'Modified time', + `version` int unsigned NOT NULL DEFAULT '0' COMMENT 'Optimistic locking', + `deleted` enum('N','Y') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'N' COMMENT 'Deleted. ''N'' - not deleted; ''Y'' - deleted', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='Quartz Job Configuration'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `quartz_job_configuration_1` +-- + +LOCK TABLES `quartz_job_configuration_1` WRITE; +/*!40000 ALTER TABLE `quartz_job_configuration_1` DISABLE KEYS */; +/*!40000 ALTER TABLE `quartz_job_configuration_1` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `related_muscle_0` +-- + +DROP TABLE IF EXISTS `related_muscle_0`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `related_muscle_0` ( + `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_0` +-- + +LOCK TABLES `related_muscle_0` WRITE; +/*!40000 ALTER TABLE `related_muscle_0` DISABLE KEYS */; +INSERT INTO `related_muscle_0` 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_0` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `related_muscle_1` +-- + +DROP TABLE IF EXISTS `related_muscle_1`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `related_muscle_1` ( + `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 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_1` +-- + +LOCK TABLES `related_muscle_1` WRITE; +/*!40000 ALTER TABLE `related_muscle_1` DISABLE KEYS */; +/*!40000 ALTER TABLE `related_muscle_1` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `role_0` +-- + +DROP TABLE IF EXISTS `role_0`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `role_0` ( + `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` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'system' COMMENT 'Created by', + `created_time` datetime NOT NULL COMMENT 'Created time', + `modified_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT 'system' COMMENT 'Modified by', + `modified_time` datetime DEFAULT NULL COMMENT 'Modified time', + `version` int unsigned NOT NULL DEFAULT '0' COMMENT 'Optimistic locking', + `deleted` enum('N','Y') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'N' COMMENT 'Deleted', + 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_0` +-- + +LOCK TABLES `role_0` WRITE; +/*!40000 ALTER TABLE `role_0` DISABLE KEYS */; +INSERT INTO `role_0` VALUES (1,'admin','M&F system admin','system','2020-05-09 16:18:51','system','2020-05-09 16:18:45',0,'N'),(2,'guest','Guest for the system','system','2021-06-29 11:37:33',NULL,NULL,0,'N'); +/*!40000 ALTER TABLE `role_0` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `role_1` +-- + +DROP TABLE IF EXISTS `role_1`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `role_1` ( + `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` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'system' COMMENT 'Created by', + `created_time` datetime NOT NULL COMMENT 'Created time', + `modified_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT 'system' COMMENT 'Modified by', + `modified_time` datetime DEFAULT NULL COMMENT 'Modified time', + `version` int unsigned NOT NULL DEFAULT '0' COMMENT 'Optimistic locking', + `deleted` enum('N','Y') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'N' COMMENT 'Deleted', + PRIMARY KEY (`id`), + UNIQUE KEY `name_UNIQUE` (`name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Role.'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `role_1` +-- + +LOCK TABLES `role_1` WRITE; +/*!40000 ALTER TABLE `role_1` DISABLE KEYS */; +/*!40000 ALTER TABLE `role_1` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `role_permission_0` +-- + +DROP TABLE IF EXISTS `role_permission_0`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `role_permission_0` ( + `role_id` bigint NOT NULL COMMENT 'Primary key of role', + `permission_id` bigint unsigned 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_0` +-- + +LOCK TABLES `role_permission_0` WRITE; +/*!40000 ALTER TABLE `role_permission_0` DISABLE KEYS */; +/*!40000 ALTER TABLE `role_permission_0` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `role_permission_1` +-- + +DROP TABLE IF EXISTS `role_permission_1`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `role_permission_1` ( + `role_id` bigint NOT NULL COMMENT 'Primary key of role', + `permission_id` bigint unsigned 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_1` +-- + +LOCK TABLES `role_permission_1` WRITE; +/*!40000 ALTER TABLE `role_permission_1` DISABLE KEYS */; +/*!40000 ALTER TABLE `role_permission_1` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `user_0` +-- + +DROP TABLE IF EXISTS `user_0`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `user_0` ( + `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` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'system' COMMENT 'Created by', + `created_time` datetime NOT NULL COMMENT 'Created time', + `modified_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT 'system' COMMENT 'Modified by', + `modified_time` datetime DEFAULT NULL COMMENT 'Modified time', + `version` int unsigned NOT NULL DEFAULT '0' COMMENT 'Optimistic locking', + `deleted` enum('N','Y') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'N' COMMENT 'Deleted. ''N'' - not deleted; ''Y'' - deleted', + 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_0` +-- + +LOCK TABLES `user_0` WRITE; +/*!40000 ALTER TABLE `user_0` DISABLE KEYS */; +INSERT INTO `user_0` VALUES (1,'ijohnnymiller','ijohnnymiller@icloud.com','13100959832','$2a$10$2wDrBjRykjsFoUZfKgogyOm0LxIg6EdH42uR3sQ8fHOQcKg5/Mvsm','Johnny Miller','1996-04-29','Cisgender Male',NULL,1,'system','2020-05-09 16:26:23',NULL,NULL,0,'N'),(2,'system','system@email.com',NULL,'$2a$10$Ft5LsGrnMoW2DNeboV.QV.w9r.meesdzwEOw1WMMUn/6zH.R9IW/K','System User',NULL,NULL,NULL,1,'system','2021-06-27 11:21:38',NULL,NULL,0,'N'); +/*!40000 ALTER TABLE `user_0` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `user_1` +-- + +DROP TABLE IF EXISTS `user_1`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `user_1` ( + `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` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'system' COMMENT 'Created by', + `created_time` datetime NOT NULL COMMENT 'Created time', + `modified_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT 'system' COMMENT 'Modified by', + `modified_time` datetime DEFAULT NULL COMMENT 'Modified time', + `version` int unsigned NOT NULL DEFAULT '0' COMMENT 'Optimistic locking', + `deleted` enum('N','Y') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'N' COMMENT 'Deleted. ''N'' - not deleted; ''Y'' - deleted', + 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 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='User.'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `user_1` +-- + +LOCK TABLES `user_1` WRITE; +/*!40000 ALTER TABLE `user_1` DISABLE KEYS */; +/*!40000 ALTER TABLE `user_1` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `user_role_0` +-- + +DROP TABLE IF EXISTS `user_role_0`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `user_role_0` ( + `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_0` +-- + +LOCK TABLES `user_role_0` WRITE; +/*!40000 ALTER TABLE `user_role_0` DISABLE KEYS */; +INSERT INTO `user_role_0` VALUES (1,1,1),(2,2,2); +/*!40000 ALTER TABLE `user_role_0` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `user_role_1` +-- + +DROP TABLE IF EXISTS `user_role_1`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `user_role_1` ( + `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_1` +-- + +LOCK TABLES `user_role_1` WRITE; +/*!40000 ALTER TABLE `user_role_1` DISABLE KEYS */; +/*!40000 ALTER TABLE `user_role_1` 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 2022-04-02 20:21:26 diff --git a/docker/script/mysql-server-source/1_init_user.sql b/docker/script/mysql-server-source/1_init_mysql_user.sql similarity index 100% rename from docker/script/mysql-server-source/1_init_user.sql rename to docker/script/mysql-server-source/1_init_mysql_user.sql diff --git a/docker/script/mysql-server-source/2_Dump20210926.sql b/docker/script/mysql-server-source/2_Dump20210926.sql deleted file mode 100644 index f217b9eb..00000000 --- a/docker/script/mysql-server-source/2_Dump20210926.sql +++ /dev/null @@ -1,549 +0,0 @@ --- MySQL dump 10.13 Distrib 8.0.26, for Win64 (x86_64) --- --- Host: 127.0.0.1 Database: muscle_and_fitness --- ------------------------------------------------------ --- Server version 8.0.26 - -/*!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 unsigned 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 unsigned 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 unsigned 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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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','image/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.','image/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.','image/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.','image/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.','image/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','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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 .','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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:','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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:','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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.','image/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 unsigned 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 unsigned 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 unsigned 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 unsigned 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 unsigned 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,'image/AdductorAnteriorSmall.png','Adductors',1,'2021-06-27 13:54:16',NULL,NULL,0),(2,1,'image/AdductorPosteriorSmall.png','Adductors',1,'2021-06-27 13:54:16',NULL,NULL,0),(3,2,'image/BicepsInsideSmall.gif','Biceps Brachii',1,'2021-06-27 13:54:16',NULL,NULL,0),(4,3,'image/BrachialisInsideSmall.gif','Brachialis',1,'2021-06-27 13:54:16',NULL,NULL,0),(5,3,'image/BrachialisUpperArmSegmentSmall.gif','Brachialis',1,'2021-06-27 13:54:16',NULL,NULL,0),(6,4,'image/BrachioradialisoutsideSmall.png','Brachioradialis',1,'2021-06-27 13:54:16',NULL,NULL,0),(7,6,'image/DeltoidAnteriorFront.gif','Anterior',1,'2021-06-27 13:54:16',NULL,NULL,0),(8,7,'image/DeltoidLateralBack.gif','Lateral',1,'2021-06-27 13:54:16',NULL,NULL,0),(9,8,'image/DeltoidPosteriorBack.gif','Posterior',1,'2021-06-27 13:54:16',NULL,NULL,0),(10,9,'image/DeepHipRotators.gif','Deep Hip External Rotators',1,'2021-06-27 13:54:16',NULL,NULL,0),(11,10,'image/96a0e9eeb4ad8418eff179a9c59bc713.png','Erector Spinae',1,'2021-06-27 13:54:16',NULL,NULL,0),(12,10,'image/ErectorSpinaeCrossSection.gif','Erector Spinae',1,'2021-06-27 13:54:16',NULL,NULL,0),(13,11,'image/GastrocnemiusLateral.gif','Gastrocnemius',1,'2021-06-27 13:54:16',NULL,NULL,0),(14,13,'image/80a4754b254e159c4cd5474b063d096e.png','Maximus',1,'2021-06-27 13:54:16',NULL,NULL,0),(15,14,'image/GluteusMediusPosterior.gif','Medius',1,'2021-06-27 13:54:16',NULL,NULL,0),(16,15,'image/bf94c6ef8b7ca1c02323779e1fe3b837.png','Minimus',1,'2021-06-27 13:54:16',NULL,NULL,0),(17,15,'image/GluteusMinimusSide.gif','Minimus',1,'2021-06-27 13:54:16',NULL,NULL,0),(18,16,'image/69c90b7fb98b9c863015a90b3ff3173c.png','Gracilis',1,'2021-06-27 13:54:16',NULL,NULL,0),(19,17,'image/1c94da8f4db345d0343c3db475d2d84d.png','Hamstrings',1,'2021-06-27 13:54:16',NULL,NULL,0),(20,18,'image/99beae51baa19dc3d8ef62c04b469133.png','Iliopsoas',1,'2021-06-27 13:54:16',NULL,NULL,0),(21,18,'image/ed4205586bfaf0b1603ad8e70dae6706.png','Iliopsoas',1,'2021-06-27 13:54:16',NULL,NULL,0),(22,19,'image/3e3d3ded3335c56a7f932c6e38a3ed53.png','Infraspinatus',1,'2021-06-27 13:54:16',NULL,NULL,0),(23,20,'image/67f687e9482a2a6bca9a38544e45d31c.png','Latissimus Dorsi',1,'2021-06-27 13:54:16',NULL,NULL,0),(24,20,'image/LatSmall.png','Latissimus Dorsi',1,'2021-06-27 13:54:16',NULL,NULL,0),(25,21,'image/5083bc6f81d7a598832a5cb53340fb4a.png','Levator Scapulae',1,'2021-06-27 13:54:16',NULL,NULL,0),(26,22,'image/1d421470bb1b8650b68a055d15704abe.png','Obliques',1,'2021-06-27 13:54:16',NULL,NULL,0),(27,22,'image/ObliqueCrossSection.gif','Obliques',1,'2021-06-27 13:54:16',NULL,NULL,0),(28,23,'image/52d884ea5ad22f197b0335468e4ca6e7.png','Pectineous',1,'2021-06-27 13:54:16',NULL,NULL,0),(29,25,'image/11a9ea1af4fa3e206ec2eecc7e60100e.png','Clavicular Head',1,'2021-06-27 13:54:16',NULL,NULL,0),(30,25,'image/0e1ed54440e102b3ec973207ea371964.png','Clavicular Head',1,'2021-06-27 13:54:16',NULL,NULL,0),(31,26,'image/5a6b344e7b8a52c715adf8b091461f7d.png','Sternal Head',1,'2021-06-27 13:54:16',NULL,NULL,0),(32,26,'image/PectoralAttachmentSmall.png','Sternal Head',1,'2021-06-27 13:54:16',NULL,NULL,0),(33,28,'image/TeresMajorSmall.png','Major',1,'2021-06-27 13:54:16',NULL,NULL,0),(34,29,'image/TeresMinorSmall.png','Minor',1,'2021-06-27 13:54:16',NULL,NULL,0),(35,30,'image/TibialisAnteriorSmall.png','Tibialis Anterior',1,'2021-06-27 13:54:16',NULL,NULL,0),(36,31,'image/TransverseAbdominisCrossSectionNew.jpg','Transverse Abdominus',1,'2021-06-27 13:54:16',NULL,NULL,0),(37,33,'image/TrapLowerHalfSmall.png','Lower Fibers',1,'2021-06-27 13:54:16',NULL,NULL,0),(38,34,'image/TrapMiddleHalfSmall.png','Middle Fibers',1,'2021-06-27 13:54:16',NULL,NULL,0),(39,35,'image/TrapUpperHalfSmall.png','Upper Fibers',1,'2021-06-27 13:54:16',NULL,NULL,0),(40,36,'image/TricepsOutsideSmall.gif','Triceps Brachii',1,'2021-06-27 13:54:16',NULL,NULL,0),(41,38,'image/WristExtensorsSupSmall.gif','Extensors',1,'2021-06-27 13:54:16',NULL,NULL,0),(42,39,'image/WristFlexorNeutSmall.gif','Flexors',1,'2021-06-27 13:54:16',NULL,NULL,0),(43,40,'image/e7cda9218a2e2c84a31a7ca32e98c3a9.png','Pectoralis Minor',1,'2021-06-27 13:54:16',NULL,NULL,0),(44,41,'image/PopliteusSmall.png','Popliteus',1,'2021-06-27 13:54:16',NULL,NULL,0),(45,42,'image/QuadratusLumborumSmall.png','Quadratus Lumborum',1,'2021-06-27 13:54:16',NULL,NULL,0),(46,43,'image/QuadricepsAnteriorSmall.png','Quadriceps',1,'2021-06-27 13:54:16',NULL,NULL,0),(47,44,'image/RectusAbdominisWaistSmall.png','Rectus Abdominis',1,'2021-06-27 13:54:16',NULL,NULL,0),(48,44,'image/RectusAbdominalCrossSectionNew.jpg','Rectus Abdominis',1,'2021-06-27 13:54:16',NULL,NULL,0),(49,45,'image/RhomboidsHalfSmall.png','Rhomboids',1,'2021-06-27 13:54:16',NULL,NULL,0),(50,46,'image/SartoriusAnteriorSmall.png','Sartorius',1,'2021-06-27 13:54:16',NULL,NULL,0),(51,47,'image/SerratusAnteriorSideSmall.png','Serratus Anterior',1,'2021-06-27 13:54:16',NULL,NULL,0),(52,47,'image/SerratusAnteriorPullSmall.png','Serratus Anterior',1,'2021-06-27 13:54:16',NULL,NULL,0),(53,47,'image/SerratusScapulaTransverseCu.gif','Serratus Anterior',1,'2021-06-27 13:54:16',NULL,NULL,0),(54,48,'image/SoleusLateralSmall.png','Soleus',1,'2021-06-27 13:54:16',NULL,NULL,0),(55,49,'image/SpleniusSpineSmall.png','Splenius',1,'2021-06-27 13:54:16',NULL,NULL,0),(56,49,'image/SpeniusHalfSmall.png','Splenius',1,'2021-06-27 13:54:16',NULL,NULL,0),(57,50,'image/SternoSideSmall.png','Sternocleidomastoid',1,'2021-06-27 13:54:16',NULL,NULL,0),(58,51,'image/SubscapularisSmall.png','Subscapularis',1,'2021-06-27 13:54:16',NULL,NULL,0),(59,52,'image/SupraspinatusBackSmall.png','Supraspinatus',1,'2021-06-27 13:54:16',NULL,NULL,0),(60,53,'image/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 unsigned NOT NULL DEFAULT '0' COMMENT 'Deleted', - 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 `quartz_job_configuration` --- - -DROP TABLE IF EXISTS `quartz_job_configuration`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `quartz_job_configuration` ( - `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'The primary key ID', - `name` varchar(50) COLLATE utf8mb4_general_ci NOT NULL COMMENT 'Name of job', - `group` varchar(200) COLLATE utf8mb4_general_ci NOT NULL COMMENT 'Group of job', - `service_name` varchar(50) COLLATE utf8mb4_general_ci NOT NULL COMMENT 'Service name, equal to artifact-id', - `invoke_target` varchar(500) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'Invoke target', - `cron_expression` varchar(50) COLLATE utf8mb4_general_ci NOT NULL COMMENT 'Cron Expressions', - `misfire_policy` tinyint NOT NULL COMMENT 'Trigger''s misfire policy', - `concurrent` tinyint unsigned NOT NULL DEFAULT '0' COMMENT 'Concurrent. true(1): is concurrent, false(0): not concurrent', - `description` varchar(1000) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'Description', - `status` tinyint NOT NULL COMMENT 'Status', - `created_by` bigint unsigned NOT NULL COMMENT 'Created by', - `created_time` datetime NOT NULL COMMENT 'Craeted time', - `modified_by` bigint unsigned DEFAULT NULL COMMENT 'Modified by', - `modified_time` datetime DEFAULT NULL COMMENT 'Modified time', - `deleted` tinyint unsigned NOT NULL DEFAULT '0' COMMENT 'Deleted', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='Quartz Job Configuration'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `quartz_job_configuration` --- - -LOCK TABLES `quartz_job_configuration` WRITE; -/*!40000 ALTER TABLE `quartz_job_configuration` DISABLE KEYS */; -INSERT INTO `quartz_job_configuration` VALUES (1,'greeting-schedule-job','auth-center-default-group','auth-center','greetingBean.hello()','0 0/1 * 1/1 * ? *',0,0,'Greeting task. It\'s a demo Quartz schedule job.',0,1,'2021-09-26 00:20:37',NULL,NULL,0),(2,'greeting-schedule-job','maf-mis-default-group','maf-mis','greetingBean.hello()','0 0/1 * 1/1 * ? *',0,0,'Greeting task. It\'s a demo Quartz schedule job.',0,1,'2021-09-26 00:20:37',NULL,NULL,0); -/*!40000 ALTER TABLE `quartz_job_configuration` 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 unsigned NOT NULL DEFAULT '0' COMMENT 'Deleted', - 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 unsigned NOT NULL DEFAULT '0' COMMENT 'Deleted', - 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-09-26 10:48:15 diff --git a/docker/script/mysql-server-source/2_Dump20220402.sql b/docker/script/mysql-server-source/2_Dump20220402.sql new file mode 100644 index 00000000..5d8a00d9 --- /dev/null +++ b/docker/script/mysql-server-source/2_Dump20220402.sql @@ -0,0 +1,1083 @@ +-- MySQL dump 10.13 Distrib 8.0.28, for Win64 (x86_64) +-- +-- Host: 127.0.0.1 Database: muscle_and_fitness_0 +-- ------------------------------------------------------ +-- Server version 8.0.26 + +/*!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; + +DROP DATABASE IF EXISTS `muscle_and_fitness_0`; +CREATE SCHEMA `muscle_and_fitness_0` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +USE `muscle_and_fitness_0`; + +-- +-- Table structure for table `body_part_0` +-- + +DROP TABLE IF EXISTS `body_part_0`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `body_part_0` ( + `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` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'system' COMMENT 'Created by.', + `created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Created time', + `modified_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT 'system' COMMENT 'Modified by', + `modified_time` datetime DEFAULT NULL COMMENT 'Modified time', + `version` int unsigned NOT NULL DEFAULT '0' COMMENT 'Optimistic locking', + `deleted` enum('N','Y') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'N' COMMENT 'Deleted. ''N'' - not deleted; ''Y'' - 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_0` +-- + +LOCK TABLES `body_part_0` WRITE; +/*!40000 ALTER TABLE `body_part_0` DISABLE KEYS */; +INSERT INTO `body_part_0` VALUES (1,'Neck','system','2021-06-27 13:31:48',NULL,NULL,0,'N'),(2,'Shoulders','system','2021-06-27 13:31:48',NULL,NULL,0,'N'),(3,'Upper Arms','system','2021-06-27 13:31:48',NULL,NULL,0,'N'),(4,'Forearms','system','2021-06-27 13:31:48',NULL,NULL,0,'N'),(5,'Back','system','2021-06-27 13:31:48',NULL,NULL,0,'N'),(6,'Chest','system','2021-06-27 13:31:48',NULL,NULL,0,'N'),(7,'Waist','system','2021-06-27 13:31:48',NULL,NULL,0,'N'),(8,'Hips','system','2021-06-27 13:31:48',NULL,NULL,0,'N'),(9,'Thighs','system','2021-06-27 13:31:48',NULL,NULL,0,'N'),(10,'Calves','system','2021-06-27 13:31:48',NULL,NULL,0,'N'),(11,'Other Exercises','system','2021-06-27 13:31:48',NULL,NULL,0,'N'); +/*!40000 ALTER TABLE `body_part_0` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `body_part_1` +-- + +DROP TABLE IF EXISTS `body_part_1`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `body_part_1` ( + `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` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'system' COMMENT 'Created by.', + `created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Created time', + `modified_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT 'system' COMMENT 'Modified by', + `modified_time` datetime DEFAULT NULL COMMENT 'Modified time', + `version` int unsigned NOT NULL DEFAULT '0' COMMENT 'Optimistic locking', + `deleted` enum('N','Y') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'N' COMMENT 'Deleted. ''N'' - not deleted; ''Y'' - deleted', + PRIMARY KEY (`id`), + UNIQUE KEY `body_part_name_uindex` (`name`) +) ENGINE=InnoDB 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_1` +-- + +LOCK TABLES `body_part_1` WRITE; +/*!40000 ALTER TABLE `body_part_1` DISABLE KEYS */; +/*!40000 ALTER TABLE `body_part_1` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `equipment_0` +-- + +DROP TABLE IF EXISTS `equipment_0`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `equipment_0` ( + `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` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'system' COMMENT 'Created by', + `created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Created time', + `modified_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT 'system' COMMENT 'Modified by', + `modified_time` datetime DEFAULT NULL COMMENT 'Modified time', + `version` int unsigned NOT NULL DEFAULT '0' COMMENT 'Optimistic locking', + `deleted` enum('N','Y') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'N' 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_0` +-- + +LOCK TABLES `equipment_0` WRITE; +/*!40000 ALTER TABLE `equipment_0` DISABLE KEYS */; +/*!40000 ALTER TABLE `equipment_0` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `equipment_1` +-- + +DROP TABLE IF EXISTS `equipment_1`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `equipment_1` ( + `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` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'system' COMMENT 'Created by', + `created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Created time', + `modified_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT 'system' COMMENT 'Modified by', + `modified_time` datetime DEFAULT NULL COMMENT 'Modified time', + `version` int unsigned NOT NULL DEFAULT '0' COMMENT 'Optimistic locking', + `deleted` enum('N','Y') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'N' 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_1` +-- + +LOCK TABLES `equipment_1` WRITE; +/*!40000 ALTER TABLE `equipment_1` DISABLE KEYS */; +/*!40000 ALTER TABLE `equipment_1` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `exercise_0` +-- + +DROP TABLE IF EXISTS `exercise_0`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `exercise_0` ( + `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` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'system' COMMENT 'Created by', + `created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Created time', + `modified_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT 'system' COMMENT 'Modified by', + `modified_time` datetime DEFAULT NULL COMMENT 'Modified time', + `version` int unsigned NOT NULL DEFAULT '0' COMMENT 'Optimistic locking', + `deleted` enum('N','Y') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'N' COMMENT 'Deleted. ''N'' - not deleted; ''Y'' - 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_0` +-- + +LOCK TABLES `exercise_0` WRITE; +/*!40000 ALTER TABLE `exercise_0` DISABLE KEYS */; +INSERT INTO `exercise_0` 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.','image/CBNeckFlexionBelt.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBNeckFlexion.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVNeckFlexionH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBNeckRotationBelt.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVNeckLateralFlexion.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBLateralNeckFlexionBelt.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVLateralNeckFlexionH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVNeckFlexion.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WtNeckFlexion.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTNeckFlexionCrossBench.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTLateralNeckFlexion.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(12,'Neck Rotation Stretch','Stand or sit.','Turn head over shoulder to one side. Hold stretch. Repeat to other side.','image/2fbe7e69b265b483d2414574acf6142e.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWWallSideNeckBridge.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(14,'Neck Retraction Stretch','Stand or sit.','Pull head back as far possible while looking slightly down and hold stretch.','image/360cb46b3b96821a6d08e84228e08c07.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STNeckFlexion.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWFrontNeckBridge.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWWallFrontNeckBridge.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STNeckLateralExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBNeckExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVNeckExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVNeckExtensionH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTLyingNeckExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTNeckExtensionCrossBench.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBNeckExtensionBelt.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTNeckExtensionHarness.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WtNeckExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(27,'Band Resistive Neck Retraction','Execution\nPush back of neck into band by retracting head. Returning head to neutral postion and repeat.','Comments','image/BRNeckRetraction.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWWallRearNeckBridge.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWRearNeckBridge.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/0b4142cf0100659361840fb8e05756e4.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STNeckExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(32,'Lying Neck Retraction Isometric','Execution\nPush head into mat and hold position. Relax and repeat.','Comments','image/IsometricNeckRetraction.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBSeatedBehindNeckPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBInclineFrontRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBMilitaryPressBentLeg.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBFrontRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBShoulderPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBBarBehindNeckPressSide.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBBarMilitaryPressSide.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBBarMilitaryPressSide.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBSeatedMilitaryPressFF.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBSeatedFrontRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBAlternatingFrontLateralRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBAlternatingSeatedFrontRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBFrontRaiseRope.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBShoulderPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBFrontRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBAlternInclineFrontRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBTwistingOverheadPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBStandingShoulderPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBFrontRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBAlternatingFrontRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBArnoldPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBShoulderPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVReclinedShoulderPressPL.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVBehindNeckShoulderPressH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSMSeatedBehindNeckPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVMilitaryInclinePressH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBOneArmShoulderPressLean.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVOneArmFrontRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVShoulderPressH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSMSeatedShoulderPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVOneArmShoulderPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVReclinedShoulderPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVReclinedShoulderPressParGrip.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SLShoulderPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVShoulderPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SLShoulderPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVAlternatingShoulderPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVClosWidParGripShouldPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SMShoulderPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SMBehindNeckPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWHandstandPressBenches.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/55ab2c829aa0fcebd5d58d00c31dd5cb.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/653009242a6a02fb25ad40c66eb2737b.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/5616f45948903873fa68bfd777cf1388.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWPikePress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWPikePressDeclined.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STFrontRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/ff15584ed4d354bd3c44c8e22fae9f77.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBLateralRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBWideGripUprightRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBOneArmLateralRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBUprightRowM.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBSeatedLateralRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBUprightRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBBarUprightRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBUprightRowDoublePulley.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBOneArmUprightRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBUprightRowRope.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBLateralRaiseClose.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBSeatedYRowRope.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBYRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBOneArmLateralRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBWideGripUprightRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBInclineLateralRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBSeatedYRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBUprightRowStirrups.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBLateralRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBLyingLateralRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBOneArmSeatedLateralRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSMUprightRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBRaise8.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBUprightRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBOneArmUprightRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVLateralRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVLateralRaiseH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBOneArmSeatedUprightRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVExtendedArmLateralRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVExtendedArmKneelingLateralRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(112,'Side Deltoid Stretch','Position arm across chest. Place opposite hand on elbow.','Push elbow toward chest. Hold stretch. Repeat with opposite arm.','image/217101e410d8d1d25cfc6478d0115ad1.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/d9fca31f579fd29d33241749ea84f365.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STYShoulderRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SMWideGripUprightRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SMUprightRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBLyingRearDeltRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBStandingRearDeltFly.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBStandingRearDeltRowRope.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBSupineRearLateralPull_.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBRearDeltRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBSeatedRearDeltPull.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBRearDeltRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBRearDeltRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBRearDeltPull.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBRearDeltRowStirrups.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBOneArmRearDeltRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBSeatedRearDeltRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBSeatedRearLateralRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBRearLateralRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBStandingRearDeltRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBLyingRearLateralRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBLyingRearDeltRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CableBentOverLateralRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBStandingCrossRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBOneArmCrossRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBLyingRearDeltRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBRearLateralRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBOneArmLyingLateralRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBRearDeltRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVInclineRearDeltRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVLyingRearDeltRaiseH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVRearDeltRowH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBSeatedRearLateralRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVRearRaiseH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedRearLateralRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVBentOverExtArmLateralRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedRearDeltRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedReverseFlyParallelGrip.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVRearLateralRaiseOnLatRsMch.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVTBarRearDeltRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVLyingRearLateralRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedRearDeltFlyOnPecDeck.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVRearDeltFlyOverhandGrip.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedRearDeltFlyInsideParallelGrip.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedRearDeltFly.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWRearDeltInvertedRowHigh.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWRearDeltInvertedRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SMBentoverRearDeltRowSideView.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STReverseFlyStaggered.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STRearDeltRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(164,'Rear Deltoid Stretch','Position arm across neck. Place opposite hand on elbow.','Push elbow toward neck. Hold stretch. Repeat with opposite arm.','image/e804bc162a98017991aec45287ea60f3.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/277fbfe41e0114de998ccabb0af995e7.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBOneArmSeatedFrontLateralRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBFrontLateralRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBFullCanLateralRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBFrontLateralRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBSeatedFrontLateralRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBCloseGripBenchPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/ASTricepsDip.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBJMPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/ASTricepsDipKneeling.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBLyingTricepsExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBCloseGripInclineBenchPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBLyingTricepsExtensionSC.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBInclineTricepsExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBSeatedTricepsExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBDeclineTricepsExt.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBOverheadTricepsExt.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBOneArmForwardTricepsExt.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBInclineTricepsExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBOverheadTricepsExtRope.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBLyingTricepsExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBKneelingTricepsExt.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBDeclineTricepsExt.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBForwardLeaningPushdown.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBBarPushdown.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBPushdown.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBAlternatingSeatedPushdown.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBPushdownV.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBOneArmSideTricepsExt.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBPushdownRope.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBStandingTricepsExtensionBackSupport.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBOneArmPushdown.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBInclinePushdown.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBSeatedTricepsExtSupGrip.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBTricepsDip.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBSeatedTricepsExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBOneArmTricepsExtensionPronated.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBSeatedTricepsExtBackSupport.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBLyingTricepsExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBKickback.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBDeclineTricepsExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBTricepsExtensionRope.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBInclineTricepsExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBTricepsExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBOneArmTricepsExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVCloseGripBenchPressH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSMCloseGripBenchPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVOverheadTricepsExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVInclineTricepsExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVPushdown.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVTricepsExtensionNoSeatPL.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVTricepsDipH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVTriExtGripless.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVTricepsDip2.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVCloseGripChestPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVCloseGripInclineBenchPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVAlternatingTricepsExtensionS.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVTricepsExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SLStandingTricepsDip.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SMCloseGripBenchPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVTricepsDipOverhand.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SMCloseGripInclineBenchPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTBenchDip.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WtTricepsDip.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTCloseGripPushUp.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWCloseGripPushUpKnees.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWBenchDipLegsElevated.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWCloseGripPush.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWBenchDipFloor.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/ASTricepsDipFootBand.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWBenchDipBentKnee.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWTricepsDip.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWSuspendedTricepsExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWCloseGripInclinePushUpOnBar.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWDoubleBenchDipsTriceps.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STSelfAssistedDipOnToes.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWDoubleBenchDipBentKneeTriceps.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STTricepsExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STDip.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/3799ed8a83c8eac5efb901d9b10cdba5.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/edeae1cee9ffa6dc4c5e5fed632f9bba.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/389b7b9e3728a886909b6b7a5f9a6e8a.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/ASTricepsDipSelf.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBSeatedAlternatingCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBAlternatingCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBDragCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBSeatedCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBBarCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBOneArmCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBCurlStirrups.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBSupineArmCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWSupineRowUnderhandHigh.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVAlternatingCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/43d668452405c4e4fc3558c7198e186a.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/055a2e3f70a4c9da644902025b37f71d.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBInclineCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWUnderhandChinup.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWSupineRowUnderhand.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/6cb903dd82c279b928786e7c041a8650.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/7fb262891ac5c6933385580cfca31e8d.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/e56394f43d421e81a3dcd5db1bc18917.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBPreacherCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBAlternatingPreacherCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBConcentrationCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBPreacherCurlStirrups.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBOneArmStandingPreacherCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBProneInclineCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBStandingPreacherCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBStandingPreacherCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBPreacherCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBProneInclineCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBOneArmPreacherCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBPreacherCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBConcentrationCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVPreacherCurlH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVHighPreacherCurlArmsHighPL.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBProneInclineCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBStandingOneArmPreacherCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVAlternatingHighPreacherCurlArmsHighPL.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVStandingPreacherCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVHighPreacherCurlS.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVPreacherCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVAlternatingHighPreacherCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STArmCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVPreacherCurlSeatless.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBStandingReversePreacherCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBHammerCurlRope.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBReverseCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBReverseCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBBarReverseCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBHammerCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVReverseCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVHammerPreacherCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBStandingReversePreacherCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBReversePreacherCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBReversePreacherCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(310,'Standing Brachioradialis Stretch','Cross wrists, point thumbs downward, and clasp hands.','Straighten arms and externally rotate shoulders by back. Hold stretch.','image/e5de318835474e554b63aa69f6b28291.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVReversePreacherCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CableRollerWristFlexion.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVWristCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBOneArmWristCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBWristCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBUlnarFlexion.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBWristCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBWristCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVGripper.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedGripper.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedWristCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVUlnarDeviation.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SLGripper.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SLOneHandGripPinchPL.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SLGripPL.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVRollerAlternatingWristFlexion.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/687f3c5f65553be7ab1ce1453499fdf2.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SLOneHandGripPL.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/0e6c9ab24bc1acaa9bbb811fa0f0f70a.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/87d4e6a3bad34ced76d50c60a6b2fbf8.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/f4b4e6a42d8874f9e70106cf09e141d9.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVWristRollerUlnarFlexion.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBRadialDeviation.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBReverseWristCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBReverseWristCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVRadialDeviation.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBOneArmReverseWristCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBReverseWristCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVReverseWristCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CableRollerWristExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedReverseWristCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVWristRollerRadialFlexion.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/1ef1476e3bcaf5b7a89a2cbfcc3bdd8f.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/KneelingWristExtensor.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBPronationUp.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBSeatedPronation.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedPronation.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(348,'Lever Standing Forearm Pronation','Grasp open handle at end of shaft with underhand grip.','Rotate shaft by turning palm downward. Return and repeat.','image/LVWristPronation.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBPronationDown.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(350,'Lever Standing Forearm Supination','Grasp open handle at end of shaft with overhand grip.','Rotate shaft by turning palm upward. Return and repeat.','image/LVForearmSupination.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBSupinateDown.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBSupinationUp.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBSeatedSupination.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedSupination.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBBentOverRowClose.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBInclineRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CMBLyingRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBStraightBackInclineRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBBentOverRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBUnderhandBentOverRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBOneArmKneelingRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBLyingRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBOneArmBentOverRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBOneArmRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBOneArmTwistingRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBOneArmHighRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBHighRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBOneArmTwistingHighRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBAlternatingHighRowLeanBack.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBSeatedRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBOneArmStrBackHighRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBWideGripSeatedRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBSeatedRowStraightBack.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBSeatedRowWideGripStrBack.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBOneArmStandingRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBBentoverRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBStandingLowRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBLyingRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBStandingTwistingRowOpStance.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVBentOverRowH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVWideGripBentOverRowH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSMBentoverRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVInclineRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVOneArmBentOverRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVCloseGripInclineRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVOneArmStandingRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedRowLowNarrowH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVAlternatingWideGripSeatedRowH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedRowAlternatingNarrowH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVWideGripSeatedRowH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedRowWideH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedHighRowH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVStrBackSeatedRowNoPadPL.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedLowRowH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedRowNoPadPL.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVCloseGripTBarRowPL.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVBentOverRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVAlternatingSeatedUnderhandRowH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVHighRowB.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVAlternatingHighRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedUnderhandRowH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVWideGripSeatedRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVAlternatingUnderhandSeatedRowS.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVUnderhandSeatedRowS.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedRowNoPad.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVStraightBackSeatedRowNoPad.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWSupineRowFeetElevated.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SMBentoverRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWSupineRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTInvertedRowFeetElevated.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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','image/BWSupineRowOnHip.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWSupineRowHigh.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/2febe4db68138ccd83658bc2e5387d62.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STInvertedRow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STInvertedRowLowKneesBent.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/PCCrosshand8.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STPowerPull.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBPullover.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/ASPullUpKneelingOpen.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/AsCloseGripPullup.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/ASPullupKneeling.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/AsPullup.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/ASUnderhandChinupKneeling.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBOneArmPulldown.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBBentArmPullover.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBCloseGripPulldown.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/ASCloseGripPullUpKneeling.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVAlternatingCloseGripPulldown.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBOneArmKneelingPulldown.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBFrontPulldown.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBCloseGripPulldownStirrups.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/KneelingBentOverPulldown.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBParallelGripPulldown.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBAlternatingPulldown.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBPullover.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBFrontPulldownProBar.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBPulldownStirrups.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBStraightArmPullDown.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBParallelCloseGripPullup.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBChinup.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVPullup.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBSeatedStraightArmPulldown.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBRearPullup.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBPullup.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBRearPulldown.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVCloseGripPulldownPL.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBStandTwistPulldownOpStance.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBUnderhandPulldown.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVRearPulldownPL.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVPulldownH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVUnderhandPulldownH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVFrontPulldownPL.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVPulloverH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVCloseGripPulldown.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVFrontPulldown.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVIronCross.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVBiLateralUnderhandPulldownS.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVPullover.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVPullDown.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVPullDownParallelGrip.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTCloseGripChinup.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTChinUpUnderhand.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVAlternatingUnderhandPulldownS.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTChinUp.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/ASPullupFootBand.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTPullUpDB.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/ASChinupFootBand.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTRearPullup.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/ASParallelGripPullupFootBand.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTPullUpN.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/ASNeutralGripPullupFootBand.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWCloseGripPullup.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/ASRearPullupFootBand.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWWideGripChinup.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/AsRearPullupPartner.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWPullUp.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWPullUpN.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWRearPullup.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/AsUnderhandChinupPartner.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/AsChinupPartner.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWRearPullupSelfAssistedRear.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWChinupSelfAssistedFront.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWUnderHandChinupSelfAssistedFront.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWKneelingWheelRollout.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STKneelingRollout.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STSelfAssistedPullup.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/01d980e27b31196413c44429d1bf8e00.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STPullup.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/Bentover.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWRolloutBall.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/PCUnderhand8.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BentoverFloorLat.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/StandingSideBendLat.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/524bb061bc1d45f04e9d210ca87e864b.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/7926682b1fd64e1118a13f8b734fecef.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/8ba64011570f73050fcd1c3d26fe4b02.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/af32125548f8472201151459ae3d6336.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CMBSeatedShrug.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/TBShrug.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBBarShrug.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBShrug.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SBShrugStand.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBShrugStirrups.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBShrug.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBOneArmShrug.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(519,'Dumbbell Shrug','Stand holding dumbbells to sides.','Elevate shoulders as high as possible. Lower and repeat.','image/DBShrug.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBShrugDualPulley.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(521,'Lever Gripless Shrug (plate loaded)','Stand with shoulders under padded lever.','Elevate shoulders as high as possible. Lower and repeat.','image/LVGriplessShrugPL.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVShrugNarrow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVShrugH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(524,'Lever Seated Gripless Shrug','Sit on seat and place forearms in padded bars.','Elevate shoulders as high as possible. Lower and repeat.','image/LVSeatedGriplessShrug.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSMShrug.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(526,'Lever Shrug','Stand holding lever bar with shoulder width overhand or mixed grip.','Elevate shoulders as high as possible. Lower and repeat.','image/LVShrug.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SMShrug.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedShrugH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWBentKneeInvertedShrug.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(530,'Sled Gripless Shrug','Stand with shoulders under padded bar.','Elevate shoulders as high as possible. Lower and repeat.','image/SLGriplessShrug.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(531,'Lever Gripless Shrug','Stand with shoulders under padded lever.','Elevate shoulders as high as possible. Lower and repeat.','image/LVGriplessShrug.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/90b391614b804836394c8232d1f1bc8b.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWInvertedShrugsRings.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/d3bb866a867c108318859f20ac343f44.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/247d61a1ccbd2df25a96521b4a9f1d46.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBSeatedShoulderExternalRotation.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBSeatedExternalRotation.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBLyingExternalRotation.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBExternalRotationDecline.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBExternalShoulderRotation2.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBUprightShoulderExtRotation.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBStandingExternalRotation.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVShoulderExternalRotation.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBStandingExternalRotationSupport.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVUprightExternalRotation.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVShoulderExternalRotationPL.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/e83cc4e80c252e68fe01e3d0a4891143.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/681599629550fe54ecfdc24bff39e6db.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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 .','image/af975066da66427c3e87e4ed52c67e18.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/ae28a6393c675efab53e9fbae0240a63.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/f9fdd43b88238a8e619a6d655b251781.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STShoulderExternalRotation.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBInternalRotationFloor.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBStandingInternalRotation.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBInternalRotation.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVShoulderInternalRotation.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBInternalRotation.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVShoulderInternalRotationPL.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/7e7c92a3099c3dc0c2eb456ebadd0a5e.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/04ab06bb0ae4639867ed65834a7aff6a.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVUprightInternalRotation.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/AsChestDip.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/ASChestDipKneeling.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBBoardPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBBenchPressGuillotine.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBBenchPressPowerlift.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBBenchPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBFloorPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBDeclineBenchPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBChestDip.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBDeclineFly.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBBenchPressChain.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBSeatedFly.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBLyingFly.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBBenchPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBStandingFly.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBOneArmChestPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBBarStandingChestPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBTwistingChestPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBBarBenchPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBChestPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBStandingChestPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBBenchPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBDeclineChestPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBStandingTwistingChestPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBStandingDeclinePress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBBarStandingDeclineChestPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBDeclineBenchPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBDeclineFly.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBPulloverBench.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBFly.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBPullover.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSMBenchPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVDeclineChestPressHighH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVChestPressH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBPulloverArchedBench.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVBenchPressH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVChestDipH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVChestDip.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVWideGripChestPressSeatLowH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVDeclineFly.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVFly.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVBentOverFly.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedDeclineFly.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedFlyIronCross.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedFlyGripless.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedFly2.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVLyingFly.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVBenchPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVAlternatingChestPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVDeclineChestPress2.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVChestPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVAlternatingDeclineChestPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVParallelGripBenchPressB.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SLStandingChestDipWideHorizontalGrip.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SLStandingChestDip.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SMBenchPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVDeclineBenchPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WtPushup.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWChestDip.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/ASChestDipFootBand.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SMDeclineBenchPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTPushupHandles.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWPushupWide.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTChestDip.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWDoubleBenchDips.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWDoubleBenchDipsBentKnee.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWPushupOnBox.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STDip.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWPushupOnBar.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STSelfAssistedChestDip.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STChestPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(637,'Behind Head Chest Stretch','Place hands behind head.','Pull elbows back further behind ears. Hold stretch.','image/31a7b461c0ecbd48cc96c1d82724df4e.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/ASChestDipSelfAssisted.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STChestFly.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWPushupWideKnee.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/35105281f94e7095770bdd334abaf11b.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/9d5fa017ad5d4a4b9ccaad68c16a6db6.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/fd41223d6c4bf840b668fe7cd1810421.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/274cce510915d8b305b711f55c0f015c.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBInclineChestPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBBarInclineBenchPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBStandingInclinePress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBInclineBenchPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBInclineBenchPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBBarStandingInclineChestPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBInclineFly.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBInclineBenchPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBStandingInclineFly.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBStandTwistInclineChestPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBInclineFly.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVInclineChestPressOnHammerMilitaryPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVInclineChestPressSeatLowH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSMInclineBenchPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVInclineBenchPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVParellelGripInclineBenchPressNPL.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVInclineBenchPressNPL.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVInclineParallelGripBenchPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVParallelGripInclineChestPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVAlternatingInclineChestPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVInclineChestPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SMInclineBenchPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWDeclinePushup.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVInclineFly.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWFarPikePress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DeclinePushUpOnBall.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/81c9c6613602c71360e4ca55e904cf66.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/fac48a97a71ddfde86c8d863dcbd396d.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WallShoulderGirdle.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVInclineShoulderRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBInclineShoulderRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBInclineShoulderRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBShoulderRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVInclineShoulderRaisePL.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBOneArmInclinePush.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SMInclineShoulderRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWPushUpPlus.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBPushCrunch.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBLyingCrunchStabBall.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBLyingLegHipRaiseBench.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBInclineSitup.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBInclineCrunch.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBLyingLegHipRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBLyingStraightLegHipRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBSeatedCrunch.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBKneelingCrunch.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBOverheadSeatedCrunch.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBStandingCrunch.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBPushCrunch.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVLyingCrunchArmsSide.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBStandingOverheadCrunchMultiBar.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBStandingOverheadCrunch.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBInclineSitup.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVLyingCrunch.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVLyingLegHipRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVCrunchLegRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVVerticalLegHipRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedLegRaiseCrunchPL.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVCrunchHipRaiseN.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVCrunchChestPad.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVPushCrunch.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedCrunchArmPad.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SLLegHipRaiseAbCoaster.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedCrunch.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedCrunchArmsForward.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSideLyingLegHipRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTCrunch.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WtCrunchChestX.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTInclineCrunchX.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTInclineSitupX.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WtInclineSitUp.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTOverheadBallCrunch.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WtInclineCrunch.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTBallCrunch.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/MBSitupChest.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTSitUp.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTSitUpX.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/Absolo.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTVerticalLegHipRaiseConvex.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WtVerticalLegHipRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTVerticalLegHipRaiseDipBar.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTLyingLegHipRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTHangingLegHipRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTSideCrunch.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTInclineTwistingCrunch.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBStandingTwistingCrunch.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedTwistingLegRaiseCrunch.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WtInclineLegHipRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WtInclineTwistingSitUp.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTTwistingCrunch.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTSideCrunchOnBall.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WtInclineTwistingSitUpChest.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CrunchArmsStraight.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWCrunchHead.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTTwistingSitUp.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWCrunchX.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTTwistingCrunchOnBall.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTTwistingSitUpX.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CrunchUps.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WtJacknifeSitUp.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWInclineCrunchHead.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWBallCrunch.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWCrunchBallX.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWInclineCrunchDown.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWHangingHipLegRaiseAbStrap.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWHangingStraightLegHipRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWInclineLegHipRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWLyingLegHipRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTVerticalLegHipRaisePB.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWLegHipRaiseExerciseBall.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWVerticalLegHipRaiseConvex.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWVertStraightLegHipRaiseDipBar.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWVerticalLegHipRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWInclineSitups.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWInclineSitupX.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWInvertedSitup.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWSitupNeck.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWSitupShoulder.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STJackknife.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWSitupArmsSides.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STPullThrough.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWVup.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/c3e400f67216ec0dad67111d3c0e6460.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STJackknifePike.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/FrontPlank.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/8c63d5a850f5767f5c7fde0838087164.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/31b12e7d0a1eda93f9822786a1ea0687.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/bd73ab9130ed13b74774ee88fc716f62.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(782,'Abdominal Vacuum','Sit, kneel, lie, or stand.','Pull navel into spine and hold.','image/AbdominalVacuum.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBSideBend.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBSeatedCrossArmTwist.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBSeatedTwistB.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBKneelingTwistingCrunch.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBSideCrunch.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVStandingTwistingCrunchSingle.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBRussianTwistBall.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBTwist.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBDownUpTwist.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBUpDownTwist.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSMSideBend.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBRussianTwistBall.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSideBend.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedSideLegRaiseCrunchOblique.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVKneelingTwist.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBSideBend.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DB45SideBend.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVTwist.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVLyingTwist.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVTwistGripless.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SLSideHipRaiseAbCoaster.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSideCrunch.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVStandingSideBend.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTLyingBentKneeTwist.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/EBLyingTwist.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/Wt45SideBend.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/MBRussianTwistBall.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTSideBendOnBall.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBOneArmStraightlegDeadlift.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWLyingBentKneeTwist.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWAngledSideBridgeRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWLyingStraightLegTwist1.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWSideBridgeRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWBentKneeSideBridgeRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/EBSideBend.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWExerciseBallPlankTwist.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWInclineTwistingCrunchNeck.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWTwistingSitupShoulders.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWInclineTwistingSitupChest.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWTwistingSitupNeck.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWInclineTwistingCrunchChest.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWTwistingSitupsNeck.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWTwistingCrunchBallHead.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWSideCrunchOneArm.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STSideBend.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWTwistingCrunchHead.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STSideBridge.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STTwist.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWSideCrunchOnBall.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STTwistingJackknife.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWTwistingCrunchChest.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/f606be3198fbe65c3c1136f9a1c73c4e.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/dad74d1575d3cc3c6a0ba8f858c3a909.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/0431eaab87f7ddf8f7f0806f3a80d345.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/190c5905bcd45a2c9a98a05429b1c8d6.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SidePlankElbow.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SidePlankElbowKnee.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBBackExtention.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBBentKneeGoodMorning.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBDeadlift.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBHyperExtention.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBSumoDeadlift.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBHyperextension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBBackExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBBlockPull.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBBlockSumoPull.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBDeficitDeadlift.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBRackPullLow.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBStiffLegDeadlift.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBStiffLegDeadlift.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/TBDeadlift.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/TBStiffLegDeadlift.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBStraightLegDeadlift.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/TBStraightLegDeadlift.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBStraightLegDeadlift.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVDeadliftA.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBStraightLegDeadlift.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVKneelingBackExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVBackExtensionN.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVStiffLegDeadlift.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVStraightLegDeadlift.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SMDeadlift.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SMStiffLegDeadlift.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SMBentkneeGoodmorning.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SMStraightLegDeadlift.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTHyperExtension3.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTBackExtension2.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WtHyperExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SBHyperextention.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTBackExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWHyperextensionBallArmsCrossed.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWHyperextensionBallArmsUp.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWHyperextensionBall.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWBirdDog.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWAlternatingBirdDog.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWHangingHyperextension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWAlternBirdDogHyperExBall.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWHyperExtensionX.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWBirdDogHyperExBall.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/Superman.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/ContraLateralSuperman.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWHyperExtensionHead.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWHyperExtensionHips.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(906,'Cat Stretch','Kneel on mat or floor. Place hands shoulder width apart.','Flex spine by hunching back up. Hold stretch.','image/85a341a1a24012749fe473a1106c6984.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/RearInclineBridge.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(908,'Bent-over Cat Stretch','Bend over with hands just above bent knees.','Flex spine by hunching back up. Hold stretch.','image/b5749d48d4c58dbce20b4c492af82004.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CatMovement.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/ef0e66c71170773cedd6aaa015f334af.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/d852814763a527dc7329c405e0155655.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/PCLowBack8.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STHyperextension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/RearDeclineBridge.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/764b4335143f6a5842325004e906a3f8.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/a1bb91259e95d163254658e3d2d1d6a2.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(918,'Plow Stretch','Lie on back and lift legs and hip overhead.','Allow knees to drop toward floor to sides of head. Hold stretch.','image/81ec4b57c0839751142053459f41f27c.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBSeatedGoodMorning.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBSingleLegStiffLegDeadlift_.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBStraightBackStiffLegDeadlift.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBHipThrust.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBSingleLegSplitSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBLungeGlute.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBRearLunge.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBSingleLegSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBSideLunge.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBSquatPowerlift.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBWalkingLunge.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBSplitSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SBSquatC.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBFullSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SBSquatHandles.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBHackSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBBoxSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBZercherSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SBSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/TBSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBSquatChains.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBFrontSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBLateralStepUp.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBRearLunge.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBStepUp.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/TBStraightBackStiffLegDeadlift.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBSingleLegSplitSquatOneArm.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBLungeFar.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBRearLunge.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBSingleLegSplitSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBBarSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBLungeOneArm.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBStandingHipExtentionFM.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBLungeGlute.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBSquatBeltGlute.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBStandingHipExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBStraightBackStifLegDeadlift.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBStepUp.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBSingleLegStiffLegDeadlift.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBSingleLegSplitSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBRearLunge.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBLungeGlute.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBSideLunge.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBSplitSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBFrontSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBWalkingLunge.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBSingleLegSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVBentOverRearKickPL.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBLateralStepUp.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBStepDown.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBStepUp.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVHackPressWide.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LV45DegLegPressWide.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVStraightBackStiffLegDeadlift.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSingleLeg45DegLegPressGluteL.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSingleLegLyingLegPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVLyingLegPressH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVAlternatingLegPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSingleLegSeatedLegPress2.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedLegPresWideH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVLyingHipExtentionH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVPowerRunnerPL.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVLyingLegPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSMReverseLunge.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVRearLunge.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSingleLegSplitSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSMSingleLegSplitSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSplitSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSMReverseLunge.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVReverseHyperExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSquatGlutePL2.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSingleLegSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSlidingSplitSquatPL.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSMSplitSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVBentOverHipExtention.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVHackSquatGlute.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVKneelingHipExtensionRoller.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVFullSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVFrontSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVStandingHipExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVLyingHipExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVLyingHipExtensionN.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVVSquatGluteH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVAlternatingKneelingHipExtRoller.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVStandingHipExtension2.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVKneelingHipExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSingleLegPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedLegPressGlute.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSquatGlute.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVStandingSingleLegPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVBentOverRearKick.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVAlternatingLyingLegPressN.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVVSquatGluteFM.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSingleLegVSquatGlute.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SLSingleLeg45DegreeLegPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSingleLegSplitVSquatGlute.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SL45DegLegPressWide.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVAlternatingSingleLegSplitVSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SLAlternating45LegPressGlute.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SLSeatedHackPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SLLyingLegPressPLGlute.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SLLyingSingleLegPressPL.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SLLyingLegPressGlute.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SLSingleLegLyingLegPressGlute.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SLStandingHipExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SLSeatedLegPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SLVerticalLegPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SLVerticalSingleLegPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SLSingleLegHackSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SLHackSquatGlute.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SLRearLunge.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SLSquatGlute.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SLKneelingHipExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SMSingleLegSplitSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SMStrBackStiffLegDeadlift.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SMSplitSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SMSingleLegSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SMRearLunge.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SMHackSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SMSquatGlutes.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SMFrontSquatGlute.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTFrontSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTPistolSquatFarLeg.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WtReverseHyperExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SMSquatWide.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWReverseHyperExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWLunge.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWSupineSingleLegHipBridge.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWSingleLegBenchSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWRecliningSingleLegPistolSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWReverseHyperExtensionBall.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWSingleLegSquatLegBack.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWSingleLegSquatPistol_.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWSingleLegStiffLegDeadlift_.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWSplitSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWSingleLegSplitSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWStepDown.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWStepUp.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/ASSingleLegSquatPistolSelf.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWSingleLegSquatSelfAssistLeg.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWLateralStepUp.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/ASStepDownSelf.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/ASVerticalPoleRecliningPistolSquats.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STHipBridge.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWAlternatingStepDown.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/30ef1c4275fd2c4cfaeeeb0d8dd02dc8.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STSingleLegSplitSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STPistolSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/601b4db67e8babb5ca963871f631d7d4.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/PCGlute8.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/596a1075c3ba2b462bf9673be6694ae9.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/432530b69b09c56a29da7a22cc0e8d08.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/777cefd67a1e210b525426dcbbb4e67d.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STSplitSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/9272e1aa7795cd6d69eeec84008ae2bc.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/054db6718469ffb535af273b9a17cc98.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/136d4f4b1a6032c4ea14eea7427436c6.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/58ce4a640c1833fb4a7f4e526d24f68e.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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','image/accfd2eb6746dc16fab0a4b4236c178f.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/66e6dd21450b69f03bbc492bafd6961d.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/9571fa8af0d75d538ce0eaa398a67954.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/KneeHug.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WalkingAnkleGrab.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVLyingAbduction.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBSeatedHipInternalRotation.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBLyingHipAbduction.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVStandingHipAbduction.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBLyingInternalHipRotation.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBHipAbduction.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedHipAbductionH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedHipAbduction.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WtLyingHipAbductionRear.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWBentKneeSideBridgeHipAbduction.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STHipAbduction.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWAngledSideBridgeHipAbduction.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWSideBridgeHipAbduction.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/44b37e1aab348eb93bafb89080cea192.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/dab35e72da31b59d94623a0640b1926c.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/9b05f865c78abdf92295a759ccbceacd.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/7a5b64ba949b42e3a72e160f92c2f955.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/f66b7fdbd9075369b00d1c2e07a25a7e.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/4d256a130280ed534e17716ef102c5fd.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/9d854b4a82b260b4f3808518acb59a7b.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/d82859f560a16796c812d0a3e19e610e.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/b579aa254b37411388e062c381fe3de2.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/c16a7f0b42ff96059d3f4ef4fec6107b.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/8afc9098cde1ca0a010ebc1a6d9df8b8.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBLyingLegRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBLyingLegRaiseBench.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBLegRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBStraightLegRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/ASKneelingWheelRollout.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVHipFlexion.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBStandingStraightLegRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVVerticalLegRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WtDeclineSitUp.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTHangingLegRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVLyingLegRaiseN.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WtInclineStraightLegRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WtInclineLegRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTInclineStraightLegRaiseArmPads.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WtLyingLegRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WtHangingStraightLegRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WtSeatedLegRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WtLegRaiseArmsPads.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTVerticalLegRaisePB.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WtVerticalLegRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTRomanChairSitup.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWHangingLegRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWHangingStraightLegRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWHangingLegRaiseAbStraps.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWInclineLegRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWInclineStraightLegRaiseArmPads.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WtVerticalStraightLegRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWLegRaiseArmsPads.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWLyingLegRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWInclineStraightLegRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWSimultaneousAlternatingLegRaises.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWVerticalLegRaisePB.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWVerticalLegRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWLyingStraightLegRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWSeatedLegRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWScissorsKicks.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWSimultaneousAltStraightLegRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWLyingBentLegRaiseFloor.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWRomanChairBench.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWVerticalStraightLegRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWJackKnifeBall.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWWheelPike.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWDiscPike.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWWheelJackknife.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/5dec96831a3cb85fb04c2c192e699f8c.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/7e0821bc06976b844c669e3e4c5a5b8f.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/96a7d17ea46181c828f7be181175434e.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STMountainClimber.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/PCHipFlexors8.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STPike.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/99a9392130283de0ac595065ad21a3f0.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/1acff9d0c5a6577673d144f23b4eb36e.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/80b72e66f678fe1c106d3f51c422d3f3.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBSeatedHipExternalRotation.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/6814ad0e04c771d1ee315fbce56de8fa.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/c4ab7a481b05c4dc34fc5daa95e2f72d.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/PCPeriformis8.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/c49b018ec1b80983d7d0e8c378f751d1.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBLyingExternalHipRotation.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/3bc2bfb10ed4b6ecdd493e2dacf3dcc4.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/eb19a49ba33c584eb6e916e0faf87d3b.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/ff6c6e39d18091125b4ce72a9c98d2e9.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/b1562667bd54d0e5b91470e22135b530.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/cd0fa842e5cae16357d90b063855ba67.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBSideSplitSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBSquatHigh.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBThreeQuarterSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBStandingLegExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBStepDown.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVLegExtensionH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVAlternatingLegExtensionPL.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVStandingSingleLegPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVFrontSquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVAlternatingLegExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVAlternatingLegExtensionUnilateral.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVLegExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVAlternatingLyingLegPressN.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SLSeatedHackPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SMStepDownQuad.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTSissySquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTSissySquatAp.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWSissySquat.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SissySquatAp.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWAlternatingStepDown.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/59c68250d668fa021bf4756f0d834455.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/f5d0adea1ef2e6f57ffb075662e5b805.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/8650332bac4a78ee12233f7f381967a7.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/PCQuadriceps8.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/2bfdf923775985d2c43a391f4974ac29.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/9e704875a65e1a3cec886b2d49e7212b.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/98c53b178d92d5e8dd7f7f0de119bc49.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/ad26b1a7a309d91749d8a2a408dc3bf0.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WalkingQuadStretch.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBGoodMorning.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBHipExtention.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBStraightBackStraightLegDeadlift.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/TBStrtBackStrtLegDeadlift.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBGluteHamRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBHamRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBHipExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBStraightBackStraightLegDeadlift.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBLyingLegCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBBentOverLegCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVKneelingLegCurlH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBStandingLegCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBStraightBackStraightLegDeadlift.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVLyingLegCurlH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVAlternatingLyingLegCurlH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVBentOverLegCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVLyingLegCurlRevHyperMachPL.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVStraightBackStraightLegDeadlift.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedLegCurlH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSingleLegSeatedLegCurlH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVAlternatingBentoverLegCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVKneelingLegCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVLyingLegCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVAlternatingLegCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVAlternatingStandingLegCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVStandingLegCurlonExt.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVStandingLegCurlHipMach.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedLegCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVStandingLegCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SMStrtBackStrtLegDeadlift.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SMGoodmorning.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVStraightLegLyingHipExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTHipExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTHipExtension2.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTHamRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWSingleLegHangingHamstringBridge.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWHangingHamstringBridge.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWHangingStraightHipLegCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWBallLegCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWWheelLegCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWHamRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWHangingLegCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/AsHamstringRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/ASHamstringRaiseSelf.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STHangingLegCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STHangingStraightHipLegCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STLegCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/d343918f30680d3ba702ed5afa8e8f06.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/f2666aa2a800fc2fe6dc36dee892faf1.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/ad3b598f490e6b8b995cb1340055bfb4.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STHamstringRunner2.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/STHamstringCurl.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/PCHamstring8.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(1539,'Seated Hamstring Stretch','Sit on floor or mat with knees straight.','Reach toward or beyond toes or bring torso toward legs. Hold stretch.','image/a422b3586f6873533c458303bf5eb3e4.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/57dc517f31121e83c57b6105b4a2ed96.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/5b56995e644b0d712ba1b67b2f8db277.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/7dc8003e4a2f4d121769db944044da4e.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/98bd050fcb0ea0c6998fb6de92b4d2e2.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LyingVerticalHamstringStretch.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(1545,'Standing Hamstring Stretch','Stand and bend over with knees straight.','Reach toward toes or floor or bring torso toward legs. Hold stretch.','image/91a7ef2697a2704d3c1a7d86d33aa879.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/a2bc88ca82564c16bdc1bc7f5d1c5ec0.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/ec248e61d0b6bbd886eeecbf4ef669b5.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/983c5c33d55888967b68cf2cb93db26c.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/2165e6dfac69ea56cf98ac8a23b1ccd7.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/f3a004d8d78c90f707422c91c7fefcf9.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SoldierKick.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SoldierKickIntermittent.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVStandingHipAdduction.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedHipAdduction.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBLyingHipAdduction.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVLyingAdduction.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WtLyingHipAdduction.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVHipAdductionH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBHipAdduction.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/e9193c7fc71f76f33a62c8b12d86ffa6.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/47cbe592bfdf56a5990239826ca76ad7.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/d183ca3634ed1a15ce4e86750dc12769.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/c048a0741ded61fa0dda2a92ef77b95c.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/495b5c75dd3cd406a20b460c59d9554b.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/2e5747087dc8bafff113bf6b80a668eb.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/PCGroin8.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/a27b9cca96504dabff67b776873d74e1.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/4a953ad380e1760b3e40028a0fdca304.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/34c9835255b7324f033509782d62fa19.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/517f3409f5a115f38d544800a5a1ffad.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/e6c0cc8d037dc5ec14ae367e397bf998.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/079df26ca2d76ff727a699a7a908aeb7.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/62c0cef1a94cf836a047d8c587d39a21.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/079df26ca2d76ff727a699a7a908aeb7.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/2fb387607233825c08f29be65f8612b2.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/95f43547ca7605ef764baea16ba1b9cc.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(1582,'Bent-over Adductor Magnus Stretch','Stand with one foot on chair or bench. Bend over.','Reach toward floor. Hold stretch.','image/81c5dc1f1d715c1f451f378fe03b9427.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/606b95ba87532c1a4ce991be5c7a6f0a.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/3e224ee57a9ee6e20edcd66d60ab1f14.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SFStandingCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBStandingCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBStandingCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBSingleLegCalfRaiseStirrup.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBSingleLegCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBSingleLegCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LV45DegCalfPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedCalfExtensionH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVDonkeyCalfRaisePL.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVCalfRaiseHackPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVVCalfRaisePL.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedCalfPressH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedCalfExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVStandingCalfRaisePL.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LV45DegreeCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVDonkeyCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVAlterSeatedCalfExtStrLeg.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedCalfPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedCalfExtensionBentKnees.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVStandingCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVStandingCalfRaiseBelt.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SL45DegAlternCalfPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SL45DegreeCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SL45DegCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVForwardAngledCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SLDonkeyCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/HackCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SLLyingCalfPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SLLyingCalfPressPL.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SL45DegCalfPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SLSeatedCalfPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SLVerticalCalfPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SMStandCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SMDonkeyCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SLStandingCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WTSingleLegCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SLFrontCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/WtDonkeyCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWSingleLegCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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:','image/2148f0312430e4335a53af5b850a45d7.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/a0e542a3b6a5a73791a91a9581d07a03.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/ASSingleLegCalfRaiseSelfPull.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/ASSingleLegCalfRaiseSelfFoot.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/72e16e3fd573bcad77e28416da6e9be4.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWSingleLegForwardAngledCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/ad4308a843d634d40a8009930853b52c.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/4ce1dd65b26d1b568fad686821e5f401.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/c9a754ea29b499f34e3b68b97a279195.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/0ab540f8815536fe46c029b18f1aee83.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedCalfRaiseExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SBSeatedCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVBentKneeSeatedCalfExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/d2e7c4e33d630b74700bd7539f474b55.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/10fd5c6c923c1b4f5aa350ab1ae994ff.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVAltBentKneeSeatedCalfExt.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedCalfRaiseH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SMSeatedCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/824cb4509c44d51beaef7d84c2bdd8dc.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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:','image/9ec26b4ff7c9ddfd683bc06970ad16e7.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/a76413823656f25915cf5e643ee9ee78.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/8102281e325bb7441e79e5f13d306c10.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/c779d0bfc0ebedf9c3a06e0392788c32.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/6735c80e66fbedcb5332915a053127b5.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/9fccaf897f02ea7677d2fd16d72d5716.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBSingleLegReverseCalfRaise1.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BBReverseCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBSingleLegReverseCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedReverseCalfExtensionH.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LV45ReverseCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SBReverseCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/CBReverseCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBReverseCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LV45DegReverseCalfPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVReverseVCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVReverseCalfRaisePL.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVReverseCalfExtension.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVDonkeyReverseCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSSeatedTibiaRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVReverseCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSingleLegSeatedTibiaRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SL45ReverseCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVStandingTibiaRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SL45DegReverseCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SL45DegReverseCalfPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/LVSeatedReverseCalfPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SLDonkeyReverseCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SLLyingReverseCalfPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SL45ReverseCalfRaiseHackPressPL.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SLHackReverseCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SLStandingReverseCalfRaisePL.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SLLyingReverseCalfPressPL.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SLStandingReverseCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SMReverseCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/DBReverseCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/SLSeatedReverseCalfPress.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/6f8914a8ffb2d11f8beb1556ceaeeffb.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/5cdf2831c84a57c531f5f6fbd084bcdf.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/54b780357143690c4f905794962e7e29.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(1686,'Lying Shin Stretch','Lie on one side. Grasp top forefoot behind.','Pull forefoot to lower back. Hold stretch. Repeat with opposite foot.','image/db4e77e1aa267a1a61f9d75ad4d27030.jpg','system','2021-06-27 13:36:24',NULL,NULL,0,'N'),(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.','image/BWSingleLegReverseCalfRaise.gif','system','2021-06-27 13:36:24',NULL,NULL,0,'N'); +/*!40000 ALTER TABLE `exercise_0` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `exercise_1` +-- + +DROP TABLE IF EXISTS `exercise_1`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `exercise_1` ( + `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` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'system' COMMENT 'Created by', + `created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Created time', + `modified_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT 'system' COMMENT 'Modified by', + `modified_time` datetime DEFAULT NULL COMMENT 'Modified time', + `version` int unsigned NOT NULL DEFAULT '0' COMMENT 'Optimistic locking', + `deleted` enum('N','Y') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'N' COMMENT 'Deleted. ''N'' - not deleted; ''Y'' - deleted', + PRIMARY KEY (`id`), + UNIQUE KEY `exercise_name_uindex` (`name`) +) ENGINE=InnoDB 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_1` +-- + +LOCK TABLES `exercise_1` WRITE; +/*!40000 ALTER TABLE `exercise_1` DISABLE KEYS */; +/*!40000 ALTER TABLE `exercise_1` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `exercise_classification_0` +-- + +DROP TABLE IF EXISTS `exercise_classification_0`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `exercise_classification_0` ( + `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` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'system' COMMENT 'Created by', + `created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Created time', + `modified_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT 'system' COMMENT 'Modified by', + `modified_time` datetime DEFAULT NULL COMMENT 'Modified time', + `version` int unsigned NOT NULL DEFAULT '0' COMMENT 'Optimistic locking', + `deleted` enum('N','Y') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'N' COMMENT 'Deleted. ''N'' - not deleted; ''Y'' - 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_0` +-- + +LOCK TABLES `exercise_classification_0` WRITE; +/*!40000 ALTER TABLE `exercise_classification_0` DISABLE KEYS */; +INSERT INTO `exercise_classification_0` 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','system','2021-06-27 13:38:55',NULL,NULL,0,'N'),(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','system','2021-06-27 13:38:55',NULL,NULL,0,'N'),(3,'Compound','An exercise that involves two or more joint movements.','system','2021-06-27 13:38:55',NULL,NULL,0,'N'),(4,'Isolated','An exercise that involves just one discernible joint movement.\nPull','system','2021-06-27 13:38:55',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:38:55',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:38:55',NULL,NULL,0,'N'),(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).','system','2021-06-27 13:38:55',NULL,NULL,0,'N'),(8,'Push','Movement away from center of body during the concentric contraction of the target muscle. Isolated movements are classified by their compound counterparts.','system','2021-06-27 13:38:55',NULL,NULL,0,'N'),(9,'Pull','Movement toward center of body during the concentric contraction of the target muscle. Isolated movements are classified by their compound counterparts.','system','2021-06-27 13:38:55',NULL,NULL,0,'N'); +/*!40000 ALTER TABLE `exercise_classification_0` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `exercise_classification_1` +-- + +DROP TABLE IF EXISTS `exercise_classification_1`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `exercise_classification_1` ( + `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` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'system' COMMENT 'Created by', + `created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Created time', + `modified_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT 'system' COMMENT 'Modified by', + `modified_time` datetime DEFAULT NULL COMMENT 'Modified time', + `version` int unsigned NOT NULL DEFAULT '0' COMMENT 'Optimistic locking', + `deleted` enum('N','Y') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'N' COMMENT 'Deleted. ''N'' - not deleted; ''Y'' - deleted', + PRIMARY KEY (`id`), + UNIQUE KEY `exercise_classification_name_uindex` (`name`) +) ENGINE=InnoDB 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_1` +-- + +LOCK TABLES `exercise_classification_1` WRITE; +/*!40000 ALTER TABLE `exercise_classification_1` DISABLE KEYS */; +/*!40000 ALTER TABLE `exercise_classification_1` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `exercise_comment_0` +-- + +DROP TABLE IF EXISTS `exercise_comment_0`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `exercise_comment_0` ( + `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` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'system' COMMENT 'Created by', + `created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Created time', + `modified_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT 'system' COMMENT 'Modified by', + `modified_time` datetime DEFAULT NULL COMMENT 'Modified time', + `version` int unsigned NOT NULL DEFAULT '0' COMMENT 'Optimistic locking', + `deleted` enum('N','Y') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'N' COMMENT 'Deleted. ''N'' - not deleted; ''Y'' - 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_0` +-- + +LOCK TABLES `exercise_comment_0` WRITE; +/*!40000 ALTER TABLE `exercise_comment_0` DISABLE KEYS */; +INSERT INTO `exercise_comment_0` 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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(3,3,'None','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(5,5,'See all muscle used in Lateral Flexion:','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(7,7,'See all muscle used in Lateral Flexion:','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(8,8,'None','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(11,11,'See all muscle used in Lateral Flexion:','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(12,12,'Head can be pulled toward back.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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:','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(16,16,'Exercise involves neck flexors as well as neck extensors. See controversial exercises.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(19,19,'No comment.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(20,20,'None','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(21,21,'None','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(24,25,'Exercise can also be performed by bending over with hands on bent knees.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(27,28,'See controversial exercises.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(29,29,'Also known as wrestler\'s bridge. See controversial exercises.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(30,30,'None.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(34,34,'Movement can also be performed on old fashioned incline bench without seat.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(38,38,'Exercise may also be performed seated, straddling bench or on weight chair with back support.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(47,46,'Wrists maintain their approximate position above each elbow throughout movement.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(48,48,'Movement can also be performed on old fashion incline bench without seat.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(49,49,'Internal rotation of far hip (opposite side with resistance) is much greater than spinal rotation.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(54,54,'See suggested mount and dismount when using heavy dumbbells.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(55,55,'Range of motion will be compromised if grip is too wide.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(57,57,'Range of motion will be compromised if grip is too wide.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(58,59,'Torso can lean away for balance as shown or torso can maintain upright posture. Also see Kettlebell Press.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(61,61,'Range of motion will be compromised if grip is too wide.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(62,62,'Pull head back slightly so bar does not head. Range of motion will be compromised if grip is too wide.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(63,63,'Keep back straight when lifting end of barbell from floor. Also see Lever One Arm Press for power.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(64,64,'Range of motion will be compromised if grip is too wide.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(65,65,'Range of motion will be compromised if grip is too wide.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(66,66,'Range of motion will be compromised if grip is too wide.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(67,67,'Range of motion will be compromised if grip is too wide.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(68,68,'Parallel grip can be used for variety or when flexibility does not permit standard overhand grip further back.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(69,69,'Range of motion will be compromised if grip is too wide.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(70,70,'Parallel grip can be used for variety or when flexibility does not permit standard overhand grip further back.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(71,71,'Pull head back slightly so bar does not head. Range of motion will be compromised if grip is too wide.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(72,72,'Range of motion will be compromised if grip is too wide.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(74,74,'Instead of scooting hips forward, hands can be eased backwards.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(75,75,'See PNF stretch techniques. Also see Seated Front Deltoid Stretch for similar static stretch.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(76,76,'A stationary bar can also be used instead of wall.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(78,78,'Keep knees and back straight. A slight curve (spinal flexion) is acceptable if hamstrings are tight.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(80,80,'A stationary bar can also be used instead of wall.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(82,82,'Bar can be received from barbell rack, standing behind bar\nmid-thigh height. See\nUpright\nRow Safety.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(83,84,'Bar can be recieved from barbell rack, standing behind bar mid-thigh height. See Upright Row Safety.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(84,86,'See Upright Row Safety.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(85,83,'Maintain fixed elbow position (10° to 30° angle) throughout exercise. Stirrup is raised by shoulder abduction, not external rotation.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(87,87,'See Upright Row Safety.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(89,89,'See Upright Row Safety.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(90,90,'See\nUpright Row Safety.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(91,91,'Maintain fixed slightly bent elbow position throughout exercise. Stirrup is raised by shoulder abduction, not external rotation.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(94,95,'See Upright\nRow Safety. Also see side view.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(98,98,'Setup requires attaching two stirrup attachments to single pulley cable. Also see Cable Upright Row with dual pulley. See Upright Row Safety.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(100,100,'Dumbbell is raised by shoulder abduction, not external rotation.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(102,102,'See Upright Row Safety.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(103,103,'When dumbbells are raised, wrist can be flexed, extended, or keep neutral.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(105,105,'See Upright Row Safety. Also see Seated Upright Row.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(106,107,'None.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(108,106,'If necessary, lean forward slightly to keep elbows directly lateral to body. Also see alternative machine.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(110,110,'If elbows drop much lower than wrists, front deltoids become primary mover instead of lateral deltoids.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(111,112,'Positioning arm on upper chest stretches rear deltoid. See Rear Delt Stretch.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(112,113,'None','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(114,115,'See Upright\nRow Safety.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(115,116,'See Upright Row Safety.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(117,118,'Upper arms should travel in horizontal path at shoulder height (not downward) to minimize Latissimus Dorsi involvement.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(118,119,'The relatively powerful Latissimus\nDorsi\n becomes involved:','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(120,121,'Flexion of wrist can allow for slightly greater range of movement near top, but this movement optional.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(121,122,'Upper arms should travel in horizontal path at shoulder height (not downward) to minimize Latissimus Dorsi involvement.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(122,123,'Elbow width is determined when elbows are raised at height of shoulders out to sides. The relatively powerful Latissimus Dorsi becomes involved:','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(124,125,'Upper arm should travel in horizontal path at shoulder height (not downward) to minimize Latissimus Dorsi involvement.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(125,126,'Dual pulley cables should be positioned approximately shoulder height or not much lower.\n\n\nThe relatively powerful Latissimus Dorsi becomes involved:','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(126,127,'The relatively powerful Latissimus Dorsi becomes involved:','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(127,128,'The relatively powerful Latissimus Dorsi becomes involved:','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(129,130,'Upper arm should travel in perpendicular path to torso to minimize Latissimus Dorsi involvement.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(130,131,'The relatively powerful Latissimus Dorsi becomes involved:','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(134,135,'Latissimus Dorsi becomes involved if elbows drop below shoulders.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(135,136,'The relatively powerful Latissimus Dorsi becomes involved:','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(136,137,'Maintain fixed elbow position straight or slightly bent and keep upper arm perpendicular to trunk throughout exercise.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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).','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(142,145,'None.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(145,147,'Upper arm should travel in perpendicular path to torso to minimize Latissimus Dorsi involvement.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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).','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(161,164,'Positioning arm on lower chest stretches side deltoid. See Side Delt Stretch.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(162,165,'None','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(167,171,'Maintain straight or nearly straight elbow position with elbows pointing outward throughout exercise.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(169,173,'See mount and dismount. Some assisted machines require you to kneel on pad. Also see Assisted Chest Dip.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(171,175,'See mount and dismount. Some assisted machines require you to stand on bar. Also see Assisted Chest Dip.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(172,177,'Grip can be slightly narrower than shoulder width but not too close. Also see Bench Press Analysis.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(178,182,'Let cable resistance pull arm back to maintain degree of shoulder flexion, dependent upon flexibility.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(179,183,'Keep elbow approximately same position throughout movement.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(181,185,'Let cable resistance pull arm back to maintain degree of shoulder flexion, dependent upon flexibility.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(182,186,'With arms fully extended, shoulders can be internally rotated between repetitions as needed to allow for relative release of tension in muscles.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(183,187,'Let cable attachment pull arm back to maintain full shoulder flexion.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(186,190,'The elbow can travel up slightly at top of motion. Stay close to cable to provide resistance at top of motion.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(187,191,'The elbow can travel up slightly at top of motion. Stay close to cable to provide resistance at top of motion.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(188,192,'If seat is positioned back behind pulleys as shown, bending forward can provide resistance at top of motion. See Angle of Pull.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(190,194,'Stand far enough away from pulley to keep cable taut in lowered position. Keep elbow approximately same position throughout movement.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(191,195,'The elbow can travel up slightly at top of motion. Stay close to cable to provide resistance at top of motion.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(192,197,'The elbow can travel up few inches at top of motion. Step close to cable to provide resistance at top of motion.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(193,196,'Keep back against back pad throughout exercise.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(197,201,'Let cable attachment pull arm back to maintain full shoulder flexion.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(198,202,'Let cable pull arm back to maintain full shoulder flexion. Also see exercise with Supinated Grip.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(201,205,'For greater range of motion, upper arm can be positioned with elbow slightly higher than shoulder. Also see Triceps Kickback Errors.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(202,206,'Keep elbows pointed up or just slightly back throughout movement.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(204,208,'Movement can also be performed on old fashioned incline bench without seat.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(206,210,'Let dumbbell pull back arm to maintain full shoulder flexion. Consider using seat with back support.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(208,212,'Grip can be slightly narrower than shoulder width but not too close. Also see Bench Press Analysis.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(209,213,'When finished, push foot lever down, release handles, then release foot lever.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(210,214,'When finished, push foot lever down, release handles, then release foot lever.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(211,215,'Also see movement performed on alternative machine.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(213,217,'Also see Lever Chest Dip.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(215,219,'See exercise on alternative machine. Also see Lever Chest Dip on machine facing away from fulcrum and Lever Chest Dip.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(217,222,'Also Lever Parallel Grip Incline Bench Press for upper chest.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(218,223,'If machine has secondary lever (as shown), elbows do not have to be exactly aligned with primary fulcrum.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(220,225,'This particular machine design is rare. See typical dip machines:​​​​','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(221,226,'Grip can be slightly narrower than shoulder width but not too close. Also see Bench Press Analysis.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(222,228,'Also see parallel grip Lever Triceps Dip and Lever Chest Dip.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(223,229,'Grip can be slightly narrower than shoulder width but not too close. Also see Bench Press Analysis.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(225,231,'Also see Weighted Chest Dips.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(228,234,'Bench height should allow for full range of motion.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(229,235,'Both upper and lower body must be kept straight throughout movement. See wider grip push-up.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(230,236,'Bench height should allow for full range of motion.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(231,237,'Also see Band-assisted Chest Dips.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(232,238,'Bench height should allow for full range of motion.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(233,240,'Also see Chest Dips.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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).','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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).','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(241,249,'None.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(242,250,'See Overhead Lat Stretch for similar exercise which can be performed with this stretch.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(258,267,'A stationary bar can also be used instead of wall.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(259,268,'Instead of scooting hips forward, hands can be eased backwards.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(263,270,'Easier','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(264,272,'None.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(265,273,'Participant\'s wrists must continue to face downward. See PNF stretch techniques. Also see Seated Biceps Stretch for similar static stretch.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(266,274,'A stationary bar can also be used instead of wall.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(291,299,'Body should be positioned to allow arm pit to rest near top of pad. Back of upper arm should remain on pad.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(300,308,'Seat should be adjusted to allow arm pit to rest near top of pad. Back of upper arm should remain on pad.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(304,312,'None.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(306,314,'Hand may be placed under wrist (as demonstrated) to offer stability and to maintain horizontal orientation of forearm.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(307,315,'Keep elbows approximately wrist height to maintain resistance through full range of motion.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(308,316,'If half loaded dumbbell is not available, one of two substitutes can be used.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(309,317,'None.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(310,319,'Also see muscles for finger articulations and thumb articulations.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(312,320,'Also see muscles for finger articulations and thumb articulations. See lever grip up close.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(313,321,'Keep forearms horizontal, flat on arm pads throughout exercise. See wrist curl up close.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(314,322,'None.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(315,323,'See sled grip up close. Also see muscles for finger articulations and thumb articulations.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(316,324,'Also see muscles for finger articulations and thumb articulations.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(317,325,'Also see muscles for finger articulations and thumb articulations.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(318,326,'Also see Lever Roller Wrist Extension.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(319,327,'None','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(320,329,'Keep arms straight.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(321,330,'None','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(322,331,'Keep elbows straight.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(323,332,'Exercise is performed on specialized piece of equipment which includes knobs at each end of wrist roller.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(324,328,'See exercise on alternative machine. Also see muscles for finger articulations and thumb articulations.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(325,333,'If half loaded dumbbell is not available, one of two substitutes can be used.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(326,334,'Do not allow elbows to rise.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(328,336,'None.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(330,338,'Keep elbows approximately wrist height to maintain resistance through full range of motion.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(331,340,'None.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(333,341,'Keep forearms horizontal, flat on arm pads throughout exercise. See reverse wrist curl up close.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(334,342,'Exercise is performed on specialized piece of equipment which includes knobs at each end of wrist roller.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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)','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(336,344,'Keep elbows straight.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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).','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(349,357,'Bench should be high enough to allow shoulders to stretch forward without barbell hitting floor.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(350,358,'Also see Cable Incline Row.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(354,361,'Allow scapula to articulate, but do not rotate torso.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(357,365,'Also see Cable One Arm Seated Row.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(365,373,'Also see Cable Seated Row.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(366,374,'Also see Cable Wide Grip Seated Row.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(369,377,'Also see Cable Standing Row with medium height pulley.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(370,378,'Bench should be high enough to allow shoulders to stretch forward without dumbbells hitting floor.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(378,386,'Unique apparatus designed and built by Tracey Cheuvront.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(380,389,'None.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(381,388,'None.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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).','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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).','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(390,399,'Seat or grip should be adjusted to allow wrists to follow elbows.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(391,401,'Seat should be adjusted to allow for full range of motion. Also see Lever Seated Hammer High Row.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(396,407,'Seat or grip should be adjusted to allow wrists to follow elbows.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(397,408,'Seat or grip should be adjusted to allow wrists to follow elbows.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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).','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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).','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(407,421,'None','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(409,424,'To intensify stretch, look up or to one side.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(418,432,'Muscles listed as Stabilizers become Synergists if spinal lateral flexion occurs during exercise.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(420,434,'Exercise can be performed with V-Bar or Multi-exercise Bar.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(422,436,'Stirrups are attached to split pulley.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(423,437,'Muscles listed as Stabilizers become Synergists if spinal lateral flexion occurs during exercise.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(424,438,'Range of motion will be compromised if grip is too wide.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(425,440,'Keep hips and torso in same position throughout movement.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(426,439,'Stirrups are attached to split pulley.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(427,441,'Parallel Grip Cable Attachment is shorter than Pro Lat Bar, yet longer than Close Grip Cable Attachments.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(428,442,'Stirrups are attached to split pulley.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(430,444,'Range of motion will be compromised if grip is too wide.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(431,445,'Stirrups are attached to split pulley.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(432,446,'Fix elbows approximately 30° throughout exercise. Also known as Straight Arm Pulldown.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(433,447,'If weight bottoms out at bottom of movement, attach cable on chain links nearer ends of dip belt.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(434,448,'If weight bottoms out at bottom, attach cable on chain links nearer ends of dip belt.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(439,453,'Range of motion will be compromised if grip is too wide.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(440,454,'Erector Spinae can become slightly engaged when torso arches back.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(442,456,'None','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(443,457,'Range of motion will be compromised if grip is too wide.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(444,458,'None','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(445,459,'See pad kick down on Hammer Machine. Also see movement on alternative machine.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(446,460,'Range of motion will be compromised if grip is too wide.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(447,462,'Actual range of motion is dependent upon individual shoulder flexibility.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(448,463,'Erector Spinae can become slightly engaged when torso arches back.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(449,464,'None','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(451,467,'See pad kick down on Hammer Machine. Also see exercise on alternative machine.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(454,471,'Also see Lever Pulldown.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(455,473,'Added weight can be placed on dip belt or dumbbell can be placed between ankles.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(456,474,'Added weight can be placed on dip belt or dumbbell can be placed between ankles.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(458,475,'See pad kick down on Hammer Machine.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(466,485,'Easier','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(468,487,'Range of motion will be compromised if grip is too wide.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(469,489,'Range of motion will be compromised if grip is too wide.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(471,490,'Special angled pull-up bar assembly is shown.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(472,491,'Range of motion will be compromised if grip is too wide.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(473,492,'Partner can assist as needed by pulling ankles or top feet up from behind. Also see self-assisted technique.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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 .','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(480,500,'Triceps become more involved if shoulders are keep close to wrists.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(483,502,'None.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(484,504,'To intensify stretch, look up or to one side.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(485,503,'Try to keep elbows nearly straight throughout exercise. Also known as Stability Ball Kneeling Rollout.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(486,505,'None.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(487,506,'Avoid overstressing neck anteriorly. See Overhead Triceps Stretch for similar exercise which can be performed with this stretch.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(488,507,'Allow shoulder to raise toward side of head for greater stretch.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(489,509,'Alternatively, forearms can be placed on wall, parallel with elbows pointed downward.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(490,508,'Allow shoulder to raise toward side of head for greater stretch.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(513,532,'None.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(515,534,'None','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(516,535,'None','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(517,536,'Throughout movement, keep bent elbow (approximately 90°) in front of body, chest or shoulder height.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(519,537,'Maintain elbow against side and fixed elbow position (90° angle) throughout exercise. Exercise may be performed standing with medium high pulley.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(521,541,'Throughout movement, keep bent elbow (approximately 90°) out to side, shoulder height.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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:','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(524,543,'Adjust lever and body orientation to achieve full range of motion.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(525,544,'Throughout movement, keep bent elbow (approximately 90°) out to side, shoulder height.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(528,547,'Lean torso toward positioned arm if stretch is not yet felt.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(529,548,'None.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(530,549,'Keep back straight.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(531,550,'None.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(532,551,'None.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(537,556,'Adjust lever and body orientation to achieve full range of motion.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(538,559,'Bent knees slightly so stretch is not limited by hamstring flexibility and to keep shoulder from being pushed forward.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(540,557,'Maintain elbow against side and fixed elbow position throughout exercise. Exercise may be performed standing with medium high / adjustable pulley','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(541,560,'None.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(544,563,'See mount and dismount. Some assisted machines require you to standing on bar. Also see Assisted Triceps Dip.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(548,567,'Range of motion will be compromised if grip is too wide.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(554,573,'Shoulders are kept internally rotated so elbows are pointing back\n\n\nand out to sides.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(560,579,'The effective range of motion of Pectoralis Major is only about half of what it is in non-twisting movement.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(561,580,'Range of motion will be compromised if grip is too wide. Also see Bench Press Analysis and Cable Bar Standing Bench Press.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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).','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(576,595,'Range of motion will be compromised if grip is too wide. Also see Bench Press Analysis.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(577,596,'Actual range of motion is dependent upon individual shoulder flexibility. Keep elbows fixed at small bend throughout exercise. See suggested mount & dismount.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(578,597,'Range of motion will be compromised if grip is too wide. Also see Bench Press Analysis.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(579,598,'Also see Lever Triceps Dip.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(580,599,'See Lever Chest Dip on machine facing fulcrum. Also see Lever Triceps Dip.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(581,602,'Range of motion will be compromised if grip is too wide. Also see Bench Press Analysis.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(582,603,'None.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(583,604,'None','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(585,606,'Shoulders should be internally rotated so elbows are pointing back at beginning of motion and outward at end of motion.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(586,608,'Shoulders should be internally rotated so elbows are pointing backwards at beginning of motion and forward at completion of motion.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(589,611,'Shoulders should be internally rotated so elbows are pointing downward at bottom of motion and outward at top of motion.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(590,612,'Range of motion will be compromised if grip is too wide. Also see Bench Press Analysis.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(591,613,'Range of motion will be compromised if grip is too wide.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(595,619,'Both the machine design and handle orientation are rare. See typical dip machines:','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(596,617,'Range of motion will be compromised if grip is too wide.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(597,621,'Range of motion will be compromised if grip is too wide. Also see Bench Press Analysis.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(598,620,'This particular machine design is rare. See typical dip machines:','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(600,624,'Also see Triceps Dip.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(602,625,'Also see Band-assisted Triceps Dip.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(603,628,'Both upper and lower body must be kept straight throughout movement. See close grip push-up. Also see push-up test calculator.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(606,629,'Added weight can be placed on dip belt or dumbbell can be placed between ankles. Also see Weighted Triceps Dip.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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).','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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).','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(614,637,'Hands may be clasped. Keep head upright.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(618,641,'Upper chest becomes more stretched with elbow lower. Lower chest and pectoralis minor become more stretched with elbow higher.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(619,642,'None','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(620,643,'Participants hands can be clasped. See PNF stretch techniques. Also see Behind Head Chest Stretch for similar static stretch.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(621,644,'Upper chest becomes more stretched with elbow lower. Lower chest and pectoralis minor become more stretched with elbow higher.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(623,646,'Range of motion will be compromised if grip is too wide.\n\n\nAlso see Bench Press Analysis.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(626,649,'Stirrup should follow slight arch pattern, above upper arm between elbow and chest at bottom, traveling inward over each shoulder at top.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(627,648,'Range of motion will be compromised if grip is too wide. Also see Bench Press Analysis.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(631,653,'None','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(633,657,'Range of motion will be compromised if grip is too wide.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(642,664,'Range of motion will be compromised if grip is too wide.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(643,668,'Elbows should be pointing downward at bottom of motion and outward on top of motion.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(644,666,'Range of motion will be compromised if grip is too wide.\n\n\nAlso see Bench Press Analysis.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(649,677,'None.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(651,679,'Keep arms straight throughout execution. For convenience, exercise can be performed immediately after warm up on Lever Incline Chest Press.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(652,680,'Keep arms straight throughout execution. For convenience, exercise can be performed immediately after warm up on Barbell Incline Chest Press.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(653,681,'Keep arms straight throughout execution. For convenience, exercise can be performed immediately after warm up on Dumbbell Incline Chest Press.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(654,685,'None','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(655,682,'Keep arms straight throughout execution. For convenience, exercise can be performed immediately after warm up on Cable Incline Chest Press.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(657,686,'Keep arms straight throughout execution. For convenience, exercise can be performed immediately after warm up on Smith Incline Chest Press.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(658,687,'Both upper and lower body must be kept straight throughout movement. See similar Push-up exercises targeting Pectoralis Major.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(663,693,'See Spot Reduction Myth. Also see movement performed on selectorized apparatus.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(666,696,'See Spot Reduction Myth. Also see movement performed on dedicated apparatus or plate loaded apparatus.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(668,698,'Keep arms fixed in position keeping them close to body throughout movement. See Spot Reduction Myth.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(671,701,'Lever fulcrum should be aligned with waist, not hips. See Spot Reduction Myth.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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:','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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:','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(675,707,'See Spot Reduction Myth.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(676,705,'Lever fulcrum should be aligned with waist, not hips. Some lever lying crunch machines have handles to sides. See Spot Reduction Myth.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(680,710,'See Spot Reduction Myth.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(681,711,'On some models, feet can be positioned behind pad under seat. See Spot Reduction Myth.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(685,716,'Taller individuals will place feet on floor, whereas shorter individuals will place feet on feet bars. See Spot Reduction Myth.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(686,715,'See Spot Reduction Myth.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(687,717,'See Spot Reduction Myth.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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).','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(708,738,'Seat can also be locked straight or to one side. See Spot Reduction Myth.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(716,745,'Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. See Spot Reduction Myth.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(717,747,'Leg elevation keeps pelvis tilted back, keeping low back on mat. See Spot Reduction Myth.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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 .','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(737,767,'See Arm Position During Waist Exercises.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(742,775,'None.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(746,778,'Muscles are exercised isometrically. Exercise can also be performed with straight supporting arms in pushup stance. Also see Spot Reduction Myth.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(748,780,'The lying (supine) stretch may be more appropriate for certain populations than other more advanced abdominal stretches .','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(749,781,'Pelvis may anteriorly rotate slightly.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(751,783,'See Spot Reduction Myth.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(755,788,'Keep stirrup attachment near side of shoulder with elbow down to side. See Spot Reduction Myth.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(761,794,'See Spot Reduction Myth.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(763,796,'Maintain shoulder fixed at approximately 90º so upper arm and upper back are perpendicular. See Spot Reduction Myth.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(765,800,'See Spot Reduction Myth.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(766,799,'See Spot Reduction Myth.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(767,801,'Keep arm holding dumbbell approximately vertical (below shoulder) throughout movement. See Spot Reduction Myth and Arm Position During Waist Exercises.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(768,802,'See Spot Reduction Myth.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(770,805,'See Spot Reduction Myth.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(772,809,'Stand on platform if lever is too high to allow for full range of movement. See Spot Reduction Myth.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(775,812,'See Spot Reduction Myth and Arm Position During Waist Exercises.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(781,827,'Maintain knee position throughout movement. See Spot Reduction Myth.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(782,829,'Maintain knee position throughout movement. See Spot Reduction Myth.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(785,832,'See alternative form. Also see Spot Reduction Myth and Arm Position During Waist Exercises.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(786,833,'See Spot Reduction Myth.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(793,841,'Certain individuals may need to keep their neck in neutral position with space between their chin and sternum. See Spot Reduction Myth.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(801,848,'Leg elevation keeps pelvis tilted back keeping low back on mat. See Spot Reduction Myth.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(802,849,'Maintain 90° flexion in hip with both shoulders flat on floor.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(803,850,'Also see Pretzel Stretch for Hip Abductors for similar exercise which can be performed with this stretch.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(813,859,'Target muscle is exercised isometrically. Heavy barbell deadlifts significantly engages Latissmus Dorsi.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(821,868,'Target muscle is exercised isometrically\n\n\n. Throughout lift, keep hips low, shoulders high, arms and back straight.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(828,876,'Apparatus shown does not allow for full spinal flexion, only allowing for last half of spinal extension.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(836,886,'If weight is positioned behind head, neck extensors act as stabilizers:','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(838,889,'If weight is positioned behind head, neck extensors act as stabilizers:','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(844,896,'Lift leg and arm deliberately with no jerking. Also see Alternating Bird Dog.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(845,897,'Lift legs and arms deliberately with no jerking. Also see Bird Dog.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(847,899,'Lift leg and arm deliberately with no jerking. Also see Bird Dog (on exercise ball).','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(849,901,'Lift leg and arm deliberately with no jerking. Also see Alternating Bird Dog (one exercise ball).','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(850,902,'Lift legs and upper body slowly with no jerking or fast movements. Also see Contralateral Superman.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(851,903,'Lift legs and arms deliberately with no jerking. Also see bilateral movement: Superman.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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:','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(854,906,'Also see Cat Movement.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(855,907,'Muscles are exercised isometrically.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(856,908,'None','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(857,909,'Also see Cat Stretch.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(858,910,'Upper back can also be lifted off of floor to stretch Splenius and cervical portion of Erector Spinae.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(859,911,'Elbows can be lowered to floor.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(860,912,'None','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(862,915,'Muscles are exercised isometrically.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(863,916,'None','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(864,917,'Keep knees pointed same direction as toes. The Soleus may be slightly stretched before leaning back.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(865,918,'Avoid overstressing neck anteriorly.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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:','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(898,961,'Also see Cable Bent-over Hip Extension for more bent over posture.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(902,966,'Also see Cable Standing Hip Extension for more upright posture.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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 .','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(915,979,'None','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(928,995,'Adjust yoke position to accommodate near full range of motion without forcing hips to bend at waist. Also see Lever Sprint Machine.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(930,994,'Also see Lever Lying Hip Extension on selectorized machine.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(944,1011,'Exercise can be performed alternating between sides.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(946,1014,'None','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(948,1015,'Also Lever Lying Hip Extension on plate loaded machine and Lever Alternating Lying Hip Extension on another selectorized machine.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(951,1018,'Exercise can be performed with one leg, then other leg. See Lever Kneeling Hip Extension (roller pad).','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(952,1019,'Shorter individuals should stand on higher platform and may be bent over more.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(953,1020,'None','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(956,1024,'With greater resistances, more effort is required to pull on handle bars to keep body from rising upward.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(958,1025,'None','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(972,1039,'None','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(980,1048,'None','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(994,1064,'Also see Reverse Hyper-extension performed with exercise ball on bench.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(999,1069,'Since knee is initially bent significantly, hamstrings are not significantly involved. Also see Reverse Hyper-extension performed with exercise ball on bench.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1006,1076,'Keep torso upright during exercise. Knee of exercised leg should point same direction as foot. See front view.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1009,1079,'Supporting knee should point same direction as foot throughout movement.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1015,1085,'Notice knee extends out to side more than Lying Piriformis Stretch. Also see Lying Glute Stretch for alternative form.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1018,1090,'Ankle can be placed on top edge of shin pad if it can not be positioned above knee.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1019,1089,'See PNF stretch techniques. Also see Modified Lying Glute Stretch for similar static stretch.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1020,1091,'None.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1021,1092,'Allow hip to straighten toward floor for additional hip flexor stretch.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1022,1093,'This exercise can be performed if thigh can not be reached or held on to during Lying Glute Stretch.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1025,1096,'Spine may be kept straight. Pelvis may be tilted forward to intensify stretch.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1026,1097,'Spine may be kept straight. Pelvis may be tilted forward to intensify stretch.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1027,1098,'Spine may be kept straight. Pelvis may be tilted forward to intensify stretch.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1028,1099,'See PNF stretch techniques. The Seated Glute Stretch can also be performed as static stretch.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1029,1100,'Spine may be kept straight. Pelvis may be tilted forward to intensify stretch.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1030,1101,'Spine may be kept straight. Pelvis may be tilted forward to intensify stretch.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1031,1102,'This Dynamic Stretch can performed before athletic event or sports training session.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1032,1103,'This Dynamic Stretch can performed before athletic event or sports training session. Also stretches muscles involved in Foot Eversion.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1033,1104,'See ROM Criteria and Spot Reduction Myth.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1035,1106,'Do not allow upper hip to fall behind upper hip throughout movement. See ROM Criteria and Spot Reduction Myth.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1036,1107,'See ROM Criteria and Spot Reduction Myth.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1038,1110,'See ROM Criteria and Spot Reduction Myth.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1039,1109,'See ROM Criteria and Spot Reduction Myth.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1040,1111,'Mount machine with leg levers apart. Use lever to position legs together. See ROM Criteria and Spot Reduction Myth.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1041,1113,'Do not allow upper hip to fall behind upper hip throughout movement. See ROM Criteria and Spot Reduction Myth.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1044,1117,'Keep feet pointed forward. See ROM Criteria and Spot Reduction Myth.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1046,1124,'None.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1047,1125,'None.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1048,1126,'Hand nearest foot can be placed be behind on floor so torso can be reclined back slightly.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1050,1128,'Hand nearest foot can be placed be behind on floor so torso can be reclined back slightly.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1051,1130,'None','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1052,1131,'Keep hip of straight leg extended by leaning pelvis slightly forward.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1053,1132,'Also see Pretzel Stretch for Obliques for similar exercise which can be performed with this stretch.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1054,1133,'Alternatively, upper leg maybe extended straight inline with torso.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1055,1134,'Keep hip extended by leaning pelvis slightly forward and contracting Gluteus Maximus.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1056,1135,'None','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1059,1138,'See Spot Reduction Myth and Lower Ab Myth.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1101,1181,'Position foot further beyond knee if stretch is felt in Adductor Magnus of forward thigh.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1105,1185,'Keep foot away from fully extended hip to keep emphasis on Iliopsoas. See Lever Quadriceps Stretch for similar movement.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1111,1195,'Body may be reclined with support of arms as demonstrated (lower right). Also see Seated External Rotator Stretch.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1113,1199,'Low back may be stretched if hips and low back muscles are tight.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1116,1202,'Also see Lying External Rotator Stretch.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1118,1204,'Notice knee is keep over torso in contrast to Lying Glute Stretch. Also see Lying Piriformis Stretch for alternative form.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1119,1205,'Low back may be stretched if hips and low back muscles are tight.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1120,1206,'See PNF stretch techniques. A static Seated Piriformis Stretch can also be performed without assistance.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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:','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1126,1249,'Stabilizers may be used during heavy resistances to prevent body rising off of seat.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1127,1254,'Stabilizers may be used during heavy resistances to prevent body rising off of seat. Also see exercise perfomed on bilateral machine.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1128,1262,'With greater resistances, more effort is required to pull on handle bars to keep body from rising upward.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1130,1279,'Stabilizers may be used during heavy resistances to prevent body rising off of seat.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1131,1281,'Stabilizers may be used during heavy resistances to prevent body from rising off of seat. Also see exercises performed on bilateral machine.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1132,1285,'Stabilizers may be used during heavy resistances to prevent body rising off of seat.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1138,1324,'Keep waist and hips straight throughout exercise. Knees should point same direction as feet throughout movement. Also see Sissy Squat on apparatus.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1141,1466,'None.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1144,1469,'Rear knee should be completely flexed to keep emphasis on Quadriceps, particularly Rectus Femoris. See Lever Hip Flexor Stretch for similar movement.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1149,1474,'Pull knee in if it initially flares outward to side. This Dynamic Stretch can performed before athletic event or sports training session.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1154,1481,'Exercise can be performed without added weight until more resistance is needed.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1160,1491,'Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius allowing it to assist in knee flexion.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1169,1503,'Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius allowing it to assist in knee flexion.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1170,1500,'Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius allowing it to assist in knee flexion.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1188,1523,'Keep hips straight throughout movement. Dorsal flexion of ankle reduces active insufficiency of Gastrocnemius allowing it to assist in knee flexion.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1199,1535,'See PNF stretch techniques. Also see Lying Hamstring Stretch for similar static stretch.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1206,1542,'Far leg can be straightened keep hip from rolling up or bent for comfort. Also see Lying Hamstring Stretch without towel.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1207,1543,'See PNF stretch techniques. Also see Seated Hamstring Stretch for similar static stretch.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1208,1545,'Keep knees straight by tensing Quadriceps. Spine may be kept straight. Pelvis may be tilted forward to intensify stretch.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1211,1548,'Keep rear knee straight. If necessary, tense Quadriceps. Spine may be kept straight. Pelvis may be tilted forward to intensify stretch.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1217,1553,'See Spot Reduction Myth.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1218,1554,'Mount machine with leg levers together. Use lever to extend legs apart. See Spot Reduction Myth.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1219,1558,'See Spot Reduction Myth and ROM Criteria.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1220,1556,'See Spot Reduction Myth.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1222,1559,'See Spot Reduction Myth.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1223,1557,'Mount machine with leg levers together. Use lever to extend legs apart. See Spot Reduction Myth.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1224,1564,'Arms can push legs down if preferred.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1225,1565,'See PNF stretch techniques. Also see Lying Wall Groin Stretch for similar static stretch.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1226,1566,'Push elbow into side of knee for added stretch.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1227,1567,'None.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1228,1569,'Keep back of legs against wall.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1229,1570,'Erector Spinae may be stretched if spine is flexed during stretch. Gluteus Maximus may be stretched if hip is flexed enough.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1230,1571,'emphasizes Adductor Magnus, ischial fibers by flexing hip.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1231,1572,'Keep legs and back straight.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1233,1574,'Keep feet flat on floor and knees pointed same direction as toes. emphasizes Adductor Magnus, ischial fibers by flexing hip.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1234,1575,'Keep back straight during stretch. Gracilis is stretched on straight leg.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1236,1577,'Adductor Magnus is stretched more as torso is lowered as in Seated Adductor Magnus Stretch.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1237,1576,'Place hands on hips or keep hand on elevated surface or other stable structure for balance.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1238,1579,'Back may be keep straight. Other heads of Hip Adductors can be stretched if legs are positioned out as far as possible.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1239,1580,'Other heads of hip adductors may be stretched if knee of upper leg travels out to side during stretch.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1241,1582,'None.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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).','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1243,1584,'Other heads of hip adductors can be stretched if knee of upper leg travels out to side during stretch.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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).','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1286,1627,'None.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1291,1632,'Soleus may also be stretched in forward bent leg if it is placed far enough back to be sufficiently stretched.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1292,1633,'None.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1293,1634,'None','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1294,1635,'Opposite leg may be keep bent or straight off to side.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1297,1638,'Movement is predominately Soleus. Gastrocnemius are in active insufficiency since knees are significantly bent. See Calf Exercise Analyses.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1299,1640,'Keep knee of stretched leg bent.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1300,1642,'Movement is predominately Soleus. Gastrocnemius are in active insufficiency since knees are significantly bent. See Calf Exercise Analyses.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1303,1644,'Soleus may also be stretched in forward bent leg if it is placed far enough back to be sufficiently stretched.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1304,1645,'None.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1306,1647,'None.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1307,1648,'Keep foot flat on floor.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1308,1649,'None.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1309,1650,'Opposite leg may be keep bent or straight off to side. Also see similar exercise Seated Plantar Fascia Stretch.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1310,1651,'Opposite leg may be keep bent or straight off to side.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1340,1681,'Keep knees and hips straight throughout exercise. See Dorsal Flexor Calf Exercise Analyses.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1342,1684,'None.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1343,1683,'See Standing Quadriceps Stretch for similar exercise which can be combined with this stretch and performed simultaneously.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1344,1685,'Do not allow feet to wing out and do not sit between ankles. Certain knee problems maybe aggravated by this stretch.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(1345,1686,'See Lying (side) Quadriceps Stretch for similar exercise which can be combined with this stretch and performed simultaneously.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'),(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.','system','2021-06-27 13:39:40',NULL,NULL,0,'N'); +/*!40000 ALTER TABLE `exercise_comment_0` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `exercise_comment_1` +-- + +DROP TABLE IF EXISTS `exercise_comment_1`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `exercise_comment_1` ( + `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` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'system' COMMENT 'Created by', + `created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Created time', + `modified_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT 'system' COMMENT 'Modified by', + `modified_time` datetime DEFAULT NULL COMMENT 'Modified time', + `version` int unsigned NOT NULL DEFAULT '0' COMMENT 'Optimistic locking', + `deleted` enum('N','Y') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'N' COMMENT 'Deleted. ''N'' - not deleted; ''Y'' - 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_1` +-- + +LOCK TABLES `exercise_comment_1` WRITE; +/*!40000 ALTER TABLE `exercise_comment_1` DISABLE KEYS */; +/*!40000 ALTER TABLE `exercise_comment_1` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `exercise_related_classification_0` +-- + +DROP TABLE IF EXISTS `exercise_related_classification_0`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `exercise_related_classification_0` ( + `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_0` +-- + +LOCK TABLES `exercise_related_classification_0` WRITE; +/*!40000 ALTER TABLE `exercise_related_classification_0` DISABLE KEYS */; +INSERT INTO `exercise_related_classification_0` 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_0` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `exercise_related_classification_1` +-- + +DROP TABLE IF EXISTS `exercise_related_classification_1`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `exercise_related_classification_1` ( + `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 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_1` +-- + +LOCK TABLES `exercise_related_classification_1` WRITE; +/*!40000 ALTER TABLE `exercise_related_classification_1` DISABLE KEYS */; +/*!40000 ALTER TABLE `exercise_related_classification_1` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `exercise_related_muscle_0` +-- + +DROP TABLE IF EXISTS `exercise_related_muscle_0`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `exercise_related_muscle_0` ( + `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_0` +-- + +LOCK TABLES `exercise_related_muscle_0` WRITE; +/*!40000 ALTER TABLE `exercise_related_muscle_0` DISABLE KEYS */; +INSERT INTO `exercise_related_muscle_0` 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_0` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `exercise_related_muscle_1` +-- + +DROP TABLE IF EXISTS `exercise_related_muscle_1`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `exercise_related_muscle_1` ( + `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 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_1` +-- + +LOCK TABLES `exercise_related_muscle_1` WRITE; +/*!40000 ALTER TABLE `exercise_related_muscle_1` DISABLE KEYS */; +/*!40000 ALTER TABLE `exercise_related_muscle_1` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `kinesiology_glossary_0` +-- + +DROP TABLE IF EXISTS `kinesiology_glossary_0`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `kinesiology_glossary_0` ( + `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` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'system' COMMENT 'Created by', + `created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Created time', + `modified_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT 'system' COMMENT 'Modified by', + `modified_time` datetime DEFAULT NULL COMMENT 'Modified time', + `version` int unsigned NOT NULL DEFAULT '0' COMMENT 'Optimistic locking', + `deleted` enum('N','Y') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'N' COMMENT 'Deleted. ''N'' - not deleted; ''Y'' - 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_0` +-- + +LOCK TABLES `kinesiology_glossary_0` WRITE; +/*!40000 ALTER TABLE `kinesiology_glossary_0` DISABLE KEYS */; +/*!40000 ALTER TABLE `kinesiology_glossary_0` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `kinesiology_glossary_1` +-- + +DROP TABLE IF EXISTS `kinesiology_glossary_1`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `kinesiology_glossary_1` ( + `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` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'system' COMMENT 'Created by', + `created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Created time', + `modified_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT 'system' COMMENT 'Modified by', + `modified_time` datetime DEFAULT NULL COMMENT 'Modified time', + `version` int unsigned NOT NULL DEFAULT '0' COMMENT 'Optimistic locking', + `deleted` enum('N','Y') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'N' COMMENT 'Deleted. ''N'' - not deleted; ''Y'' - 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_1` +-- + +LOCK TABLES `kinesiology_glossary_1` WRITE; +/*!40000 ALTER TABLE `kinesiology_glossary_1` DISABLE KEYS */; +/*!40000 ALTER TABLE `kinesiology_glossary_1` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `muscle_0` +-- + +DROP TABLE IF EXISTS `muscle_0`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `muscle_0` ( + `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` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'system' COMMENT 'Created by', + `created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Created time', + `modified_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT 'system' COMMENT 'Modified by', + `modified_time` datetime DEFAULT NULL COMMENT 'Modified time', + `version` int unsigned NOT NULL DEFAULT '0' COMMENT 'Optimistic locking', + `deleted` enum('N','Y') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'N' COMMENT 'Deleted. ''N'' - not deleted; ''Y'' - 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_0` +-- + +LOCK TABLES `muscle_0` WRITE; +/*!40000 ALTER TABLE `muscle_0` DISABLE KEYS */; +INSERT INTO `muscle_0` VALUES (1,'Adductors','Inner Thigh',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(2,'Biceps Brachii','Arm (Front),Biceps,Biceps Cubiti',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(3,'Brachialis','Arm (Side),Lower Biceps',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(4,'Brachioradialis','Forearm (Upper-outer),Supinator longus (out dated)',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(5,'Deltoid',NULL,NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(6,'Anterior','Shoulder (Front),Front Delts',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(7,'Lateral','Shoulder (Side),Side Delts',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(8,'Posterior','Shoulder (Rear),Rear Delts',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(9,'Deep Hip External Rotators','Six Deep Lateral Rotator Hip Muscles',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(10,'Erector Spinae','Lower Back',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(11,'Gastrocnemius','Calf',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(12,'Gluteus',NULL,NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(13,'Maximus','Butt,Hips (Rear),Glutes',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(14,'Medius','Hip,Hip Abductor',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(15,'Minimus','Hip,Hip Abductor',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(16,'Gracilis','Inner Thigh,Hip Adductor',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(17,'Hamstrings','Thigh (Rear)',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(18,'Iliopsoas','Hip,Hip Flexors',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(19,'Infraspinatus','Rotatory Cuff,Back',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(20,'Latissimus Dorsi','Back (Middle, Outer),Lats',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(21,'Levator Scapulae','Shoulder (Upper),Neck (Rear)',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(22,'Obliques','Hips (Upper),Waist (Sides),Obliques',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(23,'Pectineous','Thigh (upper),Hip Flexors',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(24,'Pectoralis Major',NULL,NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(25,'Clavicular Head','Chest (Upper),Upper Pecs',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(26,'Sternal Head','Chest,Lower Pecs',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(27,'Teres',NULL,NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(28,'Major','Back (Outer),Lats little helper',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(29,'Minor','Rotatory Cuff,Back',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(30,'Tibialis Anterior','Shin,Tibias,Tibialis Anticus',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(31,'Transverse Abdominus','Transverse Abs',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(32,'Trapezius',NULL,NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(33,'Lower Fibers','Back (Middle),Lower Traps',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(34,'Middle Fibers','Back (Upper),Traps',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(35,'Upper Fibers','Shoulder (Upper),Upper Traps',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(36,'Triceps Brachii','Arm (Rear),Triceps',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(37,'Wrist',NULL,NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(38,'Extensors','Forearm (outer or back),Hand Extensors',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(39,'Flexors','Forearm (Inner),Hand Flexors',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(40,'Pectoralis Minor','Chest,Shoulder',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(41,'Popliteus','Knee flexor',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(42,'Quadratus Lumborum','Deep Low Back Lateral Flexor',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(43,'Quadriceps','Thigh (Front),Quads',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(44,'Rectus Abdominis','Waist (Belly),Abdominal,Abs',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(45,'Rhomboids','Back (Middle)',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(46,'Sartorius','Thigh (Inner),Tailor\'s muscle,Longest muscle in body',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(47,'Serratus Anterior','Serratus Magnus,Boxer\'s Muscle',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(48,'Soleus','Calf,Soleus',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(49,'Splenius','Neck (Rear),Neck Extensors',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(50,'Sternocleidomastoid','Sterno-mastoid,Neck (Front / Sides),Neck Flexors',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(51,'Subscapularis','Rotator Cuff,Back',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(52,'Supraspinatus','Rotatory Cuff,Shoulder',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'),(53,'Tensor Fasciae Latae','Hip,Hip Abductor/Flexor,Tensor Fasciae Femoris',NULL,0,'system','2021-06-27 13:54:02',NULL,NULL,0,'N'); +/*!40000 ALTER TABLE `muscle_0` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `muscle_1` +-- + +DROP TABLE IF EXISTS `muscle_1`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `muscle_1` ( + `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` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'system' COMMENT 'Created by', + `created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Created time', + `modified_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT 'system' COMMENT 'Modified by', + `modified_time` datetime DEFAULT NULL COMMENT 'Modified time', + `version` int unsigned NOT NULL DEFAULT '0' COMMENT 'Optimistic locking', + `deleted` enum('N','Y') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'N' COMMENT 'Deleted. ''N'' - not deleted; ''Y'' - deleted', + PRIMARY KEY (`id`), + UNIQUE KEY `muscle_name_uindex` (`name`) +) ENGINE=InnoDB 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_1` +-- + +LOCK TABLES `muscle_1` WRITE; +/*!40000 ALTER TABLE `muscle_1` DISABLE KEYS */; +/*!40000 ALTER TABLE `muscle_1` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `muscle_image_0` +-- + +DROP TABLE IF EXISTS `muscle_image_0`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `muscle_image_0` ( + `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` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'system' COMMENT 'Created by', + `created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Created time', + `modified_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT 'system' COMMENT 'Modified by', + `modified_time` datetime DEFAULT NULL COMMENT 'Modified time', + `version` int unsigned NOT NULL DEFAULT '0' COMMENT 'Optimistic locking', + `deleted` enum('N','Y') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'N' COMMENT 'Deleted. ''N'' - not deleted; ''Y'' - 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_0` +-- + +LOCK TABLES `muscle_image_0` WRITE; +/*!40000 ALTER TABLE `muscle_image_0` DISABLE KEYS */; +INSERT INTO `muscle_image_0` VALUES (1,1,'image/AdductorAnteriorSmall.png','Adductors','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(2,1,'image/AdductorPosteriorSmall.png','Adductors','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(3,2,'image/BicepsInsideSmall.gif','Biceps Brachii','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(4,3,'image/BrachialisInsideSmall.gif','Brachialis','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(5,3,'image/BrachialisUpperArmSegmentSmall.gif','Brachialis','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(6,4,'image/BrachioradialisoutsideSmall.png','Brachioradialis','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(7,6,'image/DeltoidAnteriorFront.gif','Anterior','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(8,7,'image/DeltoidLateralBack.gif','Lateral','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(9,8,'image/DeltoidPosteriorBack.gif','Posterior','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(10,9,'image/DeepHipRotators.gif','Deep Hip External Rotators','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(11,10,'image/96a0e9eeb4ad8418eff179a9c59bc713.png','Erector Spinae','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(12,10,'image/ErectorSpinaeCrossSection.gif','Erector Spinae','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(13,11,'image/GastrocnemiusLateral.gif','Gastrocnemius','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(14,13,'image/80a4754b254e159c4cd5474b063d096e.png','Maximus','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(15,14,'image/GluteusMediusPosterior.gif','Medius','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(16,15,'image/bf94c6ef8b7ca1c02323779e1fe3b837.png','Minimus','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(17,15,'image/GluteusMinimusSide.gif','Minimus','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(18,16,'image/69c90b7fb98b9c863015a90b3ff3173c.png','Gracilis','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(19,17,'image/1c94da8f4db345d0343c3db475d2d84d.png','Hamstrings','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(20,18,'image/99beae51baa19dc3d8ef62c04b469133.png','Iliopsoas','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(21,18,'image/ed4205586bfaf0b1603ad8e70dae6706.png','Iliopsoas','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(22,19,'image/3e3d3ded3335c56a7f932c6e38a3ed53.png','Infraspinatus','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(23,20,'image/67f687e9482a2a6bca9a38544e45d31c.png','Latissimus Dorsi','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(24,20,'image/LatSmall.png','Latissimus Dorsi','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(25,21,'image/5083bc6f81d7a598832a5cb53340fb4a.png','Levator Scapulae','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(26,22,'image/1d421470bb1b8650b68a055d15704abe.png','Obliques','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(27,22,'image/ObliqueCrossSection.gif','Obliques','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(28,23,'image/52d884ea5ad22f197b0335468e4ca6e7.png','Pectineous','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(29,25,'image/11a9ea1af4fa3e206ec2eecc7e60100e.png','Clavicular Head','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(30,25,'image/0e1ed54440e102b3ec973207ea371964.png','Clavicular Head','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(31,26,'image/5a6b344e7b8a52c715adf8b091461f7d.png','Sternal Head','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(32,26,'image/PectoralAttachmentSmall.png','Sternal Head','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(33,28,'image/TeresMajorSmall.png','Major','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(34,29,'image/TeresMinorSmall.png','Minor','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(35,30,'image/TibialisAnteriorSmall.png','Tibialis Anterior','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(36,31,'image/TransverseAbdominisCrossSectionNew.jpg','Transverse Abdominus','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(37,33,'image/TrapLowerHalfSmall.png','Lower Fibers','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(38,34,'image/TrapMiddleHalfSmall.png','Middle Fibers','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(39,35,'image/TrapUpperHalfSmall.png','Upper Fibers','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(40,36,'image/TricepsOutsideSmall.gif','Triceps Brachii','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(41,38,'image/WristExtensorsSupSmall.gif','Extensors','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(42,39,'image/WristFlexorNeutSmall.gif','Flexors','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(43,40,'image/e7cda9218a2e2c84a31a7ca32e98c3a9.png','Pectoralis Minor','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(44,41,'image/PopliteusSmall.png','Popliteus','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(45,42,'image/QuadratusLumborumSmall.png','Quadratus Lumborum','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(46,43,'image/QuadricepsAnteriorSmall.png','Quadriceps','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(47,44,'image/RectusAbdominisWaistSmall.png','Rectus Abdominis','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(48,44,'image/RectusAbdominalCrossSectionNew.jpg','Rectus Abdominis','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(49,45,'image/RhomboidsHalfSmall.png','Rhomboids','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(50,46,'image/SartoriusAnteriorSmall.png','Sartorius','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(51,47,'image/SerratusAnteriorSideSmall.png','Serratus Anterior','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(52,47,'image/SerratusAnteriorPullSmall.png','Serratus Anterior','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(53,47,'image/SerratusScapulaTransverseCu.gif','Serratus Anterior','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(54,48,'image/SoleusLateralSmall.png','Soleus','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(55,49,'image/SpleniusSpineSmall.png','Splenius','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(56,49,'image/SpeniusHalfSmall.png','Splenius','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(57,50,'image/SternoSideSmall.png','Sternocleidomastoid','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(58,51,'image/SubscapularisSmall.png','Subscapularis','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(59,52,'image/SupraspinatusBackSmall.png','Supraspinatus','system','2021-06-27 13:54:16',NULL,NULL,0,'N'),(60,53,'image/TensorFasciaeLataeASmall.png','Tensor Fasciae Latae','system','2021-06-27 13:54:16',NULL,NULL,0,'N'); +/*!40000 ALTER TABLE `muscle_image_0` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `muscle_image_1` +-- + +DROP TABLE IF EXISTS `muscle_image_1`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `muscle_image_1` ( + `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` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'system' COMMENT 'Created by', + `created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Created time', + `modified_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT 'system' COMMENT 'Modified by', + `modified_time` datetime DEFAULT NULL COMMENT 'Modified time', + `version` int unsigned NOT NULL DEFAULT '0' COMMENT 'Optimistic locking', + `deleted` enum('N','Y') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'N' COMMENT 'Deleted. ''N'' - not deleted; ''Y'' - deleted', + PRIMARY KEY (`id`), + UNIQUE KEY `muscle_image_image_path_uindex` (`image_path`) +) ENGINE=InnoDB 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_1` +-- + +LOCK TABLES `muscle_image_1` WRITE; +/*!40000 ALTER TABLE `muscle_image_1` DISABLE KEYS */; +/*!40000 ALTER TABLE `muscle_image_1` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `permission_0` +-- + +DROP TABLE IF EXISTS `permission_0`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `permission_0` ( + `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` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'system' COMMENT 'Created by', + `created_time` datetime NOT NULL COMMENT 'Created time', + `modified_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT 'system' COMMENT 'Modified by', + `modified_time` datetime DEFAULT NULL COMMENT 'Modified time', + `version` int unsigned NOT NULL DEFAULT '0' COMMENT 'Optimistic locking', + `deleted` enum('N','Y') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'N' COMMENT 'Deleted. ''N'' - not deleted; ''Y'' - deleted', + 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_0` +-- + +LOCK TABLES `permission_0` WRITE; +/*!40000 ALTER TABLE `permission_0` DISABLE KEYS */; +/*!40000 ALTER TABLE `permission_0` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `permission_1` +-- + +DROP TABLE IF EXISTS `permission_1`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `permission_1` ( + `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` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'system' COMMENT 'Created by', + `created_time` datetime NOT NULL COMMENT 'Created time', + `modified_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT 'system' COMMENT 'Modified by', + `modified_time` datetime DEFAULT NULL COMMENT 'Modified time', + `version` int unsigned NOT NULL DEFAULT '0' COMMENT 'Optimistic locking', + `deleted` enum('N','Y') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'N' COMMENT 'Deleted. ''N'' - not deleted; ''Y'' - deleted', + 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_1` +-- + +LOCK TABLES `permission_1` WRITE; +/*!40000 ALTER TABLE `permission_1` DISABLE KEYS */; +/*!40000 ALTER TABLE `permission_1` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `quartz_job_configuration_0` +-- + +DROP TABLE IF EXISTS `quartz_job_configuration_0`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `quartz_job_configuration_0` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'The primary key ID', + `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'Name of job', + `group` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'Group of job', + `service_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'Service name, equal to artifact-id', + `invoke_target` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'Invoke target', + `cron_expression` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'Cron Expressions', + `misfire_policy` tinyint NOT NULL COMMENT 'Trigger''s misfire policy', + `concurrent` tinyint unsigned NOT NULL DEFAULT '0' COMMENT 'Concurrent. true(1): is concurrent, false(0): not concurrent', + `description` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'Description', + `status` tinyint NOT NULL COMMENT 'Status', + `created_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'system' COMMENT 'Created by', + `created_time` datetime NOT NULL COMMENT 'Craeted time', + `modified_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'system' COMMENT 'Modified by', + `modified_time` datetime DEFAULT NULL COMMENT 'Modified time', + `version` int unsigned NOT NULL DEFAULT '0' COMMENT 'Optimistic locking', + `deleted` enum('N','Y') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'N' COMMENT 'Deleted. ''N'' - not deleted; ''Y'' - deleted', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='Quartz Job Configuration'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `quartz_job_configuration_0` +-- + +LOCK TABLES `quartz_job_configuration_0` WRITE; +/*!40000 ALTER TABLE `quartz_job_configuration_0` DISABLE KEYS */; +INSERT INTO `quartz_job_configuration_0` VALUES (1,'greeting-schedule-job','auth-center-default-group','auth-center','greetingBean.hello()','0 0/1 * 1/1 * ? *',0,0,'Greeting task. It\'s a demo Quartz schedule job.',0,'system','2021-09-26 00:20:37',NULL,NULL,0,'N'),(2,'greeting-schedule-job','maf-mis-default-group','maf-mis','greetingBean.hello()','0 0/1 * 1/1 * ? *',0,0,'Greeting task. It\'s a demo Quartz schedule job.',0,'system','2021-09-26 00:20:37',NULL,NULL,0,'N'); +/*!40000 ALTER TABLE `quartz_job_configuration_0` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `quartz_job_configuration_1` +-- + +DROP TABLE IF EXISTS `quartz_job_configuration_1`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `quartz_job_configuration_1` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'The primary key ID', + `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'Name of job', + `group` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'Group of job', + `service_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'Service name, equal to artifact-id', + `invoke_target` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'Invoke target', + `cron_expression` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'Cron Expressions', + `misfire_policy` tinyint NOT NULL COMMENT 'Trigger''s misfire policy', + `concurrent` tinyint unsigned NOT NULL DEFAULT '0' COMMENT 'Concurrent. true(1): is concurrent, false(0): not concurrent', + `description` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'Description', + `status` tinyint NOT NULL COMMENT 'Status', + `created_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'system' COMMENT 'Created by', + `created_time` datetime NOT NULL COMMENT 'Craeted time', + `modified_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'system' COMMENT 'Modified by', + `modified_time` datetime DEFAULT NULL COMMENT 'Modified time', + `version` int unsigned NOT NULL DEFAULT '0' COMMENT 'Optimistic locking', + `deleted` enum('N','Y') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'N' COMMENT 'Deleted. ''N'' - not deleted; ''Y'' - deleted', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='Quartz Job Configuration'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `quartz_job_configuration_1` +-- + +LOCK TABLES `quartz_job_configuration_1` WRITE; +/*!40000 ALTER TABLE `quartz_job_configuration_1` DISABLE KEYS */; +/*!40000 ALTER TABLE `quartz_job_configuration_1` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `related_muscle_0` +-- + +DROP TABLE IF EXISTS `related_muscle_0`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `related_muscle_0` ( + `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_0` +-- + +LOCK TABLES `related_muscle_0` WRITE; +/*!40000 ALTER TABLE `related_muscle_0` DISABLE KEYS */; +INSERT INTO `related_muscle_0` 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_0` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `related_muscle_1` +-- + +DROP TABLE IF EXISTS `related_muscle_1`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `related_muscle_1` ( + `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 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_1` +-- + +LOCK TABLES `related_muscle_1` WRITE; +/*!40000 ALTER TABLE `related_muscle_1` DISABLE KEYS */; +/*!40000 ALTER TABLE `related_muscle_1` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `role_0` +-- + +DROP TABLE IF EXISTS `role_0`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `role_0` ( + `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` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'system' COMMENT 'Created by', + `created_time` datetime NOT NULL COMMENT 'Created time', + `modified_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT 'system' COMMENT 'Modified by', + `modified_time` datetime DEFAULT NULL COMMENT 'Modified time', + `version` int unsigned NOT NULL DEFAULT '0' COMMENT 'Optimistic locking', + `deleted` enum('N','Y') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'N' COMMENT 'Deleted', + 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_0` +-- + +LOCK TABLES `role_0` WRITE; +/*!40000 ALTER TABLE `role_0` DISABLE KEYS */; +INSERT INTO `role_0` VALUES (1,'admin','M&F system admin','system','2020-05-09 16:18:51','system','2020-05-09 16:18:45',0,'N'),(2,'guest','Guest for the system','system','2021-06-29 11:37:33',NULL,NULL,0,'N'); +/*!40000 ALTER TABLE `role_0` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `role_1` +-- + +DROP TABLE IF EXISTS `role_1`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `role_1` ( + `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` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'system' COMMENT 'Created by', + `created_time` datetime NOT NULL COMMENT 'Created time', + `modified_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT 'system' COMMENT 'Modified by', + `modified_time` datetime DEFAULT NULL COMMENT 'Modified time', + `version` int unsigned NOT NULL DEFAULT '0' COMMENT 'Optimistic locking', + `deleted` enum('N','Y') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'N' COMMENT 'Deleted', + PRIMARY KEY (`id`), + UNIQUE KEY `name_UNIQUE` (`name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Role.'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `role_1` +-- + +LOCK TABLES `role_1` WRITE; +/*!40000 ALTER TABLE `role_1` DISABLE KEYS */; +/*!40000 ALTER TABLE `role_1` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `role_permission_0` +-- + +DROP TABLE IF EXISTS `role_permission_0`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `role_permission_0` ( + `role_id` bigint NOT NULL COMMENT 'Primary key of role', + `permission_id` bigint unsigned 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_0` +-- + +LOCK TABLES `role_permission_0` WRITE; +/*!40000 ALTER TABLE `role_permission_0` DISABLE KEYS */; +/*!40000 ALTER TABLE `role_permission_0` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `role_permission_1` +-- + +DROP TABLE IF EXISTS `role_permission_1`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `role_permission_1` ( + `role_id` bigint NOT NULL COMMENT 'Primary key of role', + `permission_id` bigint unsigned 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_1` +-- + +LOCK TABLES `role_permission_1` WRITE; +/*!40000 ALTER TABLE `role_permission_1` DISABLE KEYS */; +/*!40000 ALTER TABLE `role_permission_1` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `user_0` +-- + +DROP TABLE IF EXISTS `user_0`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `user_0` ( + `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` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'system' COMMENT 'Created by', + `created_time` datetime NOT NULL COMMENT 'Created time', + `modified_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT 'system' COMMENT 'Modified by', + `modified_time` datetime DEFAULT NULL COMMENT 'Modified time', + `version` int unsigned NOT NULL DEFAULT '0' COMMENT 'Optimistic locking', + `deleted` enum('N','Y') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'N' COMMENT 'Deleted. ''N'' - not deleted; ''Y'' - deleted', + 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_0` +-- + +LOCK TABLES `user_0` WRITE; +/*!40000 ALTER TABLE `user_0` DISABLE KEYS */; +INSERT INTO `user_0` VALUES (1,'ijohnnymiller','ijohnnymiller@icloud.com','13100959832','$2a$10$2wDrBjRykjsFoUZfKgogyOm0LxIg6EdH42uR3sQ8fHOQcKg5/Mvsm','Johnny Miller','1996-04-29','Cisgender Male',NULL,1,'system','2020-05-09 16:26:23',NULL,NULL,0,'N'),(2,'system','system@email.com',NULL,'$2a$10$Ft5LsGrnMoW2DNeboV.QV.w9r.meesdzwEOw1WMMUn/6zH.R9IW/K','System User',NULL,NULL,NULL,1,'system','2021-06-27 11:21:38',NULL,NULL,0,'N'); +/*!40000 ALTER TABLE `user_0` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `user_1` +-- + +DROP TABLE IF EXISTS `user_1`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `user_1` ( + `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` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'system' COMMENT 'Created by', + `created_time` datetime NOT NULL COMMENT 'Created time', + `modified_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT 'system' COMMENT 'Modified by', + `modified_time` datetime DEFAULT NULL COMMENT 'Modified time', + `version` int unsigned NOT NULL DEFAULT '0' COMMENT 'Optimistic locking', + `deleted` enum('N','Y') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'N' COMMENT 'Deleted. ''N'' - not deleted; ''Y'' - deleted', + 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 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='User.'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `user_1` +-- + +LOCK TABLES `user_1` WRITE; +/*!40000 ALTER TABLE `user_1` DISABLE KEYS */; +/*!40000 ALTER TABLE `user_1` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `user_role_0` +-- + +DROP TABLE IF EXISTS `user_role_0`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `user_role_0` ( + `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_0` +-- + +LOCK TABLES `user_role_0` WRITE; +/*!40000 ALTER TABLE `user_role_0` DISABLE KEYS */; +INSERT INTO `user_role_0` VALUES (1,1,1),(2,2,2); +/*!40000 ALTER TABLE `user_role_0` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `user_role_1` +-- + +DROP TABLE IF EXISTS `user_role_1`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `user_role_1` ( + `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_1` +-- + +LOCK TABLES `user_role_1` WRITE; +/*!40000 ALTER TABLE `user_role_1` DISABLE KEYS */; +/*!40000 ALTER TABLE `user_role_1` 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 2022-04-02 20:21:26 diff --git a/maf-mis/maf-mis-biz/pom.xml b/maf-mis/maf-mis-biz/pom.xml index 31bafb96..138a3bc1 100644 --- a/maf-mis/maf-mis-biz/pom.xml +++ b/maf-mis/maf-mis-biz/pom.xml @@ -11,7 +11,7 @@ com.jmsoftware.maf maf-mis - 0.0.8.1 + 0.0.9 diff --git a/maf-mis/maf-mis-biz/src/main/java/com/jmsoftware/maf/mafmis/exercise/controller/ExerciseController.java b/maf-mis/maf-mis-biz/src/main/java/com/jmsoftware/maf/mafmis/exercise/controller/ExerciseController.java deleted file mode 100644 index 145b2bf2..00000000 --- a/maf-mis/maf-mis-biz/src/main/java/com/jmsoftware/maf/mafmis/exercise/controller/ExerciseController.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.jmsoftware.maf.mafmis.exercise.controller; - -import cn.hutool.core.bean.BeanUtil; -import com.jmsoftware.maf.common.bean.ResponseBodyBean; -import com.jmsoftware.maf.mafmis.exercise.persistence.Exercise; -import com.jmsoftware.maf.mafmis.exercise.payload.GetPageListPayload; -import com.jmsoftware.maf.mafmis.exercise.service.ExerciseService; -import lombok.RequiredArgsConstructor; -import lombok.val; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import javax.validation.Valid; -import java.util.List; - -/** - *

ExerciseController

- *

- * Exercise Controller - * - * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com - * @date 2/18/20 10:22 AM - */ -@RestController -@RequiredArgsConstructor -@RequestMapping("/exercise") -public class ExerciseController { - private final ExerciseService exerciseService; - - @GetMapping("/get-by-id") - public ResponseBodyBean selectOne(Long id) { - return ResponseBodyBean.ofSuccess(this.exerciseService.queryById(id)); - } - - @GetMapping("/get-page-list") - public ResponseBodyBean> getPageList(@Valid GetPageListPayload payload) { - val exercisePo = new Exercise(); - BeanUtil.copyProperties(payload, exercisePo); - return ResponseBodyBean.ofSuccess(this.exerciseService.getPageList(exercisePo)); - } -} diff --git a/maf-mis/maf-mis-biz/src/main/java/com/jmsoftware/maf/mafmis/exercise/service/ExerciseService.java b/maf-mis/maf-mis-biz/src/main/java/com/jmsoftware/maf/mafmis/exercise/service/ExerciseService.java deleted file mode 100644 index 734b275e..00000000 --- a/maf-mis/maf-mis-biz/src/main/java/com/jmsoftware/maf/mafmis/exercise/service/ExerciseService.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.jmsoftware.maf.mafmis.exercise.service; - -import com.jmsoftware.maf.mafmis.exercise.persistence.Exercise; - -import java.util.List; - -/** - *

ExerciseService

- *

- * Exercise Service - * - * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com - * @date 2/18/20 10:21 AM - */ -public interface ExerciseService { - /** - * Query by id exercise po. - * - * @param id the id - * @return the exercise po - */ - Exercise queryById(Long id); - - /** - * Gets page list. - * - * @param exercisePo the exercise po - * @return the page list - */ - List getPageList(Exercise exercisePo); - - /** - * Insert exercise po. - * - * @param exercisePo the exercise po - * @return the exercise po - */ - Exercise insert(Exercise exercisePo); - - /** - * Update exercise po. - * - * @param exercisePo the exercise po - * @return the exercise po - */ - Exercise update(Exercise exercisePo); - - /** - * Delete by id boolean. - * - * @param id the id - * @return the boolean - */ - boolean deleteById(Long id); -} diff --git a/maf-mis/maf-mis-biz/src/main/java/com/jmsoftware/maf/mafmis/exercise/service/impl/ExerciseServiceImpl.java b/maf-mis/maf-mis-biz/src/main/java/com/jmsoftware/maf/mafmis/exercise/service/impl/ExerciseServiceImpl.java deleted file mode 100644 index 0e719c02..00000000 --- a/maf-mis/maf-mis-biz/src/main/java/com/jmsoftware/maf/mafmis/exercise/service/impl/ExerciseServiceImpl.java +++ /dev/null @@ -1,63 +0,0 @@ -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.BizException; -import com.jmsoftware.maf.mafmis.exercise.persistence.Exercise; -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; -import org.springframework.stereotype.Service; - -import java.util.List; - -/** - *

ExerciseServiceImpl

- *

- * Exercise Service Impl - * - * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com - * @date 2/18/20 10:19 AM - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class ExerciseServiceImpl implements ExerciseService { - private final ExerciseMapper exerciseMapper; - - @Override - @SneakyThrows - public Exercise queryById(Long id) { - if (ObjectUtil.isNull(id)) { - throw new BizException("Cannot execute the query! Cause: the ID is null."); - } - return this.exerciseMapper.selectById(id); - } - - @Override - public List getPageList(Exercise exercisePo) { - var page = new Page(exercisePo.getCurrentPage(), exercisePo.getPageSize()); - this.exerciseMapper.selectAll(exercisePo, page); - log.info("Total pages: {}", page.getPages()); - return page.getRecords(); - } - - @Override - public Exercise insert(Exercise exercisePo) { - this.exerciseMapper.insert(exercisePo); - return exercisePo; - } - - @Override - public Exercise update(Exercise exercisePo) { - this.exerciseMapper.update(exercisePo); - return this.queryById(exercisePo.getId()); - } - - @Override - public boolean deleteById(Long id) { - return this.exerciseMapper.deleteById(id) > 0; - } -} diff --git a/maf-mis/maf-mis-biz/src/main/java/com/jmsoftware/maf/mafmis/package-info.java b/maf-mis/maf-mis-biz/src/main/java/com/jmsoftware/maf/mafmis/package-info.java deleted file mode 100644 index 7acc0501..00000000 --- a/maf-mis/maf-mis-biz/src/main/java/com/jmsoftware/maf/mafmis/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package com.jmsoftware.maf.mafmis; diff --git a/maf-mis/maf-mis-biz/src/main/java/com/jmsoftware/maf/mafmis/package-info.kt b/maf-mis/maf-mis-biz/src/main/java/com/jmsoftware/maf/mafmis/package-info.kt new file mode 100644 index 00000000..90fff230 --- /dev/null +++ b/maf-mis/maf-mis-biz/src/main/java/com/jmsoftware/maf/mafmis/package-info.kt @@ -0,0 +1 @@ +package com.jmsoftware.maf.mafmis diff --git a/maf-mis/maf-mis-biz/src/test/java/com/jmsoftware/maf/mafmis/package-info.java b/maf-mis/maf-mis-biz/src/test/java/com/jmsoftware/maf/mafmis/package-info.java deleted file mode 100644 index 7acc0501..00000000 --- a/maf-mis/maf-mis-biz/src/test/java/com/jmsoftware/maf/mafmis/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package com.jmsoftware.maf.mafmis; diff --git a/maf-mis/maf-mis-biz/src/test/java/com/jmsoftware/maf/mafmis/package-info.kt b/maf-mis/maf-mis-biz/src/test/java/com/jmsoftware/maf/mafmis/package-info.kt new file mode 100644 index 00000000..90fff230 --- /dev/null +++ b/maf-mis/maf-mis-biz/src/test/java/com/jmsoftware/maf/mafmis/package-info.kt @@ -0,0 +1 @@ +package com.jmsoftware.maf.mafmis diff --git a/maf-mis/maf-mis-bootstrap/pom.xml b/maf-mis/maf-mis-bootstrap/pom.xml index 718ae641..f6a07528 100644 --- a/maf-mis/maf-mis-bootstrap/pom.xml +++ b/maf-mis/maf-mis-bootstrap/pom.xml @@ -11,7 +11,7 @@ com.jmsoftware.maf maf-mis - 0.0.8.1 + 0.0.9 @@ -31,44 +31,6 @@ - - org.apache.maven.plugins - maven-pmd-plugin - ${maven-pmd-plugin.version} - - ${project.build.sourceEncoding} - ${java.version} - true - - rulesets/java/ali-comment.xml - rulesets/java/ali-concurrent.xml - rulesets/java/ali-constant.xml - rulesets/java/ali-exception.xml - rulesets/java/ali-flowcontrol.xml - rulesets/java/ali-naming.xml - rulesets/java/ali-oop.xml - rulesets/java/ali-orm.xml - rulesets/java/ali-other.xml - rulesets/java/ali-set.xml - - - - - verify - - check - - - - - - com.alibaba.p3c - p3c-pmd - ${p3c-pmd.version} - - - - com.google.cloud.tools @@ -101,12 +63,16 @@ - - adoptopenjdk/openjdk11:${adoptopenjdk11.tag} + + eclipse-temurin:${temurin.tag} docker.io/ijohnnymiller/${project.baseArtifactId}.${project.parent.artifactId} + ${git.commit.id.abbrev}-${project.version} @@ -133,31 +99,6 @@ - - - - io.github.git-commit-id - git-commit-id-maven-plugin - 5.0.0 - - - get-the-git-info - - revision - - initialize - - - - true - ${project.build.outputDirectory}/git.properties - - ^git.build.(time|version)$ - ^git.commit.id.(abbrev|full)$ - - full - - diff --git a/maf-mis/maf-mis-bootstrap/src/main/java/com/jmsoftware/maf/mafmis/MafMisApplication.java b/maf-mis/maf-mis-bootstrap/src/main/java/com/jmsoftware/maf/mafmis/MafMisApplication.java deleted file mode 100644 index b43bfa18..00000000 --- a/maf-mis/maf-mis-bootstrap/src/main/java/com/jmsoftware/maf/mafmis/MafMisApplication.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.jmsoftware.maf.mafmis; - -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 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 -@SuppressWarnings("scwjava_Createprivateconstructorforutilityclassallfieldsmethodsarestatic") -public class MafMisApplication { - public static void main(String[] args) { - val stopWatch = new StopWatch(); - stopWatch.start(); - val configurableApplicationContext = SpringApplication.run(MafMisApplication.class, args); - val springBootStartupHelper = configurableApplicationContext.getBean(SpringBootStartupHelper.class); - springBootStartupHelper.stop(stopWatch); - } -} diff --git a/maf-mis/maf-mis-bootstrap/src/main/java/com/jmsoftware/maf/mafmis/MafMisApplication.kt b/maf-mis/maf-mis-bootstrap/src/main/java/com/jmsoftware/maf/mafmis/MafMisApplication.kt new file mode 100644 index 00000000..b73ae5a7 --- /dev/null +++ b/maf-mis/maf-mis-bootstrap/src/main/java/com/jmsoftware/maf/mafmis/MafMisApplication.kt @@ -0,0 +1,29 @@ +package com.jmsoftware.maf.mafmis + +import com.jmsoftware.maf.springcloudstarter.helper.SpringBootStartupHelper +import org.springframework.boot.autoconfigure.SpringBootApplication +import org.springframework.boot.runApplication +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 (锺俊), e-mail: johnnysviva@outlook.com, date: 4/16/22 11:23 PM + */ +@EnableFeignClients +@EnableDiscoveryClient +@SpringBootApplication +class MafMisApplication + +fun main(args: Array) { + StopWatch().let { + it.start() + runApplication(*args) + .getBean(SpringBootStartupHelper::class.java) + .stop(it) + } +} diff --git a/maf-mis/maf-mis-bootstrap/src/main/resources/application.yml b/maf-mis/maf-mis-bootstrap/src/main/resources/application.yml index 20d94648..1f641da6 100644 --- a/maf-mis/maf-mis-bootstrap/src/main/resources/application.yml +++ b/maf-mis/maf-mis-bootstrap/src/main/resources/application.yml @@ -21,7 +21,7 @@ spring: config: # `default-context` should not be modified, keeps "application" for common configuration. # Properties in the config/application folder are applicable to all applications using consul for configuration. - profile-separator: "::" + profile-separator: "@" format: YAML data-key: "data" watch: @@ -29,6 +29,7 @@ spring: delay: 1000 prefixes: - config + - shardingsphere discovery: register: true instance-id: ${spring.application.name}-${spring.cloud.client.hostname}-${vcap.application.instance_id:${spring.application.instance_id:${random.value}}} @@ -39,15 +40,9 @@ spring: health-check-critical-timeout: 15s 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: @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 logging: @@ -59,7 +54,7 @@ maf: context-path: ${server.servlet.context-path} group-id: @project.groupId@ project-parent-artifact-id: @project.parent.artifactId@ - project-artifact-id: @project.artifactId@ + project-artifact-id: @project.parent.artifactId@ version: @project.version@ description: @project.description@ jdk-version: @java.version@ diff --git a/maf-mis/maf-mis-bootstrap/src/test/java/com/jmsoftware/maf/mafmis/ExercisePoMisApplicationTests.java b/maf-mis/maf-mis-bootstrap/src/test/java/com/jmsoftware/maf/mafmis/ExercisePoMisApplicationTests.java deleted file mode 100644 index 8f7940b9..00000000 --- a/maf-mis/maf-mis-bootstrap/src/test/java/com/jmsoftware/maf/mafmis/ExercisePoMisApplicationTests.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.jmsoftware.maf.mafmis; - -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -class ExercisePoMisApplicationTests { - - @Test - void contextLoads() { - } - -} diff --git a/maf-mis/maf-mis-bootstrap/src/test/java/com/jmsoftware/maf/mafmis/package-info.kt b/maf-mis/maf-mis-bootstrap/src/test/java/com/jmsoftware/maf/mafmis/package-info.kt new file mode 100644 index 00000000..90fff230 --- /dev/null +++ b/maf-mis/maf-mis-bootstrap/src/test/java/com/jmsoftware/maf/mafmis/package-info.kt @@ -0,0 +1 @@ +package com.jmsoftware.maf.mafmis diff --git a/maf-mis/maf-mis-domain/pom.xml b/maf-mis/maf-mis-domain/pom.xml index 17df9d3e..d30259bf 100644 --- a/maf-mis/maf-mis-domain/pom.xml +++ b/maf-mis/maf-mis-domain/pom.xml @@ -11,7 +11,7 @@ com.jmsoftware.maf maf-mis - 0.0.8.1 + 0.0.9 diff --git a/maf-mis/maf-mis-domain/src/main/java/com/jmsoftware/maf/mafmis/package-info.java b/maf-mis/maf-mis-domain/src/main/java/com/jmsoftware/maf/mafmis/package-info.java deleted file mode 100644 index 7acc0501..00000000 --- a/maf-mis/maf-mis-domain/src/main/java/com/jmsoftware/maf/mafmis/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package com.jmsoftware.maf.mafmis; diff --git a/maf-mis/maf-mis-domain/src/main/java/com/jmsoftware/maf/mafmis/package-info.kt b/maf-mis/maf-mis-domain/src/main/java/com/jmsoftware/maf/mafmis/package-info.kt new file mode 100644 index 00000000..90fff230 --- /dev/null +++ b/maf-mis/maf-mis-domain/src/main/java/com/jmsoftware/maf/mafmis/package-info.kt @@ -0,0 +1 @@ +package com.jmsoftware.maf.mafmis diff --git a/maf-mis/maf-mis-domain/src/main/java/com/jmsoftware/maf/mafmis/remote/OssCenterFeignService.kt b/maf-mis/maf-mis-domain/src/main/java/com/jmsoftware/maf/mafmis/remote/OssCenterFeignService.kt new file mode 100644 index 00000000..ea24d48c --- /dev/null +++ b/maf-mis/maf-mis-domain/src/main/java/com/jmsoftware/maf/mafmis/remote/OssCenterFeignService.kt @@ -0,0 +1,24 @@ +package com.jmsoftware.maf.mafmis.remote + +import com.jmsoftware.maf.common.domain.osscenter.write.ObjectResponse +import org.springframework.validation.annotation.Validated +import org.springframework.web.multipart.MultipartFile +import javax.validation.constraints.NotNull + +/** + * # OssCenterFeignService + * + * Description: OssCenterFeignService, change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/10/22 11:57 AM + */ +@Validated +interface OssCenterFeignService { + /** + * Upload single resource object response. + * + * @param multipartFile the multipart file + * @return the object response + */ + fun uploadSingleResource(multipartFile: @NotNull MultipartFile): ObjectResponse +} diff --git a/maf-mis/maf-mis-domain/src/main/java/com/jmsoftware/maf/mafmis/remote/impl/OssCenterFeignServiceImpl.kt b/maf-mis/maf-mis-domain/src/main/java/com/jmsoftware/maf/mafmis/remote/impl/OssCenterFeignServiceImpl.kt new file mode 100644 index 00000000..288b458c --- /dev/null +++ b/maf-mis/maf-mis-domain/src/main/java/com/jmsoftware/maf/mafmis/remote/impl/OssCenterFeignServiceImpl.kt @@ -0,0 +1,37 @@ +package com.jmsoftware.maf.mafmis.remote.impl + +import com.jmsoftware.maf.common.domain.osscenter.write.ObjectResponse +import com.jmsoftware.maf.common.exception.InternalServerException +import com.jmsoftware.maf.common.util.logger +import com.jmsoftware.maf.mafmis.remote.OssCenterFeignClient +import com.jmsoftware.maf.mafmis.remote.OssCenterFeignService +import org.springframework.stereotype.Service +import org.springframework.web.multipart.MultipartFile +import java.util.* +import javax.validation.constraints.NotNull + +/** + * # OssCenterFeignServiceImpl + * + * Description: OssCenterFeignServiceImpl, change description here. + * + * @author Johnny Miller (鍾俊), e-mail: johnnysviva@outlook.com, date: 2/5/2022 7:47 PM + */ +@Service +class OssCenterFeignServiceImpl( + private val ossCenterFeignClient: OssCenterFeignClient +) : OssCenterFeignService { + companion object { + private val log = logger() + } + + override fun uploadSingleResource(multipartFile: @NotNull MultipartFile): ObjectResponse { + log.info("Uploading single resource to oss center. multipartFile: {}", multipartFile) + return Optional.ofNullable(ossCenterFeignClient.uploadSingleResource(multipartFile)) + .map { response -> response.data!! } + .orElseThrow { + log.error("Failed to upload single resource to oss center. multipartFile: ${multipartFile.name}") + InternalServerException("Failed to upload single resource to oss center") + } + } +} diff --git a/maf-mis/maf-mis-domain/src/test/java/com/jmsoftware/maf/mafmis/package-info.java b/maf-mis/maf-mis-domain/src/test/java/com/jmsoftware/maf/mafmis/package-info.java deleted file mode 100644 index 7acc0501..00000000 --- a/maf-mis/maf-mis-domain/src/test/java/com/jmsoftware/maf/mafmis/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package com.jmsoftware.maf.mafmis; diff --git a/maf-mis/maf-mis-domain/src/test/java/com/jmsoftware/maf/mafmis/package-info.kt b/maf-mis/maf-mis-domain/src/test/java/com/jmsoftware/maf/mafmis/package-info.kt new file mode 100644 index 00000000..90fff230 --- /dev/null +++ b/maf-mis/maf-mis-domain/src/test/java/com/jmsoftware/maf/mafmis/package-info.kt @@ -0,0 +1 @@ +package com.jmsoftware.maf.mafmis diff --git a/maf-mis/maf-mis-infra/pom.xml b/maf-mis/maf-mis-infra/pom.xml index 06bcaea0..8b7f4e09 100644 --- a/maf-mis/maf-mis-infra/pom.xml +++ b/maf-mis/maf-mis-infra/pom.xml @@ -11,6 +11,6 @@ com.jmsoftware.maf maf-mis - 0.0.8.1 + 0.0.9 diff --git a/maf-mis/maf-mis-infra/src/main/java/com/jmsoftware/maf/mafmis/OssCenterRemoteApi.java b/maf-mis/maf-mis-infra/src/main/java/com/jmsoftware/maf/mafmis/OssCenterRemoteApi.java deleted file mode 100644 index 3d540bec..00000000 --- a/maf-mis/maf-mis-infra/src/main/java/com/jmsoftware/maf/mafmis/OssCenterRemoteApi.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.jmsoftware.maf.mafmis; - -import com.jmsoftware.maf.common.bean.ResponseBodyBean; -import com.jmsoftware.maf.common.domain.osscenter.write.ObjectResponse; -import lombok.extern.slf4j.Slf4j; -import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.http.MediaType; -import org.springframework.stereotype.Component; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestPart; -import org.springframework.web.multipart.MultipartFile; - -import javax.validation.constraints.NotNull; - -/** - * Description: OssCenterRemoteApi, change description here. - * - * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 9/15/2021 11:10 AM - * @see Spring Cloud OpenFeign - **/ -@Validated -@FeignClient(value = OssCenterRemoteApi.SERVICE_NAME, fallback = OssCenterRemoteApi.OssCenterRemoteApiFallback.class) -public interface OssCenterRemoteApi { - String SERVICE_NAME = "oss-center"; - - /** - * Upload single resource response body bean. - * - * @param multipartFile the multipart file - * @return the response body bean - */ - @PostMapping(value = "/upload/single", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) - ResponseBodyBean uploadSingleResource(@NotNull @RequestPart("file") MultipartFile multipartFile); - - @Slf4j - @Component - class OssCenterRemoteApiFallback implements OssCenterRemoteApi { - @Override - public ResponseBodyBean uploadSingleResource(@NotNull MultipartFile multipartFile) { - log.error("Fallback -> OssCenterRemoteApi#uploadSingleResource()"); - return null; - } - } -} diff --git a/maf-mis/maf-mis-infra/src/main/java/com/jmsoftware/maf/mafmis/exercise/converter/ExerciseMapStructMapper.java b/maf-mis/maf-mis-infra/src/main/java/com/jmsoftware/maf/mafmis/exercise/converter/ExerciseMapStructMapper.java new file mode 100644 index 00000000..2f8f504e --- /dev/null +++ b/maf-mis/maf-mis-infra/src/main/java/com/jmsoftware/maf/mafmis/exercise/converter/ExerciseMapStructMapper.java @@ -0,0 +1,29 @@ +package com.jmsoftware.maf.mafmis.exercise.converter; + +import com.jmsoftware.maf.mafmis.exercise.payload.GetPageListPayload; +import com.jmsoftware.maf.mafmis.exercise.persistence.Exercise; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; + +import static org.mapstruct.factory.Mappers.getMapper; + +/** + * Description: ExerciseMapStructMapper, change description here. + * + * @author Johnny Miller (鍾俊), e-mail: johnnysviva@outlook.com, date: 2/5/2022 7:15 PM + **/ +@Mapper +public interface ExerciseMapStructMapper { + ExerciseMapStructMapper INSTANCE = getMapper(ExerciseMapStructMapper.class); + + /** + * GetPageListPayload -> Exercise. + * + * @param payload the payload + * @return the exercise + */ + @Mapping(target = "preparation", ignore = true) + @Mapping(target = "execution", ignore = true) + @Mapping(target = "exerciseGifPath", ignore = true) + Exercise of(GetPageListPayload payload); +} diff --git a/maf-mis/maf-mis-infra/src/main/java/com/jmsoftware/maf/mafmis/exercise/persistence/Exercise.java b/maf-mis/maf-mis-infra/src/main/java/com/jmsoftware/maf/mafmis/exercise/persistence/Exercise.java index d01f4e1f..81f94bef 100644 --- a/maf-mis/maf-mis-infra/src/main/java/com/jmsoftware/maf/mafmis/exercise/persistence/Exercise.java +++ b/maf-mis/maf-mis-infra/src/main/java/com/jmsoftware/maf/mafmis/exercise/persistence/Exercise.java @@ -1,6 +1,5 @@ package com.jmsoftware.maf.mafmis.exercise.persistence; -import com.jmsoftware.maf.common.bean.PaginationBase; import lombok.Data; import lombok.EqualsAndHashCode; @@ -14,7 +13,7 @@ */ @Data @EqualsAndHashCode(callSuper = false) -public class Exercise extends PaginationBase { +public class Exercise { /** * The ID of exercise. */ diff --git a/maf-mis/maf-mis-infra/src/main/java/com/jmsoftware/maf/mafmis/remote/OssCenterFeignClient.kt b/maf-mis/maf-mis-infra/src/main/java/com/jmsoftware/maf/mafmis/remote/OssCenterFeignClient.kt new file mode 100644 index 00000000..bb16b1fe --- /dev/null +++ b/maf-mis/maf-mis-infra/src/main/java/com/jmsoftware/maf/mafmis/remote/OssCenterFeignClient.kt @@ -0,0 +1,53 @@ +package com.jmsoftware.maf.mafmis.remote + +import com.jmsoftware.maf.common.bean.ResponseBodyBean +import com.jmsoftware.maf.common.domain.osscenter.write.ObjectResponse +import com.jmsoftware.maf.common.util.logger +import com.jmsoftware.maf.mafmis.remote.OssCenterFeignClient.OssCenterFeignClientFallback +import org.springframework.cloud.openfeign.FeignClient +import org.springframework.context.annotation.Primary +import org.springframework.http.MediaType +import org.springframework.stereotype.Component +import org.springframework.validation.annotation.Validated +import org.springframework.web.bind.annotation.PostMapping +import org.springframework.web.bind.annotation.RequestPart +import org.springframework.web.multipart.MultipartFile +import javax.validation.constraints.NotNull + +/** + * # OssCenterFeignClient + * + * Description: OssCenterFeignClient, change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/12/22 9:37 PM + * @see Spring Cloud OpenFeign + */ +@Primary +@Validated +@FeignClient(value = OssCenterFeignClient.SERVICE_NAME, fallback = OssCenterFeignClientFallback::class) +interface OssCenterFeignClient { + companion object { + const val SERVICE_NAME = "oss-center" + } + + /** + * Upload single resource response body bean. + * + * @param multipartFile the multipart file + * @return the response body bean + */ + @PostMapping(value = ["/upload/single"], consumes = [MediaType.MULTIPART_FORM_DATA_VALUE]) + fun uploadSingleResource(@RequestPart("file") multipartFile: @NotNull MultipartFile): ResponseBodyBean + + @Component + class OssCenterFeignClientFallback : OssCenterFeignClient { + companion object { + private val log = logger() + } + + override fun uploadSingleResource(multipartFile: @NotNull MultipartFile): ResponseBodyBean { + log.error("Fallback -> OssCenterFeignClient#uploadSingleResource()") + return ResponseBodyBean.ofFailureMessage("Fell back uploading single resource") + } + } +} diff --git a/maf-mis/maf-mis-infra/src/test/java/com/jmsoftware/maf/mafmis/package-info.java b/maf-mis/maf-mis-infra/src/test/java/com/jmsoftware/maf/mafmis/package-info.java deleted file mode 100644 index 7acc0501..00000000 --- a/maf-mis/maf-mis-infra/src/test/java/com/jmsoftware/maf/mafmis/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package com.jmsoftware.maf.mafmis; diff --git a/maf-mis/maf-mis-infra/src/test/java/com/jmsoftware/maf/mafmis/package-info.kt b/maf-mis/maf-mis-infra/src/test/java/com/jmsoftware/maf/mafmis/package-info.kt new file mode 100644 index 00000000..90fff230 --- /dev/null +++ b/maf-mis/maf-mis-infra/src/test/java/com/jmsoftware/maf/mafmis/package-info.kt @@ -0,0 +1 @@ +package com.jmsoftware.maf.mafmis diff --git a/maf-mis/maf-mis-message/pom.xml b/maf-mis/maf-mis-message/pom.xml index 7ff11b8a..48abd3ec 100644 --- a/maf-mis/maf-mis-message/pom.xml +++ b/maf-mis/maf-mis-message/pom.xml @@ -11,7 +11,7 @@ com.jmsoftware.maf maf-mis - 0.0.8.1 + 0.0.9 diff --git a/maf-mis/maf-mis-message/src/main/java/com/jmsoftware/maf/mafmis/DelayedMessageListener.java b/maf-mis/maf-mis-message/src/main/java/com/jmsoftware/maf/mafmis/DelayedMessageListener.java deleted file mode 100644 index a7c398eb..00000000 --- a/maf-mis/maf-mis-message/src/main/java/com/jmsoftware/maf/mafmis/DelayedMessageListener.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.jmsoftware.maf.mafmis; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.amqp.core.Message; -import org.springframework.amqp.rabbit.annotation.RabbitListener; -import org.springframework.stereotype.Component; - -import static com.jmsoftware.maf.springcloudstarter.rabbitmq.DelayedMessageConfiguration.DELAYED_MESSAGE_QUEUE_NAME; - -/** - *

DelayedMessageListener

- *

- * Change description here. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com, 10/2/21 1:38 PM - **/ -@Slf4j -@Component -@RequiredArgsConstructor -public class DelayedMessageListener { - @RabbitListener(queues = DELAYED_MESSAGE_QUEUE_NAME) - public void receiveMessage(final Message message) { - log.info("Received message as a generic AMQP 'Message' wrapper: {}", message); - } -} diff --git a/maf-mis/maf-mis-message/src/main/java/com/jmsoftware/maf/mafmis/DelayedMessageListener.kt b/maf-mis/maf-mis-message/src/main/java/com/jmsoftware/maf/mafmis/DelayedMessageListener.kt new file mode 100644 index 00000000..97869ae6 --- /dev/null +++ b/maf-mis/maf-mis-message/src/main/java/com/jmsoftware/maf/mafmis/DelayedMessageListener.kt @@ -0,0 +1,26 @@ +package com.jmsoftware.maf.mafmis + +import com.jmsoftware.maf.common.util.logger +import com.jmsoftware.maf.springcloudstarter.rabbitmq.DelayedMessageConfiguration +import org.springframework.amqp.core.Message +import org.springframework.amqp.rabbit.annotation.RabbitListener +import org.springframework.stereotype.Component + +/** + * # DelayedMessageListener + * + * Change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/16/22 11:19 PM + */ +@Component +class DelayedMessageListener { + companion object { + private val log = logger() + } + + @RabbitListener(queues = [DelayedMessageConfiguration.DELAYED_MESSAGE_QUEUE_NAME]) + fun receiveMessage(message: Message) { + log.info("Received message as a generic AMQP 'Message' wrapper: $message") + } +} diff --git a/maf-mis/maf-mis-message/src/test/java/com/jmsoftware/maf/mafmis/package-info.java b/maf-mis/maf-mis-message/src/test/java/com/jmsoftware/maf/mafmis/package-info.java deleted file mode 100644 index 7acc0501..00000000 --- a/maf-mis/maf-mis-message/src/test/java/com/jmsoftware/maf/mafmis/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package com.jmsoftware.maf.mafmis; diff --git a/maf-mis/maf-mis-message/src/test/java/com/jmsoftware/maf/mafmis/package-info.kt b/maf-mis/maf-mis-message/src/test/java/com/jmsoftware/maf/mafmis/package-info.kt new file mode 100644 index 00000000..90fff230 --- /dev/null +++ b/maf-mis/maf-mis-message/src/test/java/com/jmsoftware/maf/mafmis/package-info.kt @@ -0,0 +1 @@ +package com.jmsoftware.maf.mafmis diff --git a/maf-mis/maf-mis-web/pom.xml b/maf-mis/maf-mis-web/pom.xml index 181634ac..d03e3294 100644 --- a/maf-mis/maf-mis-web/pom.xml +++ b/maf-mis/maf-mis-web/pom.xml @@ -11,7 +11,7 @@ com.jmsoftware.maf maf-mis - 0.0.8.1 + 0.0.9 diff --git a/maf-mis/maf-mis-web/src/main/java/com/jmsoftware/maf/mafmis/configuration/OssConfiguration.java b/maf-mis/maf-mis-web/src/main/java/com/jmsoftware/maf/mafmis/configuration/OssConfiguration.java deleted file mode 100644 index 78bf4af8..00000000 --- a/maf-mis/maf-mis-web/src/main/java/com/jmsoftware/maf/mafmis/configuration/OssConfiguration.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.jmsoftware.maf.mafmis.configuration; - -import com.jmsoftware.maf.mafmis.OssCenterRemoteApi; -import com.jmsoftware.maf.springcloudstarter.poi.OssUploader; -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.mock.web.MockMultipartFile; - -/** - * Description: OssConfiguration, change description here. - * - * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 9/15/2021 11:51 AM - **/ -@Slf4j -@Configuration -@RequiredArgsConstructor -public class OssConfiguration { - private final OssCenterRemoteApi ossCenterRemoteApi; - - @Bean - public OssUploader ossUploader() { - return (name, inputStream) -> { - val multipartFile = new MockMultipartFile(name, name, null, inputStream); - val response = this.ossCenterRemoteApi.uploadSingleResource(multipartFile); - log.info("Called {} to upload multipartFile. {}", OssCenterRemoteApi.SERVICE_NAME, response); - return String.format("%s/%s", response.getData().getBucket(), response.getData().getObject()); - }; - } -} diff --git a/maf-mis/maf-mis-web/src/main/java/com/jmsoftware/maf/mafmis/configuration/OssConfiguration.kt b/maf-mis/maf-mis-web/src/main/java/com/jmsoftware/maf/mafmis/configuration/OssConfiguration.kt new file mode 100644 index 00000000..743f6bd9 --- /dev/null +++ b/maf-mis/maf-mis-web/src/main/java/com/jmsoftware/maf/mafmis/configuration/OssConfiguration.kt @@ -0,0 +1,36 @@ +package com.jmsoftware.maf.mafmis.configuration + +import com.jmsoftware.maf.common.util.logger +import com.jmsoftware.maf.mafmis.remote.OssCenterFeignService +import com.jmsoftware.maf.springcloudstarter.poi.OssUploader +import org.springframework.context.annotation.Bean +import org.springframework.context.annotation.Configuration +import org.springframework.mock.web.MockMultipartFile +import java.io.InputStream + +/** + * # OssConfiguration + * + * Description: OssConfiguration, change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/12/22 5:51 PM + */ +@Configuration +class OssConfiguration( + private val ossCenterFeignService: OssCenterFeignService +) { + companion object { + private val log = logger() + } + + @Bean + fun ossUploader(): OssUploader { + return OssUploader { name: String, inputStream: InputStream -> + val multipartFile = MockMultipartFile(name, name, null, inputStream) + val objectResponse = ossCenterFeignService.uploadSingleResource(multipartFile) + "${objectResponse.bucket}/${objectResponse.`object`}".apply { + log.info("Uploaded multipartFile. Path: $this") + } + } + } +} diff --git a/maf-mis/maf-mis-web/src/main/java/com/jmsoftware/maf/mafmis/package-info.java b/maf-mis/maf-mis-web/src/main/java/com/jmsoftware/maf/mafmis/package-info.java deleted file mode 100644 index 7acc0501..00000000 --- a/maf-mis/maf-mis-web/src/main/java/com/jmsoftware/maf/mafmis/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package com.jmsoftware.maf.mafmis; diff --git a/maf-mis/maf-mis-web/src/main/java/com/jmsoftware/maf/mafmis/package-info.kt b/maf-mis/maf-mis-web/src/main/java/com/jmsoftware/maf/mafmis/package-info.kt new file mode 100644 index 00000000..90fff230 --- /dev/null +++ b/maf-mis/maf-mis-web/src/main/java/com/jmsoftware/maf/mafmis/package-info.kt @@ -0,0 +1 @@ +package com.jmsoftware.maf.mafmis diff --git a/maf-mis/maf-mis-web/src/test/java/com/jmsoftware/maf/mafmis/package-info.java b/maf-mis/maf-mis-web/src/test/java/com/jmsoftware/maf/mafmis/package-info.java deleted file mode 100644 index 7acc0501..00000000 --- a/maf-mis/maf-mis-web/src/test/java/com/jmsoftware/maf/mafmis/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package com.jmsoftware.maf.mafmis; diff --git a/maf-mis/maf-mis-web/src/test/java/com/jmsoftware/maf/mafmis/package-info.kt b/maf-mis/maf-mis-web/src/test/java/com/jmsoftware/maf/mafmis/package-info.kt new file mode 100644 index 00000000..90fff230 --- /dev/null +++ b/maf-mis/maf-mis-web/src/test/java/com/jmsoftware/maf/mafmis/package-info.kt @@ -0,0 +1 @@ +package com.jmsoftware.maf.mafmis diff --git a/maf-mis/pom.xml b/maf-mis/pom.xml index a9e0ee05..0baa0477 100644 --- a/maf-mis/pom.xml +++ b/maf-mis/pom.xml @@ -10,7 +10,7 @@ com.jmsoftware.maf muscle-and-fitness-server - 0.0.8.1 + 0.0.9 pom @@ -75,6 +75,10 @@ org.springframework.boot spring-boot-starter-data-redis + + org.springframework.boot + spring-boot-starter-data-elasticsearch + org.springframework.boot spring-boot-starter-amqp @@ -96,52 +100,32 @@ org.springframework.boot spring-boot-starter-reactor-netty - - org.springframework.boot - spring-boot-starter-test - test - - - org.junit.vintage - junit-vintage-engine - - - org.springframework spring-test - + - com.baomidou - mybatis-plus-boot-starter - ${mybatis-plus-boot-starter.version} - - - com.baomidou - dynamic-datasource-spring-boot-starter - ${dynamic-datasource-spring-boot-starter.version} + org.springframework.integration + spring-integration-redis + + mysql mysql-connector-java runtime - com.alibaba - druid-spring-boot-starter - ${druid-spring-boot-starter.version} - - - com.sun - tools - - - com.sun - jconsole - - + com.baomidou + mybatis-plus-boot-starter + ${mybatis-plus-boot-starter.version} + + + org.apache.shardingsphere + shardingsphere-jdbc-core-spring-boot-starter + ${shardingsphere.version} diff --git a/oss-center/oss-center-biz/pom.xml b/oss-center/oss-center-biz/pom.xml index f99df901..a6eebd35 100644 --- a/oss-center/oss-center-biz/pom.xml +++ b/oss-center/oss-center-biz/pom.xml @@ -11,7 +11,7 @@ com.jmsoftware.maf oss-center - 0.0.8.1 + 0.0.9 diff --git a/oss-center/oss-center-biz/src/main/java/com/jmsoftware/maf/osscenter/package-info.java b/oss-center/oss-center-biz/src/main/java/com/jmsoftware/maf/osscenter/package-info.java deleted file mode 100644 index 91ed1eb1..00000000 --- a/oss-center/oss-center-biz/src/main/java/com/jmsoftware/maf/osscenter/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package com.jmsoftware.maf.osscenter; diff --git a/oss-center/oss-center-biz/src/main/java/com/jmsoftware/maf/osscenter/package-info.kt b/oss-center/oss-center-biz/src/main/java/com/jmsoftware/maf/osscenter/package-info.kt new file mode 100644 index 00000000..e82b0c07 --- /dev/null +++ b/oss-center/oss-center-biz/src/main/java/com/jmsoftware/maf/osscenter/package-info.kt @@ -0,0 +1 @@ +package com.jmsoftware.maf.osscenter diff --git a/oss-center/oss-center-biz/src/main/java/com/jmsoftware/maf/osscenter/service/ReadResourceService.java b/oss-center/oss-center-biz/src/main/java/com/jmsoftware/maf/osscenter/service/ReadResourceService.kt similarity index 50% rename from oss-center/oss-center-biz/src/main/java/com/jmsoftware/maf/osscenter/service/ReadResourceService.java rename to oss-center/oss-center-biz/src/main/java/com/jmsoftware/maf/osscenter/service/ReadResourceService.kt index 4922e8ce..7dc2d693 100644 --- a/oss-center/oss-center-biz/src/main/java/com/jmsoftware/maf/osscenter/service/ReadResourceService.java +++ b/oss-center/oss-center-biz/src/main/java/com/jmsoftware/maf/osscenter/service/ReadResourceService.kt @@ -1,22 +1,20 @@ -package com.jmsoftware.maf.osscenter.service; +package com.jmsoftware.maf.osscenter.service -import com.jmsoftware.maf.osscenter.response.SerializableStatObjectResponse; -import org.springframework.http.ResponseEntity; -import org.springframework.lang.Nullable; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBody; - -import javax.validation.constraints.NotBlank; +import com.jmsoftware.maf.osscenter.response.SerializableStatObjectResponse +import org.springframework.http.ResponseEntity +import org.springframework.validation.annotation.Validated +import org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBody +import javax.validation.constraints.NotBlank /** - *

ReadResourceService

- *

+ * # ReadResourceService + * * Change description here. * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com, 6/20/21 5:17 PM - **/ + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/16/22 11:48 PM + */ @Validated -public interface ReadResourceService { +interface ReadResourceService { /** * Get single resource, especially pictures, or other small size file. * @@ -24,7 +22,10 @@ public interface ReadResourceService { * @param object the object * @return the response entity */ - ResponseEntity asyncGetSingleResource(String bucket, String object); + fun asyncGetSingleResource( + bucket: @NotBlank String, + `object`: @NotBlank String + ): ResponseEntity /** * Stream single resource, more efficiency if the resource is large file, which will be streamed by range. @@ -35,8 +36,11 @@ public interface ReadResourceService { * @param range the range * @return the response entity */ - ResponseEntity asyncStreamSingleResource(@NotBlank String bucket, @NotBlank String object, - @Nullable String range); + fun asyncStreamSingleResource( + bucket: @NotBlank String, + `object`: @NotBlank String, + range: String? + ): ResponseEntity /** * Async download single resource response entity. @@ -45,7 +49,10 @@ ResponseEntity asyncStreamSingleResource(@NotBlank String * @param object the object * @return the response entity */ - ResponseEntity asyncDownloadSingleResource(@NotBlank String bucket, @NotBlank String object); + fun asyncDownloadSingleResource( + bucket: @NotBlank String, + `object`: @NotBlank String + ): ResponseEntity /** * Gets resource information. @@ -54,5 +61,8 @@ ResponseEntity asyncStreamSingleResource(@NotBlank String * @param object the object * @return the resource detail */ - SerializableStatObjectResponse stateObject(@NotBlank String bucket, @NotBlank String object); + fun stateObject( + bucket: @NotBlank String, + `object`: @NotBlank String + ): SerializableStatObjectResponse } diff --git a/oss-center/oss-center-biz/src/main/java/com/jmsoftware/maf/osscenter/service/WriteResourceService.java b/oss-center/oss-center-biz/src/main/java/com/jmsoftware/maf/osscenter/service/WriteResourceService.java deleted file mode 100644 index 2a10dd98..00000000 --- a/oss-center/oss-center-biz/src/main/java/com/jmsoftware/maf/osscenter/service/WriteResourceService.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.jmsoftware.maf.osscenter.service; - -import com.jmsoftware.maf.common.domain.osscenter.write.ObjectResponse; -import com.jmsoftware.maf.osscenter.payload.MergeResourceChunkPayload; -import com.jmsoftware.maf.osscenter.payload.UploadResourceChunkPayload; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.multipart.MultipartFile; - -import javax.validation.Valid; -import javax.validation.constraints.NotNull; - -/** - *

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 - */ - ObjectResponse uploadSingleResource(@NotNull MultipartFile multipartFile); - - /** - * Upload resource chunk string. - * - * @param multipartFile the multipart file - * @param payload the payload - * @return the string - */ - ObjectResponse uploadResourceChunk(@NotNull MultipartFile multipartFile, - @Valid @NotNull UploadResourceChunkPayload payload); - - /** - * Merge resource chunk string. - * - * @param payload the payload - * @return the string - */ - ObjectResponse mergeResourceChunk(@Valid @NotNull MergeResourceChunkPayload payload); -} diff --git a/oss-center/oss-center-biz/src/main/java/com/jmsoftware/maf/osscenter/service/WriteResourceService.kt b/oss-center/oss-center-biz/src/main/java/com/jmsoftware/maf/osscenter/service/WriteResourceService.kt new file mode 100644 index 00000000..e09bad67 --- /dev/null +++ b/oss-center/oss-center-biz/src/main/java/com/jmsoftware/maf/osscenter/service/WriteResourceService.kt @@ -0,0 +1,47 @@ +package com.jmsoftware.maf.osscenter.service + +import com.jmsoftware.maf.common.domain.osscenter.write.ObjectResponse +import com.jmsoftware.maf.osscenter.payload.MergeResourceChunkPayload +import com.jmsoftware.maf.osscenter.payload.UploadResourceChunkPayload +import org.springframework.validation.annotation.Validated +import org.springframework.web.multipart.MultipartFile +import javax.validation.Valid +import javax.validation.constraints.NotNull + +/** + * # WriteResourceService + * + * Change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/16/22 11:49 PM + */ +@Validated +interface WriteResourceService { + /** + * Upload single resource string. + * + * @param multipartFile the multipart file + * @return the string + */ + fun uploadSingleResource(multipartFile: @NotNull MultipartFile): ObjectResponse + + /** + * Upload resource chunk string. + * + * @param multipartFile the multipart file + * @param payload the payload + * @return the string + */ + fun uploadResourceChunk( + multipartFile: @NotNull MultipartFile, + payload: @Valid @NotNull UploadResourceChunkPayload + ): ObjectResponse + + /** + * Merge resource chunk string. + * + * @param payload the payload + * @return the string + */ + fun mergeResourceChunk(payload: @Valid @NotNull MergeResourceChunkPayload): ObjectResponse +} diff --git a/oss-center/oss-center-biz/src/main/java/com/jmsoftware/maf/osscenter/service/impl/ReadResourceServiceImpl.java b/oss-center/oss-center-biz/src/main/java/com/jmsoftware/maf/osscenter/service/impl/ReadResourceServiceImpl.java deleted file mode 100644 index 08845046..00000000 --- a/oss-center/oss-center-biz/src/main/java/com/jmsoftware/maf/osscenter/service/impl/ReadResourceServiceImpl.java +++ /dev/null @@ -1,136 +0,0 @@ -package com.jmsoftware.maf.osscenter.service.impl; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.io.IoUtil; -import cn.hutool.core.io.NioUtil; -import com.jmsoftware.maf.osscenter.response.SerializableStatObjectResponse; -import com.jmsoftware.maf.osscenter.service.ReadResourceService; -import com.jmsoftware.maf.springcloudstarter.minio.MinioHelper; -import io.minio.StatObjectResponse; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import lombok.val; -import org.springframework.http.*; -import org.springframework.lang.Nullable; -import org.springframework.stereotype.Service; -import org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBody; - -import javax.validation.constraints.NotBlank; -import java.util.List; - -import static com.jmsoftware.maf.osscenter.constant.Chunk.LARGE_CHUNK_SIZE; -import static com.jmsoftware.maf.osscenter.constant.Chunk.TINY_CHUNK_SIZE; - -/** - *

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 static final String ACCEPT_RANGES_VALUE = "bytes"; - private final MinioHelper minioHelper; - - @Override - @SuppressWarnings("DuplicatedCode") - public ResponseEntity asyncGetSingleResource(String bucket, String object) { - StatObjectResponse statObjectResponse; - try { - statObjectResponse = this.minioHelper.statObject(bucket, object); - } catch (Exception e) { - log.error("Exception occurred when looking for object. Exception message: {}", e.getMessage()); - return ResponseEntity.notFound().build(); - } - val getObjectResponse = this.minioHelper.getObject(bucket, object); - return ResponseEntity.ok() - .header(HttpHeaders.ACCEPT_RANGES, ACCEPT_RANGES_VALUE) - .contentLength(statObjectResponse.size()) - .contentType(MediaType.parseMediaType(statObjectResponse.contentType())) - .body(outputStream -> { - NioUtil.copyByNIO(getObjectResponse, outputStream, NioUtil.DEFAULT_BUFFER_SIZE, null); - IoUtil.close(getObjectResponse); - }); - } - - @Override - @SuppressWarnings("DuplicatedCode") - public ResponseEntity asyncStreamSingleResource(@NotBlank String bucket, - @NotBlank String object, - @Nullable String range) { - StatObjectResponse statObjectResponse; - try { - statObjectResponse = this.minioHelper.statObject(bucket, object); - } catch (Exception e) { - log.error("Exception occurred when looking for object. Exception message: {}", e.getMessage()); - return ResponseEntity.notFound().build(); - } - val httpRanges = HttpRange.parseRanges(range); - if (CollUtil.isEmpty(httpRanges)) { - val getObjectResponse = this.minioHelper.getObject(bucket, object, 0, TINY_CHUNK_SIZE.toBytes()); - return ResponseEntity.ok() - .header(HttpHeaders.ACCEPT_RANGES, ACCEPT_RANGES_VALUE) - .contentLength(statObjectResponse.size()) - .contentType(MediaType.parseMediaType(statObjectResponse.contentType())) - .body(outputStream -> { - NioUtil.copyByNIO(getObjectResponse, outputStream, NioUtil.DEFAULT_BUFFER_SIZE, null); - IoUtil.close(getObjectResponse); - }); - } - return this.asyncGetResourceRegion(bucket, object, statObjectResponse, httpRanges); - } - - @Override - @SuppressWarnings("DuplicatedCode") - public ResponseEntity asyncDownloadSingleResource(@NotBlank String bucket, - @NotBlank String object) { - StatObjectResponse statObjectResponse; - try { - statObjectResponse = this.minioHelper.statObject(bucket, object); - } catch (Exception e) { - log.error("Exception occurred when looking for object. Exception message: {}", e.getMessage()); - return ResponseEntity.notFound().build(); - } - val getObjectResponse = this.minioHelper.getObject(bucket, object); - return ResponseEntity.ok() - .header(HttpHeaders.ACCEPT_RANGES, ACCEPT_RANGES_VALUE) - .header(HttpHeaders.CONTENT_DISPOSITION, - ContentDisposition.builder("attachment").filename(object).build().toString()) - .contentLength(statObjectResponse.size()) - .contentType(MediaType.parseMediaType(statObjectResponse.contentType())) - .body((outputStream -> { - NioUtil.copyByNIO(getObjectResponse, outputStream, NioUtil.DEFAULT_LARGE_BUFFER_SIZE, null); - IoUtil.close(getObjectResponse); - })); - } - - @Override - public SerializableStatObjectResponse stateObject(@NotBlank String bucket, @NotBlank String object) { - return SerializableStatObjectResponse.build(this.minioHelper.statObject(bucket, object)); - } - - @SuppressWarnings("DuplicatedCode") - private ResponseEntity asyncGetResourceRegion(String bucket, String object, - StatObjectResponse statObjectResponse, - List httpRanges) { - val getObjectResponse = this.minioHelper.getObject(bucket, object, httpRanges.get(0).getRangeStart(0), - LARGE_CHUNK_SIZE.toBytes()); - val start = httpRanges.get(0).getRangeStart(0); - var end = start + LARGE_CHUNK_SIZE.toBytes() - 1; - val resourceLength = statObjectResponse.size(); - end = Math.min(end, resourceLength - 1); - val rangeLength = end - start + 1; - return ResponseEntity.status(HttpStatus.PARTIAL_CONTENT) - .header(HttpHeaders.ACCEPT_RANGES, ACCEPT_RANGES_VALUE) - .header(HttpHeaders.CONTENT_RANGE, String.format("bytes %d-%d/%d", start, end, resourceLength)) - .contentLength(rangeLength) - .contentType(MediaType.parseMediaType(statObjectResponse.contentType())) - .body(outputStream -> { - NioUtil.copyByNIO(getObjectResponse, outputStream, NioUtil.DEFAULT_LARGE_BUFFER_SIZE, null); - IoUtil.close(getObjectResponse); - }); - } -} diff --git a/oss-center/oss-center-biz/src/main/java/com/jmsoftware/maf/osscenter/service/impl/ReadResourceServiceImpl.kt b/oss-center/oss-center-biz/src/main/java/com/jmsoftware/maf/osscenter/service/impl/ReadResourceServiceImpl.kt new file mode 100644 index 00000000..2ca32eee --- /dev/null +++ b/oss-center/oss-center-biz/src/main/java/com/jmsoftware/maf/osscenter/service/impl/ReadResourceServiceImpl.kt @@ -0,0 +1,173 @@ +package com.jmsoftware.maf.osscenter.service.impl + +import cn.hutool.core.collection.CollUtil +import cn.hutool.core.io.IoUtil +import cn.hutool.core.io.NioUtil +import com.jmsoftware.maf.common.exception.ResourceNotFoundException +import com.jmsoftware.maf.common.util.logger +import com.jmsoftware.maf.osscenter.constant.Chunk +import com.jmsoftware.maf.osscenter.constant.Chunk.LARGE_CHUNK_SIZE +import com.jmsoftware.maf.osscenter.response.SerializableStatObjectResponse +import com.jmsoftware.maf.osscenter.service.ReadResourceService +import com.jmsoftware.maf.springcloudstarter.minio.MinioHelper +import io.minio.StatObjectResponse +import org.springframework.http.* +import org.springframework.stereotype.Service +import org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBody +import java.io.OutputStream +import javax.validation.constraints.NotBlank + +/** + * # ReadResourceServiceImpl + * + * Change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/16/22 11:48 PM + */ +@Service +class ReadResourceServiceImpl( + private val minioHelper: MinioHelper +) : ReadResourceService { + companion object { + private const val ACCEPT_RANGES_VALUE = "bytes" + private val log = logger() + } + + override fun asyncGetSingleResource( + bucket: @NotBlank String, + `object`: @NotBlank String + ): ResponseEntity { + val statObjectResponse: StatObjectResponse? = try { + minioHelper.statObject(bucket, `object`) + } catch (e: Exception) { + log.error("Exception occurred when looking for object!", e) + return ResponseEntity.notFound().build() + } + val objectResponse = minioHelper.getObject(bucket, `object`) + if (statObjectResponse == null || objectResponse == null) { + log.warn("Object not found! Bucket: {}, Object: {}", bucket, `object`) + return ResponseEntity.notFound().build() + } + return ResponseEntity.ok() + .header(HttpHeaders.ACCEPT_RANGES, ACCEPT_RANGES_VALUE) + .contentLength(statObjectResponse.size()) + .contentType(MediaType.parseMediaType(statObjectResponse.contentType())) + .body(StreamingResponseBody { outputStream: OutputStream? -> + NioUtil.copyByNIO(objectResponse, outputStream, NioUtil.DEFAULT_BUFFER_SIZE, null) + IoUtil.close(objectResponse) + }) + } + + override fun asyncStreamSingleResource( + bucket: @NotBlank String, + `object`: @NotBlank String, + range: String? + ): ResponseEntity { + val statObjectResponse: StatObjectResponse? = try { + minioHelper.statObject(bucket, `object`) + } catch (e: Exception) { + log.error( + "Exception occurred when looking for object. Exception message: {}", + e.message + ) + return ResponseEntity.notFound().build() + } + if (statObjectResponse == null) { + log.warn("StatObjectResponse not found! Bucket: {}, Object: {}", bucket, `object`) + return ResponseEntity.notFound().build() + } + val httpRanges = HttpRange.parseRanges(range) + if (CollUtil.isEmpty(httpRanges)) { + val objectResponse = minioHelper.getObject(bucket, `object`, 0, Chunk.TINY_CHUNK_SIZE.toBytes()) + if (objectResponse == null) { + log.warn("Object not found! Bucket: {}, Object: {}", bucket, `object`) + return ResponseEntity.notFound().build() + } + return ResponseEntity.ok() + .header(HttpHeaders.ACCEPT_RANGES, ACCEPT_RANGES_VALUE) + .contentLength(statObjectResponse.size()) + .contentType(MediaType.parseMediaType(statObjectResponse.contentType())) + .body(StreamingResponseBody { outputStream: OutputStream? -> + NioUtil.copyByNIO(objectResponse, outputStream, NioUtil.DEFAULT_BUFFER_SIZE, null) + IoUtil.close(objectResponse) + }) + } + return asyncGetResourceRegion(bucket, `object`, statObjectResponse, httpRanges) + } + + override fun asyncDownloadSingleResource( + bucket: @NotBlank String, + `object`: @NotBlank String + ): ResponseEntity { + val statObjectResponse: StatObjectResponse? = try { + minioHelper.statObject(bucket, `object`) + } catch (e: Exception) { + log.error( + "Exception occurred when looking for object. Exception message: {}", + e.message + ) + return ResponseEntity.notFound().build() + } + val objectResponse = minioHelper.getObject(bucket, `object`) + if (statObjectResponse == null || objectResponse == null) { + log.warn("StatObjectResponse not found! Bucket: {}, Object: {}", bucket, `object`) + return ResponseEntity.notFound().build() + } + return ResponseEntity.ok() + .header(HttpHeaders.ACCEPT_RANGES, ACCEPT_RANGES_VALUE) + .header( + HttpHeaders.CONTENT_DISPOSITION, + ContentDisposition.builder("attachment").filename(`object`).build().toString() + ) + .contentLength(statObjectResponse.size()) + .contentType(MediaType.parseMediaType(statObjectResponse.contentType())) + .body(StreamingResponseBody { outputStream: OutputStream? -> + NioUtil.copyByNIO(objectResponse, outputStream, NioUtil.DEFAULT_LARGE_BUFFER_SIZE, null) + IoUtil.close(objectResponse) + }) + } + + override fun stateObject( + bucket: @NotBlank String, + `object`: @NotBlank String + ): SerializableStatObjectResponse { + val statObjectResponse = minioHelper.statObject(bucket, `object`) + if (statObjectResponse == null) { + log.warn("StatObjectResponse not found! Bucket: {}, Object: {}", bucket, `object`) + throw ResourceNotFoundException("Object not found!") + } + return SerializableStatObjectResponse.build(statObjectResponse) + } + + private fun asyncGetResourceRegion( + bucket: String, + `object`: String, + statObjectResponse: StatObjectResponse, + httpRanges: List + ): ResponseEntity { + val objectResponse = minioHelper.getObject( + bucket, + `object`, + httpRanges[0].getRangeStart(0), + LARGE_CHUNK_SIZE.toBytes() + ) + if (objectResponse == null) { + log.warn("Object not found! Bucket: $bucket, Object: $`object`") + return ResponseEntity.notFound().build() + } + val start = httpRanges[0].getRangeStart(0) + var end = start + LARGE_CHUNK_SIZE.toBytes() - 1 + val resourceLength = statObjectResponse.size() + end = end.coerceAtMost(resourceLength - 1) + val rangeLength = end - start + 1 + return ResponseEntity.status(HttpStatus.PARTIAL_CONTENT) + .header(HttpHeaders.ACCEPT_RANGES, ACCEPT_RANGES_VALUE) + .header(HttpHeaders.CONTENT_RANGE, "bytes $start-$end/$resourceLength") + .contentLength(rangeLength) + .contentType(MediaType.parseMediaType(statObjectResponse.contentType())) + .body(StreamingResponseBody { outputStream: OutputStream? -> + NioUtil.copyByNIO(objectResponse, outputStream, NioUtil.DEFAULT_LARGE_BUFFER_SIZE, null) + IoUtil.close(objectResponse) + }) + } +} diff --git a/oss-center/oss-center-biz/src/main/java/com/jmsoftware/maf/osscenter/service/impl/WriteResourceServiceImpl.java b/oss-center/oss-center-biz/src/main/java/com/jmsoftware/maf/osscenter/service/impl/WriteResourceServiceImpl.java deleted file mode 100644 index 3f4dddac..00000000 --- a/oss-center/oss-center-biz/src/main/java/com/jmsoftware/maf/osscenter/service/impl/WriteResourceServiceImpl.java +++ /dev/null @@ -1,173 +0,0 @@ -package com.jmsoftware.maf.osscenter.service.impl; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.text.CharSequenceUtil; -import cn.hutool.core.util.NumberUtil; -import com.jmsoftware.maf.common.domain.osscenter.write.ObjectResponse; -import com.jmsoftware.maf.osscenter.payload.MergeResourceChunkPayload; -import com.jmsoftware.maf.osscenter.payload.UploadResourceChunkPayload; -import com.jmsoftware.maf.osscenter.service.WriteResourceService; -import com.jmsoftware.maf.springcloudstarter.minio.MinioHelper; -import io.minio.ComposeSource; -import lombok.Cleanup; -import lombok.RequiredArgsConstructor; -import lombok.SneakyThrows; -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.Valid; -import javax.validation.constraints.NotNull; -import java.io.IOException; -import java.io.InputStream; -import java.util.HashMap; -import java.util.List; -import java.util.Objects; -import java.util.stream.Collectors; - -import static com.jmsoftware.maf.osscenter.constant.Chunk.TINY_CHUNK_SIZE; - -/** - *

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 - @SneakyThrows - public ObjectResponse uploadSingleResource(@NotNull MultipartFile multipartFile) { - val mediaType = this.parseMediaType(multipartFile); - this.minioHelper.makeBucket(mediaType.getType()); - val objectWriteResponse = this.minioHelper.put(mediaType.getType(), multipartFile.getOriginalFilename(), - multipartFile); - val objectResponse = new ObjectResponse(); - objectResponse.setBucket(objectWriteResponse.bucket()); - objectResponse.setObject(objectWriteResponse.object()); - objectResponse.setEtag(objectWriteResponse.etag()); - log.info("Uploaded single resource. {}", objectResponse); - return objectResponse; - } - - /** - * {@inheritDoc} - *

- *

What is an S3 ETag?

- *

According to - * Amazon:

- *

The ETag may or may not be an MD5 digest of the object data

- *
- *

Basically, if the object was uploaded with a single PUT operation and doesnt use Customer Managed or KMS - * keys for encryption then the resulting ETag is just the MD5 hexdigest of the object.

- *

However, more importantly:

- *

If an object is created by either the Multipart Upload or Part Copy operation, the ETag is not - * an MD5 digest, regardless of the method of encryption.

- *
- *

Well if it’s not an MD5 digest then what is it?!

- *

For multipart uploads the ETag is the MD5 hexdigest of each part’s MD5 digest concatenated - * together, followed by the number of parts separated by a dash.

- *
- *

E.g. for a two part object the ETag may look something like this:

- *

d41d8cd98f00b204e9800998ecf8427e-2

- *
- *

Which can be represented by:

- *

hexmd5( md5( part1 ) + md5( part2 ) )-{ number of parts }

- *
- * - * @see All about AWS S3 ETags - */ - @Override - @SneakyThrows - public ObjectResponse uploadResourceChunk( - @NotNull MultipartFile multipartFile, - @Valid @NotNull UploadResourceChunkPayload payload - ) { - if (CharSequenceUtil.isBlank(multipartFile.getOriginalFilename())) { - throw new IllegalArgumentException("File name required"); - } - MediaType mediaType = null; - if (CharSequenceUtil.isBlank(payload.getBucket())) { - mediaType = this.parseMediaType(multipartFile); - } - // bucketName is either mediaType of given 'bucket' - val bucketName = CharSequenceUtil.isBlank(payload.getBucket()) ? - Objects.requireNonNull(mediaType).getType() : payload.getBucket(); - val orderedFilename = String.format("%s.chunk%s", payload.getFilename(), - NumberUtil.decimalFormat("000", payload.getChunkNumber())); - val objectResponse = new ObjectResponse(); - objectResponse.setBucket(bucketName); - objectResponse.setObject(orderedFilename); - this.minioHelper.makeBucket(bucketName); - val objectWriteResponse = this.minioHelper.put(bucketName, orderedFilename, multipartFile); - objectResponse.setEtag(objectWriteResponse.etag()); - log.info("Uploaded resource chunk. {}", objectResponse); - return objectResponse; - } - - @Override - @SneakyThrows - public ObjectResponse mergeResourceChunk(@Valid @NotNull MergeResourceChunkPayload payload) { - val objectName = this.validateObject(payload.getObjectList()); - val sources = payload.getObjectList() - .stream() - .map(object -> ComposeSource.builder().bucket(payload.getBucket()).object(object).build()) - .collect(Collectors.toList()); - @Cleanup val firstChunk = this.minioHelper.getObject(payload.getBucket(), - CollUtil.getFirst(payload.getObjectList()), - 0, - TINY_CHUNK_SIZE.toBytes()); - val mediaType = this.parseMediaType(firstChunk); - val headers = new HashMap(4); - headers.put("Content-Type", mediaType.toString()); - val objectWriteResponse = this.minioHelper.composeObject(payload.getBucket(), objectName, sources, headers); - val objectResponse = new ObjectResponse(); - objectResponse.setBucket(objectWriteResponse.bucket()); - objectResponse.setObject(objectWriteResponse.object()); - objectResponse.setEtag(objectWriteResponse.etag()); - log.info("Merged resource chunks. {}", objectResponse); - val errorObjectList = this.minioHelper.removeObjects(payload.getBucket(), payload.getObjectList()); - log.warn("Removed unnecessary objects. errorObjectList: {}", errorObjectList); - return objectResponse; - } - - private String validateObject(List objectList) { - val objectNameSet = objectList.stream().map(object -> { - val lastIndexOfDot = CharSequenceUtil.lastIndexOfIgnoreCase(object, "."); - return CharSequenceUtil.subPre(object, lastIndexOfDot); - }).collect(Collectors.toSet()); - if (CollUtil.size(objectNameSet) != 1) { - log.error("Object list is not valid! {}", objectNameSet); - throw new IllegalArgumentException("Object list is not valid"); - } - return objectNameSet.iterator().next(); - } - - private MediaType parseMediaType(MultipartFile multipartFile) throws IOException { - val tika = new Tika(); - val detectedMediaType = tika.detect(multipartFile.getInputStream()); - log.info("Detected media type: {}", detectedMediaType); - if (CharSequenceUtil.isBlank(detectedMediaType)) { - throw new IllegalStateException("Media extension detection failed!"); - } - return MediaType.parse(detectedMediaType); - } - - private MediaType parseMediaType(InputStream inputStream) throws IOException { - val tika = new Tika(); - val detectedMediaType = tika.detect(inputStream); - log.info("Detected media type: {}", detectedMediaType); - if (CharSequenceUtil.isBlank(detectedMediaType)) { - throw new IllegalStateException("Media extension detection failed!"); - } - return MediaType.parse(detectedMediaType); - } -} diff --git a/oss-center/oss-center-biz/src/main/java/com/jmsoftware/maf/osscenter/service/impl/WriteResourceServiceImpl.kt b/oss-center/oss-center-biz/src/main/java/com/jmsoftware/maf/osscenter/service/impl/WriteResourceServiceImpl.kt new file mode 100644 index 00000000..edd94750 --- /dev/null +++ b/oss-center/oss-center-biz/src/main/java/com/jmsoftware/maf/osscenter/service/impl/WriteResourceServiceImpl.kt @@ -0,0 +1,179 @@ +package com.jmsoftware.maf.osscenter.service.impl + +import cn.hutool.core.collection.CollUtil +import cn.hutool.core.text.CharSequenceUtil +import cn.hutool.core.util.NumberUtil +import com.jmsoftware.maf.common.domain.osscenter.write.ObjectResponse +import com.jmsoftware.maf.common.util.logger +import com.jmsoftware.maf.osscenter.constant.Chunk +import com.jmsoftware.maf.osscenter.payload.MergeResourceChunkPayload +import com.jmsoftware.maf.osscenter.payload.UploadResourceChunkPayload +import com.jmsoftware.maf.osscenter.service.WriteResourceService +import com.jmsoftware.maf.springcloudstarter.minio.MinioHelper +import io.minio.ComposeSource +import lombok.SneakyThrows +import org.apache.tika.Tika +import org.apache.tika.mime.MediaType +import org.springframework.stereotype.Service +import org.springframework.web.multipart.MultipartFile +import java.io.InputStream +import java.util.stream.Collectors +import javax.validation.Valid +import javax.validation.constraints.NotNull + +/** + * # WriteResourceServiceImpl + * + * Change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/16/22 11:48 PM + */ +@Service +class WriteResourceServiceImpl( + private val minioHelper: MinioHelper +) : WriteResourceService { + companion object { + private val log = logger() + } + + override fun uploadSingleResource(multipartFile: @NotNull MultipartFile): ObjectResponse { + val mediaType = this.parseMediaType(multipartFile) + minioHelper.makeBucket(mediaType.type) + val objectWriteResponse = minioHelper.put( + mediaType.type, + multipartFile.originalFilename!!, + multipartFile + ) + val objectResponse = ObjectResponse() + objectResponse.bucket = objectWriteResponse.bucket() + objectResponse.`object` = objectWriteResponse.`object`() + objectResponse.etag = objectWriteResponse.etag() + log.info("Uploaded single resource. {}", objectResponse) + return objectResponse + } + + /** + * ## What is an S3 ETag? + * + * According to [Amazon](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTCommonResponseHeaders.html): + * + * > The ETag may or may not be an MD5 digest of the object data + * + * Basically, if the object was uploaded with a single PUT operation and doesnt use Customer Managed or KMS keys for encryption then the resulting ETag is just the MD5 hexdigest of the object. + * + * However, more importantly: + * + * > If an object is created by either the Multipart Upload or Part Copy operation, the ETag is not an MD5 digest, regardless of the method of encryption. + * + * Well if it’s not an MD5 digest then what is it?! + * + * > For multipart uploads the ETag is the MD5 hexdigest of each part’s MD5 digest concatenated together, followed by the number of parts separated by a dash. + * + * E.g. for a two part object the ETag may look something like this: + * + * > d41d8cd98f00b204e9800998ecf8427e-2 + * + * Which can be represented by: + * + * > hexmd5( md5( part1 ) + md5( part2 ) )-{ number of parts } + * + * E.g. for a two part object the ETag may look something like this: + * + * > d41d8cd98f00b204e9800998ecf8427e-2 + * + * Which can be represented by: + * + * > hexmd5( md5( part1 ) + md5( part2 ) )-{ number of parts } + * + * @see All about AWS S3 ETags + */ + override fun uploadResourceChunk( + multipartFile: @NotNull MultipartFile, + payload: @Valid @NotNull UploadResourceChunkPayload + ): ObjectResponse { + require(!CharSequenceUtil.isBlank(multipartFile.originalFilename)) { "File name required" } + var mediaType: MediaType? = null + if (CharSequenceUtil.isBlank(payload.bucket)) { + mediaType = this.parseMediaType(multipartFile) + } + // bucketName is either mediaType of given 'bucket' + val bucketName = + if (CharSequenceUtil.isBlank(payload.bucket)) mediaType!!.type else payload.bucket + val orderedFilename = CharSequenceUtil.format( + "{}.chunk{}", payload.filename, + NumberUtil.decimalFormat("000", payload.chunkNumber) + ) + val objectResponse = ObjectResponse() + objectResponse.bucket = bucketName + objectResponse.`object` = orderedFilename + minioHelper.makeBucket(bucketName) + val objectWriteResponse = minioHelper.put(bucketName!!, orderedFilename, multipartFile) + objectResponse.etag = objectWriteResponse.etag() + log.info("Uploaded resource chunk. $objectResponse") + return objectResponse + } + + @SneakyThrows + override fun mergeResourceChunk(payload: @Valid @NotNull MergeResourceChunkPayload): ObjectResponse { + val objectName = validateObject(payload.objectList) + val sources = payload.objectList + .stream() + .map { `object`: String -> + ComposeSource.builder().bucket( + payload.bucket + ).`object`(`object`).build() + } + .collect(Collectors.toList()) + val mediaType = minioHelper.getObject( + payload.bucket, + CollUtil.getFirst(payload.objectList), + 0, + Chunk.TINY_CHUNK_SIZE.toBytes() + )!!.use { + this.parseMediaType(it) + } + val headers = HashMap(4) + headers["Content-Type"] = mediaType.toString() + val objectWriteResponse = minioHelper.composeObject(payload.bucket, objectName, sources, headers) + if (objectWriteResponse == null) { + log.error("objectWriteResponse is null!") + throw IllegalStateException("Failed to compose object!") + } + val objectResponse = ObjectResponse() + objectResponse.bucket = objectWriteResponse.bucket() + objectResponse.`object` = objectWriteResponse.`object`() + objectResponse.etag = objectWriteResponse.etag() + log.info("Merged resource chunks. {}", objectResponse) + val errorObjectList = minioHelper.removeObjects(payload.bucket, payload.objectList) + log.warn("Removed unnecessary objects. errorObjectList: $errorObjectList") + return objectResponse + } + + private fun validateObject(objectList: List): String { + val objectNameSet = objectList.stream().map { `object`: String? -> + val lastIndexOfDot = CharSequenceUtil.lastIndexOfIgnoreCase(`object`, ".") + CharSequenceUtil.subPre(`object`, lastIndexOfDot) + }.collect(Collectors.toSet()) + if (CollUtil.size(objectNameSet) != 1) { + log.error("Object list is not valid! {}", objectNameSet) + throw IllegalArgumentException("Object list is not valid") + } + return objectNameSet.iterator().next() + } + + private fun parseMediaType(multipartFile: MultipartFile): MediaType { + val tika = Tika() + val detectedMediaType = tika.detect(multipartFile.inputStream) + log.info("Detected media type: $detectedMediaType") + check(detectedMediaType.isNotBlank()) { "Media extension detection failed!" } + return MediaType.parse(detectedMediaType) + } + + private fun parseMediaType(inputStream: InputStream): MediaType { + val tika = Tika() + val detectedMediaType = tika.detect(inputStream) + log.info("Detected media type: $detectedMediaType") + check(detectedMediaType.isNotBlank()) { "Media extension detection failed!" } + return MediaType.parse(detectedMediaType) + } +} diff --git a/oss-center/oss-center-biz/src/test/java/com/jmsoftware/maf/osscenter/package-info.java b/oss-center/oss-center-biz/src/test/java/com/jmsoftware/maf/osscenter/package-info.java deleted file mode 100644 index 91ed1eb1..00000000 --- a/oss-center/oss-center-biz/src/test/java/com/jmsoftware/maf/osscenter/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package com.jmsoftware.maf.osscenter; diff --git a/oss-center/oss-center-biz/src/test/java/com/jmsoftware/maf/osscenter/package-info.kt b/oss-center/oss-center-biz/src/test/java/com/jmsoftware/maf/osscenter/package-info.kt new file mode 100644 index 00000000..e82b0c07 --- /dev/null +++ b/oss-center/oss-center-biz/src/test/java/com/jmsoftware/maf/osscenter/package-info.kt @@ -0,0 +1 @@ +package com.jmsoftware.maf.osscenter diff --git a/oss-center/oss-center-bootstrap/pom.xml b/oss-center/oss-center-bootstrap/pom.xml index 29e83a12..ff1e510f 100644 --- a/oss-center/oss-center-bootstrap/pom.xml +++ b/oss-center/oss-center-bootstrap/pom.xml @@ -11,7 +11,7 @@ com.jmsoftware.maf oss-center - 0.0.8.1 + 0.0.9 @@ -31,44 +31,6 @@ - - org.apache.maven.plugins - maven-pmd-plugin - ${maven-pmd-plugin.version} - - ${project.build.sourceEncoding} - ${java.version} - true - - rulesets/java/ali-comment.xml - rulesets/java/ali-concurrent.xml - rulesets/java/ali-constant.xml - rulesets/java/ali-exception.xml - rulesets/java/ali-flowcontrol.xml - rulesets/java/ali-naming.xml - rulesets/java/ali-oop.xml - rulesets/java/ali-orm.xml - rulesets/java/ali-other.xml - rulesets/java/ali-set.xml - - - - - verify - - check - - - - - - com.alibaba.p3c - p3c-pmd - ${p3c-pmd.version} - - - - com.google.cloud.tools @@ -101,12 +63,16 @@ - - adoptopenjdk/openjdk11:${adoptopenjdk11.tag} + + eclipse-temurin:${temurin.tag} docker.io/ijohnnymiller/${project.baseArtifactId}.${project.parent.artifactId} + ${git.commit.id.abbrev}-${project.version} @@ -133,32 +99,6 @@ - - - - io.github.git-commit-id - git-commit-id-maven-plugin - 5.0.0 - - - get-the-git-info - - revision - - initialize - - - - true - ${project.build.outputDirectory}/git.properties - - - ^git.build.(time|version)$ - ^git.commit.id.(abbrev|full)$ - - full - - diff --git a/oss-center/oss-center-bootstrap/src/main/java/com/jmsoftware/maf/osscenter/OssCenterApplication.java b/oss-center/oss-center-bootstrap/src/main/java/com/jmsoftware/maf/osscenter/OssCenterApplication.java deleted file mode 100644 index 51e03472..00000000 --- a/oss-center/oss-center-bootstrap/src/main/java/com/jmsoftware/maf/osscenter/OssCenterApplication.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.jmsoftware.maf.osscenter; - -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 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 -@SuppressWarnings("scwjava_Createprivateconstructorforutilityclassallfieldsmethodsarestatic") -public class OssCenterApplication { - public static void main(String[] args) { - val stopWatch = new StopWatch(); - stopWatch.start(); - val configurableApplicationContext = SpringApplication.run(OssCenterApplication.class, args); - val springBootStartupHelper = configurableApplicationContext.getBean(SpringBootStartupHelper.class); - springBootStartupHelper.stop(stopWatch); - } -} diff --git a/oss-center/oss-center-bootstrap/src/main/java/com/jmsoftware/maf/osscenter/OssCenterApplication.kt b/oss-center/oss-center-bootstrap/src/main/java/com/jmsoftware/maf/osscenter/OssCenterApplication.kt new file mode 100644 index 00000000..ffc658dd --- /dev/null +++ b/oss-center/oss-center-bootstrap/src/main/java/com/jmsoftware/maf/osscenter/OssCenterApplication.kt @@ -0,0 +1,31 @@ +package com.jmsoftware.maf.osscenter + +import com.jmsoftware.maf.springcloudstarter.helper.SpringBootStartupHelper +import lombok.extern.slf4j.Slf4j +import org.springframework.boot.autoconfigure.SpringBootApplication +import org.springframework.boot.runApplication +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 (锺俊), e-mail: johnnysviva@outlook.com, date: 4/17/22 8:47 AM + */ +@Slf4j +@EnableFeignClients +@EnableDiscoveryClient +@SpringBootApplication +class OssCenterApplication + +fun main(args: Array) { + StopWatch().let { + it.start() + runApplication(*args) + .getBean(SpringBootStartupHelper::class.java) + .stop(it) + } +} diff --git a/oss-center/oss-center-bootstrap/src/main/java/com/jmsoftware/maf/osscenter/package-info.java b/oss-center/oss-center-bootstrap/src/main/java/com/jmsoftware/maf/osscenter/package-info.java deleted file mode 100644 index 91ed1eb1..00000000 --- a/oss-center/oss-center-bootstrap/src/main/java/com/jmsoftware/maf/osscenter/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package com.jmsoftware.maf.osscenter; diff --git a/oss-center/oss-center-bootstrap/src/main/resources/application.yml b/oss-center/oss-center-bootstrap/src/main/resources/application.yml index d6997d7e..00fd851e 100644 --- a/oss-center/oss-center-bootstrap/src/main/resources/application.yml +++ b/oss-center/oss-center-bootstrap/src/main/resources/application.yml @@ -21,7 +21,7 @@ spring: config: # `default-context` should not be modified, keeps "application" for common configuration. # Properties in the config/application folder are applicable to all applications using consul for configuration. - profile-separator: "::" + profile-separator: "@" format: YAML data-key: "data" watch: @@ -39,15 +39,9 @@ spring: health-check-critical-timeout: 15s 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: @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 logging: diff --git a/oss-center/oss-center-bootstrap/src/test/java/com/jmsoftware/maf/osscenter/OssCenterApplicationTests.java b/oss-center/oss-center-bootstrap/src/test/java/com/jmsoftware/maf/osscenter/OssCenterApplicationTests.java deleted file mode 100644 index 518e880e..00000000 --- a/oss-center/oss-center-bootstrap/src/test/java/com/jmsoftware/maf/osscenter/OssCenterApplicationTests.java +++ /dev/null @@ -1,21 +0,0 @@ -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/oss-center/oss-center-bootstrap/src/test/java/com/jmsoftware/maf/osscenter/package-info.kt b/oss-center/oss-center-bootstrap/src/test/java/com/jmsoftware/maf/osscenter/package-info.kt new file mode 100644 index 00000000..e82b0c07 --- /dev/null +++ b/oss-center/oss-center-bootstrap/src/test/java/com/jmsoftware/maf/osscenter/package-info.kt @@ -0,0 +1 @@ +package com.jmsoftware.maf.osscenter diff --git a/oss-center/oss-center-domain/pom.xml b/oss-center/oss-center-domain/pom.xml index 6b54e840..a5810250 100644 --- a/oss-center/oss-center-domain/pom.xml +++ b/oss-center/oss-center-domain/pom.xml @@ -11,7 +11,7 @@ com.jmsoftware.maf oss-center - 0.0.8.1 + 0.0.9 diff --git a/oss-center/oss-center-domain/src/main/java/com/jmsoftware/maf/osscenter/package-info.java b/oss-center/oss-center-domain/src/main/java/com/jmsoftware/maf/osscenter/package-info.java deleted file mode 100644 index 91ed1eb1..00000000 --- a/oss-center/oss-center-domain/src/main/java/com/jmsoftware/maf/osscenter/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package com.jmsoftware.maf.osscenter; diff --git a/oss-center/oss-center-domain/src/main/java/com/jmsoftware/maf/osscenter/package-info.kt b/oss-center/oss-center-domain/src/main/java/com/jmsoftware/maf/osscenter/package-info.kt new file mode 100644 index 00000000..e82b0c07 --- /dev/null +++ b/oss-center/oss-center-domain/src/main/java/com/jmsoftware/maf/osscenter/package-info.kt @@ -0,0 +1 @@ +package com.jmsoftware.maf.osscenter diff --git a/oss-center/oss-center-domain/src/test/java/com/jmsoftware/maf/osscenter/package-info.java b/oss-center/oss-center-domain/src/test/java/com/jmsoftware/maf/osscenter/package-info.java deleted file mode 100644 index 91ed1eb1..00000000 --- a/oss-center/oss-center-domain/src/test/java/com/jmsoftware/maf/osscenter/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package com.jmsoftware.maf.osscenter; diff --git a/oss-center/oss-center-domain/src/test/java/com/jmsoftware/maf/osscenter/package-info.kt b/oss-center/oss-center-domain/src/test/java/com/jmsoftware/maf/osscenter/package-info.kt new file mode 100644 index 00000000..e82b0c07 --- /dev/null +++ b/oss-center/oss-center-domain/src/test/java/com/jmsoftware/maf/osscenter/package-info.kt @@ -0,0 +1 @@ +package com.jmsoftware.maf.osscenter diff --git a/oss-center/oss-center-infra/pom.xml b/oss-center/oss-center-infra/pom.xml index 3585d4d4..3a87e30c 100644 --- a/oss-center/oss-center-infra/pom.xml +++ b/oss-center/oss-center-infra/pom.xml @@ -11,6 +11,6 @@ com.jmsoftware.maf oss-center - 0.0.8.1 + 0.0.9 diff --git a/oss-center/oss-center-infra/src/main/java/com/jmsoftware/maf/osscenter/constant/Chunk.java b/oss-center/oss-center-infra/src/main/java/com/jmsoftware/maf/osscenter/constant/Chunk.java deleted file mode 100644 index c9507e36..00000000 --- a/oss-center/oss-center-infra/src/main/java/com/jmsoftware/maf/osscenter/constant/Chunk.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright By ZATI - * Copyright By 3a3c88295d37870dfd3b25056092d1a9209824b256c341f2cdc296437f671617 - * All rights reserved. - * - * If you are not the intended user, you are hereby notified that any use, disclosure, copying, printing, forwarding or - * dissemination of this property is strictly prohibited. If you have got this file in error, delete it from your - * system. - */ -package com.jmsoftware.maf.osscenter.constant; - -import org.springframework.util.unit.DataSize; - -/** - * Description: ChunkSize, change description here. - * - * @author Johnny Miller (鍾俊), e-mail: johnnysviva@outlook.com, date: 2/3/2022 10:28 PM - **/ -@SuppressWarnings("unused") -public class Chunk { - private Chunk() { - } - - public static final String BUCKET_OBJECT_NAME_REGEX = "^.+/.+$"; - public static final DataSize TINY_CHUNK_SIZE = DataSize.ofBytes(512); - public static final DataSize SMALL_CHUNK_SIZE = DataSize.ofMegabytes(1); - public static final DataSize MEDIUM_CHUNK_SIZE = DataSize.ofMegabytes(4); - public static final DataSize LARGE_CHUNK_SIZE = DataSize.ofMegabytes(8); - public static final int MAX_CHUNK_NUMBER = 999; -} diff --git a/oss-center/oss-center-infra/src/main/java/com/jmsoftware/maf/osscenter/constant/Chunk.kt b/oss-center/oss-center-infra/src/main/java/com/jmsoftware/maf/osscenter/constant/Chunk.kt new file mode 100644 index 00000000..7d8bedcc --- /dev/null +++ b/oss-center/oss-center-infra/src/main/java/com/jmsoftware/maf/osscenter/constant/Chunk.kt @@ -0,0 +1,17 @@ +package com.jmsoftware.maf.osscenter.constant + +import org.springframework.util.unit.DataSize + +/** + * Description: ChunkSize, change description here. + * + * @author Johnny Miller (鍾俊), e-mail: johnnysviva@outlook.com, date: 2/3/2022 10:28 PM + */ +object Chunk { + const val BUCKET_OBJECT_NAME_REGEX = "^.+/.+$" + val TINY_CHUNK_SIZE = DataSize.ofBytes(512) + val SMALL_CHUNK_SIZE = DataSize.ofMegabytes(1) + val MEDIUM_CHUNK_SIZE = DataSize.ofMegabytes(4) + val LARGE_CHUNK_SIZE = DataSize.ofMegabytes(8) + const val MAX_CHUNK_NUMBER = 999 +} diff --git a/oss-center/oss-center-infra/src/main/java/com/jmsoftware/maf/osscenter/package-info.java b/oss-center/oss-center-infra/src/main/java/com/jmsoftware/maf/osscenter/package-info.java deleted file mode 100644 index 91ed1eb1..00000000 --- a/oss-center/oss-center-infra/src/main/java/com/jmsoftware/maf/osscenter/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package com.jmsoftware.maf.osscenter; diff --git a/oss-center/oss-center-infra/src/main/java/com/jmsoftware/maf/osscenter/package-info.kt b/oss-center/oss-center-infra/src/main/java/com/jmsoftware/maf/osscenter/package-info.kt new file mode 100644 index 00000000..e82b0c07 --- /dev/null +++ b/oss-center/oss-center-infra/src/main/java/com/jmsoftware/maf/osscenter/package-info.kt @@ -0,0 +1 @@ +package com.jmsoftware.maf.osscenter diff --git a/oss-center/oss-center-infra/src/main/java/com/jmsoftware/maf/osscenter/payload/MergeResourceChunkPayload.java b/oss-center/oss-center-infra/src/main/java/com/jmsoftware/maf/osscenter/payload/MergeResourceChunkPayload.java deleted file mode 100644 index 615a5231..00000000 --- a/oss-center/oss-center-infra/src/main/java/com/jmsoftware/maf/osscenter/payload/MergeResourceChunkPayload.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.jmsoftware.maf.osscenter.payload; - -import lombok.Data; - -import javax.validation.Valid; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotEmpty; -import java.util.List; - -/** - * Description: MergeResourceChunkPayload, change description here. - * - * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 8/12/2021 8:48 PM - **/ -@Data -public class MergeResourceChunkPayload { - @NotBlank - private String bucket; - @NotEmpty - private List<@Valid @NotBlank String> objectList; -} diff --git a/oss-center/oss-center-infra/src/main/java/com/jmsoftware/maf/osscenter/payload/MergeResourceChunkPayload.kt b/oss-center/oss-center-infra/src/main/java/com/jmsoftware/maf/osscenter/payload/MergeResourceChunkPayload.kt new file mode 100644 index 00000000..1833d593 --- /dev/null +++ b/oss-center/oss-center-infra/src/main/java/com/jmsoftware/maf/osscenter/payload/MergeResourceChunkPayload.kt @@ -0,0 +1,16 @@ +package com.jmsoftware.maf.osscenter.payload + +import javax.validation.constraints.NotBlank +import javax.validation.constraints.NotEmpty + +/** + * # MergeResourceChunkPayload + * + * Description: MergeResourceChunkPayload, change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/17/22 8:34 AM + */ +class MergeResourceChunkPayload { + lateinit var bucket: @NotBlank String + lateinit var objectList: @NotEmpty List +} diff --git a/oss-center/oss-center-infra/src/main/java/com/jmsoftware/maf/osscenter/payload/UploadResourceChunkPayload.java b/oss-center/oss-center-infra/src/main/java/com/jmsoftware/maf/osscenter/payload/UploadResourceChunkPayload.java deleted file mode 100644 index 95f7c30b..00000000 --- a/oss-center/oss-center-infra/src/main/java/com/jmsoftware/maf/osscenter/payload/UploadResourceChunkPayload.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.jmsoftware.maf.osscenter.payload; - -import lombok.Data; -import org.hibernate.validator.constraints.Range; - -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Pattern; - -import static com.jmsoftware.maf.osscenter.constant.Chunk.MAX_CHUNK_NUMBER; - -/** - * Description: UploadResourceChunkPayload, change description here. - * - * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 8/18/2021 9:29 AM - **/ -@Data -public class UploadResourceChunkPayload { - private String bucket; - @NotNull - @Range(max = MAX_CHUNK_NUMBER) - private Integer chunkNumber; - @NotBlank - @Pattern(regexp = "^[^<>:;,?\"*|/]+$") - private String filename; -} diff --git a/oss-center/oss-center-infra/src/main/java/com/jmsoftware/maf/osscenter/payload/UploadResourceChunkPayload.kt b/oss-center/oss-center-infra/src/main/java/com/jmsoftware/maf/osscenter/payload/UploadResourceChunkPayload.kt new file mode 100644 index 00000000..7a287952 --- /dev/null +++ b/oss-center/oss-center-infra/src/main/java/com/jmsoftware/maf/osscenter/payload/UploadResourceChunkPayload.kt @@ -0,0 +1,20 @@ +package com.jmsoftware.maf.osscenter.payload + +import com.jmsoftware.maf.osscenter.constant.Chunk +import org.hibernate.validator.constraints.Range +import javax.validation.constraints.NotBlank +import javax.validation.constraints.NotNull +import javax.validation.constraints.Pattern + +/** + * # UploadResourceChunkPayload + * + * Description: UploadResourceChunkPayload, change description here. + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 8/18/2021 9:29 AM + */ +class UploadResourceChunkPayload { + var bucket: String? = null + var chunkNumber: @NotNull @Range(max = Chunk.MAX_CHUNK_NUMBER.toLong()) Int? = null + var filename: @NotBlank @Pattern(regexp = "^[^<>:;,?\"*|/]+$") String? = null +} diff --git a/oss-center/oss-center-infra/src/main/java/com/jmsoftware/maf/osscenter/response/SerializableGenericResponse.java b/oss-center/oss-center-infra/src/main/java/com/jmsoftware/maf/osscenter/response/SerializableGenericResponse.java deleted file mode 100644 index 0c374810..00000000 --- a/oss-center/oss-center-infra/src/main/java/com/jmsoftware/maf/osscenter/response/SerializableGenericResponse.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.jmsoftware.maf.osscenter.response; - -import lombok.AccessLevel; -import lombok.Data; -import lombok.Setter; - -import java.util.List; -import java.util.Map; - -/** - * Description: SerializableGenericResponse, change description here. - * - * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 8/12/2021 5:07 PM - **/ -@Data -@Setter(AccessLevel.PROTECTED) -public class SerializableGenericResponse { - private Map> headers; - private String bucket; - private String region; - private String object; -} diff --git a/oss-center/oss-center-infra/src/main/java/com/jmsoftware/maf/osscenter/response/SerializableGenericResponse.kt b/oss-center/oss-center-infra/src/main/java/com/jmsoftware/maf/osscenter/response/SerializableGenericResponse.kt new file mode 100644 index 00000000..73bf1037 --- /dev/null +++ b/oss-center/oss-center-infra/src/main/java/com/jmsoftware/maf/osscenter/response/SerializableGenericResponse.kt @@ -0,0 +1,15 @@ +package com.jmsoftware.maf.osscenter.response + +/** + * # SerializableGenericResponse + * + * Description: SerializableGenericResponse, change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/17/22 8:38 AM + */ +open class SerializableGenericResponse { + var headers: Map>? = null + var bucket: String? = null + var region: String? = null + var `object`: String? = null +} diff --git a/oss-center/oss-center-infra/src/main/java/com/jmsoftware/maf/osscenter/response/SerializableStatObjectResponse.java b/oss-center/oss-center-infra/src/main/java/com/jmsoftware/maf/osscenter/response/SerializableStatObjectResponse.java deleted file mode 100644 index 40119887..00000000 --- a/oss-center/oss-center-infra/src/main/java/com/jmsoftware/maf/osscenter/response/SerializableStatObjectResponse.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.jmsoftware.maf.osscenter.response; - -import io.minio.StatObjectResponse; -import io.minio.messages.LegalHold; -import io.minio.messages.RetentionMode; -import lombok.*; - -import java.time.ZonedDateTime; -import java.util.Map; - -/** - * Description: SerializableStatObjectResponse, change description here. - * - * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 8/12/2021 5:04 PM - **/ -@Data -@Setter(AccessLevel.NONE) -@EqualsAndHashCode(callSuper = true) -public class SerializableStatObjectResponse extends SerializableGenericResponse { - private String etag; - private long size; - private ZonedDateTime lastModified; - private RetentionMode retentionMode; - private ZonedDateTime retentionRetainUntilDate; - private LegalHold legalHold; - private boolean deleteMarker; - private Map userMetadata; - - public static SerializableStatObjectResponse build(StatObjectResponse statObjectResponse) { - val serializableStatObjectResponse = new SerializableStatObjectResponse(); - serializableStatObjectResponse.setHeaders(statObjectResponse.headers().toMultimap()); - serializableStatObjectResponse.setBucket(statObjectResponse.bucket()); - serializableStatObjectResponse.setRegion(statObjectResponse.region()); - serializableStatObjectResponse.setObject(statObjectResponse.object()); - serializableStatObjectResponse.etag = statObjectResponse.etag(); - serializableStatObjectResponse.size = statObjectResponse.size(); - serializableStatObjectResponse.lastModified = statObjectResponse.lastModified(); - serializableStatObjectResponse.retentionMode = statObjectResponse.retentionMode(); - serializableStatObjectResponse.retentionRetainUntilDate = statObjectResponse.retentionRetainUntilDate(); - serializableStatObjectResponse.legalHold = statObjectResponse.legalHold(); - serializableStatObjectResponse.deleteMarker = statObjectResponse.deleteMarker(); - serializableStatObjectResponse.userMetadata = statObjectResponse.userMetadata(); - return serializableStatObjectResponse; - } -} diff --git a/oss-center/oss-center-infra/src/main/java/com/jmsoftware/maf/osscenter/response/SerializableStatObjectResponse.kt b/oss-center/oss-center-infra/src/main/java/com/jmsoftware/maf/osscenter/response/SerializableStatObjectResponse.kt new file mode 100644 index 00000000..fd5d5b23 --- /dev/null +++ b/oss-center/oss-center-infra/src/main/java/com/jmsoftware/maf/osscenter/response/SerializableStatObjectResponse.kt @@ -0,0 +1,44 @@ +package com.jmsoftware.maf.osscenter.response + +import io.minio.StatObjectResponse +import io.minio.messages.LegalHold +import io.minio.messages.RetentionMode +import java.time.ZonedDateTime + +/** + * # SerializableStatObjectResponse + * + * Description: SerializableStatObjectResponse, change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/17/22 8:39 AM + */ +class SerializableStatObjectResponse : SerializableGenericResponse() { + var etag: String? = null + var size: Long = 0 + var lastModified: ZonedDateTime? = null + var retentionMode: RetentionMode? = null + var retentionRetainUntilDate: ZonedDateTime? = null + var legalHold: LegalHold? = null + var deleteMarker = false + var userMetadata: Map? = null + + companion object { + fun build(statObjectResponse: StatObjectResponse): SerializableStatObjectResponse { + // TODO: use MapStruct to convert + val serializableStatObjectResponse = SerializableStatObjectResponse() + serializableStatObjectResponse.headers = statObjectResponse.headers().toMultimap() + serializableStatObjectResponse.bucket = statObjectResponse.bucket() + serializableStatObjectResponse.region = statObjectResponse.region() + serializableStatObjectResponse.`object` = statObjectResponse.`object`() + serializableStatObjectResponse.etag = statObjectResponse.etag() + serializableStatObjectResponse.size = statObjectResponse.size() + serializableStatObjectResponse.lastModified = statObjectResponse.lastModified() + serializableStatObjectResponse.retentionMode = statObjectResponse.retentionMode() + serializableStatObjectResponse.retentionRetainUntilDate = statObjectResponse.retentionRetainUntilDate() + serializableStatObjectResponse.legalHold = statObjectResponse.legalHold() + serializableStatObjectResponse.deleteMarker = statObjectResponse.deleteMarker() + serializableStatObjectResponse.userMetadata = statObjectResponse.userMetadata() + return serializableStatObjectResponse + } + } +} diff --git a/oss-center/oss-center-infra/src/test/java/com/jmsoftware/maf/osscenter/package-info.java b/oss-center/oss-center-infra/src/test/java/com/jmsoftware/maf/osscenter/package-info.java deleted file mode 100644 index 91ed1eb1..00000000 --- a/oss-center/oss-center-infra/src/test/java/com/jmsoftware/maf/osscenter/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package com.jmsoftware.maf.osscenter; diff --git a/oss-center/oss-center-infra/src/test/java/com/jmsoftware/maf/osscenter/package-info.kt b/oss-center/oss-center-infra/src/test/java/com/jmsoftware/maf/osscenter/package-info.kt new file mode 100644 index 00000000..e82b0c07 --- /dev/null +++ b/oss-center/oss-center-infra/src/test/java/com/jmsoftware/maf/osscenter/package-info.kt @@ -0,0 +1 @@ +package com.jmsoftware.maf.osscenter diff --git a/oss-center/oss-center-message/pom.xml b/oss-center/oss-center-message/pom.xml index 93c038db..65bfac7f 100644 --- a/oss-center/oss-center-message/pom.xml +++ b/oss-center/oss-center-message/pom.xml @@ -11,7 +11,7 @@ com.jmsoftware.maf oss-center - 0.0.8.1 + 0.0.9 diff --git a/oss-center/oss-center-message/src/main/java/com/jmsoftware/maf/osscenter/package-info.java b/oss-center/oss-center-message/src/main/java/com/jmsoftware/maf/osscenter/package-info.java deleted file mode 100644 index 91ed1eb1..00000000 --- a/oss-center/oss-center-message/src/main/java/com/jmsoftware/maf/osscenter/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package com.jmsoftware.maf.osscenter; diff --git a/oss-center/oss-center-message/src/main/java/com/jmsoftware/maf/osscenter/package-info.kt b/oss-center/oss-center-message/src/main/java/com/jmsoftware/maf/osscenter/package-info.kt new file mode 100644 index 00000000..e82b0c07 --- /dev/null +++ b/oss-center/oss-center-message/src/main/java/com/jmsoftware/maf/osscenter/package-info.kt @@ -0,0 +1 @@ +package com.jmsoftware.maf.osscenter diff --git a/oss-center/oss-center-message/src/test/java/com/jmsoftware/maf/osscenter/package-info.java b/oss-center/oss-center-message/src/test/java/com/jmsoftware/maf/osscenter/package-info.java deleted file mode 100644 index 91ed1eb1..00000000 --- a/oss-center/oss-center-message/src/test/java/com/jmsoftware/maf/osscenter/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package com.jmsoftware.maf.osscenter; diff --git a/oss-center/oss-center-message/src/test/java/com/jmsoftware/maf/osscenter/package-info.kt b/oss-center/oss-center-message/src/test/java/com/jmsoftware/maf/osscenter/package-info.kt new file mode 100644 index 00000000..e82b0c07 --- /dev/null +++ b/oss-center/oss-center-message/src/test/java/com/jmsoftware/maf/osscenter/package-info.kt @@ -0,0 +1 @@ +package com.jmsoftware.maf.osscenter diff --git a/oss-center/oss-center-web/pom.xml b/oss-center/oss-center-web/pom.xml index 92375336..eee59dc3 100644 --- a/oss-center/oss-center-web/pom.xml +++ b/oss-center/oss-center-web/pom.xml @@ -11,7 +11,7 @@ com.jmsoftware.maf oss-center - 0.0.8.1 + 0.0.9 diff --git a/oss-center/oss-center-web/src/main/java/com/jmsoftware/maf/osscenter/ReadResourceController.java b/oss-center/oss-center-web/src/main/java/com/jmsoftware/maf/osscenter/ReadResourceController.java deleted file mode 100644 index 2bf10df7..00000000 --- a/oss-center/oss-center-web/src/main/java/com/jmsoftware/maf/osscenter/ReadResourceController.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.jmsoftware.maf.osscenter; - -import com.jmsoftware.maf.common.bean.ResponseBodyBean; -import com.jmsoftware.maf.osscenter.response.SerializableStatObjectResponse; -import com.jmsoftware.maf.osscenter.service.ReadResourceService; -import lombok.RequiredArgsConstructor; -import org.springframework.http.HttpHeaders; -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.RequestHeader; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBody; - -/** - *

ReadResourceController

- *

- * Change description here. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com, 6/20/21 5:16 PM - **/ -@Validated -@RestController -@RequiredArgsConstructor -public class ReadResourceController { - private final ReadResourceService readResourceService; - - @GetMapping("/{bucket}/{object}") - public ResponseEntity asyncGetSingleResource( - @PathVariable String bucket, - @PathVariable String object - ) { - return this.readResourceService.asyncGetSingleResource(bucket, object); - } - - @GetMapping("/stream/{bucket}/{object}") - public ResponseEntity asyncStreamSingleResource( - @PathVariable String bucket, - @PathVariable String object, - @RequestHeader(name = HttpHeaders.RANGE, required = false) String range - ) { - return this.readResourceService.asyncStreamSingleResource(bucket, object, range); - } - - @GetMapping("/download/{bucket}/{object}") - public ResponseEntity downloadSingleResource( - @PathVariable String bucket, - @PathVariable String object - ) { - return this.readResourceService.asyncDownloadSingleResource(bucket, object); - } - - @GetMapping("/stat/{bucket}/{object}") - public ResponseBodyBean statSingleResource( - @PathVariable String bucket, - @PathVariable String object - ) { - return ResponseBodyBean.ofSuccess(this.readResourceService.stateObject(bucket, object)); - } -} diff --git a/oss-center/oss-center-web/src/main/java/com/jmsoftware/maf/osscenter/ReadResourceController.kt b/oss-center/oss-center-web/src/main/java/com/jmsoftware/maf/osscenter/ReadResourceController.kt new file mode 100644 index 00000000..0c0908da --- /dev/null +++ b/oss-center/oss-center-web/src/main/java/com/jmsoftware/maf/osscenter/ReadResourceController.kt @@ -0,0 +1,52 @@ +package com.jmsoftware.maf.osscenter + +import com.jmsoftware.maf.common.bean.ResponseBodyBean +import com.jmsoftware.maf.osscenter.response.SerializableStatObjectResponse +import com.jmsoftware.maf.osscenter.service.ReadResourceService +import org.springframework.http.HttpHeaders +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.RequestHeader +import org.springframework.web.bind.annotation.RestController +import org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBody + +/** + * # ReadResourceController + * + * Change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/16/22 11:41 AM + */ +@Validated +@RestController +class ReadResourceController( + private val readResourceService: ReadResourceService +) { + @GetMapping("/{bucket}/{object}") + fun asyncGetSingleResource( + @PathVariable bucket: String, + @PathVariable `object`: String + ): ResponseEntity = readResourceService.asyncGetSingleResource(bucket, `object`) + + @GetMapping("/stream/{bucket}/{object}") + fun asyncStreamSingleResource( + @PathVariable bucket: String, + @PathVariable `object`: String, + @RequestHeader(name = HttpHeaders.RANGE, required = false) range: String + ): ResponseEntity = readResourceService.asyncStreamSingleResource(bucket, `object`, range) + + @GetMapping("/download/{bucket}/{object}") + fun downloadSingleResource( + @PathVariable bucket: String, + @PathVariable `object`: String + ): ResponseEntity = readResourceService.asyncDownloadSingleResource(bucket, `object`) + + @GetMapping("/stat/{bucket}/{object}") + fun statSingleResource( + @PathVariable bucket: String, + @PathVariable `object`: String + ): ResponseBodyBean = + ResponseBodyBean.ofSuccess(readResourceService.stateObject(bucket, `object`)) +} diff --git a/oss-center/oss-center-web/src/main/java/com/jmsoftware/maf/osscenter/WriteResourceController.java b/oss-center/oss-center-web/src/main/java/com/jmsoftware/maf/osscenter/WriteResourceController.java deleted file mode 100644 index cdd324bf..00000000 --- a/oss-center/oss-center-web/src/main/java/com/jmsoftware/maf/osscenter/WriteResourceController.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.jmsoftware.maf.osscenter; - -import com.jmsoftware.maf.common.bean.ResponseBodyBean; -import com.jmsoftware.maf.common.domain.osscenter.write.ObjectResponse; -import com.jmsoftware.maf.osscenter.payload.MergeResourceChunkPayload; -import com.jmsoftware.maf.osscenter.payload.UploadResourceChunkPayload; -import com.jmsoftware.maf.osscenter.service.WriteResourceService; -import lombok.RequiredArgsConstructor; -import org.springframework.context.MessageSource; -import org.springframework.context.i18n.LocaleContextHolder; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; -import org.springframework.web.multipart.MultipartFile; - -import javax.validation.Valid; - -/** - *

WriteResourceController

- *

- * Change description here. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com, 6/20/21 1:57 PM - **/ -@Validated -@RestController -@RequiredArgsConstructor -public class WriteResourceController { - private final WriteResourceService writeResourceService; - private final MessageSource messageSource; - - @PostMapping("/upload/single") - public ResponseBodyBean uploadSingleResource( - @RequestPart("file") MultipartFile multipartFile - ) { - return ResponseBodyBean.ofSuccess( - this.writeResourceService.uploadSingleResource(multipartFile), - this.messageSource.getMessage( - "uploaded", - null, - LocaleContextHolder.getLocale() - ) - ); - } - - @PostMapping("/upload/chunk") - public ResponseBodyBean uploadResourceChunk( - @RequestPart("file") MultipartFile multipartFile, - @Valid UploadResourceChunkPayload payload - ) { - return ResponseBodyBean.ofSuccess(this.writeResourceService.uploadResourceChunk(multipartFile, payload)); - } - - @PutMapping("/merge/chunk") - public ResponseBodyBean mergeResourceChunk( - @Valid @RequestBody MergeResourceChunkPayload payload - ) { - return ResponseBodyBean.ofSuccess(this.writeResourceService.mergeResourceChunk(payload)); - } -} diff --git a/oss-center/oss-center-web/src/main/java/com/jmsoftware/maf/osscenter/WriteResourceController.kt b/oss-center/oss-center-web/src/main/java/com/jmsoftware/maf/osscenter/WriteResourceController.kt new file mode 100644 index 00000000..3a96af19 --- /dev/null +++ b/oss-center/oss-center-web/src/main/java/com/jmsoftware/maf/osscenter/WriteResourceController.kt @@ -0,0 +1,52 @@ +package com.jmsoftware.maf.osscenter + +import com.jmsoftware.maf.common.bean.ResponseBodyBean +import com.jmsoftware.maf.common.domain.osscenter.write.ObjectResponse +import com.jmsoftware.maf.osscenter.payload.MergeResourceChunkPayload +import com.jmsoftware.maf.osscenter.payload.UploadResourceChunkPayload +import com.jmsoftware.maf.osscenter.service.WriteResourceService +import org.springframework.context.MessageSource +import org.springframework.context.i18n.LocaleContextHolder +import org.springframework.validation.annotation.Validated +import org.springframework.web.bind.annotation.* +import org.springframework.web.multipart.MultipartFile +import javax.validation.Valid + +/** + *

WriteResourceController

+ * + * + * Change description here. + * + * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com, 6/20/21 1:57 PM + */ +@Validated +@RestController +class WriteResourceController( + private val writeResourceService: WriteResourceService, + private val messageSource: MessageSource +) { + @PostMapping("/upload/single") + fun uploadSingleResource( + @RequestPart("file") multipartFile: MultipartFile + ): ResponseBodyBean = ResponseBodyBean.ofSuccess( + writeResourceService.uploadSingleResource(multipartFile), + messageSource.getMessage( + "uploaded", + null, + LocaleContextHolder.getLocale() + ) + ) + + @PostMapping("/upload/chunk") + fun uploadResourceChunk( + @RequestPart("file") multipartFile: MultipartFile, + @Valid payload: UploadResourceChunkPayload + ): ResponseBodyBean = + ResponseBodyBean.ofSuccess(writeResourceService.uploadResourceChunk(multipartFile, payload)) + + @PutMapping("/merge/chunk") + fun mergeResourceChunk( + @Valid @RequestBody payload: MergeResourceChunkPayload + ): ResponseBodyBean = ResponseBodyBean.ofSuccess(writeResourceService.mergeResourceChunk(payload)) +} diff --git a/oss-center/oss-center-web/src/test/java/com/jmsoftware/maf/osscenter/package-info.java b/oss-center/oss-center-web/src/test/java/com/jmsoftware/maf/osscenter/package-info.java deleted file mode 100644 index 91ed1eb1..00000000 --- a/oss-center/oss-center-web/src/test/java/com/jmsoftware/maf/osscenter/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package com.jmsoftware.maf.osscenter; diff --git a/oss-center/oss-center-web/src/test/java/com/jmsoftware/maf/osscenter/package-info.kt b/oss-center/oss-center-web/src/test/java/com/jmsoftware/maf/osscenter/package-info.kt new file mode 100644 index 00000000..e82b0c07 --- /dev/null +++ b/oss-center/oss-center-web/src/test/java/com/jmsoftware/maf/osscenter/package-info.kt @@ -0,0 +1 @@ +package com.jmsoftware.maf.osscenter diff --git a/oss-center/pom.xml b/oss-center/pom.xml index f9a0bbaa..bfe75960 100644 --- a/oss-center/pom.xml +++ b/oss-center/pom.xml @@ -10,7 +10,7 @@ com.jmsoftware.maf muscle-and-fitness-server - 0.0.8.1 + 0.0.9 pom @@ -70,17 +70,6 @@ org.springframework.boot spring-boot-starter-data-redis
- - org.springframework.boot - spring-boot-starter-test - test - - - org.junit.vintage - junit-vintage-engine - - - @@ -88,6 +77,11 @@ minio ${minio.version} + + com.squareup.okhttp3 + okhttp + ${okhttp.version} + org.apache.tika diff --git a/pom.xml b/pom.xml index 7df474c9..e4441204 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ com.jmsoftware.maf muscle-and-fitness-server - 0.0.8.1 + 0.0.9 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. @@ -36,36 +36,43 @@ 8080 + true + - 11 + 17 - jre-11.0.11_9 + 17.0.2_8-jre 3.2.0 0.1.0 3.15.0 2.1.1 - 2021.0.0 - 4.8.1 + 2021.0.1 + 5.0 + 4.8.1 1.0.0.M5 - 2.6.2 - 2.6.2 - 1.2.8 + 2.6.6 + 2.6.6 3.5.1 - 3.5.0 - 5.7.20 - 31.0.1-jre - 1.6.5 + 3.5.1 + 5.1.1 + 5.7.21 + 31.1-jre + 1.6.6 0.11.2 1.0.2 2.2.6 - 5.2.0 - 7.0.1 - 8.2.2 - 2.2.1 + 5.2.2 + 7.1.1 + 8.3.8 + 4.8.1 + 2.3.0 + 1.4.2.Final + 0.2.0 + 0.8.8 @@ -84,7 +91,7 @@ org.springframework.boot spring-boot-starter-parent - 2.6.1 + 2.6.3 @@ -178,6 +185,7 @@ + ${project.artifactId}-${git.commit.id.abbrev}-${project.version} @@ -230,7 +238,8 @@ true - ${project.build.outputDirectory}/git.properties + ${project.build.outputDirectory}/git.properties + ^git.build.(time|version)$ ^git.commit.id.(abbrev|full)$ @@ -238,6 +247,178 @@ full + + + + org.jetbrains.kotlin + kotlin-maven-plugin + + + spring + + + -Xjsr305=strict + + + + + org.jetbrains.kotlin + kotlin-maven-noarg + ${kotlin.version} + + + org.jetbrains.kotlin + kotlin-maven-allopen + ${kotlin.version} + + + + + compile + + compile + + + + ${project.basedir}/src/main/kotlin + ${project.basedir}/src/main/java + + + + + test-compile + + test-compile + + + + ${project.basedir}/src/test/kotlin + ${project.basedir}/src/test/java + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + ${java.version} + ${java.version} + + + + + + + + + + + org.mapstruct + mapstruct-processor + ${mapstruct.version} + + + org.projectlombok + lombok + ${lombok.version} + + + org.projectlombok + lombok-mapstruct-binding + ${lombok-mapstruct-binding.version} + + + + + + + + default-compile + none + + + + default-testCompile + none + + + java-compile + compile + + compile + + + + java-test-compile + test-compile + + testCompile + + + + + + + org.apache.maven.plugins + maven-pmd-plugin + ${maven-pmd-plugin.version} + + ${project.build.sourceEncoding} + ${java.version} + true + + rulesets/java/ali-concurrent.xml + rulesets/java/ali-constant.xml + rulesets/java/ali-exception.xml + rulesets/java/ali-flowcontrol.xml + rulesets/java/ali-naming.xml + rulesets/java/ali-oop.xml + rulesets/java/ali-orm.xml + rulesets/java/ali-other.xml + rulesets/java/ali-set.xml + + + + + verify + + check + + + + + + com.alibaba.p3c + p3c-pmd + ${p3c-pmd.version} + + + + + + org.jacoco + jacoco-maven-plugin + ${jacoco.version} + + + default-prepare-agent + + prepare-agent + + + + default-report + verify + + report + + + + @@ -286,6 +467,20 @@ + + + org.jetbrains.kotlin + kotlin-reflect + + + org.jetbrains.kotlin + kotlin-stdlib-jdk8 + + + com.fasterxml.jackson.module + jackson-module-kotlin + + org.projectlombok @@ -313,7 +508,7 @@ org.functionaljava functionaljava-java8 - ${functionaljava.version} + ${functionaljava-java8.version} org.functionaljava @@ -325,5 +520,32 @@ functionaljava-java-core ${functionaljava.version} + + + org.mapstruct + mapstruct + ${mapstruct.version} + + + + + org.springframework.boot + spring-boot-starter-test + test + + + org.junit.vintage + junit-vintage-engine + + + + + + org.jacoco + org.jacoco.agent + runtime + ${jacoco.version} + test + diff --git a/reactive-spring-cloud-starter/pom.xml b/reactive-spring-cloud-starter/pom.xml index 13f26c07..bdef182b 100644 --- a/reactive-spring-cloud-starter/pom.xml +++ b/reactive-spring-cloud-starter/pom.xml @@ -10,7 +10,7 @@ com.jmsoftware.maf muscle-and-fitness-server - 0.0.8.1 + 0.0.9 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 deleted file mode 100644 index 4ecd1ba8..00000000 --- a/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/MafReactiveAutoConfiguration.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.jmsoftware.maf.reactivespringcloudstarter; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.jmsoftware.maf.reactivespringcloudstarter.configuration.WebClientConfiguration; -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.property.JwtConfigurationProperties; -import com.jmsoftware.maf.reactivespringcloudstarter.property.MafConfigurationProperties; -import com.jmsoftware.maf.reactivespringcloudstarter.property.MafProjectProperties; -import com.jmsoftware.maf.reactivespringcloudstarter.redis.RedisConfiguration; -import com.jmsoftware.maf.reactivespringcloudstarter.service.CommonService; -import com.jmsoftware.maf.reactivespringcloudstarter.service.impl.CommonServiceImpl; -import com.jmsoftware.maf.reactivespringcloudstarter.util.ResponseUtil; -import lombok.extern.slf4j.Slf4j; -import org.springframework.boot.autoconfigure.AutoConfigureOrder; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.ApplicationContext; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Import; -import org.springframework.core.env.Environment; - -import javax.annotation.PostConstruct; - -/** - * Description: MuscleAndFitnessServerReactiveAutoConfiguration, change description here. - * - * @author 钟俊(zhongjun), email: zhongjun@toguide.cn, date: 12/22/2020 2:41 PM - **/ -@Slf4j -@AutoConfigureOrder(Integer.MIN_VALUE) -@EnableConfigurationProperties({ - MafConfigurationProperties.class, - MafProjectProperties.class, - JwtConfigurationProperties.class -}) -@Import({ - RedisConfiguration.class, - WebFluxConfiguration.class, - WebClientConfiguration.class -}) -public class MafReactiveAutoConfiguration { - private static final String TEMPLATE = "Initial bean: '{}'"; - - @PostConstruct - public void postConstruct() { - log.warn("Post construction of [{}] is done. About to inject beans. Auto configure order: {}", - this.getClass().getSimpleName(), Integer.MIN_VALUE); - } - - @Bean - public AccessLogFilter requestFilter(MafConfigurationProperties mafConfigurationProperties) { - log.warn(TEMPLATE, AccessLogFilter.class.getSimpleName()); - return new AccessLogFilter(mafConfigurationProperties); - } - - @Bean - public IpHelper ipHelper(Environment environment) { - log.warn(TEMPLATE, IpHelper.class.getSimpleName()); - return new IpHelper(environment); - } - - @Bean - public SpringBootStartupHelper springBootStartupHelper(MafProjectProperties mafProjectProperties, - IpHelper ipHelper, ApplicationContext applicationContext) { - log.warn(TEMPLATE, SpringBootStartupHelper.class.getSimpleName()); - return new SpringBootStartupHelper(mafProjectProperties, ipHelper, applicationContext); - } - - @Bean - public CommonService commonService(MafProjectProperties mafProjectProperties) { - log.warn(TEMPLATE, CommonServiceImpl.class.getSimpleName()); - return new CommonServiceImpl(mafProjectProperties); - } - - @Bean - public CommonController commonController(CommonService commonService) { - log.warn(TEMPLATE, CommonController.class.getSimpleName()); - return new CommonController(commonService); - } - - @Bean - public ResponseUtil responseUtil(ObjectMapper objectMapper) { - log.warn(TEMPLATE, ResponseUtil.class.getSimpleName()); - return new ResponseUtil(objectMapper); - } -} diff --git a/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/MafReactiveAutoConfiguration.kt b/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/MafReactiveAutoConfiguration.kt new file mode 100644 index 00000000..8e365393 --- /dev/null +++ b/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/MafReactiveAutoConfiguration.kt @@ -0,0 +1,85 @@ +package com.jmsoftware.maf.reactivespringcloudstarter + +import com.fasterxml.jackson.databind.ObjectMapper +import com.jmsoftware.maf.common.util.logger +import com.jmsoftware.maf.reactivespringcloudstarter.configuration.WebClientConfiguration +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.property.JwtConfigurationProperties +import com.jmsoftware.maf.reactivespringcloudstarter.property.MafConfigurationProperties +import com.jmsoftware.maf.reactivespringcloudstarter.property.MafProjectProperties +import com.jmsoftware.maf.reactivespringcloudstarter.redis.RedisConfiguration +import com.jmsoftware.maf.reactivespringcloudstarter.service.CommonService +import com.jmsoftware.maf.reactivespringcloudstarter.service.impl.CommonServiceImpl +import com.jmsoftware.maf.reactivespringcloudstarter.util.ResponseUtil +import org.springframework.boot.autoconfigure.AutoConfigureOrder +import org.springframework.boot.context.properties.EnableConfigurationProperties +import org.springframework.context.ApplicationContext +import org.springframework.context.annotation.Bean +import org.springframework.context.annotation.Import +import org.springframework.core.env.Environment +import javax.annotation.PostConstruct + +/** + * # MafReactiveAutoConfiguration + * + * Description: MafReactiveAutoConfiguration, change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/17/22 8:17 AM + */ +@AutoConfigureOrder(Int.MIN_VALUE) +@EnableConfigurationProperties( + MafConfigurationProperties::class, + MafProjectProperties::class, + JwtConfigurationProperties::class +) +@Import(RedisConfiguration::class, WebFluxConfiguration::class, WebClientConfiguration::class) +class MafReactiveAutoConfiguration { + companion object { + private val log = logger() + } + + @PostConstruct + fun postConstruct() { + log.warn("Post construction of [${this.javaClass.simpleName}] is done. About to inject beans. Auto configure order: ${Int.MIN_VALUE}") + } + + @Bean + fun requestFilter(mafConfigurationProperties: MafConfigurationProperties): AccessLogFilter = + AccessLogFilter(mafConfigurationProperties).also { + log.warn("Initial bean: `${AccessLogFilter::class.java.simpleName}`") + } + + @Bean + fun ipHelper(environment: Environment): IpHelper = IpHelper(environment).also { + log.warn("Initial bean: `${IpHelper::class.java.simpleName}`") + } + + @Bean + fun springBootStartupHelper( + mafProjectProperties: MafProjectProperties, + ipHelper: IpHelper, + applicationContext: ApplicationContext + ): SpringBootStartupHelper = SpringBootStartupHelper(mafProjectProperties, ipHelper, applicationContext).also { + log.warn("Initial bean: `${SpringBootStartupHelper::class.java.simpleName}`") + } + + @Bean + fun commonService(mafProjectProperties: MafProjectProperties): CommonService = + CommonServiceImpl(mafProjectProperties).also { + log.warn("Initial bean: `${CommonService::class.java.simpleName}`") + } + + @Bean + fun commonController(commonService: CommonService): CommonController = CommonController(commonService).also { + log.warn("Initial bean: `${CommonController::class.java.simpleName}`") + } + + @Bean + fun responseUtil(objectMapper: ObjectMapper): ResponseUtil = ResponseUtil(objectMapper).also { + log.warn("Initial bean: `${ResponseUtil::class.java.simpleName}`") + } +} diff --git a/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/configuration/WebClientConfiguration.java b/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/configuration/WebClientConfiguration.java deleted file mode 100644 index 15bd3218..00000000 --- a/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/configuration/WebClientConfiguration.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.jmsoftware.maf.reactivespringcloudstarter.configuration; - -import io.netty.channel.ChannelOption; -import io.netty.handler.timeout.ReadTimeoutHandler; -import io.netty.handler.timeout.WriteTimeoutHandler; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.cloud.client.loadbalancer.LoadBalanced; -import org.springframework.context.annotation.Bean; -import org.springframework.http.client.reactive.ReactorClientHttpConnector; -import org.springframework.http.client.reactive.ReactorResourceFactory; -import org.springframework.web.reactive.function.client.WebClient; -import reactor.netty.resources.ConnectionProvider; -import reactor.netty.resources.LoopResources; - -/** - * Description: WebClientConfiguration, change description here. - * - * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 9/14/2021 3:38 PM - **/ -@Slf4j -@RequiredArgsConstructor -public class WebClientConfiguration { - /** - * Load balanced web client builder. - * - * @return the web client builder - * @see - * Spring Tips: Spring Cloud Loadbalancer - * @see - * Reactive Microservices with Spring WebFlux and Spring Cloud - */ - @Bean - @LoadBalanced - public WebClient.Builder loadBalancedWebClientBuilder() { - log.warn("Initial bean: '{}'", WebClient.Builder.class.getSimpleName()); - return WebClient.builder(); - } - - @Bean - public ReactorResourceFactory reactorResourceFactory() { - ReactorResourceFactory factory = new ReactorResourceFactory(); - factory.setUseGlobalResources(false); - factory.setConnectionProvider(ConnectionProvider.create("web-client-connection-provider")); - factory.setLoopResources(LoopResources.create("web-client-loop")); - return factory; - } - - /** - * Configure web client. - * - * @param reactorResourceFactory the reactor resource factory - * @return the web client - * @see - * Spring WebFlux WebClient as a Load Balancer Client - */ - @Bean - public WebClient webClient(WebClient.Builder loadBalancedWebClientBuilder, - ReactorResourceFactory reactorResourceFactory) { - return loadBalancedWebClientBuilder - .clientConnector(new ReactorClientHttpConnector(reactorResourceFactory, client -> client - .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10) - .option(ChannelOption.TCP_NODELAY, true) - .doOnConnected(doOnConnected -> { - doOnConnected.addHandlerLast(new ReadTimeoutHandler(10)); - doOnConnected.addHandlerLast(new WriteTimeoutHandler(10)); - }))) - .build(); - } -} diff --git a/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/configuration/WebClientConfiguration.kt b/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/configuration/WebClientConfiguration.kt new file mode 100644 index 00000000..301f323a --- /dev/null +++ b/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/configuration/WebClientConfiguration.kt @@ -0,0 +1,82 @@ +package com.jmsoftware.maf.reactivespringcloudstarter.configuration + +import com.jmsoftware.maf.common.util.logger +import io.netty.channel.ChannelOption +import io.netty.handler.timeout.ReadTimeoutHandler +import io.netty.handler.timeout.WriteTimeoutHandler +import lombok.RequiredArgsConstructor +import lombok.extern.slf4j.Slf4j +import org.springframework.cloud.client.loadbalancer.LoadBalanced +import org.springframework.context.annotation.Bean +import org.springframework.http.client.reactive.ReactorClientHttpConnector +import org.springframework.http.client.reactive.ReactorResourceFactory +import org.springframework.web.reactive.function.client.WebClient +import reactor.netty.Connection +import reactor.netty.http.client.HttpClient +import reactor.netty.resources.ConnectionProvider +import reactor.netty.resources.LoopResources + +/** + * # WebClientConfiguration + * + * Description: WebClientConfiguration, change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/17/22 7:54 AM + */ +@Slf4j +@RequiredArgsConstructor +class WebClientConfiguration { + companion object { + private val log = logger() + } + + /** + * Load balanced web client builder. + * + * @return the web client builder + * @see + * Spring Tips: Spring Cloud Loadbalancer + * @see + * Reactive Microservices with Spring WebFlux and Spring Cloud + */ + @Bean + @LoadBalanced + fun loadBalancedWebClientBuilder(): WebClient.Builder { + log.warn("Initial bean: `${WebClient.Builder::class.java.simpleName}`") + return WebClient.builder() + } + + @Bean + fun reactorResourceFactory(): ReactorResourceFactory { + return ReactorResourceFactory().also { + it.isUseGlobalResources = false + it.connectionProvider = ConnectionProvider.create("web-client-connection-provider") + it.loopResources = LoopResources.create("web-client-loop") + } + } + + /** + * Configure web client. + * + * @param reactorResourceFactory the reactor resource factory + * @return the web client + * @see + * Spring WebFlux WebClient as a Load Balancer Client + */ + @Bean + fun webClient( + loadBalancedWebClientBuilder: WebClient.Builder, + reactorResourceFactory: ReactorResourceFactory + ): WebClient { + return loadBalancedWebClientBuilder + .clientConnector(ReactorClientHttpConnector(reactorResourceFactory) { client: HttpClient -> + client + .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10) + .option(ChannelOption.TCP_NODELAY, true) + .doOnConnected { doOnConnected: Connection -> + doOnConnected.addHandlerLast(ReadTimeoutHandler(10)) + doOnConnected.addHandlerLast(WriteTimeoutHandler(10)) + } + }).build() + } +} diff --git a/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/configuration/WebFluxConfiguration.java b/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/configuration/WebFluxConfiguration.kt similarity index 77% rename from reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/configuration/WebFluxConfiguration.java rename to reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/configuration/WebFluxConfiguration.kt index f1e85724..d24ae66a 100644 --- a/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/configuration/WebFluxConfiguration.java +++ b/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/configuration/WebFluxConfiguration.kt @@ -1,14 +1,14 @@ -package com.jmsoftware.maf.reactivespringcloudstarter.configuration; +package com.jmsoftware.maf.reactivespringcloudstarter.configuration -import org.springframework.web.reactive.config.WebFluxConfigurer; +import org.springframework.web.reactive.config.WebFluxConfigurer /** *

WebFluxConfiguration

- *

+ * + * * Change description here. * * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com * @date 2/17/20 5:16 PM - **/ -public class WebFluxConfiguration implements WebFluxConfigurer { -} + */ +class WebFluxConfiguration : WebFluxConfigurer diff --git a/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/controller/CommonController.java b/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/controller/CommonController.java deleted file mode 100644 index 6907fa25..00000000 --- a/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/controller/CommonController.java +++ /dev/null @@ -1,36 +0,0 @@ -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.reactivespringcloudstarter.service.CommonService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.web.bind.annotation.*; - -/** - *

CommonController

- *

- * Change description here. - * - * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com - * @date 2/4/20 10:29 AM - **/ -@Slf4j -@RestController -@RequiredArgsConstructor -@RequestMapping("/common") -public class CommonController { - private final CommonService commonService; - - @GetMapping("/app-info") - public ResponseBodyBean applicationInformation() { - return ResponseBodyBean.ofSuccess(this.commonService.getApplicationInfo(), "Succeed to retrieve app info."); - } - - @PostMapping("/validation-test") - public ResponseBodyBean validationTest(@RequestBody ValidationTestPayload payload) { - this.commonService.validateObject(payload); - return ResponseBodyBean.ofSuccess(payload.getName(), "validationTest()"); - } -} diff --git a/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/controller/CommonController.kt b/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/controller/CommonController.kt new file mode 100644 index 00000000..4271f62d --- /dev/null +++ b/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/controller/CommonController.kt @@ -0,0 +1,31 @@ +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.reactivespringcloudstarter.service.CommonService +import org.springframework.web.bind.annotation.* + +/** + * # CommonController + * + * Change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/16/22 11:37 AM + */ +@RestController +@RequestMapping("/common") +class CommonController( + private val commonService: CommonService +) { + @GetMapping("/app-info") + fun applicationInformation(): ResponseBodyBean { + return ResponseBodyBean.ofSuccess(commonService.getApplicationInfo(), "Succeed to retrieve app info.") + } + + @PostMapping("/validation-test") + fun validationTest(@RequestBody payload: ValidationTestPayload): ResponseBodyBean { + commonService.validateObject(payload) + return ResponseBodyBean.ofSuccess(payload.name, "validationTest()") + } +} 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 deleted file mode 100644 index 1cb3b630..00000000 --- a/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/filter/AccessLogFilter.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.jmsoftware.maf.reactivespringcloudstarter.filter; - -import com.jmsoftware.maf.reactivespringcloudstarter.property.MafConfigurationProperties; -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.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 -@RequiredArgsConstructor -public class AccessLogFilter implements WebFilter, Ordered { - private final MafConfigurationProperties mafConfigurationProperties; - private final AntPathMatcher antPathMatcher = new AntPathMatcher(); - - @Override - @SuppressWarnings("NullableProblems") - public Mono filter(ServerWebExchange exchange, WebFilterChain chain) { - ServerHttpRequest request = exchange.getRequest(); - for (String ignoredUrl : this.mafConfigurationProperties.flattenIgnoredUrls()) { - if (this.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/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/filter/AccessLogFilter.kt b/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/filter/AccessLogFilter.kt new file mode 100644 index 00000000..070d485e --- /dev/null +++ b/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/filter/AccessLogFilter.kt @@ -0,0 +1,48 @@ +package com.jmsoftware.maf.reactivespringcloudstarter.filter + +import com.jmsoftware.maf.common.util.logger +import com.jmsoftware.maf.reactivespringcloudstarter.property.MafConfigurationProperties +import com.jmsoftware.maf.reactivespringcloudstarter.util.getRequesterIpAndPort +import org.springframework.core.Ordered +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 (锺俊), e-mail: johnnysviva@outlook.com, date: 4/17/22 8:01 AM + */ +class AccessLogFilter( + private val mafConfigurationProperties: MafConfigurationProperties, +) : WebFilter, Ordered { + companion object { + private val log = logger() + } + + private val antPathMatcher = AntPathMatcher() + + override fun filter(exchange: ServerWebExchange, chain: WebFilterChain): Mono { + val request = exchange.request + for (ignoredUrl in mafConfigurationProperties.flattenIgnoredUrls()) { + if (antPathMatcher.match(ignoredUrl, request.uri.path)) { + return chain.filter(exchange) + } + } + // Only record non-ignored request log + log.info("${this.javaClass.simpleName} (pre). Requester: ${getRequesterIpAndPort(request)}, request URL: [${request.method}] ${request.uri}") + return chain.filter(exchange).then( + Mono.fromRunnable { + log.info("${this.javaClass.simpleName} (post). Requester: ${getRequesterIpAndPort(request)}, request URL: [${request.method}] ${request.uri}") + } + ) + } + + override fun getOrder(): Int { + return -500 + } +} diff --git a/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/function/BooleanCheck.kt b/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/function/BooleanCheck.kt new file mode 100644 index 00000000..6a419ddb --- /dev/null +++ b/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/function/BooleanCheck.kt @@ -0,0 +1,39 @@ +package com.jmsoftware.maf.reactivespringcloudstarter.function + +import cn.hutool.core.util.BooleanUtil +import java.util.function.Consumer +import java.util.function.Supplier + +/** + * Require true or else throw exception. + * + * @param aBoolean the aBoolean + * @param after the after + * @return the throw exception function + * @see com.jmsoftware.maf.springcloudstarter.FunctionalInterfaceTests.testRequireTrue + */ +fun requireTrue(aBoolean: Boolean, after: Consumer?): OrElseThrowExceptionFunction { + after?.accept(aBoolean) + return OrElseThrowExceptionFunction { exceptionSupplier: Supplier -> + if (BooleanUtil.isFalse(aBoolean)) { + throw exceptionSupplier.get() + } + } +} + +/** + * Require all true or else throw exception function. + * + * @param booleans the booleans + * @return the or else throw exception function + * @see com.jmsoftware.maf.springcloudstarter.FunctionalInterfaceTests.testRequireTrue + */ +fun requireAllTrue(vararg booleans: Boolean): OrElseThrowExceptionFunction { + return OrElseThrowExceptionFunction { exceptionSupplier: Supplier -> + for (aBoolean in booleans) { + if (BooleanUtil.isFalse(aBoolean)) { + throw exceptionSupplier.get() + } + } + } +} diff --git a/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/function/FunctionalInterface.kt b/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/function/FunctionalInterface.kt new file mode 100644 index 00000000..f1ef1179 --- /dev/null +++ b/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/function/FunctionalInterface.kt @@ -0,0 +1,90 @@ +package com.jmsoftware.maf.reactivespringcloudstarter.function + +import java.util.function.Supplier + +/** + * # OrElseThrowExceptionFunction + * + * Description: OrElseThrowExceptionFunction, change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/14/22 12:32 PM + */ +fun interface OrElseThrowExceptionFunction { + /** + * Or else throw. + * + * @param exceptionSupplier the exception supplier + * @throws Throwable the throwable + */ + fun orElseThrow(exceptionSupplier: Supplier) +} + +/** + * # ThrowExceptionBiFunction + * + * Change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/14/22 12:35 PM + */ +fun interface ThrowExceptionBiFunction { + /** + * Apply r. + * + * @param t the t + * @param u the u + * @return the r + * @throws Exception the exception + */ + fun apply(t: T, u: U): R +} + +/** + * # ThrowExceptionFunction + * + * Change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/14/22 12:35 PM + */ +fun interface ThrowExceptionFunction { + /** + * Apply r. + * + * @param t the t + * @return the r + * @throws Exception the exception + */ + fun apply(t: T): R +} + +/** + * # ThrowExceptionRunnable + * + * Change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/14/22 12:36 PM + */ +fun interface ThrowExceptionRunnable { + /** + * Run. + * + * @throws Exception the exception + */ + fun run() +} + +/** + * # ThrowExceptionSupplier + * + * Change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/14/22 12:36 PM + */ +fun interface ThrowExceptionSupplier { + /** + * Get t. + * + * @return the t + * @throws Exception the exception + */ + fun get(): T +} diff --git a/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/helper/IpHelper.java b/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/helper/IpHelper.java deleted file mode 100644 index a25ff99f..00000000 --- a/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/helper/IpHelper.java +++ /dev/null @@ -1,93 +0,0 @@ -package com.jmsoftware.maf.reactivespringcloudstarter.helper; - -import cn.hutool.core.util.StrUtil; -import cn.hutool.http.HttpUtil; -import com.jmsoftware.maf.reactivespringcloudstarter.property.MafProjectProperties; -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 java.io.BufferedReader; -import java.io.InputStreamReader; -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 -@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: {}", DEVELOPMENT_ENVIRONMENT); - return this.getInternetIp(); - } - // An API provided by https://whatismyipaddress.com/api - try { - return HttpUtil.get("https://ipv4bot.whatismyipaddress.com/").trim(); - } catch (Exception e) { - log.warn("Failed to get public IP address, fallback to intranet IP address. Exception: {}", e.getMessage()); - return this.getInternetIp(); - } - } - - /** - * 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/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/helper/IpHelper.kt b/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/helper/IpHelper.kt new file mode 100644 index 00000000..a8cdaf3f --- /dev/null +++ b/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/helper/IpHelper.kt @@ -0,0 +1,89 @@ +package com.jmsoftware.maf.reactivespringcloudstarter.helper + +import cn.hutool.core.util.StrUtil +import cn.hutool.http.HttpUtil +import com.jmsoftware.maf.common.util.logger +import org.springframework.boot.web.context.WebServerInitializedEvent +import org.springframework.context.ApplicationListener +import org.springframework.core.env.Environment +import java.net.Inet4Address +import java.net.InetAddress +import java.net.NetworkInterface +import java.util.* + +/** + * # IpHelper + * + * Change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/17/22 8:05 AM + */ +class IpHelper( + private val environment: Environment +) : ApplicationListener { + companion object { + private const val DEVELOPMENT_ENVIRONMENT = "development" + private val log = logger() + } + + var serverPort = 0 + + override fun onApplicationEvent(event: WebServerInitializedEvent) { + serverPort = event.webServer.port + } + + /** + * Find public IP address. + * + * @return public IP + */ + fun getPublicIp(): String { + val jointProfiles = java.lang.String.join(",", *environment.activeProfiles) + if (StrUtil.containsIgnoreCase(jointProfiles, DEVELOPMENT_ENVIRONMENT)) { + log.debug("Current active profiles for environment contains: {}", DEVELOPMENT_ENVIRONMENT) + return internetIp() + } + // An API provided by https://whatismyipaddress.com/api + return try { + HttpUtil.get("https://ipv4bot.whatismyipaddress.com/").trim { it <= ' ' } + } catch (e: Exception) { + log.warn( + "Failed to get public IP address, fallback to intranet IP address. Exception: {}", + e.message + ) + internetIp() + } + } + + /** + * Get internet IP. + * + * @return internet IP + */ + private fun internetIp(): String { + val intranetIp = intranetIp() + val networks = NetworkInterface.getNetworkInterfaces() + var ip: InetAddress + var addresses: Enumeration + while (networks.hasMoreElements()) { + addresses = networks.nextElement().inetAddresses + while (addresses.hasMoreElements()) { + ip = addresses.nextElement() + if (ip is Inet4Address + && ip.isSiteLocalAddress() + && ip.getHostAddress() != intranetIp + ) { + return ip.getHostAddress() + } + } + } + return intranetIp + } + + /** + * Get intranet IP. + * + * @return intranet IP + */ + private fun intranetIp(): String = InetAddress.getLocalHost().hostAddress +} 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 deleted file mode 100644 index 472c3aa0..00000000 --- a/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/helper/SpringBootStartupHelper.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.jmsoftware.maf.reactivespringcloudstarter.helper; - -import cn.hutool.core.lang.Console; -import com.jmsoftware.maf.reactivespringcloudstarter.property.MafProjectProperties; -import lombok.NonNull; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import lombok.val; -import org.springframework.beans.factory.DisposableBean; -import org.springframework.beans.factory.support.DefaultListableBeanFactory; -import org.springframework.context.ApplicationContext; -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 -@RequiredArgsConstructor -public class SpringBootStartupHelper implements DisposableBean { - private static final String LINE_SEPARATOR = System.lineSeparator(); - @SuppressWarnings("HttpUrlsUsage") - private static final String TEMPLATE = LINE_SEPARATOR + - "🥳 Congratulations! 🎉" + LINE_SEPARATOR + - "🖥 {}@{} started! " + LINE_SEPARATOR + - "⚙️ Environment: {}" + LINE_SEPARATOR + - "⏳ Deployment duration: {} seconds ({} ms)" + LINE_SEPARATOR + - "⏰ App started at {} (timezone - {})" + LINE_SEPARATOR + - " App running at" + LINE_SEPARATOR + - " - Local: http://localhost:{}{}/" + LINE_SEPARATOR + - " - Network: http://{}:{}{}/"; - private final MafProjectProperties mafProjectProperties; - private final IpHelper ipHelper; - private final ApplicationContext applicationContext; - - public void stop(@NonNull StopWatch stopWatch) { - stopWatch.stop(); - log.info( - TEMPLATE, - this.mafProjectProperties.getProjectArtifactId(), this.mafProjectProperties.getVersion(), - this.mafProjectProperties.getEnvironment(), - stopWatch.getTotalTimeSeconds(), stopWatch.getTotalTimeMillis(), - Instant.now().atZone(ZoneId.systemDefault()), ZoneId.systemDefault(), - this.ipHelper.getServerPort(), this.mafProjectProperties.getContextPath(), - this.ipHelper.getPublicIp(), this.ipHelper.getServerPort(), this.mafProjectProperties.getContextPath() - ); - this.applicationContext.getAutowireCapableBeanFactory().destroyBean(this); - } - - @Override - public void destroy() { - log.warn("Destroyed bean: {}", this.getClass().getSimpleName()); - } -} diff --git a/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/helper/SpringBootStartupHelper.kt b/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/helper/SpringBootStartupHelper.kt new file mode 100644 index 00000000..84d01aed --- /dev/null +++ b/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/helper/SpringBootStartupHelper.kt @@ -0,0 +1,58 @@ +package com.jmsoftware.maf.reactivespringcloudstarter.helper + +import com.jmsoftware.maf.common.util.logger +import com.jmsoftware.maf.reactivespringcloudstarter.property.MafProjectProperties +import org.springframework.beans.factory.DisposableBean +import org.springframework.boot.system.JavaVersion +import org.springframework.context.ApplicationContext +import org.springframework.util.StopWatch +import java.time.Instant +import java.time.ZoneId + +/** + * # SpringBootStartupHelper + * + * Description: SpringBootStartupHelper, change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/12/22 10:04 PM + */ +class SpringBootStartupHelper( + private val mafProjectProperties: MafProjectProperties, + private val ipHelper: IpHelper, + private val applicationContext: ApplicationContext +) : DisposableBean { + companion object { + @Suppress("HttpUrlsUsage") + private val TEMPLATE: String = + """ + + ☕ ️️Powered by Kotlin :: v${KotlinVersion.CURRENT}, Java :: v${JavaVersion.getJavaVersion()} + 🥳 Congratulations! 🎉 + 🖥 {}@{} started! + ⚙️ Environment: {} + ⏳ Deployment duration: {} seconds ({} ms) + ⏰ App started at {} (timezone - {}) + App running at + - Local: http://localhost:{}{}/ + - Network: http://{}:{}{}/ + """.trimIndent() + private val log = logger() + } + fun stop(stopWatch: StopWatch) { + stopWatch.stop() + log.info( + TEMPLATE, + mafProjectProperties.projectArtifactId, mafProjectProperties.version, + mafProjectProperties.environment, + stopWatch.totalTimeSeconds, stopWatch.totalTimeMillis, + Instant.now().atZone(ZoneId.systemDefault()), ZoneId.systemDefault(), + ipHelper.serverPort, mafProjectProperties.contextPath, + ipHelper.getPublicIp(), ipHelper.serverPort, mafProjectProperties.contextPath + ) + applicationContext.autowireCapableBeanFactory.destroyBean(this) + } + + override fun destroy() { + log.warn("Destroyed bean: ${this.javaClass.simpleName}") + } +} diff --git a/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/property/JwtConfigurationProperties.java b/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/property/JwtConfigurationProperties.java deleted file mode 100644 index 9047d665..00000000 --- a/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/property/JwtConfigurationProperties.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.jmsoftware.maf.reactivespringcloudstarter.property; - -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; - -/** - *

JwtConfigurationProperties

- *

- * Ignored request configuration. - * - * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com - * @date 5/2/20 11:41 PM - **/ -@Data -@Slf4j -@Validated -@ConfigurationProperties(prefix = JwtConfigurationProperties.PREFIX) -public class JwtConfigurationProperties { - /** - * 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; - /** - * 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; - - public JwtConfigurationProperties(MafProjectProperties mafProjectProperties) { - this.signingKey = String.format("%s:%s", mafProjectProperties.getGroupId(), - mafProjectProperties.getProjectParentArtifactId()); - log.info("Initiated JWT signing key: {}. The specified key byte array is {} bits", this.signingKey, - this.signingKey.getBytes(StandardCharsets.UTF_8).length * 8); - this.jwtRedisKeyPrefix = String.format("%s:jwt:", mafProjectProperties.getProjectParentArtifactId()); - log.warn("Initiated 'jwtRedisKeyPrefix': {}", this.jwtRedisKeyPrefix); - } -} diff --git a/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/property/JwtConfigurationProperties.kt b/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/property/JwtConfigurationProperties.kt new file mode 100644 index 00000000..caf370aa --- /dev/null +++ b/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/property/JwtConfigurationProperties.kt @@ -0,0 +1,61 @@ +package com.jmsoftware.maf.reactivespringcloudstarter.property + +import com.jmsoftware.maf.common.util.logger +import org.springframework.boot.context.properties.ConfigurationProperties +import org.springframework.context.annotation.Configuration +import org.springframework.validation.annotation.Validated +import java.nio.charset.StandardCharsets +import javax.validation.constraints.NotNull + +/** + * # JwtConfigurationProperties + * + * Ignored request configuration. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/14/22 9:41 PM + */ +@Validated +@Configuration +@ConfigurationProperties(prefix = JwtConfigurationProperties.PREFIX) +class JwtConfigurationProperties(mafProjectProperties: MafProjectProperties) { + companion object { + /** + * The constant PREFIX. + */ + const val PREFIX = "maf.configuration.jwt" + const val TOKEN_PREFIX = "Bearer " + private val log = logger() + } + + /** + * Key prefix of JWT stored in Redis. + */ + final val jwtRedisKeyPrefix: String + + /** + * JWT signing key. Pattern: [groupId]:[projectParentArtifactId]@[version] + */ + final val signingKey: String + + /** + * Time to live of JWT. Default: 3 * 600000 milliseconds (1800000 ms, 30 min). + */ + var ttl: @NotNull Long = 3 * 600000L + + /** + * Time to live of JWT for remember me, Default: 7 * 86400000 milliseconds (604800000 ms, 7 day) + */ + var ttlForRememberMe: @NotNull Long = 7 * 86400000L + + init { + signingKey = + "${mafProjectProperties.groupId}:${mafProjectProperties.projectParentArtifactId}@${mafProjectProperties.version}" + log.info( + "Initiated JWT signing key: $signingKey. The specified key byte array is ${ + signingKey.toByteArray(StandardCharsets.UTF_8).size * 8 + } bits" + ) + jwtRedisKeyPrefix = "${mafProjectProperties.projectParentArtifactId}:jwt:" + log.warn("Initiated `jwtRedisKeyPrefix`: $jwtRedisKeyPrefix") + } +} diff --git a/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/property/MafConfigurationProperties.java b/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/property/MafConfigurationProperties.java deleted file mode 100644 index 58d1ced1..00000000 --- a/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/property/MafConfigurationProperties.java +++ /dev/null @@ -1,142 +0,0 @@ -package com.jmsoftware.maf.reactivespringcloudstarter.property; - -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; - -/** - *

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 -@ConfigurationProperties(prefix = MafConfigurationProperties.PREFIX) -public class MafConfigurationProperties { - public static final String PREFIX = "maf.configuration"; - /** - *

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/property/MafConfigurationProperties.kt b/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/property/MafConfigurationProperties.kt new file mode 100644 index 00000000..c8c5169e --- /dev/null +++ b/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/property/MafConfigurationProperties.kt @@ -0,0 +1,167 @@ +package com.jmsoftware.maf.reactivespringcloudstarter.property + +import com.jmsoftware.maf.common.util.logger +import com.jmsoftware.maf.reactivespringcloudstarter.property.MafConfigurationProperties.IgnoredUrl.Constant.Companion.URL_REGEXP +import org.springframework.boot.context.properties.ConfigurationProperties +import org.springframework.context.annotation.Configuration +import org.springframework.validation.annotation.Validated +import javax.annotation.PostConstruct +import javax.validation.Valid +import javax.validation.constraints.NotBlank +import javax.validation.constraints.Pattern + +/** + * # MafConfigurationProperties + * + * 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 (锺俊), e-mail: johnnysviva@outlook.com, date: 4/13/22 2:07 PM + **/ +@Validated +@Configuration +@Suppress("unused") +@ConfigurationProperties(prefix = MafConfigurationProperties.PREFIX) +class MafConfigurationProperties { + companion object { + const val PREFIX = "maf.configuration" + private val log = logger() + } + + /** + * The role name of superuser (admin) who has no restriction to access any system's resources. + * + * **ATTENTION**: The value of role name of superuser must be equal to the value that is persistent in database. + **/ + @NotBlank + var superUserRole: String = "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 + var guestUserRole: String = "guest" + + /** + * Ignore URLs, used by web access log filter and web security. + **/ + @Valid + var ignoredUrl: IgnoredUrl? = null + + /** + * Web security feature switch. Default is true. + * true - disable web security; false - enable web security. + **/ + var webSecurityEnabled: Boolean = true + + /** + * Web request log switch. Default is true. + * + * true - disable web request log; false - enable web request log. + **/ + var webRequestLogEnabled: Boolean = true + + /** + * Included package for http api scan, could be base package + **/ + @NotBlank + var includedPackageForHttpApiScan: String = "" + + @PostConstruct + private fun postConstruct() { + log.warn("Initial bean: `${this.javaClass.simpleName}`") + } + + /** + * Flatten ignored urls string [ ]. + * + * @return the string [ ] + **/ + fun flattenIgnoredUrls(): List { + return mutableListOf().let { + it.addAll(ignoredUrl?.get!!) + it.addAll(ignoredUrl?.post!!) + it.addAll(ignoredUrl?.delete!!) + it.addAll(ignoredUrl?.put!!) + it.addAll(ignoredUrl?.head!!) + it.addAll(ignoredUrl?.patch!!) + it.addAll(ignoredUrl?.options!!) + it.addAll(ignoredUrl?.trace!!) + it.addAll(ignoredUrl?.pattern!!) + it + } + } + + /** + *

IgnoredUrl

+ * + * + * Ignored URL configuration. + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 2/9/2021 9:39 AM + **/ + class IgnoredUrl { + private interface Constant { + companion object { + const val URL_REGEXP = "^(/.+)+$" + } + } + + /** + * Ignored URL pattern. + **/ + @Valid + val pattern: MutableList<@Pattern(regexp = URL_REGEXP) String> = mutableListOf() + + /** + * Ignored GET request. + **/ + @Valid + val get: MutableList<@Pattern(regexp = URL_REGEXP) String> = mutableListOf() + + /** + * Ignored POST request. + **/ + @Valid + val post: MutableList<@Pattern(regexp = URL_REGEXP) String> = mutableListOf() + + /** + * Ignored DELETE request. + **/ + @Valid + val delete: MutableList<@Pattern(regexp = URL_REGEXP) String> = mutableListOf() + + /** + * Ignored PUT request. + **/ + @Valid + val put: MutableList<@Pattern(regexp = URL_REGEXP) String> = mutableListOf() + + /** + * Ignored HEAD request. + **/ + @Valid + val head: MutableList<@Pattern(regexp = URL_REGEXP) String> = mutableListOf() + + /** + * Ignored PATCH request. + **/ + @Valid + val patch: MutableList<@Pattern(regexp = URL_REGEXP) String> = mutableListOf() + + /** + * Ignored OPTIONS request. + **/ + @Valid + val options: MutableList<@Pattern(regexp = URL_REGEXP) String> = mutableListOf() + + /** + * Ignored TRACE request. + **/ + @Valid + val trace: MutableList<@Pattern(regexp = URL_REGEXP) String> = mutableListOf() + } +} diff --git a/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/property/MafProjectProperties.java b/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/property/MafProjectProperties.java deleted file mode 100644 index 4b757308..00000000 --- a/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/property/MafProjectProperties.java +++ /dev/null @@ -1,101 +0,0 @@ -package com.jmsoftware.maf.reactivespringcloudstarter.property; - -import lombok.Data; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.validation.annotation.Validated; - -import javax.validation.constraints.NotBlank; - -/** - *

MafProjectProperties

- *

- * 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 -@ConfigurationProperties(prefix = MafProjectProperties.PREFIX) -public class MafProjectProperties { - public static final String PREFIX = "maf.project-properties"; - /** - * 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/property/MafProjectProperties.kt b/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/property/MafProjectProperties.kt new file mode 100644 index 00000000..b93b6d72 --- /dev/null +++ b/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/property/MafProjectProperties.kt @@ -0,0 +1,124 @@ +package com.jmsoftware.maf.reactivespringcloudstarter.property + +import com.jmsoftware.maf.common.util.logger +import org.springframework.boot.context.properties.ConfigurationProperties +import org.springframework.boot.info.BuildProperties +import org.springframework.context.annotation.Configuration +import org.springframework.validation.annotation.Validated +import javax.annotation.PostConstruct +import javax.validation.constraints.NotBlank + +/** + * # MafProjectProperties + * + * M&F project property, containing the basic constants of the project. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/13/22 2:54 PM + */ +@Validated +@Configuration +@Suppress("unused") +@ConfigurationProperties(prefix = MafProjectProperties.PREFIX) +class MafProjectProperties { + companion object { + const val PREFIX = "maf.project-properties" + private val log = logger() + } + + lateinit var buildProperties: BuildProperties + + /** + * The Base package. + */ + lateinit var basePackage: @NotBlank String + + /** + * The Context path. + */ + lateinit var contextPath: String + + /** + * The Group id. + */ + lateinit var groupId: @NotBlank String + + /** + * The Project parent artifact id. + */ + lateinit var projectParentArtifactId: @NotBlank String + + /** + * The Project artifact id. + */ + lateinit var projectArtifactId: @NotBlank String + + /** + * The Version. + */ + lateinit var version: @NotBlank String + + /** + * The Description. + */ + lateinit var description: @NotBlank String + + /** + * The Jdk version. + */ + lateinit var jdkVersion: @NotBlank String + + /** + * The Environment. + */ + lateinit var environment: @NotBlank String + + /** + * The Url. + */ + lateinit var url: String + + /** + * The Inception year. + */ + lateinit var inceptionYear: String + + /** + * The Organization name. + */ + lateinit var organizationName: String + + /** + * The Organization url. + */ + lateinit var organizationUrl: String + + /** + * The Issue management system. + */ + lateinit var issueManagementSystem: String + + /** + * The Issue management url. + */ + lateinit var issueManagementUrl: String + + /** + * The Developer name. + */ + lateinit var developerName: String + + /** + * The Developer email. + */ + lateinit var developerEmail: String + + /** + * The Developer url. + */ + lateinit var developerUrl: String + + @PostConstruct + fun postConstruct() { + log.warn("Initial bean: '{}'", this.javaClass.simpleName) + } +} diff --git a/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/redis/RedisCachingConfiguration.java b/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/redis/RedisCachingConfiguration.java deleted file mode 100644 index a4e9d2e5..00000000 --- a/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/redis/RedisCachingConfiguration.java +++ /dev/null @@ -1,83 +0,0 @@ -package com.jmsoftware.maf.reactivespringcloudstarter.redis; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import lombok.val; -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -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.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 -@EnableCaching -@RequiredArgsConstructor -@ConditionalOnClass({RedisConnectionFactory.class}) -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/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/redis/RedisCachingConfiguration.kt b/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/redis/RedisCachingConfiguration.kt new file mode 100644 index 00000000..444f77b3 --- /dev/null +++ b/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/redis/RedisCachingConfiguration.kt @@ -0,0 +1,74 @@ +package com.jmsoftware.maf.reactivespringcloudstarter.redis + +import com.jmsoftware.maf.common.util.logger +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass +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.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 java.lang.reflect.Method + +/** + * # RedisCachingConfiguration + * + * Description: RedisCachingConfiguration, change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/15/22 9:08 PM + * @see Spring boot 之 spring-boot-starter-cache (整合 Redis) + */ +@EnableCaching +@ConditionalOnClass(RedisConnectionFactory::class) +class RedisCachingConfiguration( + private val redisConnectionFactory: RedisConnectionFactory +) : CachingConfigurerSupport() { + companion object { + private val log = logger() + } + + override fun cacheManager(): CacheManager { + return RedisCacheManager + .builder(redisConnectionFactory) + .cacheDefaults( + RedisCacheConfiguration.defaultCacheConfig() + .disableCachingNullValues() + .serializeValuesWith( + RedisSerializationContext.SerializationPair.fromSerializer( + GenericJackson2JsonRedisSerializer() + ) + ) + ) + .build().apply { + log.warn("Initial bean: `${CacheManager::class.java.simpleName}`") + } + } + + override fun cacheResolver(): CacheResolver { + return SimpleCacheResolver(cacheManager()).apply { + log.warn("Initial bean: `${SimpleCacheResolver::class.java.simpleName}`") + } + } + + override fun keyGenerator(): KeyGenerator { + return KeyGenerator { target: Any, method: Method, params: Array -> + val stringBuilder = StringBuilder() + stringBuilder.append(target.javaClass.name).append("#").append(method.name) + for (param in params) { + stringBuilder.append(":").append(param.toString()) + } + stringBuilder.toString() + }.apply { + log.warn("Initial bean: `${KeyGenerator::class.java.simpleName}`") + } + } + + override fun errorHandler(): CacheErrorHandler { + return SimpleCacheErrorHandler().apply { + log.warn("Initial bean: `${CacheErrorHandler::class.java.simpleName}`") + } + } +} diff --git a/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/redis/RedisConfiguration.java b/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/redis/RedisConfiguration.java deleted file mode 100644 index b0eb8d07..00000000 --- a/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/redis/RedisConfiguration.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.jmsoftware.maf.reactivespringcloudstarter.redis; - -import cn.hutool.core.collection.CollUtil; -import io.lettuce.core.ReadFrom; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import lombok.val; -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -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.connection.RedisStaticMasterReplicaConfiguration; -import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration; -import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; -import org.springframework.data.redis.core.ReactiveRedisTemplate; -import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; -import org.springframework.data.redis.serializer.RedisSerializationContext; -import org.springframework.data.redis.serializer.RedisSerializer; - -/** - * Description: RedisConfiguration, change description here. - * - * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 7/31/2021 1:08 PM - **/ -@Slf4j -@RequiredArgsConstructor -@EnableConfigurationProperties({ - RedisMasterSlaveReplicationProperties.class -}) -@Import({ - RedisCachingConfiguration.class -}) -@ConditionalOnClass({RedisConnectionFactory.class}) -public class RedisConfiguration { - private final RedisMasterSlaveReplicationProperties redisMasterSlaveReplicationProperties; - - - /** - * Redis connection factory lettuce connection factory. - * - * @return the lettuce connection factory - * @see - * Spring Data Redis - Write to Master, Read from Replica - */ - @Bean - @ConditionalOnProperty(prefix = "redis.master", name = "host") - public LettuceConnectionFactory redisConnectionFactory() { - if (CollUtil.isEmpty(this.redisMasterSlaveReplicationProperties.getSlaves())) { - throw new IllegalArgumentException( - "Redis Master/Replica configuration is not right! To fix this issue, specify slaves configuration"); - } - val redisStaticMasterReplicaConfiguration = new RedisStaticMasterReplicaConfiguration( - this.redisMasterSlaveReplicationProperties.getMaster().getHost(), - this.redisMasterSlaveReplicationProperties.getMaster().getPort()); - redisStaticMasterReplicaConfiguration.setPassword( - this.redisMasterSlaveReplicationProperties.getMaster().getPassword()); - this.redisMasterSlaveReplicationProperties.getSlaves() - .forEach(slave -> redisStaticMasterReplicaConfiguration.addNode(slave.getHost(), slave.getPort())); - val lettuceClientConfiguration = LettuceClientConfiguration.builder() - .readFrom(ReadFrom.REPLICA_PREFERRED) - .build(); - log.warn("Initial bean: '{}' for Redis Master/Replica configuration", - LettuceConnectionFactory.class.getSimpleName()); - return new LettuceConnectionFactory(redisStaticMasterReplicaConfiguration, lettuceClientConfiguration); - } - - /** - * 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/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/redis/RedisConfiguration.kt b/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/redis/RedisConfiguration.kt new file mode 100644 index 00000000..80b92aa1 --- /dev/null +++ b/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/redis/RedisConfiguration.kt @@ -0,0 +1,95 @@ +package com.jmsoftware.maf.reactivespringcloudstarter.redis + +import cn.hutool.core.collection.CollUtil +import com.jmsoftware.maf.common.util.logger +import com.jmsoftware.maf.reactivespringcloudstarter.function.requireTrue +import io.lettuce.core.ReadFrom +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty +import org.springframework.boot.context.properties.EnableConfigurationProperties +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.connection.RedisStaticMasterReplicaConfiguration +import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration +import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory +import org.springframework.data.redis.core.ReactiveRedisTemplate +import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer +import org.springframework.data.redis.serializer.RedisSerializationContext +import org.springframework.data.redis.serializer.RedisSerializer +import java.util.function.Consumer + +/** + * # RedisConfiguration + * + * Description: RedisConfiguration, change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/15/22 9:40 PM + */ +@EnableConfigurationProperties(RedisMasterSlaveReplicationProperties::class) +@Import(RedisCachingConfiguration::class) +@ConditionalOnClass(RedisConnectionFactory::class) +class RedisConfiguration( + private val redisMasterSlaveReplicationProperties: RedisMasterSlaveReplicationProperties +) { + companion object { + private val log = logger() + } + + /** + * Redis connection factory lettuce connection factory. Only takes effect when the 'redis.master.host' is + * configured. + * + * @return the lettuce connection factory + * @see Spring Data Redis - Write to Master, Read from Replica + */ + @Bean + @ConditionalOnProperty(prefix = "redis.master", name = ["host"]) + fun redisConnectionFactory(): LettuceConnectionFactory { + requireTrue(CollUtil.isEmpty(redisMasterSlaveReplicationProperties.slaves), null).orElseThrow { + IllegalStateException("Redis Master/Replica configuration is not right! To fix this issue, specify slaves configuration") + } + val redisStaticMasterReplicaConfiguration = RedisStaticMasterReplicaConfiguration( + redisMasterSlaveReplicationProperties.master?.host!!, + redisMasterSlaveReplicationProperties.master?.port!! + ).apply { setPassword(redisMasterSlaveReplicationProperties.master?.password) } + redisMasterSlaveReplicationProperties.slaves + ?.forEach(Consumer { slave: RedisMasterSlaveReplicationProperties.RedisInstance -> + redisStaticMasterReplicaConfiguration.addNode( + slave.host!!, + slave.port + ) + }) + return LettuceConnectionFactory( + redisStaticMasterReplicaConfiguration, LettuceClientConfiguration.builder() + .readFrom(ReadFrom.REPLICA_PREFERRED) + .build() + ).apply { + log.warn("Initial bean: `${LettuceConnectionFactory::class.java.simpleName}` for Redis Master/Replica configuration") + } + } + + /** + * Reactive redis template factory. + * + * @param connectionFactory the reactive redis connection factory + * @return the reactive redis template + * @see Working with Objects through ReactiveRedisTemplate + */ + @Bean + fun reactiveRedisTemplate(connectionFactory: ReactiveRedisConnectionFactory): ReactiveRedisTemplate { + val valueSerializer = Jackson2JsonRedisSerializer(Any::class.java) + return ReactiveRedisTemplate( + connectionFactory, RedisSerializationContext + .newSerializationContext( + RedisSerializationContext.SerializationPair.fromSerializer(RedisSerializer.string()) + ) + .value(valueSerializer) + .hashValue(valueSerializer) + .build() + ).apply { + log.warn("Initial bean: `${ReactiveRedisTemplate::class.java.simpleName}`") + } + } +} diff --git a/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/redis/RedisMasterSlaveReplicationProperties.java b/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/redis/RedisMasterSlaveReplicationProperties.java deleted file mode 100644 index db610a32..00000000 --- a/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/redis/RedisMasterSlaveReplicationProperties.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.jmsoftware.maf.reactivespringcloudstarter.redis; - -import lombok.Data; -import org.springframework.boot.context.properties.ConfigurationProperties; - -import java.util.List; - -/** - * Description: RedisMasterSlaveReplicationProperties, change description here. - * - * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 7/31/2021 10:37 AM - * @see Redis master-slave replication - * @see Redis Master Slave With Spring Boot - * @see - * Spring Data Redis - Write to Master, Read from Replica - **/ -@Data -@ConfigurationProperties(prefix = "redis") -public class RedisMasterSlaveReplicationProperties { - private RedisInstance master; - private List slaves; - - @Data - public static class RedisInstance { - private String host; - private int port; - private String password; - } -} diff --git a/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/redis/RedisMasterSlaveReplicationProperties.kt b/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/redis/RedisMasterSlaveReplicationProperties.kt new file mode 100644 index 00000000..29059810 --- /dev/null +++ b/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/redis/RedisMasterSlaveReplicationProperties.kt @@ -0,0 +1,25 @@ +package com.jmsoftware.maf.reactivespringcloudstarter.redis + +import org.springframework.boot.context.properties.ConfigurationProperties +import org.springframework.context.annotation.Configuration + +/** + * Description: RedisMasterSlaveReplicationProperties, change description here. + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 7/31/2021 10:37 AM + * @see Redis master-slave replication + * @see Redis Master Slave With Spring Boot + * @see Spring Data Redis - Write to Master, Read from Replica + */ +@Configuration +@ConfigurationProperties(prefix = "redis") +class RedisMasterSlaveReplicationProperties { + var master: RedisInstance? = null + var slaves: List? = null + + class RedisInstance { + var host: String? = null + var port = 0 + var password: String? = null + } +} diff --git a/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/service/CommonService.java b/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/service/CommonService.java deleted file mode 100644 index e2a1c3e3..00000000 --- a/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/service/CommonService.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.jmsoftware.maf.reactivespringcloudstarter.service; - -import cn.hutool.json.JSON; -import com.jmsoftware.maf.common.domain.ValidationTestPayload; - -/** - *

CommonService

- *

- * Change description here. - * - * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com - * @date 2/4/20 11:15 AM - */ -public interface CommonService { - /** - * Gets application info. - * - * @return the application info. - */ - JSON getApplicationInfo(); - - /** - * Validate object. - * - * @param payload the payload - */ - void validateObject(ValidationTestPayload payload); -} diff --git a/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/service/CommonService.kt b/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/service/CommonService.kt new file mode 100644 index 00000000..6888fbec --- /dev/null +++ b/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/service/CommonService.kt @@ -0,0 +1,31 @@ +package com.jmsoftware.maf.reactivespringcloudstarter.service + +import cn.hutool.json.JSON +import com.jmsoftware.maf.common.domain.ValidationTestPayload +import org.springframework.validation.annotation.Validated +import javax.validation.Valid +import javax.validation.constraints.NotNull + +/** + * # CommonService + * + * Change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/16/22 8:35 AM + */ +@Validated +interface CommonService { + /** + * Gets application info. + * + * @return the application info. + */ + fun getApplicationInfo(): JSON + + /** + * Validate object. + * + * @param payload the payload + */ + fun validateObject(payload: @Valid @NotNull ValidationTestPayload) +} 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 deleted file mode 100644 index e493f9d8..00000000 --- a/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/service/impl/CommonServiceImpl.java +++ /dev/null @@ -1,37 +0,0 @@ -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.property.MafProjectProperties; -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 MafProjectProperties mafProjectProperties; - - @Override - public JSON getApplicationInfo() { - return JSONUtil.parse(this.mafProjectProperties); - } - - @Override - public void validateObject(@Valid ValidationTestPayload payload) { - log.info("Validation passed! {}", payload); - } -} diff --git a/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/service/impl/CommonServiceImpl.kt b/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/service/impl/CommonServiceImpl.kt new file mode 100644 index 00000000..1ed76794 --- /dev/null +++ b/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/service/impl/CommonServiceImpl.kt @@ -0,0 +1,39 @@ +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.common.util.logger +import com.jmsoftware.maf.reactivespringcloudstarter.property.MafProjectProperties +import com.jmsoftware.maf.reactivespringcloudstarter.service.CommonService +import org.springframework.beans.factory.annotation.Value +import org.springframework.stereotype.Service +import javax.validation.Valid +import javax.validation.constraints.NotNull + +/** + * # CommonServiceImpl + * + * Change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/13/22 2:01 PM + */ +@Service +class CommonServiceImpl( + private val mafProjectProperties: MafProjectProperties +) : CommonService { + companion object { + private val log = logger() + } + + @Value("\${greeting:Hello, World! (Embedded in Java)}") + private val greeting: String? = null + + override fun getApplicationInfo(): JSON { + return JSONUtil.parseObj(mafProjectProperties).set("greeting", greeting) + } + + override fun validateObject(payload: @Valid @NotNull ValidationTestPayload) { + log.info("Validation passed! {}", payload) + } +} diff --git a/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/util/RequestUtil.java b/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/util/RequestUtil.java deleted file mode 100644 index 321f5f11..00000000 --- a/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/util/RequestUtil.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.jmsoftware.maf.reactivespringcloudstarter.util; - - -import cn.hutool.core.util.ObjectUtil; -import lombok.val; -import org.springframework.http.server.reactive.ServerHttpRequest; - -/** - *

RequestUtil

- *

- * Request util. - * - * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com - * @date 2/15/20 9:58 PM - **/ -public class RequestUtil { - /** - * Get request user's IP and port information. If the request is through reverse proxy, this method will not work - * out. - * - * @param request HTTP request. - * @return user's IP and port information. Pattern like: IP:Port. - * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com - * @date 2/15/20 9:52 PM - */ - public static String getRequesterIpAndPort(ServerHttpRequest request) { - val requestRemoteAddress = request.getRemoteAddress(); - if (ObjectUtil.isNotNull(requestRemoteAddress)) { - return requestRemoteAddress.toString(); - } - return "Unknown Requester"; - } -} diff --git a/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/util/RequestUtil.kt b/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/util/RequestUtil.kt new file mode 100644 index 00000000..5f172183 --- /dev/null +++ b/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/util/RequestUtil.kt @@ -0,0 +1,27 @@ +package com.jmsoftware.maf.reactivespringcloudstarter.util + +import org.springframework.http.server.reactive.ServerHttpRequest + +/** + * # RequestUtil + * + * Request util. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com + * @date 2/15/20 9:58 PM + */ +object RequestUtil + +/** + * Get request user's IP and port information. If the request is through reverse proxy, this method will not work + * out. + * + * @param request HTTP request. + * @return user's IP and port information. Pattern like: IP:Port. + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com + * @date 2/15/20 9:52 PM + */ +fun getRequesterIpAndPort(request: ServerHttpRequest): String { + val requestRemoteAddress = request.remoteAddress + return requestRemoteAddress?.toString() ?: "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 deleted file mode 100644 index 6f747cf7..00000000 --- a/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/util/ResponseUtil.java +++ /dev/null @@ -1,54 +0,0 @@ -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.RequiredArgsConstructor; -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 - **/ -@RequiredArgsConstructor -public class ResponseUtil { - private final ObjectMapper objectMapper; - - /** - * 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 Mono renderJson(@NonNull ServerWebExchange exchange, @NonNull HttpStatus httpStatus, - @Nullable String message, @Nullable Object data) { - 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(this.objectMapper.writeValueAsBytes(responseBody)); - } catch (JsonProcessingException e) { - return bufferFactory.wrap(new byte[0]); - } - })); - } -} diff --git a/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/util/ResponseUtil.kt b/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/util/ResponseUtil.kt new file mode 100644 index 00000000..d49f653b --- /dev/null +++ b/reactive-spring-cloud-starter/src/main/java/com/jmsoftware/maf/reactivespringcloudstarter/util/ResponseUtil.kt @@ -0,0 +1,54 @@ +package com.jmsoftware.maf.reactivespringcloudstarter.util + +import cn.hutool.core.text.CharSequenceUtil +import com.fasterxml.jackson.core.JsonProcessingException +import com.fasterxml.jackson.databind.ObjectMapper +import com.jmsoftware.maf.common.bean.ResponseBodyBean +import org.springframework.http.HttpStatus +import org.springframework.http.MediaType +import org.springframework.stereotype.Component +import org.springframework.web.server.ServerWebExchange +import reactor.core.publisher.Mono + +/** + * Description: ResponseUtil, change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/16/22 11:33 AM + */ +@Component +class ResponseUtil( + private val objectMapper: ObjectMapper +) { + /** + * Render json mono. + * + * @param exchange the exchange + * @param httpStatus the http status + * @param message the message + * @param data the data + * @return the mono + */ + fun renderJson( + exchange: ServerWebExchange, + httpStatus: HttpStatus, + message: String?, + data: Any? + ): Mono { + exchange.response.statusCode = httpStatus + val response = exchange.response + response.statusCode = 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.headers.contentType = MediaType.APPLICATION_JSON + return response.writeWith(Mono.fromSupplier { + val bufferFactory = response.bufferFactory() + val message2 = CharSequenceUtil.format("{}. {}", httpStatus.reasonPhrase, message) + val responseBody: Any = ResponseBodyBean.ofStatus(httpStatus.value(), message2, data) + try { + bufferFactory.wrap(objectMapper.writeValueAsBytes(responseBody)) + } catch (e: JsonProcessingException) { + bufferFactory.wrap(ByteArray(0)) + } + }) + } +} diff --git a/spring-boot-admin/pom.xml b/spring-boot-admin/pom.xml index 6f3b58f2..f88c4442 100644 --- a/spring-boot-admin/pom.xml +++ b/spring-boot-admin/pom.xml @@ -10,7 +10,7 @@ com.jmsoftware.maf muscle-and-fitness-server - 0.0.8.1 + 0.0.9 pom @@ -35,19 +35,6 @@ spring-cloud-starter - - - org.springframework.boot - spring-boot-starter-test - test - - - org.junit.vintage - junit-vintage-engine - - - - de.codecentric spring-boot-admin-starter-server diff --git a/spring-boot-admin/spring-boot-admin-bootstrap/pom.xml b/spring-boot-admin/spring-boot-admin-bootstrap/pom.xml index 79092438..06b4e3ac 100644 --- a/spring-boot-admin/spring-boot-admin-bootstrap/pom.xml +++ b/spring-boot-admin/spring-boot-admin-bootstrap/pom.xml @@ -10,7 +10,7 @@ com.jmsoftware.maf spring-boot-admin - 0.0.8.1 + 0.0.9 @@ -30,44 +30,6 @@ - - org.apache.maven.plugins - maven-pmd-plugin - ${maven-pmd-plugin.version} - - ${project.build.sourceEncoding} - ${java.version} - true - - rulesets/java/ali-comment.xml - rulesets/java/ali-concurrent.xml - rulesets/java/ali-constant.xml - rulesets/java/ali-exception.xml - rulesets/java/ali-flowcontrol.xml - rulesets/java/ali-naming.xml - rulesets/java/ali-oop.xml - rulesets/java/ali-orm.xml - rulesets/java/ali-other.xml - rulesets/java/ali-set.xml - - - - - verify - - check - - - - - - com.alibaba.p3c - p3c-pmd - ${p3c-pmd.version} - - - - com.google.cloud.tools @@ -100,12 +62,16 @@ - - adoptopenjdk/openjdk11:${adoptopenjdk11.tag} + + eclipse-temurin:${temurin.tag} docker.io/ijohnnymiller/${project.baseArtifactId}.${project.parent.artifactId} + ${git.commit.id.abbrev}-${project.version} @@ -132,31 +98,6 @@ - - - - io.github.git-commit-id - git-commit-id-maven-plugin - 5.0.0 - - - get-the-git-info - - revision - - initialize - - - - true - ${project.build.outputDirectory}/git.properties - - ^git.build.(time|version)$ - ^git.commit.id.(abbrev|full)$ - - full - - diff --git a/spring-boot-admin/spring-boot-admin-bootstrap/src/main/java/com/jmsoftware/maf/springbootadmin/SpringBootAdminApplication.java b/spring-boot-admin/spring-boot-admin-bootstrap/src/main/java/com/jmsoftware/maf/springbootadmin/SpringBootAdminApplication.java deleted file mode 100644 index a27e332d..00000000 --- a/spring-boot-admin/spring-boot-admin-bootstrap/src/main/java/com/jmsoftware/maf/springbootadmin/SpringBootAdminApplication.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.jmsoftware.maf.springbootadmin; - -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 org.springframework.util.StopWatch; - -/** - *

SpringBootAdminApplication

- *

- * Change description here. - * - * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com,date: 2/14/20 3:07 PM - **/ -@Slf4j -@EnableAdminServer -@EnableDiscoveryClient -@SpringBootApplication -@SuppressWarnings("scwjava_Createprivateconstructorforutilityclassallfieldsmethodsarestatic") -public class SpringBootAdminApplication { - public static void main(String[] args) { - val stopWatch = new StopWatch(); - stopWatch.start(); - val configurableApplicationContext = SpringApplication.run(SpringBootAdminApplication.class, args); - val springBootStartupHelper = configurableApplicationContext.getBean(SpringBootStartupHelper.class); - springBootStartupHelper.stop(stopWatch); - } -} diff --git a/spring-boot-admin/spring-boot-admin-bootstrap/src/main/java/com/jmsoftware/maf/springbootadmin/SpringBootAdminApplication.kt b/spring-boot-admin/spring-boot-admin-bootstrap/src/main/java/com/jmsoftware/maf/springbootadmin/SpringBootAdminApplication.kt new file mode 100644 index 00000000..5e2a2944 --- /dev/null +++ b/spring-boot-admin/spring-boot-admin-bootstrap/src/main/java/com/jmsoftware/maf/springbootadmin/SpringBootAdminApplication.kt @@ -0,0 +1,28 @@ +package com.jmsoftware.maf.springbootadmin + +import com.jmsoftware.maf.springcloudstarter.helper.SpringBootStartupHelper +import de.codecentric.boot.admin.server.config.EnableAdminServer +import org.springframework.boot.autoconfigure.SpringBootApplication +import org.springframework.boot.runApplication +import org.springframework.cloud.client.discovery.EnableDiscoveryClient +import org.springframework.util.StopWatch + +/** + * # SpringBootAdminApplication + * + * Change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/16/22 10:40 AM + */ +@EnableAdminServer +@EnableDiscoveryClient +@SpringBootApplication +class SpringBootAdminApplication + +fun main(args: Array) { + val stopWatch = StopWatch() + stopWatch.start() + runApplication(*args) + .getBean(SpringBootStartupHelper::class.java) + .stop(stopWatch) +} diff --git a/spring-boot-admin/spring-boot-admin-bootstrap/src/main/resources/application.yml b/spring-boot-admin/spring-boot-admin-bootstrap/src/main/resources/application.yml index d4c8bde7..bcab891d 100644 --- a/spring-boot-admin/spring-boot-admin-bootstrap/src/main/resources/application.yml +++ b/spring-boot-admin/spring-boot-admin-bootstrap/src/main/resources/application.yml @@ -26,7 +26,7 @@ spring: config: # `default-context` should not be modified, keeps "application" for common configuration. # Properties in the config/application folder are applicable to all applications using consul for configuration. - profile-separator: "::" + profile-separator: "@" format: YAML data-key: "data" watch: diff --git a/spring-boot-admin/spring-boot-admin-bootstrap/src/test/java/com/jmsoftware/maf/springbootadmin/SpringBootAdminApplicationTests.java b/spring-boot-admin/spring-boot-admin-bootstrap/src/test/java/com/jmsoftware/maf/springbootadmin/SpringBootAdminApplicationTests.java deleted file mode 100644 index c5c51de4..00000000 --- a/spring-boot-admin/spring-boot-admin-bootstrap/src/test/java/com/jmsoftware/maf/springbootadmin/SpringBootAdminApplicationTests.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.jmsoftware.maf.springbootadmin; - -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -class SpringBootAdminApplicationTests { - - @Test - void contextLoads() { - } - -} diff --git a/spring-boot-admin/spring-boot-admin-bootstrap/src/test/java/com/jmsoftware/maf/springbootadmin/package-info.kt b/spring-boot-admin/spring-boot-admin-bootstrap/src/test/java/com/jmsoftware/maf/springbootadmin/package-info.kt new file mode 100644 index 00000000..f00a387f --- /dev/null +++ b/spring-boot-admin/spring-boot-admin-bootstrap/src/test/java/com/jmsoftware/maf/springbootadmin/package-info.kt @@ -0,0 +1 @@ +package com.jmsoftware.maf.springbootadmin diff --git a/spring-cloud-starter/pom.xml b/spring-cloud-starter/pom.xml index a828bb06..e50a6075 100644 --- a/spring-cloud-starter/pom.xml +++ b/spring-cloud-starter/pom.xml @@ -10,7 +10,7 @@ com.jmsoftware.maf muscle-and-fitness-server - 0.0.8.1 + 0.0.9 @@ -42,6 +42,11 @@ spring-boot-starter-data-redis provided + + org.springframework.boot + spring-boot-starter-data-elasticsearch + provided + org.springframework.boot spring-boot-starter-amqp @@ -74,19 +79,6 @@ org.springframework.boot spring-boot-autoconfigure-processor - true - - - org.springframework.boot - spring-boot-starter-test - provided - true - - - org.junit.vintage - junit-vintage-engine - - @@ -115,6 +107,17 @@ spring-cloud-sleuth-zipkin + + + org.springframework.boot + spring-boot-starter-integration + + + org.springframework.integration + spring-integration-redis + provided + + io.minio @@ -147,26 +150,10 @@ provided - com.baomidou - dynamic-datasource-spring-boot-starter - ${dynamic-datasource-spring-boot-starter.version} - provided - - - com.alibaba - druid-spring-boot-starter - ${druid-spring-boot-starter.version} + org.apache.shardingsphere + shardingsphere-jdbc-core-spring-boot-starter + ${shardingsphere.version} provided - - - com.sun - tools - - - com.sun - jconsole - - 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 deleted file mode 100644 index 035af8a4..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/MafAutoConfiguration.java +++ /dev/null @@ -1,187 +0,0 @@ -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.FeignClientLogAspect; -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.minio.MinioConfiguration; -import com.jmsoftware.maf.springcloudstarter.poi.ExcelImportConfigurationProperties; -import com.jmsoftware.maf.springcloudstarter.property.FeignClientConfigurationProperties; -import com.jmsoftware.maf.springcloudstarter.property.JwtConfigurationProperties; -import com.jmsoftware.maf.springcloudstarter.property.MafConfigurationProperties; -import com.jmsoftware.maf.springcloudstarter.property.MafProjectProperties; -import com.jmsoftware.maf.springcloudstarter.quartz.QuartzConfiguration; -import com.jmsoftware.maf.springcloudstarter.rabbitmq.RabbitmqConfiguration; -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.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.ApplicationContext; -import org.springframework.context.annotation.Bean; -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 -@IntegrationComponentScan -@ConditionalOnWebApplication -@EnableConfigurationProperties({ - MafConfigurationProperties.class, - MafProjectProperties.class, - JwtConfigurationProperties.class, - ExcelImportConfigurationProperties.class, - FeignClientConfigurationProperties.class -}) -@Import({ - WebMvcConfiguration.class, - MyBatisPlusConfiguration.class, - RedisConfiguration.class, - WebSecurityConfiguration.class, - RestTemplateConfiguration.class, - AsyncConfiguration.class, - SchedulingConfiguration.class, - RabbitmqConfiguration.class, - MinioConfiguration.class, - JacksonConfiguration.class, - TypeConversionConfiguration.class, - QuartzConfiguration.class, - WebSocketConfiguration.class, - OpenApiConfiguration.class, - OpenFeignConfiguration.class -}) -public class MafAutoConfiguration { - private static final String INITIAL_MESSAGE = "Initial bean: '{}'"; - - @PostConstruct - public void postConstruct() { - log.warn("Post construction of '{}'", this.getClass().getSimpleName()); - } - - @Bean - @ConditionalOnMissingBean - public CommonExceptionControllerAdvice exceptionControllerAdvice() { - log.warn(INITIAL_MESSAGE, CommonExceptionControllerAdvice.class.getSimpleName()); - return new CommonExceptionControllerAdvice(); - } - - @Bean - @ConditionalOnClass({MyBatisSystemException.class, MybatisPlusException.class, PersistenceException.class}) - public DatabaseExceptionControllerAdvice databaseExceptionControllerAdvice() { - log.warn(INITIAL_MESSAGE, DatabaseExceptionControllerAdvice.class.getSimpleName()); - return new DatabaseExceptionControllerAdvice(); - } - - @Bean - @ConditionalOnProperty(value = "maf.configuration.web-request-log-enabled") - public WebRequestLogAspect webRequestLogAspect() { - log.warn(INITIAL_MESSAGE, WebRequestLogAspect.class.getSimpleName()); - return new WebRequestLogAspect(); - } - - @Bean - public RedirectController redirectController() { - log.warn(INITIAL_MESSAGE, RedirectController.class.getSimpleName()); - return new RedirectController(); - } - - @Bean - public AccessLogFilter requestFilter(MafConfigurationProperties mafConfigurationProperties) { - log.warn(INITIAL_MESSAGE, AccessLogFilter.class.getSimpleName()); - return new AccessLogFilter(mafConfigurationProperties); - } - - @Bean - public IpHelper ipHelper(Environment environment) { - log.warn(INITIAL_MESSAGE, IpHelper.class.getSimpleName()); - return new IpHelper(environment); - } - - @Bean - public SpringBootStartupHelper springBootStartupHelper( - MafProjectProperties mafProjectProperties, - IpHelper ipHelper, - ApplicationContext applicationContext - ) { - log.warn(INITIAL_MESSAGE, SpringBootStartupHelper.class.getSimpleName()); - return new SpringBootStartupHelper(mafProjectProperties, ipHelper, applicationContext); - } - - @Bean - @ConditionalOnMissingBean(value = ErrorController.class, search = SearchStrategy.CURRENT) - public GlobalErrorController globalErrorController(ErrorAttributes errorAttributes, - ServerProperties serverProperties, - List errorViewResolvers) { - log.warn(INITIAL_MESSAGE, GlobalErrorController.class.getSimpleName()); - return new GlobalErrorController(errorAttributes, serverProperties, errorViewResolvers); - } - - @Bean - public HttpApiScanHelper httpApiScanHelper(RequestMappingHandlerMapping requestMappingHandlerMapping) { - log.warn(INITIAL_MESSAGE, HttpApiScanHelper.class.getSimpleName()); - return new HttpApiScanHelper(requestMappingHandlerMapping); - } - - @Bean - public HttpApiResourceRemoteApiController httpApiResourceRemoteController( - MafConfigurationProperties mafConfigurationProperties, - HttpApiScanHelper httpApiScanHelper - ) { - log.warn(INITIAL_MESSAGE, HttpApiResourceRemoteApiController.class.getSimpleName()); - return new HttpApiResourceRemoteApiController(mafConfigurationProperties, httpApiScanHelper); - } - - @Bean - @RefreshScope - public CommonService commonService(MafProjectProperties mafProjectProperties) { - log.warn(INITIAL_MESSAGE, CommonServiceImpl.class.getSimpleName()); - return new CommonServiceImpl(mafProjectProperties); - } - - @Bean - public CommonController commonController(CommonService commonService) { - log.warn(INITIAL_MESSAGE, CommonController.class.getSimpleName()); - return new CommonController(commonService); - } - - @Bean - @ConditionalOnProperty( - prefix = "feign.client.config.default", - name = {"enabledAopLog"}, - havingValue = "true", - matchIfMissing = true - ) - public FeignClientLogAspect feignClientLogAspect() { - log.warn(INITIAL_MESSAGE, FeignClientLogAspect.class.getSimpleName()); - return new FeignClientLogAspect(); - } -} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/MafAutoConfiguration.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/MafAutoConfiguration.kt new file mode 100644 index 00000000..d68005e1 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/MafAutoConfiguration.kt @@ -0,0 +1,206 @@ +package com.jmsoftware.maf.springcloudstarter + +import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException +import com.fasterxml.jackson.databind.ObjectMapper +import com.jmsoftware.maf.common.util.logger +import com.jmsoftware.maf.springcloudstarter.aspect.* +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.elasticsearch.ElasticsearchConfiguration +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.minio.MinioConfiguration +import com.jmsoftware.maf.springcloudstarter.poi.ExcelImportConfigurationProperties +import com.jmsoftware.maf.springcloudstarter.property.FeignClientConfigurationProperties +import com.jmsoftware.maf.springcloudstarter.property.JwtConfigurationProperties +import com.jmsoftware.maf.springcloudstarter.property.MafConfigurationProperties +import com.jmsoftware.maf.springcloudstarter.property.MafProjectProperties +import com.jmsoftware.maf.springcloudstarter.quartz.QuartzConfiguration +import com.jmsoftware.maf.springcloudstarter.rabbitmq.RabbitmqConfiguration +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.websocket.WebSocketConfiguration +import org.apache.ibatis.exceptions.PersistenceException +import org.mybatis.spring.MyBatisSystemException +import org.springframework.boot.autoconfigure.ImportAutoConfiguration +import org.springframework.boot.autoconfigure.condition.* +import org.springframework.boot.autoconfigure.integration.IntegrationAutoConfiguration +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.cloud.sleuth.Tracer +import org.springframework.context.ApplicationContext +import org.springframework.context.annotation.Bean +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 + +/** + * # MafAutoConfiguration + * + * Description: MafAutoConfiguration, change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/12/22 9:26 PM + * @see 9. Creating Your Own Auto-configuration + */ +@IntegrationComponentScan +@ConditionalOnWebApplication +@EnableConfigurationProperties( + MafConfigurationProperties::class, + MafProjectProperties::class, + JwtConfigurationProperties::class, + ExcelImportConfigurationProperties::class, + FeignClientConfigurationProperties::class +) +@Import( + WebMvcConfiguration::class, + MyBatisPlusConfiguration::class, + RedisConfiguration::class, + ElasticsearchConfiguration::class, + WebSecurityConfiguration::class, + RestTemplateConfiguration::class, + AsyncConfiguration::class, + SchedulingConfiguration::class, + RabbitmqConfiguration::class, + MinioConfiguration::class, + JacksonConfiguration::class, + TypeConversionConfiguration::class, + QuartzConfiguration::class, + WebSocketConfiguration::class, + OpenApiConfiguration::class, + OpenFeignConfiguration::class +) +@ImportAutoConfiguration( + IntegrationAutoConfiguration::class +) +class MafAutoConfiguration { + companion object { + private val log = logger() + } + + @PostConstruct + fun postConstruct() { + log.warn("Post construction of `${this.javaClass.simpleName}`") + } + + @Bean + @ConditionalOnMissingBean + fun trackableResponseControllerAdvice(tracer: Tracer): TrackableResponseControllerAdvice { + log.warn("Initial bean: `${TrackableResponseControllerAdvice::class.java.simpleName}`") + return TrackableResponseControllerAdvice(tracer) + } + + @Bean + @ConditionalOnMissingBean + fun commonExceptionControllerAdvice(): CommonExceptionControllerAdvice { + log.warn("Initial bean: `${CommonExceptionControllerAdvice::class.java.simpleName}`") + return CommonExceptionControllerAdvice() + } + + @Bean + @ConditionalOnClass( + MyBatisSystemException::class, MybatisPlusException::class, PersistenceException::class + ) + fun databaseExceptionControllerAdvice(): DatabaseExceptionControllerAdvice { + log.warn("Initial bean: `${DatabaseExceptionControllerAdvice::class.java.simpleName}`") + return DatabaseExceptionControllerAdvice() + } + + @Bean + @ConditionalOnProperty(value = ["maf.configuration.web-request-log-enabled"]) + fun webRequestLogAspect(objectMapper: ObjectMapper): WebRequestLogAspect { + log.warn("Initial bean: `${WebRequestLogAspect::class.java.simpleName}`") + return WebRequestLogAspect(objectMapper) + } + + @Bean + fun redirectController(): RedirectController { + log.warn("Initial bean: `${RedirectController::class.java.simpleName}`") + return RedirectController() + } + + @Bean + fun requestFilter(mafConfigurationProperties: MafConfigurationProperties): AccessLogFilter { + log.warn("Initial bean: `${AccessLogFilter::class.java.simpleName}`") + return AccessLogFilter(mafConfigurationProperties) + } + + @Bean + fun ipHelper(environment: Environment): IpHelper { + log.warn("Initial bean: `${IpHelper::class.java.simpleName}`") + return IpHelper(environment) + } + + @Bean + fun springBootStartupHelper( + mafProjectProperties: MafProjectProperties, + ipHelper: IpHelper, + applicationContext: ApplicationContext + ): SpringBootStartupHelper { + log.warn("Initial bean: `${SpringBootStartupHelper::class.java.simpleName}`") + return SpringBootStartupHelper(mafProjectProperties, ipHelper, applicationContext) + } + + @Bean + @ConditionalOnMissingBean(value = [ErrorController::class], search = SearchStrategy.CURRENT) + fun globalErrorController( + errorAttributes: ErrorAttributes, + serverProperties: ServerProperties, + errorViewResolvers: List + ): GlobalErrorController { + log.warn("Initial bean: `${GlobalErrorController::class.java.simpleName}`") + return GlobalErrorController(errorAttributes, serverProperties, errorViewResolvers) + } + + @Bean + fun httpApiScanHelper(requestMappingHandlerMapping: RequestMappingHandlerMapping): HttpApiScanHelper { + log.warn("Initial bean: `${HttpApiScanHelper::class.java.simpleName}`") + return HttpApiScanHelper(requestMappingHandlerMapping) + } + + @Bean + fun httpApiResourceRemoteController( + mafConfigurationProperties: MafConfigurationProperties, + httpApiScanHelper: HttpApiScanHelper + ): HttpApiResourceRemoteApiController { + log.warn("Initial bean: `${HttpApiResourceRemoteApiController::class.java.simpleName}`") + return HttpApiResourceRemoteApiController(mafConfigurationProperties, httpApiScanHelper) + } + + @Bean + @RefreshScope + fun commonService(mafProjectProperties: MafProjectProperties): CommonService { + log.warn("Initial bean: `${CommonService::class.java.simpleName}`") + return CommonServiceImpl(mafProjectProperties) + } + + @Bean + fun commonController(commonService: CommonService): CommonController { + log.warn("Initial bean: `${CommonController::class.java.simpleName}`") + return CommonController(commonService) + } + + @Bean + @ConditionalOnProperty( + prefix = "feign.client.config.default", + name = ["enabledAopLog"], + havingValue = "true", + matchIfMissing = true + ) + fun feignClientLogAspect(): FeignClientLogAspect { + log.warn("Initial bean: `${FeignClientLogAspect::class.java.simpleName}`") + return FeignClientLogAspect() + } +} 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 deleted file mode 100644 index a7a013c0..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/aspect/CommonExceptionControllerAdvice.java +++ /dev/null @@ -1,250 +0,0 @@ -package com.jmsoftware.maf.springcloudstarter.aspect; - -import cn.hutool.core.text.CharSequenceUtil; -import cn.hutool.core.util.ObjectUtil; -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.apache.catalina.connector.ClientAbortException; -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(ClientAbortException.class) - public void handleException(HttpServletRequest request, ClientAbortException exception) { - this.requestLog(request); - log.error("An abort of a request by a remote client. Exception message: {} ", exception.getMessage()); - } - - @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()) - && CharSequenceUtil.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 (CharSequenceUtil.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/CommonExceptionControllerAdvice.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/aspect/CommonExceptionControllerAdvice.kt new file mode 100644 index 00000000..522b06ee --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/aspect/CommonExceptionControllerAdvice.kt @@ -0,0 +1,273 @@ +package com.jmsoftware.maf.springcloudstarter.aspect + +import cn.hutool.core.text.CharSequenceUtil +import cn.hutool.core.util.StrUtil +import com.jmsoftware.maf.common.bean.ResponseBodyBean +import com.jmsoftware.maf.common.exception.BaseException +import com.jmsoftware.maf.common.util.logger +import com.jmsoftware.maf.springcloudstarter.util.getRequestIpAndPort +import org.apache.catalina.connector.ClientAbortException +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 java.lang.reflect.UndeclaredThrowableException +import java.util.* +import javax.servlet.http.HttpServletRequest +import javax.servlet.http.HttpServletResponse +import javax.validation.ConstraintViolationException + +/** + * # CommonExceptionControllerAdvice + * + * Exception advice for global controllers. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/13/22 6:06 PM + */ +@RestControllerAdvice +@Order(CommonExceptionControllerAdvice.ORDER) +class CommonExceptionControllerAdvice { + companion object { + /** + * After DatabaseExceptionControllerAdvice + * + * @see DatabaseExceptionControllerAdvice + */ + const val ORDER = 0 + private val log = logger() + } + + /** + * 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) + fun handleException(request: HttpServletRequest, exception: NoHandlerFoundException): ResponseBodyBean<*> { + requestLog(request) + // ATTENTION: Use only ResponseBodyBean.ofStatus() in handleException() method and + // DON'T throw any exceptions in this method + log.error("NoHandlerFoundException: Request URL = ${exception.requestURL}, HTTP method = ${exception.httpMethod}") + return ResponseBodyBean.ofStatus(HttpStatus.NOT_FOUND) + } + + @ResponseStatus(HttpStatus.METHOD_NOT_ALLOWED) + @ExceptionHandler(HttpRequestMethodNotSupportedException::class) + fun handleException( + request: HttpServletRequest, + exception: HttpRequestMethodNotSupportedException + ): ResponseBodyBean<*> { + requestLog(request) + log.error("Exception occurred when the request handler does not support a specific request method. Current method is ${exception.method}, Support HTTP method = ${exception.supportedHttpMethods}") + return ResponseBodyBean.ofStatus(HttpStatus.METHOD_NOT_ALLOWED) + } + + @ResponseStatus(HttpStatus.BAD_REQUEST) + @ExceptionHandler(MethodArgumentNotValidException::class) + fun handleException(request: HttpServletRequest, exception: MethodArgumentNotValidException): ResponseBodyBean<*> { + requestLog(request) + log.error("MethodArgumentNotValidException message: {}", exception.message) + return ResponseBodyBean.ofStatus( + HttpStatus.BAD_REQUEST.value(), + getFieldErrorMessageFromException(exception), + null + ) + } + + @ResponseStatus(HttpStatus.BAD_REQUEST) + @ExceptionHandler(MethodArgumentTypeMismatchException::class) + fun handleException( + request: HttpServletRequest, + exception: MethodArgumentTypeMismatchException + ): ResponseBodyBean<*> { + requestLog(request) + log.error("MethodArgumentTypeMismatchException: Parameter name = ${exception.name}, Exception message: ${exception.message}") + return ResponseBodyBean.ofStatus(HttpStatus.BAD_REQUEST, removeLineSeparator(exception.message)) + } + + @ResponseStatus(HttpStatus.BAD_REQUEST) + @ExceptionHandler(HttpMessageNotReadableException::class) + fun handleException(request: HttpServletRequest, exception: HttpMessageNotReadableException): ResponseBodyBean<*> { + requestLog(request) + log.error("HttpMessageNotReadableException: {}", exception.message) + return ResponseBodyBean.ofStatus(HttpStatus.BAD_REQUEST, removeLineSeparator(exception.message)) + } + + @ExceptionHandler(BaseException::class) + fun handleException( + request: HttpServletRequest, response: HttpServletResponse, + exception: BaseException + ): ResponseBodyBean<*> { + requestLog(request) + log.error("BaseException: Status code: ${exception.code}, message: ${exception.message}, data: ${exception.data}") + response.status = exception.code + return ResponseBodyBean.ofStatus( + exception.code, + removeLineSeparator(exception.message), + exception.data + ) + } + + @ResponseStatus(HttpStatus.BAD_REQUEST) + @ExceptionHandler(BindException::class) + fun handleException(request: HttpServletRequest, exception: BindException): ResponseBodyBean<*> { + requestLog(request) + log.error("BindException message: {} ", exception.message) + val message: String = if (exception.hasFieldErrors()) { + val fieldError = exception.fieldError + "Field [${fieldError?.field}] has error: ${fieldError?.defaultMessage}" + } else { + val globalError = exception.globalError + "Bind error: ${globalError?.defaultMessage}" + } + return ResponseBodyBean.ofStatus(HttpStatus.BAD_REQUEST, message) + } + + @ResponseStatus(HttpStatus.BAD_REQUEST) + @ExceptionHandler(ConstraintViolationException::class) + fun handleException(request: HttpServletRequest, exception: ConstraintViolationException): ResponseBodyBean<*> { + requestLog(request) + log.error("ConstraintViolationException message: ${exception.message}") + return ResponseBodyBean.ofStatus(HttpStatus.BAD_REQUEST, removeLineSeparator(exception.message)) + } + + @ResponseStatus(HttpStatus.BAD_REQUEST) + @ExceptionHandler(IllegalArgumentException::class) + fun handleException(request: HttpServletRequest, exception: IllegalArgumentException): ResponseBodyBean<*> { + requestLog(request) + log.error("IllegalArgumentException message: ${exception.message}") + return ResponseBodyBean.ofStatus( + HttpStatus.BAD_REQUEST.value(), + removeLineSeparator(exception.message), + null + ) + } + + @ResponseStatus(HttpStatus.FORBIDDEN) + @ExceptionHandler(BadCredentialsException::class) + fun handleException(request: HttpServletRequest, exception: BadCredentialsException): ResponseBodyBean<*> { + 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.message}") + return ResponseBodyBean.ofStatus( + HttpStatus.FORBIDDEN.value(), + removeLineSeparator(exception.message), + null + ) + } + + @ExceptionHandler(InternalAuthenticationServiceException::class) + fun handleException( + request: HttpServletRequest, response: HttpServletResponse, + exception: InternalAuthenticationServiceException + ): ResponseBodyBean<*> { + requestLog(request) + log.error("An authentication request could not be processed due to a system problem that occurred internally. Exception message: ${exception.message}") + if (exception.cause is BaseException) { + val exceptionCause = exception.cause as BaseException + val code = exceptionCause.code + response.status = code + return ResponseBodyBean.ofStatus( + HttpStatus.valueOf(code), + removeLineSeparator(exception.message) + ) + } + response.status = HttpStatus.FORBIDDEN.value() + return ResponseBodyBean.ofStatus( + HttpStatus.FORBIDDEN.value(), + removeLineSeparator(exception.message), + null + ) + } + + @ExceptionHandler(ClientAbortException::class) + fun handleException(request: HttpServletRequest, exception: ClientAbortException) { + requestLog(request) + log.error("An abort of a request by a remote client. Exception message: ${exception.message}") + } + + @ExceptionHandler(UndeclaredThrowableException::class) + @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) + fun handleError(exception: UndeclaredThrowableException): ResponseBodyBean<*> { + log.error("Undeclared throwable exception occurred! Exception message: ${exception.message}", exception) + return if (exception.cause != null && exception.cause?.message != null) { + ResponseBodyBean.ofStatus( + HttpStatus.INTERNAL_SERVER_ERROR, + CharSequenceUtil.format( + "Exception message: {}", + removeLineSeparator(exception.cause!!.message) + ) + ) + } else ResponseBodyBean.ofStatus( + HttpStatus.INTERNAL_SERVER_ERROR, + "Exception message: ${removeLineSeparator(exception.message)}" + ) + } + + @ExceptionHandler(Throwable::class) + @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) + fun handleError(throwable: Throwable): ResponseBodyBean<*> { + log.error("Internal server exception occurred! Exception message: ${throwable.message}", throwable) + return ResponseBodyBean.ofStatus( + HttpStatus.INTERNAL_SERVER_ERROR, + "Exception message: ${removeLineSeparator(throwable.message)}" + ) + } + + private fun requestLog(request: HttpServletRequest) { + log.error("Exception occurred when [${getRequestIpAndPort(request)}] requested access. Request URL: [${request.method}] ${request.requestURL}") + } + + /** + * 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 fun getFieldErrorMessageFromException(exception: MethodArgumentNotValidException): String { + return try { + val firstErrorField = Objects.requireNonNull( + exception.bindingResult + .allErrors[0] + .arguments + )[0] as DefaultMessageSourceResolvable + "${firstErrorField.defaultMessage} ${exception.bindingResult.allErrors[0].defaultMessage}" + } catch (e: Exception) { + log.error( + "Exception occurred when get field error message from exception. Exception message: ${e.message}", + e + ) + HttpStatus.BAD_REQUEST.reasonPhrase + } + } + + /** + * 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 fun removeLineSeparator(source: String?): String { + return if (StrUtil.isBlank(source)) { + "source is blank" + } else source!!.replace(System.lineSeparator().toRegex(), " ") + } +} 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 deleted file mode 100644 index ffd91076..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/aspect/DatabaseExceptionControllerAdvice.java +++ /dev/null @@ -1,104 +0,0 @@ -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/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/aspect/DatabaseExceptionControllerAdvice.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/aspect/DatabaseExceptionControllerAdvice.kt new file mode 100644 index 00000000..f265a788 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/aspect/DatabaseExceptionControllerAdvice.kt @@ -0,0 +1,92 @@ +package com.jmsoftware.maf.springcloudstarter.aspect + +import cn.hutool.core.exceptions.ExceptionUtil.getRootCauseMessage +import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException +import com.jmsoftware.maf.common.bean.ResponseBodyBean +import com.jmsoftware.maf.common.util.logger +import com.jmsoftware.maf.springcloudstarter.util.getRequestIpAndPort +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 + */ +@RestControllerAdvice +@ConditionalOnClass( + MyBatisSystemException::class, + MybatisPlusException::class, + PersistenceException::class +) +@Order(DatabaseExceptionControllerAdvice.ORDER) +class DatabaseExceptionControllerAdvice { + companion object { + /** + * Before CommonExceptionControllerAdvice + * + * @see CommonExceptionControllerAdvice + */ + const val ORDER = -1 + private val log = logger() + } + + @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) + @ExceptionHandler(MyBatisSystemException::class) + fun handleMyBatisSystemException( + request: HttpServletRequest, + exception: MyBatisSystemException + ): ResponseBodyBean<*> { + requestLog(request) + log.error("MyBatisSystemException message: ${exception.message}") + return ResponseBodyBean.ofStatus(HttpStatus.INTERNAL_SERVER_ERROR, getRootCauseMessage(exception)) + } + + @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) + @ExceptionHandler(MybatisPlusException::class) + fun handleMybatisPlusException( + request: HttpServletRequest, + exception: MybatisPlusException + ): ResponseBodyBean<*> { + requestLog(request) + log.error("MybatisPlusException message: ${exception.message}") + return ResponseBodyBean.ofStatus(HttpStatus.INTERNAL_SERVER_ERROR, getRootCauseMessage(exception)) + } + + @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) + @ExceptionHandler(PersistenceException::class) + fun handlePersistenceException( + request: HttpServletRequest, + exception: PersistenceException + ): ResponseBodyBean<*> { + requestLog(request) + log.error("PersistenceException message: ${exception.message}") + return ResponseBodyBean.ofStatus(HttpStatus.INTERNAL_SERVER_ERROR, getRootCauseMessage(exception)) + } + + @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) + @ExceptionHandler(BadSqlGrammarException::class) + fun handleBadSqlGrammarException( + request: HttpServletRequest, + exception: BadSqlGrammarException + ): ResponseBodyBean<*> { + requestLog(request) + log.error("BadSqlGrammarException message: {}", exception.message) + return ResponseBodyBean.ofStatus(HttpStatus.INTERNAL_SERVER_ERROR, getRootCauseMessage(exception)) + } + + private fun requestLog(request: HttpServletRequest) { + log.error("Exception occurred when [${getRequestIpAndPort(request)}] requested access. Request URL: [${request.method}] ${request.requestURL}") + } +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/aspect/FeignClientLogAspect.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/aspect/FeignClientLogAspect.java deleted file mode 100644 index 64ca593d..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/aspect/FeignClientLogAspect.java +++ /dev/null @@ -1,171 +0,0 @@ -package com.jmsoftware.maf.springcloudstarter.aspect; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.stream.StreamUtil; -import cn.hutool.core.text.CharSequenceUtil; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.json.JSONUtil; -import lombok.extern.slf4j.Slf4j; -import lombok.val; -import org.aspectj.lang.JoinPoint; -import org.aspectj.lang.ProceedingJoinPoint; -import org.aspectj.lang.annotation.Around; -import org.aspectj.lang.annotation.Aspect; -import org.aspectj.lang.annotation.Pointcut; -import org.aspectj.lang.reflect.MethodSignature; -import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.web.bind.annotation.*; - -import java.lang.annotation.Annotation; -import java.lang.reflect.Method; -import java.time.Duration; -import java.time.Instant; -import java.util.Collections; -import java.util.Optional; -import java.util.Set; - -/** - *

FeignClientLogAspect

- *

- * Change description here. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com, 2/1/22 1:10 PM - * @see - * @FeignClient cannot be used as a pointcut by Spring aop - **/ -@Slf4j -@Aspect -public class FeignClientLogAspect { - private static final String LINE_SEPARATOR = System.lineSeparator(); - private static final Set> REQUEST_MAPPING_SET = Collections.unmodifiableSet(CollUtil.newHashSet( - RequestMapping.class, - GetMapping.class, - PostMapping.class, - PutMapping.class, - DeleteMapping.class, - PatchMapping.class - )); - private static final String BEFORE_TEMPLATE = LINE_SEPARATOR + - "============ FEIGN CLIENT LOG (@Before) ============" + LINE_SEPARATOR + - "Feign URL : [{}] {}" + LINE_SEPARATOR + - "Class Method : {}#{}" + LINE_SEPARATOR + - "Request Params :" + LINE_SEPARATOR + "{}"; - private static final String AROUND_TEMPLATE = LINE_SEPARATOR + - "============ FEIGN CLIENT LOG (@Around) ============" + LINE_SEPARATOR + - "Feign URL : [{}] {}" + LINE_SEPARATOR + - "Class Method : {}#{}" + LINE_SEPARATOR + - "Elapsed Time : {} ms" + LINE_SEPARATOR + - "Feign Request Params :" + LINE_SEPARATOR + "{}" + LINE_SEPARATOR + - "Feign Response Params:" + LINE_SEPARATOR + "{}"; - - @Pointcut("@within(org.springframework.cloud.openfeign.FeignClient)" + - " || @annotation(org.springframework.cloud.openfeign.FeignClient)") - public void feignClientPointcut() { - // Do nothing - } - - // @Before("feignClientPointcut()") - @SuppressWarnings({"unused", "AlibabaCommentsMustBeJavadocFormat"}) - public void beforeHandleRequest(JoinPoint joinPoint) { - val signature = joinPoint.getSignature(); - if (!(signature instanceof MethodSignature)) { - return; - } - log.info(BEFORE_TEMPLATE, - this.getFeignMethod((MethodSignature) signature).toUpperCase(), - this.getFeignUrl((MethodSignature) signature), - signature.getDeclaringTypeName(), signature.getName(), - JSONUtil.toJsonStr(joinPoint.getArgs())); - } - - @Around("feignClientPointcut()") - public Object feignClientAround(ProceedingJoinPoint joinPoint) throws Throwable { - val startInstant = Instant.now(); - val result = joinPoint.proceed(); - val duration = Duration.between(startInstant, Instant.now()); - val signature = joinPoint.getSignature(); - if (!(signature instanceof MethodSignature)) { - return result; - } - String response; - try { - response = JSONUtil.toJsonStr(result); - } catch (Exception e) { - log.warn("Failed to convert response to JSON string. {}", e.getMessage()); - response = ObjectUtil.toString(result); - } - log.info(AROUND_TEMPLATE, - this.getFeignMethod((MethodSignature) signature).toUpperCase(), - this.getFeignUrl((MethodSignature) signature), - signature.getDeclaringTypeName(), signature.getName(), - duration.toMillis(), - JSONUtil.toJsonStr(joinPoint.getArgs()), - response); - return result; - } - - @SuppressWarnings("HttpUrlsUsage") - private String getFeignUrl(MethodSignature methodSignature) { - val method = methodSignature.getMethod(); - val feignClientClass = method.getDeclaringClass(); - val feignClient = feignClientClass.getAnnotation(FeignClient.class); - val feignUrl = new StringBuilder("http://"); - this.concatDomain(feignClient, feignUrl); - this.concatPath(method, feignUrl); - return feignUrl.toString(); - } - - private String getFeignMethod(MethodSignature methodSignature) { - return Optional.ofNullable(methodSignature.getMethod().getAnnotations()) - .map(annotations -> annotations[0]) - .map(annotation -> CharSequenceUtil.removeAll( - annotation.annotationType().getSimpleName(), "Mapping" - )) - .orElse(""); - } - - private void concatPath(Method method, StringBuilder feignUrl) { - StreamUtil.of(method.getAnnotations()) - .filter(annotation -> REQUEST_MAPPING_SET.contains(annotation.annotationType())) - .findAny() - .ifPresent(annotation -> feignUrl.append(this.getFirstValue(annotation))); - } - - private String getFirstValue(Annotation annotation) { - if (annotation instanceof RequestMapping) { - return ((RequestMapping) annotation).value()[0]; - } - if (annotation instanceof GetMapping) { - return ((GetMapping) annotation).value()[0]; - } - if (annotation instanceof PostMapping) { - return ((PostMapping) annotation).value()[0]; - } - if (annotation instanceof PutMapping) { - return ((PutMapping) annotation).value()[0]; - } - if (annotation instanceof DeleteMapping) { - return ((DeleteMapping) annotation).value()[0]; - } - if (annotation instanceof PatchMapping) { - return ((PatchMapping) annotation).value()[0]; - } - return ""; - } - - private void concatDomain(FeignClient feignClient, StringBuilder feignUrl) { - if (CharSequenceUtil.isNotBlank(feignClient.value())) { - feignUrl.append(feignClient.value()); - return; - } - if (CharSequenceUtil.isNotBlank(feignClient.url())) { - feignUrl.append(feignClient.url()); - return; - } - if (CharSequenceUtil.isNotBlank(feignClient.name())) { - feignUrl.append(feignClient.name()); - return; - } - feignUrl.append("unrecognized"); - } -} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/aspect/FeignClientLogAspect.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/aspect/FeignClientLogAspect.kt new file mode 100644 index 00000000..b8ac17d6 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/aspect/FeignClientLogAspect.kt @@ -0,0 +1,172 @@ +package com.jmsoftware.maf.springcloudstarter.aspect + +import cn.hutool.core.stream.StreamUtil +import cn.hutool.core.text.CharSequenceUtil +import cn.hutool.core.util.ObjectUtil +import cn.hutool.json.JSONUtil +import com.jmsoftware.maf.common.util.logger +import org.aspectj.lang.JoinPoint +import org.aspectj.lang.ProceedingJoinPoint +import org.aspectj.lang.annotation.Around +import org.aspectj.lang.annotation.Aspect +import org.aspectj.lang.annotation.Pointcut +import org.aspectj.lang.reflect.MethodSignature +import org.springframework.cloud.openfeign.FeignClient +import org.springframework.web.bind.annotation.* +import java.lang.reflect.Method +import java.time.Duration +import java.time.Instant +import java.util.* + +/** + * # FeignClientLogAspect + * + * Change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/14/22 8:05 AM + * @see @FeignClient cannot be used as a pointcut by Spring aop + */ +@Aspect +@Suppress("unused") +class FeignClientLogAspect { + companion object { + private val log = logger() + private val REQUEST_MAPPING_SET = setOf( + RequestMapping::class.java, + GetMapping::class.java, + PostMapping::class.java, + PutMapping::class.java, + DeleteMapping::class.java, + PatchMapping::class.java + ) + private val BEFORE_TEMPLATE: String = + """ + + ============ FEIGN CLIENT LOG (@Before) ============ + Feign URL : [{}] {} + Class Method : {}#{} + Request Params : + {} + """.trimIndent() + private val AROUND_TEMPLATE: String = + """ + + ============ FEIGN CLIENT LOG (@Around) ============ + Feign URL : [{}] {} + Class Method : {}#{} + Elapsed Time : {} ms + Feign Request Params : + {} + Feign Response Params: + {} + """.trimIndent() + } + + @Pointcut( + "@within(org.springframework.cloud.openfeign.FeignClient)" + + " || @annotation(org.springframework.cloud.openfeign.FeignClient)" + ) + fun feignClientPointcut() { + // Do nothing + } + + // @Before("feignClientPointcut()") + fun beforeHandleRequest(joinPoint: JoinPoint) { + val signature = joinPoint.signature as? MethodSignature ?: return + log.info( + BEFORE_TEMPLATE, + getFeignMethod(signature).uppercase(Locale.getDefault()), + getFeignUrl(signature), + signature.declaringTypeName, signature.name, + JSONUtil.toJsonStr(joinPoint.args) + ) + } + + @Around("feignClientPointcut()") + fun feignClientAround(joinPoint: ProceedingJoinPoint): Any { + val startInstant = Instant.now() + val result = joinPoint.proceed() + val duration = Duration.between(startInstant, Instant.now()) + val signature = joinPoint.signature as? MethodSignature ?: return result + val response: String = try { + JSONUtil.toJsonStr(result) + } catch (e: Exception) { + log.warn("Failed to convert response to JSON string. {}", e.message) + ObjectUtil.toString(result) + } + log.info( + AROUND_TEMPLATE, + getFeignMethod(signature).uppercase(Locale.getDefault()), + getFeignUrl(signature), + signature.declaringTypeName, signature.name, + duration.toMillis(), + JSONUtil.toJsonStr(joinPoint.args), + response + ) + return result + } + + @Suppress("HttpUrlsUsage") + private fun getFeignUrl(methodSignature: MethodSignature): String { + val method = methodSignature.method + val feignClientClass = method.declaringClass + val feignClient = feignClientClass.getAnnotation(FeignClient::class.java) + val feignUrl = StringBuilder("http://") + concatDomain(feignClient, feignUrl) + concatPath(method, feignUrl) + return feignUrl.toString() + } + + private fun getFeignMethod(methodSignature: MethodSignature): String { + return Optional.ofNullable(methodSignature.method.annotations) + .map { annotations: Array -> annotations[0] } + .map { annotation: Annotation -> + CharSequenceUtil.removeAll(annotation.annotationClass.simpleName, "Mapping") + } + .orElse("") + } + + private fun concatPath(method: Method, feignUrl: StringBuilder) { + StreamUtil.of(*method.annotations) + .filter { annotation: Annotation -> REQUEST_MAPPING_SET.contains(annotation.annotationClass.java) } + .findAny() + .ifPresent { annotation: Annotation -> feignUrl.append(getFirstValue(annotation)) } + } + + private fun getFirstValue(annotation: Annotation): String { + if (annotation is RequestMapping) { + return annotation.value[0] + } + if (annotation is GetMapping) { + return annotation.value[0] + } + if (annotation is PostMapping) { + return annotation.value[0] + } + if (annotation is PutMapping) { + return annotation.value[0] + } + if (annotation is DeleteMapping) { + return annotation.value[0] + } + return if (annotation is PatchMapping) { + annotation.value[0] + } else "" + } + + private fun concatDomain(feignClient: FeignClient, feignUrl: StringBuilder) { + if (CharSequenceUtil.isNotBlank(feignClient.value)) { + feignUrl.append(feignClient.value) + return + } + if (CharSequenceUtil.isNotBlank(feignClient.url)) { + feignUrl.append(feignClient.url) + return + } + if (CharSequenceUtil.isNotBlank(feignClient.name)) { + feignUrl.append(feignClient.name) + return + } + feignUrl.append("unrecognized") + } +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/aspect/TrackableResponseControllerAdvice.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/aspect/TrackableResponseControllerAdvice.kt new file mode 100644 index 00000000..590698ee --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/aspect/TrackableResponseControllerAdvice.kt @@ -0,0 +1,47 @@ +package com.jmsoftware.maf.springcloudstarter.aspect + +import com.jmsoftware.maf.common.bean.TrackableBean +import org.springframework.cloud.sleuth.Tracer +import org.springframework.core.MethodParameter +import org.springframework.http.MediaType +import org.springframework.http.converter.HttpMessageConverter +import org.springframework.http.server.ServerHttpRequest +import org.springframework.http.server.ServerHttpResponse +import org.springframework.web.bind.annotation.RestControllerAdvice +import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice + +/** + * # TrackableResponseControllerAdvice + * + * Change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/12/22 9:48 PM + */ +@RestControllerAdvice +class TrackableResponseControllerAdvice( + private val tracer: Tracer +) : ResponseBodyAdvice { + override fun supports( + returnType: MethodParameter, + converterType: Class> + ): Boolean { + return TrackableBean::class.java == returnType.parameterType.superclass + } + + override fun beforeBodyWrite( + body: TrackableBean?, + returnType: MethodParameter, + selectedContentType: MediaType, + selectedConverterType: Class>, + request: ServerHttpRequest, + response: ServerHttpResponse + ): TrackableBean? { + if (tracer.currentSpan() == null) { + body?.track = "No trace" + return body + } + val traceContext = tracer.currentSpan()?.context() + body?.track = "${traceContext?.traceId()}#${traceContext?.spanId()}" + return body + } +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/aspect/WebRequestLogAspect.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/aspect/WebRequestLogAspect.java deleted file mode 100644 index 291c7de1..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/aspect/WebRequestLogAspect.java +++ /dev/null @@ -1,143 +0,0 @@ -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.springcloudstarter.util.RequestUtil; -import com.jmsoftware.maf.springcloudstarter.util.UserUtil; -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.springframework.web.context.request.RequestContextHolder; -import org.springframework.web.context.request.ServletRequestAttributes; - -import java.time.Duration; -import java.time.Instant; - -/** - *

RequestLogAspect

- *

Description:

- *

RequestLogAspect is an AOP for logging URL, HTTP method, client IP and other information when web resource was - * accessed.

- *

Feature:

- *

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 - * @date 2019-05-05 19:55 - **/ -@Slf4j -@Aspect -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`. - *

- * 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)") - public void requestLogPointcut() { - // Do nothing - } - - /** - * Before controller handle client request (on client sent a request). - *

- * `@Before` annotated methods run exactly before the all methods matching with pointcut expression. - * - * @param joinPoint a point of execution of the program - */ - @Before("requestLogPointcut()") - public void beforeHandleRequest(JoinPoint joinPoint) { - val attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); - assert attributes != null; - val request = attributes.getRequest(); - log.info(BEFORE_TEMPLATE, request.getRequestURL().toString(), request.getMethod(), - RequestUtil.getRequestIpAndPort(request), UserUtil.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); - } - - /** - * Around controller's method processes client request. 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 controller's method returned - * @throws Throwable any exceptions that controller's method may throw - */ - @Around("requestLogPointcut()") - public Object aroundHandleRequest(ProceedingJoinPoint proceedingJoinPoint) throws Throwable { - val startInstant = Instant.now(); - val result = proceedingJoinPoint.proceed(); - val duration = Duration.between(startInstant, Instant.now()); - try { - 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(AROUND_TEMPLATE_FOR_JSON, LINE_SEPARATOR, formattedJsonString); - } catch (JsonProcessingException e) { - log.info(AROUND_TEMPLATE_FOR_NON_JSON, result); - } - log.info(AROUND_TEMPLATE_END, duration, duration.toMillis()); - return result; - } - - /** - * `@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 = "requestLogPointcut()", throwing = "e") - public void afterThrowingException(JoinPoint joinPoint, Exception e) { - 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/aspect/WebRequestLogAspect.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/aspect/WebRequestLogAspect.kt new file mode 100644 index 00000000..499d4597 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/aspect/WebRequestLogAspect.kt @@ -0,0 +1,176 @@ +package com.jmsoftware.maf.springcloudstarter.aspect + +import cn.hutool.core.text.CharSequenceUtil +import cn.hutool.json.JSONUtil +import com.fasterxml.jackson.core.JsonProcessingException +import com.fasterxml.jackson.databind.ObjectMapper +import com.jmsoftware.maf.common.util.logger +import com.jmsoftware.maf.springcloudstarter.util.currentUsername +import com.jmsoftware.maf.springcloudstarter.util.getRequestIpAndPort +import org.aspectj.lang.JoinPoint +import org.aspectj.lang.ProceedingJoinPoint +import org.aspectj.lang.annotation.* +import org.springframework.web.context.request.RequestContextHolder +import org.springframework.web.context.request.ServletRequestAttributes +import java.time.Duration +import java.time.Instant + +/** + * # RequestLogAspect + * + * **Description**: + * + * RequestLogAspect is an AOP for logging URL, HTTP method, client IP and other information when web resource was + * accessed. + * + * **Feature**: + * + * 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 (锺俊), e-mail: johnnysviva@outlook.com, date: 4/14/22 9:14 AM + */ +@Aspect +@Suppress("unused") +class WebRequestLogAspect( + private val objectMapper: ObjectMapper +) { + companion object { + private val log = logger() + private const val MAX_LENGTH_OF_JSON_STRING = 500 + private val BEFORE_TEMPLATE: String = + """ + + ============ WEB REQUEST LOG AOP (@Before) ============ + URL : {} + HTTP Method : {} + Client[IPv46:Port] : {} + Username : {} + Class Method : {}#{} + Request Params : + {} + """.trimIndent() + private val AFTER_TEMPLATE: String = + """ + + ============ WEB REQUEST LOG AOP (@After) ============= + """.trimIndent() + private val AROUND_TEMPLATE_FOR_JSON: String = + """ + + Response : + {} + """.trimIndent() + private val AROUND_TEMPLATE_FOR_NON_JSON: String = + """ + + Response (non-JSON): {} + """.trimIndent() + private val AROUND_TEMPLATE_END: String = + """ + + Elapsed time : {} ({} ms) + ============ WEB REQUEST LOG AOP (@Around) ============ + """.trimIndent() + private val AFTER_THROWING_TEMPLATE: String = + """ + + Signature : {} + Exception : {}, message: {} + ======== WEB REQUEST LOG AOP (@AfterThrowing) ========= + """.trimIndent() + } + + /** + * 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`. + * + * More detail at: [Spring AOP AspectJ pointcut expression examples](https://howtodoinjava.com/spring-aop/aspectj-pointcut-expressions/) + */ + @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)" + ) + fun requestLogPointcut() { + // Do nothing + } + + /** + * Before controller handle client request (on client sent a request). + * + * `@Before` annotated methods run exactly before the all methods matching with pointcut expression. + * + * @param joinPoint a point of execution of the program + */ + @Before("requestLogPointcut()") + fun beforeHandleRequest(joinPoint: JoinPoint) { + val attributes = RequestContextHolder.getRequestAttributes() as ServletRequestAttributes + val request = attributes.request + log.info( + BEFORE_TEMPLATE, request.requestURL.toString(), request.method, + getRequestIpAndPort(request), currentUsername(), + joinPoint.signature.declaringTypeName, joinPoint.signature.name, + JSONUtil.toJsonStr(joinPoint.args) + ) + } + + /** + * `@After` annotated methods run exactly after the all methods matching with pointcut expression. + */ + @After("requestLogPointcut()") + fun afterHandleRequest() { + log.info(AFTER_TEMPLATE) + } + + /** + * Around controller's method processes client request. Around advice can perform custom behavior before and after + * the method invocation. + * + * @param proceedingJoinPoint the object can perform method invocation + * @return any value (maybe void) that controller's method returned + * @throws Throwable any exceptions that controller's method may throw + */ + @Around("requestLogPointcut()") + fun aroundHandleRequest(proceedingJoinPoint: ProceedingJoinPoint): Any { + val startInstant = Instant.now() + val result = proceedingJoinPoint.proceed() + val duration = Duration.between(startInstant, Instant.now()) + try { + var formattedJsonString = JSONUtil.formatJsonStr(objectMapper.writeValueAsString(result)) + if (formattedJsonString.length > MAX_LENGTH_OF_JSON_STRING) { + val substring = formattedJsonString.substring(0, MAX_LENGTH_OF_JSON_STRING - 1) + formattedJsonString = CharSequenceUtil.format( + "{}… [The length({}) of JSON string is larger than the maximum({})]", substring, + formattedJsonString.length, MAX_LENGTH_OF_JSON_STRING + ) + } + log.info(AROUND_TEMPLATE_FOR_JSON, formattedJsonString) + } catch (e: JsonProcessingException) { + log.info(AROUND_TEMPLATE_FOR_NON_JSON, result) + } + log.info(AROUND_TEMPLATE_END, duration, duration.toMillis()) + return result + } + + /** + * `@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 = "requestLogPointcut()", throwing = "e") + fun afterThrowingException(joinPoint: JoinPoint, e: Exception) { + log.error( + AFTER_THROWING_TEMPLATE, + joinPoint.signature.toShortString(), + e.toString(), + e.message + ) + } +} 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 deleted file mode 100644 index 94fb2034..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/configuration/AsyncConfiguration.java +++ /dev/null @@ -1,102 +0,0 @@ -package com.jmsoftware.maf.springcloudstarter.configuration; - -import com.jmsoftware.maf.springcloudstarter.property.MafProjectProperties; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import lombok.val; -import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler; -import org.springframework.aop.interceptor.SimpleAsyncUncaughtExceptionHandler; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration; -import org.springframework.boot.task.TaskExecutorCustomizer; -import org.springframework.context.annotation.Bean; -import org.springframework.scheduling.annotation.AsyncConfigurer; -import org.springframework.scheduling.annotation.EnableAsync; -import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; -import org.springframework.web.context.request.NativeWebRequest; -import org.springframework.web.context.request.async.CallableProcessingInterceptor; -import org.springframework.web.context.request.async.TimeoutCallableProcessingInterceptor; - -import java.util.concurrent.Callable; -import java.util.concurrent.Executor; - -import static cn.hutool.core.text.CharSequenceUtil.format; -import static org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration.APPLICATION_TASK_EXECUTOR_BEAN_NAME; - -/** - * Description: AsyncConfiguration, change description here. - * - * @author 钟俊(zhongjun), email: zhongjun@toguide.cn, date: 1/29/2021 4:39 PM - * @see TaskExecutionAutoConfiguration - **/ -@Slf4j -@EnableAsync -@RequiredArgsConstructor -public class AsyncConfiguration { - private static final int QUEUE_CAPACITY = 10000; - private final MafProjectProperties mafProjectProperties; - - /** - *

Note: In the above example the {@code ThreadPoolTaskExecutor} is not a fully managed - * Spring bean. Add the {@code @Bean} annotation to the {@code getAsyncExecutor()} method - * if you want a fully managed bean. In such circumstances it is no longer necessary to - * manually call the {@code executor.initialize()} method as this will be invoked - * automatically when the bean is initialized. - *

- * - * @return customized async task executor - * @see ThreadPoolTaskExecutor - */ - @Bean - public TaskExecutorCustomizer asyncTaskExecutorCustomizer() { - val corePoolSize = Runtime.getRuntime().availableProcessors() * 2; - return taskExecutor -> { - taskExecutor.setCorePoolSize(corePoolSize); - taskExecutor.setMaxPoolSize(corePoolSize * 3); - taskExecutor.setQueueCapacity(QUEUE_CAPACITY); - taskExecutor.setBeanName("asyncTaskExecutor"); - taskExecutor.setThreadNamePrefix(format("{}-async-", this.mafProjectProperties.getProjectArtifactId())); - // Specify the RejectedExecutionHandler to use for the ExecutorService. - // Default is the ExecutorService's default abort policy. - taskExecutor.setRejectedExecutionHandler( - (runnable, executor1) -> - log.error( - "Captured rejected execution. Runnable: {}, executor task count: {}", - runnable.toString(), executor1.getTaskCount() - ) - ); - log.warn("Enhanced taskExecutor. corePoolSize = {}, maxPoolSize = {}, queueCapacity = {}", - taskExecutor.getCorePoolSize(), taskExecutor.getMaxPoolSize(), QUEUE_CAPACITY); - }; - } - - @Bean - public AsyncConfigurer asyncConfigurer( - @Qualifier(APPLICATION_TASK_EXECUTOR_BEAN_NAME) ThreadPoolTaskExecutor threadPoolTaskExecutor - ) { - log.warn("Initial bean: '{}'", AsyncConfigurer.class.getSimpleName()); - return new AsyncConfigurer() { - @Override - public Executor getAsyncExecutor() { - return threadPoolTaskExecutor; - } - - @Override - public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() { - return new SimpleAsyncUncaughtExceptionHandler(); - } - }; - } - - @Bean - public CallableProcessingInterceptor callableProcessingInterceptor() { - log.warn("Initial bean: {}", CallableProcessingInterceptor.class.getSimpleName()); - return new TimeoutCallableProcessingInterceptor() { - @Override - public Object handleTimeout(NativeWebRequest request, Callable task) throws Exception { - log.error("Handling task timeout!"); - return super.handleTimeout(request, task); - } - }; - } -} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/configuration/AsyncConfiguration.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/configuration/AsyncConfiguration.kt new file mode 100644 index 00000000..fa1f1c0b --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/configuration/AsyncConfiguration.kt @@ -0,0 +1,95 @@ +package com.jmsoftware.maf.springcloudstarter.configuration + +import com.jmsoftware.maf.common.util.logger +import com.jmsoftware.maf.springcloudstarter.property.MafProjectProperties +import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler +import org.springframework.aop.interceptor.SimpleAsyncUncaughtExceptionHandler +import org.springframework.beans.factory.annotation.Qualifier +import org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration +import org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration.APPLICATION_TASK_EXECUTOR_BEAN_NAME +import org.springframework.boot.task.TaskExecutorCustomizer +import org.springframework.context.annotation.Bean +import org.springframework.scheduling.annotation.AsyncConfigurer +import org.springframework.scheduling.annotation.EnableAsync +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor +import org.springframework.web.context.request.NativeWebRequest +import org.springframework.web.context.request.async.CallableProcessingInterceptor +import org.springframework.web.context.request.async.TimeoutCallableProcessingInterceptor +import java.util.concurrent.Callable +import java.util.concurrent.Executor +import java.util.concurrent.ThreadPoolExecutor + +/** + * # AsyncConfiguration + * + * Description: AsyncConfiguration, change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/14/22 10:26 AM + * @see TaskExecutionAutoConfiguration + */ +@EnableAsync +class AsyncConfiguration( + private val mafProjectProperties: MafProjectProperties +) { + companion object { + private const val QUEUE_CAPACITY = 10000 + private val log = logger() + } + + /** + * + * Note: In the above example the `ThreadPoolTaskExecutor` is not a fully managed + * Spring bean. Add the `@Bean` annotation to the `getAsyncExecutor()` method + * if you want a fully managed bean. In such circumstances it is no longer necessary to + * manually call the `executor.initialize()` method as this will be invoked + * automatically when the bean is initialized. + * + * + * @return customized async task executor + * @see ThreadPoolTaskExecutor + */ + @Bean + fun asyncTaskExecutorCustomizer(): TaskExecutorCustomizer { + val corePoolSize = Runtime.getRuntime().availableProcessors() * 2 + return TaskExecutorCustomizer { taskExecutor: ThreadPoolTaskExecutor -> + taskExecutor.corePoolSize = corePoolSize + taskExecutor.maxPoolSize = corePoolSize * 3 + taskExecutor.setQueueCapacity(QUEUE_CAPACITY) + taskExecutor.setBeanName("asyncTaskExecutor") + taskExecutor.setThreadNamePrefix("${mafProjectProperties.projectArtifactId}-async-executor-") + // Specify the RejectedExecutionHandler to use for the ExecutorService. + // Default is the ExecutorService's default abort policy. + taskExecutor.setRejectedExecutionHandler { runnable: Runnable, executor1: ThreadPoolExecutor -> + log.error("Captured rejected execution. Runnable: $runnable, executor task count: ${executor1.taskCount}") + } + log.warn("Enhanced taskExecutor. corePoolSize = ${taskExecutor.corePoolSize}, maxPoolSize = ${taskExecutor.maxPoolSize}, queueCapacity = $QUEUE_CAPACITY") + } + } + + @Bean + fun asyncConfigurer( + @Qualifier(APPLICATION_TASK_EXECUTOR_BEAN_NAME) threadPoolTaskExecutor: ThreadPoolTaskExecutor + ): AsyncConfigurer { + log.warn("Initial bean: `${AsyncConfigurer::class.java.simpleName}`") + return object : AsyncConfigurer { + override fun getAsyncExecutor(): Executor { + return threadPoolTaskExecutor + } + + override fun getAsyncUncaughtExceptionHandler(): AsyncUncaughtExceptionHandler { + return SimpleAsyncUncaughtExceptionHandler() + } + } + } + + @Bean + fun callableProcessingInterceptor(): CallableProcessingInterceptor { + log.warn("Initial bean: {}", CallableProcessingInterceptor::class.java.simpleName) + return object : TimeoutCallableProcessingInterceptor() { + override fun handleTimeout(request: NativeWebRequest, task: Callable): Any { + log.error("Handling task timeout!") + return super.handleTimeout(request, task) + } + } + } +} 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 deleted file mode 100644 index cbef201a..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/configuration/JacksonConfiguration.java +++ /dev/null @@ -1,47 +0,0 @@ -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 com.jmsoftware.maf.common.constant.UniversalDateTime; -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 { - private final JacksonProperties jacksonProperties; - - @Bean - public LocalDateTimeSerializer localDateTimeSerializer() { - var pattern = UniversalDateTime.DATE_TIME_FORMAT; - if (StrUtil.isNotBlank(this.jacksonProperties.getDateFormat())) { - pattern = this.jacksonProperties.getDateFormat(); - } - return new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(pattern)); - } - - @Bean - public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer(LocalDateTimeSerializer localDateTimeSerializer) { - var pattern = UniversalDateTime.DATE_TIME_FORMAT; - if (StrUtil.isNotBlank(this.jacksonProperties.getDateFormat())) { - pattern = this.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/JacksonConfiguration.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/configuration/JacksonConfiguration.kt new file mode 100644 index 00000000..86444559 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/configuration/JacksonConfiguration.kt @@ -0,0 +1,48 @@ +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 com.jmsoftware.maf.common.constant.UniversalDateTime +import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer +import org.springframework.boot.autoconfigure.jackson.JacksonProperties +import org.springframework.context.annotation.Bean +import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder +import java.time.LocalDateTime +import java.time.format.DateTimeFormatter + +/** + * # JacksonConfiguration + * + * Description: JacksonConfiguration, change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/14/22 10:33 AM + */ +class JacksonConfiguration( + private val jacksonProperties: JacksonProperties +) { + @Bean + fun localDateTimeSerializer(): LocalDateTimeSerializer { + var pattern: String = UniversalDateTime.DATE_TIME_FORMAT + if (StrUtil.isNotBlank(jacksonProperties.dateFormat)) { + pattern = jacksonProperties.dateFormat + } + return LocalDateTimeSerializer(DateTimeFormatter.ofPattern(pattern)) + } + + @Bean + fun jackson2ObjectMapperBuilderCustomizer(localDateTimeSerializer: LocalDateTimeSerializer): Jackson2ObjectMapperBuilderCustomizer { + var pattern: String? = UniversalDateTime.DATE_TIME_FORMAT + if (StrUtil.isNotBlank(jacksonProperties.dateFormat)) { + pattern = jacksonProperties.dateFormat + } + val localDateTimeDeserializer = LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(pattern)) + return Jackson2ObjectMapperBuilderCustomizer { jackson2ObjectMapperBuilder: Jackson2ObjectMapperBuilder -> + jackson2ObjectMapperBuilder + .serializerByType(LocalDateTime::class.java, localDateTimeSerializer) + .deserializerByType(LocalDateTime::class.java, localDateTimeDeserializer) + .serializerByType(Long::class.java, ToStringSerializer.instance) + } + } +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/configuration/OpenApiConfiguration.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/configuration/OpenApiConfiguration.java deleted file mode 100644 index 13ff295b..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/configuration/OpenApiConfiguration.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.jmsoftware.maf.springcloudstarter.configuration; - -import cn.hutool.core.text.CharSequenceUtil; -import com.jmsoftware.maf.springcloudstarter.property.MafProjectProperties; -import io.swagger.v3.oas.models.OpenAPI; -import io.swagger.v3.oas.models.info.Contact; -import io.swagger.v3.oas.models.info.Info; -import io.swagger.v3.oas.models.info.License; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import lombok.val; -import org.springdoc.core.customizers.OpenApiCustomiser; -import org.springframework.context.annotation.Bean; - -/** - *

OpenApiConfiguration

- *

- * Change description here. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com, 2/2/22 2:25 AM - **/ -@Slf4j -@RequiredArgsConstructor -public class OpenApiConfiguration { - private static final String DEV = "development"; - private final MafProjectProperties mafProjectProperties; - - @Bean - public OpenAPI openApi() { - val projectArtifactId = this.mafProjectProperties.getProjectArtifactId(); - val version = this.mafProjectProperties.getVersion(); - val developerEmail = this.mafProjectProperties.getDeveloperEmail(); - val developerUrl = this.mafProjectProperties.getDeveloperUrl(); - return new OpenAPI() - .info( - new Info() - .title(String.format("API for %s@%s", projectArtifactId, version)) - .description( - String.format("%s, artifact ID: %s, environment: %s", - this.mafProjectProperties.getDescription(), - projectArtifactId, - this.mafProjectProperties.getEnvironment()) - ) - .contact( - new Contact() - .name(this.mafProjectProperties.getDeveloperName()) - .email(developerEmail) - .url(developerUrl) - ) - .version(version) - .license(new License().name("LinkedIn").url(developerUrl)) - ); - } - - @Bean - public OpenApiCustomiser openApiCustomiser() { - return openApi -> openApi.getServers().forEach(server -> { - if (!CharSequenceUtil.containsIgnoreCase(this.mafProjectProperties.getEnvironment(), DEV)) { - server.setUrl( - String.format("%s/%s", server.getUrl(), this.mafProjectProperties.getProjectArtifactId())); - } - server.setDescription( - String.format("Modified server URL - %s", this.mafProjectProperties.getProjectArtifactId())); - log.info("Modified server, {}", server); - }); - } -} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/configuration/OpenApiConfiguration.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/configuration/OpenApiConfiguration.kt new file mode 100644 index 00000000..db1b4826 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/configuration/OpenApiConfiguration.kt @@ -0,0 +1,69 @@ +package com.jmsoftware.maf.springcloudstarter.configuration + +import cn.hutool.core.text.CharSequenceUtil +import com.jmsoftware.maf.common.util.logger +import com.jmsoftware.maf.springcloudstarter.property.MafProjectProperties +import io.swagger.v3.oas.models.OpenAPI +import io.swagger.v3.oas.models.info.Contact +import io.swagger.v3.oas.models.info.Info +import io.swagger.v3.oas.models.info.License +import io.swagger.v3.oas.models.servers.Server +import org.springdoc.core.customizers.OpenApiCustomiser +import org.springframework.context.annotation.Bean +import java.util.function.Consumer + +/** + * # OpenApiConfiguration + * + * Change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/14/22 10:41 AM + */ +class OpenApiConfiguration( + private val mafProjectProperties: MafProjectProperties +) { + companion object { + private const val DEV = "development" + private val log = logger() + } + + @Bean + fun openApi(): OpenAPI { + val projectArtifactId = mafProjectProperties.projectArtifactId + val version = mafProjectProperties.version + val developerEmail = mafProjectProperties.developerEmail + val developerUrl = mafProjectProperties.developerUrl + return OpenAPI() + .info( + Info() + .title("API for $projectArtifactId@$version") + .description("${mafProjectProperties.description}, artifact ID: $projectArtifactId, environment: ${mafProjectProperties.environment}") + .contact( + Contact() + .name(mafProjectProperties.developerName) + .email(developerEmail) + .url(developerUrl) + ) + .version(version) + .license(License().name("LinkedIn").url(developerUrl)) + ) + } + + @Bean + @Suppress("SpellCheckingInspection") + fun openApiCustomiser(): OpenApiCustomiser { + return OpenApiCustomiser { openApi: OpenAPI -> + openApi.servers.forEach(Consumer { server: Server -> + if (!CharSequenceUtil.containsIgnoreCase( + mafProjectProperties.environment, DEV + ) + ) { + server.url = CharSequenceUtil.format("{}/{}", server.url, mafProjectProperties.projectArtifactId) + } + server.description = + CharSequenceUtil.format("Modified server URL - {}", mafProjectProperties.projectArtifactId) + OpenApiConfiguration.log.info("Modified server, {}", server) + }) + } + } +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/configuration/OpenFeignConfiguration.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/configuration/OpenFeignConfiguration.java deleted file mode 100644 index 2b1cd96c..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/configuration/OpenFeignConfiguration.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright By ZATI - * Copyright By 3a3c88295d37870dfd3b25056092d1a9209824b256c341f2cdc296437f671617 - * All rights reserved. - * - * If you are not the intended user, you are hereby notified that any use, disclosure, copying, printing, forwarding or - * dissemination of this property is strictly prohibited. If you have got this file in error, delete it from your - * system. - */ -package com.jmsoftware.maf.springcloudstarter.configuration; - -import feign.Target; -import lombok.extern.slf4j.Slf4j; -import org.springframework.cloud.openfeign.CircuitBreakerNameResolver; -import org.springframework.context.annotation.Bean; - -import java.lang.reflect.Method; - -/** - * Description: OpenFeignConfiguration, change description here. - * - * @author 钟俊 (za-zhongjun), email: jun.zhong@zatech.com, date: 2/3/2022 3:52 PM - * @see - * Feign Spring Cloud CircuitBreaker Support - **/ -@Slf4j -@SuppressWarnings("AlibabaClassNamingShouldBeCamel") -public class OpenFeignConfiguration { - @Bean - public CircuitBreakerNameResolver circuitBreakerNameResolver() { - return (String feignClientName, Target target, Method method) -> feignClientName + "_" + method.getName(); - } -} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/configuration/OpenFeignConfiguration.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/configuration/OpenFeignConfiguration.kt new file mode 100644 index 00000000..8ee5b2ac --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/configuration/OpenFeignConfiguration.kt @@ -0,0 +1,21 @@ +package com.jmsoftware.maf.springcloudstarter.configuration + +import feign.Target +import org.springframework.cloud.openfeign.CircuitBreakerNameResolver +import org.springframework.context.annotation.Bean +import java.lang.reflect.Method + +/** + * # OpenFeignConfiguration + * + * Description: OpenFeignConfiguration, change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/14/22 10:45 AM + * @see Feign Spring Cloud CircuitBreaker Support + */ +class OpenFeignConfiguration { + @Bean + fun circuitBreakerNameResolver(): CircuitBreakerNameResolver { + return CircuitBreakerNameResolver { feignClientName: String, _: Target<*>, method: Method -> feignClientName + "_" + method.name } + } +} 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 deleted file mode 100644 index cfb98fdf..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/configuration/RestTemplateConfiguration.java +++ /dev/null @@ -1,39 +0,0 @@ -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/RestTemplateConfiguration.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/configuration/RestTemplateConfiguration.kt new file mode 100644 index 00000000..a7f2c3be --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/configuration/RestTemplateConfiguration.kt @@ -0,0 +1,43 @@ +package com.jmsoftware.maf.springcloudstarter.configuration + +import com.jmsoftware.maf.common.util.logger +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 + +/** + * # RestTemplateConfiguration + * + * Description: RestTemplateConfiguration, change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/14/22 10:46 AM + */ +class RestTemplateConfiguration { + companion object { + private val log = logger() + } + + @Bean + @LoadBalanced + fun restTemplate(): RestTemplate { + val poolingHttpClientConnectionManager = PoolingHttpClientConnectionManager() + poolingHttpClientConnectionManager.maxTotal = 1000 + poolingHttpClientConnectionManager.defaultMaxPerRoute = 1000 + val httpClientBuilder = HttpClients.custom() + httpClientBuilder.setConnectionManager(poolingHttpClientConnectionManager) + val httpClient = httpClientBuilder.build() + val httpComponentsClientHttpRequestFactory = HttpComponentsClientHttpRequestFactory(httpClient) + httpComponentsClientHttpRequestFactory.setConnectTimeout(6000) + httpComponentsClientHttpRequestFactory.setReadTimeout(6000) + httpComponentsClientHttpRequestFactory.setConnectionRequestTimeout(200) + val restTemplate = RestTemplate() + restTemplate.requestFactory = httpComponentsClientHttpRequestFactory + restTemplate.errorHandler = DefaultResponseErrorHandler() + log.warn("Initial bean: '${restTemplate.javaClass.simpleName}'") + return restTemplate + } +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/configuration/SchedulingConfiguration.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/configuration/SchedulingConfiguration.java deleted file mode 100644 index 5a980619..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/configuration/SchedulingConfiguration.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.jmsoftware.maf.springcloudstarter.configuration; - -import com.jmsoftware.maf.springcloudstarter.property.MafProjectProperties; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.boot.autoconfigure.task.TaskSchedulingAutoConfiguration; -import org.springframework.boot.task.TaskSchedulerCustomizer; -import org.springframework.context.annotation.Bean; -import org.springframework.scheduling.annotation.EnableScheduling; - -import static cn.hutool.core.text.CharSequenceUtil.format; - -/** - *

SchedulingConfiguration

- *

- * Change description here. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com, 10/2/21 2:30 PM - * @see TaskSchedulingAutoConfiguration - **/ -@Slf4j -@EnableScheduling -@RequiredArgsConstructor -public class SchedulingConfiguration { - public static final int TASK_SCHEDULER_POOL_SIZE = 2; - private final MafProjectProperties mafProjectProperties; - - @Bean - public TaskSchedulerCustomizer taskSchedulerCustomizer() { - return taskScheduler -> { - taskScheduler.setPoolSize(TASK_SCHEDULER_POOL_SIZE); - taskScheduler.setThreadNamePrefix( - format("{}-task-scheduler-", this.mafProjectProperties.getProjectArtifactId()) - ); - taskScheduler.setAwaitTerminationSeconds(10); - log.warn("Enhanced taskScheduler. poolSize = {}", taskScheduler.getPoolSize()); - }; - } -} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/configuration/SchedulingConfiguration.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/configuration/SchedulingConfiguration.kt new file mode 100644 index 00000000..3b74a36e --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/configuration/SchedulingConfiguration.kt @@ -0,0 +1,37 @@ +package com.jmsoftware.maf.springcloudstarter.configuration + +import com.jmsoftware.maf.common.util.logger +import com.jmsoftware.maf.springcloudstarter.property.MafProjectProperties +import org.springframework.boot.autoconfigure.task.TaskSchedulingAutoConfiguration +import org.springframework.boot.task.TaskSchedulerCustomizer +import org.springframework.context.annotation.Bean +import org.springframework.scheduling.annotation.EnableScheduling +import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler + +/** + * # SchedulingConfiguration + * + * Change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/14/22 10:58 AM + * @see TaskSchedulingAutoConfiguration + */ +@EnableScheduling +class SchedulingConfiguration( + private val mafProjectProperties: MafProjectProperties +) { + companion object { + const val TASK_SCHEDULER_POOL_SIZE = 2 + private val log = logger() + } + + @Bean + fun taskSchedulerCustomizer(): TaskSchedulerCustomizer { + return TaskSchedulerCustomizer { taskScheduler: ThreadPoolTaskScheduler -> + taskScheduler.poolSize = TASK_SCHEDULER_POOL_SIZE + taskScheduler.setThreadNamePrefix("${mafProjectProperties.projectArtifactId}-task-scheduler-") + taskScheduler.setAwaitTerminationSeconds(10) + log.warn("Enhanced taskScheduler. poolSize = {}", taskScheduler.poolSize) + } + } +} 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 deleted file mode 100644 index 1064bee1..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/configuration/TypeConversionConfiguration.java +++ /dev/null @@ -1,62 +0,0 @@ -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/TypeConversionConfiguration.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/configuration/TypeConversionConfiguration.kt new file mode 100644 index 00000000..5ca8d73b --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/configuration/TypeConversionConfiguration.kt @@ -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 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 + +/** + * # TypeConversionConfiguration + * + * Description: TypeConversionConfiguration, change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/14/22 10:58 AM + */ +class TypeConversionConfiguration { + interface StringToLocalDateConverter : Converter + interface StringToLocalTimeConverter : Converter + interface StringToLocalDateTimeConverter : Converter + + @Bean + fun localDateConverter(): StringToLocalDateConverter { + return object : StringToLocalDateConverter { + override fun convert(source: String): LocalDate? { + if (StrUtil.isBlank(source)) { + return null + } + return LocalDateTimeUtil.parseDate(source, UniversalDateTime.DATE_FORMAT) + } + } + } + + @Bean + fun localTimeConverter(): StringToLocalTimeConverter { + return object : StringToLocalTimeConverter { + override fun convert(source: String): LocalTime? { + if (StrUtil.isBlank(source)) { + return null + } + return LocalTime.parse(source, DateTimeFormatter.ofPattern(UniversalDateTime.TIME_FORMAT)) + } + } + } + + @Bean + @ConditionalOnBean(name = ["requestMappingHandlerAdapter"]) + fun localDateTimeConverter(): StringToLocalDateTimeConverter { + return object : StringToLocalDateTimeConverter { + override fun convert(source: String): LocalDateTime? { + if (StrUtil.isBlank(source)) { + return null + } + return LocalDateTimeUtil.parse(source, UniversalDateTime.DATE_TIME_FORMAT) + } + } + } +} 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 deleted file mode 100644 index d723b5f2..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/configuration/WebMvcConfiguration.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.jmsoftware.maf.springcloudstarter.configuration; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.core.task.AsyncTaskExecutor; -import org.springframework.scheduling.annotation.AsyncConfigurer; -import org.springframework.web.context.request.async.CallableProcessingInterceptor; -import org.springframework.web.servlet.config.annotation.AsyncSupportConfigurer; -import org.springframework.web.servlet.config.annotation.CorsRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; - -import java.util.Objects; - -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; - private final AsyncConfigurer asyncConfigurer; - private final CallableProcessingInterceptor callableProcessingInterceptor; - - /** - * 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); - } - - @Override - public void configureAsyncSupport(AsyncSupportConfigurer configurer) { - configurer.setDefaultTimeout(360000) - .setTaskExecutor((AsyncTaskExecutor) Objects.requireNonNull(this.asyncConfigurer.getAsyncExecutor())) - .registerCallableInterceptors(this.callableProcessingInterceptor); - } -} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/configuration/WebMvcConfiguration.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/configuration/WebMvcConfiguration.kt new file mode 100644 index 00000000..6baa97e5 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/configuration/WebMvcConfiguration.kt @@ -0,0 +1,51 @@ +package com.jmsoftware.maf.springcloudstarter.configuration + +import com.jmsoftware.maf.common.util.logger +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor +import org.springframework.web.context.request.async.CallableProcessingInterceptor +import org.springframework.web.cors.CorsConfiguration.ALL +import org.springframework.web.servlet.config.annotation.AsyncSupportConfigurer +import org.springframework.web.servlet.config.annotation.CorsRegistry +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer + +/** + * # WebMvcConfiguration + * + * Spring MVC Configurations. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/14/22 11:02 AM + */ +class WebMvcConfiguration( + private val threadPoolTaskExecutor: ThreadPoolTaskExecutor, + private val callableProcessingInterceptor: CallableProcessingInterceptor +) : WebMvcConfigurer { + companion object { + /** + * 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 const val MAX_AGE_SECS: Long = 3600 + private val log = logger() + } + + /** + * Configure cross origin requests processing. + * + * @param registry CORS registry + */ + override fun addCorsMappings(registry: CorsRegistry) { + log.info("Configuring CORS allowedOrigins: $ALL, allowedMethods: $ALL, allowedHeaders: $ALL") + registry.addMapping("/**") + .allowCredentials(true) + .allowedOriginPatterns(ALL) + .allowedMethods(ALL) + .allowedHeaders(ALL) + .maxAge(MAX_AGE_SECS) + } + + override fun configureAsyncSupport(configurer: AsyncSupportConfigurer) { + configurer.setDefaultTimeout(360000) + .setTaskExecutor(threadPoolTaskExecutor) + .registerCallableInterceptors(callableProcessingInterceptor) + } +} 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 deleted file mode 100644 index f3c4475e..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/configuration/WebSecurityConfiguration.java +++ /dev/null @@ -1,45 +0,0 @@ -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/configuration/WebSecurityConfiguration.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/configuration/WebSecurityConfiguration.kt new file mode 100644 index 00000000..dfe3c166 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/configuration/WebSecurityConfiguration.kt @@ -0,0 +1,45 @@ +package com.jmsoftware.maf.springcloudstarter.configuration + +import com.jmsoftware.maf.common.util.logger +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 (锺俊), e-mail: johnnysviva@outlook.com, date: 4/16/22 10:52 PM + */ +@EnableWebSecurity +class WebSecurityConfiguration : WebSecurityConfigurerAdapter() { + companion object { + private val log = logger() + } + + @PostConstruct + fun postConstruct() { + log.warn("Initial bean: `${WebSecurityConfiguration::class.java.simpleName}`") + } + + public override fun authenticationManager(): AuthenticationManager { + return super.authenticationManagerBean() + } + + override fun configure(http: HttpSecurity) { + // Disable Web Security. + http.authorizeRequests().anyRequest().permitAll().and().csrf().disable().cors().disable() + } + + @Bean + fun bcryptPasswordEncoder(): BCryptPasswordEncoder { + log.warn("Initial bean: `${BCryptPasswordEncoder::class.java.simpleName}`") + return BCryptPasswordEncoder() + } +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/controller/CommonController.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/controller/CommonController.java deleted file mode 100644 index 8da59989..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/controller/CommonController.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.jmsoftware.maf.springcloudstarter.controller; - -import cn.hutool.json.JSON; -import com.jmsoftware.maf.common.bean.ResponseBodyBean; -import com.jmsoftware.maf.common.domain.ValidationTestPayload; -import com.jmsoftware.maf.springcloudstarter.service.CommonService; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.*; - -/** - *

CommonController

- *

- * Change description here. - * - * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 12/29/2020 1:45 PM - **/ -@RestController -@RequiredArgsConstructor -@RequestMapping("/common") -public class CommonController { - private final CommonService commonService; - - @GetMapping("/app-info") - public ResponseBodyBean applicationInformation() { - return ResponseBodyBean.ofSuccess(this.commonService.getApplicationInfo(), "Succeed to retrieve app info."); - } - - @PostMapping("/validation-test") - public ResponseBodyBean validationTest(@RequestBody ValidationTestPayload payload) { - this.commonService.validateObject(payload); - return ResponseBodyBean.ofSuccess(payload.getName(), "validationTest()"); - } -} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/controller/CommonController.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/controller/CommonController.kt new file mode 100644 index 00000000..0f4c991c --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/controller/CommonController.kt @@ -0,0 +1,30 @@ +package com.jmsoftware.maf.springcloudstarter.controller + +import cn.hutool.json.JSON +import com.jmsoftware.maf.common.bean.ResponseBodyBean +import com.jmsoftware.maf.common.domain.ValidationTestPayload +import com.jmsoftware.maf.springcloudstarter.service.CommonService +import org.springframework.web.bind.annotation.* + +/** + * # CommonController + * + * Change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/13/22 2:05 PM + */ +@RestController +@RequestMapping("/common") +class CommonController( + private val commonService: CommonService +) { + @GetMapping("/app-info") + fun applicationInformation(): ResponseBodyBean = + ResponseBodyBean.ofSuccess(commonService.getApplicationInfo(), "Succeed to retrieve app info.") + + @PostMapping("/validation-test") + fun validationTest(@RequestBody payload: ValidationTestPayload): ResponseBodyBean { + commonService.validateObject(payload) + return ResponseBodyBean.ofSuccess(payload.name, "validationTest()") + } +} 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 deleted file mode 100644 index 7963dd0d..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/controller/ControllerBase.java +++ /dev/null @@ -1,22 +0,0 @@ -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/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/controller/GlobalErrorController.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/controller/GlobalErrorController.java deleted file mode 100644 index 7e5385ea..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/controller/GlobalErrorController.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.jmsoftware.maf.springcloudstarter.controller; - -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.error.ErrorAttributeOptions; -import org.springframework.boot.web.servlet.error.ErrorAttributes; -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 -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 = 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 -> { - 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", - 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/GlobalErrorController.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/controller/GlobalErrorController.kt new file mode 100644 index 00000000..327840ba --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/controller/GlobalErrorController.kt @@ -0,0 +1,44 @@ +package com.jmsoftware.maf.springcloudstarter.controller + +import com.jmsoftware.maf.common.util.logger +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.ResponseEntity +import org.springframework.web.bind.annotation.RestController +import javax.servlet.http.HttpServletRequest + +/** + * # ErrorController + * + * Error controller. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/16/22 10:52 PM + */ +@RestController +class GlobalErrorController( + errorAttributes: ErrorAttributes, + serverProperties: ServerProperties, + errorViewResolvers: List +) : BasicErrorController(errorAttributes, serverProperties.error, errorViewResolvers) { + companion object { + private val log = logger() + } + + override fun error(request: HttpServletRequest): ResponseEntity> { + val httpStatus = getStatus(request) + val body = getErrorAttributes(request, ErrorAttributeOptions.defaults()) + body["message"] = httpStatus.reasonPhrase + body["trace"]?.let { + val message = body["message"] + val firstLineOfTrace = it.toString().split("\\n".toRegex())[0] + val joinedMessage = "$message $firstLineOfTrace" + body["message"] = joinedMessage + body["trace"] = "Trace has been simplified by ${this.javaClass.name}. Refer to `message`" + } + log.error("Captured HTTP request error. Response body = {}", body) + return 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 deleted file mode 100644 index f4fc6243..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/controller/HttpApiResourceRemoteApiController.java +++ /dev/null @@ -1,49 +0,0 @@ -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.helper.HttpApiScanHelper; -import com.jmsoftware.maf.springcloudstarter.property.MafConfigurationProperties; -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 -public class HttpApiResourceRemoteApiController { - private final MafConfigurationProperties mafConfigurationProperties; - private final HttpApiScanHelper httpApiScanHelper; - - @GetMapping("/http-api-resources") - public ResponseBodyBean getHttpApiResource() { - val handlerMethodMap = this.httpApiScanHelper.scan(this.mafConfigurationProperties.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/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/controller/HttpApiResourceRemoteApiController.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/controller/HttpApiResourceRemoteApiController.kt new file mode 100644 index 00000000..afdff534 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/controller/HttpApiResourceRemoteApiController.kt @@ -0,0 +1,45 @@ +package com.jmsoftware.maf.springcloudstarter.controller + +import com.jmsoftware.maf.common.bean.ResponseBodyBean +import com.jmsoftware.maf.common.domain.springbootstarter.HttpApiResourcesResponse +import com.jmsoftware.maf.common.domain.springbootstarter.HttpApiResourcesResponse.HttpApiResource +import com.jmsoftware.maf.springcloudstarter.helper.HttpApiScanHelper +import com.jmsoftware.maf.springcloudstarter.property.MafConfigurationProperties +import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.RestController +import org.springframework.web.method.HandlerMethod +import org.springframework.web.servlet.mvc.method.RequestMappingInfo +import java.util.* + +/** + * # HttpApiResourceRemoteApiController + * + * Description: HttpApiResourceRemoteApiController, change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/13/22 1:45 PM + */ +@RestController +class HttpApiResourceRemoteApiController( + private val mafConfigurationProperties: MafConfigurationProperties, + private val httpApiScanHelper: HttpApiScanHelper +) { + @GetMapping("/http-api-resources") + fun httpApiResource(): ResponseBodyBean { + val handlerMethodMap = httpApiScanHelper.scan(mafConfigurationProperties.includedPackageForHttpApiScan) + val response = HttpApiResourcesResponse() + handlerMethodMap.forEach { (requestMappingInfo: RequestMappingInfo, _: HandlerMethod) -> + val requestMethod = ArrayList(requestMappingInfo.methodsCondition.methods)[0] + ?: throw IllegalStateException("Request method mustn't be null!") + val httpApiResource = HttpApiResource() + httpApiResource.method = requestMethod + val patterns = requestMappingInfo.patternsCondition?.patterns + if (patterns?.isNotEmpty() == true) { + httpApiResource.urlPattern = LinkedList(patterns)[0] + } else { + httpApiResource.urlPattern = "/url-pattern-not-found" + } + response.list.add(httpApiResource) + } + return ResponseBodyBean.ofSuccess(response) + } +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/controller/RedirectController.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/controller/RedirectController.java deleted file mode 100644 index f5adfc0d..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/controller/RedirectController.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.jmsoftware.maf.springcloudstarter.controller; - -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 -public class RedirectController { - @PostConstruct - private void postConstruct() { - log.info("URL redirect service initialized."); - } - - @GetMapping("/home") - public void handleHomeRequest(HttpServletResponse response) throws IOException { - // Redirect to home page - response.sendRedirect("static/home/index.html"); - } - - @GetMapping("/doc") - public void handleDocRequest(HttpServletResponse response) throws IOException { - // Redirect to Bootstrap Swagger API documentation - response.sendRedirect( "/doc.html?cache=1&lang=en"); - } - - @GetMapping("/webjars/bycdao-ui/images/api.ico") - public void handleFaviconRequest(HttpServletResponse response) throws IOException { - // Redirect to a customized favicon - response.sendRedirect("/static/asset/favicon.ico"); - } -} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/controller/RedirectController.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/controller/RedirectController.kt new file mode 100644 index 00000000..1a94a9a0 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/controller/RedirectController.kt @@ -0,0 +1,44 @@ +package com.jmsoftware.maf.springcloudstarter.controller + +import com.jmsoftware.maf.common.util.logger +import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.RestController +import javax.annotation.PostConstruct +import javax.servlet.http.HttpServletResponse + +/** + * # RedirectController + * + * HTTP Redirect Controller + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/14/22 11:22 AM + */ +@RestController +class RedirectController { + companion object { + private val log = logger() + } + + @PostConstruct + private fun postConstruct() { + log.info("URL redirect service initialized.") + } + + @GetMapping("/home") + fun handleHomeRequest(response: HttpServletResponse) { + // Redirect to home page + response.sendRedirect("static/home/index.html") + } + + @GetMapping("/doc") + fun handleDocRequest(response: HttpServletResponse) { + // Redirect to Bootstrap Swagger API documentation + response.sendRedirect("/doc.html?cache=1&lang=en") + } + + @GetMapping("/webjars/bycdao-ui/images/api.ico") + fun handleFaviconRequest(response: HttpServletResponse) { + // Redirect to a customized favicon + response.sendRedirect("/static/asset/favicon.ico") + } +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/database/BasePersistenceEntity.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/database/BasePersistenceEntity.kt new file mode 100644 index 00000000..5705a574 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/database/BasePersistenceEntity.kt @@ -0,0 +1,66 @@ +package com.jmsoftware.maf.springcloudstarter.database + +import com.baomidou.mybatisplus.annotation.* +import com.jmsoftware.maf.common.domain.DeletedField +import java.time.LocalDateTime + +/** + * Description: BasePersistenceEntity, change description here. + * + * @author Johnny Miller (鍾俊), e-mail: johnnysviva@outlook.com, date: 3/23/22 8:00 AM + */ +open class BasePersistenceEntity( + /** + * Primary key + */ + @TableId(value = COL_ID, type = IdType.AUTO) + var id: Long? = null, + /** + * Created by + */ + @TableField(value = COL_CREATED_BY, fill = FieldFill.INSERT) + var createdBy: String? = null, + /** + * Created time + */ + @TableField(value = COL_CREATED_TIME, fill = FieldFill.INSERT) + var createdTime: LocalDateTime? = null, + /** + * Modified by + */ + @TableField(value = COL_MODIFIED_BY, fill = FieldFill.UPDATE) + var modifiedBy: String? = null, + /** + * Modified time + */ + @TableField(value = COL_MODIFIED_TIME, fill = FieldFill.UPDATE) + var modifiedTime: LocalDateTime? = null, + /** + * Optimistic locking + */ + @Version + @TableField(value = COL_VERSION) + var version: Int? = null, + /** + * Deleted. 'N' - not deleted; 'Y' - deleted + * + * @see DeletedField + */ + @TableLogic + @TableField(value = COL_DELETED, fill = FieldFill.INSERT) + var deleted: String = DeletedField.NOT_DELETED.value +) { + companion object { + const val COL_ID = "id" + const val COL_CREATED_BY = "created_by" + const val COL_CREATED_TIME = "created_time" + const val COL_MODIFIED_BY = "modified_by" + const val COL_MODIFIED_TIME = "modified_time" + const val COL_VERSION = "version" + const val COL_DELETED = "deleted" + } + + override fun toString(): String { + return "BasePersistenceEntity(id=$id, createdBy=$createdBy, createdTime=$createdTime, modifiedBy=$modifiedBy, modifiedTime=$modifiedTime, version=$version, deleted='$deleted')" + } +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/database/CommonMetaObjectHandler.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/database/CommonMetaObjectHandler.java deleted file mode 100644 index 6ea0f500..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/database/CommonMetaObjectHandler.java +++ /dev/null @@ -1,100 +0,0 @@ -package com.jmsoftware.maf.springcloudstarter.database; - -import cn.hutool.core.util.ObjectUtil; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; -import com.jmsoftware.maf.common.domain.DeletedField; -import com.jmsoftware.maf.springcloudstarter.util.UserUtil; -import lombok.extern.slf4j.Slf4j; -import lombok.val; -import org.apache.ibatis.reflection.MetaObject; - -import java.time.LocalDateTime; - -/** - *

CommonMetaObjectHandler

- *

CommonMetaObjectHandler will inject these fields automatically when executing - * INSERT or UPDATE.

- *

This class is cooperating with the annotation @TableField. So the persistence Java class must be - * annotated by @TableField(value = COL_CREATED_BY, fill = INSERT) or @TableField(value = - * COL_MODIFIED_BY, fill = UPDATE).

- *
- * - * - * - *
MySQL Field NameField Name Java
created_bycreatedBy
created_timecreatedTime
modified_bymodifiedBy
modified_timemodifiedTime
deleteddeleted
- *

 

- * - * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 8/23/2021 10:43 AM - * @see TableField - **/ -@Slf4j -public class CommonMetaObjectHandler 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 值不填充) - if (log.isDebugEnabled()) { - log.debug("Starting to insert fill metaObject: {}", metaObject.getOriginalObject()); - } - val currentId = UserUtil.getCurrentId(); - if (ObjectUtil.isNull(currentId)) { - log.warn( - "Current user's ID is null, which may cause the record in database is incorrect. This will happen" + - " when the request is ignored by gateway. Field: {}", CREATED_BY_FIELD_NAME); - this.strictInsertFill(metaObject, CREATED_BY_FIELD_NAME, Long.class, 1L); - } else { - this.strictInsertFill(metaObject, CREATED_BY_FIELD_NAME, Long.class, currentId); - } - this.strictInsertFill(metaObject, CREATED_TIME_FIELD_NAME, LocalDateTime.class, LocalDateTime.now()) - .strictInsertFill(metaObject, DELETED_FIELD_NAME, Byte.class, DeletedField.NOT_DELETED.getValue()); - if (log.isDebugEnabled()) { - log.debug("Finished to insert fill metaObject: {}", metaObject.getOriginalObject()); - } - } - - @Override - public void updateFill(MetaObject metaObject) { - if (log.isDebugEnabled()) { - log.debug("Starting to update fill metaObject: {}", metaObject.getOriginalObject()); - } - val currentId = UserUtil.getCurrentId(); - if (ObjectUtil.isNull(currentId)) { - log.warn( - "Current user's ID is null, which may cause the record in database is incorrect. This will happen" + - " when the request is ignored by gateway. Field: {}", MODIFIED_BY_FIELD_NAME); - this.strictUpdateFill(metaObject, CREATED_BY_FIELD_NAME, Long.class, 1L); - } else { - this.strictUpdateFill(metaObject, MODIFIED_BY_FIELD_NAME, Long.class, currentId); - } - this.strictUpdateFill(metaObject, MODIFIED_TIME_FIELD_NAME, LocalDateTime.class, LocalDateTime.now()); - if (log.isDebugEnabled()) { - log.debug("Finished to update fill metaObject: {}", metaObject.getOriginalObject()); - } - } -} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/database/CommonMetaObjectHandler.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/database/CommonMetaObjectHandler.kt new file mode 100644 index 00000000..ed82d156 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/database/CommonMetaObjectHandler.kt @@ -0,0 +1,92 @@ +package com.jmsoftware.maf.springcloudstarter.database + +import cn.hutool.core.util.ObjectUtil +import com.baomidou.mybatisplus.annotation.TableField +import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler +import com.jmsoftware.maf.common.domain.DeletedField +import com.jmsoftware.maf.common.util.logger +import com.jmsoftware.maf.springcloudstarter.function.lazyDebug +import com.jmsoftware.maf.springcloudstarter.util.currentUsername +import org.apache.ibatis.reflection.MetaObject +import java.time.LocalDateTime + + +/** + * # CommonMetaObjectHandler + * + * **CommonMetaObjectHandler** will inject these fields automatically when executing **INSERT** or **UPDATE**. + * + * This class is cooperating with the annotation `@TableField`. So the persistence Java class must be + * annotated by `@TableField(value = COL_CREATED_BY, fill = INSERT)` or `@TableField(value = + * COL_MODIFIED_BY, fill = UPDATE)`. + * + * | MySQL Field Name | Field Name Java | + * | ---------------- | :-------------- | + * | created_by | createdBy | + * | created_time | createdTime | + * | modified_by | modifiedBy | + * | modified_time | modifiedTime | + * | deleted | deleted | + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/14/22 11:31 AM + * @see TableField + */ +class CommonMetaObjectHandler : MetaObjectHandler { + companion object { + private val log = logger() + + /** + * The Java persistence object field name: createdBy + */ + const val CREATED_BY_FIELD_NAME = "createdBy" + + /** + * The Java persistence object field name: createdTime + */ + const val CREATED_TIME_FIELD_NAME = "createdTime" + + /** + * The Java persistence object field name: modifiedBy + */ + const val MODIFIED_BY_FIELD_NAME = "modifiedBy" + + /** + * The Java persistence object field name: modifiedTime + */ + const val MODIFIED_TIME_FIELD_NAME = "modifiedTime" + + /** + * The Java persistence object field name: deleted + */ + const val DELETED_FIELD_NAME = "deleted" + const val DEFAULT_USERNAME = "system" + } + + override fun insertFill(metaObject: MetaObject) { + // 严格填充,只针对非主键的字段,只有该表注解了fill 并且 字段名和字段属性 能匹配到才会进行填充(null 值不填充) + lazyDebug(log) { "Starting to insert fill metaObject: ${metaObject.originalObject}" } + val currentUsername = currentUsername() + if (ObjectUtil.isNull(currentUsername)) { + log.warn("Current user's ID is null, which may cause the record in database is incorrect. This will happen when the request is ignored by gateway. Field: $CREATED_BY_FIELD_NAME") + this.strictInsertFill(metaObject, CREATED_BY_FIELD_NAME, String::class.java, DEFAULT_USERNAME) + } else { + this.strictInsertFill(metaObject, CREATED_BY_FIELD_NAME, String::class.java, currentUsername) + } + this.strictInsertFill(metaObject, CREATED_TIME_FIELD_NAME, LocalDateTime::class.java, LocalDateTime.now()) + .strictInsertFill(metaObject, DELETED_FIELD_NAME, String::class.java, DeletedField.NOT_DELETED.value) + lazyDebug(log) { "Finished to insert fill metaObject: ${metaObject.originalObject}" } + } + + override fun updateFill(metaObject: MetaObject) { + lazyDebug(log) { "Starting to update fill metaObject: ${metaObject.originalObject}" } + val currentUsername = currentUsername() + if (ObjectUtil.isNull(currentUsername)) { + log.warn("Current user's ID is null, which may cause the record in database is incorrect. This will happen when the request is ignored by gateway. Field: $MODIFIED_BY_FIELD_NAME") + this.strictUpdateFill(metaObject, CREATED_BY_FIELD_NAME, String::class.java, DEFAULT_USERNAME) + } else { + this.strictUpdateFill(metaObject, MODIFIED_BY_FIELD_NAME, String::class.java, currentUsername) + } + this.strictUpdateFill(metaObject, MODIFIED_TIME_FIELD_NAME, LocalDateTime::class.java, LocalDateTime.now()) + lazyDebug(log) { "Finished to update fill metaObject: ${metaObject.originalObject}" } + } +} 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 deleted file mode 100644 index 28ce60a1..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/database/DataSourceConfiguration.java +++ /dev/null @@ -1,83 +0,0 @@ -package com.jmsoftware.maf.springcloudstarter.database; - -import cn.hutool.db.ds.DataSourceWrapper; -import com.alibaba.druid.util.JdbcUtils; -import com.baomidou.dynamic.datasource.DynamicRoutingDataSource; -import com.baomidou.dynamic.datasource.plugin.MasterSlaveAutoRoutingPlugin; -import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceCreatorAutoConfiguration; -import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceProperties; -import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import lombok.val; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.autoconfigure.quartz.QuartzDataSource; -import org.springframework.boot.autoconfigure.quartz.QuartzTransactionManager; -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; - -/** - * Description: DataSourceConfiguration, change description here. - * - * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 6/27/2021 8:15 AM - **/ -@Slf4j -@ConditionalOnClass({MybatisPlusAutoConfiguration.class, DynamicDataSourceCreatorAutoConfiguration.class}) -public class DataSourceConfiguration { - /** - * Primary data source. Had to configure DynamicRoutingDataSource as primary. Otherwise - * MasterSlaveAutoRoutingPlugin will not be able to be injected datasource correctly. - * - * @param dynamicRoutingDataSource the dynamic routing data source - * @return the data source - * @see MasterSlaveAutoRoutingPlugin - */ - @Bean - @Primary - @SneakyThrows - public DataSource primaryDataSource(DynamicRoutingDataSource dynamicRoutingDataSource, - DynamicDataSourceProperties dynamicDataSourceProperties) { - val jdbcUrl = dynamicDataSourceProperties - .getDatasource() - .get(dynamicDataSourceProperties.getPrimary()) - .getUrl(); - val driverClassName = JdbcUtils.getDriverClassName(jdbcUrl); - val wrappedDataSource = DataSourceWrapper.wrap(dynamicRoutingDataSource, driverClassName); - log.info("Wrapping 'DynamicRoutingDataSource' as 'primaryDataSource', jdbcUrl: {}, driverClassName: {}, " + - "wrappedDataSource: {}", jdbcUrl, driverClassName, wrappedDataSource); - return wrappedDataSource; - } - - @Bean - @QuartzDataSource - @ConditionalOnProperty(prefix = "spring.quartz", name = "job-store-type", havingValue = "jdbc") - public DataSource quartzDataSource(DynamicRoutingDataSource dynamicRoutingDataSource) { - val quartzDataSource = dynamicRoutingDataSource.getDataSource(DataSourceEnum.QUARTZ.getDataSourceName()); - log.info("Setting up quartzDataSource from 'DynamicRoutingDataSource', quartzDataSource: {}", - quartzDataSource.hashCode()); - return quartzDataSource; - } - - @Bean - @Primary - public PlatformTransactionManager primaryPlatformTransactionManager(@Qualifier("primaryDataSource") DataSource primaryDataSource) { - log.info("Setting up the central interface in Spring's imperative transaction infrastructure " + - "'PlatformTransactionManager'. primaryDataSource: {}", primaryDataSource); - return new DataSourceTransactionManager(primaryDataSource); - } - - @Bean - @QuartzTransactionManager - @ConditionalOnProperty(prefix = "spring.quartz", name = "job-store-type", havingValue = "jdbc") - public PlatformTransactionManager quartzPlatformTransactionManager(@Qualifier("quartzDataSource") DataSource quartzDataSource) { - log.info("Setting up the central interface in Spring's imperative transaction infrastructure " + - "'PlatformTransactionManager'. quartzDataSource: {}", quartzDataSource.hashCode()); - return new DataSourceTransactionManager(quartzDataSource); - } -} 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 deleted file mode 100644 index 70cb4564..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/database/DataSourceEnum.java +++ /dev/null @@ -1,31 +0,0 @@ -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 { - /** - * Main - */ - MAIN_1("source_1"), - /** - * Replica 1 - */ - REPLICA_1("replica_1"), - /** - * Quartz - */ - QUARTZ("quartz"), - ; - - private final String dataSourceName; -} 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 deleted file mode 100644 index 46402062..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/database/MyBatisPlusConfiguration.java +++ /dev/null @@ -1,104 +0,0 @@ -package com.jmsoftware.maf.springcloudstarter.database; - -import com.baomidou.dynamic.datasource.plugin.MasterSlaveAutoRoutingPlugin; -import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourcePropertiesCustomizer; -import com.baomidou.dynamic.datasource.support.DdConstants; -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.mybatis.spring.annotation.MapperScan; -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 -@EnableTransactionManagement -@Import({ - DataSourceConfiguration.class -}) -@MapperScan("com.jmsoftware.maf.springcloudstarter.*.mapper") -@ConditionalOnClass({MybatisPlusAutoConfiguration.class, MasterSlaveAutoRoutingPlugin.class}) -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; - } - - /** - * Register master-slave auto routing plugin interceptor. Mybatis-Plus doesn't support non-master-slave - * datasource yet. - * - * @return the interceptor - * @see DdConstants - */ - @Bean - @Order(2) - public Interceptor masterSlaveAutoRoutingPlugin() { - log.warn("Initial bean: '{}'", MasterSlaveAutoRoutingPlugin.class.getSimpleName()); - return new MasterSlaveAutoRoutingPlugin(); - } - - @Bean - public CommonMetaObjectHandler commonMetaObjectHandler() { - log.warn("Initial bean: '{}'", CommonMetaObjectHandler.class.getSimpleName()); - return new CommonMetaObjectHandler(); - } - - @Bean - public DynamicDataSourcePropertiesCustomizer dynamicDataSourcePropertiesCustomizer() { - return properties -> { - val cpuCoreCount = Runtime.getRuntime().availableProcessors(); - val minConnectionPoolSize = cpuCoreCount * 2 + 1; - val maxConnectionPoolSize = cpuCoreCount * 3; - val druidConfig = properties.getDruid(); - druidConfig.setInitialSize(minConnectionPoolSize); - druidConfig.setMinIdle(minConnectionPoolSize); - druidConfig.setMaxActive(maxConnectionPoolSize); - log.warn("Druid connection pool enhanced by current cpuCoreCount: {}, initial size: {}, min idle: {}" + - ", max active: {}", - cpuCoreCount, minConnectionPoolSize, minConnectionPoolSize, maxConnectionPoolSize); - }; - } -} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/database/MyBatisPlusConfiguration.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/database/MyBatisPlusConfiguration.kt new file mode 100644 index 00000000..84448ec8 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/database/MyBatisPlusConfiguration.kt @@ -0,0 +1,82 @@ +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.OptimisticLockerInnerInterceptor +import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor +import com.jmsoftware.maf.common.util.logger +import com.jmsoftware.maf.springcloudstarter.database.CommonMetaObjectHandler +import org.apache.ibatis.plugin.Interceptor +import org.mybatis.spring.annotation.MapperScan +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass +import org.springframework.context.annotation.Bean +import org.springframework.core.annotation.Order +import org.springframework.transaction.annotation.EnableTransactionManagement + +/** + * # MyBatisPlusConfiguration + * + * Description: MyBatisPlusConfiguration, change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/14/22 11:37 AM + */ +@EnableTransactionManagement +@ConditionalOnClass(MybatisPlusAutoConfiguration::class) +@MapperScan("com.jmsoftware.maf.springcloudstarter.*.repository") +class MyBatisPlusConfiguration { + companion object { + private val log = logger() + } + + @Bean + fun paginationInnerInterceptor(): PaginationInnerInterceptor { + log.warn("Initial bean: `${PaginationInnerInterceptor::class.java.simpleName}`") + val paginationInnerInterceptor = PaginationInnerInterceptor(DbType.MYSQL) + paginationInnerInterceptor.maxLimit = 100L + return paginationInnerInterceptor + } + + @Bean + fun blockAttackInnerInterceptor(): BlockAttackInnerInterceptor { + log.warn("Initial bean: `${BlockAttackInnerInterceptor::class.java.simpleName}`") + return BlockAttackInnerInterceptor() + } + + @Bean + fun optimisticLockerInnerInterceptor(): OptimisticLockerInnerInterceptor { + log.warn("Initial bean: `${OptimisticLockerInnerInterceptor::class.java.simpleName}`") + return OptimisticLockerInnerInterceptor() + } + + /** + * Mybatis plus interceptor mybatis plus interceptor. + * + * @param paginationInnerInterceptor the pagination inner interceptor + * @param blockAttackInnerInterceptor the block attack inner interceptor + * @param optimisticLockerInnerInterceptor the optimistic locker inner interceptor + * @return the mybatis plus interceptor + * @see MybatisPlusInterceptor + */ + @Bean + @Order(1) + fun mybatisPlusInterceptor( + paginationInnerInterceptor: PaginationInnerInterceptor, + blockAttackInnerInterceptor: BlockAttackInnerInterceptor, + optimisticLockerInnerInterceptor: OptimisticLockerInnerInterceptor + ): Interceptor { + log.warn("Initial bean: `${MybatisPlusInterceptor::class.java.simpleName}`") + val mybatisPlusInterceptor = MybatisPlusInterceptor() + mybatisPlusInterceptor.addInnerInterceptor(paginationInnerInterceptor) + mybatisPlusInterceptor.addInnerInterceptor(blockAttackInnerInterceptor) + mybatisPlusInterceptor.addInnerInterceptor(optimisticLockerInnerInterceptor) + return mybatisPlusInterceptor + } + + @Bean + fun commonMetaObjectHandler(): CommonMetaObjectHandler { + log.warn("Initial bean: `${CommonMetaObjectHandler::class.java.simpleName}`") + return CommonMetaObjectHandler() + } +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/elasticsearch/Book.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/elasticsearch/Book.kt new file mode 100644 index 00000000..17d92b5e --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/elasticsearch/Book.kt @@ -0,0 +1,51 @@ +package com.jmsoftware.maf.springcloudstarter.elasticsearch + +import org.springframework.data.annotation.Id +import org.springframework.data.elasticsearch.annotations.Document +import org.springframework.data.elasticsearch.annotations.Field +import org.springframework.data.elasticsearch.annotations.FieldType +import java.time.LocalDateTime + +/** + * # Book + * + * Description: Book, change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/14/22 12:22 PM + */ +@Document(indexName = Book.INDEX_NAME) +class Book { + companion object { + const val INDEX_NAME = "books" + } + + /** + * The ID. + */ + @Id + var id: String? = null + + /** + * The Title. + */ + @Field(type = FieldType.Text, name = "name") + var name: String? = null + + /** + * The Summary. + */ + @Field(type = FieldType.Text) + var summary: String? = null + + /** + * The Publishing date. + */ + @Field(type = FieldType.Date, name = "publishDate", format = [], pattern = ["yyyy-MM-dd'T'HH:mm:ss'Z'"]) + var publishingDate: LocalDateTime? = null + + /** + * The Price. + */ + @Field(type = FieldType.Double, name = "price") + var price = 0.0 +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/elasticsearch/BookRepository.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/elasticsearch/BookRepository.kt new file mode 100644 index 00000000..9fcceba8 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/elasticsearch/BookRepository.kt @@ -0,0 +1,34 @@ +package com.jmsoftware.maf.springcloudstarter.elasticsearch + +import org.springframework.data.domain.Page +import org.springframework.data.domain.Pageable +import org.springframework.data.elasticsearch.annotations.Query +import org.springframework.data.elasticsearch.repository.ElasticsearchRepository + +/** + * # BookRepository + * + * Description: BookRepository, change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/14/22 12:22 PM + */ +interface BookRepository : ElasticsearchRepository { + /** + * Find by name and price list. + * + * @param name the name + * @param price the price + * @return the list + */ + fun findByNameAndPrice(name: String, price: Int): List + + /** + * Find by name page. + * + * @param name the name + * @param pageable the pageable + * @return the page + */ + @Query("{\"match\": {\"name\": {\"query\": \"?0\"}}}") + fun findByName(name: String, pageable: Pageable): Page +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/elasticsearch/ElasticsearchConfiguration.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/elasticsearch/ElasticsearchConfiguration.kt new file mode 100644 index 00000000..522c0d6b --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/elasticsearch/ElasticsearchConfiguration.kt @@ -0,0 +1,35 @@ +package com.jmsoftware.maf.springcloudstarter.elasticsearch + +import com.jmsoftware.maf.common.util.logger +import org.elasticsearch.client.RestHighLevelClient +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass +import org.springframework.boot.autoconfigure.elasticsearch.ElasticsearchProperties +import org.springframework.data.elasticsearch.config.AbstractElasticsearchConfiguration +import org.springframework.data.elasticsearch.repository.config.EnableElasticsearchRepositories +import javax.annotation.PostConstruct + +/** + * # ElasticsearchConfiguration + * + * Description: ElasticsearchConfiguration, change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/14/22 12:27 PM + * @see + * Spring Data Elasticsearch - Reference Documentation + * @see + * Client Logging + */ +@EnableElasticsearchRepositories +@ConditionalOnClass(AbstractElasticsearchConfiguration::class, RestHighLevelClient::class) +class ElasticsearchConfiguration( + private val elasticsearchProperties: ElasticsearchProperties +) { + companion object { + private val log = logger() + } + + @PostConstruct + fun init() { + log.warn("ElasticsearchConfiguration init. URIs: ${elasticsearchProperties.uris}") + } +} 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 deleted file mode 100644 index 7e153268..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/filter/AccessLogFilter.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.jmsoftware.maf.springcloudstarter.filter; - -import com.jmsoftware.maf.springcloudstarter.property.MafConfigurationProperties; -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 MafConfigurationProperties mafConfigurationProperties; - 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.mafConfigurationProperties.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/filter/AccessLogFilter.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/filter/AccessLogFilter.kt new file mode 100644 index 00000000..50e21bb3 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/filter/AccessLogFilter.kt @@ -0,0 +1,45 @@ +package com.jmsoftware.maf.springcloudstarter.filter + +import com.jmsoftware.maf.common.util.logger +import com.jmsoftware.maf.springcloudstarter.property.MafConfigurationProperties +import com.jmsoftware.maf.springcloudstarter.util.getRequestIpAndPort +import org.springframework.stereotype.Component +import org.springframework.util.AntPathMatcher +import org.springframework.web.filter.OncePerRequestFilter +import javax.servlet.FilterChain +import javax.servlet.http.HttpServletRequest +import javax.servlet.http.HttpServletResponse + +/** + * # RequestFilter + * + * Request filter. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/12/22 9:55 PM + */ +@Component +class AccessLogFilter( + private val mafConfigurationProperties: MafConfigurationProperties, +) : OncePerRequestFilter() { + companion object { + private val log = logger() + } + + private val antPathMatcher = AntPathMatcher() + + override fun doFilterInternal( + request: HttpServletRequest, + response: HttpServletResponse, + filterChain: FilterChain + ) { + // Ignore URL + for (ignoredUrl in mafConfigurationProperties.flattenIgnoredUrls()) { + if (antPathMatcher.match(ignoredUrl, request.requestURI)) { + filterChain.doFilter(request, response) + return + } + } + log.info("The requester(${getRequestIpAndPort(request)}) requested resource. Request URL: [${request.method}] ${request.requestURL}") + filterChain.doFilter(request, response) + } +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/function/BooleanCheck.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/function/BooleanCheck.java deleted file mode 100644 index 17441a50..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/function/BooleanCheck.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.jmsoftware.maf.springcloudstarter.function; - -import cn.hutool.core.util.BooleanUtil; -import com.jmsoftware.maf.springcloudstarter.function.functionalinterface.OrElseThrowExceptionFunction; - -import java.util.function.Consumer; - -import static java.util.Objects.nonNull; - -/** - * Description: BooleanCheck, change description here. - * - * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 9/27/2021 12:03 PM - **/ -public class BooleanCheck { - private BooleanCheck() { - } - - /** - * Require true or else throw exception. - * - * @param aBoolean the aBoolean - * @param after the after - * @return the throw exception function - * @see com.jmsoftware.maf.springcloudstarter.FunctionalInterfaceTests#testRequireTrue() - */ - public static OrElseThrowExceptionFunction requireTrue(boolean aBoolean, Consumer after) { - if (nonNull(after)) { - after.accept(aBoolean); - } - return exceptionSupplier -> { - if (BooleanUtil.isFalse(aBoolean)) { - throw exceptionSupplier.get(); - } - }; - } - - /** - * Require all true or else throw exception function. - * - * @param booleans the booleans - * @return the or else throw exception function - * @see com.jmsoftware.maf.springcloudstarter.FunctionalInterfaceTests#testRequireTrue() - */ - public static OrElseThrowExceptionFunction requireAllTrue(boolean... booleans) { - return exceptionSupplier -> { - for (boolean aBoolean : booleans) { - if (BooleanUtil.isFalse(aBoolean)) { - throw exceptionSupplier.get(); - } - } - }; - } -} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/function/BooleanCheck.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/function/BooleanCheck.kt new file mode 100644 index 00000000..9320bbc7 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/function/BooleanCheck.kt @@ -0,0 +1,39 @@ +package com.jmsoftware.maf.springcloudstarter.function + +import cn.hutool.core.util.BooleanUtil +import java.util.function.Consumer +import java.util.function.Supplier + +/** + * Require true or else throw exception. + * + * @param aBoolean the aBoolean + * @param after the after + * @return the throw exception function + * @see com.jmsoftware.maf.springcloudstarter.FunctionalInterfaceTests.testRequireTrue + */ +fun requireTrue(aBoolean: Boolean, after: Consumer?): OrElseThrowExceptionFunction { + after?.accept(aBoolean) + return OrElseThrowExceptionFunction { exceptionSupplier: Supplier -> + if (BooleanUtil.isFalse(aBoolean)) { + throw exceptionSupplier.get() + } + } +} + +/** + * Require all true or else throw exception function. + * + * @param booleans the booleans + * @return the or else throw exception function + * @see com.jmsoftware.maf.springcloudstarter.FunctionalInterfaceTests.testRequireTrue + */ +fun requireAllTrue(vararg booleans: Boolean): OrElseThrowExceptionFunction { + return OrElseThrowExceptionFunction { exceptionSupplier: Supplier -> + for (aBoolean in booleans) { + if (BooleanUtil.isFalse(aBoolean)) { + throw exceptionSupplier.get() + } + } + } +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/function/Cache.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/function/Cache.java deleted file mode 100644 index 8a929f21..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/function/Cache.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.jmsoftware.maf.springcloudstarter.function; - -import java.util.Map; -import java.util.function.Function; - -/** - *

Cache

- *

- * Change description here. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com, 9/28/21 8:51 AM - * @see Java 函数式编程最佳实践 - 赋予函数缓存能力 - **/ -public class Cache { - private Cache() { - } - - /** - * Cache function r. - * - * @param the type parameter - * @param the type parameter - * @param function the function - * @param t the t - * @param cache the cache - * @return the r - * @see com.jmsoftware.maf.springcloudstarter.FunctionalInterfaceTests#testCacheFunction() - */ - public static R cacheFunction(Function function, T t, Map cache) { - R r = cache.get(t); - if (r != null) { - return r; - } - R result = function.apply(t); - cache.put(t, result); - return result; - } - - /** - * Cache function r. - * - * @param the type parameter - * @param the type parameter - * @param function the function - * @param t the t - * @param cache the cache - * @return the r - * @see com.jmsoftware.maf.springcloudstarter.FunctionalInterfaceTests#testCacheFunction() - */ - public static R cacheFunction(Function function, T t, com.google.common.cache.Cache cache) { - R r = cache.getIfPresent(t); - if (r != null) { - return r; - } - R result = function.apply(t); - cache.put(t, result); - return result; - } -} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/function/Cache.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/function/Cache.kt new file mode 100644 index 00000000..7b872cfe --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/function/Cache.kt @@ -0,0 +1,58 @@ +@file:Suppress("unused") + +package com.jmsoftware.maf.springcloudstarter.function + +import com.google.common.cache.Cache +import java.util.function.Function + +/** + * # Cache + * + * Change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/14/22 2:44 PM + * @see Java 函数式编程最佳实践 - 赋予函数缓存能力 + */ +private object Cache + +/** + * Cache function r. + * + * @param the type parameter + * @param the type parameter + * @param function the function + * @param t the t + * @param cache the cache + * @return the r + * @see com.jmsoftware.maf.springcloudstarter.FunctionalInterfaceTests.testCacheFunction + */ +fun cacheFunction(function: Function, t: T, cache: MutableMap): R { + val r = cache[t] + if (r != null) { + return r + } + val result = function.apply(t) + cache[t] = result + return result +} + +/** + * Cache function r. + * + * @param the type parameter + * @param the type parameter + * @param function the function + * @param t the t + * @param cache the cache + * @return the r + * @see com.jmsoftware.maf.springcloudstarter.FunctionalInterfaceTests.testCacheFunction + */ +fun cacheFunction(function: Function, t: T, cache: Cache): R { + val r = cache.getIfPresent(t) + if (r != null) { + return r + } + val result = function.apply(t) + cache.put(t, result) + return result +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/function/ExceptionHandling.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/function/ExceptionHandling.java deleted file mode 100644 index b58971a2..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/function/ExceptionHandling.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.jmsoftware.maf.springcloudstarter.function; - -import com.jmsoftware.maf.springcloudstarter.function.functionalinterface.ThrowExceptionBiFunction; -import com.jmsoftware.maf.springcloudstarter.function.functionalinterface.ThrowExceptionFunction; -import com.jmsoftware.maf.springcloudstarter.function.functionalinterface.ThrowExceptionSupplier; - -import java.util.function.Function; - -/** - *

ExceptionHandling

- *

- * Change description here. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com, 9/28/21 8:54 AM - * @see Java 函数式编程最佳实践 - 赋予函数处理异常的能力 - **/ -public class ExceptionHandling { - private ExceptionHandling() { - } - - /** - * Compute and deal exception r. - * - * @param the type parameter - * @param the type parameter - * @param function the function - * @param t the t - * @param handlingFunc the handling func - * @return the r - * @see com.jmsoftware.maf.springcloudstarter.FunctionalInterfaceTests#testComputeAndHandleException() - */ - public static R computeAndHandleException(ThrowExceptionFunction function, T t, - Function handlingFunc) { - try { - return function.apply(t); - } catch (Exception e) { - return handlingFunc.apply(e); - } - } - - /** - * Compute and handle exception r. - * - * @param the type parameter - * @param the type parameter - * @param the type parameter - * @param function the function - * @param t the t - * @param u the u - * @param handlingFunc the handling func - * @return the r - */ - public static R computeAndHandleException(ThrowExceptionBiFunction function, T t, U u, - Function handlingFunc) { - try { - return function.apply(t, u); - } catch (Exception e) { - return handlingFunc.apply(e); - } - } - - /** - * Compute and handle exception r. - * - * @param the type parameter - * @param supplier the supplier - * @param handlingFunc the handling func - * @return the r - */ - public static R computeAndHandleException(ThrowExceptionSupplier supplier, - Function handlingFunc) { - try { - return supplier.get(); - } catch (Exception e) { - return handlingFunc.apply(e); - } - } -} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/function/ExceptionHandling.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/function/ExceptionHandling.kt new file mode 100644 index 00000000..3b1a79cc --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/function/ExceptionHandling.kt @@ -0,0 +1,83 @@ +@file:Suppress("unused") + +package com.jmsoftware.maf.springcloudstarter.function + +import java.util.function.Function + +/** + *

ExceptionHandling

+ * + * + * Change description here. + * + * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com, 9/28/21 8:54 AM + * @see Java 函数式编程最佳实践 - 赋予函数处理异常的能力 + */ +private object ExceptionHandling + +/** + * Compute and deal exception r. + * + * @param the type parameter + * @param the type parameter + * @param function the function + * @param t the t + * @param handlingFunc the handling func + * @return the r + * @see com.jmsoftware.maf.springcloudstarter.FunctionalInterfaceTests.testComputeAndHandleException + */ +fun computeAndHandleException( + function: ThrowExceptionFunction, + t: T, + handlingFunc: Function +): R { + return try { + function.apply(t) + } catch (e: Exception) { + handlingFunc.apply(e) + } +} + +/** + * Compute and handle exception r. + * + * @param the type parameter + * @param the type parameter + * @param the type parameter + * @param function the function + * @param t the t + * @param u the u + * @param handlingFunc the handling func + * @return the r + */ +fun computeAndHandleException( + function: ThrowExceptionBiFunction, + t: T, + u: U, + handlingFunc: Function +): R { + return try { + function.apply(t, u) + } catch (e: Exception) { + handlingFunc.apply(e) + } +} + +/** + * Compute and handle exception r. + * + * @param the type parameter + * @param supplier the supplier + * @param handlingFunc the handling func + * @return the r + */ +fun computeAndHandleException( + supplier: ThrowExceptionSupplier, + handlingFunc: Function +): R { + return try { + supplier.get() + } catch (e: Exception) { + handlingFunc.apply(e) + } +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/function/ExceptionReturnDefault.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/function/ExceptionReturnDefault.java deleted file mode 100644 index 81d25af2..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/function/ExceptionReturnDefault.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.jmsoftware.maf.springcloudstarter.function; - -import com.jmsoftware.maf.springcloudstarter.function.functionalinterface.ThrowExceptionFunction; -import com.jmsoftware.maf.springcloudstarter.function.functionalinterface.ThrowExceptionSupplier; - -/** - *

ExceptionReturnDefault

- *

- * Change description here. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com, 9/28/21 8:52 AM - * @see Java 函数式编程最佳实践 - 赋予函数报错返回默认值能力 - **/ -public class ExceptionReturnDefault { - private ExceptionReturnDefault() { - } - - /** - * Compute or get default r. - * - * @param the type parameter - * @param the type parameter - * @param function the function - * @param t the t - * @param r the r - * @return the r - * @see com.jmsoftware.maf.springcloudstarter.FunctionalInterfaceTests#testComputeOrGetDefault() - */ - public static R computeOrGetDefault(ThrowExceptionFunction function, T t, R r) { - try { - return function.apply(t); - } catch (Exception e) { - return r; - } - } - - /** - * Compute or get default r. - * - * @param the type parameter - * @param supplier the supplier - * @param r the r - * @return the r - */ - public static R computeOrGetDefault(ThrowExceptionSupplier supplier, R r) { - try { - return supplier.get(); - } catch (Exception e) { - return r; - } - } -} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/function/ExceptionReturnDefault.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/function/ExceptionReturnDefault.kt new file mode 100644 index 00000000..28b520c7 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/function/ExceptionReturnDefault.kt @@ -0,0 +1,48 @@ +@file:Suppress("unused") + +package com.jmsoftware.maf.springcloudstarter.function + +/** + * # ExceptionReturnDefault + * + * Change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/14/22 2:52 PM + * @see Java 函数式编程最佳实践 - 赋予函数报错返回默认值能力 + */ +private object ExceptionReturnDefault + +/** + * Compute or get default r. + * + * @param the type parameter + * @param the type parameter + * @param function the function + * @param t the t + * @param r the r + * @return the r + * @see com.jmsoftware.maf.springcloudstarter.FunctionalInterfaceTests.testComputeOrGetDefault + */ +fun computeOrGetDefault(function: ThrowExceptionFunction, t: T, r: R): R { + return try { + function.apply(t) + } catch (e: Exception) { + r + } +} + +/** + * Compute or get default r. + * + * @param the type parameter + * @param supplier the supplier + * @param r the r + * @return the r + */ +fun computeOrGetDefault(supplier: ThrowExceptionSupplier, r: R): R { + return try { + supplier.get() + } catch (e: Exception) { + r + } +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/function/FunctionLog.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/function/FunctionLog.java deleted file mode 100644 index 74f9255a..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/function/FunctionLog.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.jmsoftware.maf.springcloudstarter.function; - -import lombok.extern.slf4j.Slf4j; -import lombok.val; - -import java.time.Duration; -import java.time.Instant; -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; -import java.util.function.Function; - -import static com.jmsoftware.maf.common.constant.UniversalDateTime.DATE_TIME_FORMAT; - -/** - *

FunctionLog

- *

- * Change description here. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com, 9/28/21 8:57 AM - * @see Java 函数式编程最佳实践 - 赋予函数记录日志能力 - **/ -@Slf4j -public class FunctionLog { - private FunctionLog() { - } - - /** - * Log function r. - * - * @param the type parameter - * @param the type parameter - * @param function the function - * @param t the t - * @param tag the tag - * @return the r - * @see com.jmsoftware.maf.springcloudstarter.FunctionalInterfaceTests#testLogFunction() - */ - public static R logFunction(Function function, T t, String tag) { - log.info("[{}], parameter = {}, requestTime = {}", tag, t.toString(), - LocalDateTime.now().format(DateTimeFormatter.ofPattern(DATE_TIME_FORMAT))); - val start = Instant.now(); - R apply = function.apply(t); - val end = Instant.now(); - log.info("[{}], return = {}, elapsed time = {} ms", tag, apply.toString(), - Duration.between(start, end).toMillis()); - return apply; - } -} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/function/FunctionLog.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/function/FunctionLog.kt new file mode 100644 index 00000000..c434e99a --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/function/FunctionLog.kt @@ -0,0 +1,48 @@ +package com.jmsoftware.maf.springcloudstarter.function + +import com.jmsoftware.maf.common.constant.UniversalDateTime +import com.jmsoftware.maf.common.util.logger +import com.jmsoftware.maf.springcloudstarter.function.FunctionLog.log +import java.time.Duration +import java.time.Instant +import java.time.LocalDateTime +import java.time.format.DateTimeFormatter +import java.util.function.Function + +/** + * # FunctionLog + * + * Change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/14/22 2:55 PM + * @see Java 函数式编程最佳实践 - 赋予函数记录日志能力 + */ +private object FunctionLog { + val log = logger() +} + +/** + * Log function r. + * + * @param the type parameter + * @param the type parameter + * @param function the function + * @param t the t + * @param tag the tag + * @return the r + * @see com.jmsoftware.maf.springcloudstarter.FunctionalInterfaceTests.testLogFunction + */ +fun logFunction(function: Function, t: T, tag: String?): R { + log.info( + "[{}], parameter = {}, requestTime = {}", tag, t.toString(), + LocalDateTime.now().format(DateTimeFormatter.ofPattern(UniversalDateTime.DATE_TIME_FORMAT)) + ) + val start = Instant.now() + val apply = function.apply(t) + val end = Instant.now() + log.info( + "[{}], return = {}, elapsed time = {} ms", tag, apply.toString(), + Duration.between(start, end).toMillis() + ) + return apply +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/function/FunctionalInterface.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/function/FunctionalInterface.kt new file mode 100644 index 00000000..76e4bdca --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/function/FunctionalInterface.kt @@ -0,0 +1,90 @@ +package com.jmsoftware.maf.springcloudstarter.function + +import java.util.function.Supplier + +/** + * # OrElseThrowExceptionFunction + * + * Description: OrElseThrowExceptionFunction, change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/14/22 12:32 PM + */ +fun interface OrElseThrowExceptionFunction { + /** + * Or else throw. + * + * @param exceptionSupplier the exception supplier + * @throws Throwable the throwable + */ + fun orElseThrow(exceptionSupplier: Supplier) +} + +/** + * # ThrowExceptionBiFunction + * + * Change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/14/22 12:35 PM + */ +fun interface ThrowExceptionBiFunction { + /** + * Apply r. + * + * @param t the t + * @param u the u + * @return the r + * @throws Exception the exception + */ + fun apply(t: T, u: U): R +} + +/** + * # ThrowExceptionFunction + * + * Change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/14/22 12:35 PM + */ +fun interface ThrowExceptionFunction { + /** + * Apply r. + * + * @param t the t + * @return the r + * @throws Exception the exception + */ + fun apply(t: T): R +} + +/** + * # ThrowExceptionRunnable + * + * Change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/14/22 12:36 PM + */ +fun interface ThrowExceptionRunnable { + /** + * Run. + * + * @throws Exception the exception + */ + fun run() +} + +/** + * # ThrowExceptionSupplier + * + * Change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/14/22 12:36 PM + */ +fun interface ThrowExceptionSupplier { + /** + * Get t. + * + * @return the t + * @throws Exception the exception + */ + fun get(): T +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/function/FunctionalPaginationResponseComposer.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/function/FunctionalPaginationResponseComposer.java deleted file mode 100644 index 55d626b2..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/function/FunctionalPaginationResponseComposer.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.jmsoftware.maf.springcloudstarter.function; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.PageUtil; -import com.jmsoftware.maf.common.bean.PageResponseBodyBean; -import com.jmsoftware.maf.common.bean.PaginationBase; -import lombok.NonNull; -import lombok.extern.slf4j.Slf4j; -import lombok.val; - -import java.util.List; -import java.util.function.Function; - -import static java.lang.Math.toIntExact; - -/** - *

FunctionalPaginationResponseComposer

- *

- * Change description here. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com, 2/1/22 1:13 AM - **/ -@Slf4j -@SuppressWarnings("unused") -public class FunctionalPaginationResponseComposer { - private FunctionalPaginationResponseComposer() { - } - - public static List composePages( - @NonNull T paginationBase, - @NonNull Function> callback - ) { - val result = CollUtil.newArrayList(); - while (true) { - val page = callback.apply(paginationBase); - if (CollUtil.isEmpty(page.getList())) { - CollUtil.addAll(result, page.getList()); - } - if (!paginationBase.hasNextPage(page)) { - val totalPage = PageUtil.totalPage(toIntExact(page.getTotal()), paginationBase.getPageSize()); - log.warn("Reached the end of the page. totalPage: {}, currentPage: {}, pageSize: {}", totalPage, - paginationBase.getCurrentPage(), paginationBase.getPageSize()); - break; - } - } - return result; - } - - private static boolean hasNextPage( - @NonNull T paginationBase, - @NonNull PageResponseBodyBean pageResponse - ) { - val totalPage = PageUtil.totalPage(toIntExact(pageResponse.getTotal()), paginationBase.getPageSize()); - if (paginationBase.getCurrentPage() < totalPage) { - paginationBase.setCurrentPage(paginationBase.getCurrentPage() + 1); - return true; - } - log.warn("Reached the end of the page. totalPage: {}, currentPage: {}, pageSize: {}", totalPage, - paginationBase.getCurrentPage(), paginationBase.getPageSize()); - return false; - } -} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/function/PaginationResponseComposer.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/function/PaginationResponseComposer.kt new file mode 100644 index 00000000..ff0afee4 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/function/PaginationResponseComposer.kt @@ -0,0 +1,63 @@ +package com.jmsoftware.maf.springcloudstarter.function + +import cn.hutool.core.collection.CollUtil +import cn.hutool.core.util.PageUtil +import com.jmsoftware.maf.common.bean.PageResponseBodyBean +import com.jmsoftware.maf.common.bean.PaginationBase +import com.jmsoftware.maf.common.util.logger +import com.jmsoftware.maf.springcloudstarter.function.PaginationResponseComposer.log +import java.util.function.Function + +/** + * # PaginationResponseComposer + * + * Change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/14/22 2:54 PM + */ +private object PaginationResponseComposer { + val log = logger() +} + +/** + * Compose page. + * @param paginationBase T + * @param callback Function> + * @return List + */ +@Suppress("unused") +fun composePages( + paginationBase: T, + callback: Function> +): List { + val result = CollUtil.newArrayList() + while (true) { + val page = callback.apply(paginationBase) + if (CollUtil.isEmpty(page.list)) { + CollUtil.addAll(result, page.list) + } + if (!paginationBase.hasNextPage(page)) { + val totalPage = PageUtil.totalPage(Math.toIntExact(page.total), paginationBase.pageSize) + log.warn("Reached the end of the page. totalPage: $totalPage, currentPage: ${paginationBase.currentPage}, pageSize: ${paginationBase.pageSize}") + break + } + } + return result +} + +@Suppress("unused") +private fun hasNextPage( + paginationBase: T, + pageResponse: PageResponseBodyBean +): Boolean { + val totalPage = PageUtil.totalPage(Math.toIntExact(pageResponse.total), paginationBase!!.pageSize) + if (paginationBase.currentPage < totalPage) { + paginationBase.currentPage = paginationBase.currentPage + 1 + return true + } + log.warn( + "Reached the end of the page. totalPage: {}, currentPage: {}, pageSize: {}", totalPage, + paginationBase.currentPage, paginationBase.pageSize + ) + return false +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/function/Retry.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/function/Retry.java deleted file mode 100644 index 578be441..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/function/Retry.java +++ /dev/null @@ -1,149 +0,0 @@ -package com.jmsoftware.maf.springcloudstarter.function; - -import com.jmsoftware.maf.springcloudstarter.function.functionalinterface.ThrowExceptionBiFunction; -import com.jmsoftware.maf.springcloudstarter.function.functionalinterface.ThrowExceptionFunction; -import com.jmsoftware.maf.springcloudstarter.function.functionalinterface.ThrowExceptionRunnable; - -import java.util.function.BiFunction; -import java.util.function.Function; -import java.util.function.Predicate; - -/** - *

Retry

- *

- * Change description here. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com, 9/28/21 8:27 AM - * @see Java 函数式编程最佳实践 - 赋予方法重试能力 - **/ -public class Retry { - private Retry() { - } - - /** - * Retry function. - * - * @param runnable the runnable - * @param retryTime the retry time - * @see com.jmsoftware.maf.springcloudstarter.FunctionalInterfaceTests#tesRetryFunction() - */ - public static void retryFunction(ThrowExceptionRunnable runnable, int retryTime) { - while (true) { - try { - runnable.run(); - return; - } catch (Exception e) { - retryTime--; - if (retryTime <= 0) { - throw new RuntimeException(e); - } - } - } - } - - /** - * Retry function r. - * - * @param the type parameter - * @param the type parameter - * @param function the function - * @param t the t - * @param retryTime the retry time - * @return the r - */ - public static R retryFunction(ThrowExceptionFunction function, T t, int retryTime) { - while (true) { - try { - return function.apply(t); - } catch (Exception e) { - retryTime--; - if (retryTime <= 0) { - throw new RuntimeException(e); - } - } - } - } - - /** - * Retry function r. - * - * @param the type parameter - * @param the type parameter - * @param function the function - * @param t the t - * @param predicator the predicator - * @param retryTime the retry time - * @return the r - * @throws IllegalStateException the illegal state exception - * @see com.jmsoftware.maf.springcloudstarter.FunctionalInterfaceTests#tesRetryFunction() - */ - public static R retryFunction(Function function, T t, Predicate predicator, int retryTime - ) throws IllegalStateException { - while (retryTime > 0) { - try { - final var r = function.apply(t); - if (predicator.test(r)) { - return r; - } - } finally { - retryTime--; - } - } - throw new IllegalStateException("retryTime reached hits the limit and the result is not correct"); - } - - /** - * Retry function r. - * - * @param the type parameter - * @param the type parameter - * @param the type parameter - * @param function the function - * @param t the t - * @param u the u - * @param time the time - * @return the r - */ - public static R retryFunction(ThrowExceptionBiFunction function, T t, U u, int time) { - while (true) { - try { - return function.apply(t, u); - } catch (Exception e) { - time--; - if (time <= 0) { - throw new RuntimeException(e); - } - } - } - } - - /** - * Retry function r. - * - * @param the type parameter - * @param the type parameter - * @param the type parameter - * @param function the function - * @param t the t - * @param u the u - * @param predicator the predicator - * @param retryTime the retry time - * @return the r - * @throws IllegalStateException the illegal state exception - */ - public static R retryFunction(BiFunction function, T t, U u, Predicate predicator, - int retryTime - ) throws IllegalStateException { - while (retryTime > 0) { - try { - final var r = function.apply(t, u); - if (predicator.test(r)) { - return r; - } - } finally { - retryTime--; - } - } - throw new IllegalStateException("retryTime reached hits the limit and the result is not correct"); - } -} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/function/Retry.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/function/Retry.kt new file mode 100644 index 00000000..c3d7b894 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/function/Retry.kt @@ -0,0 +1,152 @@ +@file:Suppress("unused") + +package com.jmsoftware.maf.springcloudstarter.function + +import java.util.function.BiFunction +import java.util.function.Function +import java.util.function.Predicate + +/** + * # Retry + * + * Change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/14/22 2:55 PM + * @see Java 函数式编程最佳实践 - 赋予方法重试能力 + */ +private object Retry + +/** + * Retry function. + * + * @param runnable the runnable + * @param retryTime the retry time + * @see com.jmsoftware.maf.springcloudstarter.FunctionalInterfaceTests.tesRetryFunction + */ +fun retryFunction(runnable: ThrowExceptionRunnable, retryTime: Int) { + var retryTime1 = retryTime + while (true) { + try { + runnable.run() + return + } catch (e: Exception) { + retryTime1-- + if (retryTime1 <= 0) { + throw RuntimeException(e) + } + } + } +} + +/** + * Retry function r. + * + * @param the type parameter + * @param the type parameter + * @param function the function + * @param t the t + * @param retryTime the retry time + * @return the r + */ +fun retryFunction(function: ThrowExceptionFunction, t: T, retryTime: Int): R { + var retryTime1 = retryTime + while (true) { + try { + return function.apply(t) + } catch (e: Exception) { + retryTime1-- + if (retryTime1 <= 0) { + throw RuntimeException(e) + } + } + } +} + +/** + * Retry function r. + * + * @param the type parameter + * @param the type parameter + * @param function the function + * @param t the t + * @param predicator the predicator + * @param retryTime the retry time + * @return the r + * @throws IllegalStateException the illegal state exception + * @see com.jmsoftware.maf.springcloudstarter.FunctionalInterfaceTests.tesRetryFunction + */ +@Throws(IllegalStateException::class) +fun retryFunction( + function: Function, t: T, predicator: Predicate, retryTime: Int +): R { + var retryTime1 = retryTime + while (retryTime1 > 0) { + try { + val r = function.apply(t) + if (predicator.test(r)) { + return r + } + } finally { + retryTime1-- + } + } + throw IllegalStateException("retryTime reached hits the limit and the result is not correct") +} + +/** + * Retry function r. + * + * @param the type parameter + * @param the type parameter + * @param the type parameter + * @param function the function + * @param t the t + * @param u the u + * @param time the time + * @return the r + */ +fun retryFunction(function: ThrowExceptionBiFunction, t: T, u: U, time: Int): R { + var time1 = time + while (true) { + try { + return function.apply(t, u) + } catch (e: Exception) { + time1-- + if (time1 <= 0) { + throw RuntimeException(e) + } + } + } +} + +/** + * Retry function r. + * + * @param the type parameter + * @param the type parameter + * @param the type parameter + * @param function the function + * @param t the t + * @param u the u + * @param predicator the predicator + * @param retryTime the retry time + * @return the r + * @throws IllegalStateException the illegal state exception + */ +fun retryFunction( + function: BiFunction, t: T, u: U, predicator: Predicate, + retryTime: Int +): R { + var retryTime1 = retryTime + while (retryTime1 > 0) { + try { + val r: R = function.apply(t, u) + if (predicator.test(r)) { + return r + } + } finally { + retryTime1-- + } + } + throw IllegalStateException("retryTime reached hits the limit and the result is not correct") +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/function/Slf4j.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/function/Slf4j.kt new file mode 100644 index 00000000..eb35fd6c --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/function/Slf4j.kt @@ -0,0 +1,17 @@ +package com.jmsoftware.maf.springcloudstarter.function + +import org.slf4j.Logger +import java.util.function.Supplier + +/** + * Lazy debug. + * + * @param logger the logger + * @param supplier the string supplier + * @see com.jmsoftware.maf.springcloudstarter.Slf4jTests.lazyDebugTest + */ +fun lazyDebug(logger: Logger, supplier: Supplier) { + if (logger.isDebugEnabled) { + logger.debug(supplier.get()) + } +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/function/functionalinterface/OrElseThrowExceptionFunction.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/function/functionalinterface/OrElseThrowExceptionFunction.java deleted file mode 100644 index 0c0d3e67..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/function/functionalinterface/OrElseThrowExceptionFunction.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.jmsoftware.maf.springcloudstarter.function.functionalinterface; - -import java.util.function.Supplier; - -/** - * Description: OrElseThrowExceptionFunction, change description here. - * - * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 9/28/2021 10:01 AM - **/ -@FunctionalInterface -public interface OrElseThrowExceptionFunction { - /** - * Or else throw. - * - * @param exceptionSupplier the exception supplier - * @throws Throwable the throwable - */ - void orElseThrow(Supplier exceptionSupplier) throws Throwable; -} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/function/functionalinterface/ThrowExceptionBiFunction.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/function/functionalinterface/ThrowExceptionBiFunction.java deleted file mode 100644 index a28f6919..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/function/functionalinterface/ThrowExceptionBiFunction.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.jmsoftware.maf.springcloudstarter.function.functionalinterface; - -/** - *

ThrowExceptionBiFunction

- *

- * Change description here. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com, 9/28/21 8:48 AM - **/ -@FunctionalInterface -public interface ThrowExceptionBiFunction { - /** - * Apply r. - * - * @param t the t - * @param u the u - * @return the r - * @throws Exception the exception - */ - R apply(T t, U u) throws Exception; -} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/function/functionalinterface/ThrowExceptionFunction.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/function/functionalinterface/ThrowExceptionFunction.java deleted file mode 100644 index 5fca3b95..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/function/functionalinterface/ThrowExceptionFunction.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.jmsoftware.maf.springcloudstarter.function.functionalinterface; - -/** - *

ThrowExceptionFunction

- *

- * Change description here. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com, 9/28/21 8:47 AM - **/ -@FunctionalInterface -public interface ThrowExceptionFunction { - /** - * Apply r. - * - * @param t the t - * @return the r - * @throws Exception the exception - */ - R apply(T t) throws Exception; -} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/function/functionalinterface/ThrowExceptionRunnable.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/function/functionalinterface/ThrowExceptionRunnable.java deleted file mode 100644 index 88cb8587..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/function/functionalinterface/ThrowExceptionRunnable.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.jmsoftware.maf.springcloudstarter.function.functionalinterface; - -/** - *

ThrowExceptionRunnable

- *

- * Change description here. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com, 9/28/21 8:49 AM - **/ -@FunctionalInterface -public interface ThrowExceptionRunnable { - /** - * Run. - * - * @throws Exception the exception - */ - void run() throws Exception; -} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/function/functionalinterface/ThrowExceptionSupplier.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/function/functionalinterface/ThrowExceptionSupplier.java deleted file mode 100644 index 9aa3e5ed..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/function/functionalinterface/ThrowExceptionSupplier.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.jmsoftware.maf.springcloudstarter.function.functionalinterface; - -/** - *

ThrowExceptionSupplier

- *

- * Change description here. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com, 9/28/21 8:49 AM - **/ -@FunctionalInterface -public interface ThrowExceptionSupplier { - /** - * Get t. - * - * @return the t - * @throws Exception the exception - */ - T get() throws Exception; -} 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 deleted file mode 100644 index 5ae0615e..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/helper/HttpApiScanHelper.java +++ /dev/null @@ -1,70 +0,0 @@ -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/HttpApiScanHelper.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/helper/HttpApiScanHelper.kt new file mode 100644 index 00000000..824ee101 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/helper/HttpApiScanHelper.kt @@ -0,0 +1,72 @@ +package com.jmsoftware.maf.springcloudstarter.helper + +import com.jmsoftware.maf.common.util.logger +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 + +/** + * # HttpApiScanHelper + * + * Description: HttpApiScanHelper, scanning HTTP API for microservice. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/12/22 10:12 PM + */ +@Validated +class HttpApiScanHelper( + private val requestMappingHandlerMapping: RequestMappingHandlerMapping +) { + companion object { + private var EXCLUDED_PACKAGE: String + private val log = logger() + + init { + val packagePaths = HttpApiScanHelper::class.java.getPackage().name.split(".") + // Remove the last package name + val jointPackage = buildString { + for (index in 0 until packagePaths.size - 1) { + append("${packagePaths[index]}.") + } + } + // Remove the last '.' + EXCLUDED_PACKAGE = jointPackage.substring(0, jointPackage.length - 1) + log.warn("EXCLUDED_PACKAGE was generated dynamically. EXCLUDED_PACKAGE = $EXCLUDED_PACKAGE") + } + } + + /** + * Scan map. + * + * @param includedPackage the included package + * @return the map + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 12/25/2020 4:02 PM + */ + fun scan(@NotBlank includedPackage: String): Map { + val handlerMethods = requestMappingHandlerMapping.handlerMethods + log.debug("Scanned request mapping info: {}", handlerMethods) + val filteredHandlerMethods = LinkedHashMap() + handlerMethods.forEach { (requestMappingInfo: RequestMappingInfo, handlerMethod: 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 = listOf(requestMappingInfo.methodsCondition.methods)[0] + log.debug( + "Request: [{}] {}, handler method: {}", requestMethod, + requestMappingInfo.patternsCondition, handlerMethod + ) + filteredHandlerMethods[requestMappingInfo] = handlerMethod + } catch (e: Exception) { + log.warn( + "Exception occurred when getting request method. Exception message: {}. Request mapping " + + "info: {}", + e.message, 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 deleted file mode 100644 index 6ede6f6a..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/helper/IpHelper.java +++ /dev/null @@ -1,90 +0,0 @@ -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 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 -@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: {}", DEVELOPMENT_ENVIRONMENT); - return this.getInternetIp(); - } - // An API provided by https://whatismyipaddress.com/api - try { - return HttpUtil.get("https://ipv4bot.whatismyipaddress.com/").trim(); - } catch (Exception e) { - log.warn("Failed to get public IP address, fallback to intranet IP address. Exception: {}", e.getMessage()); - return this.getInternetIp(); - } - } - - /** - * 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/IpHelper.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/helper/IpHelper.kt new file mode 100644 index 00000000..fd8aad9e --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/helper/IpHelper.kt @@ -0,0 +1,89 @@ +package com.jmsoftware.maf.springcloudstarter.helper + +import cn.hutool.core.util.StrUtil +import cn.hutool.http.HttpUtil +import com.jmsoftware.maf.common.util.logger +import org.springframework.boot.web.context.WebServerInitializedEvent +import org.springframework.context.ApplicationListener +import org.springframework.core.env.Environment +import java.net.Inet4Address +import java.net.InetAddress +import java.net.NetworkInterface +import java.util.* + +/** + * # ServerConfiguration + * + * Change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/17/22 8:05 AM + */ +class IpHelper( + private val environment: Environment +) : ApplicationListener { + companion object { + private const val DEVELOPMENT_ENVIRONMENT = "development" + private val log = logger() + } + + var serverPort = 0 + + override fun onApplicationEvent(event: WebServerInitializedEvent) { + serverPort = event.webServer.port + } + + /** + * Find public IP address. + * + * @return public IP + */ + fun getPublicIp(): String { + val jointProfiles = java.lang.String.join(",", *environment.activeProfiles) + if (StrUtil.containsIgnoreCase(jointProfiles, DEVELOPMENT_ENVIRONMENT)) { + log.debug("Current active profiles for environment contains: {}", DEVELOPMENT_ENVIRONMENT) + return internetIp() + } + // An API provided by https://whatismyipaddress.com/api + return try { + HttpUtil.get("https://ipv4bot.whatismyipaddress.com/").trim { it <= ' ' } + } catch (e: Exception) { + log.warn( + "Failed to get public IP address, fallback to intranet IP address. Exception: {}", + e.message + ) + internetIp() + } + } + + /** + * Get internet IP. + * + * @return internet IP + */ + private fun internetIp(): String { + val intranetIp = intranetIp() + val networks = NetworkInterface.getNetworkInterfaces() + var ip: InetAddress + var addresses: Enumeration + while (networks.hasMoreElements()) { + addresses = networks.nextElement().inetAddresses + while (addresses.hasMoreElements()) { + ip = addresses.nextElement() + if (ip is Inet4Address + && ip.isSiteLocalAddress() + && ip.getHostAddress() != intranetIp + ) { + return ip.getHostAddress() + } + } + } + return intranetIp + } + + /** + * Get intranet IP. + * + * @return intranet IP + */ + private fun intranetIp(): String = InetAddress.getLocalHost().hostAddress +} 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 deleted file mode 100644 index 82e9200f..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/helper/SpringBootStartupHelper.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.jmsoftware.maf.springcloudstarter.helper; - -import com.jmsoftware.maf.springcloudstarter.property.MafProjectProperties; -import lombok.NonNull; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.DisposableBean; -import org.springframework.context.ApplicationContext; -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 -@RequiredArgsConstructor -public class SpringBootStartupHelper implements DisposableBean { - private static final String LINE_SEPARATOR = System.lineSeparator(); - @SuppressWarnings("HttpUrlsUsage") - private static final String TEMPLATE = LINE_SEPARATOR + - "🥳 Congratulations! 🎉" + LINE_SEPARATOR + - "🖥 {}@{} started! " + LINE_SEPARATOR + - "⚙️ Environment: {}" + LINE_SEPARATOR + - "⏳ Deployment duration: {} seconds ({} ms)" + LINE_SEPARATOR + - "⏰ App started at {} (timezone - {})" + LINE_SEPARATOR + - " App running at" + LINE_SEPARATOR + - " - Local: http://localhost:{}{}/" + LINE_SEPARATOR + - " - Network: http://{}:{}{}/"; - private final MafProjectProperties mafProjectProperties; - private final IpHelper ipHelper; - private final ApplicationContext applicationContext; - - public void stop(@NonNull StopWatch stopWatch) { - stopWatch.stop(); - log.info( - TEMPLATE, - this.mafProjectProperties.getProjectArtifactId(), this.mafProjectProperties.getVersion(), - this.mafProjectProperties.getEnvironment(), - stopWatch.getTotalTimeSeconds(), stopWatch.getTotalTimeMillis(), - Instant.now().atZone(ZoneId.systemDefault()), ZoneId.systemDefault(), - this.ipHelper.getServerPort(), this.mafProjectProperties.getContextPath(), - this.ipHelper.getPublicIp(), this.ipHelper.getServerPort(), this.mafProjectProperties.getContextPath() - ); - this.applicationContext.getAutowireCapableBeanFactory().destroyBean(this); - } - - @Override - public void destroy() { - log.warn("Destroyed bean: {}", this.getClass().getSimpleName()); - } -} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/helper/SpringBootStartupHelper.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/helper/SpringBootStartupHelper.kt new file mode 100644 index 00000000..17441fdd --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/helper/SpringBootStartupHelper.kt @@ -0,0 +1,58 @@ +package com.jmsoftware.maf.springcloudstarter.helper + +import com.jmsoftware.maf.common.util.logger +import com.jmsoftware.maf.springcloudstarter.property.MafProjectProperties +import org.springframework.beans.factory.DisposableBean +import org.springframework.boot.system.JavaVersion +import org.springframework.context.ApplicationContext +import org.springframework.util.StopWatch +import java.time.Instant +import java.time.ZoneId + +/** + * # SpringBootStartupHelper + * + * Description: SpringBootStartupHelper, change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/12/22 10:04 PM + */ +class SpringBootStartupHelper( + private val mafProjectProperties: MafProjectProperties, + private val ipHelper: IpHelper, + private val applicationContext: ApplicationContext +) : DisposableBean { + companion object { + @Suppress("HttpUrlsUsage") + private val TEMPLATE: String = + """ + + ☕ ️️Powered by Kotlin :: v${KotlinVersion.CURRENT}, Java :: v${JavaVersion.getJavaVersion()} + 🥳 Congratulations! 🎉 + 🖥 {}@{} started! + ⚙️ Environment: {} + ⏳ Deployment duration: {} seconds ({} ms) + ⏰ App started at {} (timezone - {}) + App running at + - Local: http://localhost:{}{}/ + - Network: http://{}:{}{}/ + """.trimIndent() + private val log = logger() + } + fun stop(stopWatch: StopWatch) { + stopWatch.stop() + log.info( + TEMPLATE, + mafProjectProperties.projectArtifactId, mafProjectProperties.version, + mafProjectProperties.environment, + stopWatch.totalTimeSeconds, stopWatch.totalTimeMillis, + Instant.now().atZone(ZoneId.systemDefault()), ZoneId.systemDefault(), + ipHelper.serverPort, mafProjectProperties.contextPath, + ipHelper.getPublicIp(), ipHelper.serverPort, mafProjectProperties.contextPath + ) + applicationContext.autowireCapableBeanFactory.destroyBean(this) + } + + override fun destroy() { + log.warn("Destroyed bean: ${this.javaClass.simpleName}") + } +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/minio/MinioConfiguration.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/minio/MinioConfiguration.java deleted file mode 100644 index 4adc222a..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/minio/MinioConfiguration.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.jmsoftware.maf.springcloudstarter.minio; - -import io.minio.MinioClient; -import lombok.extern.slf4j.Slf4j; -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; - -/** - *

MinioConfiguration

- *

- * Change description here. - * - * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 6/7/21 9:58 PM - **/ -@Slf4j -@EnableConfigurationProperties({ - MinioProperties.class -}) -@ConditionalOnClass({MinioClient.class}) -@ConditionalOnProperty({"minio.enabled"}) -public class MinioConfiguration { - @Bean - public MinioClient minioClient(MinioProperties minioProperties) { - log.warn("Initial bean: '{}'", MinioClient.class.getSimpleName()); - return MinioClient.builder() - .endpoint(minioProperties.getEndpoint(), minioProperties.getPort(), - minioProperties.getSecure()) - .credentials(minioProperties.getAccessKey(), minioProperties.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/minio/MinioConfiguration.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/minio/MinioConfiguration.kt new file mode 100644 index 00000000..775ea50f --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/minio/MinioConfiguration.kt @@ -0,0 +1,42 @@ +package com.jmsoftware.maf.springcloudstarter.minio + +import com.jmsoftware.maf.common.util.logger +import io.minio.MinioClient +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty +import org.springframework.boot.context.properties.EnableConfigurationProperties +import org.springframework.context.annotation.Bean + +/** + * # MinioConfiguration + * + * Change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/14/22 3:25 PM + */ +@ConditionalOnProperty("minio.enabled") +@ConditionalOnClass(MinioClient::class) +@EnableConfigurationProperties(MinioProperties::class) +class MinioConfiguration { + companion object { + private val log = logger() + } + + @Bean + fun minioClient(minioProperties: MinioProperties): MinioClient { + log.warn("Initial bean: `${MinioClient::class.java.simpleName}`" ) + return MinioClient.builder() + .endpoint( + minioProperties.endpoint, minioProperties.port, + minioProperties.secure + ) + .credentials(minioProperties.accessKey, minioProperties.secretKey) + .build() + } + + @Bean + fun minioHelper(minioClient: MinioClient): MinioHelper { + log.warn("Initial bean: `${MinioHelper::class.java.simpleName}`" ) + return MinioHelper(minioClient) + } +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/minio/MinioHelper.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/minio/MinioHelper.java deleted file mode 100644 index 81583e30..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/minio/MinioHelper.java +++ /dev/null @@ -1,227 +0,0 @@ -package com.jmsoftware.maf.springcloudstarter.minio; - -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.lang.Nullable; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.multipart.MultipartFile; - -import javax.validation.constraints.*; -import java.io.InputStream; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -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 -@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 bucket) { - return this.minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucket).build()); - } - - @SneakyThrows - @SuppressWarnings("UnusedReturnValue") - public boolean makeBucket(@NotBlank String bucket) { - if (this.bucketExists(bucket)) { - log.warn("The bucket named '{}' exists", bucket); - return false; - } - this.minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucket).build()); - return true; - } - - @SneakyThrows - public ObjectWriteResponse put(@NotBlank String bucket, @NotBlank String object, - @NotNull MultipartFile multipartFile) { - return this.minioClient.putObject( - PutObjectArgs.builder() - .bucket(bucket) - .object(object) - .stream(multipartFile.getInputStream(), multipartFile.getSize(), -1) - .contentType(multipartFile.getContentType()) - .build()); - } - - @SneakyThrows - public ObjectWriteResponse putObject(@NotBlank String bucket, @NotBlank String object, - @NotNull InputStream inputStream, @NotBlank String contentType) { - return this.minioClient.putObject( - PutObjectArgs - .builder() - .bucket(bucket) - .object(object) - .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 bucket) { - if (!this.bucketExists(bucket)) { - return false; - } - val myObjects = this.listObjects(bucket); - 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(bucket).build()); - return !this.bucketExists(bucket); - } - - @SneakyThrows - public List listObjectNames(@NotBlank String bucket) { - val listObjectNames = new LinkedList(); - if (!this.bucketExists(bucket)) { - return listObjectNames; - } - val myObjects = this.listObjects(bucket); - for (val result : myObjects) { - val item = result.get(); - listObjectNames.add(item.objectName()); - } - return listObjectNames; - } - - @SneakyThrows - public Iterable> listObjects(@NotBlank String bucket) { - if (!this.bucketExists(bucket)) { - return null; - } - return this.minioClient.listObjects(ListObjectsArgs.builder().bucket(bucket).build()); - } - - @SneakyThrows - public GetObjectResponse getObject(@NotBlank String bucket, @NotBlank String object) { - if (!this.bucketExists(bucket)) { - return null; - } - val statObjectResponse = this.statObject(bucket, object); - if (ObjectUtil.isNull(statObjectResponse) || statObjectResponse.size() == 0) { - return null; - } - return this.minioClient.getObject(GetObjectArgs.builder().bucket(bucket).object(object).build()); - } - - @SneakyThrows - public GetObjectResponse getObject(@NotBlank String bucket, @NotBlank String object, @Min(0L) long offset, - @NotNull @Min(0L) Long length) { - if (!this.bucketExists(bucket)) { - return null; - } - val statObjectResponse = this.statObject(bucket, object); - if (ObjectUtil.isNull(statObjectResponse) || statObjectResponse.size() == 0) { - return null; - } - return this.minioClient.getObject( - GetObjectArgs.builder().bucket(bucket).object(object).offset(offset).length(length).build()); - } - - @SneakyThrows - public boolean removeObjects(String bucket, String object) { - if (!this.bucketExists(bucket)) { - return false; - } - this.minioClient.removeObject(RemoveObjectArgs.builder().bucket(bucket).object(object).build()); - return true; - } - - @SneakyThrows - public List removeObjects(String bucket, List objects) { - val deleteErrorNameList = new LinkedList(); - if (this.bucketExists(bucket)) { - val deleteObjectList = objects.stream().map(DeleteObject::new).collect(Collectors.toList()); - val results = this.minioClient.removeObjects( - RemoveObjectsArgs.builder().bucket(bucket).objects(deleteObjectList).build()); - for (val result : results) { - val error = result.get(); - deleteErrorNameList.add(error.objectName()); - } - } - return deleteErrorNameList; - } - - @SneakyThrows - public String getPresignedObjectUrl(@NotBlank String bucket, @NotBlank String object, - @NotNull Method method, - @NotNull @Min(1L) @Max(DEFAULT_EXPIRY_TIME) Integer expiration) { - if (!this.bucketExists(bucket)) { - return null; - } - return this.minioClient.getPresignedObjectUrl( - GetPresignedObjectUrlArgs - .builder() - .bucket(bucket) - .object(object) - .method(method) - .expiry(expiration) - .build()); - } - - @SneakyThrows - public StatObjectResponse statObject(@NotBlank String bucket, @NotBlank String object) { - if (!this.bucketExists(bucket)) { - return null; - } - return this.minioClient.statObject(StatObjectArgs.builder().bucket(bucket).object(object).build()); - } - - @SneakyThrows - public String getPresignedObjectUrl(@NotBlank String bucket, @NotBlank String object) { - if (!this.bucketExists(bucket)) { - return null; - } - return this.minioClient.getPresignedObjectUrl( - GetPresignedObjectUrlArgs.builder().bucket(bucket).object(object).build()); - } - - @SneakyThrows - public ObjectWriteResponse composeObject(@NotBlank String bucket, @NotBlank String object, - @NotEmpty List sources, - @Nullable Map headers) { - if (!this.bucketExists(bucket)) { - return null; - } - return this.minioClient.composeObject( - ComposeObjectArgs.builder().bucket(bucket).object(object).sources(sources).headers(headers).build()); - } -} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/minio/MinioHelper.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/minio/MinioHelper.kt new file mode 100644 index 00000000..7befdc82 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/minio/MinioHelper.kt @@ -0,0 +1,228 @@ +package com.jmsoftware.maf.springcloudstarter.minio + +import cn.hutool.core.collection.CollUtil +import com.google.common.collect.Lists +import com.jmsoftware.maf.common.util.logger +import io.minio.* +import io.minio.http.Method +import io.minio.messages.Bucket +import io.minio.messages.DeleteObject +import io.minio.messages.Item +import org.springframework.validation.annotation.Validated +import org.springframework.web.multipart.MultipartFile +import java.io.InputStream +import javax.validation.constraints.* + +/** + *

MinioHelper

+ * + * + * Change description here. + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 6/7/21 9:52 PM + */ +@Suppress("unused") +@Validated +class MinioHelper( + private val minioClient: MinioClient +) { + companion object { + /** + * 7 days + */ + private const val DEFAULT_EXPIRY_TIME = 7 * 24 * 3600 + private val log = logger() + } + + fun bucketExists(bucket: @NotBlank String?): Boolean { + return minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucket).build()) + } + + fun makeBucket(bucket: @NotBlank String?): Boolean { + if (bucketExists(bucket)) { + MinioHelper.log.warn("The bucket named '{}' exists", bucket) + return false + } + minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucket).build()) + return true + } + + fun put( + bucket: @NotBlank String, + `object`: @NotBlank String, + multipartFile: @NotNull MultipartFile + ): ObjectWriteResponse { + return minioClient.putObject( + PutObjectArgs.builder() + .bucket(bucket) + .`object`(`object`) + .stream(multipartFile.inputStream, multipartFile.size, -1) + .contentType(multipartFile.contentType) + .build() + ) + } + + fun putObject( + bucket: @NotBlank String, + `object`: @NotBlank String, + inputStream: @NotNull InputStream, + contentType: @NotBlank String + ): ObjectWriteResponse { + return minioClient.putObject( + PutObjectArgs + .builder() + .bucket(bucket) + .`object`(`object`) + .stream(inputStream, inputStream.available().toLong(), -1) + .contentType(contentType) + .build() + ) + } + + fun listBucketNames(): List { + return listBuckets().stream().map { obj: Bucket -> obj.name() }.toList() + } + + fun listBuckets(): List { + return minioClient.listBuckets() + } + + fun removeBucket(bucket: @NotBlank String?): Boolean { + if (!bucketExists(bucket)) { + return false + } + val myObjects = listObjects(bucket) + if (CollUtil.isEmpty(myObjects)) { + return false + } + for (result in 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 + minioClient.removeBucket(RemoveBucketArgs.builder().bucket(bucket).build()) + return !bucketExists(bucket) + } + + fun listObjectNames(bucket: @NotBlank String): List { + val objectNames = Lists.newArrayList() + if (!bucketExists(bucket)) { + return objectNames + } + val objects = listObjects(bucket) + if (CollUtil.isEmpty(objects)) { + return objectNames + } + for (result in objects!!) { + val item = result.get() + objectNames.add(item.objectName()) + } + return objectNames + } + + fun listObjects(bucket: @NotBlank String?): Iterable>? { + return if (!bucketExists(bucket)) { + null + } else minioClient.listObjects(ListObjectsArgs.builder().bucket(bucket).build()) + } + + fun getObject(bucket: @NotBlank String, `object`: @NotBlank String): GetObjectResponse? { + if (!bucketExists(bucket)) { + return null + } + val statObjectResponse = statObject(bucket, `object`) + return if (statObjectResponse == null || statObjectResponse.size() == 0L) { + null + } else minioClient.getObject(GetObjectArgs.builder().bucket(bucket).`object`(`object`).build()) + } + + fun getObject( + bucket: @NotBlank String, + `object`: @NotBlank String, + offset: @Min(0L) Long, + length: @NotNull @Min(0L) Long + ): GetObjectResponse? { + if (!bucketExists(bucket)) { + return null + } + val statObjectResponse = statObject(bucket, `object`) + return if (statObjectResponse == null || statObjectResponse.size() == 0L) { + null + } else minioClient.getObject( + GetObjectArgs.builder().bucket(bucket).`object`(`object`).offset(offset).length(length).build() + ) + } + + fun removeObjects(bucket: @NotBlank String?, `object`: @NotBlank String?): Boolean { + if (!bucketExists(bucket)) { + return false + } + minioClient.removeObject(RemoveObjectArgs.builder().bucket(bucket).`object`(`object`).build()) + return true + } + + fun removeObjects(bucket: @NotBlank String, objects: @NotEmpty List): List { + val deleteErrorNameList = mutableListOf() + if (bucketExists(bucket)) { + val deleteObjectList = objects.stream().map { name: String? -> DeleteObject(name) } + .toList() + val results = minioClient.removeObjects( + RemoveObjectsArgs.builder().bucket(bucket).objects(deleteObjectList).build() + ) + for (result in results) { + val error = result.get() + deleteErrorNameList.add(error.objectName()) + } + } + return deleteErrorNameList + } + + fun getPresignedObjectUrl( + bucket: @NotBlank String, + `object`: @NotBlank String, + method: @NotNull Method, + expiration: @NotNull @Min(1L) @Max(DEFAULT_EXPIRY_TIME.toLong()) Int = DEFAULT_EXPIRY_TIME + ): String? { + return if (!bucketExists(bucket)) { + null + } else minioClient.getPresignedObjectUrl( + GetPresignedObjectUrlArgs + .builder() + .bucket(bucket) + .`object`(`object`) + .method(method) + .expiry(expiration) + .build() + ) + } + + fun statObject(bucket: @NotBlank String, `object`: @NotBlank String): StatObjectResponse? { + return if (!bucketExists(bucket)) { + null + } else minioClient.statObject(StatObjectArgs.builder().bucket(bucket).`object`(`object`).build()) + } + + fun getPresignedObjectUrl(bucket: @NotBlank String, `object`: @NotBlank String): String? { + return if (!bucketExists(bucket)) { + null + } else minioClient.getPresignedObjectUrl( + GetPresignedObjectUrlArgs.builder().bucket(bucket).`object`(`object`).build() + ) + } + + fun composeObject( + bucket: @NotBlank String, + `object`: @NotBlank String, + sources: @NotEmpty MutableList, + headers: Map? + ): ObjectWriteResponse? { + return if (!bucketExists(bucket)) { + null + } else minioClient.composeObject( + ComposeObjectArgs.builder().bucket(bucket).`object`(`object`).sources(sources).headers(headers).build() + ) + } +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/minio/MinioProperties.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/minio/MinioProperties.java deleted file mode 100644 index b2a5a3b1..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/minio/MinioProperties.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.jmsoftware.maf.springcloudstarter.minio; - -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 = MinioProperties.PREFIX) -public class MinioProperties { - /** - * 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/minio/MinioProperties.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/minio/MinioProperties.kt new file mode 100644 index 00000000..6e3f9f79 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/minio/MinioProperties.kt @@ -0,0 +1,66 @@ +package com.jmsoftware.maf.springcloudstarter.minio + +import org.springframework.boot.context.properties.ConfigurationProperties +import org.springframework.context.annotation.Configuration +import org.springframework.validation.annotation.Validated +import javax.validation.constraints.NotBlank +import javax.validation.constraints.NotNull + +/** + * # MinioProperty + * + * Change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/14/22 3:43 PM + */ +@Validated +@Configuration +@ConfigurationProperties(prefix = MinioProperties.PREFIX) +class MinioProperties { + companion object { + /** + * The constant PREFIX. + */ + const val PREFIX = "minio" + } + + /** + * The Enabled. + */ + var enabled = false + + /** + * The Endpoint. + */ + lateinit var endpoint: @NotBlank String + + /** + * The Port. + */ + var port: @NotNull Int = 0 + + /** + * The Access key. User ID + */ + lateinit var accessKey: @NotBlank String + + /** + * The Secret key. Password + */ + lateinit var secretKey: @NotBlank String + + /** + * The Secure. + */ + var secure = false + + /** + * The Bucket name. + */ + var bucketName: String? = null + + /** + * The Config dir. + */ + var configDir: String? = null +} 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 deleted file mode 100644 index 6073f65a..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package com.jmsoftware.maf.springcloudstarter; diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/poi/AbstractExcelDataController.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/poi/AbstractExcelDataController.java deleted file mode 100644 index 96ea32f9..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/poi/AbstractExcelDataController.java +++ /dev/null @@ -1,516 +0,0 @@ -package com.jmsoftware.maf.springcloudstarter.poi; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; -import cn.hutool.poi.excel.ExcelReader; -import cn.hutool.poi.excel.ExcelWriter; -import cn.hutool.poi.excel.WorkbookUtil; -import com.google.common.collect.Lists; -import com.google.common.collect.Maps; -import com.jmsoftware.maf.common.bean.ExcelImportResult; -import com.jmsoftware.maf.common.bean.ResponseBodyBean; -import com.jmsoftware.maf.springcloudstarter.util.CaseConversionUtil; -import lombok.Cleanup; -import lombok.NonNull; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import lombok.val; -import org.apache.poi.ss.usermodel.Workbook; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.ContentDisposition; -import org.springframework.http.HttpHeaders; -import org.springframework.http.ResponseEntity; -import org.springframework.util.unit.DataSize; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.multipart.MultipartFile; -import org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBody; - -import java.io.BufferedInputStream; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.lang.reflect.ParameterizedType; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; - -/** - *

AbstractExcelDataController

- *

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. AbstractExcelDataController<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
  • - * - *
- *

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 AbstractExcelDataController { - protected final ThreadLocal> beanList = ThreadLocal.withInitial(() -> null); - protected final ThreadLocal workbook = ThreadLocal.withInitial(() -> null); - protected final ThreadLocal excelFilePath = ThreadLocal.withInitial(() -> null); - protected final ThreadLocal exceptionOccurred = ThreadLocal.withInitial(() -> false); - protected final ThreadLocal> errorMessageList = ThreadLocal.withInitial(Lists::newLinkedList); - protected final ThreadLocal> returnMessageList = ThreadLocal.withInitial(Lists::newLinkedList); - /** - * `fileName` stores the name to upload the workbook when exception occurred - */ - protected final ThreadLocal fileName = ThreadLocal.withInitial(() -> null); - - /** - *
- * - * - * - *
KeyValue
Excel Column NameexcelColumnName
Title - * NametitleName
- */ - protected final Map importingFieldAliasMap = Maps.newLinkedHashMap(); - /** - *
- * - * - * - *
KeyValue
excelColumnNameExcel Column Name
titleNameTitle - * Name
- */ - protected final Map exportingFieldAliasMap = Maps.newLinkedHashMap(); - - @Autowired - protected ExcelImportConfigurationProperties excelImportConfigurationProperties; - @Autowired - protected OssUploader ossUploader; - /** - * Deny all data when data validation fails. Default value is true. - */ - private boolean denyAll = true; - private Class beanClass; - private String[] fieldNameArray; - - /** - *

Constructor of AbstractExcelDataController

- *
    - *
  1. Init context

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

    - *
  4. - *
  5. Register handler methods

    - *
  6. - *
- */ - protected AbstractExcelDataController() { - this.initContext(); - } - - /** - *

Init context.

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

    - *
  2. - *
  3. Set fieldNameArray

    - *
  4. - *
- */ - protected void initContext() { - this.beanClass = this.getGenericClass(); - val declaredFields = this.beanClass.getDeclaredFields(); - val fieldNames = new String[declaredFields.length]; - for (var index = 0; index < declaredFields.length; index++) { - val declaredField = declaredFields[index]; - fieldNames[index] = declaredField.getName(); - val excelColumn = declaredField.getAnnotation(ExcelColumn.class); - var columnName = ObjectUtil.isNotNull(excelColumn) ? excelColumn.name() : null; - if (StrUtil.isBlank(columnName)) { - columnName = CaseConversionUtil.convertToStartCase(StrUtil.toSymbolCase(declaredField.getName(), ' ')); - } - this.importingFieldAliasMap.put(columnName, declaredField.getName()); - this.exportingFieldAliasMap.put(declaredField.getName(), columnName); - } - this.fieldNameArray = fieldNames; - log.info("Generated {} field name array by reflection, fieldNames: {}", this.beanClass.getSimpleName(), - this.fieldNameArray); - } - - /** - * Init locale context. - */ - private void initLocaleContext() { - this.exceptionOccurred.set(false); - this.errorMessageList.set(Lists.newLinkedList()); - this.returnMessageList.set(Lists.newLinkedList()); - log.debug("Initialized locale context: {}", this.threadLocalToString()); - } - - /** - * Destroy locale context. - */ - private void destroyLocaleContext() { - this.beanList.remove(); - this.closeWorkbook(this.workbook.get()); - this.workbook.remove(); - this.excelFilePath.remove(); - this.exceptionOccurred.remove(); - this.errorMessageList.remove(); - this.returnMessageList.remove(); - this.fileName.remove(); - log.debug("Destroyed locale context and invalidate thread local variables: {}", this.threadLocalToString()); - } - - private String threadLocalToString() { - val map = new LinkedHashMap(); - map.put("beanList", this.beanList.get()); - map.put("workbook", this.workbook.get()); - map.put("excelFilePath", this.excelFilePath.get()); - map.put("exceptionOccurred", this.exceptionOccurred.get()); - map.put("errorMessageList", this.errorMessageList.get()); - map.put("returnMessageList", this.returnMessageList.get()); - map.put("fileName", this.fileName.get()); - return map.toString(); - } - - /** - * Before execute. - */ - protected void beforeExecute() { - } - - /** - * On exception occurred. - */ - protected abstract void onExceptionOccurred(); - - /** - * 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 - * @throws IllegalArgumentException the illegal argument exception - */ - protected abstract void validateBeforeAddToBeanList(List beanList, T bean, int index) throws IllegalArgumentException; - - /** - * Before database operation. - * - * @param beanList the bean list - */ - protected void beforeDatabaseOperation(List beanList) { - } - - /** - * Execute database operation. - * - * @param beanList the bean list that can be used for DB operations - */ - protected abstract void executeDatabaseOperation(List beanList); - - /** - * After execute. Delete file. - */ - protected void afterExecute() { - } - - /** - * Gets template file name. - * - * @return the template file name - */ - protected abstract String getTemplateFileName(); - - /** - * Gets list for exporting. - * - * @return the list for exporting - */ - protected abstract List getListForExporting(); - - /** - * Before download to configure ExcelWriter. Such as hiding column. - * - * @param excelWriter the excel writer - */ - protected void beforeDownload(ExcelWriter excelWriter) { - } - - @GetMapping("/stat/excel-template") - public ResponseEntity downloadExcelTemplate() { - val excelWriter = new ExcelWriter(true); - excelWriter.setHeaderAlias(this.exportingFieldAliasMap); - excelWriter.write(this.getListForExporting()); - excelWriter.setFreezePane(1); - excelWriter.autoSizeColumnAll(); - this.beforeDownload(excelWriter); - return ResponseEntity.ok() - .header(HttpHeaders.CONTENT_DISPOSITION, - ContentDisposition.builder("attachment").filename( - this.getTemplateFileName()).build().toString()) - .body(outputStream -> excelWriter.flush(outputStream, true)); - } - - /** - * Upload excel file. Any exceptions happened in any lifecycle will not interrupt the whole process. - * - * @param multipartFile the multipart file - * @return the response body bean - */ - @PostMapping(value = "/upload/excel") - public ResponseBodyBean upload(@RequestParam("file") MultipartFile multipartFile) { - this.beforeExecute(); - this.initLocaleContext(); - this.readMultipartFile(multipartFile); - this.bindData(); - this.beforeDatabaseOperation(this.beanList.get()); - this.exeDatabaseOperation(); - this.handlePreviousException(); - val excelImportResult = this.buildResult(); - this.afterExecute(); - this.destroyLocaleContext(); - return ResponseBodyBean.ofSuccess(excelImportResult); - } - - private ExcelImportResult buildResult() { - val excelImportResult = new ExcelImportResult(); - excelImportResult.setMessageList(this.returnMessageList.get()); - excelImportResult.setExcelFilePath(this.excelFilePath.get()); - return excelImportResult; - } - - private void handlePreviousException() { - if (Boolean.TRUE.equals(this.exceptionOccurred.get())) { - this.onExceptionOccurred(); - this.uploadWorkbook(); - } - } - - private void exeDatabaseOperation() { - // if no error message (errorMessageList if empty) or not denyAll, then execute DB operation - if (CollUtil.isEmpty(this.errorMessageList.get()) || !this.denyAll) { - if (CollUtil.isNotEmpty(this.beanList.get())) { - this.setReturnMessageList("Starting - Import data…"); - try { - this.executeDatabaseOperation(this.beanList.get()); - this.setReturnMessageList( - String.format("Finished - Import data. Imported count: %d", this.beanList.get().size())); - } catch (Exception e) { - this.exceptionOccurred.set(true); - log.error("Exception occurred when executing DB operation!", e); - this.setErrorMessage( - String.format("Exception occurred when executing DB operation! Exception message: %s", - e.getMessage())); - } - } else { - this.setReturnMessageList( - String.format("Finished - Import data. Empty list. Imported count: %d", - this.beanList.get().size())); - } - } else { - this.setReturnMessageList("[Warning] Found not valid data. Data import all failed!"); - } - } - - private void bindData() { - this.setReturnMessageList("Starting - Validate and bind data…"); - try { - this.bindData(this.workbook.get()); - this.setReturnMessageList("Finished - Validate and bind data"); - } catch (Exception e) { - log.error("Exception occurred when validating and binding data!", e); - this.setErrorMessage( - String.format("Exception occurred when validating and binding data! Exception message: %s", - e.getMessage())); - } - } - - private void readMultipartFile(MultipartFile multipartFile) { - try { - this.setReturnMessageList("Starting - Read Excel file…"); - this.workbook.set(this.readFile(multipartFile)); - this.setReturnMessageList("Finished - Read Excel file"); - } catch (IOException e) { - log.error("Exception occurred when reading Excel file!", e); - this.setErrorMessage( - String.format("Exception occurred when reading Excel file! Exception message: %s", e.getMessage())); - } - } - - /** - * Gets generic class. - * - * @return the generic class - */ - private Class getGenericClass() { - val type = this.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 IllegalArgumentException(e.getMessage()); - } - return aClass; - } - throw new IllegalArgumentException("Cannot find the type from the generic class!"); - } - - /** - * Sets field name array. - * - * @param fieldNameArray the field name array - */ - public void setFieldNameArray(String[] fieldNameArray) { - this.fieldNameArray = fieldNameArray; - } - - /** - * Read the file into workbook. - * - * @param multipartFile the multipart file - * @return the workbook - * @throws IOException the io exception - */ - private Workbook readFile(@NonNull MultipartFile multipartFile) throws IOException { - return WorkbookUtil.createBook(multipartFile.getInputStream()); - } - - @SneakyThrows - private void uploadWorkbook() { - // FIXME: might cause OOM - @Cleanup val outputStream = new ByteArrayOutputStream((int) DataSize.ofBytes(512).toBytes()); - this.workbook.get().write(outputStream); - @Cleanup val inputStream = new BufferedInputStream(new ByteArrayInputStream(outputStream.toByteArray())); - val filePath = this.ossUploader.upload(this.fileName.get(), inputStream); - log.info("Uploaded excel with exception message. filePath: {}", filePath); - this.excelFilePath.set(filePath); - } - - /** - *

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 - */ - @SuppressWarnings("RedundantThrows") - private void bindData(Workbook workbook) { - for (var index = 0; index < workbook.getNumberOfSheets(); index++) { - val sheet = workbook.getSheetAt(index); - val excelReader = new ExcelReader(workbook, index); - excelReader.setHeaderAlias(this.importingFieldAliasMap); - this.beanList.set(excelReader.readAll(this.beanClass)); - // The reason why validating bean by row is to generate error message behind the last column - for (var beanIndex = 0; beanIndex < this.beanList.get().size(); beanIndex++) { - this.validateBeanByRow(index, beanIndex); - } - } - } - - private void validateBeanByRow(int sheetIndex, int beanIndex) { - try { - this.validateBeforeAddToBeanList(this.beanList.get(), this.beanList.get().get(beanIndex), beanIndex); - } catch (Exception e) { - log.error("bindRowToBean method has encountered a problem!", e); - this.exceptionOccurred.set(true); - val errorMessage = String.format( - "Exception occurred when binding and validating the data of row number %d. " + - "Exception message: %s", beanIndex + 1, e.getMessage()); - this.setErrorMessage(errorMessage); - val errorRow = this.workbook.get().getSheetAt(sheetIndex).getRow(beanIndex + 1); - val errorInformationCell = errorRow.createCell(this.fieldNameArray.length); - errorInformationCell.setCellValue(errorMessage); - } - } - - /** - * Sets deny all. When exception occurred, deny all data or not - * - * @param denyAll true is deny all or vice versa - */ - 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); - this.setReturnMessageList(errorInfo); - } - - /** - * Sets return message list. - * - * @param message the message - */ - protected void setReturnMessageList(String message) { - this.returnMessageList.get().add(message); - } - - /** - * 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); - } - } - } -} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/poi/AbstractExcelDataController.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/poi/AbstractExcelDataController.kt new file mode 100644 index 00000000..818ef023 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/poi/AbstractExcelDataController.kt @@ -0,0 +1,460 @@ +package com.jmsoftware.maf.springcloudstarter.poi + +import cn.hutool.core.collection.CollUtil +import cn.hutool.core.text.CharSequenceUtil +import cn.hutool.core.util.StrUtil +import cn.hutool.poi.excel.ExcelReader +import cn.hutool.poi.excel.ExcelWriter +import cn.hutool.poi.excel.WorkbookUtil +import com.google.common.collect.Lists +import com.google.common.collect.Maps +import com.jmsoftware.maf.common.bean.ExcelImportResult +import com.jmsoftware.maf.common.bean.ResponseBodyBean +import com.jmsoftware.maf.common.util.logger +import com.jmsoftware.maf.springcloudstarter.util.CaseConversionUtil +import org.apache.poi.ss.usermodel.Workbook +import org.springframework.http.ContentDisposition +import org.springframework.http.HttpHeaders +import org.springframework.http.ResponseEntity +import org.springframework.util.unit.DataSize +import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.PostMapping +import org.springframework.web.bind.annotation.RequestParam +import org.springframework.web.multipart.MultipartFile +import org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBody +import java.io.* +import java.lang.reflect.ParameterizedType +import javax.annotation.Resource + +/** + * # AbstractExcelDataController + * + * Change description here. + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, 4/14/22 4:00 PM + **/ +abstract class AbstractExcelDataController { + companion object { + private val log = logger() + } + + protected val beanList: ThreadLocal?> = ThreadLocal.withInitial { null } + protected val workbook: ThreadLocal = ThreadLocal.withInitial { null } + protected val excelFilePath: ThreadLocal = ThreadLocal.withInitial { null } + protected val exceptionOccurred: ThreadLocal = ThreadLocal.withInitial { false } + protected val errorMessageList: ThreadLocal> = ThreadLocal.withInitial { mutableListOf() } + protected val returnMessageList: ThreadLocal> = ThreadLocal.withInitial { mutableListOf() } + + /** + * `fileName` stores the name to upload the workbook when exception occurred + */ + protected val fileName: ThreadLocal = ThreadLocal.withInitial { null } + + /** + * | Key | Value | + * | ----------------- | --------------- | + * | Excel Column Name | excelColumnName | + * | Title Name | titleName | + */ + protected val importingFieldAliasMap: MutableMap = Maps.newLinkedHashMap() + + /** + * | Key | Value | + * | --------------- | ----------------- | + * | excelColumnName | Excel Column Name | + * | titleName | Title Name | + */ + protected val exportingFieldAliasMap: MutableMap = Maps.newLinkedHashMap() + + @Resource + protected lateinit var excelImportConfigurationProperties: ExcelImportConfigurationProperties + + @Resource + protected lateinit var ossUploader: OssUploader + + /** + * Deny all data when data validation fails. Default value is true. + */ + private var denyAll = true + private lateinit var beanClass: Class + private lateinit var fieldNameArray: Array + + /** + * Constructor of AbstractExcelDataController + * + * 1. Init context + * 2. Register bind handler methods + * 3. Register handler methods + */ + protected fun AbstractExcelDataController() { + initContext() + } + + /** + * Init context. + * + * 1. Call `getGenericClass()` to set Excel import type; + * 2. Set fieldNameArray + */ + private fun initContext() { + beanClass = getGenericClass() + val declaredFields = beanClass.declaredFields + val fieldNames = mutableListOf() + for (index in declaredFields.indices) { + val declaredField = declaredFields[index] + fieldNames.add(declaredField.name) + val excelColumn = declaredField.getAnnotation(ExcelColumn::class.java) + var columnName = excelColumn?.name + if (StrUtil.isBlank(columnName)) { + columnName = CaseConversionUtil.convertToStartCase(StrUtil.toSymbolCase(declaredField.name, ' ')) + } + importingFieldAliasMap[columnName!!] = declaredField.name + exportingFieldAliasMap[declaredField.name] = columnName + } + fieldNameArray = fieldNames.toTypedArray() + log.info("Generated ${beanClass.simpleName} field name array by reflection, fieldNames: $fieldNameArray") + } + + private fun getGenericClass(): Class { + val type = this.javaClass.genericSuperclass + log.info("Got type by reflection, typeName: ${type.typeName}") + if (type is ParameterizedType) { + val typeName: String = type.actualTypeArguments[0].typeName + return try { + @Suppress("UNCHECKED_CAST") + Class.forName(typeName) as Class + } catch (e: ClassNotFoundException) { + log.error("Exception occurred when looking for class!", e) + throw IllegalArgumentException(e.message) + } + } + throw IllegalArgumentException("Cannot find the type from the generic class!") + } + + + /** + * Init locale context. + */ + private fun initLocaleContext() { + exceptionOccurred.set(false) + errorMessageList.set(Lists.newLinkedList()) + returnMessageList.set(Lists.newLinkedList()) + log.debug("Initialized locale context: ${threadLocalToString()}") + } + + /** + * Destroy locale context. + */ + private fun destroyLocaleContext() { + beanList.remove() + closeWorkbook(workbook.get()) + workbook.remove() + excelFilePath.remove() + exceptionOccurred.remove() + errorMessageList.remove() + returnMessageList.remove() + fileName.remove() + log.debug("Destroyed locale context and invalidate thread local variables: ${threadLocalToString()}") + } + + + private fun threadLocalToString(): String { + val map = LinkedHashMap() + map["beanList"] = beanList.get() + map["workbook"] = workbook.get() + map["excelFilePath"] = excelFilePath.get() + map["exceptionOccurred"] = exceptionOccurred.get() + map["errorMessageList"] = errorMessageList.get() + map["returnMessageList"] = returnMessageList.get() + map["fileName"] = fileName.get() + return map.toString() + } + + /** + * Before execute. + */ + protected open fun beforeExecute() = Unit + + /** + * On exception occurred. + */ + protected abstract fun onExceptionOccurred() + + + /** + * 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 + * @throws IllegalArgumentException the illegal argument exception + */ + protected abstract fun validateBeforeAddToBeanList(beanList: List, bean: T, index: Int) + + /** + * Before database operation. + * + * @param beanList the bean list + */ + protected open fun beforeDatabaseOperation(beanList: List) = Unit + + /** + * Execute database operation. + * + * @param beanList the bean list that can be used for DB operations + */ + protected abstract fun executeDatabaseOperation(beanList: List) + + /** + * After execute. Delete file. + */ + protected open fun afterExecute() = Unit + + /** + * Gets template file name. + * + * @return the template file name + */ + protected abstract fun getTemplateFileName(): String + + /** + * Gets list for exporting. + * + * @return the list for exporting + */ + protected abstract fun getListForExporting(): List + + /** + * Before download to configure ExcelWriter. Such as hiding column. + * + * @param excelWriter the excel writer + */ + protected open fun beforeDownload(excelWriter: ExcelWriter) = Unit + + @GetMapping("/stat/excel-template") + open fun downloadExcelTemplate(): ResponseEntity { + val excelWriter = ExcelWriter(true) + excelWriter.setHeaderAlias(exportingFieldAliasMap) + excelWriter.write(getListForExporting()) + excelWriter.setFreezePane(1) + excelWriter.autoSizeColumnAll() + beforeDownload(excelWriter) + return ResponseEntity.ok() + .header( + HttpHeaders.CONTENT_DISPOSITION, + ContentDisposition.builder("attachment").filename(getTemplateFileName()).build().toString() + ) + .body(StreamingResponseBody { outputStream: OutputStream -> + excelWriter.flush( + outputStream, + true + ) + }) + } + + /** + * Upload Excel file. Any exceptions happened in any lifecycle will not interrupt the whole process. + * + * @param multipartFile the multipart file + * @return the response body bean + */ + @PostMapping(value = ["/upload/excel"]) + open fun upload(@RequestParam("file") multipartFile: MultipartFile): ResponseBodyBean { + beforeExecute() + initLocaleContext() + readMultipartFile(multipartFile) + bindData() + beforeDatabaseOperation(beanList.get()!!) + exeDatabaseOperation() + handlePreviousException() + val excelImportResult: ExcelImportResult = buildResult() + afterExecute() + destroyLocaleContext() + return ResponseBodyBean.ofSuccess(excelImportResult) + } + + + private fun buildResult(): ExcelImportResult { + val excelImportResult = ExcelImportResult() + excelImportResult.messageList = returnMessageList.get() + excelImportResult.excelFilePath = excelFilePath.get() + return excelImportResult + } + + private fun handlePreviousException() { + if (exceptionOccurred.get()) { + onExceptionOccurred() + uploadWorkbook() + } + } + + private fun exeDatabaseOperation() { + // if no error message (errorMessageList if empty) or not denyAll, then execute DB operation + if (CollUtil.isEmpty(errorMessageList.get()) || !denyAll) { + if (CollUtil.isNotEmpty(beanList.get())) { + setReturnMessageList("Starting - Import data…") + try { + executeDatabaseOperation(beanList.get()!!) + setReturnMessageList( + CharSequenceUtil.format("Finished - Import data. Imported count: {}", beanList.get()!!.size) + ) + } catch (e: Exception) { + exceptionOccurred.set(true) + log.error("Exception occurred when executing DB operation!", e) + setErrorMessage( + CharSequenceUtil.format( + "Exception occurred when executing DB operation! Exception message: {}", + e.message + ) + ) + } + } else { + setReturnMessageList( + CharSequenceUtil.format( + "Finished - Import data. Empty list. Imported count: {}", + beanList.get()!!.size + ) + ) + } + } else { + setReturnMessageList("[Warning] Found not valid data. Data import all failed!") + } + } + + private fun bindData() { + setReturnMessageList("Starting - Validate and bind data…") + try { + bindData(workbook.get()!!) + setReturnMessageList("Finished - Validate and bind data") + } catch (e: java.lang.Exception) { + log.error("Exception occurred when validating and binding data!", e) + setErrorMessage( + CharSequenceUtil.format( + "Exception occurred when validating and binding data! Exception message: {}", + e.message + ) + ) + } + } + + private fun readMultipartFile(multipartFile: MultipartFile) { + try { + setReturnMessageList("Starting - Read Excel file…") + workbook.set(readFile(multipartFile)) + setReturnMessageList("Finished - Read Excel file") + } catch (e: IOException) { + log.error("Exception occurred when reading Excel file!", e) + setErrorMessage( + CharSequenceUtil.format("Exception occurred when reading Excel file! Exception message: {}", e.message) + ) + } + } + + + /** + * Sets field name array. + * + * @param fieldNameArray the field name array + */ + fun setFieldNameArray(fieldNameArray: Array) { + this.fieldNameArray = fieldNameArray + } + + /** + * Read the file into workbook. + * + * @param multipartFile the multipart file + * @return the workbook + * @throws IOException the io exception + */ + private fun readFile(multipartFile: MultipartFile): Workbook { + return WorkbookUtil.createBook(multipartFile.inputStream) + } + + private fun uploadWorkbook() { + // FIXME: might cause OOM + ByteArrayOutputStream(DataSize.ofBytes(512).toBytes().toInt()).use { it1 -> + workbook.get()?.write(it1) + BufferedInputStream(ByteArrayInputStream(it1.toByteArray())).use { it2 -> + val filePath = ossUploader.upload(fileName.get()!!, it2) + log.info("Uploaded excel with exception message. filePath: {}", filePath) + excelFilePath.set(filePath) + } + } + } + + /** + * 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 + */ + private fun bindData(workbook: Workbook) { + for (index in 0 until workbook.numberOfSheets) { + val excelReader = ExcelReader(workbook, index) + excelReader.headerAlias = importingFieldAliasMap + beanList.set(excelReader.readAll(beanClass)) + // The reason why validating bean by row is to generate error message behind the last column + for (beanIndex in beanList.get()!!.indices) { + validateBeanByRow(index, beanIndex) + } + } + } + + private fun validateBeanByRow(sheetIndex: Int, beanIndex: Int) { + try { + validateBeforeAddToBeanList(beanList.get()!!, beanList.get()!![beanIndex], beanIndex) + } catch (e: Exception) { + log.error("bindRowToBean method has encountered a problem!", e) + exceptionOccurred.set(true) + val errorMessage = "Exception occurred when binding and validating the data of row number ${beanIndex + 1}. Exception message: ${e.message}" + setErrorMessage(errorMessage) + val errorRow = workbook.get()?.getSheetAt(sheetIndex)!!.getRow(beanIndex + 1) + val errorInformationCell = errorRow.createCell(fieldNameArray.size) + errorInformationCell.setCellValue(errorMessage) + } + } + + /** + * Sets deny all. When exception occurred, deny all data or not + * + * @param denyAll true is deny all or vice versa + */ + open fun setDenyAll(denyAll: Boolean) { + this.denyAll = denyAll + } + + /** + * Sets error message. + * + * @param errorInfo the error info + */ + protected open fun setErrorMessage(errorInfo: String) { + errorMessageList.get().add(errorInfo) + setReturnMessageList(errorInfo) + } + + /** + * Sets return message list. + * + * @param message the message + */ + protected open fun setReturnMessageList(message: String) { + returnMessageList.get().add(message) + } + + /** + * Close workbook. + * + * @param workbook the workbook + */ + private fun closeWorkbook(workbook: Workbook?) { + try { + workbook?.close() + } catch (e: IOException) { + log.error("Exception occurred when closing workbook! Exception message: ${e.message}, workbook: $workbook") + } + } +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/poi/ExcelColumn.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/poi/ExcelColumn.java deleted file mode 100644 index 035040d7..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/poi/ExcelColumn.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.jmsoftware.maf.springcloudstarter.poi; - -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 { - /** - * Column name. - * - * @return the string - */ - String name() default "Default Column Name"; - - /** - * 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/poi/ExcelColumn.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/poi/ExcelColumn.kt new file mode 100644 index 00000000..dcacddbb --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/poi/ExcelColumn.kt @@ -0,0 +1,28 @@ +package com.jmsoftware.maf.springcloudstarter.poi + +import org.apache.poi.ss.usermodel.CellType + +/** + * # ExcelColumn + * + * Description: ExcelColumn, change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/14/22 3:57 PM + */ +@MustBeDocumented +@Target(AnnotationTarget.FIELD) +@Retention(AnnotationRetention.RUNTIME) +annotation class ExcelColumn( + /** + * Column name. + * + * @return the string + */ + val name: String = "Default Column Name", + /** + * Cell type. + * + * @return the cell type + */ + val cellType: CellType = CellType.STRING +) diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/poi/ExcelImportConfigurationProperties.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/poi/ExcelImportConfigurationProperties.java deleted file mode 100644 index 530b792d..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/poi/ExcelImportConfigurationProperties.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.jmsoftware.maf.springcloudstarter.poi; - -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; - -/** - *

ExcelImportConfigurationProperties

- *

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 = ExcelImportConfigurationProperties.PREFIX) -public class ExcelImportConfigurationProperties { - public static final String PREFIX = "maf.configuration.excel"; - @Min(2) - @NotNull - private Integer maximumRowCount = 2; - - @PostConstruct - private void postConstruct() { - log.warn("Initial bean: '{}'", this.getClass().getSimpleName()); - } -} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/poi/ExcelImportConfigurationProperties.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/poi/ExcelImportConfigurationProperties.kt new file mode 100644 index 00000000..5e0f9506 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/poi/ExcelImportConfigurationProperties.kt @@ -0,0 +1,38 @@ +package com.jmsoftware.maf.springcloudstarter.poi + +import com.jmsoftware.maf.common.util.logger +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.annotation.PostConstruct +import javax.validation.constraints.Min +import javax.validation.constraints.NotNull + +/** + * # ExcelImportConfigurationProperties + * + * 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 (锺俊), e-mail: johnnysviva@outlook.com, date: 4/14/22 3:58 PM + */ +@Validated +@RefreshScope +@Configuration +@ConfigurationProperties(prefix = ExcelImportConfigurationProperties.PREFIX) +class ExcelImportConfigurationProperties { + companion object { + const val PREFIX = "maf.configuration.excel" + private val log = logger() + } + + @Min(2) + @NotNull + var maximumRowCount: Int = 2 + + @PostConstruct + private fun postConstruct() { + log.warn("Initial bean: `${this.javaClass.simpleName}`") + } +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/poi/OssUploader.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/poi/OssUploader.java deleted file mode 100644 index 759c3a88..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/poi/OssUploader.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.jmsoftware.maf.springcloudstarter.poi; - -import lombok.NonNull; - -import java.io.IOException; -import java.io.InputStream; - -/** - * Description: OssUploader, change description here. - * - * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 9/15/2021 11:40 AM - **/ -@FunctionalInterface -public interface OssUploader { - /** - * Upload. - * - * @param name the name - * @param inputStream the input stream - * @return the string - * @throws IOException the io exception - */ - String upload(@NonNull String name, @NonNull InputStream inputStream) throws IOException; -} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/poi/OssUploader.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/poi/OssUploader.kt new file mode 100644 index 00000000..c75261db --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/poi/OssUploader.kt @@ -0,0 +1,25 @@ +package com.jmsoftware.maf.springcloudstarter.poi + +import java.io.IOException +import java.io.InputStream +import javax.validation.constraints.NotBlank +import javax.validation.constraints.NotNull + +/** + * # OssUploader + * + * Description: OssUploader, change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/12/22 2:51 PM + */ +fun interface OssUploader { + /** + * Upload. + * + * @param name the name + * @param inputStream the input stream + * @return the string + * @throws IOException the io exception + */ + fun upload(@NotBlank name: String, @NotNull inputStream: InputStream): String +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/property/FeignClientConfigurationProperties.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/property/FeignClientConfigurationProperties.java deleted file mode 100644 index 4c84ea08..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/property/FeignClientConfigurationProperties.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.jmsoftware.maf.springcloudstarter.property; - -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.NotNull; - -/** - *

FeignClientConfigurationProperties

- *

- * Change description here. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com, 2/1/22 6:03 PM - **/ -@Data -@Validated -@RefreshScope -@Configuration -@ConfigurationProperties(prefix = FeignClientConfigurationProperties.PREFIX) -public class FeignClientConfigurationProperties { - public static final String PREFIX = "feign.client.config.default"; - /** - * Enabled AOP log for Feign clients. Default is true. True means enabled, false means disabled. - */ - @NotNull - private Boolean enabledAopLog = Boolean.TRUE; -} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/property/FeignClientConfigurationProperties.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/property/FeignClientConfigurationProperties.kt new file mode 100644 index 00000000..29c6f6aa --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/property/FeignClientConfigurationProperties.kt @@ -0,0 +1,28 @@ +package com.jmsoftware.maf.springcloudstarter.property + +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 + +/** + * # FeignClientConfigurationProperties + * + * Change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/14/22 9:40 PM + */ +@Validated +@RefreshScope +@Configuration +@ConfigurationProperties(prefix = FeignClientConfigurationProperties.PREFIX) +class FeignClientConfigurationProperties { + companion object { + const val PREFIX = "feign.client.config.default" + } + + /** + * Enabled AOP log for Feign clients. Default is true. True means enabled, false means disabled. + */ + var enabledAopLog = true +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/property/JwtConfigurationProperties.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/property/JwtConfigurationProperties.java deleted file mode 100644 index e81b5053..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/property/JwtConfigurationProperties.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.jmsoftware.maf.springcloudstarter.property; - -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; - -/** - *

JwtConfigurationProperties

- *

- * Ignored request configuration. - * - * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 3/1/2021 10:28 AM - **/ -@Data -@Slf4j -@Validated -@ConfigurationProperties(prefix = JwtConfigurationProperties.PREFIX) -public class JwtConfigurationProperties { - /** - * 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; - /** - * JWT signing key. Pattern: [groupId]:[projectParentArtifactId]@[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; - - public JwtConfigurationProperties(MafProjectProperties mafProjectProperties) { - this.signingKey = String.format( - "%s:%s@%s", mafProjectProperties.getGroupId(), - mafProjectProperties.getProjectParentArtifactId(), - mafProjectProperties.getVersion() - ); - log.info("Initiated JWT signing key: {}. The specified key byte array is {} bits", this.signingKey, - this.signingKey.getBytes(StandardCharsets.UTF_8).length * 8); - this.jwtRedisKeyPrefix = String.format("%s:jwt:", mafProjectProperties.getProjectParentArtifactId()); - log.warn("Initiated 'jwtRedisKeyPrefix': {}", this.jwtRedisKeyPrefix); - } -} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/property/JwtConfigurationProperties.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/property/JwtConfigurationProperties.kt new file mode 100644 index 00000000..d47480de --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/property/JwtConfigurationProperties.kt @@ -0,0 +1,61 @@ +package com.jmsoftware.maf.springcloudstarter.property + +import com.jmsoftware.maf.common.util.logger +import org.springframework.boot.context.properties.ConfigurationProperties +import org.springframework.context.annotation.Configuration +import org.springframework.validation.annotation.Validated +import java.nio.charset.StandardCharsets +import javax.validation.constraints.NotNull + +/** + * # JwtConfigurationProperties + * + * Ignored request configuration. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/14/22 9:41 PM + */ +@Validated +@Configuration +@ConfigurationProperties(prefix = JwtConfigurationProperties.PREFIX) +class JwtConfigurationProperties(mafProjectProperties: MafProjectProperties) { + companion object { + /** + * The constant PREFIX. + */ + const val PREFIX = "maf.configuration.jwt" + const val TOKEN_PREFIX = "Bearer " + private val log = logger() + } + + /** + * Key prefix of JWT stored in Redis. + */ + final val jwtRedisKeyPrefix: String + + /** + * JWT signing key. Pattern: [groupId]:[projectParentArtifactId]@[version] + */ + final val signingKey: String + + /** + * Time to live of JWT. Default: 3 * 600000 milliseconds (1800000 ms, 30 min). + */ + var ttl: @NotNull Long = 3 * 600000L + + /** + * Time to live of JWT for remember me, Default: 7 * 86400000 milliseconds (604800000 ms, 7 day) + */ + var ttlForRememberMe: @NotNull Long = 7 * 86400000L + + init { + signingKey = + "${mafProjectProperties.groupId}:${mafProjectProperties.projectParentArtifactId}@${mafProjectProperties.version}" + log.info( + "Initiated JWT signing key: $signingKey. The specified key byte array is ${ + signingKey.toByteArray(StandardCharsets.UTF_8).size * 8 + } bits" + ) + jwtRedisKeyPrefix = "${mafProjectProperties.projectParentArtifactId}:jwt:" + log.warn("Initiated `jwtRedisKeyPrefix`: $jwtRedisKeyPrefix") + } +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/property/MafConfigurationProperties.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/property/MafConfigurationProperties.java deleted file mode 100644 index 4bb342e9..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/property/MafConfigurationProperties.java +++ /dev/null @@ -1,157 +0,0 @@ -package com.jmsoftware.maf.springcloudstarter.property; - -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; - -/** - *

MafConfigurationProperties

- *

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 MafConfigurationProperties { - /** - *

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; - - /** - * 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: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/property/MafConfigurationProperties.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/property/MafConfigurationProperties.kt new file mode 100644 index 00000000..74f16882 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/property/MafConfigurationProperties.kt @@ -0,0 +1,167 @@ +package com.jmsoftware.maf.springcloudstarter.property + +import com.jmsoftware.maf.common.util.logger +import com.jmsoftware.maf.springcloudstarter.property.MafConfigurationProperties.IgnoredUrl.Constant.Companion.URL_REGEXP +import org.springframework.boot.context.properties.ConfigurationProperties +import org.springframework.context.annotation.Configuration +import org.springframework.validation.annotation.Validated +import javax.annotation.PostConstruct +import javax.validation.Valid +import javax.validation.constraints.NotBlank +import javax.validation.constraints.Pattern + +/** + * # MafConfigurationProperties + * + * 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 (锺俊), e-mail: johnnysviva@outlook.com, date: 4/13/22 2:07 PM + **/ +@Validated +@Configuration +@Suppress("unused") +@ConfigurationProperties(prefix = MafConfigurationProperties.PREFIX) +class MafConfigurationProperties { + companion object { + const val PREFIX = "maf.configuration" + private val log = logger() + } + + /** + * The role name of superuser (admin) who has no restriction to access any system's resources. + * + * **ATTENTION**: The value of role name of superuser must be equal to the value that is persistent in database. + **/ + @NotBlank + var superUserRole: String = "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 + var guestUserRole: String = "guest" + + /** + * Ignore URLs, used by web access log filter and web security. + **/ + @Valid + var ignoredUrl: IgnoredUrl? = null + + /** + * Web security feature switch. Default is true. + * true - disable web security; false - enable web security. + **/ + var webSecurityEnabled: Boolean = true + + /** + * Web request log switch. Default is true. + * + * true - disable web request log; false - enable web request log. + **/ + var webRequestLogEnabled: Boolean = true + + /** + * Included package for http api scan, could be base package + **/ + @NotBlank + var includedPackageForHttpApiScan: String = "" + + @PostConstruct + private fun postConstruct() { + log.warn("Initial bean: `${this.javaClass.simpleName}`") + } + + /** + * Flatten ignored urls string [ ]. + * + * @return the string [ ] + **/ + fun flattenIgnoredUrls(): List { + return mutableListOf().let { + it.addAll(ignoredUrl?.get!!) + it.addAll(ignoredUrl?.post!!) + it.addAll(ignoredUrl?.delete!!) + it.addAll(ignoredUrl?.put!!) + it.addAll(ignoredUrl?.head!!) + it.addAll(ignoredUrl?.patch!!) + it.addAll(ignoredUrl?.options!!) + it.addAll(ignoredUrl?.trace!!) + it.addAll(ignoredUrl?.pattern!!) + it + } + } + + /** + *

IgnoredUrl

+ * + * + * Ignored URL configuration. + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 2/9/2021 9:39 AM + **/ + class IgnoredUrl { + private interface Constant { + companion object { + const val URL_REGEXP = "^(/.+)+$" + } + } + + /** + * Ignored URL pattern. + **/ + @Valid + val pattern: MutableList<@Pattern(regexp = URL_REGEXP) String> = mutableListOf() + + /** + * Ignored GET request. + **/ + @Valid + val get: MutableList<@Pattern(regexp = URL_REGEXP) String> = mutableListOf() + + /** + * Ignored POST request. + **/ + @Valid + val post: MutableList<@Pattern(regexp = URL_REGEXP) String> = mutableListOf() + + /** + * Ignored DELETE request. + **/ + @Valid + val delete: MutableList<@Pattern(regexp = URL_REGEXP) String> = mutableListOf() + + /** + * Ignored PUT request. + **/ + @Valid + val put: MutableList<@Pattern(regexp = URL_REGEXP) String> = mutableListOf() + + /** + * Ignored HEAD request. + **/ + @Valid + val head: MutableList<@Pattern(regexp = URL_REGEXP) String> = mutableListOf() + + /** + * Ignored PATCH request. + **/ + @Valid + val patch: MutableList<@Pattern(regexp = URL_REGEXP) String> = mutableListOf() + + /** + * Ignored OPTIONS request. + **/ + @Valid + val options: MutableList<@Pattern(regexp = URL_REGEXP) String> = mutableListOf() + + /** + * Ignored TRACE request. + **/ + @Valid + val trace: MutableList<@Pattern(regexp = URL_REGEXP) String> = mutableListOf() + } +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/property/MafProjectProperties.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/property/MafProjectProperties.java deleted file mode 100644 index 3209ec45..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/property/MafProjectProperties.java +++ /dev/null @@ -1,111 +0,0 @@ -package com.jmsoftware.maf.springcloudstarter.property; - -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; - -/** - *

MafProjectProperties

- *

- * 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 -@ConfigurationProperties(prefix = MafProjectProperties.PREFIX) -public class MafProjectProperties { - public static final String PREFIX = "maf.project-properties"; - 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/property/MafProjectProperties.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/property/MafProjectProperties.kt new file mode 100644 index 00000000..aa8165f4 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/property/MafProjectProperties.kt @@ -0,0 +1,124 @@ +package com.jmsoftware.maf.springcloudstarter.property + +import com.jmsoftware.maf.common.util.logger +import org.springframework.boot.context.properties.ConfigurationProperties +import org.springframework.boot.info.BuildProperties +import org.springframework.context.annotation.Configuration +import org.springframework.validation.annotation.Validated +import javax.annotation.PostConstruct +import javax.validation.constraints.NotBlank + +/** + * # MafProjectProperties + * + * M&F project property, containing the basic constants of the project. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/13/22 2:54 PM + */ +@Validated +@Configuration +@Suppress("unused") +@ConfigurationProperties(prefix = MafProjectProperties.PREFIX) +class MafProjectProperties { + companion object { + const val PREFIX = "maf.project-properties" + private val log = logger() + } + + lateinit var buildProperties: BuildProperties + + /** + * The Base package. + */ + lateinit var basePackage: @NotBlank String + + /** + * The Context path. + */ + lateinit var contextPath: String + + /** + * The Group id. + */ + lateinit var groupId: @NotBlank String + + /** + * The Project parent artifact id. + */ + lateinit var projectParentArtifactId: @NotBlank String + + /** + * The Project artifact id. + */ + lateinit var projectArtifactId: @NotBlank String + + /** + * The Version. + */ + lateinit var version: @NotBlank String + + /** + * The Description. + */ + lateinit var description: @NotBlank String + + /** + * The Jdk version. + */ + lateinit var jdkVersion: @NotBlank String + + /** + * The Environment. + */ + lateinit var environment: @NotBlank String + + /** + * The Url. + */ + lateinit var url: String + + /** + * The Inception year. + */ + lateinit var inceptionYear: String + + /** + * The Organization name. + */ + lateinit var organizationName: String + + /** + * The Organization url. + */ + lateinit var organizationUrl: String + + /** + * The Issue management system. + */ + lateinit var issueManagementSystem: String + + /** + * The Issue management url. + */ + lateinit var issueManagementUrl: String + + /** + * The Developer name. + */ + lateinit var developerName: String + + /** + * The Developer email. + */ + lateinit var developerEmail: String + + /** + * The Developer url. + */ + lateinit var developerUrl: String + + @PostConstruct + fun postConstruct() { + log.warn("Initial bean: '{}'", this.javaClass.simpleName) + } +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/GreetingBean.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/GreetingBean.java deleted file mode 100644 index 13f2d8f5..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/GreetingBean.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.jmsoftware.maf.springcloudstarter.quartz; - -import com.jmsoftware.maf.springcloudstarter.property.MafProjectProperties; -import com.jmsoftware.maf.springcloudstarter.quartz.annotation.QuartzSchedulable; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -/** - * Description: GreetingBean, demo for dynamic Quartz job, which is configured in the table `quartz_job_configuration`. - * - * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 7/13/2021 10:16 PM - * @see - * Quartz Scheduler - **/ -@Slf4j -@Component("greetingBean") -@RequiredArgsConstructor -public class GreetingBean { - /** - * Injected field, spring bean. - */ - private final MafProjectProperties mafProjectProperties; - - @QuartzSchedulable - @SuppressWarnings("unused") - public void hello() { - log.info("Greeting from Quartz job, current service is: {}", this.mafProjectProperties.getProjectArtifactId()); - } -} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/GreetingBean.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/GreetingBean.kt new file mode 100644 index 00000000..de13fc0c --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/GreetingBean.kt @@ -0,0 +1,27 @@ +package com.jmsoftware.maf.springcloudstarter.quartz + +import com.jmsoftware.maf.common.util.logger +import com.jmsoftware.maf.springcloudstarter.property.MafProjectProperties +import com.jmsoftware.maf.springcloudstarter.quartz.annotation.QuartzSchedulable +import org.springframework.stereotype.Component + +/** + * Description: GreetingBean, demo for dynamic Quartz job, which is configured in the table `quartz_job_configuration`. + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 7/13/2021 10:16 PM + * @see [Quartz Scheduler](https://docs.spring.io/spring-boot/docs/current/reference/html/features.html.features.quartz) + */ +@Component("greetingBean") +class GreetingBean( + private val mafProjectProperties: MafProjectProperties +) { + companion object { + val log = logger() + } + + @QuartzSchedulable + @Suppress("unused") + fun hello() { + log.info("Greeting from Quartz job, current service is: ${mafProjectProperties.projectArtifactId}") + } +} 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 deleted file mode 100644 index bf2348ca..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/QuartzConfiguration.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.jmsoftware.maf.springcloudstarter.quartz; - -import com.jmsoftware.maf.springcloudstarter.property.MafProjectProperties; -import com.jmsoftware.maf.springcloudstarter.quartz.controller.QuartzJobConfigurationController; -import com.jmsoftware.maf.springcloudstarter.quartz.service.QuartzJobConfigurationService; -import com.jmsoftware.maf.springcloudstarter.quartz.service.impl.QuartzJobConfigurationServiceImpl; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import lombok.val; -import org.quartz.Scheduler; -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration; -import org.springframework.boot.autoconfigure.quartz.QuartzProperties; -import org.springframework.boot.autoconfigure.quartz.SchedulerFactoryBeanCustomizer; -import org.springframework.context.annotation.Bean; -import org.springframework.scheduling.quartz.SchedulerFactoryBean; -import org.springframework.transaction.PlatformTransactionManager; - -import java.util.Map; -import java.util.Properties; - -import static cn.hutool.core.text.CharSequenceUtil.format; -import static org.springframework.scheduling.quartz.SchedulerFactoryBean.PROP_THREAD_COUNT; - -/** - * Description: QuartzConfiguration, change description here. - * - * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 7/13/2021 10:44 PM - * @see QuartzAutoConfiguration - **/ -@Slf4j -@RequiredArgsConstructor -@ConditionalOnClass({Scheduler.class, SchedulerFactoryBean.class, PlatformTransactionManager.class}) -public class QuartzConfiguration { - private final MafProjectProperties mafProjectProperties; - - @Bean - public SchedulerFactoryBeanCustomizer schedulerFactoryBeanCustomizer(QuartzProperties quartzProperties) { - val cpuCoreCount = Runtime.getRuntime().availableProcessors(); - val threadCount = String.valueOf(cpuCoreCount * 2); - quartzProperties.getProperties().put(PROP_THREAD_COUNT, threadCount); - return schedulerFactoryBean -> { - schedulerFactoryBean.setQuartzProperties(this.asProperties(quartzProperties.getProperties())); - log.warn("Quartz thread pool enhanced by current cpuCoreCount: {}, threadCount: {}", cpuCoreCount, - threadCount); - schedulerFactoryBean.setSchedulerName( - format("{}-quartz-scheduler", this.mafProjectProperties.getProjectArtifactId()) - ); - schedulerFactoryBean.setWaitForJobsToCompleteOnShutdown(true); - schedulerFactoryBean.setBeanName("schedulerFactoryBean"); - }; - } - - private Properties asProperties(Map source) { - val properties = new Properties(); - properties.putAll(source); - return properties; - } - - @Bean - public GreetingBean greetingBean() { - log.warn("Initial bean: '{}'", GreetingBean.class.getSimpleName()); - return new GreetingBean(this.mafProjectProperties); - } - - @Bean - public QuartzJobConfigurationController quartzJobConfigurationController( - QuartzJobConfigurationService quartzJobConfigurationService - ) { - log.warn("Initial bean: '{}'", QuartzJobConfigurationController.class.getSimpleName()); - return new QuartzJobConfigurationController(quartzJobConfigurationService); - } - - @Bean - public QuartzJobConfigurationService quartzJobConfigurationService(SchedulerFactoryBean schedulerFactoryBean) { - log.warn("Initial bean: '{}'", QuartzJobConfigurationServiceImpl.class.getSimpleName()); - return new QuartzJobConfigurationServiceImpl(schedulerFactoryBean, this.mafProjectProperties); - } -} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/QuartzConfiguration.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/QuartzConfiguration.kt new file mode 100644 index 00000000..ebb49934 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/QuartzConfiguration.kt @@ -0,0 +1,73 @@ +package com.jmsoftware.maf.springcloudstarter.quartz + +import com.jmsoftware.maf.common.util.logger +import com.jmsoftware.maf.springcloudstarter.property.MafProjectProperties +import com.jmsoftware.maf.springcloudstarter.quartz.controller.QuartzJobConfigurationController +import com.jmsoftware.maf.springcloudstarter.quartz.service.QuartzJobConfigurationService +import com.jmsoftware.maf.springcloudstarter.quartz.service.impl.QuartzJobConfigurationServiceImpl +import org.quartz.Scheduler +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass +import org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration +import org.springframework.boot.autoconfigure.quartz.QuartzProperties +import org.springframework.boot.autoconfigure.quartz.SchedulerFactoryBeanCustomizer +import org.springframework.context.annotation.Bean +import org.springframework.scheduling.quartz.SchedulerFactoryBean +import org.springframework.transaction.PlatformTransactionManager +import java.util.* + +/** + * # QuartzConfiguration + * + * Description: QuartzConfiguration, change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/15/22 7:19 PM + * @see QuartzAutoConfiguration + */ +@ConditionalOnClass(Scheduler::class, SchedulerFactoryBean::class, PlatformTransactionManager::class) +class QuartzConfiguration( + private val mafProjectProperties: MafProjectProperties +) { + companion object { + private val log = logger() + } + + @Bean + fun schedulerFactoryBeanCustomizer(quartzProperties: QuartzProperties): SchedulerFactoryBeanCustomizer { + val cpuCoreCount = Runtime.getRuntime().availableProcessors() + val threadCount = (2 * cpuCoreCount).toString() + quartzProperties.properties[SchedulerFactoryBean.PROP_THREAD_COUNT] = threadCount + return SchedulerFactoryBeanCustomizer { schedulerFactoryBean: SchedulerFactoryBean -> + schedulerFactoryBean.setQuartzProperties(asProperties(quartzProperties.properties)) + log.warn("Quartz thread pool enhanced by current cpuCoreCount: $cpuCoreCount, threadCount: $threadCount") + schedulerFactoryBean.setSchedulerName("${mafProjectProperties.projectArtifactId}-quartz-scheduler") + schedulerFactoryBean.setWaitForJobsToCompleteOnShutdown(true) + schedulerFactoryBean.setBeanName("schedulerFactoryBean") + } + } + + private fun asProperties(source: Map): Properties { + val properties = Properties() + properties.putAll(source) + return properties + } + + @Bean + fun greetingBean(): GreetingBean { + log.warn("Initial bean: `${GreetingBean::class.java.simpleName}`") + return GreetingBean(mafProjectProperties) + } + + @Bean + fun quartzJobConfigurationController( + quartzJobConfigurationService: QuartzJobConfigurationService + ): QuartzJobConfigurationController { + log.warn("Initial bean: `${QuartzJobConfigurationController::class.java.simpleName}`") + return QuartzJobConfigurationController(quartzJobConfigurationService) + } + + @Bean + fun quartzJobConfigurationService(schedulerFactoryBean: SchedulerFactoryBean): QuartzJobConfigurationService { + log.warn("Initial bean: `${QuartzJobConfigurationServiceImpl::class.java.simpleName}`") + return QuartzJobConfigurationServiceImpl(schedulerFactoryBean, mafProjectProperties) + } +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/annotation/QuartzSchedulable.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/annotation/QuartzSchedulable.java deleted file mode 100644 index 98f1ba86..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/annotation/QuartzSchedulable.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.jmsoftware.maf.springcloudstarter.quartz.annotation; - -import java.lang.annotation.*; - -/** - * Description: QuartzSchedulable, change description here. - * - * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 9/23/2021 1:48 PM - **/ -@Documented -@Target(ElementType.METHOD) -@Retention(RetentionPolicy.RUNTIME) -public @interface QuartzSchedulable { -} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/annotation/QuartzSchedulable.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/annotation/QuartzSchedulable.kt new file mode 100644 index 00000000..d60dd5d8 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/annotation/QuartzSchedulable.kt @@ -0,0 +1,13 @@ +package com.jmsoftware.maf.springcloudstarter.quartz.annotation + +/** + * # QuartzSchedulable + * + * Description: QuartzSchedulable, change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/14/22 10:11 PM + */ +@MustBeDocumented +@Retention(AnnotationRetention.RUNTIME) +@Target(AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER) +annotation class QuartzSchedulable diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/constant/Concurrent.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/constant/Concurrent.java deleted file mode 100644 index c7e66557..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/constant/Concurrent.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.jmsoftware.maf.springcloudstarter.quartz.constant; - -import com.jmsoftware.maf.common.bean.EnumerationBase; -import lombok.Getter; - -/** - * Description: Concurrent, change description here. - * - * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 9/23/2021 2:04 PM - **/ -@Getter -public enum Concurrent implements EnumerationBase { - /** - * Disallow Concurrent - */ - DISALLOW_CONCURRENT((byte) 0), - /** - * concurrent - */ - CONCURRENT((byte) 1), - ; - private final Byte value; - - Concurrent(Byte value) { - this.value = value; - } -} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/constant/Concurrent.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/constant/Concurrent.kt new file mode 100644 index 00000000..4d5c05ce --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/constant/Concurrent.kt @@ -0,0 +1,20 @@ +package com.jmsoftware.maf.springcloudstarter.quartz.constant + +/** + * # Concurrent + * + * Description: Concurrent, change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/14/22 10:28 PM + */ +enum class Concurrent(val value: Byte) { + /** + * Disallow Concurrent + */ + DISALLOW_CONCURRENT(0.toByte()), + + /** + * concurrent + */ + CONCURRENT(1.toByte()); +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/constant/MisfirePolicy.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/constant/MisfirePolicy.java deleted file mode 100644 index 5408458e..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/constant/MisfirePolicy.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.jmsoftware.maf.springcloudstarter.quartz.constant; - -import com.jmsoftware.maf.common.bean.EnumerationBase; -import lombok.Getter; -import lombok.ToString; -import lombok.val; -import org.quartz.CronTrigger; -import org.quartz.Scheduler; -import org.quartz.Trigger; - -import java.util.Calendar; - -/** - * Description: MisfirePolicy, change description here. - * - * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 9/24/2021 8:20 AM - * @see Trigger - * @see CronTrigger - **/ -@Getter -@ToString -public enum MisfirePolicy implements EnumerationBase { - /** - * Instructs the {@link Scheduler} that the - * Trigger will never be evaluated for a misfire situation, - * and that the scheduler will simply try to fire it as soon as it can, - * and then update the Trigger as if it had fired at the proper time. - * - *

NOTE: if a trigger uses this instruction, and it has missed - * several of its scheduled firings, then several rapid firings may occur - * as the trigger attempt to catch back up to where it would have been. - * For example, a SimpleTrigger that fires every 15 seconds which has - * misfired for 5 minutes will fire 20 times once it gets the chance to - * fire.

- */ - MISFIRE_INSTRUCTION_IGNORE_MISFIRE_POLICY((byte) -1), - /** - * Instructs the {@link Scheduler} that upon a mis-fire - * situation, the updateAfterMisfire() method will be called - * on the Trigger to determine the mis-fire instruction, - * which logic will be trigger-implementation-dependent. - * - *

- * In order to see if this instruction fits your needs, you should look at - * the documentation for the updateAfterMisfire() method - * on the particular Trigger implementation you are using. - *

- */ - MISFIRE_INSTRUCTION_SMART_POLICY((byte) 0), - /** - *

- * Instructs the {@link Scheduler} that upon a mis-fire - * situation, the {@link CronTrigger} wants to be fired now - * by Scheduler. - *

- */ - MISFIRE_INSTRUCTION_FIRE_ONCE_NOW((byte) 1), - /** - *

- * Instructs the {@link Scheduler} that upon a mis-fire - * situation, the {@link CronTrigger} wants to have it's - * next-fire-time updated to the next time in the schedule after the - * current time (taking into account any associated {@link Calendar}, - * but it does not want to be fired now. - *

- */ - MISFIRE_INSTRUCTION_DO_NOTHING((byte) 2), - ; - - private final Byte value; - - MisfirePolicy(Byte value) { - this.value = value; - } - - public static MisfirePolicy getByValue(Byte value) { - val values = MisfirePolicy.values(); - for (val enumeration : values) { - if(enumeration.getValue().equals(value)) { - return enumeration; - } - } - return null; - } -} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/constant/MisfirePolicy.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/constant/MisfirePolicy.kt new file mode 100644 index 00000000..0a05bac8 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/constant/MisfirePolicy.kt @@ -0,0 +1,67 @@ +package com.jmsoftware.maf.springcloudstarter.quartz.constant + +/** + * Description: MisfirePolicy, change description here. + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 9/24/2021 8:20 AM + * @see Trigger + * + * @see CronTrigger + */ +enum class MisfirePolicy(val value: Byte) { + /** + * Instructs the `[Scheduler]` that the + * `Trigger` will never be evaluated for a misfire situation, + * and that the scheduler will simply try to fire it as soon as it can, + * and then update the Trigger as if it had fired at the proper time. + * + * + * NOTE: if a trigger uses this instruction, and it has missed + * several of its scheduled firings, then several rapid firings may occur + * as the trigger attempt to catch back up to where it would have been. + * For example, a SimpleTrigger that fires every 15 seconds which has + * misfired for 5 minutes will fire 20 times once it gets the chance to + * fire. + */ + MISFIRE_INSTRUCTION_IGNORE_MISFIRE_POLICY((-1).toByte()), + + /** + * Instructs the `[Scheduler]` that upon a mis-fire + * situation, the `updateAfterMisfire()` method will be called + * on the `Trigger` to determine the mis-fire instruction, + * which logic will be trigger-implementation-dependent. + * + * In order to see if this instruction fits your needs, you should look at + * the documentation for the `updateAfterMisfire()` method + * on the particular `Trigger` implementation you are using. + */ + MISFIRE_INSTRUCTION_SMART_POLICY(0.toByte()), + + /** + * Instructs the `[Scheduler]` that upon a mis-fire + * situation, the `[CronTrigger]` wants to be fired now + * by `Scheduler`. + */ + MISFIRE_INSTRUCTION_FIRE_ONCE_NOW(1.toByte()), + + /** + * Instructs the `[Scheduler]` that upon a mis-fire + * situation, the `[CronTrigger]` wants to have it's + * next-fire-time updated to the next time in the schedule after the + * current time (taking into account any associated `[Calendar]`, + * but it does not want to be fired now. + */ + MISFIRE_INSTRUCTION_DO_NOTHING(2.toByte()); + + companion object { + fun getByValue(value: Byte): MisfirePolicy? { + val values = values() + for (enumeration in values) { + if (enumeration.value == value) { + return enumeration + } + } + return null + } + } +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/constant/QuartzJobStatus.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/constant/QuartzJobStatus.java deleted file mode 100644 index 8c404fec..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/constant/QuartzJobStatus.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.jmsoftware.maf.springcloudstarter.quartz.constant; - -import com.jmsoftware.maf.common.bean.EnumerationBase; -import lombok.Getter; -import lombok.ToString; - -/** - * Description: QuartzJobStatus, change description here. - * - * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 9/24/2021 10:11 AM - **/ -@Getter -@ToString -public enum QuartzJobStatus implements EnumerationBase { - /** - * Normal - */ - NORMAL((byte) 0), - /** - * Paused - */ - PAUSE((byte) 1), - ; - - private final Byte value; - - QuartzJobStatus(Byte value) { - this.value = value; - } -} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/constant/QuartzJobStatus.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/constant/QuartzJobStatus.kt new file mode 100644 index 00000000..0ad72fab --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/constant/QuartzJobStatus.kt @@ -0,0 +1,20 @@ +package com.jmsoftware.maf.springcloudstarter.quartz.constant + +/** + * # QuartzJobStatus + * + * Description: QuartzJobStatus, change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/14/22 10:32 PM + */ +enum class QuartzJobStatus(val value: Byte) { + /** + * Normal + */ + NORMAL(0.toByte()), + + /** + * Paused + */ + PAUSE(1.toByte()); +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/constant/ScheduleConstant.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/constant/ScheduleConstant.java deleted file mode 100644 index a8050eee..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/constant/ScheduleConstant.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.jmsoftware.maf.springcloudstarter.quartz.constant; - -/** - * ScheduleConstant - * - * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 9/24/2021 8:16 AM - */ -public class ScheduleConstant { - public static final String QUARTZ_JOB_CONFIGURATION = "QUARTZ_JOB_CONFIGURATION"; - - private ScheduleConstant() { - } -} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/constant/ScheduleConstant.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/constant/ScheduleConstant.kt new file mode 100644 index 00000000..a9ecde49 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/constant/ScheduleConstant.kt @@ -0,0 +1,3 @@ +package com.jmsoftware.maf.springcloudstarter.quartz.constant + +const val QUARTZ_JOB_CONFIGURATION = "QUARTZ_JOB_CONFIGURATION" diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/controller/QuartzJobConfigurationController.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/controller/QuartzJobConfigurationController.java deleted file mode 100644 index a78e178e..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/controller/QuartzJobConfigurationController.java +++ /dev/null @@ -1,103 +0,0 @@ -package com.jmsoftware.maf.springcloudstarter.quartz.controller; - -import com.jmsoftware.maf.common.bean.PageResponseBodyBean; -import com.jmsoftware.maf.common.bean.ResponseBodyBean; -import com.jmsoftware.maf.springcloudstarter.poi.AbstractExcelDataController; -import com.jmsoftware.maf.springcloudstarter.quartz.entity.CreateOrModifyQuartzJobConfigurationPayload; -import com.jmsoftware.maf.springcloudstarter.quartz.entity.GetQuartzJobConfigurationPageListItem; -import com.jmsoftware.maf.springcloudstarter.quartz.entity.GetQuartzJobConfigurationPageListPayload; -import com.jmsoftware.maf.springcloudstarter.quartz.entity.QuartzJobConfigurationExcel; -import com.jmsoftware.maf.springcloudstarter.quartz.service.QuartzJobConfigurationService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import javax.validation.Valid; -import java.time.Instant; -import java.util.List; - -/** - *

QuartzJobConfigurationController

- *

- * Change description here. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com, 9/26/21 11:58 PM - **/ -@Slf4j -@Validated -@RestController -@RequiredArgsConstructor -@RequestMapping("/quartz-job") -public class QuartzJobConfigurationController extends AbstractExcelDataController { - private final QuartzJobConfigurationService service; - - @GetMapping("/quartz-job-configurations") - public PageResponseBodyBean getPageList( - @Valid GetQuartzJobConfigurationPageListPayload payload - ) { - return this.service.getPageList(payload); - } - - @PostMapping("/quartz-job-configurations") - public ResponseBodyBean create( - @Valid @RequestBody CreateOrModifyQuartzJobConfigurationPayload payload - ) { - return ResponseBodyBean.ofSuccess(this.service.create(payload)); - } - - @PutMapping("/quartz-job-configurations/{id}") - public ResponseBodyBean modify( - @PathVariable Long id, - @Valid @RequestBody CreateOrModifyQuartzJobConfigurationPayload payload - ) { - return ResponseBodyBean.ofSuccess(this.service.modify(id, payload)); - } - - @PatchMapping("/quartz-job-configurations/{id}/{property}") - public ResponseBodyBean patch( - @PathVariable Long id, - @PathVariable String property, - @RequestBody CreateOrModifyQuartzJobConfigurationPayload payload - ) { - return ResponseBodyBean.ofSuccess(this.service.patch(id, property, payload)); - } - - @PostMapping("/quartz-job-configurations/{id}/run-immediately") - public ResponseBodyBean runImmediately(@PathVariable Long id) { - return ResponseBodyBean.ofSuccess(this.service.runImmediately(id)); - } - - @DeleteMapping("/quartz-job-configurations/{id}/{group}") - public ResponseBodyBean delete(@PathVariable Long id, @PathVariable String group) { - return ResponseBodyBean.ofSuccess(this.service.delete(id, group)); - } - - @Override - protected void onExceptionOccurred() { - log.error("Exception occurred when uploading excel. Excel class: {}", QuartzJobConfigurationExcel.class); - this.fileName.set(String.format("quartz-job-configuration-stat-%s.xlsx", Instant.now())); - } - - @Override - protected void validateBeforeAddToBeanList(List beanList, - QuartzJobConfigurationExcel bean, int index) - throws IllegalArgumentException { - this.service.validateBeforeAddToBeanList(beanList, bean, index); - } - - @Override - protected void executeDatabaseOperation(List beanList) { - this.service.save(beanList); - } - - @Override - protected String getTemplateFileName() { - return QuartzJobConfigurationService.TEMPLATE_EXCEL; - } - - @Override - protected List getListForExporting() { - return this.service.getListForExporting(); - } -} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/controller/QuartzJobConfigurationController.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/controller/QuartzJobConfigurationController.kt new file mode 100644 index 00000000..dbd3c71e --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/controller/QuartzJobConfigurationController.kt @@ -0,0 +1,99 @@ +package com.jmsoftware.maf.springcloudstarter.quartz.controller + +import cn.hutool.core.text.CharSequenceUtil +import com.jmsoftware.maf.common.bean.PageResponseBodyBean +import com.jmsoftware.maf.common.bean.ResponseBodyBean +import com.jmsoftware.maf.common.util.LoggerDelegate +import com.jmsoftware.maf.springcloudstarter.poi.AbstractExcelDataController +import com.jmsoftware.maf.springcloudstarter.quartz.entity.CreateOrModifyQuartzJobConfigurationPayload +import com.jmsoftware.maf.springcloudstarter.quartz.entity.GetQuartzJobConfigurationPageListItem +import com.jmsoftware.maf.springcloudstarter.quartz.entity.GetQuartzJobConfigurationPageListPayload +import com.jmsoftware.maf.springcloudstarter.quartz.entity.QuartzJobConfigurationExcel +import com.jmsoftware.maf.springcloudstarter.quartz.service.QuartzJobConfigurationService +import org.springframework.validation.annotation.Validated +import org.springframework.web.bind.annotation.* +import java.time.Instant +import javax.validation.Valid + +/** + * # QuartzJobConfigurationController + * + * Change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/14/22 9:12 PM + */ +@Validated +@RestController +@RequestMapping("/quartz-job") +class QuartzJobConfigurationController( + private val service: QuartzJobConfigurationService +) : AbstractExcelDataController() { + companion object { + private val log by LoggerDelegate() + } + + @GetMapping("/quartz-job-configurations") + fun getPageList( + payload: @Valid GetQuartzJobConfigurationPageListPayload + ): PageResponseBodyBean { + return service.getPageList(payload) + } + + @PostMapping("/quartz-job-configurations") + fun create( + @RequestBody payload: @Valid CreateOrModifyQuartzJobConfigurationPayload + ): ResponseBodyBean { + return ResponseBodyBean.ofSuccess(service.create(payload)) + } + + @PutMapping("/quartz-job-configurations/{id}") + fun modify( + @PathVariable id: Long, + @Valid @RequestBody payload: CreateOrModifyQuartzJobConfigurationPayload + ): ResponseBodyBean { + return ResponseBodyBean.ofSuccess(service.modify(id, payload)) + } + + @PatchMapping("/quartz-job-configurations/{id}/{property}") + fun patch( + @PathVariable id: Long, + @PathVariable property: String, + @RequestBody payload: CreateOrModifyQuartzJobConfigurationPayload + ): ResponseBodyBean { + return ResponseBodyBean.ofSuccess(service.patch(id, property, payload)) + } + + @PostMapping("/quartz-job-configurations/{id}/run-immediately") + fun runImmediately(@PathVariable id: Long): ResponseBodyBean { + return ResponseBodyBean.ofSuccess(service.runImmediately(id)) + } + + @DeleteMapping("/quartz-job-configurations/{id}/{group}") + fun delete(@PathVariable id: Long, @PathVariable group: String): ResponseBodyBean { + return ResponseBodyBean.ofSuccess(service.delete(id, group)) + } + + override fun onExceptionOccurred() { + log.error("Exception occurred when uploading excel. Excel class: `${QuartzJobConfigurationExcel::class.java}`") + fileName.set(CharSequenceUtil.format("quartz-job-configuration-stat-{}.xlsx", Instant.now())) + } + + override fun validateBeforeAddToBeanList( + beanList: List, + bean: QuartzJobConfigurationExcel, index: Int + ) { + service.validateBeforeAddToBeanList(beanList, bean, index) + } + + override fun executeDatabaseOperation(beanList: List) { + service.save(beanList) + } + + override fun getTemplateFileName(): String { + return QuartzJobConfigurationService.TEMPLATE_EXCEL + } + + override fun getListForExporting(): List { + return service.getListForExporting() + } +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/converter/QuartzJobConfigurationMapStructMapper.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/converter/QuartzJobConfigurationMapStructMapper.kt new file mode 100644 index 00000000..f8aae1c0 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/converter/QuartzJobConfigurationMapStructMapper.kt @@ -0,0 +1,33 @@ +package com.jmsoftware.maf.springcloudstarter.quartz.converter + +import com.jmsoftware.maf.springcloudstarter.quartz.entity.QuartzJobConfigurationExcel +import com.jmsoftware.maf.springcloudstarter.quartz.entity.persistence.QuartzJobConfiguration +import org.mapstruct.Mapper +import org.mapstruct.Mapping +import org.mapstruct.factory.Mappers.getMapper + +/** + * # QuartzJobConfigurationMapStructMapper + * + * Description: QuartzJobConfigurationMapStructMapper, change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/14/22 10:34 PM + */ +@Mapper +interface QuartzJobConfigurationMapStructMapper { + companion object { + val INSTANCE: QuartzJobConfigurationMapStructMapper = + getMapper(QuartzJobConfigurationMapStructMapper::class.java) + } + + /** + * Convert from quartz job configuration. + * + * @param quartzJobConfigurationExcel the quartz job configuration excel + * @return the quartz job configuration + */ + @Mapping(target = "id", ignore = true) + @Mapping(target = "deleted", ignore = true) + @Mapping(target = "version", ignore = true) + fun of(quartzJobConfigurationExcel: QuartzJobConfigurationExcel): QuartzJobConfiguration +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/entity/CreateOrModifyQuartzJobConfigurationPayload.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/entity/CreateOrModifyQuartzJobConfigurationPayload.java deleted file mode 100644 index d28f962c..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/entity/CreateOrModifyQuartzJobConfigurationPayload.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.jmsoftware.maf.springcloudstarter.quartz.entity; - -import com.jmsoftware.maf.springcloudstarter.quartz.constant.Concurrent; -import com.jmsoftware.maf.springcloudstarter.quartz.constant.MisfirePolicy; -import com.jmsoftware.maf.springcloudstarter.quartz.constant.QuartzJobStatus; -import com.jmsoftware.maf.springcloudstarter.quartz.entity.persistence.QuartzJobConfiguration; -import com.jmsoftware.maf.springcloudstarter.validation.annotation.ValidEnumValue; -import lombok.Data; -import lombok.val; -import org.hibernate.validator.constraints.Length; - -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; - -/** - *

CreateOrModifyQuartzJobConfigurationPayload

- *

- * Change description here. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com, 10/1/21 11:43 PM - **/ -@Data -public class CreateOrModifyQuartzJobConfigurationPayload { - @NotBlank - @Length(max = 50) - private String name; - @NotBlank - @Length(max = 200) - private String group; - @NotBlank - @Length(max = 500) - private String invokeTarget; - @NotBlank - @Length(max = 50) - private String cronExpression; - @NotNull - @ValidEnumValue(targetEnum = MisfirePolicy.class) - private Byte misfirePolicy; - @NotNull - @ValidEnumValue(targetEnum = Concurrent.class) - private Byte concurrent; - @NotBlank - @Length(max = 1000) - private String description; - @NotNull - @ValidEnumValue(targetEnum = QuartzJobStatus.class) - private Byte status; - - public QuartzJobConfiguration asQuartzJobConfiguration() { - val result = new QuartzJobConfiguration(); - result.setName(this.name); - result.setGroup(this.group); - result.setInvokeTarget(this.invokeTarget); - result.setCronExpression(this.cronExpression); - result.setMisfirePolicy(this.misfirePolicy); - result.setConcurrent(this.concurrent); - result.setDescription(this.description); - result.setStatus(this.status); - return result; - } -} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/entity/CreateOrModifyQuartzJobConfigurationPayload.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/entity/CreateOrModifyQuartzJobConfigurationPayload.kt new file mode 100644 index 00000000..80f5f5cd --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/entity/CreateOrModifyQuartzJobConfigurationPayload.kt @@ -0,0 +1,50 @@ +package com.jmsoftware.maf.springcloudstarter.quartz.entity + +import com.jmsoftware.maf.springcloudstarter.quartz.constant.Concurrent +import com.jmsoftware.maf.springcloudstarter.quartz.constant.Concurrent.DISALLOW_CONCURRENT +import com.jmsoftware.maf.springcloudstarter.quartz.constant.MisfirePolicy +import com.jmsoftware.maf.springcloudstarter.quartz.constant.MisfirePolicy.MISFIRE_INSTRUCTION_SMART_POLICY +import com.jmsoftware.maf.springcloudstarter.quartz.constant.QuartzJobStatus +import com.jmsoftware.maf.springcloudstarter.quartz.constant.QuartzJobStatus.NORMAL +import com.jmsoftware.maf.springcloudstarter.quartz.entity.persistence.QuartzJobConfiguration +import com.jmsoftware.maf.springcloudstarter.validation.annotation.ValidEnumValue +import org.hibernate.validator.constraints.Length +import javax.validation.constraints.NotBlank +import javax.validation.constraints.NotNull + +/** + * # CreateOrModifyQuartzJobConfigurationPayload + * + * Change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/14/22 10:37 PM + */ +class CreateOrModifyQuartzJobConfigurationPayload { + lateinit var name: @NotBlank @Length(max = 50) String + lateinit var group: @NotBlank @Length(max = 200) String + lateinit var invokeTarget: @NotBlank @Length(max = 500) String + lateinit var cronExpression: @NotBlank @Length(max = 50) String + + @ValidEnumValue(targetEnum = MisfirePolicy::class) + var misfirePolicy: @NotNull Byte = MISFIRE_INSTRUCTION_SMART_POLICY.value + + @ValidEnumValue(targetEnum = Concurrent::class) + var concurrent: @NotNull Byte = DISALLOW_CONCURRENT.value + lateinit var description: @NotBlank @Length(max = 1000) String + + @ValidEnumValue(targetEnum = QuartzJobStatus::class) + var status: @NotNull Byte = NORMAL.value + + fun asQuartzJobConfiguration(): QuartzJobConfiguration { + val result = QuartzJobConfiguration() + result.name = name + result.group = group + result.invokeTarget = invokeTarget + result.cronExpression = cronExpression + result.misfirePolicy = misfirePolicy + result.concurrent = concurrent + result.description = description + result.status = status + return result + } +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/entity/GetQuartzJobConfigurationPageListItem.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/entity/GetQuartzJobConfigurationPageListItem.java deleted file mode 100644 index 7969156a..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/entity/GetQuartzJobConfigurationPageListItem.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.jmsoftware.maf.springcloudstarter.quartz.entity; - -import lombok.Data; - -import java.time.LocalDateTime; - -/** - *

GetQuartzJobConfigurationPageListItem

- *

- * Change description here. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com, 9/27/21 12:07 AM - **/ -@Data -public class GetQuartzJobConfigurationPageListItem { - private Long id; - private String name; - private String group; - private String serviceName; - private String invokeTarget; - private String cronExpression; - private Byte misfirePolicy; - private Byte concurrent; - private String description; - private Byte status; - private String createdBy; - private LocalDateTime createdTime; - private String modifiedBy; - private LocalDateTime modifiedTime; -} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/entity/GetQuartzJobConfigurationPageListItem.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/entity/GetQuartzJobConfigurationPageListItem.kt new file mode 100644 index 00000000..a1b8d1e2 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/entity/GetQuartzJobConfigurationPageListItem.kt @@ -0,0 +1,27 @@ +package com.jmsoftware.maf.springcloudstarter.quartz.entity + +import java.time.LocalDateTime + +/** + * # GetQuartzJobConfigurationPageListItem + * + * Change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/14/22 10:38 PM + */ +class GetQuartzJobConfigurationPageListItem { + var id: Long? = null + var name: String? = null + var group: String? = null + var serviceName: String? = null + var invokeTarget: String? = null + var cronExpression: String? = null + var misfirePolicy: Byte? = null + var concurrent: Byte? = null + var description: String? = null + var status: Byte? = null + var createdBy: String? = null + var createdTime: LocalDateTime? = null + var modifiedBy: String? = null + var modifiedTime: LocalDateTime? = null +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/entity/GetQuartzJobConfigurationPageListPayload.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/entity/GetQuartzJobConfigurationPageListPayload.java deleted file mode 100644 index 311ab2f9..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/entity/GetQuartzJobConfigurationPageListPayload.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.jmsoftware.maf.springcloudstarter.quartz.entity; - -import com.jmsoftware.maf.common.bean.PaginationBase; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - *

GetQuartzJobConfigurationPageListPayload

- *

- * Change description here. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com, 9/27/21 12:07 AM - **/ -@Data -@EqualsAndHashCode(callSuper = true) -public class GetQuartzJobConfigurationPageListPayload extends PaginationBase { - private String serviceName; -} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/entity/GetQuartzJobConfigurationPageListPayload.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/entity/GetQuartzJobConfigurationPageListPayload.kt new file mode 100644 index 00000000..49eedf37 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/entity/GetQuartzJobConfigurationPageListPayload.kt @@ -0,0 +1,14 @@ +package com.jmsoftware.maf.springcloudstarter.quartz.entity + +import com.jmsoftware.maf.common.bean.PaginationBase + +/** + * # GetQuartzJobConfigurationPageListPayload + * + * Change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/14/22 10:38 PM + */ +class GetQuartzJobConfigurationPageListPayload : PaginationBase() { + var serviceName: String? = null +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/entity/QuartzJobConfigurationExcel.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/entity/QuartzJobConfigurationExcel.java deleted file mode 100644 index 2877b034..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/entity/QuartzJobConfigurationExcel.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.jmsoftware.maf.springcloudstarter.quartz.entity; - -import lombok.Data; - -import javax.validation.constraints.NotBlank; -import java.time.LocalDateTime; - -/** - * Description: QuartzJobConfigurationExcel, change description here. - * - * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 9/27/2021 11:26 AM - **/ -@Data -public class QuartzJobConfigurationExcel { - @NotBlank - private String name; - private String group; - private String serviceName; - @NotBlank - private String invokeTarget; - @NotBlank - private String cronExpression; - private Byte misfirePolicy; - private Byte concurrent; - @NotBlank - private String description; - private Byte status; - private String createdBy; - private LocalDateTime createdTime; - private String modifiedBy; - private LocalDateTime modifiedTime; -} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/entity/QuartzJobConfigurationExcel.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/entity/QuartzJobConfigurationExcel.kt new file mode 100644 index 00000000..caf34d9b --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/entity/QuartzJobConfigurationExcel.kt @@ -0,0 +1,27 @@ +package com.jmsoftware.maf.springcloudstarter.quartz.entity + +import java.time.LocalDateTime +import javax.validation.constraints.NotBlank + +/** + * # QuartzJobConfigurationExcel + * + * Description: QuartzJobConfigurationExcel, change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/14/22 10:39 PM + */ +class QuartzJobConfigurationExcel { + var name: @NotBlank String? = null + var group: String? = null + var serviceName: String? = null + var invokeTarget: @NotBlank String? = null + var cronExpression: @NotBlank String? = null + var misfirePolicy: Byte? = null + var concurrent: Byte? = null + var description: @NotBlank String? = null + var status: Byte? = null + var createdBy: String? = null + var createdTime: LocalDateTime? = null + var modifiedBy: String? = null + var modifiedTime: LocalDateTime? = null +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/entity/package-info.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/entity/package-info.java deleted file mode 100644 index fc765029..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/entity/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package com.jmsoftware.maf.springcloudstarter.quartz.entity; diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/entity/persistence/QuartzJobConfiguration.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/entity/persistence/QuartzJobConfiguration.java deleted file mode 100644 index a507eaca..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/entity/persistence/QuartzJobConfiguration.java +++ /dev/null @@ -1,115 +0,0 @@ -package com.jmsoftware.maf.springcloudstarter.quartz.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.io.Serializable; -import java.time.LocalDateTime; - -import static com.baomidou.mybatisplus.annotation.FieldFill.INSERT; -import static com.baomidou.mybatisplus.annotation.FieldFill.UPDATE; - -/** - * Quartz Job Configuration - * - * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 9/23/2021 8:23 AM - */ -@Data -@TableName(value = QuartzJobConfiguration.TABLE_NAME) -public class QuartzJobConfiguration implements Serializable { - public static final String TABLE_NAME = "quartz_job_configuration"; - public static final String COL_ID = "id"; - public static final String COL_NAME = "name"; - public static final String COL_GROUP = "`group`"; - public static final String COL_SERVICE_NAME = "service_name"; - public static final String COL_INVOKE_TARGET = "invoke_target"; - public static final String COL_CRON_EXPRESSION = "cron_expression"; - public static final String COL_MISFIRE_POLICY = "misfire_policy"; - public static final String COL_CONCURRENT = "concurrent"; - public static final String COL_DESCRIPTION = "description"; - 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"; - private static final long serialVersionUID = -4561633114475541640L; - /** - * The primary key ID - */ - @TableId(value = COL_ID, type = IdType.AUTO) - private Long id; - /** - * Name of job - */ - @TableField(value = COL_NAME) - private String name; - /** - * Group of job - */ - @TableField(value = COL_GROUP) - private String group; - /** - * Service name, equal to artifact-id - */ - @TableField(value = COL_SERVICE_NAME) - private String serviceName; - /** - * Invoke target - */ - @TableField(value = COL_INVOKE_TARGET) - private String invokeTarget; - /** - * Cron Expressions - */ - @TableField(value = COL_CRON_EXPRESSION) - private String cronExpression; - /** - * Trigger's misfire policy - */ - @TableField(value = COL_MISFIRE_POLICY) - private Byte misfirePolicy; - /** - * Concurrent. true(1): is concurrent, false(0): not concurrent - */ - @TableField(value = COL_CONCURRENT) - private Byte concurrent; - /** - * Description - */ - @TableField(value = COL_DESCRIPTION) - private String description; - /** - * Status - */ - @TableField(value = COL_STATUS) - private Byte status; - /** - * Created by - */ - @TableField(value = COL_CREATED_BY, fill = INSERT) - private Long createdBy; - /** - * Craeted time - */ - @TableField(value = COL_CREATED_TIME, fill = INSERT) - private LocalDateTime createdTime; - /** - * Modified by - */ - @TableField(value = COL_MODIFIED_BY, fill = UPDATE) - private Long modifiedBy; - /** - * Modified time - */ - @TableField(value = COL_MODIFIED_TIME, fill = UPDATE) - private LocalDateTime modifiedTime; - /** - * Deleted - */ - @TableField(value = COL_DELETED, fill = INSERT) - private Byte deleted; -} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/entity/persistence/QuartzJobConfiguration.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/entity/persistence/QuartzJobConfiguration.kt new file mode 100644 index 00000000..0f43b965 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/entity/persistence/QuartzJobConfiguration.kt @@ -0,0 +1,86 @@ +package com.jmsoftware.maf.springcloudstarter.quartz.entity.persistence + +import com.baomidou.mybatisplus.annotation.TableField +import com.baomidou.mybatisplus.annotation.TableName +import com.jmsoftware.maf.springcloudstarter.database.BasePersistenceEntity +import java.io.Serial +import java.io.Serializable + +/** + * # QuartzJobConfiguration + * + * Quartz Job Configuration + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/14/22 10:36 PM + */ +@TableName(value = QuartzJobConfiguration.TABLE_NAME) +class QuartzJobConfiguration : BasePersistenceEntity(), Serializable { + companion object { + @Serial + var serialVersionUID = -4561633114475541640L + const val TABLE_NAME = "quartz_job_configuration" + const val COL_NAME = "name" + const val COL_GROUP = "`group`" + const val COL_SERVICE_NAME = "service_name" + const val COL_INVOKE_TARGET = "invoke_target" + const val COL_CRON_EXPRESSION = "cron_expression" + const val COL_MISFIRE_POLICY = "misfire_policy" + const val COL_CONCURRENT = "concurrent" + const val COL_DESCRIPTION = "description" + const val COL_STATUS = "status" + } + + /** + * Name of job + */ + @TableField(value = COL_NAME) + var name: String? = null + + /** + * Group of job + */ + @TableField(value = COL_GROUP) + var group: String? = null + + /** + * Service name, equal to artifact-id + */ + @TableField(value = COL_SERVICE_NAME) + var serviceName: String? = null + + /** + * Invoke target + */ + @TableField(value = COL_INVOKE_TARGET) + var invokeTarget: String? = null + + /** + * Cron Expressions + */ + @TableField(value = COL_CRON_EXPRESSION) + var cronExpression: String? = null + + /** + * Trigger's misfire policy + */ + @TableField(value = COL_MISFIRE_POLICY) + var misfirePolicy: Byte? = null + + /** + * Concurrent. true(1): is concurrent, false(0): not concurrent + */ + @TableField(value = COL_CONCURRENT) + var concurrent: Byte? = null + + /** + * Description + */ + @TableField(value = COL_DESCRIPTION) + var description: String? = null + + /** + * Status + */ + @TableField(value = COL_STATUS) + var status: Byte? = null +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/job/AbstractQuartzJob.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/job/AbstractQuartzJob.java deleted file mode 100644 index d0bd9fcb..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/job/AbstractQuartzJob.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.jmsoftware.maf.springcloudstarter.quartz.job; - -import cn.hutool.core.bean.BeanUtil; -import com.jmsoftware.maf.springcloudstarter.quartz.entity.persistence.QuartzJobConfiguration; -import lombok.extern.slf4j.Slf4j; -import lombok.val; -import org.quartz.JobExecutionContext; -import org.springframework.scheduling.quartz.QuartzJobBean; - -import static com.jmsoftware.maf.springcloudstarter.quartz.constant.ScheduleConstant.QUARTZ_JOB_CONFIGURATION; - -/** - * AbstractQuartzJob - * - * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 9/24/2021 3:51 PM - */ -@Slf4j -abstract class AbstractQuartzJob extends QuartzJobBean { - private static final String QUARTZ_JOB_CONFIGURATION_CLASS = QuartzJobConfiguration.class.getSimpleName(); - - @Override - protected final void executeInternal(JobExecutionContext context) { - val sourceQuartzJobConfiguration = context.getMergedJobDataMap().get(QUARTZ_JOB_CONFIGURATION); - if (!(QUARTZ_JOB_CONFIGURATION_CLASS.equals(sourceQuartzJobConfiguration.getClass().getSimpleName()))) { - throw new IllegalArgumentException( - "Invalid job data! Not the instance of QuartzJobConfiguration. Runtime actual class: " - + sourceQuartzJobConfiguration.getClass()); - } - val quartzJobConfiguration = new QuartzJobConfiguration(); - BeanUtil.copyProperties(sourceQuartzJobConfiguration, quartzJobConfiguration); - if (log.isDebugEnabled()) { - log.debug("Found and QuartzJobConfiguration from job data map: {}", sourceQuartzJobConfiguration); - } - try { - this.invoke(context, quartzJobConfiguration); - } catch (Exception e) { - log.error("Exception occurred when invoking method", e); - } - } - - /** - * Invoke. - * - * @param context the context - * @param quartzJobConfiguration the quartz job configuration - */ - protected abstract void invoke(JobExecutionContext context, QuartzJobConfiguration quartzJobConfiguration); -} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/job/AbstractQuartzJob.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/job/AbstractQuartzJob.kt new file mode 100644 index 00000000..d850eee3 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/job/AbstractQuartzJob.kt @@ -0,0 +1,47 @@ +package com.jmsoftware.maf.springcloudstarter.quartz.job + +import cn.hutool.core.bean.BeanUtil +import com.jmsoftware.maf.common.util.logger +import com.jmsoftware.maf.springcloudstarter.function.lazyDebug +import com.jmsoftware.maf.springcloudstarter.quartz.constant.QUARTZ_JOB_CONFIGURATION +import com.jmsoftware.maf.springcloudstarter.quartz.entity.persistence.QuartzJobConfiguration +import org.quartz.JobExecutionContext +import org.springframework.scheduling.quartz.QuartzJobBean + +/** + * AbstractQuartzJob + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 9/24/2021 3:51 PM + */ +abstract class AbstractQuartzJob : QuartzJobBean() { + companion object { + private val QUARTZ_JOB_CONFIGURATION_CLASS = QuartzJobConfiguration::class.java.name + private val log = logger() + } + + override fun executeInternal(context: JobExecutionContext) { + val sourceQuartzJobConfiguration = context.mergedJobDataMap[QUARTZ_JOB_CONFIGURATION] + require(QUARTZ_JOB_CONFIGURATION_CLASS == sourceQuartzJobConfiguration!!.javaClass.name) { + "Invalid job data! Not the instance of QuartzJobConfiguration. Runtime actual class: ${sourceQuartzJobConfiguration.javaClass}" + } + lazyDebug(log) { "Found and QuartzJobConfiguration from job data map: $sourceQuartzJobConfiguration" } + val quartzJobConfiguration = QuartzJobConfiguration() + BeanUtil.copyProperties(sourceQuartzJobConfiguration, quartzJobConfiguration) + try { + this.invoke(context, quartzJobConfiguration) + } catch (e: Exception) { + log.error("Exception occurred when invoking method!", e) + } + } + + /** + * Invoke. + * + * @param context the context + * @param quartzJobConfiguration the quartz job configuration + */ + protected abstract operator fun invoke( + context: JobExecutionContext, + quartzJobConfiguration: QuartzJobConfiguration + ) +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/job/QuartzDisallowConcurrentExecution.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/job/QuartzDisallowConcurrentExecution.java deleted file mode 100644 index d792dd69..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/job/QuartzDisallowConcurrentExecution.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.jmsoftware.maf.springcloudstarter.quartz.job; - -import com.jmsoftware.maf.springcloudstarter.quartz.entity.persistence.QuartzJobConfiguration; -import com.jmsoftware.maf.springcloudstarter.quartz.util.QuartzJobInvocationUtil; -import org.quartz.DisallowConcurrentExecution; -import org.quartz.JobExecutionContext; - -/** - * QuartzDisallowConcurrentExecution - * - * @author 钟俊 (zhongjun), email: zhongjun@toguide.cn, date: 5/12/2021 2:11 PM - */ -@DisallowConcurrentExecution -public final class QuartzDisallowConcurrentExecution extends AbstractQuartzJob { - @Override - protected void invoke(JobExecutionContext context, QuartzJobConfiguration quartzJobConfiguration) { - QuartzJobInvocationUtil.invokeMethod(quartzJobConfiguration); - } -} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/job/QuartzDisallowConcurrentExecution.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/job/QuartzDisallowConcurrentExecution.kt new file mode 100644 index 00000000..619de1bb --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/job/QuartzDisallowConcurrentExecution.kt @@ -0,0 +1,18 @@ +package com.jmsoftware.maf.springcloudstarter.quartz.job + +import com.jmsoftware.maf.springcloudstarter.quartz.entity.persistence.QuartzJobConfiguration +import com.jmsoftware.maf.springcloudstarter.quartz.util.invokeMethod +import org.quartz.DisallowConcurrentExecution +import org.quartz.JobExecutionContext + +/** + * # QuartzDisallowConcurrentExecution + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/14/22 10:39 PM + */ +@DisallowConcurrentExecution +class QuartzDisallowConcurrentExecution : AbstractQuartzJob() { + override fun invoke(context: JobExecutionContext, quartzJobConfiguration: QuartzJobConfiguration) { + invokeMethod(quartzJobConfiguration) + } +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/job/QuartzJobExecution.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/job/QuartzJobExecution.java deleted file mode 100644 index d4bb1d1a..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/job/QuartzJobExecution.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.jmsoftware.maf.springcloudstarter.quartz.job; - -import com.jmsoftware.maf.springcloudstarter.quartz.entity.persistence.QuartzJobConfiguration; -import com.jmsoftware.maf.springcloudstarter.quartz.util.QuartzJobInvocationUtil; -import org.quartz.JobExecutionContext; - -/** - * QuartzJobExecution. Concurrent execution - * - * @author 钟俊 (zhongjun), email: zhongjun@toguide.cn, date: 5/12/2021 2:11 PM - */ -public final class QuartzJobExecution extends AbstractQuartzJob { - @Override - protected void invoke(JobExecutionContext context, QuartzJobConfiguration quartzJobConfiguration) { - QuartzJobInvocationUtil.invokeMethod(quartzJobConfiguration); - } -} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/job/QuartzJobExecution.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/job/QuartzJobExecution.kt new file mode 100644 index 00000000..518ee9a7 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/job/QuartzJobExecution.kt @@ -0,0 +1,18 @@ +package com.jmsoftware.maf.springcloudstarter.quartz.job + +import com.jmsoftware.maf.springcloudstarter.quartz.entity.persistence.QuartzJobConfiguration +import com.jmsoftware.maf.springcloudstarter.quartz.util.invokeMethod +import org.quartz.JobExecutionContext + +/** + * # QuartzJobExecution + * + * QuartzJobExecution. Concurrent execution + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/14/22 10:45 PM + */ +class QuartzJobExecution : AbstractQuartzJob() { + override fun invoke(context: JobExecutionContext, quartzJobConfiguration: QuartzJobConfiguration) { + invokeMethod(quartzJobConfiguration) + } +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/mapper/QuartzJobConfigurationMapper.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/mapper/QuartzJobConfigurationMapper.java deleted file mode 100644 index 0ed00dd4..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/mapper/QuartzJobConfigurationMapper.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.jmsoftware.maf.springcloudstarter.quartz.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.jmsoftware.maf.springcloudstarter.quartz.entity.GetQuartzJobConfigurationPageListItem; -import com.jmsoftware.maf.springcloudstarter.quartz.entity.GetQuartzJobConfigurationPageListPayload; -import com.jmsoftware.maf.springcloudstarter.quartz.entity.QuartzJobConfigurationExcel; -import com.jmsoftware.maf.springcloudstarter.quartz.entity.persistence.QuartzJobConfiguration; -import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Param; - -import java.util.List; - -/** - * Description: QuartzJobConfigurationMapper - * - * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 9/23/2021 8:23 AM - */ -@Mapper -public interface QuartzJobConfigurationMapper extends BaseMapper { - /** - * Select page list page. - * - * @param page the page - * @param payload the payload - * @return the page - */ - Page selectPageList( - Page page, - @Param("payload") GetQuartzJobConfigurationPageListPayload payload - ); - - /** - * Select list for exporting list. - * - * @param serviceName the service name - * @return the list - */ - List selectListForExporting(String serviceName); -} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/repository/QuartzJobConfigurationMapper.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/repository/QuartzJobConfigurationMapper.kt new file mode 100644 index 00000000..60e90ab9 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/repository/QuartzJobConfigurationMapper.kt @@ -0,0 +1,40 @@ +package com.jmsoftware.maf.springcloudstarter.quartz.repository + +import com.baomidou.mybatisplus.core.mapper.BaseMapper +import com.baomidou.mybatisplus.extension.plugins.pagination.Page +import com.jmsoftware.maf.springcloudstarter.quartz.entity.GetQuartzJobConfigurationPageListItem +import com.jmsoftware.maf.springcloudstarter.quartz.entity.GetQuartzJobConfigurationPageListPayload +import com.jmsoftware.maf.springcloudstarter.quartz.entity.QuartzJobConfigurationExcel +import com.jmsoftware.maf.springcloudstarter.quartz.entity.persistence.QuartzJobConfiguration +import org.apache.ibatis.annotations.Mapper +import org.apache.ibatis.annotations.Param +import org.springframework.stereotype.Repository + +/** + * Description: QuartzJobConfigurationMapStructMapper + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 9/23/2021 8:23 AM + */ +@Mapper +@Repository +interface QuartzJobConfigurationMapper : BaseMapper { + /** + * Select page list page. + * + * @param page the page + * @param payload the payload + * @return the page + */ + fun selectPageList( + page: Page, + @Param("payload") payload: GetQuartzJobConfigurationPageListPayload + ): Page + + /** + * Select list for exporting list. + * + * @param serviceName the service name + * @return the list + */ + fun selectListForExporting(serviceName: String): List +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/service/QuartzJobConfigurationService.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/service/QuartzJobConfigurationService.kt similarity index 51% rename from spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/service/QuartzJobConfigurationService.java rename to spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/service/QuartzJobConfigurationService.kt index e2a7646e..a46b7612 100644 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/service/QuartzJobConfigurationService.java +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/service/QuartzJobConfigurationService.kt @@ -1,28 +1,28 @@ -package com.jmsoftware.maf.springcloudstarter.quartz.service; +package com.jmsoftware.maf.springcloudstarter.quartz.service -import com.baomidou.mybatisplus.extension.service.IService; -import com.jmsoftware.maf.common.bean.PageResponseBodyBean; -import com.jmsoftware.maf.springcloudstarter.quartz.entity.CreateOrModifyQuartzJobConfigurationPayload; -import com.jmsoftware.maf.springcloudstarter.quartz.entity.GetQuartzJobConfigurationPageListItem; -import com.jmsoftware.maf.springcloudstarter.quartz.entity.GetQuartzJobConfigurationPageListPayload; -import com.jmsoftware.maf.springcloudstarter.quartz.entity.QuartzJobConfigurationExcel; -import com.jmsoftware.maf.springcloudstarter.quartz.entity.persistence.QuartzJobConfiguration; -import org.springframework.validation.annotation.Validated; - -import javax.validation.Valid; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; -import java.util.List; +import com.baomidou.mybatisplus.extension.service.IService +import com.jmsoftware.maf.common.bean.PageResponseBodyBean +import com.jmsoftware.maf.springcloudstarter.quartz.entity.CreateOrModifyQuartzJobConfigurationPayload +import com.jmsoftware.maf.springcloudstarter.quartz.entity.GetQuartzJobConfigurationPageListItem +import com.jmsoftware.maf.springcloudstarter.quartz.entity.GetQuartzJobConfigurationPageListPayload +import com.jmsoftware.maf.springcloudstarter.quartz.entity.QuartzJobConfigurationExcel +import com.jmsoftware.maf.springcloudstarter.quartz.entity.persistence.QuartzJobConfiguration +import org.springframework.validation.annotation.Validated +import javax.validation.Valid +import javax.validation.constraints.NotBlank +import javax.validation.constraints.NotEmpty +import javax.validation.constraints.NotNull /** * Description: QuartzJobConfigurationService * * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 9/23/2021 8:23 AM - **/ + */ @Validated -public interface QuartzJobConfigurationService extends IService { - String TEMPLATE_EXCEL = "quartz-job-configuration-stat.xlsx"; +interface QuartzJobConfigurationService : IService { + companion object { + const val TEMPLATE_EXCEL = "quartz-job-configuration-stat.xlsx" + } /** * Gets page list. @@ -30,9 +30,9 @@ public interface QuartzJobConfigurationService extends IService getPageList( - @Valid GetQuartzJobConfigurationPageListPayload payload - ); + fun getPageList( + payload: @Valid @NotNull GetQuartzJobConfigurationPageListPayload + ): PageResponseBodyBean /** * Validate before add to bean list. @@ -41,22 +41,25 @@ PageResponseBodyBean getPageList( * @param bean the bean * @param index the index */ - void validateBeforeAddToBeanList(List beanList, QuartzJobConfigurationExcel bean, - int index); + fun validateBeforeAddToBeanList( + beanList: List, + bean: QuartzJobConfigurationExcel, + index: Int + ) /** * Save. * * @param beanList the bean list */ - void save(@NotEmpty List<@Valid QuartzJobConfigurationExcel> beanList); + fun save(beanList: @NotEmpty List) /** * Gets list for exporting. * * @return the list for exporting */ - List getListForExporting(); + fun getListForExporting(): List /** * Create create quartz job configuration response. @@ -64,7 +67,7 @@ void validateBeforeAddToBeanList(List beanList, Qua * @param payload the payload * @return the quartz job configuration id */ - Long create(@Valid @NotNull CreateOrModifyQuartzJobConfigurationPayload payload); + fun create(payload: @Valid @NotNull CreateOrModifyQuartzJobConfigurationPayload): Long /** * Modify modify quartz job configuration response. @@ -73,9 +76,10 @@ void validateBeforeAddToBeanList(List beanList, Qua * @param payload the payload * @return the quartz job configuration id */ - Long modify( - @NotNull Long id, - @Valid @NotNull CreateOrModifyQuartzJobConfigurationPayload payload); + fun modify( + id: @NotNull Long, + payload: @Valid @NotNull CreateOrModifyQuartzJobConfigurationPayload + ): Long /** * Patch create or modify quartz job configuration response. @@ -85,10 +89,11 @@ Long modify( * @param payload the payload * @return the quartz job configuration id */ - Long patch( - @NotNull Long id, - @NotBlank String property, - @NotNull CreateOrModifyQuartzJobConfigurationPayload payload); + fun patch( + id: @NotNull Long, + property: @NotBlank String, + payload: @NotNull CreateOrModifyQuartzJobConfigurationPayload + ): Long /** * Run immediately. @@ -96,7 +101,7 @@ Long patch( * @param id the id * @return the quartz job configuration id */ - Long runImmediately(@NotNull Long id); + fun runImmediately(id: @NotNull Long): Long /** * Delete quartz job long. @@ -105,5 +110,5 @@ Long patch( * @param group the group * @return the long */ - Long delete(@NotNull Long id, @NotBlank String group); + fun delete(id: @NotNull Long, group: @NotBlank String): Long } diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/service/QuartzJobService.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/service/QuartzJobService.kt similarity index 51% rename from spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/service/QuartzJobService.java rename to spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/service/QuartzJobService.kt index a116a8ee..9ea67218 100644 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/service/QuartzJobService.java +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/service/QuartzJobService.kt @@ -1,18 +1,17 @@ -package com.jmsoftware.maf.springcloudstarter.quartz.service; +package com.jmsoftware.maf.springcloudstarter.quartz.service -import org.springframework.lang.Nullable; -import org.springframework.validation.annotation.Validated; - -import javax.validation.constraints.NotBlank; -import java.util.Map; +import org.springframework.validation.annotation.Validated +import javax.validation.constraints.NotBlank /** + * # QuartzJobService + * * Description: QuartzJobService, change description here. * - * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 7/13/2021 10:17 PM + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/14/22 10:50 PM */ @Validated -public interface QuartzJobService { +interface QuartzJobService { /** * Add job. * @@ -22,8 +21,13 @@ public interface QuartzJobService { * @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); + fun addJob( + clazzName: @NotBlank String, + jobName: @NotBlank String, + groupName: @NotBlank String, + cronExp: @NotBlank String, + param: Map? + ) /** * Pause job. @@ -31,7 +35,7 @@ void addJob(@NotBlank String clazzName, @NotBlank String jobName, @NotBlank Stri * @param jobName the job name * @param groupName the group name */ - void pauseJob(@NotBlank String jobName, @NotBlank String groupName); + fun pauseJob(jobName: @NotBlank String, groupName: @NotBlank String) /** * Resume job. @@ -39,7 +43,7 @@ void addJob(@NotBlank String clazzName, @NotBlank String jobName, @NotBlank Stri * @param jobName the job name * @param groupName the group name */ - void resumeJob(@NotBlank String jobName, @NotBlank String groupName); + fun resumeJob(jobName: @NotBlank String, groupName: @NotBlank String) /** * Run immediately. @@ -47,7 +51,7 @@ void addJob(@NotBlank String clazzName, @NotBlank String jobName, @NotBlank Stri * @param jobName the job name * @param groupName the group name */ - void runImmediately(@NotBlank String jobName, @NotBlank String groupName); + fun runImmediately(jobName: @NotBlank String, groupName: @NotBlank String) /** * Update job. @@ -57,8 +61,12 @@ void addJob(@NotBlank String clazzName, @NotBlank String jobName, @NotBlank Stri * @param cronExp the cron exp * @param param the param */ - void updateJob(@NotBlank String jobName, @NotBlank String groupName, @NotBlank String cronExp, - @Nullable Map param); + fun updateJob( + jobName: @NotBlank String, + groupName: @NotBlank String, + cronExp: @NotBlank String, + param: Map? + ) /** * Delete job. @@ -66,25 +74,25 @@ void updateJob(@NotBlank String jobName, @NotBlank String groupName, @NotBlank S * @param jobName the job name * @param groupName the group name */ - void deleteJob(@NotBlank String jobName, @NotBlank String groupName); + fun deleteJob(jobName: @NotBlank String, groupName: @NotBlank String) /** * Start all jobs. */ - void startAllJobs(); + fun startAllJobs() /** * Pause all jobs. */ - void pauseAllJobs(); + fun pauseAllJobs() /** * Resume all jobs. */ - void resumeAllJobs(); + fun resumeAllJobs() /** * Shutdown all jobs. */ - void shutdownAllJobs(); + fun shutdownAllJobs() } diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/service/impl/QuartzJobConfigurationServiceImpl.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/service/impl/QuartzJobConfigurationServiceImpl.java deleted file mode 100644 index 2a0dba0f..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/service/impl/QuartzJobConfigurationServiceImpl.java +++ /dev/null @@ -1,218 +0,0 @@ -package com.jmsoftware.maf.springcloudstarter.quartz.service.impl; - -import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.util.ReflectUtil; -import cn.hutool.extra.validation.ValidationUtil; -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.common.bean.PageResponseBodyBean; -import com.jmsoftware.maf.springcloudstarter.property.MafProjectProperties; -import com.jmsoftware.maf.springcloudstarter.quartz.entity.CreateOrModifyQuartzJobConfigurationPayload; -import com.jmsoftware.maf.springcloudstarter.quartz.entity.GetQuartzJobConfigurationPageListItem; -import com.jmsoftware.maf.springcloudstarter.quartz.entity.GetQuartzJobConfigurationPageListPayload; -import com.jmsoftware.maf.springcloudstarter.quartz.entity.QuartzJobConfigurationExcel; -import com.jmsoftware.maf.springcloudstarter.quartz.entity.persistence.QuartzJobConfiguration; -import com.jmsoftware.maf.springcloudstarter.quartz.mapper.QuartzJobConfigurationMapper; -import com.jmsoftware.maf.springcloudstarter.quartz.service.QuartzJobConfigurationService; -import com.jmsoftware.maf.springcloudstarter.quartz.util.CronUtil; -import com.jmsoftware.maf.springcloudstarter.quartz.util.ScheduleUtil; -import lombok.RequiredArgsConstructor; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import lombok.val; -import org.quartz.JobDataMap; -import org.quartz.SchedulerException; -import org.springframework.scheduling.quartz.SchedulerFactoryBean; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import javax.annotation.PostConstruct; -import javax.validation.Valid; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; -import java.util.List; -import java.util.Optional; -import java.util.stream.Collectors; - -import static cn.hutool.core.text.CharSequenceUtil.format; -import static com.jmsoftware.maf.springcloudstarter.function.BooleanCheck.requireTrue; -import static com.jmsoftware.maf.springcloudstarter.quartz.constant.ScheduleConstant.QUARTZ_JOB_CONFIGURATION; -import static java.util.Objects.requireNonNull; - -/** - * Description: QuartzJobConfigurationServiceImpl - * - * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 9/23/2021 8:23 AM - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class QuartzJobConfigurationServiceImpl - extends ServiceImpl - implements QuartzJobConfigurationService { - private final SchedulerFactoryBean schedulerFactoryBean; - private final MafProjectProperties mafProjectProperties; - - @PostConstruct - public void initQuartzJob() throws SchedulerException { - val scheduler = this.schedulerFactoryBean.getScheduler(); - scheduler.clear(); - val jobList = this.getQuartzJobConfigurationForInitialization(); - for (val quartzJobConfiguration : jobList) { - Optional.ofNullable(ScheduleUtil.createScheduleJob( - scheduler, - quartzJobConfiguration, - this.mafProjectProperties.getProjectArtifactId() - )).ifPresent(jobDetail -> log.info("Created schedule job. JobKey: {}", jobDetail.getKey())); - } - } - - private List getQuartzJobConfigurationForInitialization() { - val queryWrapper = Wrappers.lambdaQuery(QuartzJobConfiguration.class); - queryWrapper.eq(QuartzJobConfiguration::getServiceName, this.mafProjectProperties.getProjectArtifactId()) - .orderByAsc(QuartzJobConfiguration::getId); - return this.list(queryWrapper); - } - - @Override - public PageResponseBodyBean getPageList( - @Valid GetQuartzJobConfigurationPageListPayload payload - ) { - val page = new Page(payload.getCurrentPage(), payload.getPageSize()); - this.getBaseMapper().selectPageList(page, payload); - return PageResponseBodyBean.ofSuccess(page.getRecords(), page.getTotal()); - } - - @Override - @SneakyThrows - public void validateBeforeAddToBeanList(List beanList, - QuartzJobConfigurationExcel bean, int index) { - val beanValidationResult = ValidationUtil.warpValidate(bean); - requireTrue( - beanValidationResult.isSuccess(), - success -> log.info("QuartzJobConfigurationExcel validation result: {}", success) - ).orElseThrow( - () -> new IllegalStateException("Invalid data. " + beanValidationResult.getErrorMessages().get(0)) - ); - } - - @Override - @SneakyThrows - @Transactional(rollbackFor = Throwable.class) - public void save(@NotEmpty List<@Valid QuartzJobConfigurationExcel> beanList) { - val quartzJobConfigurationList = beanList.stream().map(quartzJobConfigurationExcel -> { - val quartzJobConfiguration = new QuartzJobConfiguration(); - BeanUtil.copyProperties(quartzJobConfigurationExcel, quartzJobConfiguration); - return quartzJobConfiguration; - }).collect(Collectors.toList()); - requireTrue( - this.saveBatch(quartzJobConfigurationList), - saved -> log.info("Saved quartzJobConfigurationList, saved: {}", saved) - ).orElseThrow(() -> new IllegalStateException("Failed to save batch quartzJobConfigurationList")); - } - - @Override - public List getListForExporting() { - return this.getBaseMapper().selectListForExporting(this.mafProjectProperties.getProjectArtifactId()); - } - - @Override - @SneakyThrows - public Long create( - @Valid @NotNull CreateOrModifyQuartzJobConfigurationPayload payload - ) { - this.validateCronExpression(payload.getCronExpression()); - val quartzJobConfiguration = payload.asQuartzJobConfiguration(); - quartzJobConfiguration.setServiceName(this.mafProjectProperties.getProjectArtifactId()); - requireTrue(this.save(quartzJobConfiguration), saved -> log.info("Quartz job configuration saved: {}", saved)) - .orElseThrow(() -> new IllegalStateException("Failed to save quartz job configuration")); - return quartzJobConfiguration.getId(); - } - - private void validateCronExpression(String cronExpression) throws Throwable { - requireTrue( - CronUtil.isValid(cronExpression), - valid -> log.warn("Cron validation: {}, expression: {}", valid, cronExpression) - ).orElseThrow(() -> new IllegalArgumentException(format("Cron({}) invalid", cronExpression))); - } - - @Override - @SneakyThrows - public Long modify( - @NotNull Long id, - @Valid @NotNull CreateOrModifyQuartzJobConfigurationPayload payload - ) { - this.validateCronExpression(payload.getCronExpression()); - val quartzJobConfiguration = payload.asQuartzJobConfiguration(); - quartzJobConfiguration.setId(id); - requireTrue( - this.updateById(quartzJobConfiguration), - updated -> log.warn("Quartz job configuration updated: {}", updated) - ).orElseThrow(() -> new IllegalStateException("Failed to update quartz job configuration")); - return id; - } - - @Override - @SneakyThrows - public Long patch( - @NotNull Long id, - @NotBlank String property, - @NotNull CreateOrModifyQuartzJobConfigurationPayload payload - ) { - val value = ReflectUtil.getFieldValue(payload, property); - requireNonNull(value, format("Property's value({}) must not be null", property)); - val validationResult = ValidationUtil.warpValidateProperty(payload, property); - requireTrue( - validationResult.isSuccess(), - valid -> log.warn("Quartz job configuration patched: {}", valid) - ).orElseThrow(() -> new IllegalStateException(format("{} invalid", property))); - val quartzJobConfiguration = new QuartzJobConfiguration(); - ReflectUtil.setFieldValue(quartzJobConfiguration, property, value); - quartzJobConfiguration.setId(id); - requireTrue( - this.updateById(quartzJobConfiguration), - updated -> log.warn("Quartz job configuration patched: {}", updated) - ).orElseThrow(() -> new IllegalStateException(format("Failed to patch {}", property))); - return id; - } - - @Override - @SneakyThrows - public Long runImmediately(@NotNull Long id) { - val quartzJobConfiguration = this.getById(id); - requireNonNull(quartzJobConfiguration, format("Quartz job(id:{}) must not be null", id)); - val scheduler = this.schedulerFactoryBean.getScheduler(); - val jobDataMap = new JobDataMap(); - jobDataMap.put(QUARTZ_JOB_CONFIGURATION, quartzJobConfiguration); - scheduler.triggerJob( - ScheduleUtil.getJobKey( - quartzJobConfiguration.getId(), - quartzJobConfiguration.getGroup(), - this.mafProjectProperties.getProjectArtifactId()), - jobDataMap - ); - log.warn("Triggered Quartz job successfully, {}", quartzJobConfiguration); - return id; - } - - @Override - @SneakyThrows - @Transactional(rollbackFor = Throwable.class) - public Long delete(@NotNull Long id, @NotBlank String group) { - requireTrue( - this.removeById(id), - deleted -> log.warn("Quartz job configuration deleted: {}", deleted) - ).orElseThrow(() -> new IllegalStateException(format("Failed to delete Quartz job configuration"))); - val scheduler = this.schedulerFactoryBean.getScheduler(); - val deletedJob = scheduler.deleteJob( - ScheduleUtil.getJobKey(id, group, this.mafProjectProperties.getProjectArtifactId()) - ); - requireTrue( - deletedJob, - deletedJob1 -> log.warn("Scheduler deleted job and related triggers: {}", deletedJob1) - ).orElseThrow(() -> new IllegalStateException("Failed to delete job by scheduler")); - return id; - } -} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/service/impl/QuartzJobConfigurationServiceImpl.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/service/impl/QuartzJobConfigurationServiceImpl.kt new file mode 100644 index 00000000..484de96d --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/service/impl/QuartzJobConfigurationServiceImpl.kt @@ -0,0 +1,197 @@ +package com.jmsoftware.maf.springcloudstarter.quartz.service.impl + +import cn.hutool.core.text.CharSequenceUtil +import cn.hutool.core.util.ReflectUtil +import cn.hutool.extra.validation.ValidationUtil +import com.baomidou.mybatisplus.extension.plugins.pagination.Page +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl +import com.jmsoftware.maf.common.bean.PageResponseBodyBean +import com.jmsoftware.maf.common.util.logger +import com.jmsoftware.maf.springcloudstarter.function.requireTrue +import com.jmsoftware.maf.springcloudstarter.property.MafProjectProperties +import com.jmsoftware.maf.springcloudstarter.quartz.constant.QUARTZ_JOB_CONFIGURATION +import com.jmsoftware.maf.springcloudstarter.quartz.converter.QuartzJobConfigurationMapStructMapper +import com.jmsoftware.maf.springcloudstarter.quartz.entity.CreateOrModifyQuartzJobConfigurationPayload +import com.jmsoftware.maf.springcloudstarter.quartz.entity.GetQuartzJobConfigurationPageListItem +import com.jmsoftware.maf.springcloudstarter.quartz.entity.GetQuartzJobConfigurationPageListPayload +import com.jmsoftware.maf.springcloudstarter.quartz.entity.QuartzJobConfigurationExcel +import com.jmsoftware.maf.springcloudstarter.quartz.entity.persistence.QuartzJobConfiguration +import com.jmsoftware.maf.springcloudstarter.quartz.repository.QuartzJobConfigurationMapper +import com.jmsoftware.maf.springcloudstarter.quartz.service.QuartzJobConfigurationService +import com.jmsoftware.maf.springcloudstarter.quartz.util.createScheduleJob +import com.jmsoftware.maf.springcloudstarter.quartz.util.getJobKey +import com.jmsoftware.maf.springcloudstarter.quartz.util.validateCronExp +import org.quartz.JobDataMap +import org.quartz.Scheduler +import org.springframework.scheduling.quartz.SchedulerFactoryBean +import org.springframework.stereotype.Service +import org.springframework.transaction.annotation.Transactional +import java.util.* +import javax.annotation.PostConstruct +import javax.validation.Valid +import javax.validation.constraints.NotBlank +import javax.validation.constraints.NotEmpty +import javax.validation.constraints.NotNull + +/** + * # QuartzJobConfigurationServiceImpl + * + * Description: QuartzJobConfigurationServiceImpl + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/15/22 9:11 AM + */ +@Service +class QuartzJobConfigurationServiceImpl( + private val schedulerFactoryBean: SchedulerFactoryBean, + private val mafProjectProperties: MafProjectProperties +) : ServiceImpl(), QuartzJobConfigurationService { + companion object { + private val logger = logger() + } + + @PostConstruct + fun initQuartzJob() { + val scheduler: Scheduler = schedulerFactoryBean.scheduler + scheduler.clear() + val jobList: List = getQuartzJobConfigurationForInitialization() + for (quartzJobConfiguration in jobList) { + createScheduleJob( + scheduler, + quartzJobConfiguration, + mafProjectProperties.projectArtifactId + ).let { + logger.info("Created schedule job. JobKey: ${it?.key}") + } + } + } + + private fun getQuartzJobConfigurationForInitialization(): List { + return this.ktQuery() + .eq(QuartzJobConfiguration::serviceName, mafProjectProperties.projectArtifactId) + .orderByAsc(QuartzJobConfiguration::createdTime) + .list() + } + + override fun getPageList( + payload: @Valid @NotNull GetQuartzJobConfigurationPageListPayload + ): PageResponseBodyBean { + val page: Page = + Page(payload.currentPage.toLong(), payload.pageSize.toLong()) + this.getBaseMapper().selectPageList(page, payload) + return PageResponseBodyBean.ofSuccess(page.records, page.total) + } + + override fun validateBeforeAddToBeanList( + beanList: List, + bean: QuartzJobConfigurationExcel, + index: Int + ) { + val beanValidationResult = ValidationUtil.warpValidate(bean) + requireTrue(beanValidationResult.isSuccess) { success: Boolean -> + logger.info("QuartzJobConfigurationExcel validation result: $success") + }.orElseThrow { IllegalStateException("Invalid data. ${beanValidationResult.errorMessages[0]}") } + } + + @Transactional(rollbackFor = [Throwable::class]) + override fun save(beanList: @NotEmpty List) { + requireTrue( + this.saveBatch( + beanList.stream() + .map(QuartzJobConfigurationMapStructMapper.INSTANCE::of) + .toList() + ) + ) { saved: Boolean -> + logger.info("Saved quartzJobConfigurationList, saved: $saved") + }.orElseThrow { IllegalStateException("Failed to save batch quartzJobConfigurationList") } + } + + override fun getListForExporting(): List = + this.getBaseMapper().selectListForExporting(mafProjectProperties.projectArtifactId) + + override fun create( + payload: @Valid @NotNull CreateOrModifyQuartzJobConfigurationPayload + ): Long { + validateCronExpression(payload.cronExpression) + val quartzJobConfiguration: QuartzJobConfiguration = payload.asQuartzJobConfiguration() + quartzJobConfiguration.serviceName = mafProjectProperties.projectArtifactId + requireTrue(save(quartzJobConfiguration)) { saved: Boolean -> + logger.info("Quartz job configuration saved: $saved") + }.orElseThrow { IllegalStateException("Failed to save quartz job configuration") } + return quartzJobConfiguration.id!! + } + + private fun validateCronExpression(cronExpression: String) { + requireTrue(validateCronExp(cronExpression)) { valid: Boolean -> + logger.warn("Cron validation: $valid, expression: $cronExpression") + }.orElseThrow { IllegalArgumentException("Cron($cronExpression) invalid") } + } + + override fun modify( + id: @NotNull Long, + payload: @Valid @NotNull CreateOrModifyQuartzJobConfigurationPayload + ): Long { + validateCronExpression(payload.cronExpression) + val quartzJobConfiguration: QuartzJobConfiguration = payload.asQuartzJobConfiguration() + quartzJobConfiguration.id = id + requireTrue(this.updateById(quartzJobConfiguration)) { updated: Boolean -> + logger.warn("Quartz job configuration updated: $updated") + }.orElseThrow { IllegalStateException("Failed to update quartz job configuration") } + return id + } + + override fun patch( + id: @NotNull Long, + property: @NotBlank String, + payload: @NotNull CreateOrModifyQuartzJobConfigurationPayload + ): Long { + val value = ReflectUtil.getFieldValue(payload, property) + Objects.requireNonNull(value, CharSequenceUtil.format("Property's value({}) must not be null", property)) + val validationResult = ValidationUtil.warpValidateProperty(payload, property) + requireTrue(validationResult.isSuccess) { valid: Boolean -> + logger.warn("Quartz job configuration patched: $valid") + }.orElseThrow { IllegalStateException(CharSequenceUtil.format("`$property` invalid")) } + val quartzJobConfiguration = QuartzJobConfiguration() + ReflectUtil.setFieldValue(quartzJobConfiguration, property, value) + quartzJobConfiguration.id = id + requireTrue(this.updateById(quartzJobConfiguration)) { updated: Boolean -> + logger.warn( + "Quartz job configuration patched: {}", + updated + ) + }.orElseThrow { IllegalStateException("Failed to patch $property") } + return id + } + + override fun runImmediately(id: @NotNull Long): Long { + val quartzJobConfiguration: QuartzJobConfiguration = + this.getById(id) ?: throw IllegalArgumentException("Quartz job(id:$id) not found!") + val scheduler: Scheduler = schedulerFactoryBean.scheduler + val jobDataMap = JobDataMap() + jobDataMap[QUARTZ_JOB_CONFIGURATION] = quartzJobConfiguration + scheduler.triggerJob( + getJobKey( + quartzJobConfiguration.id!!, + quartzJobConfiguration.group!!, + mafProjectProperties.projectArtifactId + ), + jobDataMap + ) + logger.warn("Triggered Quartz job successfully, {}", quartzJobConfiguration) + return id + } + + @Transactional(rollbackFor = [Throwable::class]) + override fun delete(id: @NotNull Long, group: @NotBlank String): Long { + requireTrue(this.removeById(id)) { deleted: Boolean -> + logger.warn("Quartz job configuration deleted: $deleted") + }.orElseThrow { IllegalStateException(CharSequenceUtil.format("Failed to delete Quartz job configuration")) } + val scheduler: Scheduler = schedulerFactoryBean.scheduler + val deletedJob = scheduler.deleteJob( + getJobKey(id, group, mafProjectProperties.projectArtifactId) + ) + requireTrue(deletedJob) { deletedJob1: Boolean -> + logger.warn("Scheduler deleted job and related triggers: $deletedJob1") + }.orElseThrow { IllegalStateException("Failed to delete job by scheduler") } + return id + } +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/service/impl/QuartzJobServiceImpl.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/service/impl/QuartzJobServiceImpl.java deleted file mode 100644 index 9222623b..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/service/impl/QuartzJobServiceImpl.java +++ /dev/null @@ -1,136 +0,0 @@ -package com.jmsoftware.maf.springcloudstarter.quartz.service.impl; - -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; -import com.jmsoftware.maf.springcloudstarter.quartz.service.QuartzJobService; -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/quartz/service/impl/QuartzJobServiceImpl.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/service/impl/QuartzJobServiceImpl.kt new file mode 100644 index 00000000..60be3b06 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/service/impl/QuartzJobServiceImpl.kt @@ -0,0 +1,124 @@ +package com.jmsoftware.maf.springcloudstarter.quartz.service.impl + +import cn.hutool.core.util.StrUtil +import com.jmsoftware.maf.common.util.logger +import com.jmsoftware.maf.springcloudstarter.quartz.service.QuartzJobService +import org.quartz.* +import org.springframework.lang.Nullable +import org.springframework.scheduling.quartz.SchedulerFactoryBean +import org.springframework.stereotype.Service +import java.util.function.UnaryOperator +import javax.validation.constraints.NotBlank + +/** + * # QuartzJobServiceImpl + * + * Description: QuartzJobServiceImpl, change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/15/22 9:05 AM + * @see SpringBoot 整合 Quartz 实现分布式调度 + */ +@Service +class QuartzJobServiceImpl( + private val schedulerFactoryBean: SchedulerFactoryBean +) : QuartzJobService { + companion object { + const val JOB_DETAIL_POSTFIX = "-job-detail" + const val TRIGGER_POSTFIX = "-trigger" + private val JOB_DETAIL_NAME_OPERATOR = UnaryOperator { jobName: String -> jobName + JOB_DETAIL_POSTFIX } + private val TRIGGER_NAME_OPERATOR = UnaryOperator { jobName: String -> jobName + TRIGGER_POSTFIX } + private val log = logger() + } + + override fun addJob( + clazzName: @NotBlank String, + jobName: @NotBlank String, + groupName: @NotBlank String, + cronExp: @NotBlank String, + @Nullable param: Map? + ) { + val jobDetailName = JOB_DETAIL_NAME_OPERATOR.apply(jobName) + // Build job + val jobClass = Class.forName(clazzName).asSubclass( + Job::class.java + ) + 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() + trigger.jobDataMap.putAll(param ?: emptyMap()) + schedulerFactoryBean.scheduler.scheduleJob(jobDetail, trigger) + log.info("Added job to scheduler. jobDetailName: $jobDetailName, triggerName: $triggerName") + } + + override fun pauseJob(jobName: @NotBlank String, groupName: @NotBlank String) { + val jobDetailName = JOB_DETAIL_NAME_OPERATOR.apply(jobName) + schedulerFactoryBean.scheduler.pauseJob(JobKey.jobKey(jobDetailName, groupName)) + log.info("Paused job. jobDetailName: {}", jobDetailName) + } + + override fun resumeJob(jobName: @NotBlank String, groupName: @NotBlank String) { + val jobDetailName = JOB_DETAIL_NAME_OPERATOR.apply(jobName) + schedulerFactoryBean.scheduler.resumeJob(JobKey.jobKey(jobDetailName, groupName)) + log.info("Resumed job. jobDetailName: {}", jobDetailName) + } + + override fun runImmediately(jobName: @NotBlank String, groupName: @NotBlank String) { + val jobDetailName = JOB_DETAIL_NAME_OPERATOR.apply(jobName) + schedulerFactoryBean.scheduler.triggerJob(JobKey.jobKey(jobDetailName, groupName)) + log.info( + "Triggered the identified JobDetail (execute it now). jobDetailName: {}", + jobDetailName + ) + } + + override fun updateJob( + jobName: @NotBlank String, groupName: @NotBlank String, cronExp: @NotBlank String, + @Nullable param: Map? + ) { + val triggerName = TRIGGER_NAME_OPERATOR.apply(jobName) + val triggerKey = TriggerKey.triggerKey(triggerName, groupName) + var trigger = schedulerFactoryBean.scheduler.getTrigger(triggerKey) as CronTrigger + if (StrUtil.isNotBlank(cronExp)) { + val scheduleBuilder = CronScheduleBuilder.cronSchedule(cronExp) + trigger = trigger.triggerBuilder.withIdentity(triggerKey).withSchedule(scheduleBuilder).build() + } + trigger.jobDataMap.putAll(param ?: emptyMap()) + schedulerFactoryBean.scheduler.rescheduleJob(triggerKey, trigger) + log.info("Updated job. triggerName: {}", triggerName) + } + + override fun deleteJob(jobName: @NotBlank String, groupName: @NotBlank String) { + val triggerName = TRIGGER_NAME_OPERATOR.apply(jobName) + // Pause, Remove the trigger and the job, and then delete the job. + schedulerFactoryBean.scheduler.pauseTrigger(TriggerKey.triggerKey(jobName, groupName)) + schedulerFactoryBean.scheduler.unscheduleJob(TriggerKey.triggerKey(jobName, groupName)) + schedulerFactoryBean.scheduler.deleteJob(JobKey.jobKey(jobName, groupName)) + log.info("Updated job. triggerName: {}", triggerName) + } + + override fun startAllJobs() { + schedulerFactoryBean.start() + log.info("Started jobs.") + } + + override fun pauseAllJobs() { + schedulerFactoryBean.scheduler.pauseAll() + log.info("Paused all jobs.") + } + + override fun resumeAllJobs() { + schedulerFactoryBean.scheduler.resumeAll() + log.info("Resumed all jobs.") + } + + override fun shutdownAllJobs() { + throw IllegalCallerException("Not supported operation!") + } +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/util/CronUtil.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/util/CronUtil.java deleted file mode 100644 index ef79ea61..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/util/CronUtil.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.jmsoftware.maf.springcloudstarter.quartz.util; - -import org.quartz.CronExpression; - -import java.text.ParseException; -import java.util.Date; - -/** - * CronUtil - * - * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 9/24/2021 3:52 PM - */ -public class CronUtil { - private CronUtil() { - } - - /** - * Is valid boolean. - * - * @param cronExpression the cron expression - * @return the boolean - */ - public static boolean isValid(String cronExpression) { - return CronExpression.isValidExpression(cronExpression); - } - - /** - * Gets invalid message. - * - * @param cronExpression the cron expression - * @return the invalid message - */ - public static String getInvalidMessage(String cronExpression) { - try { - new CronExpression(cronExpression); - return null; - } catch (ParseException pe) { - return pe.getMessage(); - } - } - - /** - * Gets next execution. - * - * @param cronExpression the cron expression - * @return the next execution - */ - public static Date getNextExecution(String cronExpression) { - try { - CronExpression cron = new CronExpression(cronExpression); - return cron.getNextValidTimeAfter(new Date(System.currentTimeMillis())); - } catch (ParseException e) { - throw new IllegalArgumentException(e.getMessage()); - } - } -} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/util/CronUtil.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/util/CronUtil.kt new file mode 100644 index 00000000..dd8f07f9 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/util/CronUtil.kt @@ -0,0 +1,45 @@ +package com.jmsoftware.maf.springcloudstarter.quartz.util + +import org.quartz.CronExpression +import java.text.ParseException +import java.util.* + +/** + * Is valid boolean. + * + * @param cronExpression the cron expression + * @return the boolean + */ +fun validateCronExp(cronExpression: String): Boolean { + return CronExpression.isValidExpression(cronExpression) +} + +/** + * Gets invalid message. + * + * @param cronExpression the cron expression + * @return the invalid message + */ +fun getInvalidMessage(cronExpression: String): String? { + return try { + CronExpression(cronExpression) + null + } catch (pe: ParseException) { + pe.message + } +} + +/** + * Gets next execution. + * + * @param cronExpression the cron expression + * @return the next execution + */ +fun getNextExecution(cronExpression: String): Date { + return try { + val cron = CronExpression(cronExpression) + cron.getNextValidTimeAfter(Date(System.currentTimeMillis())) + } catch (e: ParseException) { + throw IllegalArgumentException(e.message) + } +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/util/QuartzJobInvocationUtil.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/util/QuartzJobInvocationUtil.java deleted file mode 100644 index e3d47c5b..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/util/QuartzJobInvocationUtil.java +++ /dev/null @@ -1,175 +0,0 @@ -package com.jmsoftware.maf.springcloudstarter.quartz.util; - -import cn.hutool.core.annotation.AnnotationUtil; -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.ReflectUtil; -import cn.hutool.core.util.StrUtil; -import cn.hutool.extra.spring.SpringUtil; -import com.jmsoftware.maf.springcloudstarter.quartz.annotation.QuartzSchedulable; -import com.jmsoftware.maf.springcloudstarter.quartz.entity.persistence.QuartzJobConfiguration; -import lombok.SneakyThrows; -import lombok.val; -import org.springframework.util.StringUtils; - -import java.util.Collections; -import java.util.LinkedList; -import java.util.List; - -/** - * The type Quartz job invocation util. - * - * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 9/24/2021 11:56 AM - */ -@SuppressWarnings("unused") -public class QuartzJobInvocationUtil { - private QuartzJobInvocationUtil() { - } - - /** - * Invoke method. - * - * @param quartzJobConfiguration the quartz job configuration - */ - @SneakyThrows - public static void invokeMethod(QuartzJobConfiguration quartzJobConfiguration) { - val invokeTarget = quartzJobConfiguration.getInvokeTarget(); - val beanName = getBeanName(invokeTarget); - val methodName = getMethodName(invokeTarget); - val methodParams = getMethodParams(invokeTarget); - - Object bean; - if (!isValidClassName(beanName)) { - bean = SpringUtil.getBean(beanName); - } else { - bean = Class.forName(beanName).getDeclaredConstructor().newInstance(); - } - invokeMethod(bean, methodName, methodParams); - } - - /** - * Invoke method. - * - * @param bean the bean - * @param methodName the method name - * @param methodParams the method params - * @throws SecurityException the security exception - * @throws IllegalArgumentException the illegal argument exception - */ - private static void invokeMethod(Object bean, String methodName, List methodParams) { - val method = ReflectUtil.getMethodByName(bean.getClass(), methodName); - if (!AnnotationUtil.hasAnnotation(method, QuartzSchedulable.class)) { - throw new IllegalStateException( - "The method is not quartz-schedulable. Unable to invoke the method: " + method); - } - if (CollUtil.isNotEmpty(methodParams)) { - ReflectUtil.invoke(bean, methodName, methodParams.toArray()); - } else { - ReflectUtil.invoke(bean, methodName); - } - } - - /** - * Is valid class name boolean. - * - * @param invokeTarget the invoke target - * @return the boolean - */ - public static boolean isValidClassName(String invokeTarget) { - return StringUtils.countOccurrencesOf(invokeTarget, ".") > 1; - } - - /** - * Gets bean name. - * - * @param invokeTarget the invoke target - * @return the bean name - */ - public static String getBeanName(String invokeTarget) { - val beanName = StrUtil.subBefore(invokeTarget, "(", false); - return StrUtil.subBefore(beanName, ".", false); - } - - /** - * Gets method name. - * - * @param invokeTarget the invoke target - * @return the method name - */ - public static String getMethodName(String invokeTarget) { - val methodName = StrUtil.subBefore(invokeTarget, "(", false); - return StrUtil.subAfter(methodName, ".", false); - } - - /** - * Gets method params. - * - * @param invokeTarget the invoke target - * @return the method params - */ - public static List getMethodParams(String invokeTarget) { - val methodStr = StrUtil.subBetween(invokeTarget, "(", ")"); - if (StrUtil.isBlank(methodStr)) { - return Collections.emptyList(); - } - val methodParamArray = methodStr.split(","); - val paramList = new LinkedList(); - for (val s : methodParamArray) { - val trimmedParam = StrUtil.trimToEmpty(s); - // String type - if (StrUtil.contains(trimmedParam, "'")) { - paramList.add(new Object[]{StrUtil.replace(trimmedParam, "'", ""), String.class}); - } - // Boolean type - else if (StrUtil.equals(trimmedParam, "true") || StrUtil.equals(trimmedParam, "false")) { - paramList.add(new Object[]{Boolean.valueOf(trimmedParam), Boolean.class}); - } - // Long type - else if (StrUtil.contains(trimmedParam, "L")) { - paramList.add( - new Object[]{Long.valueOf(StrUtil.subPre(trimmedParam, trimmedParam.length())), Long.class}); - } - // Double type - else if (StrUtil.contains(trimmedParam, "D")) { - paramList.add(new Object[]{Double.valueOf( - StrUtil.subPre(trimmedParam, trimmedParam.length())), Double.class}); - } - // Integer type - else { - paramList.add(new Object[]{Integer.valueOf(trimmedParam), Integer.class}); - } - } - return paramList; - } - - /** - * Get method params type class [ ]. - * - * @param methodParams the method params - * @return the class [ ] - */ - public static Class[] getMethodParamsType(List methodParams) { - val clazz = new Class[methodParams.size()]; - var index = 0; - for (val os : methodParams) { - clazz[index] = (Class) os[1]; - index++; - } - return clazz; - } - - /** - * Get method params value object [ ]. - * - * @param methodParams the method params - * @return the object [ ] - */ - public static Object[] getMethodParamsValue(List methodParams) { - val clazz = new Object[methodParams.size()]; - var index = 0; - for (val os : methodParams) { - clazz[index] = os[0]; - index++; - } - return clazz; - } -} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/util/QuartzJobInvocationUtil.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/util/QuartzJobInvocationUtil.kt new file mode 100644 index 00000000..273c80cf --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/util/QuartzJobInvocationUtil.kt @@ -0,0 +1,150 @@ +package com.jmsoftware.maf.springcloudstarter.quartz.util + +import cn.hutool.core.collection.CollUtil +import cn.hutool.core.util.ReflectUtil +import cn.hutool.core.util.StrUtil +import cn.hutool.extra.spring.SpringUtil +import com.jmsoftware.maf.common.util.logger +import com.jmsoftware.maf.springcloudstarter.function.lazyDebug +import com.jmsoftware.maf.springcloudstarter.function.requireTrue +import com.jmsoftware.maf.springcloudstarter.quartz.annotation.QuartzSchedulable +import com.jmsoftware.maf.springcloudstarter.quartz.entity.persistence.QuartzJobConfiguration +import com.jmsoftware.maf.springcloudstarter.quartz.util.QuartzJobInvocationUtil.log +import org.springframework.util.StringUtils +import java.util.* + +/** + * The type Quartz job invocation util. + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 9/24/2021 11:56 AM + */ +internal object QuartzJobInvocationUtil { + val log = logger() +} + +/** + * Invoke method. + * + * @param quartzJobConfiguration the quartz job configuration + */ +fun invokeMethod(quartzJobConfiguration: QuartzJobConfiguration) { + val invokeTarget = quartzJobConfiguration.invokeTarget + val beanName = getBeanName(invokeTarget) + val methodName = getMethodName(invokeTarget) + val methodParams = getMethodParams(invokeTarget!!) + if (!isValidClassName(beanName)) { + lazyDebug(log) { "Getting the bean from Spring IoC container by bean name: `$beanName`" } + SpringUtil.getBean(beanName) + } else { + lazyDebug(log) { "Initialize a new object by class name: `$beanName`" } + Class.forName(beanName).getDeclaredConstructor().newInstance() + }.let { + lazyDebug(log) { "Found the bean (`$beanName`) from Spring IoC container, $it" } + invokeMethod(it, methodName, methodParams) + } +} + +/** + * Invoke method. + * + * @param bean the bean + * @param methodName the method name + * @param methodParams the method params + * @throws SecurityException the security exception + * @throws IllegalArgumentException the illegal argument exception + */ +private fun invokeMethod( + bean: Any, + methodName: String, + methodParams: List> +) { + val method = ReflectUtil.getMethodByName(bean.javaClass, methodName) + lazyDebug(log) { "Got method by reflection: $method, params: $methodParams" } + val quartzSchedulable = method.getAnnotation(QuartzSchedulable::class.java) + requireTrue(quartzSchedulable != null) { annotated: Boolean -> + lazyDebug(log) { "The method is annotated by `@QuartzSchedulable`: $annotated" } + }.orElseThrow { IllegalAccessError("The method is NOT quartz-schedulable. Unable to invoke the method: $method") } + if (CollUtil.isNotEmpty(methodParams)) { + lazyDebug(log) { "Invoking method: $method, with params: $methodParams" } + ReflectUtil.invoke(bean, methodName, *methodParams.toTypedArray()) + } else { + lazyDebug(log) { "Invoking method: $method, WITHOUT params" } + ReflectUtil.invoke(bean, methodName) + } +} + +/** + * Is valid class name boolean. + * + * @param invokeTarget the invoke target + * @return the boolean + */ +fun isValidClassName(invokeTarget: String): Boolean { + return StringUtils.countOccurrencesOf(invokeTarget, ".") > 1 +} + +/** + * Gets bean name. For example: + * * `greetingBean.hello()` + * * `com.jmsoftware.maf.springcloudstarter.quartz.GreetingBean.hello()` + * + * @param invokeTarget the invoke target + * @return the bean name + */ +fun getBeanName(invokeTarget: String?): String { + val beanName = StrUtil.subBefore(invokeTarget, "(", false) + return StrUtil.subBefore(beanName, ".", false) +} + +/** + * Gets method name. + * + * @param invokeTarget the invoke target + * @return the method name + */ +fun getMethodName(invokeTarget: String?): String { + val methodName = StrUtil.subBefore(invokeTarget, "(", false) + return StrUtil.subAfter(methodName, ".", false) +} + +/** + * Gets method params. + * + * @param invokeTarget the invoke target + * @return the method params + */ +fun getMethodParams(invokeTarget: String): List> { + val methodStr = StrUtil.subBetween(invokeTarget, "(", ")") + if (StrUtil.isBlank(methodStr)) { + return emptyList() + } + val methodParamArray = methodStr.split(",".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray() + val paramList = LinkedList>() + for (s in methodParamArray) { + val trimmedParam = StrUtil.trimToEmpty(s) + // String type + if (StrUtil.contains(trimmedParam, "'")) { + paramList.add(arrayOf(StrUtil.replace(trimmedParam, "'", ""), String::class.java)) + } else if (StrUtil.equals(trimmedParam, "true") || StrUtil.equals(trimmedParam, "false")) { + paramList.add(arrayOf(java.lang.Boolean.valueOf(trimmedParam), Boolean::class.java)) + } else if (StrUtil.contains(trimmedParam, "L")) { + paramList.add( + arrayOf( + java.lang.Long.valueOf(StrUtil.subPre(trimmedParam, trimmedParam.length)), + Long::class.java + ) + ) + } else if (StrUtil.contains(trimmedParam, "D")) { + paramList.add( + arrayOf( + java.lang.Double.valueOf( + StrUtil.subPre(trimmedParam, trimmedParam.length) + ), Double::class.java + ) + ) + } else { + paramList.add(arrayOf(Integer.valueOf(trimmedParam), Int::class.java)) + } + } + return paramList +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/util/ScheduleUtil.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/util/ScheduleUtil.java deleted file mode 100644 index 38db24fd..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/util/ScheduleUtil.java +++ /dev/null @@ -1,144 +0,0 @@ -package com.jmsoftware.maf.springcloudstarter.quartz.util; - -import cn.hutool.core.util.StrUtil; -import com.jmsoftware.maf.springcloudstarter.quartz.constant.Concurrent; -import com.jmsoftware.maf.springcloudstarter.quartz.constant.MisfirePolicy; -import com.jmsoftware.maf.springcloudstarter.quartz.constant.QuartzJobStatus; -import com.jmsoftware.maf.springcloudstarter.quartz.entity.persistence.QuartzJobConfiguration; -import com.jmsoftware.maf.springcloudstarter.quartz.job.QuartzDisallowConcurrentExecution; -import com.jmsoftware.maf.springcloudstarter.quartz.job.QuartzJobExecution; -import lombok.NonNull; -import lombok.extern.slf4j.Slf4j; -import lombok.val; -import org.quartz.*; - -import java.util.Optional; -import java.util.function.BiFunction; - -import static com.jmsoftware.maf.springcloudstarter.quartz.constant.ScheduleConstant.QUARTZ_JOB_CONFIGURATION; - -/** - * The type Schedule util. - * - * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 9/24/2021 10:20 AM - */ -@Slf4j -public class ScheduleUtil { - public static final String JOB_DETAIL_POSTFIX = "-job-detail"; - public static final String TRIGGER_POSTFIX = "-trigger"; - public static final BiFunction JOB_DETAIL_NAME_OPERATOR = - (jobId, serviceName) -> String.format("%s#%d%s", serviceName, jobId, JOB_DETAIL_POSTFIX); - public static final BiFunction TRIGGER_NAME_OPERATOR = - (jobId, serviceName) -> String.format("%s#%d%s", serviceName, jobId, TRIGGER_POSTFIX); - - private ScheduleUtil() { - } - - /** - * Gets quartz job class. - * - * @param quartzJobConfiguration the sys job - * @return the quartz job class - */ - private static Class getQuartzJobClass(@NonNull QuartzJobConfiguration quartzJobConfiguration) { - val concurrent = Concurrent.CONCURRENT.getValue().equals(quartzJobConfiguration.getConcurrent()); - return concurrent ? QuartzJobExecution.class : QuartzDisallowConcurrentExecution.class; - } - - /** - * Gets job key. - * - * @param jobId the job id - * @param jobGroup the job group - * @return the job key - */ - public static JobKey getJobKey(@NonNull Long jobId, @NonNull String jobGroup, @NonNull String serviceName) { - return JobKey.jobKey(JOB_DETAIL_NAME_OPERATOR.apply(jobId, serviceName), jobGroup); - } - - /** - * Gets trigger key. - * - * @param jobId the job id - * @param jobGroup the job group - * @return the trigger key - */ - public static TriggerKey getTriggerKey(@NonNull Long jobId, @NonNull String jobGroup, @NonNull String serviceName) { - return TriggerKey.triggerKey(TRIGGER_NAME_OPERATOR.apply(jobId, serviceName), jobGroup); - } - - /** - * Create schedule job. - * - * @param scheduler the scheduler - * @param quartzJobConfiguration the quartz job configuration - * @throws SchedulerException the scheduler exception - */ - public static JobDetail createScheduleJob( - @NonNull Scheduler scheduler, - @NonNull QuartzJobConfiguration quartzJobConfiguration, - @NonNull String serviceName - ) throws SchedulerException { - if (!StrUtil.equals(quartzJobConfiguration.getServiceName(), serviceName)) { - log.warn("The service name is not equal to quartzJobConfiguration's serviceName. serviceName: {}, {}", - serviceName, quartzJobConfiguration); - return null; - } - val jobClass = getQuartzJobClass(quartzJobConfiguration); - val jobId = quartzJobConfiguration.getId(); - val jobGroup = quartzJobConfiguration.getGroup(); - val jobDetail = JobBuilder - .newJob(jobClass) - .withIdentity(getJobKey(jobId, jobGroup, serviceName)) - .withDescription(quartzJobConfiguration.getDescription()) - .build(); - jobDetail.getJobDataMap().put(QUARTZ_JOB_CONFIGURATION, quartzJobConfiguration); - val cronScheduleBuilder = handleCronScheduleMisfirePolicy( - quartzJobConfiguration, - CronScheduleBuilder.cronSchedule(quartzJobConfiguration.getCronExpression()) - ); - val trigger = TriggerBuilder - .newTrigger() - .withIdentity(getTriggerKey(jobId, jobGroup, serviceName)) - .withSchedule(cronScheduleBuilder) - .build(); - if (scheduler.checkExists(getJobKey(jobId, jobGroup, serviceName))) { - scheduler.deleteJob(getJobKey(jobId, jobGroup, serviceName)); - } - scheduler.scheduleJob(jobDetail, trigger); - if (QuartzJobStatus.PAUSE.getValue().equals(quartzJobConfiguration.getStatus())) { - scheduler.pauseJob(ScheduleUtil.getJobKey(jobId, jobGroup, serviceName)); - } - return jobDetail; - } - - /** - * Handle cron schedule misfire policy cron schedule builder. - * - * @param quartzJobConfiguration the quartz job configuration - * @param cronScheduleBuilder the cron schedule builder - * @return the cron schedule builder - */ - public static CronScheduleBuilder handleCronScheduleMisfirePolicy( - @NonNull QuartzJobConfiguration quartzJobConfiguration, - @NonNull CronScheduleBuilder cronScheduleBuilder - ) { - val misfirePolicy = Optional - .ofNullable(MisfirePolicy.getByValue(quartzJobConfiguration.getMisfirePolicy())) - .orElseThrow(); - switch (misfirePolicy) { - case MISFIRE_INSTRUCTION_SMART_POLICY: - return cronScheduleBuilder; - case MISFIRE_INSTRUCTION_IGNORE_MISFIRE_POLICY: - return cronScheduleBuilder.withMisfireHandlingInstructionIgnoreMisfires(); - case MISFIRE_INSTRUCTION_FIRE_ONCE_NOW: - return cronScheduleBuilder.withMisfireHandlingInstructionFireAndProceed(); - case MISFIRE_INSTRUCTION_DO_NOTHING: - return cronScheduleBuilder.withMisfireHandlingInstructionDoNothing(); - default: - throw new IllegalArgumentException( - String.format("The task misfire policy '%s' cannot be used in cron schedule tasks", - quartzJobConfiguration.getMisfirePolicy())); - } - } -} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/util/ScheduleUtil.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/util/ScheduleUtil.kt new file mode 100644 index 00000000..fbdb2725 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/quartz/util/ScheduleUtil.kt @@ -0,0 +1,146 @@ +package com.jmsoftware.maf.springcloudstarter.quartz.util + +import cn.hutool.core.util.StrUtil +import com.jmsoftware.maf.common.util.logger +import com.jmsoftware.maf.springcloudstarter.quartz.constant.Concurrent +import com.jmsoftware.maf.springcloudstarter.quartz.constant.MisfirePolicy +import com.jmsoftware.maf.springcloudstarter.quartz.constant.MisfirePolicy.* +import com.jmsoftware.maf.springcloudstarter.quartz.constant.QUARTZ_JOB_CONFIGURATION +import com.jmsoftware.maf.springcloudstarter.quartz.constant.QuartzJobStatus +import com.jmsoftware.maf.springcloudstarter.quartz.entity.persistence.QuartzJobConfiguration +import com.jmsoftware.maf.springcloudstarter.quartz.job.QuartzDisallowConcurrentExecution +import com.jmsoftware.maf.springcloudstarter.quartz.job.QuartzJobExecution +import com.jmsoftware.maf.springcloudstarter.quartz.util.ScheduleUtil.JOB_DETAIL_NAME_OPERATOR +import com.jmsoftware.maf.springcloudstarter.quartz.util.ScheduleUtil.TRIGGER_NAME_OPERATOR +import com.jmsoftware.maf.springcloudstarter.quartz.util.ScheduleUtil.log +import org.quartz.* +import java.util.* +import java.util.function.BiFunction + +/** + * # ScheduleUtil + * + * The type Schedule util. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/15/22 5:14 PM + */ +private object ScheduleUtil { + val log = logger() + private const val JOB_DETAIL_POSTFIX = "-job-detail" + private const val TRIGGER_POSTFIX = "-trigger" + val JOB_DETAIL_NAME_OPERATOR = BiFunction { jobId: Long, serviceName: String -> + "$serviceName#$jobId$JOB_DETAIL_POSTFIX" + } + val TRIGGER_NAME_OPERATOR = BiFunction { jobId: Long, serviceName: String -> + "$serviceName#$jobId$TRIGGER_POSTFIX" + } +} + +/** + * Gets quartz job class. + * + * @param quartzJobConfiguration the sys job + * @return the quartz job class + */ +private fun getQuartzJobClass( + quartzJobConfiguration: QuartzJobConfiguration +): Class { + val concurrent = Concurrent.CONCURRENT.value == quartzJobConfiguration.concurrent + return if (concurrent) QuartzJobExecution::class.java else QuartzDisallowConcurrentExecution::class.java +} + +/** + * Gets job key. + * + * @param jobId the job id + * @param jobGroup the job group + * @return the job key + */ +fun getJobKey( + jobId: Long, + jobGroup: String, + serviceName: String +): JobKey { + return JobKey.jobKey(JOB_DETAIL_NAME_OPERATOR.apply(jobId, serviceName), jobGroup) +} + +/** + * Gets trigger key. + * + * @param jobId the job id + * @param jobGroup the job group + * @return the trigger key + */ +private fun getTriggerKey( + jobId: Long, + jobGroup: String, + serviceName: String +): TriggerKey { + return TriggerKey.triggerKey(TRIGGER_NAME_OPERATOR.apply(jobId, serviceName), jobGroup) +} + +/** + * Create schedule job. + * + * @param scheduler the scheduler + * @param quartzJobConfiguration the quartz job configuration + * @throws SchedulerException the scheduler exception + */ +fun createScheduleJob( + scheduler: Scheduler, + quartzJobConfiguration: QuartzJobConfiguration, + serviceName: String +): JobDetail? { + if (!StrUtil.equals(quartzJobConfiguration.serviceName, serviceName)) { + log.warn("The service name is not equal to quartzJobConfiguration's serviceName. serviceName: $serviceName, $quartzJobConfiguration") + return null + } + val jobClass = getQuartzJobClass(quartzJobConfiguration) + val jobId = quartzJobConfiguration.id + val jobGroup = quartzJobConfiguration.group + val jobDetail = JobBuilder + .newJob(jobClass) + .withIdentity(getJobKey(jobId!!, jobGroup!!, serviceName)) + .withDescription(quartzJobConfiguration.description) + .build() + jobDetail.jobDataMap[QUARTZ_JOB_CONFIGURATION] = quartzJobConfiguration + val cronScheduleBuilder = handleCronScheduleMisfirePolicy( + quartzJobConfiguration, + CronScheduleBuilder.cronSchedule(quartzJobConfiguration.cronExpression) + ) + val trigger = TriggerBuilder + .newTrigger() + .withIdentity(getTriggerKey(jobId, jobGroup, serviceName)) + .withSchedule(cronScheduleBuilder) + .build() + if (scheduler.checkExists(getJobKey(jobId, jobGroup, serviceName))) { + scheduler.deleteJob(getJobKey(jobId, jobGroup, serviceName)) + } + scheduler.scheduleJob(jobDetail, trigger) + if (QuartzJobStatus.PAUSE.value == quartzJobConfiguration.status) { + scheduler.pauseJob(getJobKey(jobId, jobGroup, serviceName)) + } + return jobDetail +} + +/** + * Handle cron schedule misfire policy cron schedule builder. + * + * @param quartzJobConfiguration the quartz job configuration + * @param cronScheduleBuilder the cron schedule builder + * @return the cron schedule builder + */ +private fun handleCronScheduleMisfirePolicy( + quartzJobConfiguration: QuartzJobConfiguration, + cronScheduleBuilder: CronScheduleBuilder +): CronScheduleBuilder { + val misfirePolicy: MisfirePolicy = + Optional.ofNullable(MisfirePolicy.getByValue(quartzJobConfiguration.misfirePolicy!!)) + .orElseThrow { IllegalArgumentException("MisfirePolicy not exists! Value: ${quartzJobConfiguration.misfirePolicy}") } + return when (misfirePolicy) { + MISFIRE_INSTRUCTION_SMART_POLICY -> cronScheduleBuilder + MISFIRE_INSTRUCTION_IGNORE_MISFIRE_POLICY -> cronScheduleBuilder.withMisfireHandlingInstructionIgnoreMisfires() + MISFIRE_INSTRUCTION_FIRE_ONCE_NOW -> cronScheduleBuilder.withMisfireHandlingInstructionFireAndProceed() + MISFIRE_INSTRUCTION_DO_NOTHING -> cronScheduleBuilder.withMisfireHandlingInstructionDoNothing() + } +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/rabbitmq/DelayedMessageConfiguration.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/rabbitmq/DelayedMessageConfiguration.java deleted file mode 100644 index 6d31cf52..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/rabbitmq/DelayedMessageConfiguration.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.jmsoftware.maf.springcloudstarter.rabbitmq; - -import com.google.common.collect.Maps; -import lombok.extern.slf4j.Slf4j; -import lombok.val; -import org.springframework.amqp.core.*; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.context.annotation.Bean; - -/** - *

DelayedMessageConfiguration

- *

- * Change description here. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com, 10/2/21 12:03 PM - * @see - * Scheduling Messages with RabbitMQ - * @see RabbitMQ Delayed Message Plugin - * @see Community Plugins - **/ -@Slf4j -public class DelayedMessageConfiguration { - public static final String DELAYED_MESSAGE_QUEUE_NAME = "delayed-message.queue"; - public static final String DELAYED_MESSAGE_EXCHANGE_NAME = "delayed-message.exchange"; - public static final String DELAYED_MESSAGE_ROUTING_KEY = "delayed-message.routing-key"; - - /** - * Delayed message queue, which is durable, non-exclusive and non auto-delete. - * - * @return the delayed message queue - */ - @Bean - public Queue delayedMessageQueue() { - val delayedMessageQueue = QueueBuilder.durable(DELAYED_MESSAGE_QUEUE_NAME).build(); - log.warn("Built delayed message queue: {}", delayedMessageQueue); - return delayedMessageQueue; - } - - /** - * Delayed message exchange custom exchange. - * - * @return the custom exchange - */ - @Bean - public Exchange delayedMessageExchange() { - val arguments = Maps.newHashMap(); - // To use the Delayed Message Exchange you just need to declare an exchange providing - // the "x-delayed-message" exchange type as follows - arguments.put("x-delayed-type", "direct"); - val delayedMessageExchange = ExchangeBuilder - .directExchange(DELAYED_MESSAGE_EXCHANGE_NAME) - .delayed() - .withArguments(arguments) - .build(); - log.warn("Built delayed message exchange: {}", delayedMessageExchange); - return delayedMessageExchange; - } - - /** - * Delayed message binding. - * - * @param delayedMessageQueue the delayed message queue - * @param delayedMessageExchange the delayed message exchange - * @return the binding - */ - @Bean - public Binding delayedMessageBinding(@Qualifier("delayedMessageQueue") Queue delayedMessageQueue, - @Qualifier("delayedMessageExchange") Exchange delayedMessageExchange) { - val binding = BindingBuilder - .bind(delayedMessageQueue) - .to(delayedMessageExchange) - .with(DELAYED_MESSAGE_ROUTING_KEY) - .noargs(); - log.warn("Built delayed message binding: {}", binding); - return binding; - } -} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/rabbitmq/DelayedMessageConfiguration.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/rabbitmq/DelayedMessageConfiguration.kt new file mode 100644 index 00000000..8a30e7c0 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/rabbitmq/DelayedMessageConfiguration.kt @@ -0,0 +1,78 @@ +package com.jmsoftware.maf.springcloudstarter.rabbitmq + +import com.jmsoftware.maf.common.util.logger +import org.springframework.amqp.core.* +import org.springframework.beans.factory.annotation.Qualifier +import org.springframework.context.annotation.Bean + +/** + * # DelayedMessageConfiguration + * + * Change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/15/22 8:12 PM + * @see Scheduling Messages with RabbitMQ + * @see RabbitMQ Delayed Message Plugin + * @see Community Plugins + */ +class DelayedMessageConfiguration { + companion object { + const val DELAYED_MESSAGE_QUEUE_NAME = "delayed-message.queue" + const val DELAYED_MESSAGE_EXCHANGE_NAME = "delayed-message.exchange" + const val DELAYED_MESSAGE_ROUTING_KEY = "delayed-message.routing-key" + private val log = logger() + } + + /** + * Delayed message queue, which is durable, non-exclusive and non auto-delete. + * + * @return the delayed message queue + */ + @Bean + fun delayedMessageQueue(): Queue { + return QueueBuilder + .durable(DELAYED_MESSAGE_QUEUE_NAME) + .build().apply { + log.warn("Built delayed message queue: $this") + } + } + + /** + * Delayed message exchange custom exchange. + * + * @return the custom exchange + */ + @Bean + fun delayedMessageExchange(): Exchange { + return ExchangeBuilder + .directExchange(DELAYED_MESSAGE_EXCHANGE_NAME) + .delayed() + // To use the Delayed Message Exchange you just need to declare an exchange providing + // the "x-delayed-message" exchange type as follows + .withArguments(mapOf("x-delayed-type" to "direct")) + .build().apply { + log.warn("Built delayed message exchange: $this") + } + } + + /** + * Delayed message binding. + * + * @param delayedMessageQueue the delayed message queue + * @param delayedMessageExchange the delayed message exchange + * @return the binding + */ + @Bean + fun delayedMessageBinding( + @Qualifier("delayedMessageQueue") delayedMessageQueue: Queue?, + @Qualifier("delayedMessageExchange") delayedMessageExchange: Exchange? + ): Binding { + return BindingBuilder + .bind(delayedMessageQueue) + .to(delayedMessageExchange) + .with(DELAYED_MESSAGE_ROUTING_KEY) + .noargs().apply { + log.warn("Built delayed message binding: $this") + } + } +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/rabbitmq/RabbitmqConfiguration.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/rabbitmq/RabbitmqConfiguration.java deleted file mode 100644 index 4cc49048..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/rabbitmq/RabbitmqConfiguration.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.jmsoftware.maf.springcloudstarter.rabbitmq; - -import lombok.extern.slf4j.Slf4j; -import lombok.val; -import org.springframework.amqp.core.TopicExchange; -import org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory; -import org.springframework.amqp.rabbit.connection.ConnectionFactory; -import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter; -import org.springframework.amqp.support.converter.MessageConverter; -import org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration; -import org.springframework.boot.autoconfigure.amqp.RabbitProperties; -import org.springframework.boot.autoconfigure.amqp.SimpleRabbitListenerContainerFactoryConfigurer; -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Import; -import org.springframework.context.annotation.Primary; - -/** - * Description: RabbitmqConfiguration, change description here. - * - * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 3/9/2021 11:31 AM - * @see RabbitAutoConfiguration - * @see Messaging with RabbitMQ - * @see - * Sending and receiving JSON messages with Spring Boot AMQP and RabbitMQ - **/ -@Slf4j -@ConditionalOnClass({TopicExchange.class}) -@Import({DelayedMessageConfiguration.class}) -public class RabbitmqConfiguration { - @Bean - public MessageConverter messageConverter() { - return new Jackson2JsonMessageConverter(); - } - - /** - * Rabbit listener container factory. - * - * @param rabbitProperties the rabbit properties - * @param configurer the configurer - * @param connectionFactory the connection factory - * @return the simple rabbit listener container factory - * @see RabbitAnnotationDrivenConfiguration#directRabbitListenerContainerFactory(org.springframework.boot.autoconfigure.amqp.DirectRabbitListenerContainerFactoryConfigurer, org.springframework.amqp.rabbit.connection.ConnectionFactory) - */ - @Primary - @Bean(name = "rabbitListenerContainerFactory") - public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory( - RabbitProperties rabbitProperties, - SimpleRabbitListenerContainerFactoryConfigurer configurer, - ConnectionFactory connectionFactory - ) { - val simpleContainer = rabbitProperties.getListener().getSimple(); - simpleContainer.setConcurrency(2); - simpleContainer.setMaxConcurrency(4); - log.warn( - "Overriding `rabbitListenerContainerFactory` with custom configuration, concurrency: {}, " - + "maxConcurrency: {}", simpleContainer.getConcurrency(), simpleContainer.getMaxConcurrency() - ); - val factory = new SimpleRabbitListenerContainerFactory(); - factory.setConnectionFactory(connectionFactory); - factory.setConcurrentConsumers(2); - factory.setMaxConcurrentConsumers(4); - configurer.configure(factory, connectionFactory); - return factory; - } -} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/rabbitmq/RabbitmqConfiguration.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/rabbitmq/RabbitmqConfiguration.kt new file mode 100644 index 00000000..69b25164 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/rabbitmq/RabbitmqConfiguration.kt @@ -0,0 +1,69 @@ +package com.jmsoftware.maf.springcloudstarter.rabbitmq + +import com.jmsoftware.maf.common.util.logger +import com.jmsoftware.maf.springcloudstarter.rabbitmq.DelayedMessageConfiguration +import org.springframework.amqp.core.TopicExchange +import org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory +import org.springframework.amqp.rabbit.connection.ConnectionFactory +import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter +import org.springframework.amqp.support.converter.MessageConverter +import org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration +import org.springframework.boot.autoconfigure.amqp.RabbitProperties +import org.springframework.boot.autoconfigure.amqp.SimpleRabbitListenerContainerFactoryConfigurer +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass +import org.springframework.context.annotation.Bean +import org.springframework.context.annotation.Import +import org.springframework.context.annotation.Primary + +/** + * # RabbitmqConfiguration + * + * Description: RabbitmqConfiguration, change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/15/22 8:14 PM + * @see RabbitAutoConfiguration + * @see Messaging with RabbitMQ + * @see Sending and receiving JSON messages with Spring Boot AMQP and RabbitMQ + */ +@ConditionalOnClass(TopicExchange::class) +@Import( + DelayedMessageConfiguration::class +) +class RabbitmqConfiguration { + companion object { + private val log = logger() + } + + @Bean + fun messageConverter(): MessageConverter { + return Jackson2JsonMessageConverter() + } + + /** + * Rabbit listener container factory. + * + * @param rabbitProperties the rabbit properties + * @param configurer the configurer + * @param connectionFactory the connection factory + * @return the simple rabbit listener container factory + * @see RabbitAnnotationDrivenConfiguration.directRabbitListenerContainerFactory + */ + @Primary + @Bean(name = ["rabbitListenerContainerFactory"]) + fun rabbitListenerContainerFactory( + rabbitProperties: RabbitProperties, + configurer: SimpleRabbitListenerContainerFactoryConfigurer, + connectionFactory: ConnectionFactory + ): SimpleRabbitListenerContainerFactory { + val simpleContainer = rabbitProperties.listener.simple + simpleContainer.concurrency = 2 + simpleContainer.maxConcurrency = 4 + log.warn("Overriding `rabbitListenerContainerFactory` with custom configuration, concurrency: ${simpleContainer.concurrency}, maxConcurrency: ${simpleContainer.maxConcurrency}") + val factory = SimpleRabbitListenerContainerFactory() + factory.setConnectionFactory(connectionFactory) + factory.setConcurrentConsumers(2) + factory.setMaxConcurrentConsumers(4) + configurer.configure(factory, connectionFactory) + return factory + } +} 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 deleted file mode 100644 index 22844a1a..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/redis/RedisCachingConfiguration.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.jmsoftware.maf.springcloudstarter.redis; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import lombok.val; -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -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.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 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 -@EnableCaching -@RequiredArgsConstructor -@ConditionalOnClass({RedisConnectionFactory.class}) -public class RedisCachingConfiguration extends CachingConfigurerSupport { - private final RedisConnectionFactory redisConnectionFactory; - - @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/RedisCachingConfiguration.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/redis/RedisCachingConfiguration.kt new file mode 100644 index 00000000..662321aa --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/redis/RedisCachingConfiguration.kt @@ -0,0 +1,74 @@ +package com.jmsoftware.maf.springcloudstarter.redis + +import com.jmsoftware.maf.common.util.logger +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass +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.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 java.lang.reflect.Method + +/** + * # RedisCachingConfiguration + * + * Description: RedisCachingConfiguration, change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/15/22 9:08 PM + * @see Spring boot 之 spring-boot-starter-cache (整合 Redis) + */ +@EnableCaching +@ConditionalOnClass(RedisConnectionFactory::class) +class RedisCachingConfiguration( + private val redisConnectionFactory: RedisConnectionFactory +) : CachingConfigurerSupport() { + companion object { + private val log = logger() + } + + override fun cacheManager(): CacheManager { + return RedisCacheManager + .builder(redisConnectionFactory) + .cacheDefaults( + RedisCacheConfiguration.defaultCacheConfig() + .disableCachingNullValues() + .serializeValuesWith( + RedisSerializationContext.SerializationPair.fromSerializer( + GenericJackson2JsonRedisSerializer() + ) + ) + ) + .build().apply { + log.warn("Initial bean: `${CacheManager::class.java.simpleName}`") + } + } + + override fun cacheResolver(): CacheResolver { + return SimpleCacheResolver(cacheManager()).apply { + log.warn("Initial bean: `${SimpleCacheResolver::class.java.simpleName}`") + } + } + + override fun keyGenerator(): KeyGenerator { + return KeyGenerator { target: Any, method: Method, params: Array -> + val stringBuilder = StringBuilder() + stringBuilder.append(target.javaClass.name).append("#").append(method.name) + for (param in params) { + stringBuilder.append(":").append(param.toString()) + } + stringBuilder.toString() + }.apply { + log.warn("Initial bean: `${KeyGenerator::class.java.simpleName}`") + } + } + + override fun errorHandler(): CacheErrorHandler { + return SimpleCacheErrorHandler().apply { + log.warn("Initial bean: `${CacheErrorHandler::class.java.simpleName}`") + } + } +} 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 deleted file mode 100644 index e7973592..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/redis/RedisConfiguration.java +++ /dev/null @@ -1,122 +0,0 @@ -package com.jmsoftware.maf.springcloudstarter.redis; - -import cn.hutool.core.collection.CollUtil; -import com.fasterxml.jackson.databind.ObjectMapper; -import io.lettuce.core.ReadFrom; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import lombok.val; -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -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.connection.RedisStaticMasterReplicaConfiguration; -import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration; -import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; -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; - -/** - * Description: RedisConfiguration, change description here. - * - * @author 钟俊(zhongjun), email: zhongjun@toguide.cn, date: 12/30/2020 1:08 PM - **/ -@Slf4j -@RequiredArgsConstructor -@EnableConfigurationProperties({ - RedisMasterSlaveReplicationProperties.class -}) -@Import({ - RedisCachingConfiguration.class -}) -@ConditionalOnClass({RedisConnectionFactory.class}) -public class RedisConfiguration { - private final RedisMasterSlaveReplicationProperties redisMasterSlaveReplicationProperties; - private final ObjectMapper objectMapper; - - - /** - * Redis connection factory lettuce connection factory. - * - * @return the lettuce connection factory - * @see - * Spring Data Redis - Write to Master, Read from Replica - */ - @Bean - @ConditionalOnProperty(prefix = "redis.master", name = "host") - public LettuceConnectionFactory redisConnectionFactory() { - if (CollUtil.isEmpty(this.redisMasterSlaveReplicationProperties.getSlaves())) { - throw new IllegalArgumentException( - "Redis Master/Replica configuration is not right! To fix this issue, specify slaves configuration"); - } - val redisStaticMasterReplicaConfiguration = new RedisStaticMasterReplicaConfiguration( - this.redisMasterSlaveReplicationProperties.getMaster().getHost(), - this.redisMasterSlaveReplicationProperties.getMaster().getPort()); - redisStaticMasterReplicaConfiguration.setPassword( - this.redisMasterSlaveReplicationProperties.getMaster().getPassword()); - this.redisMasterSlaveReplicationProperties.getSlaves() - .forEach(slave -> redisStaticMasterReplicaConfiguration.addNode(slave.getHost(), slave.getPort())); - val lettuceClientConfiguration = LettuceClientConfiguration.builder() - .readFrom(ReadFrom.REPLICA_PREFERRED) - .build(); - log.warn("Initial bean: '{}' for Redis Master/Replica configuration", - LettuceConnectionFactory.class.getSimpleName()); - return new LettuceConnectionFactory(redisStaticMasterReplicaConfiguration, lettuceClientConfiguration); - } - - /** - * 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/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/redis/RedisConfiguration.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/redis/RedisConfiguration.kt new file mode 100644 index 00000000..615fddf9 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/redis/RedisConfiguration.kt @@ -0,0 +1,125 @@ +package com.jmsoftware.maf.springcloudstarter.redis + +import cn.hutool.core.collection.CollUtil +import com.fasterxml.jackson.databind.ObjectMapper +import com.jmsoftware.maf.common.util.logger +import com.jmsoftware.maf.springcloudstarter.function.requireTrue +import io.lettuce.core.ReadFrom +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty +import org.springframework.boot.context.properties.EnableConfigurationProperties +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.connection.RedisStaticMasterReplicaConfiguration +import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration +import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory +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 java.util.function.Consumer + +/** + * # RedisConfiguration + * + * Description: RedisConfiguration, change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/15/22 9:40 PM + */ +@EnableConfigurationProperties(RedisMasterSlaveReplicationProperties::class) +@Import(RedisCachingConfiguration::class, RedisDistributedLockConfiguration::class) +@ConditionalOnClass(RedisConnectionFactory::class) +class RedisConfiguration( + private val redisMasterSlaveReplicationProperties: RedisMasterSlaveReplicationProperties, + private val objectMapper: ObjectMapper +) { + companion object { + private val log = logger() + } + + /** + * Redis connection factory lettuce connection factory. Only takes effect when the 'redis.master.host' is + * configured. + * + * @return the lettuce connection factory + * @see Spring Data Redis - Write to Master, Read from Replica + */ + @Bean + @ConditionalOnProperty(prefix = "redis.master", name = ["host"]) + fun redisConnectionFactory(): LettuceConnectionFactory { + requireTrue(CollUtil.isEmpty(redisMasterSlaveReplicationProperties.slaves), null).orElseThrow { + IllegalStateException("Redis Master/Replica configuration is not right! To fix this issue, specify slaves configuration") + } + val redisStaticMasterReplicaConfiguration = RedisStaticMasterReplicaConfiguration( + redisMasterSlaveReplicationProperties.master?.host!!, + redisMasterSlaveReplicationProperties.master?.port!! + ).apply { setPassword(redisMasterSlaveReplicationProperties.master?.password) } + redisMasterSlaveReplicationProperties.slaves + ?.forEach(Consumer { slave: RedisMasterSlaveReplicationProperties.RedisInstance -> + redisStaticMasterReplicaConfiguration.addNode( + slave.host!!, + slave.port + ) + }) + return LettuceConnectionFactory( + redisStaticMasterReplicaConfiguration, LettuceClientConfiguration.builder() + .readFrom(ReadFrom.REPLICA_PREFERRED) + .build() + ).apply { + log.warn("Initial bean: `${LettuceConnectionFactory::class.java.simpleName}` for Redis Master/Replica configuration") + } + } + + /** + * 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 + * @see Working with Objects through RedisTemplate + */ + @Bean + fun redisTemplate(redisConnectionFactory: RedisConnectionFactory): RedisTemplate { + return RedisTemplate().apply { + setConnectionFactory(redisConnectionFactory) + keySerializer = RedisSerializer.string() + valueSerializer = Jackson2JsonRedisSerializer(Any::class.java).apply { + setObjectMapper(objectMapper) + } + hashKeySerializer = RedisSerializer.string() + hashValueSerializer = Jackson2JsonRedisSerializer(Any::class.java).apply { + setObjectMapper(objectMapper) + } + afterPropertiesSet() + log.warn("Initial bean: `${RedisTemplate::class.java.simpleName}`") + } + } + + /** + * Reactive redis template factory. + * + * @param connectionFactory the reactive redis connection factory + * @return the reactive redis template + * @see Working with Objects through ReactiveRedisTemplate + */ + @Bean + fun reactiveRedisTemplate(connectionFactory: ReactiveRedisConnectionFactory): ReactiveRedisTemplate { + val valueSerializer = Jackson2JsonRedisSerializer(Any::class.java) + return ReactiveRedisTemplate( + connectionFactory, RedisSerializationContext + .newSerializationContext( + RedisSerializationContext.SerializationPair.fromSerializer(RedisSerializer.string()) + ) + .value(valueSerializer) + .hashValue(valueSerializer) + .build() + ).apply { + log.warn("Initial bean: `${ReactiveRedisTemplate::class.java.simpleName}`") + } + } +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/redis/RedisDistributedLockConfiguration.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/redis/RedisDistributedLockConfiguration.kt new file mode 100644 index 00000000..5c859d39 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/redis/RedisDistributedLockConfiguration.kt @@ -0,0 +1,47 @@ +package com.jmsoftware.maf.springcloudstarter.redis + +import com.jmsoftware.maf.common.util.logger +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass +import org.springframework.context.annotation.Bean +import org.springframework.data.redis.connection.RedisConnectionFactory +import org.springframework.integration.redis.util.RedisLockRegistry + +/** + * # RedisDistributedLockConfiguration + * + * Change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/15/22 9:41 PM + */ +@ConditionalOnClass(RedisLockRegistry::class) +class RedisDistributedLockConfiguration { + companion object { + private const val REGISTRY_KEY = "redis-lock" + private val log = logger() + } + + /** + * Redis distributed lock registry. + * + * @param redisConnectionFactory the redis connection factory + * @return the redis lock registry + * @see Redis Lock Registry + */ + @Bean(destroyMethod = "destroy") + @ConditionalOnClass(RedisLockRegistry::class) + fun redisLockRegistry(redisConnectionFactory: RedisConnectionFactory): RedisLockRegistry { + return RedisLockRegistry(redisConnectionFactory, REGISTRY_KEY).apply { + log.warn("RedisLockRegistry bean is created. `${RedisLockRegistry::class.java.simpleName}`") + } + } + + @Bean + @ConditionalOnClass(RedisLockRegistry::class) + fun redisDistributedLockDemoController( + redisLockRegistry: RedisLockRegistry + ): RedisDistributedLockDemoController { + return RedisDistributedLockDemoController(redisLockRegistry).apply { + log.warn("RedisDistributedLockDemoController is created") + } + } +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/redis/RedisDistributedLockDemoController.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/redis/RedisDistributedLockDemoController.kt new file mode 100644 index 00000000..b1e14ff3 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/redis/RedisDistributedLockDemoController.kt @@ -0,0 +1,52 @@ +package com.jmsoftware.maf.springcloudstarter.redis + +import cn.hutool.core.util.RandomUtil +import com.jmsoftware.maf.common.bean.ResponseBodyBean +import com.jmsoftware.maf.common.util.logger +import org.springframework.integration.redis.util.RedisLockRegistry +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 java.util.concurrent.TimeUnit +import java.util.concurrent.locks.Lock + +/** + *

RedisDistributedLockDemoController

+ * + * + * Change description here. + * + * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com, 2/26/22 2:31 PM + */ +@RestController +@RequestMapping("/redis/distributed-lock") +class RedisDistributedLockDemoController( + private val redisLockRegistry: RedisLockRegistry +) { + companion object { + private val log = logger() + } + + @GetMapping("/resource/{resourceKey}/{autoUnlock}") + fun accessRaceResource( + @PathVariable resourceKey: String, + @PathVariable autoUnlock: Boolean + ): ResponseBodyBean { + return ResponseBodyBean.ofSuccess(lockRaceResource(resourceKey, autoUnlock).toString()) + } + + private fun lockRaceResource(key: String, autoUnlock: Boolean): Lock { + val lock = redisLockRegistry.obtain(key) + log.info("Obtained the lock from the registry: {}, Key: {}", lock, key) + val acquiredLock = lock.tryLock(3, TimeUnit.SECONDS) + if (acquiredLock && autoUnlock) { + log.warn("Acquired the lock. Mocking to do busy computes. Will release the lock automatically") + Thread.sleep(RandomUtil.randomInt(10000).toLong()) + lock.unlock() + log.warn("Released the lock. $lock") + } + log.info("Lock: $lock, Key: $key, acquiredLock: $acquiredLock") + return lock + } +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/redis/RedisMasterSlaveReplicationProperties.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/redis/RedisMasterSlaveReplicationProperties.java deleted file mode 100644 index 4625056d..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/redis/RedisMasterSlaveReplicationProperties.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.jmsoftware.maf.springcloudstarter.redis; - -import lombok.Data; -import org.springframework.boot.context.properties.ConfigurationProperties; - -import java.util.List; - -/** - * Description: RedisMasterSlaveReplicationProperties, change description here. - * - * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 7/31/2021 10:37 AM - * @see Redis master-slave replication - * @see Redis Master Slave With Spring Boot - * @see - * Spring Data Redis - Write to Master, Read from Replica - **/ -@Data -@ConfigurationProperties(prefix = "redis") -public class RedisMasterSlaveReplicationProperties { - private RedisInstance master; - private List slaves; - - @Data - public static class RedisInstance { - private String host; - private int port; - private String password; - } -} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/redis/RedisMasterSlaveReplicationProperties.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/redis/RedisMasterSlaveReplicationProperties.kt new file mode 100644 index 00000000..afaa2b01 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/redis/RedisMasterSlaveReplicationProperties.kt @@ -0,0 +1,25 @@ +package com.jmsoftware.maf.springcloudstarter.redis + +import org.springframework.boot.context.properties.ConfigurationProperties +import org.springframework.context.annotation.Configuration + +/** + * Description: RedisMasterSlaveReplicationProperties, change description here. + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 7/31/2021 10:37 AM + * @see Redis master-slave replication + * @see Redis Master Slave With Spring Boot + * @see Spring Data Redis - Write to Master, Read from Replica + */ +@Configuration +@ConfigurationProperties(prefix = "redis") +class RedisMasterSlaveReplicationProperties { + var master: RedisInstance? = null + var slaves: List? = null + + class RedisInstance { + var host: String? = null + var port = 0 + var password: String? = null + } +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/service/CommonService.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/service/CommonService.java deleted file mode 100644 index 79b4a9c6..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/service/CommonService.java +++ /dev/null @@ -1,32 +0,0 @@ -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; - -/** - *

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. - */ - JSON getApplicationInfo(); - - /** - * Validate object. - * - * @param payload the payload - */ - void validateObject(@Valid ValidationTestPayload payload); -} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/service/CommonService.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/service/CommonService.kt new file mode 100644 index 00000000..73279487 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/service/CommonService.kt @@ -0,0 +1,31 @@ +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 javax.validation.constraints.NotNull + +/** + * # CommonService + * + * Change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/16/22 8:35 AM + */ +@Validated +interface CommonService { + /** + * Gets application info. + * + * @return the application info. + */ + fun getApplicationInfo(): JSON + + /** + * Validate object. + * + * @param payload the payload + */ + fun validateObject(payload: @Valid @NotNull ValidationTestPayload) +} 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 deleted file mode 100644 index bcddb47b..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/service/impl/CommonServiceImpl.java +++ /dev/null @@ -1,39 +0,0 @@ -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.property.MafProjectProperties; -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 MafProjectProperties mafProjectProperties; - @Value("${greeting:Hello, World! (Embedded in Java)}") - private String greeting; - - @Override - public JSON getApplicationInfo() { - return JSONUtil.parseObj(this.mafProjectProperties).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/service/impl/CommonServiceImpl.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/service/impl/CommonServiceImpl.kt new file mode 100644 index 00000000..bd5de0b2 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/service/impl/CommonServiceImpl.kt @@ -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.common.util.logger +import com.jmsoftware.maf.springcloudstarter.property.MafProjectProperties +import com.jmsoftware.maf.springcloudstarter.service.CommonService +import org.springframework.beans.factory.annotation.Value +import org.springframework.stereotype.Service +import javax.validation.Valid +import javax.validation.constraints.NotNull + +/** + * # CommonServiceImpl + * + * Change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/13/22 2:01 PM + */ +@Service +class CommonServiceImpl( + private val mafProjectProperties: MafProjectProperties +) : CommonService { + companion object { + private val log = logger() + } + + @Value("\${greeting:Hello, World! (Embedded in Java)}") + private val greeting: String? = null + + override fun getApplicationInfo(): JSON { + return JSONUtil.parseObj(mafProjectProperties).set("greeting", greeting) + } + + override fun validateObject(payload: @Valid @NotNull ValidationTestPayload) { + log.info("Validation passed! {}", payload) + } +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/util/CaseConversionUtil.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/util/CaseConversionUtil.java index 0706e4e9..2bd66e9c 100644 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/util/CaseConversionUtil.java +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/util/CaseConversionUtil.java @@ -27,7 +27,7 @@ private CaseConversionUtil() { * @return filtered string. */ public static String filterNonAlphabetAndNonNumber(final String value) { - return value.replaceAll("[^0-9a-zA-Z]", ""); + return value.replaceAll("[^\\da-zA-Z]", ""); } /** 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 index 8af11930..10149199 100644 --- 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 @@ -14,6 +14,8 @@ import java.util.Objects; import java.util.UUID; +import static cn.hutool.core.text.CharSequenceUtil.format; + /** *

FileUtil

*

Change description here

@@ -66,8 +68,8 @@ public static File convertFrom(final InputStream inputStream, final String saveP */ 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()); + return format("{}{}/{}/{}/", sftpSubDirectory, localDate.getYear(), localDate.getMonth().getValue(), + localDate.getDayOfMonth()); } /** diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/util/RequestUtil.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/util/RequestUtil.java deleted file mode 100644 index 8f78d3dc..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/util/RequestUtil.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.jmsoftware.maf.springcloudstarter.util; - - -import cn.hutool.core.util.StrUtil; - -import javax.servlet.http.HttpServletRequest; - -/** - *

RequestUtil

- *

- * Request util. - * - * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com - * @date 2/27/20 9:45 AM - **/ -public class RequestUtil { - private static final String UNKNOWN = "unknown"; - - private RequestUtil() { - } - - /** - * Get request user's IP and port information. If the request is through reverse proxy, this method will not work - * out. - * - * @param request HTTP request. - * @return user's IP and port information. - */ - public static String getRequestIpAndPort(final HttpServletRequest request) { - var ip = request.getHeader("X-Real-IP"); - final var port = request.getRemotePort(); - if (!StrUtil.isBlank(ip) && !"".equalsIgnoreCase(ip)) { - return ip; - } - ip = request.getHeader("X-Forwarded-For"); - if (!StrUtil.isBlank(ip) && !UNKNOWN.equalsIgnoreCase(ip)) { - // The first ip is actual ip - int index = ip.indexOf(','); - if (index != -1) { - return ip.substring(0, index) + ":" + port; - } else { - return ip + ":" + port; - } - } else { - return request.getRemoteAddr() + ":" + port; - } - } -} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/util/RequestUtil.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/util/RequestUtil.kt new file mode 100644 index 00000000..165d415a --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/util/RequestUtil.kt @@ -0,0 +1,47 @@ +package com.jmsoftware.maf.springcloudstarter.util + +import cn.hutool.core.util.StrUtil +import com.jmsoftware.maf.springcloudstarter.util.RequestUtil.UNKNOWN +import javax.servlet.http.HttpServletRequest + +/** + * # RequestUtil + * + * Request util. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/16/22 8:35 AM + */ +object RequestUtil { + const val UNKNOWN = "unknown" +} + +/** + * Get request user's IP and port information. If the request is through reverse proxy, this method will not work + * out. + * + * @param request HTTP request. + * @return user's IP and port information. + */ +fun getRequestIpAndPort(request: HttpServletRequest): String { + var ip = request.getHeader("X-Real-IP") + val port = request.remotePort + if (!StrUtil.isBlank(ip) && !"".equals(ip, ignoreCase = true)) { + return ip + } + ip = request.getHeader("X-Forwarded-For") + return if (!StrUtil.isBlank(ip) && !UNKNOWN.equals( + ip, + ignoreCase = true + ) + ) { + // The first ip is actual ip + val index = ip.indexOf(',') + if (index != -1) { + ip.substring(0, index) + ":" + port + } else { + "$ip:$port" + } + } else { + request.remoteAddr + ":" + port + } +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/util/ResponseUtil.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/util/ResponseUtil.java deleted file mode 100644 index 250a6bef..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/util/ResponseUtil.java +++ /dev/null @@ -1,99 +0,0 @@ -package com.jmsoftware.maf.springcloudstarter.util; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.jmsoftware.maf.common.bean.ResponseBodyBean; -import com.jmsoftware.maf.common.exception.BaseException; -import lombok.NonNull; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import lombok.val; -import org.springframework.http.HttpStatus; -import org.springframework.lang.Nullable; - -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 - **/ -@Slf4j -@SuppressWarnings("unused") -@RequiredArgsConstructor -public class ResponseUtil { - private final ObjectMapper objectMapper; - - /** - * Write data JSON to response. - * - * @param response Response - * @param httpStatus HTTP status - * @param data Data - */ - public void renderJson(@NonNull HttpServletResponse response, @NonNull HttpStatus httpStatus, - @Nullable Object data) { - this.standardizeHttpServletResponse(response, httpStatus); - val responseBodyBean = ResponseBodyBean.ofStatus(httpStatus.value(), - httpStatus.getReasonPhrase(), data); - try { - response.getWriter().write(this.objectMapper.writeValueAsString(responseBodyBean)); - } catch (IOException e) { - log.error("Error occurred when responding a data JSON.", e); - } - } - - /** - * Render json. - * - * @param response the response - * @param httpStatus the http status - * @param message the message - */ - public void renderJson(@NonNull HttpServletResponse response, @NonNull HttpStatus httpStatus, - @NonNull String message) { - this.standardizeHttpServletResponse(response, httpStatus); - val responseBodyBean = ResponseBodyBean.ofStatus(httpStatus.value(), message, null); - try { - response.getWriter().write(this.objectMapper.writeValueAsString(responseBodyBean)); - } catch (IOException e) { - log.error("Error occurred when responding a data JSON.", e); - } - } - - /** - * Write exception JSON to response. - * - * @param response Response - * @param exception Exception - */ - public void renderJson(@NonNull HttpServletResponse response, @NonNull BaseException exception) { - val httpStatus = HttpStatus.valueOf(exception.getCode()); - this.standardizeHttpServletResponse(response, httpStatus); - val responseBodyBean = ResponseBodyBean.ofStatus(exception.getCode(), - exception.getMessage(), - exception.getData()); - try { - response.getWriter().write(this.objectMapper.writeValueAsString(responseBodyBean)); - } catch (IOException e) { - log.error("Error occurred when responding an exception JSON.", e); - } - } - - /** - * Standardize http servlet response. - * - * @param response the response - * @param httpStatus the http status - */ - private void standardizeHttpServletResponse(HttpServletResponse response, HttpStatus httpStatus) { - response.setHeader("Access-Control-Allow-Origin", ALL); - response.setHeader("Access-Control-Allow-Methods", ALL); - response.setContentType("application/json;charset=UTF-8"); - response.setStatus(httpStatus.value()); - } -} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/util/ResponseUtil.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/util/ResponseUtil.kt new file mode 100644 index 00000000..719cadb1 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/util/ResponseUtil.kt @@ -0,0 +1,105 @@ +package com.jmsoftware.maf.springcloudstarter.util + +import com.fasterxml.jackson.databind.ObjectMapper +import com.jmsoftware.maf.common.bean.ResponseBodyBean +import com.jmsoftware.maf.common.exception.BaseException +import com.jmsoftware.maf.common.util.logger +import org.springframework.http.HttpStatus +import org.springframework.lang.Nullable +import org.springframework.web.cors.CorsConfiguration +import java.io.IOException +import javax.servlet.http.HttpServletResponse + +/** + * # ResponseUtil + * + * Response util + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/16/22 8:41 AM + */ +class ResponseUtil( + private val objectMapper: ObjectMapper +) { + companion object { + private val log = logger() + } + + /** + * Write data JSON to response. + * + * @param response Response + * @param httpStatus HTTP status + * @param data Data + */ + fun renderJson( + response: HttpServletResponse, + httpStatus: HttpStatus, + @Nullable data: Any? + ) { + standardizeHttpServletResponse(response, httpStatus) + val responseBodyBean = ResponseBodyBean.ofStatus( + httpStatus.value(), + httpStatus.reasonPhrase, data + ) + try { + response.writer.write(objectMapper.writeValueAsString(responseBodyBean)) + } catch (e: IOException) { + log.error("Error occurred when responding a data JSON.", e) + } + } + + /** + * Render json. + * + * @param response the response + * @param httpStatus the http status + * @param message the message + */ + fun renderJson( + response: HttpServletResponse, + httpStatus: HttpStatus, + message: String + ) { + standardizeHttpServletResponse(response, httpStatus) + val responseBodyBean = ResponseBodyBean.ofStatus(httpStatus.value(), message, null) + try { + response.writer.write(objectMapper.writeValueAsString(responseBodyBean)) + } catch (e: IOException) { + log.error("Error occurred when responding a data JSON.", e) + } + } + + /** + * Write exception JSON to response. + * + * @param response Response + * @param exception Exception + */ + fun renderJson(response: HttpServletResponse, exception: BaseException) { + val httpStatus = HttpStatus.valueOf(exception.code) + standardizeHttpServletResponse(response, httpStatus) + val responseBodyBean = ResponseBodyBean.ofStatus( + exception.code, + exception.message ?: httpStatus.reasonPhrase, + exception.data + ) + try { + response.writer.write(objectMapper.writeValueAsString(responseBodyBean)) + } catch (e: IOException) { + log.error("Error occurred when responding an exception JSON.", e) + } + } + + /** + * Standardize http servlet response. + * + * @param response the response + * @param httpStatus the http status + */ + private fun standardizeHttpServletResponse(response: HttpServletResponse, httpStatus: HttpStatus) { + response.setHeader("Access-Control-Allow-Origin", CorsConfiguration.ALL) + response.setHeader("Access-Control-Allow-Methods", CorsConfiguration.ALL) + response.contentType = "application/json;charset=UTF-8" + response.status = 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 deleted file mode 100644 index f4ea7d89..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/util/TreeElementType.java +++ /dev/null @@ -1,21 +0,0 @@ -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/TreeElementType.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/util/TreeElementType.kt new file mode 100644 index 00000000..8abf1aa6 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/util/TreeElementType.kt @@ -0,0 +1,25 @@ +package com.jmsoftware.maf.springcloudstarter.util + +/** + * # TreeElementType + * + * Description: TreeElementType, change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/16/22 8:54 AM + */ +enum class 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/UserUtil.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/util/UserUtil.java deleted file mode 100644 index b43eecba..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/util/UserUtil.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.jmsoftware.maf.springcloudstarter.util; - -import cn.hutool.core.util.StrUtil; -import com.jmsoftware.maf.common.constant.MafHttpHeader; -import lombok.extern.slf4j.Slf4j; -import lombok.val; -import org.springframework.web.context.request.RequestContextHolder; -import org.springframework.web.context.request.ServletRequestAttributes; - -/** - * Description: UserUtil, change description here. - * - * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 6/28/2021 1:40 PM - **/ -@Slf4j -public class UserUtil { - private UserUtil() { - } - - /** - * Gets current username. Never throw exceptions. - * - * @return the current id; null if the current request is ignored by api-gateway - * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 9/17/21 7:58 AM - */ - public static String getCurrentUsername() { - val servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes(); - val request = servletRequestAttributes.getRequest(); - val currentUsername = request.getHeader(MafHttpHeader.X_USERNAME.getHeader()); - if (StrUtil.isBlank(currentUsername)) { - log.warn("Found blank {} in the header of current request [{}] {}", MafHttpHeader.X_USERNAME, - request.getMethod(), request.getRequestURI()); - return null; - } - return currentUsername; - } - - /** - * Gets current user's id. Never throw exceptions. - * - * @return the current id; null if the current request is ignored by api-gateway - * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 9/17/21 7:58 AM - */ - public static Long getCurrentId() { - val servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes(); - val request = servletRequestAttributes.getRequest(); - val xid = request.getHeader(MafHttpHeader.X_ID.getHeader()); - if (StrUtil.isBlank(xid)) { - log.warn("Found blank {} in the header of current request [{}] {}", MafHttpHeader.X_ID, request.getMethod(), - request.getRequestURI()); - return null; - } - return Long.valueOf(xid); - } -} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/util/UserUtil.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/util/UserUtil.kt new file mode 100644 index 00000000..62953c69 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/util/UserUtil.kt @@ -0,0 +1,54 @@ +package com.jmsoftware.maf.springcloudstarter.util + +import cn.hutool.core.util.StrUtil +import com.jmsoftware.maf.common.constant.MafHttpHeader +import com.jmsoftware.maf.common.util.logger +import com.jmsoftware.maf.springcloudstarter.util.UserUtil.log +import org.springframework.web.context.request.RequestContextHolder +import org.springframework.web.context.request.ServletRequestAttributes + +/** + * # UserUtil + * + * Description: UserUtil, change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/16/22 8:54 AM + */ +internal object UserUtil { + val log = logger() +} + +/** + * Gets current username. Never throw exceptions. + * + * @return the current id; null if the current request is ignored by api-gateway + */ +fun currentUsername(): String? { + val servletRequestAttributes = RequestContextHolder.currentRequestAttributes() as ServletRequestAttributes + val request = servletRequestAttributes.request + val currentUsername = request.getHeader(MafHttpHeader.X_USERNAME.header) + if (StrUtil.isBlank(currentUsername)) { + log.warn( + "Found blank {} in the header of current request [{}] {}", MafHttpHeader.X_USERNAME, + request.method, request.requestURI + ) + return null + } + return currentUsername +} + +/** + * Gets current user's id. Never throw exceptions. + * + * @return the current id; null if the current request is ignored by api-gateway + */ +fun currentUserId(): Long? { + val servletRequestAttributes = RequestContextHolder.currentRequestAttributes() as ServletRequestAttributes + val request = servletRequestAttributes.request + val xid = request.getHeader(MafHttpHeader.X_ID.header) + if (StrUtil.isBlank(xid)) { + log.warn("Found blank `${MafHttpHeader.X_ID}` in the header of current request [${request.method}] ${request.requestURI}") + return null + } + return java.lang.Long.valueOf(xid) +} 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 deleted file mode 100644 index 06e1b48d..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/validation/annotation/DateTimeRangeConstraints.java +++ /dev/null @@ -1,24 +0,0 @@ -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/DateTimeRangeConstraints.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/validation/annotation/DateTimeRangeConstraints.kt new file mode 100644 index 00000000..9a7d5e73 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/validation/annotation/DateTimeRangeConstraints.kt @@ -0,0 +1,23 @@ +package com.jmsoftware.maf.springcloudstarter.validation.annotation + +import com.jmsoftware.maf.springcloudstarter.validation.validator.DateTimeRangeValidator +import javax.validation.Constraint +import javax.validation.Payload +import kotlin.reflect.KClass + +/** + * # DateTimeRangeConstraints + * + * Description: DateTimeRangeConstraints, change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/16/22 9:52 AM + */ +@MustBeDocumented +@Retention(AnnotationRetention.RUNTIME) +@Constraint(validatedBy = [DateTimeRangeValidator::class]) +@Target(AnnotationTarget.ANNOTATION_CLASS, AnnotationTarget.CLASS) +annotation class DateTimeRangeConstraints( + val message: String = "Invalid date time range", + val groups: Array> = [], + val payload: Array> = [] +) 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 deleted file mode 100644 index 1e408fc3..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/validation/annotation/DateTimeRangeGroup.java +++ /dev/null @@ -1,19 +0,0 @@ -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/DateTimeRangeGroup.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/validation/annotation/DateTimeRangeGroup.kt new file mode 100644 index 00000000..eeb53864 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/validation/annotation/DateTimeRangeGroup.kt @@ -0,0 +1,19 @@ +package com.jmsoftware.maf.springcloudstarter.validation.annotation + + +/** + * # DateTimeRangeGroup + * + * Description: DateTimeRangeGroup, change description here. + * + * TODO: to support nullable value + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/16/22 9:53 AM + */ +@MustBeDocumented +@Target(AnnotationTarget.FIELD) +@Retention(AnnotationRetention.RUNTIME) +annotation class DateTimeRangeGroup( + val groupName: String = "defaultDateTimeRangeGroup", + val type: DateTimeRangeType = 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.kt similarity index 57% rename from spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/validation/annotation/DateTimeRangeType.java rename to spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/validation/annotation/DateTimeRangeType.kt index 2cc7d4ab..57d90662 100644 --- 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.kt @@ -1,17 +1,20 @@ -package com.jmsoftware.maf.springcloudstarter.validation.annotation; +package com.jmsoftware.maf.springcloudstarter.validation.annotation /** + * # DateTimeRangeType + * * Description: DateTimeRangeType, change description here. * - * @author 钟俊 (zhongjun), email: zhongjun@toguide.cn, date: 6/3/2021 3:07 PM + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/16/22 9:59 AM */ -public enum DateTimeRangeType { +enum class DateTimeRangeType { /** * Start time */ START_TIME, + /** * End 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 index 8a7a92fe..3a240447 100644 --- 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 @@ -31,7 +31,7 @@ Class[] payload() default {}; - Class targetEnum() default Class.class; + Class targetEnum() default Enum.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 deleted file mode 100644 index db0d01db..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/validation/validator/DateTimeRangeValidator.java +++ /dev/null @@ -1,103 +0,0 @@ -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) { - val 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/DateTimeRangeValidator.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/validation/validator/DateTimeRangeValidator.kt new file mode 100644 index 00000000..ff24bdd6 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/validation/validator/DateTimeRangeValidator.kt @@ -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.common.util.logger +import com.jmsoftware.maf.springcloudstarter.validation.annotation.DateTimeRangeConstraints +import com.jmsoftware.maf.springcloudstarter.validation.annotation.DateTimeRangeGroup +import com.jmsoftware.maf.springcloudstarter.validation.annotation.DateTimeRangeType +import java.lang.reflect.Field +import java.time.LocalDateTime +import java.util.* +import javax.validation.ConstraintValidator +import javax.validation.ConstraintValidatorContext + +/** + * # DateTimeRangeValidator + * + * Description: DateTimeRangeValidator, change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/16/22 9:39 AM + */ +class DateTimeRangeValidator : ConstraintValidator { + companion object { + const val MAX_GROUP_SIZE = 2 + private const val DEFAULT_HASH_MAP_CAPACITY = 8 + val log = logger() + } + + override fun isValid(value: Any, context: ConstraintValidatorContext): Boolean { + val annotatedFieldSet = getAnnotatedFieldSet(value) + if (CollUtil.isEmpty(annotatedFieldSet)) { + log.warn( + "There is not fields annotated by {} in the class({})", value.javaClass.name, + DateTimeRangeGroup::class.java.simpleName + ) + return true + } + val dateTimeRangeGroupMap = HashMap>(DEFAULT_HASH_MAP_CAPACITY) + for (field in annotatedFieldSet) { + val annotation = field.getAnnotation(DateTimeRangeGroup::class.java) + if (!dateTimeRangeGroupMap.containsKey(annotation.groupName)) { + dateTimeRangeGroupMap[annotation.groupName] = CollUtil.newLinkedList(field) + } else { + dateTimeRangeGroupMap[annotation.groupName]!!.add(field) + if (dateTimeRangeGroupMap[annotation.groupName]!!.size > MAX_GROUP_SIZE) { + log.error( + "The length of DateTimeRangeGroup({}) cannot exceed {}!", annotation.groupName, + MAX_GROUP_SIZE + ) + return false + } + } + } + return validate(value, dateTimeRangeGroupMap) + } + + private fun getAnnotatedFieldSet(value: Any): HashSet { + val fields = value.javaClass.declaredFields + val annotatedFieldSet = CollUtil.newHashSet() + for (field in fields) { + val annotation = field.getAnnotation(DateTimeRangeGroup::class.java) + if (ObjectUtil.isNotNull(annotation)) { + annotatedFieldSet.add(field) + } + } + return annotatedFieldSet + } + + private fun validate(value: Any, dateTimeRangeGroupMap: HashMap>): Boolean { + for ((groupName, fieldList) in dateTimeRangeGroupMap) { + if (fieldList.size != MAX_GROUP_SIZE) { + log.error("The length of DateTimeRangeGroup({}) is not correct!", groupName) + return false + } + val dateTimeRangeGroup = fieldList[0].getAnnotation( + DateTimeRangeGroup::class.java + ) + var startTime: Any? = null + var endTime: Any? = null + when (dateTimeRangeGroup.type) { + DateTimeRangeType.START_TIME -> { + startTime = ReflectUtil.getFieldValue(value, fieldList[0]) + endTime = ReflectUtil.getFieldValue(value, fieldList[1]) + } + DateTimeRangeType.END_TIME -> { + startTime = ReflectUtil.getFieldValue(value, fieldList[1]) + endTime = ReflectUtil.getFieldValue(value, fieldList[0]) + } + } + if (ObjectUtil.hasNull(startTime, endTime)) { + return true + } + if (startTime is Date && endTime is Date && startTime.after(endTime)) { + return false + } + if (startTime is LocalDateTime && endTime is LocalDateTime && startTime.isAfter(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 index 6d08dffe..ff62a0cb 100644 --- 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 @@ -2,7 +2,7 @@ import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ReflectUtil; -import com.jmsoftware.maf.common.bean.EnumerationBase; +import com.jmsoftware.maf.common.enumeration.ValueDescriptionBaseEnum; import com.jmsoftware.maf.springcloudstarter.validation.annotation.ValidEnumValue; import lombok.extern.slf4j.Slf4j; import lombok.val; @@ -33,8 +33,7 @@ public class EnumValueValidator implements ConstraintValidator headers) { - this.chatRoomService.sendMessage(payload, headers); - } -} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/websocket/ChatRoomController.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/websocket/ChatRoomController.kt new file mode 100644 index 00000000..a8b7e19b --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/websocket/ChatRoomController.kt @@ -0,0 +1,24 @@ +package com.jmsoftware.maf.springcloudstarter.websocket + +import com.jmsoftware.maf.common.websocket.WebSocketMessagePayload +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 + +/** + * # ChatRoomController + * + * Description: ChatRoomController, change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/16/22 10:02 AM + */ +@Controller +class ChatRoomController( + private val chatRoomService: ChatRoomService +) { + @MessageMapping("/send-message") + fun sendMessage(@Payload payload: WebSocketMessagePayload, @Headers headers: Map) { + 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 deleted file mode 100644 index 30aec294..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/websocket/ChatRoomService.java +++ /dev/null @@ -1,22 +0,0 @@ -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/ChatRoomService.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/websocket/ChatRoomService.kt new file mode 100644 index 00000000..c00aac2f --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/websocket/ChatRoomService.kt @@ -0,0 +1,22 @@ +package com.jmsoftware.maf.springcloudstarter.websocket + +import com.jmsoftware.maf.common.websocket.WebSocketMessagePayload +import org.springframework.validation.annotation.Validated + +/** + * # ChatRoomService + * + * Description: ChatRoomService, change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/16/22 10:03 AM + */ +@Validated +interface ChatRoomService { + /** + * Send message. + * + * @param payload the payload + * @param headers the headers + */ + fun sendMessage(payload: WebSocketMessagePayload, headers: Map) +} 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 deleted file mode 100644 index f7a0517f..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/websocket/ChatRoomServiceImpl.java +++ /dev/null @@ -1,45 +0,0 @@ -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/ChatRoomServiceImpl.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/websocket/ChatRoomServiceImpl.kt new file mode 100644 index 00000000..5dcc2ea6 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/websocket/ChatRoomServiceImpl.kt @@ -0,0 +1,43 @@ +package com.jmsoftware.maf.springcloudstarter.websocket + +import com.fasterxml.jackson.databind.ObjectMapper +import com.jmsoftware.maf.common.util.logger +import com.jmsoftware.maf.common.websocket.WebSocketMessagePayload +import com.jmsoftware.maf.common.websocket.WebSocketMessageResponse +import org.springframework.messaging.simp.SimpMessagingTemplate +import org.springframework.stereotype.Service + +/** + * # ChatRoomServiceImpl + * + * Description: ChatRoomServiceImpl, change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/16/22 10:04 AM + */ +@Service +class ChatRoomServiceImpl( + private val simpMessagingTemplate: SimpMessagingTemplate, + private val objectMapper: ObjectMapper +) : ChatRoomService { + companion object { + /** + * `/public/broadcast` is not a valid topic destination + * + * RabbitMQ does not support slash (`/`) 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 + */ + const val BROADCAST_CHANNEL = "/topic/public-broadcast" + val log = logger() + } + + override fun sendMessage(payload: WebSocketMessagePayload, headers: Map) { + val response = WebSocketMessageResponse() + response.sender = payload.sender + response.receiver = payload.receiver + response.content = payload.content + simpMessagingTemplate.convertAndSend(BROADCAST_CHANNEL, objectMapper.writeValueAsString(response)) + log.info("Got message from client. simpSessionId: ${headers["simpSessionId"]}, payload: $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 deleted file mode 100644 index 3257292a..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/websocket/WebSocketConfiguration.java +++ /dev/null @@ -1,42 +0,0 @@ -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.condition.ConditionalOnClass; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Import; -import org.springframework.messaging.simp.SimpMessagingTemplate; -import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker; -import org.springframework.web.socket.server.standard.ServerEndpointExporter; - -/** - * 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 -@Import({WebSocketMessageBrokerConfiguration.class}) -@ConditionalOnClass({ServerEndpointExporter.class, RabbitTemplate.class}) -public class WebSocketConfiguration { - @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); - } -} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/websocket/WebSocketConfiguration.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/websocket/WebSocketConfiguration.kt new file mode 100644 index 00000000..f4adcb3f --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/websocket/WebSocketConfiguration.kt @@ -0,0 +1,43 @@ +package com.jmsoftware.maf.springcloudstarter.websocket + +import com.fasterxml.jackson.databind.ObjectMapper +import com.jmsoftware.maf.common.util.logger +import org.springframework.amqp.rabbit.core.RabbitTemplate +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass +import org.springframework.context.annotation.Bean +import org.springframework.context.annotation.Import +import org.springframework.messaging.simp.SimpMessagingTemplate +import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker +import org.springframework.web.socket.server.standard.ServerEndpointExporter + +/** + * Description: WebSocketConfiguration, change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/16/22 10:11 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 + */ +@EnableWebSocketMessageBroker +@Import(WebSocketMessageBrokerConfiguration::class) +@ConditionalOnClass(ServerEndpointExporter::class, RabbitTemplate::class) +class WebSocketConfiguration { + companion object { + private val log = logger() + } + + @Bean + fun greetingController(chatRoomService: ChatRoomService): ChatRoomController { + log.warn("Initial bean: `${ChatRoomController::class.java.simpleName}`") + return ChatRoomController(chatRoomService) + } + + @Bean + fun chatRoomService( + simpMessagingTemplate: SimpMessagingTemplate, + objectMapper: ObjectMapper + ): ChatRoomService { + log.warn("Initial bean: `${ChatRoomService::class.java.simpleName}`") + return ChatRoomServiceImpl(simpMessagingTemplate, objectMapper) + } +} diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/websocket/WebSocketMessageBrokerConfiguration.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/websocket/WebSocketMessageBrokerConfiguration.java deleted file mode 100644 index 560201f9..00000000 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/websocket/WebSocketMessageBrokerConfiguration.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.jmsoftware.maf.springcloudstarter.websocket; - -import lombok.RequiredArgsConstructor; -import org.springframework.boot.autoconfigure.amqp.RabbitProperties; -import org.springframework.messaging.simp.config.MessageBrokerRegistry; -import org.springframework.web.socket.config.annotation.StompEndpointRegistry; -import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer; - -import static org.springframework.web.cors.CorsConfiguration.ALL; - -/** - * Description: WebSocketMessageBrokerConfiguration, change description here. - * - * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 8/6/2021 5:09 PM - **/ -@RequiredArgsConstructor -public class WebSocketMessageBrokerConfiguration implements WebSocketMessageBrokerConfigurer { - private final RabbitProperties rabbitProperties; - - @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/java/com/jmsoftware/maf/springcloudstarter/websocket/WebSocketMessageBrokerConfiguration.kt b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/websocket/WebSocketMessageBrokerConfiguration.kt new file mode 100644 index 00000000..3c7e98f5 --- /dev/null +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/websocket/WebSocketMessageBrokerConfiguration.kt @@ -0,0 +1,47 @@ +package com.jmsoftware.maf.springcloudstarter.websocket + +import org.springframework.boot.autoconfigure.amqp.RabbitProperties +import org.springframework.messaging.simp.config.MessageBrokerRegistry +import org.springframework.web.cors.CorsConfiguration.ALL +import org.springframework.web.socket.config.annotation.StompEndpointRegistry +import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer + +/** + * # WebSocketMessageBrokerConfiguration + * + * Description: WebSocketMessageBrokerConfiguration, change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/16/22 10:11 AM + */ +class WebSocketMessageBrokerConfiguration( + private val rabbitProperties: RabbitProperties +) : WebSocketMessageBrokerConfigurer { + override fun registerStompEndpoints(registry: StompEndpointRegistry) { + registry.addEndpoint("/web-socket", "/websocket", "/ws") + .setAllowedOriginPatterns(ALL) + .withSockJS() + } + + /** + * 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 fun configureMessageBroker(registry: MessageBrokerRegistry) { + // 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(rabbitProperties.host) + .setClientLogin(rabbitProperties.username) + .setClientPasscode(rabbitProperties.password) + .setSystemLogin(rabbitProperties.username) + .setSystemPasscode(rabbitProperties.password) + registry.setApplicationDestinationPrefixes("/app") + } +} diff --git a/spring-cloud-starter/src/main/resources/logback-configuration/logback-base.xml b/spring-cloud-starter/src/main/resources/logback-configuration/logback-base.xml index 1f80779c..95a3be2c 100644 --- a/spring-cloud-starter/src/main/resources/logback-configuration/logback-base.xml +++ b/spring-cloud-starter/src/main/resources/logback-configuration/logback-base.xml @@ -1,7 +1,9 @@ + + @@ -10,11 +12,17 @@ converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/> - + + value="%d{yyyy-MM-dd HH:mm:ss.SSS} %clr(%5p) %clr([${APPLICATION},%X{traceId},%X{spanId}]){yellow} %clr(${PID:- }){magenta} - [%15.15t] %-48.48logger{48} : %msg%n%wEx"/> + value="%d{yyyy-MM-dd HH:mm:ss.SSS} %5p [${APPLICATION},%X{traceId},%X{spanId}] ${PID:- } - [%t] %-48.48logger{48} : %msg%n%wEx"/> diff --git a/spring-cloud-starter/src/main/resources/mapper/quartz/QuartzJobConfigurationMapper.xml b/spring-cloud-starter/src/main/resources/mapper/quartz/QuartzJobConfigurationMapper.xml index a7ad522c..4f27c02d 100644 --- a/spring-cloud-starter/src/main/resources/mapper/quartz/QuartzJobConfigurationMapper.xml +++ b/spring-cloud-starter/src/main/resources/mapper/quartz/QuartzJobConfigurationMapper.xml @@ -1,6 +1,6 @@ - + diff --git a/spring-cloud-starter/src/test/java/com/jmsoftware/maf/springcloudstarter/BeanCopyTests.java b/spring-cloud-starter/src/test/java/com/jmsoftware/maf/springcloudstarter/BeanCopyTests.java deleted file mode 100644 index 4142bef0..00000000 --- a/spring-cloud-starter/src/test/java/com/jmsoftware/maf/springcloudstarter/BeanCopyTests.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.jmsoftware.maf.springcloudstarter; - -import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.date.StopWatch; -import cn.hutool.core.lang.Console; -import lombok.Data; -import lombok.val; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; -import org.springframework.beans.BeanUtils; - -import java.time.LocalDateTime; - -/** - * Description: BeanCopyTests, change description here. - * - * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 10/21/2021 8:07 PM - **/ -class BeanCopyTests { - private static final int COUNT = 1_000_000; - - @Test - void hutoolBeanCopyTests() { - val beanOne = this.buildBeanOne(); - val stopwatch = new StopWatch(); - stopwatch.start(); - for (int i = 0; i < COUNT; i++) { - val beanTwo = new BeanTwo(); - BeanUtil.copyProperties(beanOne, beanTwo); - } - stopwatch.stop(); - Console.log("Hutool BeanUtil took {}s ({}ms)", stopwatch.getTotalTimeSeconds(), stopwatch.getTotalTimeMillis()); - Assertions.assertNotNull(beanOne); - } - - @Test - void springBeanCopyTests() { - val beanOne = this.buildBeanOne(); - val stopwatch = new StopWatch(); - stopwatch.start(); - for (int i = 0; i < COUNT; i++) { - val beanTwo = new BeanTwo(); - BeanUtils.copyProperties(beanOne, beanTwo); - } - stopwatch.stop(); - Console.log("Spring BeanUtils took {}s ({}ms)", stopwatch.getTotalTimeSeconds(), - stopwatch.getTotalTimeMillis()); - Assertions.assertNotNull(beanOne); - } - - private BeanOne buildBeanOne() { - val beanOne = new BeanOne(); - beanOne.setId(865L); - beanOne.setName("Eas"); - beanOne.setDescription("S6XC"); - beanOne.setCreatedBy(485L); - beanOne.setCreatedTime(LocalDateTime.now()); - beanOne.setModifiedBy(849L); - beanOne.setModifiedTime(LocalDateTime.now()); - return beanOne; - } - - @Data - private static class BeanOne { - private Long id; - private String name; - private String description; - private Long createdBy; - private LocalDateTime createdTime; - private Long modifiedBy; - private LocalDateTime modifiedTime; - } - - @Data - private static class BeanTwo { - private Long id; - private String name; - private String description; - private LocalDateTime createdTime; - private LocalDateTime modifiedTime; - } -} diff --git a/spring-cloud-starter/src/test/java/com/jmsoftware/maf/springcloudstarter/BeanCopyTests.kt b/spring-cloud-starter/src/test/java/com/jmsoftware/maf/springcloudstarter/BeanCopyTests.kt new file mode 100644 index 00000000..ba462c77 --- /dev/null +++ b/spring-cloud-starter/src/test/java/com/jmsoftware/maf/springcloudstarter/BeanCopyTests.kt @@ -0,0 +1,85 @@ +package com.jmsoftware.maf.springcloudstarter + +import cn.hutool.core.bean.BeanUtil +import cn.hutool.core.date.StopWatch +import com.jmsoftware.maf.common.util.logger +import org.junit.jupiter.api.Assertions +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.parallel.Execution +import org.junit.jupiter.api.parallel.ExecutionMode +import org.springframework.beans.BeanUtils +import java.time.LocalDateTime + +/** + * # BeanCopyTests + * + * Description: BeanCopyTests, change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/16/22 10:22 AM + */ +@Execution(ExecutionMode.CONCURRENT) +internal class BeanCopyTests { + companion object { + private const val COUNT = 1000000 + var log = logger() + } + + @Test + fun hutoolBeanCopyTests() { + val beanOne = buildBeanOne() + val stopwatch = StopWatch() + stopwatch.start() + for (i in 0 until COUNT) { + val beanTwo = BeanTwo() + BeanUtil.copyProperties(beanOne, beanTwo) + } + stopwatch.stop() + log.info("Hutool BeanUtil took ${stopwatch.totalTimeSeconds}s (${stopwatch.totalTimeMillis}ms)") + Assertions.assertNotNull(beanOne) + } + + @Test + fun springBeanCopyTests() { + val beanOne = buildBeanOne() + val stopwatch = StopWatch() + stopwatch.start() + for (i in 0 until COUNT) { + val beanTwo = BeanTwo() + BeanUtils.copyProperties(beanOne, beanTwo) + } + stopwatch.stop() + log.info("Spring BeanUtil took ${stopwatch.totalTimeSeconds}s (${stopwatch.totalTimeMillis}ms)") + Assertions.assertNotNull(beanOne) + } + + private fun buildBeanOne(): BeanOne { + val beanOne = BeanOne() + beanOne.id = 865L + beanOne.name = "Eas" + beanOne.description = "S6XC" + beanOne.createdBy = 485L + beanOne.createdTime = LocalDateTime.now() + beanOne.modifiedBy = 865L + beanOne.modifiedTime = LocalDateTime.now() + return beanOne + } + + private class BeanOne { + var id: Long = 0L + lateinit var name: String + lateinit var description: String + var createdBy: Long = 0L + lateinit var createdTime: LocalDateTime + var modifiedBy: Long = 0L + lateinit var modifiedTime: LocalDateTime + } + + @Suppress("unused") + private class BeanTwo { + var id: Long = 0L + lateinit var name: String + lateinit var description: String + lateinit var createdTime: LocalDateTime + lateinit var modifiedTime: LocalDateTime + } +} diff --git a/spring-cloud-starter/src/test/java/com/jmsoftware/maf/springcloudstarter/FunctionTests.kt b/spring-cloud-starter/src/test/java/com/jmsoftware/maf/springcloudstarter/FunctionTests.kt new file mode 100644 index 00000000..f9b53c79 --- /dev/null +++ b/spring-cloud-starter/src/test/java/com/jmsoftware/maf/springcloudstarter/FunctionTests.kt @@ -0,0 +1,152 @@ +package com.jmsoftware.maf.springcloudstarter + +import cn.hutool.core.util.StrUtil +import com.google.common.cache.CacheBuilder +import com.google.common.cache.RemovalNotification +import com.google.common.collect.Maps +import com.jmsoftware.maf.common.util.logger +import com.jmsoftware.maf.springcloudstarter.function.* +import fj.Show +import org.junit.jupiter.api.Assertions +import org.junit.jupiter.api.Assertions.assertThrows +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.parallel.Execution +import org.junit.jupiter.api.parallel.ExecutionMode +import java.time.Duration +import java.util.concurrent.atomic.AtomicInteger +import java.util.function.Function +import java.util.function.Predicate + +/** + * # FunctionTests + * + * @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 9/28/2021 12:46 PM + */ +@Execution(ExecutionMode.CONCURRENT) +internal class FunctionTests { + companion object { + private val log = logger() + } + + /** + * Test require true. + */ + @Test + fun testRequireTrue() { + assertThrows( + IllegalArgumentException::class.java, { + requireTrue(false) { anotherBoolean: Boolean? -> + log.info( + "aBoolean = {}", + anotherBoolean + ) + } + .orElseThrow { IllegalArgumentException("aBoolean is expected to be true") } + }, + "requireTrue doesn't throws exception" + ) + assertThrows( + IllegalArgumentException::class.java, { + requireAllTrue(false, true, true) + .orElseThrow { IllegalArgumentException("Boolean array is expected to be all true") } + }, + "requireTrue doesn't throws exception" + ) + } + + /** + * Test cache function. + */ + @Test + fun testCacheFunction() { + val cacheMap = Maps.newHashMap() + cacheMap["key1"] = "1" + cacheMap["key2"] = "2" + val stringProcess = Function { input: String -> + log.info("No cache return value found. input: {} Re-calculating…", input) + StrUtil.subSuf(input, 3) + } + val result1 = cacheFunction(stringProcess, "key1", cacheMap) + val result2 = cacheFunction(stringProcess, "key2", cacheMap) + val result3 = cacheFunction(stringProcess, "key3", cacheMap) + Assertions.assertEquals("1", result1) + Assertions.assertEquals("2", result2) + Assertions.assertEquals("3", result3) + Assertions.assertEquals(3, cacheMap.size) + val guavaCache = CacheBuilder + .newBuilder() + .maximumSize(2) + .expireAfterWrite(Duration.ofSeconds(3)) + .removalListener { notification: RemovalNotification? -> + log.info( + "Removed cache: {}", + notification + ) + } + .build() + guavaCache.put("key4", "4") + guavaCache.put("key5", "5") + val result4 = cacheFunction(stringProcess, "key4", guavaCache) + val result5 = cacheFunction(stringProcess, "key5", guavaCache) + val result6 = cacheFunction(stringProcess, "key6", guavaCache) + Show.anyShow().print("Before cache invalidated: ") + Show.anyShow().println(guavaCache.asMap().entries) + Assertions.assertEquals("4", result4) + Assertions.assertEquals("5", result5) + Assertions.assertEquals("6", result6) + Thread.sleep(Duration.ofSeconds(4).toMillis()) + Assertions.assertNull(guavaCache.getIfPresent("key5"), "The value of Guava cache map is supposed to be null") + Show.anyShow().print("After cache invalidated: ") + Show.anyShow().println(guavaCache.asMap().entries) + } + + @Test + fun testComputeAndHandleException() { + val compute = ThrowExceptionFunction { value: Int -> (1 / value).toDouble() } + val handleException = Function { e: Exception -> + log.warn("Exception found. ${e.message}. Returning default value…") + 0.0 + } + val result1 = computeAndHandleException(compute, 1, handleException) + val result2 = computeAndHandleException(compute, 0, handleException) + log.info("result1 = {}, result2 = {}", result1, result2) + Assertions.assertEquals(0.0, result2) + } + + @Test + fun testComputeOrGetDefault() { + val compute = ThrowExceptionFunction { value: Int? -> (1 / value!!).toDouble() } + val result = computeOrGetDefault(compute, null, 0.0) + log.info("computeOrGetDefault result = {}", result) + Assertions.assertEquals(0.0, result) + } + + @Test + fun testLogFunction() { + val compute = Function { value: Int -> + try { + Thread.sleep(Duration.ofSeconds(value.toLong()).toMillis()) + } catch (ignored: InterruptedException) { + } + "Hello, world!" + } + logFunction(compute, 2, this.javaClass.simpleName) + } + + @Test + fun tesRetryFunction() { + val counter = AtomicInteger() + val compute = ThrowExceptionRunnable { + log.info("Function `compute` called at {} time(s)", counter.get() + 1) + counter.getAndIncrement() + throw IllegalStateException("Oops! Somehow, the code throws an exception") + } + assertThrows(RuntimeException::class.java) { retryFunction(compute, 5) } + val compute2 = Function { value: Int -> 1 + value } + val result = retryFunction(compute2, -1, { integer: Int -> integer == 0 }, 3) + Assertions.assertEquals(0, result) + assertThrows( + IllegalStateException::class.java + ) { retryFunction(compute2, 1, Predicate { integer: Int -> integer == 0 }, 3) } + } +} diff --git a/spring-cloud-starter/src/test/java/com/jmsoftware/maf/springcloudstarter/FunctionalInterfaceTests.java b/spring-cloud-starter/src/test/java/com/jmsoftware/maf/springcloudstarter/FunctionalInterfaceTests.java deleted file mode 100644 index fd675d93..00000000 --- a/spring-cloud-starter/src/test/java/com/jmsoftware/maf/springcloudstarter/FunctionalInterfaceTests.java +++ /dev/null @@ -1,152 +0,0 @@ -package com.jmsoftware.maf.springcloudstarter; - -import cn.hutool.core.util.StrUtil; -import com.google.common.cache.CacheBuilder; -import com.google.common.collect.Maps; -import com.jmsoftware.maf.springcloudstarter.function.functionalinterface.ThrowExceptionFunction; -import com.jmsoftware.maf.springcloudstarter.function.functionalinterface.ThrowExceptionRunnable; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import lombok.val; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; - -import java.time.Duration; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.function.Function; - -import static com.jmsoftware.maf.springcloudstarter.function.BooleanCheck.requireAllTrue; -import static com.jmsoftware.maf.springcloudstarter.function.BooleanCheck.requireTrue; -import static com.jmsoftware.maf.springcloudstarter.function.Cache.cacheFunction; -import static com.jmsoftware.maf.springcloudstarter.function.ExceptionHandling.computeAndHandleException; -import static com.jmsoftware.maf.springcloudstarter.function.ExceptionReturnDefault.computeOrGetDefault; -import static com.jmsoftware.maf.springcloudstarter.function.FunctionLog.logFunction; -import static com.jmsoftware.maf.springcloudstarter.function.Retry.retryFunction; -import static fj.Show.anyShow; - -/** - * FunctionalInterfaceTests - * - * @author @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 9/28/2021 12:46 PM - * @version 1.0 - * @since
Sep 28, 2021
- */ -@Slf4j -class FunctionalInterfaceTests { - /** - * Test require true. - */ - @Test - @SuppressWarnings("ConstantConditions") - void testRequireTrue() { - Assertions.assertThrows( - IllegalArgumentException.class, - () -> requireTrue(1 != 1, anotherBoolean -> log.info("aBoolean = {}", anotherBoolean)) - .orElseThrow(() -> new IllegalArgumentException("aBoolean is expected to be true")), - "requireTrue doesn't throws exception" - ); - - Assertions.assertThrows( - IllegalArgumentException.class, - () -> requireAllTrue(1 != 1, 2 == 2, 3 == 3) - .orElseThrow(() -> new IllegalArgumentException("Boolean array is expected to be all true")), - "requireTrue doesn't throws exception" - ); - } - - /** - * Test cache function. - */ - @Test - @SneakyThrows - void testCacheFunction() { - val cacheMap = Maps.newHashMap(); - cacheMap.put("key1", "1"); - cacheMap.put("key2", "2"); - final Function stringProcess = input -> { - log.info("No cache return value found. input: {} Re-calculating…", input); - return StrUtil.subSuf(input, 3); - }; - val result1 = cacheFunction(stringProcess, "key1", cacheMap); - val result2 = cacheFunction(stringProcess, "key2", cacheMap); - val result3 = cacheFunction(stringProcess, "key3", cacheMap); - Assertions.assertEquals("1", result1); - Assertions.assertEquals("2", result2); - Assertions.assertEquals("3", result3); - Assertions.assertEquals(3, cacheMap.size()); - - val guavaCache = CacheBuilder - .newBuilder() - .maximumSize(2) - .expireAfterWrite(Duration.ofSeconds(3)) - .removalListener(notification -> log.info("Removed cache: {}", notification)) - .build(); - guavaCache.put("key4", "4"); - guavaCache.put("key5", "5"); - val result4 = cacheFunction(stringProcess, "key4", guavaCache); - val result5 = cacheFunction(stringProcess, "key5", guavaCache); - val result6 = cacheFunction(stringProcess, "key6", guavaCache); - anyShow().print("Before cache invalidated: "); - anyShow().println(guavaCache.asMap().entrySet()); - Assertions.assertEquals("4", result4); - Assertions.assertEquals("5", result5); - Assertions.assertEquals("6", result6); - Thread.sleep(Duration.ofSeconds(4).toMillis()); - Assertions.assertNull(guavaCache.getIfPresent("key5"), "The value of Guava cache map is supposed to be null"); - anyShow().print("After cache invalidated: "); - anyShow().println(guavaCache.asMap().entrySet()); - } - - @Test - void testComputeAndHandleException() { - final ThrowExceptionFunction compute = value -> (double) (1 / value); - final Function handleException = e -> { - log.warn("Exception found. {}. Returning default value…", e.getMessage()); - return 0D; - }; - val result1 = computeAndHandleException(compute, 1, handleException); - val result2 = computeAndHandleException(compute, 0, handleException); - log.info("result1 = {}, result2 = {}", result1, result2); - Assertions.assertEquals(0D, result2); - } - - @Test - void testComputeOrGetDefault() { - final ThrowExceptionFunction compute = value -> (double) (1 / value); - val result = computeOrGetDefault(compute, null, 0D); - log.info("computeOrGetDefault result = {}", result); - Assertions.assertEquals(0D, result); - } - - @Test - void testLogFunction() { - final Function compute = value -> { - try { - Thread.sleep(Duration.ofSeconds(value).toMillis()); - } catch (InterruptedException ignored) { - } - return "Hello, world!"; - }; - logFunction(compute, 2, this.getClass().getSimpleName()); - } - - @Test - void tesRetryFunction() { - val counter = new AtomicInteger(); - final ThrowExceptionRunnable compute = () -> { - log.info("Function `compute` called at {} time(s)", (counter.get() + 1)); - counter.getAndIncrement(); - // Somehow, the code throws an exception - throw new IllegalStateException("Oops! Somehow, the code throws an exception"); - }; - Assertions.assertThrows(RuntimeException.class, () -> retryFunction(compute, 5)); - - final Function compute2 = value -> 1 + value; - final var result = retryFunction(compute2, -1, integer -> integer.equals(0), 3); - Assertions.assertEquals(0, result); - Assertions.assertThrows( - IllegalStateException.class, - () -> retryFunction(compute2, 1, integer -> integer.equals(0), 3) - ); - } -} diff --git a/spring-cloud-starter/src/test/java/com/jmsoftware/maf/springcloudstarter/FunctionalJavaTests.java b/spring-cloud-starter/src/test/java/com/jmsoftware/maf/springcloudstarter/FunctionalJavaTests.java deleted file mode 100644 index fb2649e5..00000000 --- a/spring-cloud-starter/src/test/java/com/jmsoftware/maf/springcloudstarter/FunctionalJavaTests.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.jmsoftware.maf.springcloudstarter; - -import cn.hutool.json.JSONUtil; -import lombok.extern.slf4j.Slf4j; -import lombok.val; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; - -import static fj.Show.*; -import static fj.data.List.list; - -/** - *

FunctionalJavaTests

- *

- * Change description here. - * - * @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com, 9/28/21 11:00 PM - **/ -@Slf4j -class FunctionalJavaTests { - @Test - void testListMap() { - val arraylist = list(1, 2, 3).map(i -> i + 42); - stringShow.println("Show arraylist in for-each loop:"); - for (Integer integer : arraylist) { - intShow.println(integer); - } - stringShow.print("listShow: "); - listShow(intShow).println(arraylist); - log.info("Serialized JSON array of arraylist: {}", JSONUtil.parse(arraylist)); - Assertions.assertEquals(45, arraylist.index(2)); - } -} diff --git a/spring-cloud-starter/src/test/java/com/jmsoftware/maf/springcloudstarter/FunctionalJavaTests.kt b/spring-cloud-starter/src/test/java/com/jmsoftware/maf/springcloudstarter/FunctionalJavaTests.kt new file mode 100644 index 00000000..b11d3f5a --- /dev/null +++ b/spring-cloud-starter/src/test/java/com/jmsoftware/maf/springcloudstarter/FunctionalJavaTests.kt @@ -0,0 +1,37 @@ +package com.jmsoftware.maf.springcloudstarter + +import cn.hutool.json.JSONUtil +import com.jmsoftware.maf.common.util.logger +import fj.Show +import fj.data.List +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.parallel.Execution +import org.junit.jupiter.api.parallel.ExecutionMode + +/** + * # FunctionalJavaTests + * + * Change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/16/22 10:28 AM + */ +@Execution(ExecutionMode.CONCURRENT) +internal class FunctionalJavaTests { + companion object { + var log = logger() + } + + @Test + fun testListMap() { + val arraylist = List.list(1, 2, 3).map { i: Int -> i + 42 } + Show.stringShow.println("Show arraylist in for-each loop:") + for (integer in arraylist) { + Show.intShow.println(integer) + } + Show.stringShow.print("listShow: ") + Show.listShow(Show.intShow).println(arraylist) + log.info("Serialized JSON array of arraylist: ${JSONUtil.parse(arraylist)}") + assertEquals(45, arraylist.index(2)) + } +} diff --git a/spring-cloud-starter/src/test/java/com/jmsoftware/maf/springcloudstarter/Slf4jTests.kt b/spring-cloud-starter/src/test/java/com/jmsoftware/maf/springcloudstarter/Slf4jTests.kt new file mode 100644 index 00000000..ea2a441b --- /dev/null +++ b/spring-cloud-starter/src/test/java/com/jmsoftware/maf/springcloudstarter/Slf4jTests.kt @@ -0,0 +1,27 @@ +package com.jmsoftware.maf.springcloudstarter + +import com.jmsoftware.maf.common.util.logger +import com.jmsoftware.maf.springcloudstarter.function.lazyDebug +import org.junit.jupiter.api.Assertions +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.parallel.Execution +import org.junit.jupiter.api.parallel.ExecutionMode + +/** + * # Slf4jTests + * + * Description: Slf4jTests, change description here. + * + * @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/16/22 10:29 AM + */ +@Execution(ExecutionMode.CONCURRENT) +internal class Slf4jTests { + companion object { + private val log = logger() + } + + @Test + fun lazyDebugTest() { + Assertions.assertDoesNotThrow { lazyDebug(log) { "Hello World! From lazyDebug test." } } + } +} diff --git a/tweets/kotlin-migration-tweet-apr-17-2022.tweet b/tweets/kotlin-migration-tweet-apr-17-2022.tweet new file mode 100644 index 00000000..9062ab81 --- /dev/null +++ b/tweets/kotlin-migration-tweet-apr-17-2022.tweet @@ -0,0 +1,3 @@ +MAF now has been migrated to Kotlin and Java 17 ☕️, ready to upgrade to Spring Boot 3. + +https://github.com/johnnymillergh/muscle-and-fitness-server/releases/tag/0.0.9 diff --git a/universal-ui/pom.xml b/universal-ui/pom.xml index e9b59132..5474e6c4 100644 --- a/universal-ui/pom.xml +++ b/universal-ui/pom.xml @@ -11,7 +11,7 @@ muscle-and-fitness-server com.jmsoftware.maf - 0.0.8.1 + 0.0.9