To solve the optimization problem described, we first need to define the decision variables, objective function, and constraints. Let's denote:

- \(x_c\) as the number of cream lipsticks produced.
- \(x_m\) as the number of matte lipsticks produced.

The profit per cream lipstick is $70, and the profit per matte lipstick is $100. Thus, the total profit \(P\) can be represented by the objective function:
\[ P = 70x_c + 100x_m \]

Now, let's outline the constraints based on the production time available for each stage:

1. **Raw Materials Preparation**: It takes 3.5 hours to prepare the raw materials for one cream lipstick and 5 hours for one matte lipstick. With 300 hours available:
\[ 3.5x_c + 5x_m \leq 300 \]

2. **Mixing**: It takes 5 hours to mix one cream lipstick and 3 hours to mix one matte lipstick, with 400 hours available:
\[ 5x_c + 3x_m \leq 400 \]

3. **Packing**: It takes 2 hours to pack one cream lipstick and 1.5 hours for one matte lipstick, with 200 hours available:
\[ 2x_c + 1.5x_m \leq 200 \]

Additionally, we have non-negativity constraints since the number of lipsticks cannot be negative:
\[ x_c \geq 0 \]
\[ x_m \geq 0 \]

To solve this linear programming problem using Gurobi in Python, we will define these variables and constraints within the model.

```python
from gurobipy import *

# Create a new model
model = Model("Lipstick_Production")

# Define decision variables
x_c = model.addVar(name="cream_lipsticks", vtype=GRB.CONTINUOUS, lb=0)
x_m = model.addVar(name="matte_lipsticks", vtype=GRB.CONTINUOUS, lb=0)

# Objective function: Maximize total profit
model.setObjective(70*x_c + 100*x_m, GRB.MAXIMIZE)

# Constraints
model.addConstr(3.5*x_c + 5*x_m <= 300, name="raw_materials")
model.addConstr(5*x_c + 3*x_m <= 400, name="mixing")
model.addConstr(2*x_c + 1.5*x_m <= 200, name="packing")

# Optimize the model
model.optimize()

# Print solution
if model.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Cream Lipsticks: {x_c.x}")
    print(f"Matte Lipsticks: {x_m.x}")
    print(f"Total Profit: ${70*x_c.x + 100*x_m.x:.2f}")
else:
    print("No optimal solution found")
```