```json
{
  "sym_variables": [
    ("x0", "potatoes"),
    ("x1", "tomatoes"),
    ("x2", "protein bars"),
    ("x3", "kiwis")
  ],
  "objective_function": "2*x0**2 + x0*x1 + 7*x1*x3 + 7*x3**2 + 8*x3",
  "constraints": [
    "8*x1 + 8*x2 <= 49",
    "8*x0**2 + 6*x1**2 <= 19",
    "8*x2 + x3 <= 26",
    "8*x0 + x3 <= 23",
    "8*x0 + 6*x1 + 8*x2 + x3 <= 23",
    "5*x1 + 7*x2 <= 34",
    "5*x1 + 5*x3 <= 55",
    "5*x0**2 + 5*x3**2 <= 21",
    "5*x0 + 8*x1 + 7*x2 + 5*x3 <= 21",
    "6*x2**2 + 2*x3**2 <= 55",
    "5*x0 + 8*x1 <= 32",
    "5*x0**2 + 2*x3**2 <= 38",
    "5*x0 + 8*x1 + 6*x2 + 2*x3 <= 38",
    "4*x0 + 4*x2 <= 57",
    "3*x1 + 7*x3 <= 68",
    "4*x2 + 7*x3 <= 69",
    "3*x1**2 + 4*x2**2 <= 62",
    "4*x0 + 3*x1 + 4*x2 + 7*x3 <= 62",
    "2*x0**2 + 8*x2**2 <= 48",
    "2*x0**2 + 8*x2**2 + 8*x3**2 <= 73",
    "2*x0 + 7*x1 + 8*x2 <= 68",
    "2*x0 + 7*x1 + 8*x2 + 8*x3 <= 68",
    "8*x0 <= 54",
    "5*x0 <= 83",
    "5*x0 <= 68",
    "4*x0 <= 72",
    "2*x0 <= 79",
    "6*x1 <= 54",
    "8*x1 <= 83",
    "8*x1 <= 68",
    "3*x1 <= 72",
    "7*x1 <= 79",
    "8*x2 <= 54",
    "7*x2 <= 83",
    "6*x2 <= 68",
    "4*x2 <= 72",
    "8*x2 <= 79",
    "x3 <= 54",
    "5*x3 <= 83",
    "2*x3 <= 68",
    "7*x3 <= 72",
    "8*x3 <= 79",
    "8*x1 + 7*x2 >= 12",
    "7*x2 + 5*x3 >= 12",
    "5*x0**2 + 8*x1**2 >= 17",
    "5*x0 + 8*x1 + 7*x2 >= 13",
    "5*x0**2 + 7*x2**2 + 5*x3**2 >= 13",
    "5*x0 + 8*x1 + 7*x2 >= 15",
    "5*x0 + 7*x2 + 5*x3 >= 15",
    "6*x2 + 2*x3 >= 11",
    "5*x0 + 8*x1 >= 6",
    "5*x0 + 6*x2 >= 9",
    "5*x0 + 2*x3 >= 16",
    "4*x0**2 + 4*x2**2 >= 12",
    "4*x0 + 3*x1 >= 14",
    "3*x1**2 + 4*x2**2 + 7*x3**2 >= 13",
    "2*x0 + 8*x2 + 8*x3 >= 12",
    "7*x1**2 + 8*x2**2 + 8*x3**2 >= 12",
    "2*x0**2 + 8*x2**2 + 8*x3**2 >= 18",
    "7*x1 + 8*x2 + 8*x3 >= 18"
  ]
}
```

```python
import gurobipy as gp

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

# Create variables
potatoes = m.addVar(lb=0, name="potatoes")
tomatoes = m.addVar(lb=0, name="tomatoes")
protein_bars = m.addVar(lb=0, name="protein_bars")
kiwis = m.addVar(lb=0, vtype=gp.GRB.INTEGER, name="kiwis")


# Set objective function
m.setObjective(2*potatoes**2 + potatoes*tomatoes + 7*tomatoes*kiwis + 7*kiwis**2 + 8*kiwis, gp.GRB.MAXIMIZE)

# Add constraints
m.addConstr(8*tomatoes + 8*protein_bars <= 49)
m.addConstr(8*potatoes**2 + 6*tomatoes**2 <= 19)
m.addConstr(8*protein_bars + kiwis <= 26)
m.addConstr(8*potatoes + kiwis <= 23)
m.addConstr(8*potatoes + 6*tomatoes + 8*protein_bars + kiwis <= 23)
m.addConstr(5*tomatoes + 7*protein_bars <= 34)
m.addConstr(5*tomatoes + 5*kiwis <= 55)
m.addConstr(5*potatoes**2 + 5*kiwis**2 <= 21)
m.addConstr(5*potatoes + 8*tomatoes + 7*protein_bars + 5*kiwis <= 21)
m.addConstr(6*protein_bars**2 + 2*kiwis**2 <= 55)
m.addConstr(5*potatoes + 8*tomatoes <= 32)
m.addConstr(5*potatoes**2 + 2*kiwis**2 <= 38)
m.addConstr(5*potatoes + 8*tomatoes + 6*protein_bars + 2*kiwis <= 38)
m.addConstr(4*potatoes + 4*protein_bars <= 57)
m.addConstr(3*tomatoes + 7*kiwis <= 68)
m.addConstr(4*protein_bars + 7*kiwis <= 69)
m.addConstr(3*tomatoes**2 + 4*protein_bars**2 <= 62)
m.addConstr(4*potatoes + 3*tomatoes + 4*protein_bars + 7*kiwis <= 62)
m.addConstr(2*potatoes**2 + 8*protein_bars**2 <= 48)
m.addConstr(2*potatoes**2 + 8*protein_bars**2 + 8*kiwis**2 <= 73)
m.addConstr(2*potatoes + 7*tomatoes + 8*protein_bars <= 68)
m.addConstr(2*potatoes + 7*tomatoes + 8*protein_bars + 8*kiwis <= 68)


# Resource Constraints
m.addConstr(8 * potatoes <= 54)
m.addConstr(5 * potatoes <= 83)
m.addConstr(5 * potatoes <= 68)
m.addConstr(4 * potatoes <= 72)
m.addConstr(2 * potatoes <= 79)
m.addConstr(6 * tomatoes <= 54)
m.addConstr(8 * tomatoes <= 83)
m.addConstr(8 * tomatoes <= 68)
m.addConstr(3 * tomatoes <= 72)
m.addConstr(7 * tomatoes <= 79)
m.addConstr(8 * protein_bars <= 54)
m.addConstr(7 * protein_bars <= 83)
m.addConstr(6 * protein_bars <= 68)
m.addConstr(4 * protein_bars <= 72)
m.addConstr(8 * protein_bars <= 79)
m.addConstr(1 * kiwis <= 54)
m.addConstr(5 * kiwis <= 83)
m.addConstr(2 * kiwis <= 68)
m.addConstr(7 * kiwis <= 72)
m.addConstr(8 * kiwis <= 79)


# Additional Constraints
m.addConstr(8*tomatoes + 7*protein_bars >= 12)
m.addConstr(7*protein_bars + 5*kiwis >= 12)
m.addConstr(5*potatoes**2 + 8*tomatoes**2 >= 17)
m.addConstr(5*potatoes + 8*tomatoes + 7*protein_bars >= 13)
m.addConstr(5*potatoes**2 + 7*protein_bars**2 + 5*kiwis**2 >= 13)
m.addConstr(5*potatoes + 8*tomatoes + 7*protein_bars >= 15)
m.addConstr(5*potatoes + 7*protein_bars + 5*kiwis >= 15)
m.addConstr(6*protein_bars + 2*kiwis >= 11)
m.addConstr(5*potatoes + 8*tomatoes >= 6)
m.addConstr(5*potatoes + 6*protein_bars >= 9)
m.addConstr(5*potatoes + 2*kiwis >= 16)
m.addConstr(4*potatoes**2 + 4*protein_bars**2 >= 12)
m.addConstr(4*potatoes + 3*tomatoes >= 14)
m.addConstr(3*tomatoes**2 + 4*protein_bars**2 + 7*kiwis**2 >= 13)
m.addConstr(2*potatoes + 8*protein_bars + 8*kiwis >= 12)
m.addConstr(7*tomatoes**2 + 8*protein_bars**2 + 8*kiwis**2 >= 12)
m.addConstr(2*potatoes**2 + 8*protein_bars**2 + 8*kiwis**2 >= 18)
m.addConstr(7*tomatoes + 8*protein_bars + 8*kiwis >= 18)



# Optimize model
m.optimize()

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

```