Design a Vending Machine class that simulates a coin-operated snack machine. The machine is initialized with a fixed set of products (name, price, quantity) and an empty coin balance. Users may insert coins (penny, nickel, dime, quarter, dollar), select an item by its code, and request the machine to dispense the item. Your implementation must expose four public methods: addItem(String itemCode, Item item, int quantity), selectItem(String itemCode), insertCoin(Coin coin), and dispense(). selectItem validates that the item exists and is in stock; if not it returns an error string. insertCoin adds the coin’s value to the current balance. dispense checks that an item was selected, that there is sufficient balance, and that the machine can make correct change from its internal coin inventory; if all succeed it deducts the price from the balance, decrements the item quantity, returns the item name plus the list of coins given as change, and resets the selected item; otherwise it returns an appropriate error string. A cancel() method must also be provided that returns all inserted coins since the last successful or canceled transaction and clears the current balance and selection. All state transitions must be handled atomically and the design should be extensible for new products or coin denominations.