function NetworkTileSource(source, sources) {
    var _this5;
    _classCallCheck(this, NetworkTileSource);
    _this5 = _callSuper$8(this, NetworkTileSource, [source, sources]);
    _this5.tiled = true;
    _this5.bounds = _this5.parseBounds(source);

    // indicates if source should build geometry tiles, enabled for sources referenced in the scene's layers,
    // and left disabled for sources that are never referenced, or only used as raster textures
    _this5.builds_geometry_tiles = false;
    _this5.tms = source.tms === true; // optionally flip tile coords for TMS

    // optional list of subdomains to round-robin through
    if (_this5.url && _this5.url.search('{s}') > -1) {
      if (Array.isArray(source.url_subdomains) && source.url_subdomains.length > 0) {
        _this5.url_subdomains = source.url_subdomains;
        _this5.next_url_subdomain = 0;
      } else {
        log({
          level: 'warn',
          once: true
        }, "Data source '".concat(_this5.name, "': source URL includes '{s}' subdomain marker ('").concat(_this5.url, "'), but no subdomains ") + 'were specified in \'url_subdomains\' parameter');
      }
    }

    // optional list of pixel density scale modifiers
    if (_this5.url && _this5.url.search('{r}') > -1) {
      if (Array.isArray(source.url_density_scales) && source.url_density_scales.length > 0) {
        _this5.url_density_scales = source.url_density_scales;
      } else {
        _this5.url_density_scales = [1, 2]; // default to supporting 1x and 2x display densities
      }
    }
    return _this5;
  }
Generic network tile loading - abstract class **