code: def __init__(
      self,
      arguments: Union[str, List[DtypedArgument]],
      input_expr: str,
      scan_expr: str,
      neutral: Optional[str],
      output_statement: str,
      is_segment_start_expr: Optional[str] = None,
      input_fetch_exprs: Optional[List[Tuple[str, str, int]]] = None,
      name_prefix: str = "scan",
      preamble: str = "",
      template_processor: Any = None,
  ) -> None:
      super().__init__(template_processor=template_processor)
  
      if input_fetch_exprs is None:
          input_fetch_exprs = []
  
      self.arguments = arguments
      self.input_expr = input_expr
      self.scan_expr = scan_expr
      self.neutral = neutral
      self.output_statement = output_statement
      self.is_segment_start_expr = is_segment_start_expr
      self.input_fetch_exprs = input_fetch_exprs
      self.name_prefix = name_prefix
      self.preamble = preamble
  
imports: from abc import ABC, abstractmethod
  from dataclasses import dataclass
  from typing import Any, Dict, List, Optional, Set, Tuple, Union
  import numpy
  import pyopencl
  import pyopencl.array
  from pyopencl.tools import KernelTemplateBase, DtypedArgument, bitlog2, context_dependent_memoize, dtype_to_ctype, get_arg_list_scalar_arg_dtypes, get_arg_offset_adjuster_code, _process_code_for_macro, _NumpyTypesKeyBuilder
  import pyopencl._mymako
  from pyopencl._cluda import CLUDA_PREAMBLE
  from pytools.persistent_dict import WriteOncePersistentDict
  import logging
label_desc: Use image node_id 1 to create a new ScanTemplate object from inherited base classes: KernelTemplateBase with example: obj = ScanTemplate(arguments, input_expr, scan_expr, neutral, output_statement, is_segment_start_expr, input_fetch_exprs, name_prefix, preamble, template_processor)