code: def lifetimes(self, dates, include_start_date, country_codes):
          
          if isinstance(country_codes, string_types):
              raise TypeError(
                  "Got string {!r} instead of an iterable of strings in "
                  "AssetFinder.lifetimes.".format(country_codes),
              )
  
          # normalize to a cache-key so that we can memoize results.
          country_codes = frozenset(country_codes)
  
          lifetimes = self._asset_lifetimes.get(country_codes)
          if lifetimes is None:
              self._asset_lifetimes[country_codes] = lifetimes = (
                  self._compute_asset_lifetimes(country_codes)
              )
  
          raw_dates = as_column(dates.asi8)
          if include_start_date:
              mask = lifetimes.start <= raw_dates
          else:
              mask = lifetimes.start < raw_dates
          mask &= (raw_dates <= lifetimes.end)
  
          return pd.DataFrame(mask, index=dates, columns=lifetimes.sid)
docs: Compute a DataFrame representing asset lifetimes for the specified date
          range.
  
          Parameters
          ----------
          dates : pd.DatetimeIndex
              The dates for which to compute lifetimes.
          include_start_date : bool
              Whether or not to count the asset as alive on its start_date.
  
              This is useful in a backtesting context where `lifetimes` is being
              used to signify "do I have data for this asset as of the morning of
              this date?"  For many financial metrics, (e.g. daily close), data
              isn't available for an asset until the end of the asset's first
              day.
          country_codes : iterable[str]
              The country codes to get lifetimes for.
  
          Returns
          -------
          lifetimes : pd.DataFrame
              A frame of dtype bool with `dates` as index and an Int64Index of
              assets as columns.  The value at `lifetimes.loc[date, asset]` will
              be True iff `asset` existed on `date`.  If `include_start_date` is
              False, then lifetimes.loc[date, asset] will be false when date ==
              asset.start_date.
  
          See Also
          --------
          numpy.putmask
          zipline.pipeline.engine.SimplePipelineEngine._compute_root_mask