```json
{
  "sym_variables": [
    ("x0", "hours worked by Ringo"),
    ("x1", "hours worked by Dale"),
    ("x2", "hours worked by Laura"),
    ("x3", "hours worked by Paul"),
    ("x4", "hours worked by George")
  ],
  "objective_function": "3*x0**2 + 8*x1**2 + 2*x1*x4 + 6*x2*x4 + 2*x3**2 + 3*x2 + 3*x3",
  "constraints": [
    "9*x1 + 3*x2 >= 51",
    "3*x2**2 + 9*x4**2 >= 18",
    "8*x3**2 + 9*x4**2 >= 27",
    "1*x1 + 9*x4 >= 47",
    "1*x1 + 8*x3 >= 24",
    "3*x2 + 8*x3 >= 55",
    "9*x0**2 + 9*x4**2 >= 42",
    "10*x1 + 4*x4 >= 27",
    "2*x1 - x2 + 2*x3 >= 0",
    "9*x0 + 3*x2 <= 238",
    "3*x2 + 8*x3 <= 255",
    "9*x0**2 + 1*x1**2 + 8*x3**2 <= 242",
    "9*x0**2 + 8*x3**2 + 9*x4**2 <= 169",
    "9*x0 + 1*x1 + 3*x2 <= 175",
    "1*x1**2 + 3*x2**2 + 9*x4**2 <= 137",
    "9*x0 + 1*x1 + 9*x4 <= 191",
    "9*x0 + 1*x1 + 3*x2 + 8*x3 + 9*x4 <= 191",
    "1*x0 + 2*x3 <= 146",
    "10*x1 + 4*x4 <= 239",
    "1*x0 + 3*x2 <= 130",
    "2*x3**2 + 4*x4**2 <= 101",
    "1*x0 + 4*x4 <= 230",
    "10*x1 + 2*x3 <= 51",
    "10*x1**2 + 3*x2**2 <= 147",
    "1*x0 + 10*x1 + 3*x2 + 2*x3 + 4*x4 <= 147"
  ]
}
```

```python
import gurobipy as gp

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

# Create variables
ringo = model.addVar(vtype=gp.GRB.INTEGER, name="ringo")
dale = model.addVar(vtype=gp.GRB.CONTINUOUS, name="dale")
laura = model.addVar(vtype=gp.GRB.CONTINUOUS, name="laura")
paul = model.addVar(vtype=gp.GRB.CONTINUOUS, name="paul")
george = model.addVar(vtype=gp.GRB.CONTINUOUS, name="george")


# Set objective function
model.setObjective(3*ringo**2 + 8*dale**2 + 2*dale*george + 6*laura*george + 2*paul**2 + 3*laura + 3*paul, gp.GRB.MAXIMIZE)

# Add constraints
model.addConstr(9*dale + 3*laura >= 51)
model.addConstr(3*laura**2 + 9*george**2 >= 18)
model.addConstr(8*paul**2 + 9*george**2 >= 27)
model.addConstr(dale + 9*george >= 47)
model.addConstr(dale + 8*paul >= 24)
model.addConstr(3*laura + 8*paul >= 55)
model.addConstr(9*ringo**2 + 9*george**2 >= 42)
model.addConstr(10*dale + 4*george >= 27)
model.addConstr(2*dale - laura + 2*paul >= 0)
model.addConstr(9*ringo + 3*laura <= 238)
model.addConstr(3*laura + 8*paul <= 255)
model.addConstr(9*ringo**2 + dale**2 + 8*paul**2 <= 242)
model.addConstr(9*ringo**2 + 8*paul**2 + 9*george**2 <= 169)
model.addConstr(9*ringo + dale + 3*laura <= 175)
model.addConstr(dale**2 + 3*laura**2 + 9*george**2 <= 137)
model.addConstr(9*ringo + dale + 9*george <= 191)
model.addConstr(9*ringo + dale + 3*laura + 8*paul + 9*george <= 191)
model.addConstr(ringo + 2*paul <= 146)
model.addConstr(10*dale + 4*george <= 239)
model.addConstr(ringo + 3*laura <= 130)
model.addConstr(2*paul**2 + 4*george**2 <= 101)
model.addConstr(ringo + 4*george <= 230)
model.addConstr(10*dale + 2*paul <= 51)
model.addConstr(10*dale**2 + 3*laura**2 <= 147)
model.addConstr(ringo + 10*dale + 3*laura + 2*paul + 4*george <= 147)


# Optimize model
model.optimize()

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

```