This tool allows you to quickly build your weightlifting programs, ensure you have proper weekly volume per muscle group, and balance it with the time you spend in a gym. You can build multi-week programs, plan your mesocycles, deload weeks, testing 1RM weeks, and see the weekly undulation of volume and intensity of each exercise on a graph.
Set the program name, create weeks and days, type the list of exercises for each day, putting each exercise on a new line, along with the number of sets and reps after slash (
/
) character, like this:
Squat /3x3-5
Romanian Deadlift /3x8
Autocomplete will help you with the exercise names. You can also create custom exercises if they're missing in the library.
On the right you'll see Weekly Stats, where you can see the number of sets per week per muscle group, whether you're in the recommended range (indicated by color), strength/hypertrophy split, and if you hover a mouse over the numbers - you'll see what exercises contribute to that number, and how much.
The exercise syntax supports RPEs , percentage of 1RM, rest timers, various progressive overload types, etc. Read more about the features in the docs!
When you're done, you can convert this program to Liftosaur program, and run what you planned in the gym, using the Liftosaur app!
To use this program:
Install Liftosaur app
Copy the link to this program by clicking on below
Import the link in the app, on the Choose Program screen.
03:55
999
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
/// This program is based on the RP Hypertrophy program designed by KillerK009
/// All coding and development work is credit to him
/// The exercises presented are based on Jeff Nippard's Hypertrophy PPL program
/// If you like what's here, please support KillerK009 https://ko-fi.com/killerkode
/// And Jeff Nippard https://jeffnippard.com/
/// If you are UNFAMILIAR with Renaissance Periodization style of training,
/// it is important to familiarize yourself with that style before beginning.
/// There are some important elements, such as how to rate difficulty, and WHAT
/// rating difficulty actually does. Beginning this program without an understanding
/// of the RP way of training will result in poor results.
/// Many of the exercises contained within this program have very specific ROM requirements
/// as they are designed to target specific muscles. Purchasing JN's program is the
/// BEST way to ensure you do these exercises correctly. His program materials contain
/// a ton of great information about each exercise, including clear and concise demo
/// videos. As they are unlisted on YouTube, and only for paid supporters, they
/// are not included here. However, there are some cues and tips.
///***Muscle Group IDs***/
/// 01 => Chest
/// 02 => Triceps
/// 03 => Back & Rear Delts
/// 04 => Biceps
/// 05 => Calves
/// 06 => Quads
/// 07 => Hamstrings
/// 08 => Front & Side Delts
/// 09 => Abs
/// 10 => Glutes
/// Full tag is created by combining digits from:
/// Day (1-2 digits) & Muscle Group ID (2-digits) & Index (2 digits, 0-based)
{"exportedProgram":{"customExercises":{"nnljexjn":{"name":"Lat Pull-around, Cable","types":["pull"],"id":"nnljexjn","isDeleted":false,"meta":{"synergistMuscles":["Biceps Brachii","Deltoid Posterior","Trapezius Lower Fibers"],"targetMuscles":["Latissimus Dorsi"],"bodyParts":[],"sortedEquipment":[]}},"pwalaogx":{"name":"Neck Extension, Plate","types":["core"],"id":"pwalaogx","isDeleted":false,"meta":{"synergistMuscles":[],"targetMuscles":["Splenius"],"bodyParts":[],"sortedEquipment":[]}}},"program":{"id":"ecjofyff","name":"Jeff Nippardish Hypertrophy v3: 8-day PPL","url":"","author":"","shortDescription":"","description":"","nextDay":1,"weeks":[],"isMultiweek":false,"days":[{"id":"nwtvleso","name":"Day 1","exercises":[]}],"exercises":[],"tags":[],"deletedDays":[],"deletedWeeks":[],"deletedExercises":[],"clonedAt":1732810180147,"planner":{"name":"Jeff Nippardish Hypertrophy v3: 8-day PPL","weeks":[{"name":"Start","days":[{"name":"Day 1: Pull 1 (Lats)","exerciseText":"/// This program is based on the RP Hypertrophy program designed by KillerK009\n/// All coding and development work is credit to him\n/// The exercises presented are based on Jeff Nippard's Hypertrophy PPL program\n/// If you like what's here, please support KillerK009 https://ko-fi.com/killerkode\n/// And Jeff Nippard https://jeffnippard.com/\n\n/// If you are UNFAMILIAR with Renaissance Periodization style of training,\n/// it is important to familiarize yourself with that style before beginning.\n/// There are some important elements, such as how to rate difficulty, and WHAT\n/// rating difficulty actually does. Beginning this program without an understanding\n/// of the RP way of training will result in poor results.\n\n/// Many of the exercises contained within this program have very specific ROM requirements\n/// as they are designed to target specific muscles. Purchasing JN's program is the\n/// BEST way to ensure you do these exercises correctly. His program materials contain\n/// a ton of great information about each exercise, including clear and concise demo\n/// videos. As they are unlisted on YouTube, and only for paid supporters, they \n/// are not included here. However, there are some cues and tips.\n\n///***Muscle Group IDs***/\n/// 01 => Chest\n/// 02 => Triceps\n/// 03 => Back & Rear Delts\n/// 04 => Biceps\n/// 05 => Calves\n/// 06 => Quads\n/// 07 => Hamstrings\n/// 08 => Front & Side Delts\n/// 09 => Abs\n/// 10 => Glutes\n\n/// Full tag is created by combining digits from:\n/// Day (1-2 digits) & Muscle Group ID (2-digits) & Index (2 digits, 0-based)\n/// to create 5-6 digit long unique tag.\n///\n/// Ex:\n/// 3 Quads exercises on day 4 would have tags:\n/// 40600, 40601, 40602\n/// 4 => 4th day of week\n/// 06 => Quads Muscle Group ID\n/// 00, 01, 02 => Index of exercise for muscle group in that day\n\n///*****PROGRAM LOGIC*****///\ntLogic: Squat[1-3] / used: none / 10+x5 / 86.53% / warmup: 1x10 50%, 1x6 75%, 1x3 110% / update: custom() {~\n /// Minimum reps for any set to be in the hypertrophy range (based on RP\n /// guidelines of about 5-30 reps between 3-0 RIR for hypertrophy as of\n /// early 2024)\n var.MIN_HYP_REPS = 5\n\n /// Automatic down sets variables\n var.AUTO_DOWN_SET_MODE_DISABLED = 0 /// Don't create any down sets\n var.AUTO_DOWN_SET_MODE_HYP = 1 /// Create when near bottom of hypertrophy rep range (defined as var.MIN_HYP_REPS+1)\n var.AUTO_DOWN_SET_MODE_TARGET = 2 /// Create when at bottom of target rep range (i.e. state.targetMinReps)\n var.AUTO_DOWN_SET_PERCENTAGE = 0.80 /// Percentage of last completed set working weight to use for down set\n\n /// Bilateral exercise (both sides at the same time)\n var.TYPE_BILATERAL = 1\n /// Unilateral exercise (left/right side done as separate sets)\n var.TYPE_UNILATERAL = 2\n\n /// Minimum increment value that will be treated as a fixed weight rather than percentage\n var.FIXED_WEIGHT_INCR_MIN = 0.25\n\n /// Disable progression and match or beat system, just repeat targets\n var.PROG_TYPE_NONE = 0\n /// Linear - Add weight each week keeping a fixed single rep target after\n /// week 1, unless at the minimum for hypertrophy, in that case add 1 rep.\n var.PROG_TYPE_WEIGHT = 1\n /// Double - Add reps until hitting the top of the target rep range, then\n /// add weight and reset rep targets to the original range\n var.PROG_TYPE_REPS = 2\n\n /// Number of expected accumulation weeks to estimate RPE/RIR progression\n var.ACCUM_WEEKS = 4\n /// Week number to determine when progression vs deload logic applies (should\n /// be last week number defined in program)\n var.DELOAD_WEEK = 3\n\n /// Target RPE for week 1 of the program\n var.RPE_START = 7\n /// Target RPE for final accumulation week\n var.RPE_END = 10\n /// How much RPE should increase each week to reach RPE_END by final accumulation week\n var.RPE_INCR = (var.RPE_END-var.RPE_START)/(var.ACCUM_WEEKS-1)\n /// RPE value for deload and triggers recovery session logic to update all sets in that session\n var.RPE_RECOVERY = 3\n\n /// Prepare workout and handle set progression\n if (setIndex == 0) {\n /// Always start mesocycle with defined number of sets and values\n if (week == 1) {\n numberOfSets = state.startNumSets*state.type\n if (numberOfSets > 0) {\n /// Make all sets AMRAP during week 1 since we're targetting a rep range & RIR, keeping all other values the same\n sets(1, state.type, state.targetMinReps, state.targetMaxReps, 1, weights[1], 0, var.RPE_START, 0)\n sets(state.type+1, numberOfSets, var.MIN_HYP_REPS, var.MIN_HYP_REPS, 1, weights[1], 0, var.RPE_START, 0)\n }\n }\n /// Only do set progression during accumulation weeks\n else if (week < var.DELOAD_WEEK) {\n var.numSets = state.numSets\n if (state.progressType != var.PROG_TYPE_NONE) {\n var.numSets = (state.numSets + state.setsModifier)*state.type /// Double for unilateral exercises\n }\n /// Liftosaur doesn't like setting numberOfSets to 0 (causes errors) so the minimum sets must be 1 or 2\n /// depending on if the exercise is bilateral or unilateral\n var.numSets = var.numSets > 0 ? var.numSets : state.type\n numberOfSets = var.numSets\n \n var.rpe = 0\n var.amrap = 0\n /// Check if sets were added since last time\n if (numberOfSets/state.type > state.numSets) {\n /// Offset RPE by 1 increment since sets have increased and we don't want to progress sets & proximity\n /// to failure at the same time per critiques of RP methodolgy from sources like Eric Helms and MASS\n var.rpe = state.targetRpe - var.RPE_INCR\n var.rpe = var.rpe >= var.RPE_START ? var.rpe : var.RPE_START\n var.amrap = 1\n \n /// Undo previous weight progression when adding sets and doing linear progression so multiple variables\n /// are not progressing at once. Only reverse if we increased by a single increment over last time.\n if (state.progressType == var.PROG_TYPE_WEIGHT) {\n /// Handle reversing fixed increments\n if (state.increment >= var.FIXED_WEIGHT_INCR_MIN) {\n if (state.lastIncrement == state.increment) {\n weights -= state.lastIncrement\n }\n }\n /// Handle reversing percentage based increments\n else if (state.increment > 0) {\n var.lastWeight = weights[1] - state.lastIncrement\n var.lastWeightIncremented = roundWeight(var.lastWeight + (var.lastWeight*state.increment))\n if (var.lastWeightIncremented == weights[1]) {\n weights -= state.lastIncrement\n }\n }\n }\n\n /// Configure sets added today as RPE target & AMRAP and keeping weight of previous last set\n /// sets(fromIndex, toIndex, minReps, maxReps, isAmrap, weight, timer, rpe, shouldLogRpe)\n sets((state.numSets*state.type)+1, numberOfSets, var.MIN_HYP_REPS, var.MIN_HYP_REPS, 1, weights[state.numSets*state.type], 0, var.rpe, 0) \n }\n /// First set is a rep range (not just single rep increase from double progression) so show the RPE targets\n /// and make it prompt for completed reps\n else if (numberOfSets > 0 && minReps[1] < reps[1]-1) {\n var.rpe = state.targetRpe\n var.amrap = 1\n }\n\n /// Configure pre-existing sets in case we are targetting an RPE today instead of just match/beat previous session.\n /// Useful as a signal that I shouldn't just hit rep targets today and instead try to focus on hitting RPE/RIR\n for (var.set in reps) {\n if (var.set <= (state.numSets*state.type)) {\n sets(var.set, var.set, minReps[var.set], reps[var.set], var.amrap, weights[var.set], 0, var.rpe, 0)\n }\n }\n }\n /// Deload week\n else {\n var.deloadSets = floor((state.numSets*state.type) * state.deloadSetsRatio)\n /// Ensure we have an even number of deload sets for unilateral exercises (erring on side of doing less)\n if (var.deloadSets % state.type != 0) {\n var.deloadSets = var.deloadSets - 1\n }\n /// Ensure deloadSets is not 0 or negative (Liftosaur doesn't like that)\n if (var.deloadSets <= 0) {\n var.deloadSets = state.type\n }\n numberOfSets = var.deloadSets\n }\n }\n else if (week < var.DELOAD_WEEK) {\n /// Check if recovery session is being done/started by having marked a set as low\n /// RPE, and if so, we want to use that same low weight and RPE for the rest of the\n /// session\n if (RPE[setIndex] > 0 && RPE[setIndex] <= var.RPE_RECOVERY) {\n RPE = RPE[setIndex]\n weights = weights[setIndex]\n }\n /// Create or undo automatic down sets if we still have some sets remaining to do. Only do this\n /// on even numbered sets if exercise is unilateral (so we don't switch weight having only done\n /// 1 side) and if we were withing the target reps on the last done set\n else if (state.autoDownSetMode != var.AUTO_DOWN_SET_MODE_DISABLED && numberOfSets >= setIndex+state.type && setIndex % state.type == 0\n && completedReps[setIndex] >= minReps[setIndex]) {\n var.autoDownSetRepCutoff = state.autoDownSetMode == var.AUTO_DOWN_SET_MODE_HYP ? var.MIN_HYP_REPS+1 : state.targetMinReps\n /// If last completed set was at or below the minimum rep cut-off then drop weight of all following sets\n if (completedReps[setIndex] <= var.autoDownSetRepCutoff) {\n for (var.set in weights) {\n /// Only drop weight for remaining sets if weight is same as last completed set\n /// as we may have already dropped weight in previous weeks\n if (var.set > setIndex && weights[var.set] == weights[setIndex]) {\n weights[var.set] = weights[var.set] * var.AUTO_DOWN_SET_PERCENTAGE\n }\n }\n }\n /// If next set is a down set but we have room to drop reps and remain in the desired rep zone make the\n /// weight the same as the last completed set and add an RPE/RIR target (i.e. undo down set)\n else if (weights[setIndex+1] < weights[setIndex]) {\n sets(setIndex+1, setIndex+state.type, var.MIN_HYP_REPS, completedReps[setIndex], 1, weights[setIndex], 0, state.targetRpe, 0)\n }\n }\n }\n~} / progress: custom(increment: 5lb, progressType: 1, targetMinReps: 5, targetMaxReps: 10, startNumSets: 2, type: 1, deloadWeightRatio: 0.5, deloadRepsRatio: 1, deloadSetsRatio: 1, rating: 0, rateGroup: 0, ratingIndex: 0, numRatingExercises: 0, lastIncrement: 0lb, numSets: 1, setsModifier: 0, mesoWeek: 1, targetRpe: 7, autoDownSetMode: 1) {~\n///***PARAMETERS***///\n /// increment: weight to progress by when targets are hit depending on progressType. Treated as fixed lb/kg value if at least FIXED_WEIGHT_INCR_MIN or higher, otherwise, decimal percentage. Always include lb/kg label even when setting a percentage.\n /// progressType: 0 = none, 1 = linear progression (add increment each time targets are hit), 2 = double progression (add reps until hitting top of rep range, then increment)\n /// targetMinReps: minimum target reps for week 1 set 1 (following sets can drop below this)\n /// targetMaxReps: max target reps for week 1 set 1\n /// startNumSets: how many sets to start with in week 1 (unilateral exercises will show double this amount)\n /// type: movement lateral type. 1 = bilateral, 2 = unilateral. Unilateral exercises will display double numSets in workout, 1 set per side.\n /// deloadWeightRatio: percent to change weight by for deload week (decimal 0 to 1)\n /// deloadRepsRatio: percent to change reps by for deload week (decimal 0 to 1)\n /// deloadSetsRatio: percent to change number of sets by for deload week (decimal 0 to 1)\n /// rating: set progression rating, prompted for during workout. Evalute recovery from previous session & performance/workload today and set value to add/subtract sets to exercises for the same muscle group from previous session (typically -2 to 2). 0 keeps set volume the same.\n /// rateGroup: target group of tagged exercises to apply rating. Typically 3-4 digits: first 1-2 are day in week, last 2 are muscle group ID.\n /// numRatingExercises: how many exercises are in that muscle group target where rating applies (i.e. basically how many exercises for a given muscle group are in the preceding session and have the rateGroup tag prefix)\n /// ratingIndex: index of exercise in group to apply next rating to (combined with rateGroup to create full tag, then gets incremented after applying rating so rating may apply to different exercise next time)\n /// lastIncrement: how much weight was changed after completing the last working session (automatically set by code and used in some calculations to undo progression when adding sets)\n /// numSets: last completed number of sets in previous working session, basis for how many sets to do again next time\n /// setsModifier: number of sets to add/remove relative to last done number of sets (numSets). Usually updated via code based on the in-workout rating prompt during the following session in a microcycle which hits the same muscle group to modify volume for future sessions.\n /// mesoWeek: current week in mesocycle\n /// targetRpe: underlying estimated RPE/RIR target for current working week based on meso length and start/end RPE targets (mainly displayed when new sets are added or rep ranges are used)\n /// autoDownSetMode: automatically reduce weight on remaining sets (i.e. create down sets based on var.AUTO_DOWN_SET_PERCENTAGE) when last completed set is at or below certain reps: 0 => disabled, 1 => hypertrophy rep range (MIN_HYP_REPS + 1), 2 => target rep range minimum (state.targetMinReps)\n\n///***CONSTANTS***///\n /// Minimum reps for any set to be in the hypertrophy range (based on RP\n /// guidelines of about 5-30 reps between 3-0 RIR for hypertrophy as of\n /// early 2024)\n var.MIN_HYP_REPS = 5\n \n /// Disable progression and match or beat system, just repeat targets\n var.PROG_TYPE_NONE = 0\n /// Linear - Add weight each week keeping a fixed single rep target after\n /// week 1, unless at/under the minimum for hypertrophy, in that case add\n /// reps.\n var.PROG_TYPE_WEIGHT = 1\n /// Double - Add reps until hitting the top of the target rep range, then\n /// add weight and reset rep targets to the original range\n var.PROG_TYPE_REPS = 2\n\n /// Bilateral exercise (both sides at the same time)\n var.TYPE_BILATERAL = 1\n /// Unilateral exercise (left/right side done as separate sets)\n var.TYPE_UNILATERAL = 2\n\n /// Maximum weight increment value that will be treated as a percentage rather than fixed weight\n var.FIXED_WEIGHT_INCR_MIN = 0.25\n\n /// Number of expected accumulation weeks to control RPE/RIR progression. Can\n /// be different than number of weeks defined in the program to allow smaller\n /// programs where weeks are manually repeated or larger programs to allow\n /// autoregulating mesocycle length while still having weeks auto-progress.\n var.ACCUM_WEEKS = 4\n /// Week number to determine when progression vs deload logic applies (should\n /// be same as number of weeks defined in program since deload should be the\n /// final week)\n var.DELOAD_WEEK = 3\n\n /// Target RPE for week 1 of the program\n var.RPE_START = 7\n /// Target RPE for final accumulation week\n var.RPE_END = 10\n /// How much RPE should increase each week to reach RPE_END by final accumulation week\n var.RPE_INCR = (var.RPE_END-var.RPE_START)/(var.ACCUM_WEEKS-1)\n /// RPE that indicates a recovery or deload session/set\n var.RPE_RECOVERY = 3\n\n /// Defines the threshold where we consider weights to be used during deload\n /// still \"heavy\" and thus should do logic to update each deload set weight\n ///\n /// Typically we just want to use the same weight for all deload sets if the\n /// weight is reduced substantially for deload, but if deload weight is still\n /// pretty heavy, and working weights bewteen sets were different during\n /// accumulation, we probably also want to use different weights in each deload\n /// set.\n var.DELOAD_WEIGHT_RATIO_HEAVY = 0.8\n\n///***Useful Variables***///\n /// Ensure type is valid\n state.type = state.type == var.TYPE_BILATERAL || state.type == var.TYPE_UNILATERAL ? \n state.type : var.TYPE_BILATERAL\n\n /// Ensure we have a non-negative starting number of sets\n if (state.startNumSets < 0) {\n state.startNumSets = state.type\n }\n\n /// Ensure the progress type is valid, default is weight progression\n state.progressType = state.progressType == var.PROG_TYPE_NONE\n || state.progressType == var.PROG_TYPE_WEIGHT || state.progressType == var.PROG_TYPE_REPS ?\n state.progressType : var.PROG_TYPE_WEIGHT\n\n /// Indicates if current day was for recovery\n var.recoveryDay = numberOfSets <= 0 || (RPE[numberOfSets] > 0 && RPE[numberOfSets] <= var.RPE_RECOVERY)\n\n /// Indicates if current day was a real working day that may produce progression\n var.progressDay = !var.recoveryDay && state.progressType != var.PROG_TYPE_NONE\n && completedReps[1] > 0\n\n /// If it's program week 1, and this isn't the first time we're doing the program,\n /// we may have skipped deload so ensure variables are set to restart progression\n if (week == 1) {\n state.mesoWeek = 1\n state.lastIncrement = 0lb\n state.ratingIndex = 0\n if (var.progressDay) {\n state.startNumSets = numberOfSets/state.type\n }\n state.numSets = state.startNumSets\n state.setsModifier = 0\n state.targetRpe = var.RPE_START\n }\n\n///***Now we do progression and setup future workouts/meso***///\n\n /// Still in acumulation weeks\n if (week < var.DELOAD_WEEK) {\n /// Ensure target RPE for this session is set correctly based on if sets were added\n /// compared to last time\n state.targetRpe = numberOfSets/state.type <= state.numSets ? state.targetRpe : state.targetRpe - var.RPE_INCR\n\n var.sumLastReps = 0 /// sum of minimum rep targets for same num sets as last time (i.e last session performance or target range)\n var.sumCompletedReps = 0 /// sum of completed reps today for same num sets as last time\n var.newSetsAboveMin = 1 /// signifies all new sets added today completed reps above minimum reps\n for (var.set in completedReps) {\n /// Compare sets from previous session to todays performance to determine if we\n /// at least matched performance/volume in those initial pre-existing sets\n if (var.set <= state.numSets) {\n var.sumLastReps = var.sumLastReps + minReps[var.set]\n var.sumCompletedReps = var.sumCompletedReps + completedReps[var.set]\n }\n /// Check that newly added sets were above the minium reps\n else if (completedReps[var.set] < minReps[var.set]) {\n var.newSetsAboveMin = 0\n }\n }\n\n /// Signifies if rep targets were hit in this session.\n ///\n /// We compare sums to allow missing the rep target on one set but then make up for\n /// it in another set so long as it balances out (i.e. set 1 did 2 LESS reps than\n /// target, but then set 2 did 2+ MORE reps than target which balances it out and we\n /// still should progress as volume should be about the same)\n var.hitReps = completedReps[1] >= state.targetMinReps\n && var.sumCompletedReps >= var.sumLastReps && var.newSetsAboveMin\n\n /// Potentially change weight by more than 1 increment in a few situations where\n /// we will set this value to indicate the reason and number of extra increments.\n /// <= -1 => weight was too heavy, so decreased by 1 or more increments\n /// == 0 => weight was inappropriate, but we manually corrected by last set today\n /// == 1 => weight was appropriate, normal progression logic applies\n /// >= 2 => weight was too light, so increased by multiple increments\n var.incrementModifier = 1\n \n /// Indicates if the first set progressed by weight or reps so later sets can\n /// follow. Will be modified in main progression logic loop below\n var.firstSetProgType = state.progressType\n \n /// Only record/update program if this was not a recovery session/set\n if (!var.recoveryDay) {\n /// Loop through sets and do main progression logic\n for (var.set in completedReps) {\n var.weight = weights[var.set]\n var.reps = reps[var.set]\n var.minReps = minReps[var.set]\n /// Save values from today before incrementing for setting up deload later\n var.todaysWeight = weights[var.set]\n var.todaysReps = var.reps\n\n /// Do unique logic for set 1\n if (var.set == 1) { \n if (var.progressDay) {\n /// We didn't hit targets in week 1, weight is too heavy for the desired rep\n /// range for this mesocycle so we need to decrease it\n if (week == 1 && completedReps[var.set] < state.targetMinReps) {\n /// Check if we manually lowered weights in later sets so we can re-use that\n if (weights[numberOfSets] < weights[var.set]) {\n var.weight = weights[numberOfSets]\n var.incrementModifier = 0\n }\n else {\n var.incrementModifier = completedReps[var.set] - state.targetMinReps\n /// Fixed weight increments\n if (state.increment >= var.FIXED_WEIGHT_INCR_MIN) {\n var.weight = weights[var.set] + (var.incrementModifier*state.increment)\n }\n /// Percentage based increments\n else {\n var.weight = weights[var.set] + (weights[var.set]*state.increment)*var.incrementModifier\n }\n }\n }\n else if (var.hitReps) {\n var.reps = completedReps[var.set]\n var.minReps = var.reps\n var.todaysReps = var.reps\n \n /// Linear progression\n if (state.progressType == var.PROG_TYPE_WEIGHT) {\n /// Options for indicating weight was too light and should be adjusted heavier:\n /// 1. Do more reps than the target rep range max\n /// 2. Manually mark as 1.5+ lower RPE than this week's target\n if (var.reps > state.targetMaxReps || (RPE[var.set] > 0 && RPE[var.set] <= state.targetRpe-1.5)) {\n /// Check if we manually adjusted weight in later sets during this workout and\n /// just use the weight from the last set as the new weight for all sets\n if (weights[numberOfSets] > weights[var.set]) {\n var.weight = weights[numberOfSets]\n var.incrementModifier = 0\n }\n /// Otherwise, modify the number of increments we add for next time\n else {\n var.diff = var.reps > state.targetMaxReps ?\n var.reps - state.targetMaxReps : state.targetRpe - RPE[var.set]\n var.incrementModifier = var.diff + 1 /// Add 1 to ensure change larger than 1 increment\n }\n }\n \n /// Only increase weight if we aren't around the minimum reps for hypertrophy\n if (var.reps > var.MIN_HYP_REPS+1) {\n /// Fixed weight increments\n if (state.increment >= var.FIXED_WEIGHT_INCR_MIN) {\n var.weight = var.weight + state.increment*var.incrementModifier\n }\n /// Percentage based increments\n else {\n var.weight = var.weight + (var.weight*state.increment)*var.incrementModifier\n }\n var.firstSetProgType = var.PROG_TYPE_WEIGHT\n }\n /// Otherwise increase reps instead so we have some room to drop reps in\n /// following sets without dropping weight since this is still the 1st set\n else {\n var.reps = var.reps + 1\n var.firstSetProgType = var.PROG_TYPE_REPS\n }\n }\n /// Double progression\n else if (var.reps >= state.targetMaxReps) {\n /// Check if we did way more reps than target double progression range.\n ///\n /// Increase weight by multiple increments if we did 1+ deviation\n /// above max reps based on the target rep range size.\n ///\n /// Ex: Min/Max = 10-15 reps => rep range size = 5, so if you do 5+ more\n /// reps than the max (i.e. 20+ reps), we need to increase weight\n /// by more than 1 increment to likely bring you back to the 10-15 range\n var.repRangeSize = state.targetMaxReps - state.targetMinReps\n if (var.reps >= state.targetMaxReps + var.repRangeSize) {\n var.repsAboveMax = var.reps - state.targetMaxReps\n var.deviations = floor(var.repsAboveMax / var.repRangeSize)\n var.incrementModifier = var.deviations + 1 /// Add 1 to ensure change larger than 1 increment\n }\n \n /// Fixed weight increments\n if (state.increment >= var.FIXED_WEIGHT_INCR_MIN) {\n var.weight = var.weight + state.increment*var.incrementModifier\n }\n /// Percentage based increments\n else {\n var.weight = var.weight + (var.weight*state.increment)*var.incrementModifier\n }\n var.minReps = state.targetMinReps\n var.reps = state.targetMaxReps\n var.firstSetProgType = var.PROG_TYPE_WEIGHT\n }\n else {\n var.reps = var.reps + 1\n var.firstSetProgType = var.PROG_TYPE_REPS\n }\n }\n \n /// Ensure weight is positive, Liftosaur doesn't seem to like negative values\n var.weight = var.weight >= 0lb ? var.weight : 0lb\n \n state.lastIncrement = roundWeight(var.weight) - weights[var.set]\n if (state.lastIncrement < 0) {\n state.lastIncrement = 0lb\n }\n }\n \n /// Default is all sets will use same weight from set 1 and must be bewteen\n /// the minimum hypertrophy range reps up to the target rep range max\n weights = roundWeight(var.weight)\n minReps = var.MIN_HYP_REPS\n reps = state.targetMaxReps\n \n /// Set match or beat targets if weight was appropriate for target reps\n if (var.incrementModifier == 1) {\n minReps[var.set] = var.minReps\n reps[var.set] = var.reps \n }\n /// Otherwise, we've made a larger adjustment to the weight so set 1 uses the target\n /// rep range minimum as the bottom bound\n else {\n minReps[var.set] = state.targetMinReps\n /// Unilateral exercises use a separate set for each side so set 2 is also\n /// the \"first\" set for one side and should be set similarly\n if (state.type == var.TYPE_UNILATERAL && numberOfSets >= 2) {\n minReps[2] = state.targetMinReps\n }\n }\n }\n /// Repeat simpler logic for rest of the sets\n else {\n /// Only calculate changes for secondary sets if we had a normal increment based\n /// on set 1's performance\n if (var.progressDay) {\n if (var.hitReps) {\n var.reps = completedReps[var.set]\n var.minReps = var.reps\n var.todaysReps = var.reps\n \n if ((state.progressType == var.PROG_TYPE_WEIGHT && var.firstSetProgType == var.PROG_TYPE_WEIGHT)\n || var.reps >= state.targetMaxReps || var.firstSetProgType == var.PROG_TYPE_WEIGHT) {\n /// Fixed weight increments\n if (state.increment >= var.FIXED_WEIGHT_INCR_MIN) {\n var.weight = var.weight + state.increment\n }\n /// Percentage based increments\n else {\n var.weight = var.weight + (var.weight*state.increment)\n }\n \n /// If progressing by reps ensure the rep range target is set since weight has changed\n if (state.progressType == var.PROG_TYPE_REPS) {\n /// Unilateral exercise should use target rep range for 2nd set as well, otherwise hypertrophy range\n var.minReps = var.set == 2 && state.type == var.TYPE_UNILATERAL ? state.targetMinReps : var.MIN_HYP_REPS\n var.reps = state.targetMaxReps\n }\n }\n else {\n var.reps = var.reps + 1\n } \n }\n }\n \n var.weight = var.weight >= 0lb ? var.weight : 0lb\n \n /// Override default values set earlier so we can match/beat performance\n if (var.incrementModifier == 1) {\n if (weights[var.set] != weights[1]) {\n weights[var.set] = roundWeight(var.weight)\n }\n minReps[var.set] = var.minReps\n reps[var.set] = var.reps\n }\n \n /// Only set potentially different weight for a deload set if we are still\n /// using heavy weight for deload week. Otherwise, we'll just keep using the\n /// same weight from set 1 for all deload sets to avoid the hassle of changing\n /// weights when it's already pretty light/easy\n var.todaysWeight = state.deloadWeightRatio >= var.DELOAD_WEIGHT_RATIO_HEAVY ?\n weights[var.set] : weights[1]\n }\n\n /// Update deload week based on todays performance if we hit targets in case\n /// we deload early. We update the value for all days rather than just this\n /// day of the week since some exercises may change days during deloads\n if (var.hitReps) {\n weights[var.DELOAD_WEEK:*:*:var.set] = roundWeight(var.todaysWeight * state.deloadWeightRatio)\n minReps[var.DELOAD_WEEK:*:*:var.set] = floor(var.todaysReps * state.deloadRepsRatio)\n reps[var.DELOAD_WEEK:*:*:var.set] = floor(var.todaysReps * state.deloadRepsRatio)\n }\n }\n }\n\n /// Ensure sets modifier is 0 so we don't add sets. Must be done before processing the\n /// rating since you may be rating this same exercise.\n state.setsModifier = 0\n \n if (state.progressType != var.PROG_TYPE_NONE) {\n if (var.progressDay) {\n state.numSets = numberOfSets/state.type\n }\n /// Do set progression if rating and target exercise values are set\n if (state.rating != 0 && state.rateGroup != 0 && state.numRatingExercises != 0) {\n /// Combine group + index to create full unique tag\n var.tag = state.rateGroup*100 + state.ratingIndex\n state[var.tag].setsModifier = state.rating\n state.ratingIndex = (state.ratingIndex + 1) % state.numRatingExercises\n }\n }\n \n /// Calculate weight for start of next meso based on performance achieved today\n /// since we could deload early or do recovery weeks or whatnot and restart a meso\n /// at any time.\n /// Logic here just ensures the weight we pick keeps us in the target rep range\n /// for week 1 of the meso based on the last non-recovery weight and RIR/RPE we\n /// did.\n if (var.progressDay && var.hitReps == 1) { \n /// RIR value where we want to start the meso\n var.startRir = 10 - floor(var.RPE_START)\n /// Based on RPE of set 1 today we can convert to how many reps-in-reserve\n var.rir = 10 - ceil(RPE[1] > 0 ? RPE[1] : state.targetRpe)\n /// Calculate an estimate for maximum number of reps possible at todays weight.\n /// Add 1 rep to assume we adapt and get a little stronger after this session.\n /// i.e. Estimate how many reps would be 0 RIR/failure with todays weight\n var.estMaxRepsAfterRecovering = completedReps[1] + var.rir + 1\n \n /// Determine estimate for how many reps would correspond to the starting RIR\n /// i.e. how many reps would be the target given the RIR we want to start at\n var.startRepEstimate = var.estMaxRepsAfterRecovering - var.startRir\n\n /// Next, based on how many starting reps we estimated, determine how many\n /// increments to modify the weight to keep us within our target rep range\n /// for week 1 set 1.\n var.numIncrements = 0\n \n /// If estimated reps for a starting RIR set with todays weight would be at or higher\n /// than the target max reps we can increase weight to start next meso\n if (var.startRepEstimate >= state.targetMaxReps) {\n /// Linear progression: increase by 1 increment for every rep above the target max\n /// since we assume that every increment drops about 1 rep worth of strength\n if (state.progressType == var.PROG_TYPE_WEIGHT) {\n /// + 1 to ensure we land more inside in the target range and not exactly\n /// at the max reps\n var.numIncrements = (var.startRepEstimate - state.targetMaxReps) + 1\n }\n /// Double progression: just go up by 1 weight increment\n else {\n var.numIncrements = 1\n }\n }\n /// Otherwise, if starting RIR w/todays weight would be below the minimum reps we\n /// need to decrease the weight to ensure we get more reps next time to put us in\n /// the target rep range (numIncrements will be negative)\n else if (var.startRepEstimate < state.targetMinReps) {\n /// Linear progression: Decrease by 1 increment for every rep below the target min\n /// since we assume that every decrement adds about 1 rep worth of strength\n if (state.progressType == var.PROG_TYPE_WEIGHT) {\n var.numIncrements = (var.startRepEstimate - state.targetMinReps)\n }\n /// Double progression: just go down by 1 weight increment\n else {\n var.numIncrements = -1\n }\n }\n\n /// Set starting weight for next meso\n var.weight = roundWeight(weights[1] + var.numIncrements*state.increment)\n weights[1:*:*:*] = var.weight >= 0lb ? var.weight : 0lb\n }\n\n /// Set RPE target for next session\n var.nextRpe = var.progressDay ? state.targetRpe + var.RPE_INCR : state.targetRpe\n var.nextRpe = var.nextRpe <= var.RPE_END ? var.nextRpe : var.RPE_END\n var.nextRpe = var.nextRpe >= var.RPE_START ? var.nextRpe : var.RPE_START\n state.targetRpe = var.nextRpe\n\n state.mesoWeek += 1\n }\n /// Deload week is done, so reset start of meso targets\n else {\n state.mesoWeek = 1\n state.lastIncrement = 0lb\n state.ratingIndex = 0\n state.numSets = state.startNumSets\n state.setsModifier = 0\n state.targetRpe = var.RPE_START\n }\n\n /// Always ensure default state of keeping sets the same for related target exercise(s)\n state.rating = 0\n RPE[var.DELOAD_WEEK:*:*:*] = var.RPE_RECOVERY\n~}\n//Lat Pull-around, cable and wrist aligned in a straight line.\nday1:Lat Pull-around, Cable[1, 1-3] / id: tags(10300) / ...tLogic: Squat / warmup: 1x8 65% / 50lb / update: custom() { ...tLogic: Squat } / progress: custom(increment: 5lb, progressType: 2, targetMinReps: 8, targetMaxReps: 12, startNumSets: 3, type: 2, deloadWeightRatio: 0.6, deloadRepsRatio: 1, deloadSetsRatio: 1, rating: 0, rateGroup: 0, ratingIndex: 0, numRatingExercises: 0, lastIncrement: 0lb, numSets: 1, setsModifier: 0, mesoWeek: 1, targetRpe: 7, autoDownSetMode: 1) { ...tLogic: Squat }\n\n//Wide Grip, don't go too heavy.\nday1: Romanian Deadlift, Barbell[2, 1-3] / id: tags(11000) / ...tLogic: Squat / 125lb / update: custom() { ...tLogic: Squat } / progress: custom(increment: 5lb, progressType: 2, targetMinReps: 4, targetMaxReps: 8, startNumSets: 2, type: 1, deloadWeightRatio: 0.6, deloadRepsRatio: 0.5, deloadSetsRatio: 0.5, rating+: 0, rateGroup: 710, ratingIndex: 0, numRatingExercises: 1, lastIncrement: 0lb, numSets: 1, setsModifier: 0, mesoWeek: 1, targetRpe: 7, autoDownSetMode: 1) { ...tLogic: Squat }\n\n//Flare elbows out at 45deg, squeeze shoulders at the top of each rep. Last set LLP\nday1: Seated Row, Leverage Machine[3, 1-3] / id: tags(10301) / ...tLogic: Squat / warmup: 1x10 50%, 1x5 75% / 30lb / update: custom() { ...tLogic: Squat } / progress: custom(increment: 5lb, progressType: 2, targetMinReps: 6, targetMaxReps: 10, startNumSets: 3, type: 1, deloadWeightRatio: 0.6, deloadRepsRatio: 0.5, deloadSetsRatio: 0.5, rating: 0, rateGroup: 0, ratingIndex: 0, numRatingExercises: 0, lastIncrement: 0lb, numSets: 1, setsModifier: 0, mesoWeek: 1, targetRpe: 7, autoDownSetMode: 1) { ...tLogic: Squat }\n\n//Lean forward to get a big stretch on the lats at the top of the ROM\nday1: Pullover, Barbell[4, 1-3] / id: tags(10302) / ...tLogic: Squat / warmup: 1x8 65% / 85lb / update: custom() { ...tLogic: Squat } / progress: custom(increment: 5lb, progressType: 2, targetMinReps: 10, targetMaxReps: 15, startNumSets: 3, type: 1, deloadWeightRatio: 0.6, deloadRepsRatio: 1, deloadSetsRatio: 1, rating: 0, rateGroup: 0, ratingIndex: 0, numRatingExercises: 0, lastIncrement: 0lb, numSets: 1, setsModifier: 0, mesoWeek: 1, targetRpe: 7, autoDownSetMode: 1) { ...tLogic: Squat }\n\n//Aiming for brachialis and forearms, squeeze db in the middle and curl 3/4 way up.\nday1: Preacher Curl, Dumbbell[5, 1-3] / id: tags(10400) / ...tLogic: Squat / warmup: 1x8 65% / 50lb / update: custom() { ...tLogic: Squat } / progress: custom(increment: 5lb, progressType: 2, targetMinReps: 8, targetMaxReps: 12, startNumSets: 3, type: 2, deloadWeightRatio: 0.6, deloadRepsRatio: 1, deloadSetsRatio: 1, rating+: 0, rateGroup: 804, ratingIndex: 0, numRatingExercises: 2, lastIncrement: 0lb, numSets: 1, setsModifier: 0, mesoWeek: 1, targetRpe: 7, autoDownSetMode: 1) { ...tLogic: Squat }\n\n//Pause for 1-2s at the top of each rep and squeeze, hit the rear delts.\nday1: Face Pull, Cable[6, 1-3] / id: tags(10303) / ...tLogic: Squat / warmup: 1x8 65% / 25lb / update: custom() { ...tLogic: Squat } / progress: custom(increment: 2.5lb, progressType: 2, targetMinReps: 8, targetMaxReps: 12, startNumSets: 3, type: 1, deloadWeightRatio: 0.6, deloadRepsRatio: 1, deloadSetsRatio: 1, rating+: 0, rateGroup: 803, ratingIndex: 0, numRatingExercises: 1, lastIncrement: 0lb, numSets: 1, setsModifier: 0, mesoWeek: 1, targetRpe: 7, autoDownSetMode: 1) { ...tLogic: Squat }"},{"name":"Day 2: Push 1","exerciseText":"//Behind the back cross\nday2: Lateral Raise, Cable[1, 1-3] / id: tags(20800) / ...tLogic: Squat / warmup: 1x8 65% / 25lb / update: custom() { ...tLogic: Squat } / progress: custom(increment: 2.5lb, progressType: 2, targetMinReps: 8, targetMaxReps: 12, startNumSets: 3, type: 1, deloadWeightRatio: 0.6, deloadRepsRatio: 1, deloadSetsRatio: 1, rating+: 0, rateGroup: 808, ratingIndex: 0, numRatingExercises: 1, lastIncrement: 0lb, numSets: 1, setsModifier: 0, mesoWeek: 1, targetRpe: 7, autoDownSetMode: 1) { ...tLogic: Squat }\n\n//Low incline\nday2: Incline Bench Press, Smith Machine[2, 1-3] / id: tags(20100) / ...tLogic: Squat / 135lb / update: custom() { ...tLogic: Squat } / progress: custom(increment: 5lb, progressType: 2, targetMinReps: 6, targetMaxReps: 10, startNumSets: 4, type: 1, deloadWeightRatio: 0.6, deloadRepsRatio: 0.5, deloadSetsRatio: 0.5, rating: 0, rateGroup: 0, ratingIndex: 0, numRatingExercises: 0, lastIncrement: 0lb, numSets: 1, setsModifier: 0, mesoWeek: 1, targetRpe: 7, autoDownSetMode: 1) { ...tLogic: Squat }\n\n//Fully bent over\nday2: Chest Fly, Cable[3, 1-3] / id: tags(20101) / ...tLogic: Squat / warmup: 1x8 65% / 50lb / update: custom() { ...tLogic: Squat } / progress: custom(increment: 2.5lb, progressType: 2, targetMinReps: 10, targetMaxReps: 15, startNumSets: 3, type: 1, deloadWeightRatio: 0.6, deloadRepsRatio: 1, deloadSetsRatio: 1, rating+: 0, rateGroup: 601, ratingIndex: 0, numRatingExercises: 1, lastIncrement: 0lb, numSets: 1, setsModifier: 0, mesoWeek: 1, targetRpe: 7, autoDownSetMode: 1) { ...tLogic: Squat }\n\n//Flat bar or rope\nday2: Triceps Extension, Cable[4, 1-3] / id: tags(20200) / ...tLogic: Squat / warmup: 1x8 65% / 35lb / update: custom() { ...tLogic: Squat } / progress: custom(increment: 2.5lb, progressType: 2, targetMinReps: 6, targetMaxReps: 10, startNumSets: 3, type: 1, deloadWeightRatio: 0.6, deloadRepsRatio: 1, deloadSetsRatio: 1, rating: 0, rateGroup: 0, ratingIndex: 0, numRatingExercises: 0, lastIncrement: 0lb, numSets: 1, setsModifier: 0, mesoWeek: 1, targetRpe: 7, autoDownSetMode: 1) { ...tLogic: Squat }\n\n//Go heavy\nday2: Triceps Pushdown, Cable[5, 1-3] / id: tags(20201) / ...tLogic: Squat / warmup: none / 60lb / update: custom() { ...tLogic: Squat } / progress: custom(increment: 2.5lb, progressType: 2, targetMinReps: 6, targetMaxReps: 10, startNumSets: 2, type: 1, deloadWeightRatio: 0.6, deloadRepsRatio: 1, deloadSetsRatio: 1, rating+: 0, rateGroup: 802, ratingIndex: 0, numRatingExercises: 2, lastIncrement: 0lb, numSets: 1, setsModifier: 0, mesoWeek: 1, targetRpe: 7, autoDownSetMode: 1) { ...tLogic: Squat }\n\n//Round back to connect with abs\nday2: Crunch, Cable[6, 1-3] / id: tags(20900) / ...tLogic: Squat / warmup: 1x8 65% / 60lb / update: custom() { ...tLogic: Squat } / progress: custom(increment: 2.5lb, progressType: 2, targetMinReps: 8, targetMaxReps: 12, startNumSets: 3, type: 1, deloadWeightRatio: 0.6, deloadRepsRatio: 1, deloadSetsRatio: 1, rating+: 0, rateGroup: 809, ratingIndex: 0, numRatingExercises: 1, lastIncrement: 0lb, numSets: 1, setsModifier: 0, mesoWeek: 1, targetRpe: 7, autoDownSetMode: 1) { ...tLogic: Squat }"},{"name":"Day 3: Legs 1","exerciseText":"//Lean forward to get max stretch on hammies\nday3: Seated Leg Curl, Leverage Machine[1, 1-3] / id: tags(30700) / ...tLogic: Squat / warmup: 1x8 65% / 70lb / update: custom() { ...tLogic: Squat } / progress: custom(increment: 5lb, progressType: 2, targetMinReps: 6, targetMaxReps: 10, startNumSets: 3, type: 1, deloadWeightRatio: 0.6, deloadRepsRatio: 1, deloadSetsRatio: 1, rating+: 0, rateGroup: 707, ratingIndex: 0, numRatingExercises: 2, lastIncrement: 0lb, numSets: 1, setsModifier: 0, mesoWeek: 1, targetRpe: 7, autoDownSetMode: 1) { ...tLogic: Squat }\n\n//Connect with the inner thighs, push hard\nday3: Hip Adductor, Cable[2, 1-3] / id: tags(31000) / ...tLogic: Squat / warmup: none / 35lb / update: custom() { ...tLogic: Squat } / progress: custom(increment: 2.5lb, progressType: 2, targetMinReps: 8, targetMaxReps: 12, startNumSets: 3, type: 1, deloadWeightRatio: 0.6, deloadRepsRatio: 1, deloadSetsRatio: 1, rating+: 0, rateGroup: 110, ratingIndex: 0, numRatingExercises: 1, lastIncrement: 0lb, numSets: 1, setsModifier: 0, mesoWeek: 1, targetRpe: 7, autoDownSetMode: 1) { ...tLogic: Squat }\n\nday3: Front Squat, Smith Machine[3, 1-3] / id: tags(30600) / ...tLogic: Squat / warmup: 1x10 50%, 1x5 75% / 95lb / update: custom() { ...tLogic: Squat } / progress: custom(increment: 5lb, progressType: 2, targetMinReps: 8, targetMaxReps: 12, startNumSets: 3, type: 1, deloadWeightRatio: 0.6, deloadRepsRatio: 0.5, deloadSetsRatio: 0.5, rating: 0, rateGroup: 0, ratingIndex: 0, numRatingExercises: 0, lastIncrement: 0lb, numSets: 1, setsModifier: 0, mesoWeek: 1, targetRpe: 7, autoDownSetMode: 1) { ...tLogic: Squat }\n\n//Lean as far back as possible to stretch rectus-femoris\nday3: Leg Extension, Leverage Machine[4, 1-3] / id: tags(30601) / ...tLogic: Squat / warmup: 1x8 65% / 85lb / update: custom() { ...tLogic: Squat } / progress: custom(increment: 5lb, progressType: 2, targetMinReps: 8, targetMaxReps: 15, startNumSets: 3, type: 1, deloadWeightRatio: 0.6, deloadRepsRatio: 1, deloadSetsRatio: 1, rating+: 0, rateGroup: 706, ratingIndex: 0, numRatingExercises: 2, lastIncrement: 0lb, numSets: 1, setsModifier: 0, mesoWeek: 1, targetRpe: 7, autoDownSetMode: 1) { ...tLogic: Squat }\n\n//1-2s pause at the 'bottom' to stretch the calves nicely\nday3: Calf Press on Leg Press, Leverage Machine[5, 1-3] / id: tags(30500) / ...tLogic: Squat / warmup: 1x8 65% / 155lb / update: custom() { ...tLogic: Squat } / progress: custom(increment: 5lb, progressType: 2, targetMinReps: 10, targetMaxReps: 15, startNumSets: 3, type: 1, deloadWeightRatio: 0.6, deloadRepsRatio: 1, deloadSetsRatio: 1, rating+: 0, rateGroup: 705, ratingIndex: 0, numRatingExercises: 1, lastIncrement: 0lb, numSets: 1, setsModifier: 0, mesoWeek: 1, targetRpe: 7, autoDownSetMode: 1) { ...tLogic: Squat }"},{"name":"Day 4: Arms + Weak 1","exerciseText":"//Hit the gym all chest no legs. Big stretch at the bottom, stay in the bottom 2/3rds ROM.\nday4: Chest Fly, Dumbbell[1, 1-3] / id: tags(40100) / ...tLogic: Squat / warmup: 1x8 65% / 30lb / update: custom() { ...tLogic: Squat } / progress: custom(increment: 2.5lb, progressType: 2, targetMinReps: 6, targetMaxReps: 12, startNumSets: 3, type: 1, deloadWeightRatio: 0.6, deloadRepsRatio: 1, deloadSetsRatio: 1, rating+: 0, rateGroup: 201, ratingIndex: 0, numRatingExercises: 2, lastIncrement: 0lb, numSets: 1, setsModifier: 0, mesoWeek: 1, targetRpe: 7, autoDownSetMode: 1) { ...tLogic: Squat }\n\n//Standing Arnold Press, supinate at bottom, pronate at top.\nday4: Shoulder Press, Dumbbell[2, 1-3] / id: tags(40800) / ...tLogic: Squat / warmup: 1x10 50%, 1x5 75% / 45lb / update: custom() { ...tLogic: Squat } / progress: custom(increment: 2.5lb, progressType: 2, targetMinReps: 6, targetMaxReps: 12, startNumSets: 2, type: 1, deloadWeightRatio: 0.6, deloadRepsRatio: 0.5, deloadSetsRatio: 0.5, rating+: 0, rateGroup: 208, ratingIndex: 0, numRatingExercises: 1, lastIncrement: 0lb, numSets: 1, setsModifier: 0, mesoWeek: 1, targetRpe: 7, autoDownSetMode: 1) { ...tLogic: Squat }\n\n//Bayesian Cable Curl, start with the weaker arm if one is weaker.\nday4: Bicep Curl, Cable[3, 1-3] / id: tags(40400) / ...tLogic: Squat / warmup: 1x8 65% / 35lb / update: custom() { ...tLogic: Squat } / progress: custom(increment: 2.5lb, progressType: 2, targetMinReps: 8, targetMaxReps: 12, startNumSets: 3, type: 1, deloadWeightRatio: 0.6, deloadRepsRatio: 1, deloadSetsRatio: 1, rating: 0, rateGroup: 0, ratingIndex: 0, numRatingExercises: 0, lastIncrement: 0lb, numSets: 1, setsModifier: 0, mesoWeek: 1, targetRpe: 7, autoDownSetMode: 1) { ...tLogic: Squat }\n\n//Seated french press (both hands), pause at the bottom for a deep stretch\nday4: Triceps extension, Dumbbell[4, 1-3] / id: tags(40200) / ...tLogic: Squat / warmup: 1x8 65% / 35lb / update: custom() { ...tLogic: Squat } / progress: custom(increment: 2.5lb, progressType: 2, targetMinReps: 6, targetMaxReps: 10, startNumSets: 3, type: 2, deloadWeightRatio: 0.6, deloadRepsRatio: 1, deloadSetsRatio: 1, rating: 0, rateGroup: 0, ratingIndex: 0, numRatingExercises: 0, lastIncrement: 0lb, numSets: 1, setsModifier: 0, mesoWeek: 1, targetRpe: 7, autoDownSetMode: 1) { ...tLogic: Squat }\n\n//Bottom 2/3rds only, constant tension, don't squeeze up to the top, no pausing.\nday4: Preacher Curl, EZ Bar[5, 1-3] / id: tags(40401) / ...tLogic: Squat / warmup: none / 85lb / update: custom() { ...tLogic: Squat } / progress: custom(increment: 5lb, progressType: 2, targetMinReps: 10, targetMaxReps: 15, startNumSets: 2, type: 1, deloadWeightRatio: 0.6, deloadRepsRatio: 1, deloadSetsRatio: 1, rating+: 0, rateGroup: 104, ratingIndex: 0, numRatingExercises: 1, lastIncrement: 0lb, numSets: 1, setsModifier: 0, mesoWeek: 1, targetRpe: 7, autoDownSetMode: 1) { ...tLogic: Squat }\n\n//One arm at a time, extending *downwards* and back. Elbow crosses body midline for long-head activation.\nday4: Triceps Extension, Cable[6, 1-3] / id: tags(40201) / ...tLogic: Squat / warmup: none / 20lb / update: custom() { ...tLogic: Squat } / progress: custom(increment: 2.5lb, progressType: 2, targetMinReps: 10, targetMaxReps: 15, startNumSets: 2, type: 2, deloadWeightRatio: 0.6, deloadRepsRatio: 1, deloadSetsRatio: 1, rating+: 0, rateGroup: 202, ratingIndex: 0, numRatingExercises: 2, lastIncrement: 0lb, numSets: 1, setsModifier: 0, mesoWeek: 1, targetRpe: 7, autoDownSetMode: 1) { ...tLogic: Squat }\n\n//Allow lower back to round to really hit the abs.\nday4: Hanging Leg Raise, Bodyweight[7, 1-3] / id: tags(40900) / ...tLogic: Squat / warmup: none / 0lb / update: custom() { ...tLogic: Squat } / progress: custom(increment: 5lb, progressType: 2, targetMinReps: 8, targetMaxReps: 20, startNumSets: 3, type: 1, deloadWeightRatio: 0.6, deloadRepsRatio: 1, deloadSetsRatio: 1, rating+: 0, rateGroup: 209, ratingIndex: 0, numRatingExercises: 1, lastIncrement: 0lb, numSets: 1, setsModifier: 0, mesoWeek: 1, targetRpe: 7, autoDownSetMode: 1) { ...tLogic: Squat }"},{"name":"Day 5: Pull 2 (mid-back)","exerciseText":"//Super ROM, lean forward on eccentric and get a big stretch. Wide grip, double-overhand.\nday5: Seated Row, Cable[1, 1-3] / id: tags(50300) / ...tLogic: Squat / warmup: 1x10 50%, 1x5 75% / 115lb / update: custom() { ...tLogic: Squat } / progress: custom(increment: 5lb, progressType: 2, targetMinReps: 8, targetMaxReps: 12, startNumSets: 3, type: 1, deloadWeightRatio: 0.6, deloadRepsRatio: 0.5, deloadSetsRatio: 0.5, rating: 0, rateGroup: 0, ratingIndex: 0, numRatingExercises: 0, lastIncrement: 0lb, numSets: 1, setsModifier: 0, mesoWeek: 1, targetRpe: 7, autoDownSetMode: 1) { ...tLogic: Squat }\n\n//Extend arms out to feel this in your low-back. Add weight as necessary.\nday5: Back Extension, Leverage Machine[2, 1-3] / id: tags(51000) / ...tLogic: Squat / warmup: 1x8 65% / 20lb / update: custom() { ...tLogic: Squat } / progress: custom(increment: 5lb, progressType: 2, targetMinReps: 8, targetMaxReps: 20, startNumSets: 2, type: 1, deloadWeightRatio: 0.6, deloadRepsRatio: 1, deloadSetsRatio: 1, rating+: 0, rateGroup: 310, ratingIndex: 0, numRatingExercises: 1, lastIncrement: 0lb, numSets: 1, setsModifier: 0, mesoWeek: 1, targetRpe: 7, autoDownSetMode: 1) { ...tLogic: Squat }\n\n//Lean back about 15 degrees at the bottom of the rep. Touch bar to chest at every rep, driving elbows down.\nday5: Lat Pulldown, Cable[3, 1-3] / id: tags(50301) / ...tLogic: Squat / warmup: 1x10 50%, 1x5 75% / 110lb / update: custom() { ...tLogic: Squat } / progress: custom(increment: 5lb, progressType: 2, targetMinReps: 8, targetMaxReps: 12, startNumSets: 3, type: 1, deloadWeightRatio: 0.6, deloadRepsRatio: 1, deloadSetsRatio: 1, rating: 0, rateGroup: 0, ratingIndex: 0, numRatingExercises: 0, lastIncrement: 0lb, numSets: 1, setsModifier: 0, mesoWeek: 1, targetRpe: 7, autoDownSetMode: 1) { ...tLogic: Squat }\n\n//Hammer curl up, then suppinate on the way down.\nday5: Hammer Curl, Dumbbell[4, 1-3] / id: tags(50400) / ...tLogic: Squat / warmup: 1x8 65% / 55lb / update: custom() { ...tLogic: Squat } / progress: custom(increment: 5lb, progressType: 2, targetMinReps: 8, targetMaxReps: 12, startNumSets: 3, type: 2, deloadWeightRatio: 0.6, deloadRepsRatio: 1, deloadSetsRatio: 1, rating+: 0, rateGroup: 404, ratingIndex: 0, numRatingExercises: 2, lastIncrement: 0lb, numSets: 1, setsModifier: 0, mesoWeek: 1, targetRpe: 7, autoDownSetMode: 1) { ...tLogic: Squat }\n\n//Two big steps back, come forward to reduce challenge as set progresses.\nday5: Reverse Fly, Cable[5, 1-3] / id: tags(50302) / ...tLogic: Squat / 25lb / update: custom() { ...tLogic: Squat } / progress: custom(increment: 5lb, progressType: 2, targetMinReps: 6, targetMaxReps: 12, startNumSets: 3, type: 2, deloadWeightRatio: 0.6, deloadRepsRatio: 0.5, deloadSetsRatio: 0.5, rating: 0, rateGroup: 0, ratingIndex: 0, numRatingExercises: 0, lastIncrement: 0lb, numSets: 1, setsModifier: 0, mesoWeek: 1, targetRpe: 7, autoDownSetMode: 1) { ...tLogic: Squat }\n\n//Shrug up and in, think shrugging to your ears. 1-2s pause at the top, then again at the bottom.\nday5: Shrug, Dumbbell[6, 1-3] / id: tags(50303) / ...tLogic: Squat / warmup: 1x8 65% / 55lb / update: custom() { ...tLogic: Squat } / progress: custom(increment: 5lb, progressType: 2, targetMinReps: 8, targetMaxReps: 12, startNumSets: 3, type: 1, deloadWeightRatio: 0.6, deloadRepsRatio: 1, deloadSetsRatio: 1, rating+: 0, rateGroup: 103, ratingIndex: 0, numRatingExercises: 4, lastIncrement: 0lb, numSets: 1, setsModifier: 0, mesoWeek: 1, targetRpe: 7, autoDownSetMode: 1) { ...tLogic: Squat }"},{"name":"Day 6: Push 2","exerciseText":"//Elbows should break at least 90 degrees. Connect with your delts.\nday6: Push Press, Barbell[1, 1-3] / id: tags(60800) / ...tLogic: Squat / 115lb / update: custom() { ...tLogic: Squat } / progress: custom(increment: 5lb, progressType: 2, targetMinReps: 8, targetMaxReps: 12, startNumSets: 3, type: 1, deloadWeightRatio: 0.6, deloadRepsRatio: 0.5, deloadSetsRatio: 0.5, rating: 0, rateGroup: 0, ratingIndex: 0, numRatingExercises: 0, lastIncrement: 0lb, numSets: 1, setsModifier: 0, mesoWeek: 1, targetRpe: 7, autoDownSetMode: 1) { ...tLogic: Squat }\n\n//Unilateral, arm crosses body and pulls cable from other ankle, 'draw a sword', sweep arm up.\nday6: Front Raise, Cable[2, 1-3] / id: tags(60801) / ...tLogic: Squat / warmup: 1x8 65% / 15lb / update: custom() { ...tLogic: Squat } / progress: custom(increment: 2.5lb, progressType: 2, targetMinReps: 8, targetMaxReps: 12, startNumSets: 3, type: 2, deloadWeightRatio: 0.6, deloadRepsRatio: 1, deloadSetsRatio: 1, rating+: 0, rateGroup: 408, ratingIndex: 0, numRatingExercises: 1, lastIncrement: 0lb, numSets: 1, setsModifier: 0, mesoWeek: 1, targetRpe: 7, autoDownSetMode: 1) { ...tLogic: Squat }\n\n//Slow 2-3s negative, 1-2s pause at the bottom, explosive concentric.\nday6: Triceps Dip, Leverage Machine[2, 1-3] / id: tags(60200) / ...tLogic: Squat / warmup: 1x10 50%, 1x5 75% / 135lb / update: custom() { ...tLogic: Squat } / progress: custom(increment: 5lb, progressType: 2, targetMinReps: 6, targetMaxReps: 10, startNumSets: 3, type: 1, deloadWeightRatio: 0.6, deloadRepsRatio: 0.5, deloadSetsRatio: 0.5, rating: 0, rateGroup: 0, ratingIndex: 0, numRatingExercises: 0, lastIncrement: 0lb, numSets: 1, setsModifier: 0, mesoWeek: 1, targetRpe: 7, autoDownSetMode: 1) { ...tLogic: Squat }\n\n//Low incline, about 15 degrees. Long-length partials at the end.\nday6: Chest Fly, Dumbbell[3, 1-3] / id: tags(60100) / ...tLogic: Squat / warmup: 1x8 65% / 25lb / update: custom() { ...tLogic: Squat } / progress: custom(increment: 2.5lb, progressType: 2, targetMinReps: 12, targetMaxReps: 20, startNumSets: 2, type: 1, deloadWeightRatio: 0.6, deloadRepsRatio: 1, deloadSetsRatio: 1, rating+: 0, rateGroup: 401, ratingIndex: 0, numRatingExercises: 1, lastIncrement: 0lb, numSets: 1, setsModifier: 0, mesoWeek: 1, targetRpe: 7, autoDownSetMode: 1) { ...tLogic: Squat }\n\n//Double-overhead, like pulling swords from your back. Flare elbows out at 45deg.\nday6: Triceps Extension, Cable[4, 1-3] / id: tags(60201) / ...tLogic: Squat / warmup: none / 35lb / update: custom() { ...tLogic: Squat } / progress: custom(increment: 2.5lb, progressType: 2, targetMinReps: 8, targetMaxReps: 12, startNumSets: 3, type: 1, deloadWeightRatio: 0.6, deloadRepsRatio: 1, deloadSetsRatio: 1, rating+: 0, rateGroup: 402, ratingIndex: 0, numRatingExercises: 2, lastIncrement: 0lb, numSets: 1, setsModifier: 0, mesoWeek: 1, targetRpe: 7, autoDownSetMode: 1) { ...tLogic: Squat }\n\n//Round back to connect with abs\nday6: Crunch, Cable[5, 1-3] / id: tags(60900) / ...tLogic: Squat / warmup: 1x8 65% / 60lb / update: custom() { ...tLogic: Squat } / progress: custom(increment: 2.5lb, progressType: 2, targetMinReps: 8, targetMaxReps: 12, startNumSets: 3, type: 1, deloadWeightRatio: 0.6, deloadRepsRatio: 1, deloadSetsRatio: 1, rating+: 0, rateGroup: 409, ratingIndex: 0, numRatingExercises: 1, lastIncrement: 0lb, numSets: 1, setsModifier: 0, mesoWeek: 1, targetRpe: 7, autoDownSetMode: 1) { ...tLogic: Squat }"},{"name":"Day 7: Legs 2","exerciseText":"//Lean forward to get max stretch on hammies\nday7: Seated Leg Curl, Leverage Machine[1, 1-3] / id: tags(70700) / ...tLogic: Squat / warmup: 1x8 65% / 70lb / update: custom() { ...tLogic: Squat } / progress: custom(increment: 5lb, progressType: 2, targetMinReps: 5, targetMaxReps: 10, startNumSets: 3, type: 1, deloadWeightRatio: 0.6, deloadRepsRatio: 1, deloadSetsRatio: 1, rating: 0, rateGroup: 0, ratingIndex: 0, numRatingExercises: 0, lastIncrement: 0lb, numSets: 1, setsModifier: 0, mesoWeek: 1, targetRpe: 7, autoDownSetMode: 1) { ...tLogic: Squat }\n\n//Feet low on the platform for more quad focus. Go as deep as you can without rounding your back.\nday7: Seated Leg Press, Leverage Machine[2, 1-3] / id: tags(70701) / ...tLogic: Squat / 225lb / update: custom() { ...tLogic: Squat } / progress: custom(increment: 5lb, progressType: 2, targetMinReps: 6, targetMaxReps: 10, startNumSets: 3, type: 1, deloadWeightRatio: 0.6, deloadRepsRatio: 0.5, deloadSetsRatio: 0.5, rating+: 0, rateGroup: 307, ratingIndex: 0, numRatingExercises: 1, lastIncrement: 0lb, numSets: 1, setsModifier: 0, mesoWeek: 1, targetRpe: 7, autoDownSetMode: 1) { ...tLogic: Squat }\n\n//Avoid using rear leg much\nday7: Reverse Lunge, Smith Machine[3, 1-3] / id: tags(70600) / ...tLogic: Squat / warmup: 1x10 50%, 1x5 75% / 95lb / update: custom() { ...tLogic: Squat } / progress: custom(increment: 5lb, progressType: 2, targetMinReps: 6, targetMaxReps: 10, startNumSets: 2, type: 1, deloadWeightRatio: 0.6, deloadRepsRatio: 0.5, deloadSetsRatio: 0.5, rating: 0, rateGroup: 0, ratingIndex: 0, numRatingExercises: 0, lastIncrement: 0lb, numSets: 1, setsModifier: 0, mesoWeek: 1, targetRpe: 7, autoDownSetMode: 1) { ...tLogic: Squat }\n\n//Connect with the inner thighs, push hard\nday7: Hip Adductor, Cable[4, 1-3] / id: tags(71000) / ...tLogic: Squat / warmup: 1x8 65% / 35lb / update: custom() { ...tLogic: Squat } / progress: custom(increment: 5lb, progressType: 2, targetMinReps: 8, targetMaxReps: 12, startNumSets: 3, type: 1, deloadWeightRatio: 0.6, deloadRepsRatio: 1, deloadSetsRatio: 1, rating+: 0, rateGroup: 510, ratingIndex: 0, numRatingExercises: 1, lastIncrement: 0lb, numSets: 1, setsModifier: 0, mesoWeek: 1, targetRpe: 7, autoDownSetMode: 1) { ...tLogic: Squat }\n\n//Come up onto your toes and push knees forward past toes. Hold onto something for balance.\nday7: Sissy Squat, Bodyweight[5, 1-3] / id: tags(70601) / ...tLogic: Squat / warmup: none / 0lb / update: custom() { ...tLogic: Squat } / progress: custom(increment: 5lb, progressType: 2, targetMinReps: 6, targetMaxReps: 15, startNumSets: 3, type: 1, deloadWeightRatio: 0.6, deloadRepsRatio: 1, deloadSetsRatio: 1, rating+: 0, rateGroup: 306, ratingIndex: 0, numRatingExercises: 2, lastIncrement: 0lb, numSets: 1, setsModifier: 0, mesoWeek: 1, targetRpe: 7, autoDownSetMode: 1) { ...tLogic: Squat }\n\n//1-2s pause at the bottom\nday7: Standing Calf Raise, Dumbbell[6, 1-3] / id: tags(70500) / ...tLogic: Squat / warmup: 1x8 65% / 155lb / update: custom() { ...tLogic: Squat } / progress: custom(increment: 5lb, progressType: 2, targetMinReps: 8, targetMaxReps: 12, startNumSets: 3, type: 1, deloadWeightRatio: 0.6, deloadRepsRatio: 1, deloadSetsRatio: 1, rating+: 0, rateGroup: 305, ratingIndex: 0, numRatingExercises: 1, lastIncrement: 0lb, numSets: 1, setsModifier: 0, mesoWeek: 1, targetRpe: 7, autoDownSetMode: 1) { ...tLogic: Squat }"},{"name":"Day 8: Arms + Weak 2","exerciseText":"//Lie on bench and extend neck. Can switch with flexion if preferred.\nday8: Neck Extension, Plate[1, 1-3] / id: tags(80300) / ...tLogic: Squat / warmup: 1x8 65% / 15lb / update: custom() { ...tLogic: Squat } / progress: custom(increment: 2.5lb, progressType: 2, targetMinReps: 6, targetMaxReps: 12, startNumSets: 3, type: 1, deloadWeightRatio: 0.6, deloadRepsRatio: 1, deloadSetsRatio: 1, rating+: 0, rateGroup: 503, ratingIndex: 0, numRatingExercises: 4, lastIncrement: 0lb, numSets: 1, setsModifier: 0, mesoWeek: 1, targetRpe: 7, autoDownSetMode: 1) { ...tLogic: Squat }\n\n//Extend all the way up and squeeze traps overhead \nday8: Lateral Raise, Dumbbell[2, 1-3] / id: tags(80800) / ...tLogic: Squat / warmup: 1x8 65% / 45lb / update: custom() { ...tLogic: Squat } / progress: custom(increment: 2.5lb, progressType: 2, targetMinReps: 6, targetMaxReps: 12, startNumSets: 2, type: 1, deloadWeightRatio: 0.6, deloadRepsRatio: 1, deloadSetsRatio: 1, rating+: 0, rateGroup: 608, ratingIndex: 0, numRatingExercises: 2, lastIncrement: 0lb, numSets: 1, setsModifier: 0, mesoWeek: 1, targetRpe: 7, autoDownSetMode: 1) { ...tLogic: Squat }\n\n//Max stretch at the bottom, and then bring the bar to eye-level at the top.\nday8: Skullcrusher, EZ Bar[3, 1-3] / id: tags(80200) / ...tLogic: Squat / warmup: 1x8 65% / 35lb / update: custom() { ...tLogic: Squat } / progress: custom(increment: 2.5lb, progressType: 2, targetMinReps: 8, targetMaxReps: 12, startNumSets: 3, type: 1, deloadWeightRatio: 0.6, deloadRepsRatio: 1, deloadSetsRatio: 1, rating: 0, rateGroup: 0, ratingIndex: 0, numRatingExercises: 0, lastIncrement: 0lb, numSets: 1, setsModifier: 0, mesoWeek: 1, targetRpe: 7, autoDownSetMode: 1) { ...tLogic: Squat }\n\n//Uni-lateral. Overhead, shoulder externally rotated to focus on long head.\nday8: Bicep Curl, Cable[4, 1-3] / id: tags(80400) / ...tLogic: Squat / warmup: 1x8 65% / 35lb / update: custom() { ...tLogic: Squat } / progress: custom(increment: 2.5lb, progressType: 2, targetMinReps: 8, targetMaxReps: 12, startNumSets: 3, type: 2, deloadWeightRatio: 0.6, deloadRepsRatio: 1, deloadSetsRatio: 1, rating: 0, rateGroup: 0, ratingIndex: 0, numRatingExercises: 0, lastIncrement: 0lb, numSets: 1, setsModifier: 0, mesoWeek: 1, targetRpe: 7, autoDownSetMode: 1) { ...tLogic: Squat }\n\n//2 ropes, lean forward, flare elbows slights, squeeze at the bottom.\nday8: Triceps Pushdown, Cable[5, 1-3] / id: tags(80201) / ...tLogic: Squat / warmup: none / 85lb / update: custom() { ...tLogic: Squat } / progress: custom(increment: 5lb, progressType: 2, targetMinReps: 10, targetMaxReps: 15, startNumSets: 2, type: 1, deloadWeightRatio: 0.6, deloadRepsRatio: 1, deloadSetsRatio: 1, rating+: 0, rateGroup: 602, ratingIndex: 0, numRatingExercises: 2, lastIncrement: 0lb, numSets: 1, setsModifier: 0, mesoWeek: 1, targetRpe: 7, autoDownSetMode: 1) { ...tLogic: Squat }\n\n//Upper back planted against the benche, rotate arms externally to feel a stretch in biceps. Go light.\nday8: Incline Curl, Dumbbell[6, 1-3] / id: tags(80401) / ...tLogic: Squat / warmup: none / 35lb / update: custom() { ...tLogic: Squat } / progress: custom(increment: 2.5lb, progressType: 2, targetMinReps: 10, targetMaxReps: 15, startNumSets: 2, type: 1, deloadWeightRatio: 0.6, deloadRepsRatio: 1, deloadSetsRatio: 1, rating+: 0, rateGroup: 504, ratingIndex: 0, numRatingExercises: 1, lastIncrement: 0lb, numSets: 1, setsModifier: 0, mesoWeek: 1, targetRpe: 7, autoDownSetMode: 1) { ...tLogic: Squat }\n\n//Round back to connect with abs\nday8: Crunch, Cable[7, 1-3] / id: tags(80900) / ...tLogic: Squat / warmup: 1x8 65% / 65lb / update: custom() { ...tLogic: Squat } / progress: custom(increment: 5lb, progressType: 2, targetMinReps: 10, targetMaxReps: 20, startNumSets: 3, type: 1, deloadWeightRatio: 0.6, deloadRepsRatio: 1, deloadSetsRatio: 1, rating+: 0, rateGroup: 609, ratingIndex: 0, numRatingExercises: 1, lastIncrement: 0lb, numSets: 1, setsModifier: 0, mesoWeek: 1, targetRpe: 7, autoDownSetMode: 1) { ...tLogic: Squat }"}]},{"name":"Accumulation","days":[{"name":"Day 1: Pull 1 (Lats)","exerciseText":""},{"name":"Day 2: Push 1","exerciseText":""},{"name":"Day 3: Legs 1","exerciseText":""},{"name":"Day 4: Arms + Weak 1","exerciseText":""},{"name":"Day 5: Pull 2 (mid-back)","exerciseText":""},{"name":"Day 6: Push 2","exerciseText":""},{"name":"Day 7: Legs 2","exerciseText":""},{"name":"Day 8: Arms + Weak 2","exerciseText":""}]},{"name":"Deload","days":[{"name":"Day 1: Pull 1 (Lats)","exerciseText":""},{"name":"Day 2: Push 1","exerciseText":""},{"name":"Day 3: Legs 1","exerciseText":""},{"name":"Day 4: Arms + Weak 1","exerciseText":""},{"name":"Day 5: Pull 2 (mid-back)","exerciseText":""},{"name":"Day 6: Push 2","exerciseText":""},{"name":"Day 7: Legs 2","exerciseText":""},{"name":"Day 8: Arms + Weak 2","exerciseText":""}]}]}},"version":"20250211073832","settings":{"timers":{"warmup":90,"workout":180,"reminder":900},"units":"lb"}},"shouldSyncProgram":false,"isMobile":false,"revisions":[]}