code: def _get_changes_classified(
      changes: list[Change],
      with_breaking_changes: bool,
      maybe_with_new_features: bool,
  ) -> ClassifiedChanges:
      """Pre-classifies changes based on commit message, it's wildly guessing now,
  
      The classification also includes the decision made by the release manager when classifying the release.
  
      However, if we switch to semantic commits, it could be automated. This list
      is supposed to be manually reviewed and re-classified by release manager
      anyway.
  
      :param changes: list of changes
      :return: list of changes classified semi-automatically to the fix/feature/breaking/other buckets
      """
      classified_changes = ClassifiedChanges()
      for change in changes:
          # Special cases
          if (
              "bump minimum Airflow version in providers"
              in change.message.lower()
          ):
              classified_changes.misc.append(change)
          # General cases
          elif "fix" in change.message.lower():
              classified_changes.fixes.append(change)
          elif "misc" in change.message.lower():
              classified_changes.misc.append(change)
          elif (
              "add" in change.message.lower()
              and maybe_with_new_features
          ):
              classified_changes.features.append(change)
          elif (
              "breaking" in change.message.lower()
              and with_breaking_changes
          ):
              classified_changes.breaking_changes.append(change)
          else:
              classified_changes.other.append(change)
      return classified_changes
  
imports: from __future__ import annotations
  import difflib
  import os
  import random
  import re
  import subprocess
  import sys
  import tempfile
  from copy import deepcopy
  from enum import Enum
  from pathlib import Path
  from shutil import copyfile
  from time import time
  from typing import Any, NamedTuple
  import jinja2
  import semver
  from rich.syntax import Syntax
  from airflow_breeze.utils.black_utils import black_format
  from airflow_breeze.utils.confirm import Answer, user_confirm
  from airflow_breeze.utils.console import get_console
  from airflow_breeze.utils.packages import HTTPS_REMOTE, ProviderPackageDetails, get_provider_details, get_provider_jinja_context, get_source_package_path, refresh_provider_metadata_from_yaml_file, refresh_provider_metadata_with_provider_id, render_template
  from airflow_breeze.utils.run_utils import run_command
  from airflow_breeze.utils.shared_options import get_verbose
  from airflow_breeze.utils.versions import get_version_tag
label_desc: Use image node_id 18 for calling a global function with example usage: _get_changes_classified(changes, with_breaking_changes, maybe_with_new_features) and returns: classified_changes