code: def match_range(self, el, condition):
          
  
          out_of_range = False
  
          itype = self.get_attribute_by_name(el, 'type').lower()
          mn = self.get_attribute_by_name(el, 'min', None)
          if mn is not None:
              mn = Inputs.parse_value(itype, mn)
          mx = self.get_attribute_by_name(el, 'max', None)
          if mx is not None:
              mx = Inputs.parse_value(itype, mx)
  
          # There is no valid min or max, so we cannot evaluate a range
          if mn is None and mx is None:
              return False
  
          value = self.get_attribute_by_name(el, 'value', None)
          if value is not None:
              value = Inputs.parse_value(itype, value)
          if value is not None:
              if itype in ("date", "datetime-local", "month", "week", "number", "range"):
                  if mn is not None and value < mn:
                      out_of_range = True
                  if not out_of_range and mx is not None and value > mx:
                      out_of_range = True
              elif itype == "time":
                  if mn is not None and mx is not None and mn > mx:
                      # Time is periodic, so this is a reversed/discontinuous range
                      if value < mn and value > mx:
                          out_of_range = True
                  else:
                      if mn is not None and value < mn:
                          out_of_range = True
                      if not out_of_range and mx is not None and value > mx:
                          out_of_range = True
  
          return not out_of_range if condition & ct.SEL_IN_RANGE else out_of_range
docs: Match range.
  
          Behavior is modeled after what we see in browsers. Browsers seem to evaluate
          if the value is out of range, and if not, it is in range. So a missing value
          will not evaluate out of range; therefore, value is in range. Personally, I
          feel like this should evaluate as neither in or out of range.