```json
{
  "sym_variables": [
    ("x0", "hours worked by Hank"),
    ("x1", "hours worked by Ringo"),
    ("x2", "hours worked by Jean"),
    ("x3", "hours worked by Mary")
  ],
  "objective_function": "9.17 * x0 + 1.52 * x1 + 4.32 * x2 + 7.39 * x3",
  "constraints": [
    "11 * x0 + 7 * x2 >= 14",
    "7 * x1 + 7 * x2 >= 11",
    "11 * x0 + 7 * x1 + 3 * x3 >= 15",
    "9 * x0 + 3 * x1 >= 26",
    "9 * x0 + 6 * x2 >= 14",
    "2 * x2 + 7 * x3 >= 56",
    "2 * x2 + 5 * x3 <= 28",
    "9 * x0 + 2 * x2 <= 63",
    "4 * x1 + 5 * x3 <= 79",
    "9 * x0 + 4 * x1 <= 63",
    "9 * x0 + 4 * x1 + 2 * x2 + 5 * x3 <= 63",
    "7 * x2 + 3 * x3 <= 16",
    "11 * x0 + 7 * x1 <= 25",
    "11 * x0 + 7 * x1 + 7 * x2 + 3 * x3 <= 25",
    "6 * x2 + 10 * x3 <= 44",
    "9 * x0 + 10 * x3 <= 102",
    "9 * x0 + 6 * x2 <= 100",
    "9 * x0 + 3 * x1 + 6 * x2 + 10 * x3 <= 100",
    "2 * x0 + 7 * x3 <= 115",
    "2 * x2 + 7 * x3 <= 75",
    "4 * x1 + 2 * x2 <= 84",
    "2 * x0 + 2 * x2 <= 111",
    "4 * x1 + 7 * x3 <= 105",
    "2 * x0 + 4 * x1 + 2 * x2 + 7 * x3 <= 105"
  ]
}
```

```python
import gurobipy as gp

# Create a new model
m = gp.Model("optimization_problem")

# Create variables
hank_hours = m.addVar(lb=0, type=gp.GRB.CONTINUOUS, name="hank_hours")
ringo_hours = m.addVar(lb=0, type=gp.GRB.INTEGER, name="ringo_hours")
jean_hours = m.addVar(lb=0, type=gp.GRB.CONTINUOUS, name="jean_hours")
mary_hours = m.addVar(lb=0, type=gp.GRB.INTEGER, name="mary_hours")

# Set objective function
m.setObjective(9.17 * hank_hours + 1.52 * ringo_hours + 4.32 * jean_hours + 7.39 * mary_hours, gp.GRB.MAXIMIZE)

# Add constraints
m.addConstr(11 * hank_hours + 7 * jean_hours >= 14)
m.addConstr(7 * ringo_hours + 7 * jean_hours >= 11)
m.addConstr(11 * hank_hours + 7 * ringo_hours + 3 * mary_hours >= 15)
m.addConstr(9 * hank_hours + 3 * ringo_hours >= 26)
m.addConstr(9 * hank_hours + 6 * jean_hours >= 14)
m.addConstr(2 * jean_hours + 7 * mary_hours >= 56)
m.addConstr(2 * jean_hours + 5 * mary_hours <= 28)
m.addConstr(9 * hank_hours + 2 * jean_hours <= 63)
m.addConstr(4 * ringo_hours + 5 * mary_hours <= 79)
m.addConstr(9 * hank_hours + 4 * ringo_hours <= 63)
m.addConstr(9 * hank_hours + 4 * ringo_hours + 2 * jean_hours + 5 * mary_hours <= 63)
m.addConstr(7 * jean_hours + 3 * mary_hours <= 16)
m.addConstr(11 * hank_hours + 7 * ringo_hours <= 25)
m.addConstr(11 * hank_hours + 7 * ringo_hours + 7 * jean_hours + 3 * mary_hours <= 25)
m.addConstr(6 * jean_hours + 10 * mary_hours <= 44)
m.addConstr(9 * hank_hours + 10 * mary_hours <= 102)
m.addConstr(9 * hank_hours + 6 * jean_hours <= 100)
m.addConstr(9 * hank_hours + 3 * ringo_hours + 6 * jean_hours + 10 * mary_hours <= 100)
m.addConstr(2 * hank_hours + 7 * mary_hours <= 115)
m.addConstr(2 * jean_hours + 7 * mary_hours <= 75)
m.addConstr(4 * ringo_hours + 2 * jean_hours <= 84)
m.addConstr(2 * hank_hours + 2 * jean_hours <= 111)
m.addConstr(4 * ringo_hours + 7 * mary_hours <= 105)
m.addConstr(2 * hank_hours + 4 * ringo_hours + 2 * jean_hours + 7 * mary_hours <= 105)


# Optimize model
m.optimize()

# Print solution
if m.status == gp.GRB.OPTIMAL:
    print('Objective Value:', m.objVal)
    for v in m.getVars():
        print(f'{v.varName}: {v.x}')
elif m.status == gp.GRB.INFEASIBLE:
    print("The model is infeasible.")
else:
    print(f"Optimization ended with status {m.status}")

```
