```python
def gen_plan(state: BridgeState, push_a_offsets: list, push_b_offsets: list):
    
    import numpy as np

    # Build the block towards the target
    actions = []
    red_box = state.getFrame("big_red_block")
    target = state.getFrame("target_pose")
    dir = np.array([target.x_pos, target.y_pos]) - np.array([red_box.x_pos, red_box.y_pos])
    dir_normed = dir / np.linalg.norm(dir)

    # First push start
    offset_mag = max(red_box.size[:2]) * 3
    a_start_x = red_box.x_pos - dir_normed[0]*offset_mag + push_a_offsets[0]
    a_start_y = red_box.y_pos - dir_normed[1]*offset_mag + push_a_offsets[1]
    
    # First push end
    a_end_x = target.x_pos + push_a_offsets[2]
    a_end_y = target.x_pos + push_a_offsets[3]
    
    # Second push start
    b_start_x = target.x_pos - dir_normed[0]*.2 + push_b_offsets[0]
    b_start_y = target.y_pos - dir_normed[1]*.2 + push_b_offsets[1]
    
    # Second push end
    b_end_x = target.x_pos + push_b_offsets[2]
    b_end_y = target.x_pos + push_b_offsets[3]

    # First Push #
    actions.append(Action("push_motion", [a_start_x, a_start_y, a_end_x, a_end_y]))

    # Second Push (For adjusting position) #
    actions.append(Action("push_motion", [b_start_x, b_start_y, b_end_x, b_end_y]))

    return actions

def gen_initial_guess(initial: BridgeState):
    return {
        "push_a_offsets": [.0, .0, .0, .0], # BBO initial value
        "push_b_offsets": [.0, .0, .0, .0],
    }
```