igv 2.15.2 → 2.15.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/igv.esm.js CHANGED
@@ -18360,7 +18360,7 @@ async function getAccessToken(scope) {
18360
18360
 
18361
18361
  function getScopeForURL(url) {
18362
18362
  if (isGoogleDriveURL(url)) {
18363
- return "https://www.googleapis.com/auth/drive.file"
18363
+ return "https://www.googleapis.com/auth/drive.readonly"
18364
18364
  } else if (isGoogleStorageURL(url)) {
18365
18365
  return "https://www.googleapis.com/auth/devstorage.read_only"
18366
18366
  } else {
@@ -18389,7 +18389,8 @@ async function getDriveFileInfo(googleDriveURL) {
18389
18389
  const response = await fetch(endPoint);
18390
18390
  let json = await response.json();
18391
18391
  if (json.error && json.error.code === 404) {
18392
- const access_token = await getAccessToken("https://www.googleapis.com/auth/drive.readonly");
18392
+ let scope = "https://www.googleapis.com/auth/drive.readonly";
18393
+ const access_token = await getAccessToken(scope);
18393
18394
  if (access_token) {
18394
18395
  const response = await fetch(endPoint, {
18395
18396
  headers: {
@@ -18870,29 +18871,41 @@ class IGVXhr {
18870
18871
  this.oauth.setToken(token, host);
18871
18872
  }
18872
18873
 
18874
+ /**
18875
+ * Return an oauth token for the URL if we have one. This method does not force sign-in, and the token may
18876
+ * or may not be valid. Sign-in is triggered on request failure.
18877
+ * *
18878
+ * @param url
18879
+ * @returns {*}
18880
+ */
18873
18881
  getOauthToken(url) {
18874
18882
 
18875
18883
  // Google is the default provider, don't try to parse host for google URLs
18876
18884
  const host = isGoogleURL(url) ?
18877
18885
  undefined :
18878
18886
  parseUri(url).host;
18887
+
18888
+ // First check the explicit settings (i.e. token set through the API)
18879
18889
  let token = this.oauth.getToken(host);
18880
18890
  if (token) {
18881
18891
  return token
18882
18892
  } else if (host === undefined) {
18893
+ // Now try Google oauth tokens previously obtained. This will return undefined if google oauth is not
18894
+ // configured.
18883
18895
  const googleToken = getCurrentGoogleAccessToken();
18884
18896
  if (googleToken && googleToken.expires_at > Date.now()) {
18885
18897
  return googleToken.access_token
18886
18898
  }
18887
18899
  }
18888
18900
  }
18889
-
18890
18901
  }
18891
18902
 
18892
18903
  function isGoogleStorageSigned(url) {
18893
18904
  return url.indexOf("X-Goog-Signature") > -1
18894
18905
  }
18895
18906
 
18907
+
18908
+
18896
18909
  /**
18897
18910
  * Return a Google oAuth token, triggering a sign in if required. This method should not be called until we know
18898
18911
  * a token is required, that is until we've tried the url and received a 401, 403, or 404.
@@ -23931,7 +23944,7 @@ const Cytoband = function (start, end, name, typestain) {
23931
23944
  }
23932
23945
  };
23933
23946
 
23934
- const _version = "2.15.2";
23947
+ const _version = "2.15.4";
23935
23948
  function version() {
23936
23949
  return _version
23937
23950
  }
@@ -23983,7 +23996,7 @@ const GenomeUtils = {
23983
23996
 
23984
23997
  // Delay loading cytbands untils after genome initialization to use chromosome aliases (1 vs chr1, etc).
23985
23998
  if (cytobandUrl) {
23986
- genome.cytobands = await loadCytobands(cytobandUrl, sequence.config, genome);
23999
+ genome.cytobands = await loadCytobands(cytobandUrl, sequence.config, genome);
23987
24000
  }
23988
24001
 
23989
24002
  return genome
@@ -24085,7 +24098,7 @@ class Genome {
24085
24098
  this.sequence = sequence;
24086
24099
  this.chromosomeNames = sequence.chromosomeNames;
24087
24100
  this.chromosomes = sequence.chromosomes; // An object (functions as a dictionary)
24088
- this.featureDB = {}; // Hash of name -> feature, used for search function.
24101
+ this.featureDB = new Map(); // Hash of name -> feature, used for search function.
24089
24102
 
24090
24103
  this.wholeGenomeView = config.wholeGenomeView === undefined || config.wholeGenomeView;
24091
24104
  if (this.wholeGenomeView && Object.keys(sequence.chromosomes).length > 1) {
@@ -24289,6 +24302,40 @@ class Genome {
24289
24302
  chr = this.getChromosomeName(chr);
24290
24303
  return this.sequence.getSequence(chr, start, end)
24291
24304
  }
24305
+
24306
+ addFeaturesToDB(featureList, config) {
24307
+
24308
+ const insertFeature = (name, feature) => {
24309
+ const current = this.featureDB.get(name);
24310
+ if (current) {
24311
+ feature = (feature.end - feature.start) > (current.end - current.start) ? feature : current;
24312
+
24313
+ }
24314
+ this.featureDB.set(name, feature);
24315
+ };
24316
+
24317
+ for (let feature of featureList) {
24318
+ if (feature.name) {
24319
+ insertFeature(feature.name.toUpperCase(), feature);
24320
+ }
24321
+ if (feature.gene && feature.gene.name) {
24322
+ insertFeature(feature.gene.name.toUpperCase(), feature);
24323
+ }
24324
+
24325
+ if (config.searchableFields) {
24326
+ for (let f of config.searchableFields) {
24327
+ const value = feature.getAttributeValue(f);
24328
+ if (value) {
24329
+ if (value.indexOf(" ") > 0) {
24330
+ insertFeature(value.replaceAll(" ", "+").toUpperCase(), feature);
24331
+ } else {
24332
+ insertFeature(value.toUpperCase(), feature);
24333
+ }
24334
+ }
24335
+ }
24336
+ }
24337
+ }
24338
+ }
24292
24339
  }
24293
24340
 
24294
24341
  async function loadCytobands(cytobandUrl, config, genome) {
@@ -27016,8 +27063,6 @@ function parseVariableStep(line) {
27016
27063
  * THE SOFTWARE.
27017
27064
  */
27018
27065
 
27019
- const DEFAULT_COLOR$1 = 'rgb(150,150,150)';
27020
-
27021
27066
  const fixColor = (colorString) => {
27022
27067
  if (isString$2(colorString)) {
27023
27068
  return (colorString.indexOf(",") > 0 && !(colorString.startsWith("rgb(") || colorString.startsWith("rgba("))) ?
@@ -27036,6 +27081,15 @@ const fixColor = (colorString) => {
27036
27081
  */
27037
27082
  class TrackBase {
27038
27083
 
27084
+ static defaults = {
27085
+ height: 50,
27086
+ color: 'rgb(0, 0, 150)',
27087
+ altColor: 'rgb(0, 0, 150)',
27088
+ autoHeight: false,
27089
+ visibilityWindow: undefined,
27090
+ supportHiDPI: true
27091
+ }
27092
+
27039
27093
  constructor(config, browser) {
27040
27094
  this.browser = browser;
27041
27095
  this.init(config);
@@ -27049,15 +27103,25 @@ class TrackBase {
27049
27103
  */
27050
27104
  init(config) {
27051
27105
 
27106
+ this.config = config;
27107
+
27052
27108
  if (config.displayMode) {
27053
27109
  config.displayMode = config.displayMode.toUpperCase();
27054
27110
  }
27055
27111
 
27056
- this.config = config;
27057
- this.url = config.url;
27058
- this.type = config.type;
27059
-
27060
- this.supportHiDPI = config.supportHiDPI === undefined ? true : config.supportHiDPI;
27112
+ // Set default properties
27113
+ const defaults = Object.assign({}, TrackBase.defaults);
27114
+ if(this.constructor.defaults) {
27115
+ for(let key of Object.keys(this.constructor.defaults)) {
27116
+ defaults[key] = this.constructor.defaults[key];
27117
+ }
27118
+ }
27119
+ for(let key of Object.keys(defaults)) {
27120
+ this[key] = config.hasOwnProperty(key) ? config[key] : defaults[key];
27121
+ if(key === 'color' || key === 'altColor') {
27122
+ this[key] = fixColor(this[key]);
27123
+ }
27124
+ }
27061
27125
 
27062
27126
  if (config.name || config.label) {
27063
27127
  this.name = config.name || config.label;
@@ -27067,29 +27131,15 @@ class TrackBase {
27067
27131
  this.name = getFilename$2(config.url);
27068
27132
  }
27069
27133
 
27134
+ this.url = config.url;
27135
+ if(this.config.type) this.type = this.config.type;
27070
27136
  this.id = this.config.id === undefined ? this.name : this.config.id;
27071
-
27072
27137
  this.order = config.order;
27073
-
27074
- if (config.color) this.color = fixColor(config.color);
27075
- if (config.altColor) this.altColor = fixColor(config.altColor);
27076
- if ("civic-ws" === config.sourceType) { // Ugly proxy for specialized track type
27077
- this.defaultColor = "rgb(155,20,20)";
27078
- } else {
27079
- this.defaultColor = "rgb(0,0,150)";
27080
- }
27081
-
27082
27138
  this.autoscaleGroup = config.autoscaleGroup;
27083
-
27084
27139
  this.removable = config.removable === undefined ? true : config.removable; // Defaults to true
27085
-
27086
- this.height = config.height || 100;
27087
- this.autoHeight = config.autoHeight;
27088
27140
  this.minHeight = config.minHeight || Math.min(25, this.height);
27089
27141
  this.maxHeight = config.maxHeight || Math.max(1000, this.height);
27090
27142
 
27091
- this.visibilityWindow = config.visibilityWindow;
27092
-
27093
27143
  if (config.onclick) {
27094
27144
  this.onclick = config.onclick;
27095
27145
  config.onclick = undefined; // functions cannot be saved in sessions, clear it here.
@@ -27146,17 +27196,18 @@ class TrackBase {
27146
27196
  }
27147
27197
 
27148
27198
  /**
27149
- * Default implementation -- update config with current values.
27150
- * to create session object for bookmarking, sharing. Updates the track "config" object to reflect the
27151
- * current state. Only simple properties (string, number, boolean) are updated.
27199
+ * Used to create session object for bookmarking, sharing. Only simple property values (string, number, boolean)
27200
+ * are saved.
27152
27201
  */
27153
27202
  getState() {
27154
27203
 
27204
+ const jsonable = (v) => !(v === undefined || typeof v === 'function' || v instanceof File || v instanceof Promise);
27205
+
27155
27206
  // Create copy of config, minus transient properties (convention is name starts with '_'). Also, all
27156
27207
  // function properties are transient as they cannot be saved in json
27157
27208
  const state = {};
27158
27209
  for (let key of Object.keys(this.config)) {
27159
- if (!key.startsWith("_") && typeof this.config[key] !== "function" && this.config[key] !== undefined) {
27210
+ if (!key.startsWith("_") && jsonable(this.config[key])) {
27160
27211
  state[key] = this.config[key];
27161
27212
  }
27162
27213
  }
@@ -27170,8 +27221,18 @@ class TrackBase {
27170
27221
  }
27171
27222
  }
27172
27223
 
27173
- if (this.color) state.color = this.color;
27174
- if (this.altColor) state.altColor = this.altColor;
27224
+ // If user has changed other properties from defaults update state.
27225
+ const defs = TrackBase.defaults;
27226
+ if (this.constructor.defaults) {
27227
+ for (let key of Object.keys(this.constructor.defaults)) {
27228
+ defs[key] = this.constructor.defaults[key];
27229
+ }
27230
+ }
27231
+ for (let key of Object.keys(defs)) {
27232
+ if (undefined !== this[key] && defs[key] !== this[key]) {
27233
+ state[key] = this[key];
27234
+ }
27235
+ }
27175
27236
 
27176
27237
  // Flatten dataRange if present
27177
27238
  if (!this.autoscale && this.dataRange) {
@@ -27179,22 +27240,6 @@ class TrackBase {
27179
27240
  state.max = this.dataRange.max;
27180
27241
  }
27181
27242
 
27182
-
27183
- // Check for non-json-if-yable properties. Perhaps we should test what can be saved.
27184
- for (let key of Object.keys(state)) {
27185
- const value = state[key];
27186
- if (typeof value === 'function') {
27187
- throw Error(`Property '${key}' of track '${this.name} is a function. Functions cannot be saved in sessions.`)
27188
- }
27189
- if (value instanceof File) { // Test specifically for File. Other types of File-like objects might be savable
27190
- const str = `Track ${this.name} is a local file. Sessions cannot be saved with local file references.`;
27191
- throw Error(str)
27192
- }
27193
- if (value instanceof Promise) {
27194
- throw Error(`Property '${key}' of track '${this.name} is a Promise. Promises cannot be saved in sessions.`)
27195
- }
27196
- }
27197
-
27198
27243
  return state
27199
27244
  }
27200
27245
 
@@ -27490,7 +27535,7 @@ class TrackBase {
27490
27535
  * @returns {*|string|string}
27491
27536
  */
27492
27537
  getColorForFeature(f) {
27493
- return (typeof this.color === "function") ? this.color(feature) : this.color || DEFAULT_COLOR$1
27538
+ return (typeof this.color === "function") ? this.color(feature) : this.color
27494
27539
  }
27495
27540
 
27496
27541
  /**
@@ -31894,6 +31939,7 @@ class TextFeatureSource {
31894
31939
 
31895
31940
  const queryableFormats = new Set(["bigwig", "bw", "bigbed", "bb", "biginteract", "biggenepred", "bignarrowpeak", "tdf"]);
31896
31941
 
31942
+ this.queryable = config.queryable === true; // False by default, unless explicitly set
31897
31943
  if (config.reader) {
31898
31944
  // Explicit reader implementation
31899
31945
  this.reader = config.reader;
@@ -31927,6 +31973,11 @@ class TextFeatureSource {
31927
31973
  this.queryable = true;
31928
31974
  } else ;
31929
31975
  }
31976
+
31977
+ // Set searchable unless explicitly turned off, or track uses in indexed or otherwise queryable
31978
+ // feature source. queryable => features loaded on demand (by query)
31979
+ this.searchable = config.searchable === true || config.searchableFields || (config.searchable !== false && !this.queryable);
31980
+
31930
31981
  }
31931
31982
 
31932
31983
  async defaultVisibilityWindow() {
@@ -32067,39 +32118,13 @@ class TextFeatureSource {
32067
32118
  this.featureCache = new FeatureCache$1(features, this.genome, genomicInterval);
32068
32119
 
32069
32120
  // If track is marked "searchable"< cache features by name -- use this with caution, memory intensive
32070
- if (this.config.searchable || this.config.searchableFields) {
32071
- this.addFeaturesToDB(features);
32121
+ if (this.searchable) {
32122
+ this.genome.addFeaturesToDB(features, this.config);
32072
32123
  }
32073
32124
  } else {
32074
32125
  this.featureCache = new FeatureCache$1([], genomicInterval); // Empty cache
32075
32126
  }
32076
32127
  }
32077
-
32078
- addFeaturesToDB(featureList) {
32079
- for (let feature of featureList) {
32080
- if (feature.name) {
32081
- this.genome.featureDB[feature.name.toUpperCase()] = feature;
32082
- }
32083
- if (feature.gene && feature.gene.name) {
32084
- this.genome.featureDB[feature.gene.name.toUpperCase()] = feature;
32085
- }
32086
-
32087
- if (this.config.searchableFields) {
32088
- for (let f of this.config.searchableFields) {
32089
- const value = feature.getAttributeValue(f);
32090
- if (value) {
32091
- if (value.indexOf(" ") > 0) {
32092
- this.genome.featureDB[value.replaceAll(" ", "+").toUpperCase()] = feature;
32093
- this.genome.featureDB[value.replaceAll(" ", "%20").toUpperCase()] = feature;
32094
- } else {
32095
- this.genome.featureDB[value.toUpperCase()] = feature;
32096
- }
32097
- }
32098
- }
32099
- }
32100
- }
32101
- }
32102
-
32103
32128
  }
32104
32129
 
32105
32130
  /*
@@ -32915,7 +32940,8 @@ function decodeWigData(data, chrIdx1, bpStart, chrIdx2, bpEnd, featureArray, chr
32915
32940
 
32916
32941
  const binaryParser = new BinaryParser(data);
32917
32942
  const chromId = binaryParser.getInt();
32918
- let chromStart = binaryParser.getInt();
32943
+ const blockStart = binaryParser.getInt();
32944
+ let chromStart = blockStart;
32919
32945
  let chromEnd = binaryParser.getInt();
32920
32946
  const itemStep = binaryParser.getInt();
32921
32947
  const itemSpan = binaryParser.getInt();
@@ -32925,6 +32951,7 @@ function decodeWigData(data, chrIdx1, bpStart, chrIdx2, bpEnd, featureArray, chr
32925
32951
 
32926
32952
  if (chromId >= chrIdx1 && chromId <= chrIdx2) {
32927
32953
 
32954
+ let idx = 0;
32928
32955
  while (itemCount-- > 0) {
32929
32956
  let value;
32930
32957
  switch (type) {
@@ -32940,8 +32967,9 @@ function decodeWigData(data, chrIdx1, bpStart, chrIdx2, bpEnd, featureArray, chr
32940
32967
  break
32941
32968
  case 3: // Fixed step
32942
32969
  value = binaryParser.getFloat();
32970
+ chromStart = blockStart + idx * itemStep;
32943
32971
  chromEnd = chromStart + itemSpan;
32944
- chromStart += itemStep;
32972
+ idx++;
32945
32973
  break
32946
32974
  }
32947
32975
 
@@ -32951,8 +32979,8 @@ function decodeWigData(data, chrIdx1, bpStart, chrIdx2, bpEnd, featureArray, chr
32951
32979
  if (Number.isFinite(value)) {
32952
32980
  const chr = chrDict[chromId];
32953
32981
  featureArray.push({chr: chr, start: chromStart, end: chromEnd, value: value});
32954
-
32955
32982
  }
32983
+
32956
32984
  }
32957
32985
  }
32958
32986
  }
@@ -33088,6 +33116,7 @@ class BWSource {
33088
33116
  this.genome = genome;
33089
33117
  this.format = config.format || "bigwig";
33090
33118
  this.wgValues = {};
33119
+ this.queryable = true;
33091
33120
  }
33092
33121
 
33093
33122
  async getFeatures({chr, start, end, bpPerPixel, windowFunction}) {
@@ -33629,6 +33658,7 @@ class TDFSource {
33629
33658
  this.genome = genome;
33630
33659
  this.windowFunction = config.windowFunction || "mean";
33631
33660
  this.reader = new TDFReader(config, genome);
33661
+ this.queryable = true;
33632
33662
  }
33633
33663
 
33634
33664
  async getFeatures({chr, start, end, bpPerPixel}) {
@@ -33838,8 +33868,8 @@ class StaticFeatureSource {
33838
33868
  this.config = config;
33839
33869
  this.genome = genome;
33840
33870
  this.queryable = false;
33871
+ this.searchable = config.searchable !== false; // searchable by default
33841
33872
  this.updateFeatures(config.features);
33842
-
33843
33873
  }
33844
33874
 
33845
33875
  updateFeatures(features) {
@@ -33849,6 +33879,10 @@ class StaticFeatureSource {
33849
33879
  mapProperties(features, this.config.mappings);
33850
33880
  }
33851
33881
  this.featureCache = new FeatureCache$1(features, this.genome);
33882
+
33883
+ if (this.searchable || this.config.searchableFields) {
33884
+ this.genome.addFeaturesToDB(features, this.config);
33885
+ }
33852
33886
  }
33853
33887
 
33854
33888
  /**
@@ -40042,8 +40076,8 @@ function renderFeature(feature, bpStart, xScale, pixelHeight, ctx, options) {
40042
40076
 
40043
40077
  // Set ctx color to a known valid color. If getColorForFeature returns an invalid color string it is ignored, and
40044
40078
  // this default will be used.
40045
- ctx.fillStyle = this.defaultColor;
40046
- ctx.strokeStyle = this.defaultColor;
40079
+ ctx.fillStyle = this.color;
40080
+ ctx.strokeStyle = this.color;
40047
40081
 
40048
40082
  const color = this.getColorForFeature(feature);
40049
40083
  ctx.fillStyle = color;
@@ -40367,6 +40401,17 @@ function renderFusionJuncSpan(feature, bpStart, xScale, pixelHeight, ctx) {
40367
40401
 
40368
40402
  class FeatureTrack extends TrackBase {
40369
40403
 
40404
+ static defaults = {
40405
+ type: "annotation",
40406
+ maxRows: 1000, // protects against pathological feature packing cases (# of rows of overlapping feaures)
40407
+ displayMode: "EXPANDED", // COLLAPSED | EXPANDED | SQUISHED
40408
+ margin: 10,
40409
+ featureHeight: 14,
40410
+ autoHeight: false,
40411
+ useScore: false
40412
+ }
40413
+
40414
+
40370
40415
  constructor(config, browser) {
40371
40416
  super(config, browser);
40372
40417
  }
@@ -40374,12 +40419,8 @@ class FeatureTrack extends TrackBase {
40374
40419
  init(config) {
40375
40420
  super.init(config);
40376
40421
 
40377
- this.type = config.type || "annotation";
40378
40422
 
40379
- // Set maxRows -- protects against pathological feature packing cases (# of rows of overlapping feaures)
40380
- this.maxRows = config.maxRows === undefined ? 1000 : config.maxRows;
40381
-
40382
- this.displayMode = config.displayMode || "EXPANDED"; // COLLAPSED | EXPANDED | SQUISHED
40423
+ // Obscure option, not common or supoorted, included for backward compatibility
40383
40424
  this.labelDisplayMode = config.labelDisplayMode;
40384
40425
 
40385
40426
  if (config._featureSource) {
@@ -40391,12 +40432,6 @@ class FeatureTrack extends TrackBase {
40391
40432
  FeatureSource(config, this.browser.genome);
40392
40433
  }
40393
40434
 
40394
- // Set default heights
40395
- this.autoHeight = config.autoHeight;
40396
- this.margin = config.margin === undefined ? 10 : config.margin;
40397
-
40398
- this.featureHeight = config.featureHeight || 14;
40399
-
40400
40435
  if ("FusionJuncSpan" === config.type) {
40401
40436
  this.render = config.render || renderFusionJuncSpan;
40402
40437
  this.squishedRowHeight = config.squishedRowHeight || 50;
@@ -40433,9 +40468,6 @@ class FeatureTrack extends TrackBase {
40433
40468
  }
40434
40469
  }
40435
40470
  }
40436
-
40437
- //UCSC useScore option
40438
- this.useScore = config.useScore;
40439
40471
  }
40440
40472
 
40441
40473
  async postInit() {
@@ -40799,7 +40831,7 @@ class FeatureTrack extends TrackBase {
40799
40831
  } else if (feature.color) {
40800
40832
  color = feature.color; // Explicit color for feature
40801
40833
  } else {
40802
- color = this.defaultColor; // Track default
40834
+ color = this.color; // Track default
40803
40835
  }
40804
40836
 
40805
40837
  if (feature.alpha && feature.alpha !== 1) {
@@ -40865,21 +40897,27 @@ class RegionTableBase {
40865
40897
 
40866
40898
  this.browser = config.browser;
40867
40899
 
40868
- this.container = domUtils.div({ class: 'igv-roi-table' });
40900
+ this.columnFormat = config.columnFormat;
40869
40901
 
40870
- config.parent.appendChild(this.container);
40902
+ this.tableRowSelectionList = [];
40871
40903
 
40872
- this.headerDOM = config;
40904
+ this.tableDOM = domUtils.div({ class: 'igv-roi-table' });
40905
+ // if(config.width) {
40906
+ // let [ w ] = config.width.split('px')
40907
+ // w = parseInt(w, 10)
40908
+ // this.tableDOM.style.width = `${Math.min(w, 1600)}px`
40909
+ //
40910
+ // }
40873
40911
 
40874
- this.columnTitleDOM = config.columnFormat;
40912
+ config.parent.appendChild(this.tableDOM);
40875
40913
 
40876
- this.rowContainerDOM = this.container;
40914
+ this.headerDOM = config;
40877
40915
 
40878
- this.footerDOM = config.gotoButtonHandler;
40916
+ this.tableColumnTitles = this.tableDOM;
40879
40917
 
40880
- this.columnFormat = config.columnFormat;
40918
+ this.tableRowContainer = this.tableDOM;
40881
40919
 
40882
- this.tableRowSelectionList = [];
40920
+ this.footerDOM = config.gotoButtonHandler;
40883
40921
 
40884
40922
  }
40885
40923
 
@@ -40887,12 +40925,12 @@ class RegionTableBase {
40887
40925
 
40888
40926
  // header
40889
40927
  const dom = domUtils.div();
40890
- this.container.appendChild(dom);
40928
+ this.tableDOM.appendChild(dom);
40891
40929
 
40892
40930
  // header title
40893
40931
  const div = domUtils.div();
40894
40932
  dom.appendChild(div);
40895
- div.innerText = headerTitle;
40933
+ div.innerHTML = headerTitle;
40896
40934
 
40897
40935
  // table dismiss button
40898
40936
  const dismiss = domUtils.div();
@@ -40911,46 +40949,51 @@ class RegionTableBase {
40911
40949
  const { y:y_root } = browser.root.getBoundingClientRect();
40912
40950
  const { y:y_parent } = parent.getBoundingClientRect();
40913
40951
  const constraint = -(y_parent - y_root);
40914
- makeDraggable(this.container, dom, { minX:0, minY:constraint });
40952
+ makeDraggable(this.tableDOM, dom, { minX:0, minY:constraint });
40915
40953
 
40916
- this.container.style.display = 'none';
40954
+ this.tableDOM.style.display = 'none';
40917
40955
 
40918
40956
  this._headerDOM = dom;
40919
40957
 
40920
40958
  }
40921
40959
 
40922
- set columnTitleDOM(columnFormat) {
40960
+ set tableColumnTitles(tableDOM) {
40923
40961
 
40924
- const dom = domUtils.div({ class: 'igv-roi-table-column-titles' });
40925
- this.container.appendChild(dom);
40962
+ const tblColumnTitles = domUtils.div({ class: 'igv-roi-table-column-titles' });
40963
+ tableDOM.appendChild(tblColumnTitles);
40926
40964
 
40927
- for (const { label, width } of columnFormat) {
40965
+ for (const { label, width } of this.columnFormat) {
40928
40966
  const col = domUtils.div();
40929
- dom.appendChild(col);
40967
+ tblColumnTitles.appendChild(col);
40930
40968
  col.style.width = width;
40931
40969
  col.innerText = label;
40932
40970
  }
40933
40971
 
40972
+ this._tableColumnTitlesDOM = tblColumnTitles;
40973
+
40974
+ }
40975
+
40976
+ get tableColumnTitles() {
40977
+ return this._tableColumnTitlesDOM
40934
40978
  }
40935
40979
 
40936
- set rowContainerDOM(container) {
40980
+ set tableRowContainer(container) {
40937
40981
 
40938
- const dom = domUtils.div({ class: 'igv-roi-table-row-container' });
40939
- container.appendChild(dom);
40982
+ const tblRowContainer = domUtils.div({ class: 'igv-roi-table-row-container' });
40983
+ container.appendChild(tblRowContainer);
40940
40984
 
40941
- dom.style.minWidth = this.config.width;
40985
+ this._tableRowContainerDOM = tblRowContainer;
40942
40986
 
40943
- this._rowContainerDOM = dom;
40944
40987
  }
40945
40988
 
40946
- get rowContainerDOM() {
40947
- return this._rowContainerDOM
40989
+ get tableRowContainer() {
40990
+ return this._tableRowContainerDOM
40948
40991
  }
40949
40992
 
40950
40993
  set footerDOM(gotoButtonHandler) {
40951
40994
 
40952
40995
  const dom = domUtils.div();
40953
- this.container.appendChild(dom);
40996
+ this.tableDOM.appendChild(dom);
40954
40997
 
40955
40998
  // Go To Button
40956
40999
  const gotoButton = domUtils.div({class: 'igv-roi-table-button'});
@@ -40992,7 +41035,7 @@ class RegionTableBase {
40992
41035
  }
40993
41036
 
40994
41037
  clearTable() {
40995
- const elements = this.rowContainerDOM.querySelectorAll('.igv-roi-table-row');
41038
+ const elements = this.tableRowContainer.querySelectorAll('.igv-roi-table-row');
40996
41039
  for (let el of elements) {
40997
41040
  el.remove();
40998
41041
  }
@@ -41004,23 +41047,23 @@ class RegionTableBase {
41004
41047
  }
41005
41048
 
41006
41049
  present() {
41007
- this.container.style.left = `${ 0 }px`;
41050
+ this.tableDOM.style.left = `${ 0 }px`;
41008
41051
 
41009
41052
  const { y:y_root } = this.browser.root.getBoundingClientRect();
41010
41053
  const { y:y_parent } = this.config.parent.getBoundingClientRect();
41011
41054
 
41012
- this.container.style.top = `${ y_root - y_parent }px`;
41013
- this.container.style.display = 'flex';
41055
+ this.tableDOM.style.top = `${ y_root - y_parent }px`;
41056
+ this.tableDOM.style.display = 'flex';
41014
41057
  }
41015
41058
 
41016
41059
  dismiss() {
41017
- this.container.style.display = 'none';
41060
+ this.tableDOM.style.display = 'none';
41018
41061
  }
41019
41062
 
41020
41063
  dispose() {
41021
41064
 
41022
- this.container.innerHTML = '';
41023
- this.container.remove();
41065
+ this.tableDOM.innerHTML = '';
41066
+ this.tableDOM.remove();
41024
41067
 
41025
41068
  for (const key of Object.keys(this)) {
41026
41069
  this[key] = undefined;
@@ -41036,41 +41079,35 @@ class BlatTable extends RegionTableBase {
41036
41079
 
41037
41080
  constructor(config) {
41038
41081
 
41039
- const cooked = Object.assign({ 'width':'1040px' }, config);
41082
+ const cooked = Object.assign({ 'width':'1024px' }, config);
41040
41083
  super(cooked);
41041
41084
 
41042
41085
  this.descriptionDOM = config;
41043
41086
 
41044
41087
  }
41045
41088
 
41046
-
41047
- set columnTitleDOM(columnFormat) {
41048
-
41049
- const dom = domUtils.div({ class: 'igv-roi-table-column-titles' });
41050
- this.container.appendChild(dom);
41051
-
41052
- for (const format of columnFormat) {
41053
- const col = domUtils.div();
41054
- dom.appendChild(col);
41055
- col.style.width = format.width || 'fit-content';
41056
- col.innerText = format.label;
41057
- }
41058
-
41059
- }
41060
-
41061
41089
  set descriptionDOM(config) {
41062
41090
 
41063
41091
  if (config.description) {
41064
41092
 
41065
41093
  let dom;
41066
41094
 
41067
- const found = this.container.querySelector('.igv-roi-table-column-titles');
41095
+ // BLAT result for query sequence
41068
41096
  dom = domUtils.div({ class: 'igv-roi-table-description' });
41069
- this.container.insertBefore(dom, found);
41097
+ this.tableDOM.insertBefore(dom, this.tableColumnTitles);
41098
+ dom.style.height = 'auto';
41099
+ dom.innerHTML = `BLAT result for query sequence:`;
41100
+
41101
+ // CTAATCAtctacactggtttctactg ...
41102
+ dom = domUtils.div({ class: 'igv-roi-table-description' });
41103
+ this.tableDOM.insertBefore(dom, this.tableColumnTitles);
41104
+ dom.style.height = 'auto';
41105
+ dom.style.maxHeight = '128px';
41070
41106
  dom.innerHTML = config.description;
41071
41107
 
41108
+ // Select one or more rows ...
41072
41109
  dom = domUtils.div({ class: 'igv-roi-table-goto-explainer' });
41073
- this.container.insertBefore(dom, found);
41110
+ this.tableDOM.insertBefore(dom, this.tableColumnTitles);
41074
41111
  dom.innerHTML = `Select one or more rows and click Go To to view the regions`;
41075
41112
 
41076
41113
  }
@@ -41100,13 +41137,13 @@ class BlatTable extends RegionTableBase {
41100
41137
 
41101
41138
  renderTable(records) {
41102
41139
 
41103
- Array.from(this.rowContainerDOM.querySelectorAll('.igv-roi-table-row')).forEach(el => el.remove());
41140
+ Array.from(this.tableRowContainer.querySelectorAll('.igv-roi-table-row')).forEach(el => el.remove());
41104
41141
 
41105
41142
  if (records.length > 0) {
41106
41143
 
41107
41144
  for (let record of records) {
41108
41145
  const row = this.tableRowDOM(record);
41109
- this.rowContainerDOM.appendChild(row);
41146
+ this.tableRowContainer.appendChild(row);
41110
41147
  }
41111
41148
 
41112
41149
  }
@@ -41154,7 +41191,7 @@ class BlatTable extends RegionTableBase {
41154
41191
 
41155
41192
  event.stopPropagation();
41156
41193
 
41157
- const selectedRows = this.container.querySelectorAll('.igv-roi-table-row-selected');
41194
+ const selectedRows = this.tableDOM.querySelectorAll('.igv-roi-table-row-selected');
41158
41195
 
41159
41196
  const loci = [];
41160
41197
  for (const row of selectedRows) {
@@ -41166,7 +41203,7 @@ class BlatTable extends RegionTableBase {
41166
41203
  loci.push(`${ chr }:${ start }-${ end }`);
41167
41204
  }
41168
41205
 
41169
- for (const el of this.container.querySelectorAll('.igv-roi-table-row')) {
41206
+ for (const el of this.tableDOM.querySelectorAll('.igv-roi-table-row')) {
41170
41207
  el.classList.remove('igv-roi-table-row-selected');
41171
41208
  }
41172
41209
 
@@ -41188,16 +41225,16 @@ http://genome.ucsc.edu/cgi-bin/hgBlat
41188
41225
  &output=json
41189
41226
  */
41190
41227
 
41191
-
41192
41228
  //const blatServer = "https://genome.ucsc.edu/cgi-bin/hgBlat"
41193
- const blatServer = "https://igv.org/services/blat.php";
41229
+ const defaultBlatServer = "https://igv.org/services/blatUCSC.php";
41230
+ //const blatServer = "http://localhost:8000/blatUCSC.php"
41194
41231
 
41195
41232
 
41196
- async function blat(userSeq, db) {
41233
+ async function blat({url, userSeq, db}) {
41197
41234
 
41198
- const url = `${blatServer}?userSeq=${userSeq}&type=DNA&db=${db}&output=json`;
41235
+ url = url || defaultBlatServer;
41199
41236
 
41200
- const results = await igvxhr.loadJson(url, {});
41237
+ const results = await postData(url, userSeq, db);
41201
41238
 
41202
41239
  results.fields;
41203
41240
 
@@ -41206,8 +41243,19 @@ async function blat(userSeq, db) {
41206
41243
  return features
41207
41244
  }
41208
41245
 
41209
- class BlatTrack extends FeatureTrack {
41246
+ async function postData(url = "", userSeq, db) {
41210
41247
 
41248
+ const data = new URLSearchParams();
41249
+ data.append("userSeq", userSeq);
41250
+ data.append("db", db);
41251
+
41252
+ const response = await fetch(url, { method: "post", body: data });
41253
+ return response.json(); // parses JSON response into native JavaScript objects
41254
+ }
41255
+
41256
+ const maxSequenceSize = 25000;
41257
+
41258
+ class BlatTrack extends FeatureTrack {
41211
41259
 
41212
41260
  constructor(config, browser) {
41213
41261
  super(config, browser);
@@ -41243,7 +41291,7 @@ class BlatTrack extends FeatureTrack {
41243
41291
  browser: this.browser,
41244
41292
  parent: this.browser.parent,
41245
41293
  headerTitle: this.config.title,
41246
- description: `BLAT result for query sequence:<br>${ this.sequence }`,
41294
+ description: this.sequence,
41247
41295
  dismissHandler: () => {
41248
41296
  this.table.dismiss();
41249
41297
  this.table.dispose();
@@ -41292,21 +41340,34 @@ class BlatTrack extends FeatureTrack {
41292
41340
 
41293
41341
  async function createBlatTrack({sequence, browser, name, title}) {
41294
41342
 
41343
+ if (sequence.length > maxSequenceSize) {
41344
+ browser.alert.present(`Sequence size exceeds maximum allowed length (${sequence.length} > ${maxSequenceSize})`);
41345
+ return
41346
+ }
41347
+
41295
41348
  const db = browser.genome.id; // TODO -- blat specific property
41296
41349
 
41297
- const features = await blat(sequence, db);
41350
+ const url = browser.config["blatServerURL"];
41298
41351
 
41299
- const trackConfig = {
41300
- type: 'blat',
41301
- name: name || 'blat results',
41302
- title: title || 'blat results',
41303
- sequence: sequence,
41304
- features: features
41305
- };
41352
+ try {
41353
+
41354
+ const features = await blat({url, userSeq: sequence, db});
41355
+ const trackConfig = {
41356
+ type: 'blat',
41357
+ name: name || 'blat results',
41358
+ title: title || 'blat results',
41359
+ sequence: sequence,
41360
+ altColor: 'rgb(176, 176, 236)',
41361
+ color: 'rgb(236, 176, 176)',
41362
+ features: features
41363
+ };
41306
41364
 
41307
- const track = await browser.loadTrack(trackConfig);
41365
+ const track = await browser.loadTrack(trackConfig);
41366
+ track.openTableView();
41308
41367
 
41309
- track.openTableView();
41368
+ } catch (e) {
41369
+ browser.alert.present(`Error performing blat search: ${e}`);
41370
+ }
41310
41371
 
41311
41372
  }
41312
41373
 
@@ -41337,8 +41398,6 @@ async function createBlatTrack({sequence, browser, name, title}) {
41337
41398
 
41338
41399
  const alignmentStartGap = 5;
41339
41400
  const downsampleRowHeight = 5;
41340
- const DEFAULT_COVERAGE_TRACK_HEIGHT = 50;
41341
- const DEFAULT_TRACK_HEIGHT$1 = 300;
41342
41401
  const DEFAULT_ALIGNMENT_COLOR = "rgb(185, 185, 185)";
41343
41402
  const DEFAULT_COVERAGE_COLOR = "rgb(150, 150, 150)";
41344
41403
  const DEFAULT_CONNECTOR_COLOR = "rgb(200, 200, 200)";
@@ -41346,35 +41405,37 @@ const MINIMUM_BLAT_LENGTH = 20;
41346
41405
 
41347
41406
  class BAMTrack extends TrackBase {
41348
41407
 
41408
+ static defaults = {
41409
+ alleleFreqThreshold: 0.2,
41410
+ visibilityWindow: 30000,
41411
+ showCoverage: true,
41412
+ showAlignments: true,
41413
+ viewAsPairs: false,
41414
+ pairsSupported: true,
41415
+ showSoftClips: false,
41416
+ showAllBases: false,
41417
+ showInsertions: true,
41418
+ showMismatches: true,
41419
+ color: DEFAULT_ALIGNMENT_COLOR,
41420
+ coverageColor: DEFAULT_COVERAGE_COLOR,
41421
+ height: 300,
41422
+ coverageTrackHeight: 50
41423
+ }
41424
+
41349
41425
  constructor(config, browser) {
41350
41426
  super(config, browser);
41351
41427
  }
41352
41428
 
41353
41429
  init(config) {
41354
- super.init(config);
41355
- this.type = "alignment";
41356
-
41357
- if (config.alleleFreqThreshold === undefined) {
41358
- config.alleleFreqThreshold = 0.2;
41359
- }
41360
41430
 
41431
+ this.type = "alignment";
41361
41432
  this.featureSource = new BamSource(config, this.browser);
41362
-
41363
- this.showCoverage = config.showCoverage === undefined ? true : config.showCoverage;
41364
- this.showAlignments = config.showAlignments === undefined ? true : config.showAlignments;
41365
-
41366
41433
  this.coverageTrack = new CoverageTrack(config, this);
41367
41434
  this.alignmentTrack = new AlignmentTrack(config, this);
41435
+
41436
+ super.init(config);
41437
+
41368
41438
  this.alignmentTrack.setTop(this.coverageTrack, this.showCoverage);
41369
- this.visibilityWindow = config.visibilityWindow || 30000;
41370
- this.viewAsPairs = config.viewAsPairs;
41371
- this.pairsSupported = config.pairsSupported !== false;
41372
- this.showSoftClips = config.showSoftClips;
41373
- this.showAllBases = config.showAllBases;
41374
- this.showInsertions = false !== config.showInsertions;
41375
- this.showMismatches = false !== config.showMismatches;
41376
- this.color = config.color;
41377
- this.coverageColor = config.coverageColor;
41378
41439
 
41379
41440
  // The sort object can be an array in the case of multi-locus view, however if multiple sort positions
41380
41441
  // are present for a given reference frame the last one will take precedence
@@ -41387,14 +41448,12 @@ class BAMTrack extends TrackBase {
41387
41448
  }
41388
41449
  }
41389
41450
 
41390
- // Invoke height setter last to allocated to coverage and alignment tracks
41391
- this.height = (config.height !== undefined ? config.height : DEFAULT_TRACK_HEIGHT$1);
41392
41451
  }
41393
41452
 
41394
41453
  set height(h) {
41395
41454
  this._height = h;
41396
- if (this.coverageTrack && this.showAlignments) {
41397
- this.alignmentTrack.height = this.showCoverage ? h - this.coverageTrack.height : h;
41455
+ if (this.showAlignments) {
41456
+ this.alignmentTrack.height = this.showCoverage ? h - this.coverageTrackHeight : h;
41398
41457
  }
41399
41458
  }
41400
41459
 
@@ -41481,16 +41540,15 @@ class BAMTrack extends TrackBase {
41481
41540
  * @returns {number}
41482
41541
  */
41483
41542
  computePixelHeight(alignmentContainer) {
41484
- return (this.showCoverage ? this.coverageTrack.height : 0) +
41485
- (this.showAlignments ? this.alignmentTrack.computePixelHeight(alignmentContainer) : 0) +
41486
- 15
41543
+ return (this.showCoverage ? this.coverageTrackHeight : 0) +
41544
+ (this.showAlignments ? this.alignmentTrack.computePixelHeight(alignmentContainer) : 0)
41487
41545
  }
41488
41546
 
41489
41547
  draw(options) {
41490
41548
 
41491
41549
  IGVGraphics.fillRect(options.context, 0, options.pixelTop, options.pixelWidth, options.pixelHeight, {'fillStyle': "rgb(255, 255, 255)"});
41492
41550
 
41493
- if (true === this.showCoverage && this.coverageTrack.height > 0) {
41551
+ if (true === this.showCoverage && this.coverageTrackHeight > 0) {
41494
41552
  this.trackView.axisCanvas.style.display = 'block';
41495
41553
  this.coverageTrack.draw(options);
41496
41554
  } else {
@@ -41505,12 +41563,12 @@ class BAMTrack extends TrackBase {
41505
41563
 
41506
41564
  paintAxis(ctx, pixelWidth, pixelHeight) {
41507
41565
 
41508
- this.coverageTrack.paintAxis(ctx, pixelWidth, this.coverageTrack.height);
41566
+ this.coverageTrack.paintAxis(ctx, pixelWidth, this.coverageTrackHeight);
41509
41567
 
41510
41568
  // if (this.browser.isMultiLocusMode()) {
41511
41569
  // ctx.clearRect(0, 0, pixelWidth, pixelHeight);
41512
41570
  // } else {
41513
- // this.coverageTrack.paintAxis(ctx, pixelWidth, this.coverageTrack.height);
41571
+ // this.coverageTrack.paintAxis(ctx, pixelWidth, this.coverageTrackHeight);
41514
41572
  // }
41515
41573
  }
41516
41574
 
@@ -41519,7 +41577,7 @@ class BAMTrack extends TrackBase {
41519
41577
  }
41520
41578
 
41521
41579
  popupData(clickState) {
41522
- if (true === this.showCoverage && clickState.y >= this.coverageTrack.top && clickState.y < this.coverageTrack.height) {
41580
+ if (true === this.showCoverage && clickState.y >= this.coverageTrack.top && clickState.y < this.coverageTrackHeight) {
41523
41581
  return this.coverageTrack.popupData(clickState)
41524
41582
  } else {
41525
41583
  return this.alignmentTrack.popupData(clickState)
@@ -41534,7 +41592,7 @@ class BAMTrack extends TrackBase {
41534
41592
  clickedFeatures(clickState) {
41535
41593
 
41536
41594
  let clickedObject;
41537
- if (true === this.showCoverage && clickState.y >= this.coverageTrack.top && clickState.y < this.coverageTrack.height) {
41595
+ if (true === this.showCoverage && clickState.y >= this.coverageTrack.top && clickState.y < this.coverageTrackHeight) {
41538
41596
  clickedObject = this.coverageTrack.getClickedObject(clickState);
41539
41597
  } else {
41540
41598
  clickedObject = this.alignmentTrack.getClickedObject(clickState);
@@ -41543,7 +41601,7 @@ class BAMTrack extends TrackBase {
41543
41601
  }
41544
41602
 
41545
41603
  hoverText(clickState) {
41546
- if (true === this.showCoverage && clickState.y >= this.coverageTrack.top && clickState.y < this.coverageTrack.height) {
41604
+ if (true === this.showCoverage && clickState.y >= this.coverageTrack.top && clickState.y < this.coverageTrackHeight) {
41547
41605
  const clickedObject = this.coverageTrack.getClickedObject(clickState);
41548
41606
  if (clickedObject) {
41549
41607
  return clickedObject.hoverText()
@@ -41583,8 +41641,8 @@ class BAMTrack extends TrackBase {
41583
41641
  // Show coverage / alignment options
41584
41642
  const adjustTrackHeight = () => {
41585
41643
  if (!this.autoHeight) {
41586
- const h = 15 +
41587
- (this.showCoverage ? this.coverageTrack.height : 0) +
41644
+ const h =
41645
+ (this.showCoverage ? this.coverageTrackHeight : 0) +
41588
41646
  (this.showAlignments ? this.alignmentTrack.height : 0);
41589
41647
  this.trackView.setTrackHeight(h);
41590
41648
  }
@@ -41898,7 +41956,6 @@ class CoverageTrack {
41898
41956
  constructor(config, parent) {
41899
41957
  this.parent = parent;
41900
41958
  this.featureSource = parent.featureSource;
41901
- this.height = config.coverageTrackHeight !== undefined ? config.coverageTrackHeight : DEFAULT_COVERAGE_TRACK_HEIGHT;
41902
41959
 
41903
41960
  this.paintAxis = paintAxis;
41904
41961
  this.top = 0;
@@ -41913,6 +41970,10 @@ class CoverageTrack {
41913
41970
 
41914
41971
  }
41915
41972
 
41973
+ get height() {
41974
+ return this.parent.coverageTrackHeight
41975
+ }
41976
+
41916
41977
  draw(options) {
41917
41978
 
41918
41979
  const pixelTop = options.pixelTop;
@@ -42659,18 +42720,21 @@ class AlignmentTrack {
42659
42720
  // TODO if genome supports blat
42660
42721
  const seqstring = clickedAlignment.seq;
42661
42722
  if (seqstring && "*" != seqstring) {
42662
- list.push({
42663
- label: 'BLAT read sequence',
42664
- click: () => {
42665
- const sequence = clickedAlignment.isNegativeStrand() ? reverseComplementSequence(seqstring) : seqstring;
42666
- const name = `${clickedAlignment.readName} - blat`;
42667
- const title = `${this.parent.name} - ${name}`;
42668
- createBlatTrack({sequence, browser: this.browser, name, title});
42669
- }
42670
- });
42723
+
42724
+ if (seqstring.length < maxSequenceSize) {
42725
+ list.push({
42726
+ label: 'BLAT read sequence',
42727
+ click: () => {
42728
+ const sequence = clickedAlignment.isNegativeStrand() ? reverseComplementSequence(seqstring) : seqstring;
42729
+ const name = `${clickedAlignment.readName} - blat`;
42730
+ const title = `${this.parent.name} - ${name}`;
42731
+ createBlatTrack({sequence, browser: this.browser, name, title});
42732
+ }
42733
+ });
42734
+ }
42671
42735
 
42672
42736
  const softClips = clickedAlignment.softClippedBlocks();
42673
- if (softClips.left && softClips.left.len > MINIMUM_BLAT_LENGTH) {
42737
+ if (softClips.left && softClips.left.len > MINIMUM_BLAT_LENGTH && softClips.left.len < maxSequenceSize) {
42674
42738
  list.push({
42675
42739
  label: 'BLAT left soft-clipped sequence',
42676
42740
  click: () => {
@@ -42682,7 +42746,7 @@ class AlignmentTrack {
42682
42746
  }
42683
42747
  });
42684
42748
  }
42685
- if (softClips.right && softClips.right.length > MINIMUM_BLAT_LENGTH) {
42749
+ if (softClips.right && softClips.right.len > MINIMUM_BLAT_LENGTH && softClips.right.len < maxSequenceSize) {
42686
42750
  list.push({
42687
42751
  label: 'BLAT right soft-clipped sequence',
42688
42752
  click: () => {
@@ -44604,25 +44668,34 @@ function renderSVGAxis(context, track, axisCanvas, deltaX, deltaY) {
44604
44668
  * THE SOFTWARE.
44605
44669
  */
44606
44670
 
44607
- const DEFAULT_COLOR = "rgb(150,150,150)";
44608
-
44609
44671
  class WigTrack extends TrackBase {
44610
44672
 
44673
+ static defaults = {
44674
+ height: 50,
44675
+ color: 'rgb(150, 150, 150)',
44676
+ altColor: 'rgb(150, 150, 150)',
44677
+ flipAxis: false,
44678
+ logScale: false,
44679
+ windowFunction: 'mean',
44680
+ graphType: 'bar',
44681
+ autoscale: true,
44682
+ normalize: undefined,
44683
+ scaleFactor: undefined
44684
+ }
44685
+
44611
44686
  constructor(config, browser) {
44612
44687
  super(config, browser);
44613
44688
  }
44614
44689
 
44615
44690
  init(config) {
44691
+
44616
44692
  super.init(config);
44617
44693
 
44618
44694
  this.type = "wig";
44619
- this.height = config.height || 50;
44620
44695
  this.featureType = 'numeric';
44621
44696
  this.paintAxis = paintAxis;
44622
44697
 
44623
44698
  const format = config.format ? config.format.toLowerCase() : config.format;
44624
- this.flipAxis = config.flipAxis ? config.flipAxis : false;
44625
- this.logScale = config.logScale ? config.logScale : false;
44626
44699
  if (config.featureSource) {
44627
44700
  this.featureSource = config.featureSource;
44628
44701
  delete config.featureSource;
@@ -44634,18 +44707,16 @@ class WigTrack extends TrackBase {
44634
44707
  this.featureSource = FeatureSource(config, this.browser.genome);
44635
44708
  }
44636
44709
 
44637
- this.autoscale = config.autoscale || config.max === undefined;
44638
- if (!this.autoscale) {
44710
+
44711
+ // Override autoscale default
44712
+ if(config.max === undefined || config.autoscale === true) {
44713
+ this.autoscale = true;
44714
+ } else {
44639
44715
  this.dataRange = {
44640
44716
  min: config.min || 0,
44641
44717
  max: config.max
44642
44718
  };
44643
44719
  }
44644
-
44645
- this.windowFunction = config.windowFunction || "mean";
44646
- this.graphType = config.graphType || "bar";
44647
- this.normalize = config.normalize; // boolean, for use with "TDF" files
44648
- this.scaleFactor = config.scaleFactor; // optional scale factor, ignored if normalize === true;
44649
44720
  }
44650
44721
 
44651
44722
  async postInit() {
@@ -44735,7 +44806,7 @@ class WigTrack extends TrackBase {
44735
44806
  const pixelWidth = options.pixelWidth;
44736
44807
  options.pixelHeight;
44737
44808
  const bpEnd = bpStart + pixelWidth * bpPerPixel + 1;
44738
- const posColor = this.color || DEFAULT_COLOR;
44809
+ const posColor = this.color || WigTrack.defaults.color;
44739
44810
 
44740
44811
  let baselineColor;
44741
44812
  if (typeof posColor === "string" && posColor.startsWith("rgb(")) {
@@ -44879,7 +44950,7 @@ class WigTrack extends TrackBase {
44879
44950
  */
44880
44951
 
44881
44952
  getColorForFeature(f) {
44882
- let c = (f.value < 0 && this.altColor) ? this.altColor : this.color || DEFAULT_COLOR;
44953
+ let c = (f.value < 0 && this.altColor) ? this.altColor : this.color || WigTrack.defaults.color;
44883
44954
  return (typeof c === "function") ? c(f.value) : c
44884
44955
  }
44885
44956
 
@@ -44890,20 +44961,6 @@ class WigTrack extends TrackBase {
44890
44961
  this.trackView = undefined;
44891
44962
  }
44892
44963
 
44893
- /**
44894
- * Return the current state of the track. Used to create sessions and bookmarks.
44895
- *
44896
- * @returns {*|{}}
44897
- */
44898
- getState() {
44899
-
44900
- const config = super.getState();
44901
-
44902
- if (this.flipAxis !== undefined) config.flipAxis = this.flipAxis;
44903
- if (this.logScale !== undefined) config.logScale = this.logScale;
44904
-
44905
- return config
44906
- }
44907
44964
  }
44908
44965
 
44909
44966
  /**
@@ -45791,6 +45848,17 @@ const DEFAULT_ARC_COLOR = "rgb(180,25,137)";
45791
45848
 
45792
45849
  class InteractionTrack extends TrackBase {
45793
45850
 
45851
+ static defaults = {
45852
+ height: 250,
45853
+ theta: Math.PI / 4,
45854
+ arcOrientation: true,
45855
+ showBlocks: true,
45856
+ blockHeight: 3,
45857
+ thickness: 1,
45858
+ alpha: 0.02,
45859
+ logScale: true,
45860
+ }
45861
+
45794
45862
  constructor(config, browser) {
45795
45863
  super(config, browser);
45796
45864
  }
@@ -45798,16 +45866,10 @@ class InteractionTrack extends TrackBase {
45798
45866
  init(config) {
45799
45867
 
45800
45868
  super.init(config);
45801
- this.theta = config.theta || Math.PI / 4;
45869
+
45802
45870
  this.sinTheta = Math.sin(this.theta);
45803
45871
  this.cosTheta = Math.cos(this.theta);
45804
- this.height = config.height || 250;
45805
45872
  this.arcType = getArcType(config); // nested | proportional | inView | partialInView
45806
- this.arcOrientation = (config.arcOrientation === undefined ? true : config.arcOrientation); // true for up, false for down
45807
- this.showBlocks = config.showBlocks === undefined ? true : config.showBlocks;
45808
- this.blockHeight = config.blockHeight || 3;
45809
- this.thickness = config.thickness || 1;
45810
- this.color = config.color;
45811
45873
  this.alpha = config.alpha || 0.02; // was: 0.15
45812
45874
  this.painter = {flipAxis: !this.arcOrientation, dataRange: this.dataRange, paintAxis: paintAxis};
45813
45875
 
@@ -45819,7 +45881,6 @@ class InteractionTrack extends TrackBase {
45819
45881
  this.valueColumn = "score";
45820
45882
  }
45821
45883
 
45822
- this.logScale = config.logScale !== false; // i.e. defaul to true (undefined => true)
45823
45884
  if (config.max) {
45824
45885
  this.dataRange = {
45825
45886
  min: config.min || 0,
@@ -45844,7 +45905,7 @@ class InteractionTrack extends TrackBase {
45844
45905
 
45845
45906
  if (typeof this.featureSource.getHeader === "function") {
45846
45907
  this.header = await this.featureSource.getHeader();
45847
- if(this.disposed) return; // This track was removed during async load
45908
+ if (this.disposed) return; // This track was removed during async load
45848
45909
  }
45849
45910
 
45850
45911
  // Set properties from track line
@@ -45917,7 +45978,7 @@ class InteractionTrack extends TrackBase {
45917
45978
  feature.drawState = undefined;
45918
45979
 
45919
45980
  let color;
45920
- if(typeof this.color === 'function') {
45981
+ if (typeof this.color === 'function') {
45921
45982
  color = this.color(feature);
45922
45983
  } else {
45923
45984
  color = this.color || feature.color || DEFAULT_ARC_COLOR;
@@ -46262,7 +46323,7 @@ class InteractionTrack extends TrackBase {
46262
46323
  contextMenuItemList(clickState) {
46263
46324
 
46264
46325
  // Experimental JBrowse feature
46265
- if (this.browser.circularView ) {
46326
+ if (this.browser.circularView) {
46266
46327
  const viewport = clickState.viewport;
46267
46328
  const list = [];
46268
46329
 
@@ -46291,7 +46352,7 @@ class InteractionTrack extends TrackBase {
46291
46352
 
46292
46353
  // inView features are simply features that have been drawn, i.e. have a drawState
46293
46354
  const inView = cachedFeatures.filter(f => f.drawState);
46294
- if(inView.length === 0) return;
46355
+ if (inView.length === 0) return;
46295
46356
 
46296
46357
  const chords = makeBedPEChords(inView);
46297
46358
  sendChords(chords, this, refFrame, 0.5);
@@ -46327,7 +46388,7 @@ class InteractionTrack extends TrackBase {
46327
46388
 
46328
46389
  popupData(clickState, features) {
46329
46390
 
46330
- if(features === undefined) features = this.clickedFeatures(clickState);
46391
+ if (features === undefined) features = this.clickedFeatures(clickState);
46331
46392
 
46332
46393
  const data = [];
46333
46394
  for (let feature of features) {
@@ -46351,7 +46412,7 @@ class InteractionTrack extends TrackBase {
46351
46412
  const columnNames = this.header.columnNames;
46352
46413
  const stdColumns = this.header.hiccups ? 6 : 10;
46353
46414
  for (let i = stdColumns; i < columnNames.length; i++) {
46354
- if(this.header.colorColumn === i) continue;
46415
+ if (this.header.colorColumn === i) continue;
46355
46416
  if (columnNames[i] === 'info') {
46356
46417
  extractInfoColumn(data, f.extras[i - stdColumns]);
46357
46418
  } else {
@@ -46373,7 +46434,7 @@ class InteractionTrack extends TrackBase {
46373
46434
 
46374
46435
  // We use the cached features rather than method to avoid async load. If the
46375
46436
  // feature is not already loaded this won't work, but the user wouldn't be mousing over it either.
46376
- const featureList = clickState.viewport.cachedFeatures;
46437
+ const featureList = clickState.viewport.cachedFeatures;
46377
46438
  const candidates = [];
46378
46439
  if (featureList) {
46379
46440
  const proportional = (this.arcType === "proportional" || this.arcType === "inView" || this.arcType === "partialInView");
@@ -46419,26 +46480,6 @@ class InteractionTrack extends TrackBase {
46419
46480
  }
46420
46481
  return candidates.map((c) => c.feature)
46421
46482
  }
46422
-
46423
- /**
46424
- * Return the current state of the track. Used to create sessions and bookmarks.
46425
- *
46426
- * @returns {*|{}}
46427
- */
46428
- getState() {
46429
-
46430
- const config = super.getState();
46431
-
46432
- // if (this.height !== undefined) config.height = this.height;
46433
- if (this.arcType !== undefined) config.arcType = this.arcType;
46434
- if (this.arcOrientation !== undefined) config.arcOrientation = this.arcOrientation;
46435
- if (this.showBlocks !== undefined) config.showBlocks = this.showBlocks;
46436
- if (this.blockHeight !== undefined) config.blockHeight = this.blockHeight;
46437
- if (this.thickness !== undefined) config.thickness = this.thickness;
46438
- if (this.alpha !== undefined) config.alpha = this.alpha;
46439
-
46440
- return config
46441
- }
46442
46483
  }
46443
46484
 
46444
46485
  function getMidpoints(feature, genome) {
@@ -46645,6 +46686,31 @@ const STANDARD_FIELDS = new Map([["REF", "referenceBases"], ["ALT", "alternateBa
46645
46686
 
46646
46687
  class VariantTrack extends TrackBase {
46647
46688
 
46689
+ static defaults = {
46690
+ displayMode: "EXPANDED",
46691
+ sortDirection: "ASC",
46692
+ showGenotypes: true,
46693
+ squishedVariantHeight: 2,
46694
+ squishedCallHeight: 1,
46695
+ expandedCallHeight: 10,
46696
+ expandedVGap: 2,
46697
+ squishedVGap: 1,
46698
+ expandedGroupGap: 10,
46699
+ squishedGroupGap: 5,
46700
+ featureHeight: 14,
46701
+ noGenotypeColor: "rgb(200,180,180)",
46702
+ noCallColor: "rgb(225, 225, 225)",
46703
+ nonRefColor: "rgb(200, 200, 215)",
46704
+ mixedColor: "rgb(200, 220, 200)",
46705
+ homrefColor: "rgb(200, 200, 200)",
46706
+ homvarColor: "rgb(17,248,254)",
46707
+ hetvarColor: "rgb(34,12,253)",
46708
+ colorBy: undefined,
46709
+ visibilityWindow: undefined,
46710
+ labelDisplayMode: undefined,
46711
+ type: "variant"
46712
+ }
46713
+
46648
46714
  constructor(config, browser) {
46649
46715
  super(config, browser);
46650
46716
  }
@@ -46653,41 +46719,18 @@ class VariantTrack extends TrackBase {
46653
46719
 
46654
46720
  super.init(config);
46655
46721
 
46656
- this.visibilityWindow = config.visibilityWindow;
46657
- this.displayMode = config.displayMode || "EXPANDED"; // COLLAPSED | EXPANDED | SQUISHED
46658
- this.labelDisplayMode = config.labelDisplayMode;
46659
46722
  this.expandedVariantHeight = config.expandedVariantHeight || config.variantHeight || 10;
46660
- this.squishedVariantHeight = config.squishedVariantHeight || 2;
46661
- this.squishedCallHeight = config.squishedCallHeight || 1;
46662
- this.expandedCallHeight = config.expandedCallHeight || 10;
46663
- this.expandedVGap = config.expandedVGap !== undefined ? config.expandedVGap : 2;
46664
- this.squishedVGap = config.squishedVGap !== undefined ? config.squishedVGap : 1;
46665
- this.expandedGroupGap = config.expandedGroupGap || 10;
46666
- this.squishedGroupGap = config.squishedGroupGap || 5;
46667
- this.featureHeight = config.featureHeight || 14;
46668
- this.visibilityWindow = config.visibilityWindow;
46723
+
46669
46724
  this.featureSource = FeatureSource(config, this.browser.genome);
46670
- this.noGenotypeColor = config.noGenotypeColor || "rgb(200,180,180)";
46671
- this.noCallColor = config.noCallColor || "rgb(225, 225, 225)";
46672
- this.nonRefColor = config.nonRefColor || "rgb(200, 200, 215)";
46673
- this.mixedColor = config.mixedColor || "rgb(200, 220, 200)";
46674
- this.homrefColor = config.homrefColor || "rgb(200, 200, 200)";
46675
- this.homvarColor = config.homvarColor || "rgb(17,248,254)";
46676
- this.hetvarColor = config.hetvarColor || "rgb(34,12,253)";
46677
- this.sortDirection = "ASC";
46678
- this.type = config.type || "variant";
46679
-
46680
- this.colorBy = config.colorBy; // Can be undefined => default
46725
+
46681
46726
  this._initColorBy = config.colorBy;
46682
46727
  if (config.colorTable) {
46683
46728
  this.colorTables = new Map();
46684
46729
  this.colorTables.set(config.colorBy, new ColorTable(config.colorTable));
46685
46730
  }
46686
-
46687
46731
  this._strokecolor = config.strokecolor;
46688
46732
  this._context_hook = config.context_hook;
46689
46733
 
46690
- this.showGenotypes = config.showGenotypes === undefined ? true : config.showGenotypes;
46691
46734
 
46692
46735
  // The number of variant rows are computed dynamically, but start with "1" by default
46693
46736
  this.variantRowCount(1);
@@ -46697,7 +46740,7 @@ class VariantTrack extends TrackBase {
46697
46740
  async postInit() {
46698
46741
 
46699
46742
  this.header = await this.getHeader(); // cricital, don't remove'
46700
- if(this.disposed) return; // This track was removed during async load
46743
+ if (this.disposed) return // This track was removed during async load
46701
46744
  if (undefined === this.visibilityWindow && this.config.indexed !== false) {
46702
46745
  const fn = isFile(this.config.url) ? this.config.url.name : this.config.url;
46703
46746
  if (isString(fn) && fn.toLowerCase().includes("gnomad")) {
@@ -46800,7 +46843,7 @@ class VariantTrack extends TrackBase {
46800
46843
  this.variantBandHeight = TOP_MARGIN + rowCount * (variantHeight + vGap);
46801
46844
 
46802
46845
  let callSets = this.callSets;
46803
- if(!callSets && this._f) {
46846
+ if (!callSets && this._f) {
46804
46847
  callSets = this._f.callSets; // "Complementary" variant for structural variants
46805
46848
  }
46806
46849
  const nCalls = this.getCallsetsLength();
@@ -46840,9 +46883,9 @@ class VariantTrack extends TrackBase {
46840
46883
 
46841
46884
  //only paint stroke if a color is defined
46842
46885
  let strokecolor = this.getVariantStrokecolor(variant);
46843
- if (strokecolor){
46844
- context.strokeStyle = strokecolor;
46845
- context.strokeRect(x, y, w, h);
46886
+ if (strokecolor) {
46887
+ context.strokeStyle = strokecolor;
46888
+ context.strokeRect(x, y, w, h);
46846
46889
  }
46847
46890
 
46848
46891
  // call hook if _context_hook fn is defined
@@ -46858,7 +46901,7 @@ class VariantTrack extends TrackBase {
46858
46901
  this.sampleHeight = nVariantRows * (callHeight + vGap); // For each sample, there is a call for each variant at this position
46859
46902
 
46860
46903
  let sampleNumber = 0;
46861
- if(callSets && variant.calls) {
46904
+ if (callSets && variant.calls) {
46862
46905
  for (let callSet of callSets) {
46863
46906
  const call = variant.calls[callSet.id];
46864
46907
  if (call) {
@@ -46934,13 +46977,12 @@ class VariantTrack extends TrackBase {
46934
46977
  } else if ("MIXED" === v.type) {
46935
46978
  variantColor = this.mixedColor;
46936
46979
  } else {
46937
- variantColor = this.defaultColor;
46980
+ variantColor = this.color;
46938
46981
  }
46939
46982
  return variantColor
46940
46983
  }
46941
46984
 
46942
46985
 
46943
-
46944
46986
  getVariantStrokecolor(variant) {
46945
46987
 
46946
46988
  const v = variant._f || variant;
@@ -46956,13 +46998,13 @@ class VariantTrack extends TrackBase {
46956
46998
 
46957
46999
  callContextHook(variant, context, x, y, w, h) {
46958
47000
  if (this._context_hook) {
46959
- if (typeof this._context_hook === "function") {
46960
- const v = variant._f || variant;
47001
+ if (typeof this._context_hook === "function") {
47002
+ const v = variant._f || variant;
46961
47003
 
46962
- context.save();
46963
- this._context_hook(v, context, x, y, w, h);
46964
- context.restore();
46965
- }
47004
+ context.save();
47005
+ this._context_hook(v, context, x, y, w, h);
47006
+ context.restore();
47007
+ }
46966
47008
  }
46967
47009
  }
46968
47010
 
@@ -47006,7 +47048,7 @@ class VariantTrack extends TrackBase {
47006
47048
  */
47007
47049
  popupData(clickState, featureList) {
47008
47050
 
47009
- if(featureList === undefined) featureList = this.clickedFeatures(clickState);
47051
+ if (featureList === undefined) featureList = this.clickedFeatures(clickState);
47010
47052
  const genomicLocation = clickState.genomicLocation;
47011
47053
  const genomeID = this.browser.genome.id;
47012
47054
  const sampleInformation = this.browser.sampleInformation;
@@ -47234,12 +47276,12 @@ class VariantTrack extends TrackBase {
47234
47276
  sendChordsForViewport(viewport) {
47235
47277
  const refFrame = viewport.referenceFrame;
47236
47278
  let inView;
47237
- if("all" === refFrame.chr) {
47279
+ if ("all" === refFrame.chr) {
47238
47280
  const all = this.featureSource.getAllFeatures();
47239
47281
  const arrays = Object.keys(all).map(k => all[k]);
47240
47282
  inView = [].concat(...arrays);
47241
47283
  } else {
47242
- inView = this.featureSource.featureCache.queryFeatures(refFrame.chr, refFrame.start, refFrame.end);
47284
+ inView = this.featureSource.featureCache.queryFeatures(refFrame.chr, refFrame.start, refFrame.end);
47243
47285
 
47244
47286
  }
47245
47287
 
@@ -57477,7 +57519,7 @@ async function search(browser, string) {
57477
57519
  let locusObject = parseLocusString(browser, locus);
57478
57520
 
57479
57521
  if (!locusObject) {
57480
- const feature = browser.genome.featureDB[locus.toUpperCase()];
57522
+ const feature = browser.genome.featureDB.get(locus.toUpperCase());
57481
57523
  if (feature) {
57482
57524
  locusObject = {
57483
57525
  chr: feature.chr,
@@ -59330,7 +59372,7 @@ class ROITable extends RegionTableBase {
59330
59372
 
59331
59373
  renderTable(records) {
59332
59374
 
59333
- Array.from(this.rowContainerDOM.querySelectorAll('.igv-roi-table-row')).forEach(el => el.remove());
59375
+ Array.from(this.tableRowContainer.querySelectorAll('.igv-roi-table-row')).forEach(el => el.remove());
59334
59376
 
59335
59377
  if (records.length > 0) {
59336
59378
 
@@ -59338,7 +59380,7 @@ class ROITable extends RegionTableBase {
59338
59380
 
59339
59381
  for (let record of sortedRecords) {
59340
59382
  const row = this.tableRowDOM(record);
59341
- this.rowContainerDOM.appendChild(row);
59383
+ this.tableRowContainer.appendChild(row);
59342
59384
  }
59343
59385
 
59344
59386
  }
@@ -59378,14 +59420,14 @@ class ROITable extends RegionTableBase {
59378
59420
 
59379
59421
  event.stopPropagation();
59380
59422
 
59381
- const selected = this.container.querySelectorAll('.igv-roi-table-row-selected');
59423
+ const selected = this.tableDOM.querySelectorAll('.igv-roi-table-row-selected');
59382
59424
  const loci = [];
59383
59425
  for (let el of selected) {
59384
59426
  const { locus } = parseRegionKey(el.dataset.region);
59385
59427
  loci.push(locus);
59386
59428
  }
59387
59429
 
59388
- for (let el of this.container.querySelectorAll('.igv-roi-table-row')) {
59430
+ for (let el of this.tableDOM.querySelectorAll('.igv-roi-table-row')) {
59389
59431
  el.classList.remove('igv-roi-table-row-selected');
59390
59432
  }
59391
59433
 
@@ -60923,6 +60965,7 @@ class Browser {
60923
60965
 
60924
60966
  updateLocusSearchWidget() {
60925
60967
 
60968
+ if(!this.referenceFrameList) return
60926
60969
  const referenceFrameList = this.referenceFrameList;
60927
60970
 
60928
60971
  // Update end position of reference frames based on pixel widths. This is hacky, but its been done here
@@ -60976,6 +61019,8 @@ class Browser {
60976
61019
 
60977
61020
  async zoomWithScaleFactor(scaleFactor, centerBPOrUndefined, referenceFrameOrUndefined) {
60978
61021
 
61022
+ if(!this.referenceFrameList) return
61023
+
60979
61024
  const viewportWidth = this.calculateViewportWidth(this.referenceFrameList.length);
60980
61025
 
60981
61026
  let referenceFrames = referenceFrameOrUndefined ? [referenceFrameOrUndefined] : this.referenceFrameList;
@@ -60994,6 +61039,8 @@ class Browser {
60994
61039
  */
60995
61040
  async addMultiLocusPanel(chr, start, end, referenceFrameLeft) {
60996
61041
 
61042
+ if(!this.referenceFrameList) return
61043
+
60997
61044
  // account for reduced viewport width as a result of adding right mate pair panel
60998
61045
  const viewportWidth = this.calculateViewportWidth(1 + this.referenceFrameList.length);
60999
61046
  const scaleFactor = this.calculateViewportWidth(this.referenceFrameList.length) / this.calculateViewportWidth(1 + this.referenceFrameList.length);
@@ -61607,6 +61654,8 @@ class Browser {
61607
61654
  */
61608
61655
  async function resize() {
61609
61656
 
61657
+ if(!this.referenceFrameList) return
61658
+
61610
61659
  const viewportWidth = this.calculateViewportWidth(this.referenceFrameList.length);
61611
61660
 
61612
61661
  for (let referenceFrame of this.referenceFrameList) {
@@ -62011,7 +62060,7 @@ async function createTrack(config, browser) {
62011
62060
 
62012
62061
  function embedCSS() {
62013
62062
 
62014
- var css = '.igv-navbar {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n box-sizing: border-box;\n width: 100%;\n color: #444;\n font-size: 12px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n line-height: 32px;\n padding-left: 8px;\n padding-right: 8px;\n margin-top: 2px;\n margin-bottom: 6px;\n height: 32px;\n border-style: solid;\n border-radius: 3px;\n border-width: thin;\n border-color: #bfbfbf;\n background-color: #f3f3f3;\n}\n.igv-navbar .igv-navbar-left-container {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n height: 32px;\n line-height: 32px;\n}\n.igv-navbar .igv-navbar-left-container .igv-logo {\n width: 34px;\n height: 32px;\n margin-right: 8px;\n}\n.igv-navbar .igv-navbar-left-container .igv-current-genome {\n height: 32px;\n margin-left: 4px;\n margin-right: 4px;\n user-select: none;\n line-height: 32px;\n vertical-align: middle;\n text-align: center;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n height: 100%;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-chromosome-select-widget-container {\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: space-around;\n align-items: center;\n height: 100%;\n width: 125px;\n margin-right: 4px;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-chromosome-select-widget-container select {\n display: block;\n cursor: pointer;\n width: 100px;\n height: 75%;\n outline: none;\n font-size: 12px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-locus-size-group {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n margin-left: 8px;\n height: 22px;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-locus-size-group .igv-search-container {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n width: 210px;\n height: 22px;\n line-height: 22px;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-locus-size-group .igv-search-container input.igv-search-input {\n cursor: text;\n width: 85%;\n height: 22px;\n line-height: 22px;\n font-size: 12px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n text-align: left;\n padding-left: 8px;\n margin-right: 8px;\n outline: none;\n border-style: solid;\n border-radius: 3px;\n border-width: thin;\n border-color: #bfbfbf;\n background-color: white;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-locus-size-group .igv-search-container .igv-search-icon-container {\n cursor: pointer;\n height: 16px;\n width: 16px;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-locus-size-group .igv-windowsize-panel-container {\n margin-left: 4px;\n user-select: none;\n}\n.igv-navbar .igv-navbar-right-container {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n height: 32px;\n line-height: 32px;\n}\n.igv-navbar .igv-navbar-right-container .igv-navbar-toggle-button-container {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n height: 100%;\n}\n.igv-navbar .igv-navbar-right-container .igv-navbar-toggle-button-container div {\n margin-left: 0;\n margin-right: 4px;\n}\n.igv-navbar .igv-navbar-right-container .igv-navbar-toggle-button-container div:last-child {\n margin-left: 0;\n margin-right: 0;\n}\n.igv-navbar .igv-navbar-right-container .igv-navbar-toggle-button-container-750 {\n display: none;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget {\n color: #737373;\n font-size: 18px;\n height: 32px;\n line-height: 32px;\n margin-left: 8px;\n user-select: none;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget div {\n cursor: pointer;\n margin-left: unset;\n margin-right: unset;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget div:first-child {\n height: 24px;\n width: 24px;\n margin-left: unset;\n margin-right: 8px;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget div:last-child {\n height: 24px;\n width: 24px;\n margin-left: 8px;\n margin-right: unset;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget div:nth-child(even) {\n display: block;\n height: fit-content;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget input {\n display: block;\n width: 125px;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget svg {\n display: block;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 {\n color: #737373;\n font-size: 18px;\n height: 32px;\n line-height: 32px;\n margin-left: 8px;\n user-select: none;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 div {\n cursor: pointer;\n margin-left: unset;\n margin-right: unset;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 div:first-child {\n height: 24px;\n width: 24px;\n margin-left: unset;\n margin-right: 8px;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 div:last-child {\n height: 24px;\n width: 24px;\n margin-left: 8px;\n margin-right: unset;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 div:nth-child(even) {\n width: 0;\n height: 0;\n display: none;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 input {\n width: 0;\n height: 0;\n display: none;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 svg {\n display: block;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-hidden {\n display: none;\n}\n\n.igv-navbar-button {\n display: block;\n box-sizing: unset;\n padding-left: 6px;\n padding-right: 6px;\n height: 18px;\n text-transform: capitalize;\n user-select: none;\n line-height: 18px;\n text-align: center;\n vertical-align: middle;\n font-family: \"Open Sans\", sans-serif;\n font-size: 11px;\n font-weight: 200;\n color: #737373;\n background-color: #f3f3f3;\n border-color: #737373;\n border-style: solid;\n border-width: thin;\n border-radius: 6px;\n}\n\n.igv-navbar-button-clicked {\n color: white;\n background-color: #737373;\n}\n\n.igv-navbar-button:hover {\n cursor: pointer;\n}\n\n.igv-zoom-in-notice-container {\n z-index: 1024;\n position: absolute;\n top: 8px;\n left: 50%;\n transform: translate(-50%, 0%);\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: center;\n align-items: center;\n background-color: white;\n}\n.igv-zoom-in-notice-container > div {\n padding-left: 4px;\n padding-right: 4px;\n padding-top: 2px;\n padding-bottom: 2px;\n width: 100%;\n height: 100%;\n font-family: \"Open Sans\", sans-serif;\n font-size: 14px;\n font-weight: 400;\n color: #3f3f3f;\n}\n\n.igv-zoom-in-notice {\n position: absolute;\n top: 10px;\n left: 50%;\n}\n.igv-zoom-in-notice div {\n position: relative;\n left: -50%;\n font-family: \"Open Sans\", sans-serif;\n font-size: medium;\n font-weight: 400;\n color: #3f3f3f;\n background-color: rgba(255, 255, 255, 0.51);\n z-index: 64;\n}\n\n.igv-container-spinner {\n position: absolute;\n top: 90%;\n left: 50%;\n transform: translate(-50%, -50%);\n z-index: 1024;\n width: 24px;\n height: 24px;\n pointer-events: none;\n color: #737373;\n}\n\n.igv-multi-locus-close-button {\n position: absolute;\n top: 2px;\n right: 0;\n padding-left: 2px;\n padding-right: 2px;\n width: 12px;\n height: 12px;\n color: #666666;\n background-color: white;\n z-index: 1000;\n}\n.igv-multi-locus-close-button > svg {\n vertical-align: top;\n}\n\n.igv-multi-locus-close-button:hover {\n cursor: pointer;\n color: #434343;\n}\n\n.igv-multi-locus-ruler-label {\n z-index: 64;\n position: absolute;\n top: 2px;\n left: 0;\n width: 100%;\n height: 12px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: center;\n align-items: center;\n}\n.igv-multi-locus-ruler-label > div {\n font-family: \"Open Sans\", sans-serif;\n font-size: 12px;\n color: rgb(16, 16, 16);\n background-color: white;\n}\n.igv-multi-locus-ruler-label > div {\n cursor: pointer;\n}\n\n.igv-multi-locus-ruler-label-square-dot {\n z-index: 64;\n position: absolute;\n left: 50%;\n top: 5%;\n transform: translate(-50%, 0%);\n background-color: white;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-multi-locus-ruler-label-square-dot > div:first-child {\n width: 14px;\n height: 14px;\n}\n.igv-multi-locus-ruler-label-square-dot > div:last-child {\n margin-left: 16px;\n font-family: \"Open Sans\", sans-serif;\n font-size: 14px;\n font-weight: 400;\n color: rgb(16, 16, 16);\n}\n\n.igv-ruler-sweeper {\n display: none;\n pointer-events: none;\n position: absolute;\n top: 26px;\n bottom: 0;\n left: 0;\n width: 0;\n z-index: 99999;\n background-color: rgba(68, 134, 247, 0.25);\n}\n\n.igv-ruler-tooltip {\n pointer-events: none;\n z-index: 128;\n position: absolute;\n top: 0;\n left: 0;\n width: 1px;\n height: 32px;\n background-color: transparent;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-ruler-tooltip > div {\n pointer-events: none;\n width: 128px;\n height: auto;\n padding: 1px;\n color: #373737;\n font-size: 10px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n background-color: white;\n border-style: solid;\n border-width: thin;\n border-color: #373737;\n}\n\n.igv-track-label {\n position: absolute;\n left: 8px;\n top: 8px;\n width: auto;\n height: auto;\n max-width: 50%;\n padding-left: 4px;\n padding-right: 4px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n font-family: \"Open Sans\", sans-serif;\n font-size: small;\n font-weight: 400;\n text-align: center;\n user-select: none;\n -moz-user-select: none;\n -webkit-user-select: none;\n border-color: #444;\n border-radius: 2px;\n border-style: solid;\n border-width: thin;\n background-color: white;\n z-index: 128;\n cursor: pointer;\n}\n\n.igv-track-label:hover,\n.igv-track-label:focus,\n.igv-track-label:active {\n background-color: #e8e8e8;\n}\n\n.igv-track-label-popup-shim {\n padding-left: 8px;\n padding-right: 8px;\n padding-top: 4px;\n}\n\n.igv-center-line {\n display: none;\n pointer-events: none;\n position: absolute;\n top: 0;\n bottom: 0;\n left: 50%;\n transform: translateX(-50%);\n z-index: 8;\n user-select: none;\n -moz-user-select: none;\n -webkit-user-select: none;\n border-left-style: dashed;\n border-left-width: thin;\n border-right-style: dashed;\n border-right-width: thin;\n}\n\n.igv-center-line-wide {\n background-color: rgba(0, 0, 0, 0);\n border-left-color: rgba(127, 127, 127, 0.51);\n border-right-color: rgba(127, 127, 127, 0.51);\n}\n\n.igv-center-line-thin {\n background-color: rgba(0, 0, 0, 0);\n border-left-color: rgba(127, 127, 127, 0.51);\n border-right-color: rgba(0, 0, 0, 0);\n}\n\n.igv-cursor-guide-horizontal {\n display: none;\n pointer-events: none;\n user-select: none;\n -moz-user-select: none;\n -webkit-user-select: none;\n position: absolute;\n left: 0;\n right: 0;\n top: 50%;\n height: 1px;\n z-index: 1;\n margin-left: 50px;\n margin-right: 54px;\n border-top-style: dotted;\n border-top-width: thin;\n border-top-color: rgba(127, 127, 127, 0.76);\n}\n\n.igv-cursor-guide-vertical {\n pointer-events: none;\n user-select: none;\n -moz-user-select: none;\n -webkit-user-select: none;\n position: absolute;\n top: 0;\n bottom: 0;\n left: 50%;\n width: 1px;\n z-index: 1;\n border-left-style: dotted;\n border-left-width: thin;\n border-left-color: rgba(127, 127, 127, 0.76);\n display: none;\n}\n\n.igv-user-feedback {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 512px;\n height: 360px;\n z-index: 2048;\n background-color: white;\n border-color: #a2a2a2;\n border-style: solid;\n border-width: thin;\n font-family: \"Open Sans\", sans-serif;\n font-size: medium;\n font-weight: 400;\n color: #444;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-user-feedback div:first-child {\n position: relative;\n height: 24px;\n width: 100%;\n background-color: white;\n border-bottom-color: #a2a2a2;\n border-bottom-style: solid;\n border-bottom-width: thin;\n}\n.igv-user-feedback div:first-child div {\n position: absolute;\n top: 2px;\n width: 16px;\n height: 16px;\n background-color: transparent;\n}\n.igv-user-feedback div:first-child div:first-child {\n left: 8px;\n}\n.igv-user-feedback div:first-child div:last-child {\n cursor: pointer;\n right: 8px;\n}\n.igv-user-feedback div:last-child {\n width: 100%;\n height: calc(100% - 24px);\n border-width: 0;\n}\n.igv-user-feedback div:last-child div {\n width: auto;\n height: auto;\n margin: 8px;\n}\n\n.igv-generic-dialog-container {\n position: absolute;\n top: 0;\n left: 0;\n width: 300px;\n height: 200px;\n border-color: #7F7F7F;\n border-radius: 4px;\n border-style: solid;\n border-width: thin;\n font-family: \"Open Sans\", sans-serif;\n font-size: medium;\n font-weight: 400;\n z-index: 2048;\n background-color: white;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-generic-dialog-container .igv-generic-dialog-header {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n width: 100%;\n height: 24px;\n cursor: move;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-color: #7F7F7F;\n border-bottom-style: solid;\n border-bottom-width: thin;\n background-color: #eee;\n}\n.igv-generic-dialog-container .igv-generic-dialog-header div {\n margin-right: 4px;\n margin-bottom: 2px;\n height: 12px;\n width: 12px;\n color: #7F7F7F;\n}\n.igv-generic-dialog-container .igv-generic-dialog-header div:hover {\n cursor: pointer;\n color: #444;\n}\n.igv-generic-dialog-container .igv-generic-dialog-one-liner {\n color: #373737;\n width: 95%;\n height: 24px;\n line-height: 24px;\n text-align: left;\n margin-top: 8px;\n padding-left: 8px;\n overflow-wrap: break-word;\n background-color: white;\n}\n.igv-generic-dialog-container .igv-generic-dialog-label-input {\n margin-top: 8px;\n width: 95%;\n height: 24px;\n color: #373737;\n line-height: 24px;\n padding-left: 8px;\n background-color: white;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-generic-dialog-container .igv-generic-dialog-label-input div {\n width: 30%;\n height: 100%;\n font-size: 16px;\n text-align: right;\n padding-right: 8px;\n background-color: white;\n}\n.igv-generic-dialog-container .igv-generic-dialog-label-input input {\n display: block;\n height: 100%;\n width: 100%;\n padding-left: 4px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n color: #373737;\n text-align: left;\n outline: none;\n border-style: solid;\n border-width: thin;\n border-color: #7F7F7F;\n background-color: white;\n}\n.igv-generic-dialog-container .igv-generic-dialog-label-input input {\n width: 50%;\n font-size: 16px;\n}\n.igv-generic-dialog-container .igv-generic-dialog-input {\n margin-top: 8px;\n width: calc(100% - 16px);\n height: 24px;\n color: #373737;\n line-height: 24px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-around;\n align-items: center;\n}\n.igv-generic-dialog-container .igv-generic-dialog-input input {\n display: block;\n height: 100%;\n width: 100%;\n padding-left: 4px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n color: #373737;\n text-align: left;\n outline: none;\n border-style: solid;\n border-width: thin;\n border-color: #7F7F7F;\n background-color: white;\n}\n.igv-generic-dialog-container .igv-generic-dialog-input input {\n font-size: 16px;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel {\n width: 100%;\n height: 28px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-around;\n align-items: center;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel div {\n margin-top: 32px;\n color: white;\n font-family: \"Open Sans\", sans-serif;\n font-size: 14px;\n font-weight: 400;\n width: 75px;\n height: 28px;\n line-height: 28px;\n text-align: center;\n border-color: transparent;\n border-style: solid;\n border-width: thin;\n border-radius: 2px;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel div:first-child {\n margin-left: 32px;\n margin-right: 0;\n background-color: #5ea4e0;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel div:last-child {\n margin-left: 0;\n margin-right: 32px;\n background-color: #c4c4c4;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel div:first-child:hover {\n cursor: pointer;\n background-color: #3b5c7f;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel div:last-child:hover {\n cursor: pointer;\n background-color: #7f7f7f;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok {\n width: 100%;\n height: 36px;\n margin-top: 32px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-around;\n align-items: center;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok div {\n width: 98px;\n height: 36px;\n line-height: 36px;\n text-align: center;\n color: white;\n font-family: \"Open Sans\", sans-serif;\n font-size: medium;\n font-weight: 400;\n border-color: white;\n border-style: solid;\n border-width: thin;\n border-radius: 4px;\n background-color: #2B81AF;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok div:hover {\n cursor: pointer;\n background-color: #25597f;\n}\n\n.igv-generic-container {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 2048;\n background-color: white;\n cursor: pointer;\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-generic-container div:first-child {\n cursor: move;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n height: 24px;\n width: 100%;\n background-color: #dddddd;\n}\n.igv-generic-container div:first-child i {\n display: block;\n color: #5f5f5f;\n cursor: pointer;\n width: 14px;\n height: 14px;\n margin-right: 8px;\n margin-bottom: 4px;\n}\n\n.igv-menu-popup {\n position: absolute;\n top: 0;\n left: 0;\n width: max-content;\n z-index: 4096;\n cursor: pointer;\n font-family: \"Open Sans\", sans-serif;\n font-size: small;\n font-weight: 400;\n color: #4b4b4b;\n background: white;\n border-radius: 4px;\n border-color: #7F7F7F;\n border-style: solid;\n border-width: thin;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-end;\n text-align: left;\n}\n.igv-menu-popup > div:not(:first-child) {\n width: 100%;\n}\n.igv-menu-popup > div:not(:first-child) > div {\n background: white;\n}\n.igv-menu-popup > div:not(:first-child) > div.context-menu {\n padding-left: 4px;\n padding-right: 4px;\n}\n.igv-menu-popup > div:not(:first-child) > div:last-child {\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n border-bottom-color: transparent;\n border-bottom-style: solid;\n border-bottom-width: thin;\n}\n.igv-menu-popup > div:not(:first-child) > div:hover {\n background: #efefef;\n}\n\n.igv-menu-popup-shim {\n padding-left: 8px;\n padding-right: 8px;\n padding-bottom: 1px;\n padding-top: 1px;\n}\n\n.igv-menu-popup-header {\n position: relative;\n width: 100%;\n height: 24px;\n cursor: move;\n border-top-color: transparent;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-color: #7F7F7F;\n border-bottom-style: solid;\n border-bottom-width: thin;\n background-color: #eee;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n}\n.igv-menu-popup-header div {\n margin-right: 4px;\n height: 12px;\n width: 12px;\n color: #7F7F7F;\n}\n.igv-menu-popup-header div:hover {\n cursor: pointer;\n color: #444;\n}\n\n.igv-menu-popup-check-container {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n width: 100%;\n height: 20px;\n margin-right: 4px;\n background-color: transparent;\n}\n.igv-menu-popup-check-container div {\n padding-top: 2px;\n padding-left: 8px;\n}\n.igv-menu-popup-check-container div:first-child {\n position: relative;\n width: 12px;\n height: 12px;\n}\n.igv-menu-popup-check-container div:first-child svg {\n position: absolute;\n width: 12px;\n height: 12px;\n}\n\n.igv-user-feedback {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 512px;\n height: 360px;\n z-index: 2048;\n background-color: white;\n border-color: #a2a2a2;\n border-style: solid;\n border-width: thin;\n font-family: \"Open Sans\", sans-serif;\n font-size: medium;\n font-weight: 400;\n color: #444;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-user-feedback div:first-child {\n position: relative;\n height: 24px;\n width: 100%;\n background-color: white;\n border-bottom-color: #a2a2a2;\n border-bottom-style: solid;\n border-bottom-width: thin;\n}\n.igv-user-feedback div:first-child div {\n position: absolute;\n top: 2px;\n width: 16px;\n height: 16px;\n background-color: transparent;\n}\n.igv-user-feedback div:first-child div:first-child {\n left: 8px;\n}\n.igv-user-feedback div:first-child div:last-child {\n cursor: pointer;\n right: 8px;\n}\n.igv-user-feedback div:last-child {\n width: 100%;\n height: calc(100% - 24px);\n border-width: 0;\n}\n.igv-user-feedback div:last-child div {\n width: auto;\n height: auto;\n margin: 8px;\n}\n\n.igv-loading-spinner-container {\n z-index: 1024;\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 32px;\n height: 32px;\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: center;\n align-items: center;\n}\n.igv-loading-spinner-container > div {\n box-sizing: border-box;\n width: 100%;\n height: 100%;\n border-radius: 50%;\n border: 4px solid rgba(128, 128, 128, 0.5);\n border-top-color: rgb(255, 255, 255);\n animation: spin 1s ease-in-out infinite;\n -webkit-animation: spin 1s ease-in-out infinite;\n}\n\n@keyframes spin {\n to {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n}\n@-webkit-keyframes spin {\n to {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n}\n.igv-roi-menu-next-gen {\n position: absolute;\n z-index: 512;\n font-family: \"Open Sans\", sans-serif;\n font-size: small;\n font-weight: 400;\n color: #4b4b4b;\n background-color: white;\n width: 192px;\n border-radius: 4px;\n border-color: #7F7F7F;\n border-style: solid;\n border-width: thin;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n}\n.igv-roi-menu-next-gen > div:first-child {\n height: 24px;\n border-top-color: transparent;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-color: #7F7F7F;\n border-bottom-style: solid;\n border-bottom-width: thin;\n background-color: #eee;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n}\n.igv-roi-menu-next-gen > div:first-child > div {\n margin-right: 4px;\n height: 12px;\n width: 12px;\n color: #7F7F7F;\n}\n.igv-roi-menu-next-gen > div:first-child > div:hover {\n cursor: pointer;\n color: #444;\n}\n.igv-roi-menu-next-gen > div:last-child {\n background-color: white;\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n border-bottom-color: transparent;\n border-bottom-style: solid;\n border-bottom-width: 0;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n text-align: start;\n vertical-align: middle;\n}\n.igv-roi-menu-next-gen > div:last-child > div {\n height: 24px;\n padding-left: 4px;\n border-bottom-style: solid;\n border-bottom-width: thin;\n border-bottom-color: #7f7f7f;\n}\n.igv-roi-menu-next-gen > div:last-child > div:not(:first-child):hover {\n background-color: rgba(127, 127, 127, 0.1);\n}\n.igv-roi-menu-next-gen > div:last-child div:first-child {\n font-style: italic;\n text-align: center;\n padding-right: 4px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.igv-roi-menu-next-gen > div:last-child > div:last-child {\n border-bottom-width: 0;\n border-bottom-color: transparent;\n}\n\n.igv-roi-placeholder {\n font-style: normal;\n color: rgba(75, 75, 75, 0.6);\n}\n\n.igv-roi-table {\n position: absolute;\n z-index: 1024;\n width: fit-content;\n border-color: #7f7f7f;\n border-radius: 4px;\n border-style: solid;\n border-width: thin;\n font-family: \"Open Sans\", sans-serif;\n font-size: 12px;\n font-weight: 400;\n background-color: white;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n cursor: default;\n}\n.igv-roi-table > div {\n height: 24px;\n font-size: 14px;\n text-align: start;\n vertical-align: middle;\n line-height: 24px;\n}\n.igv-roi-table > div:first-child {\n border-color: transparent;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-top-width: 0;\n border-bottom-color: #7f7f7f;\n border-bottom-style: solid;\n border-bottom-width: thin;\n background-color: #eee;\n cursor: move;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n}\n.igv-roi-table > div:first-child > div:first-child {\n text-align: center;\n width: calc(100% - 4px - 12px);\n}\n.igv-roi-table > div:first-child > div:last-child {\n margin-right: 4px;\n margin-bottom: 2px;\n height: 12px;\n width: 12px;\n color: #7f7f7f;\n}\n.igv-roi-table > div:first-child > div:last-child > svg {\n display: block;\n}\n.igv-roi-table > div:first-child > div:last-child:hover {\n cursor: pointer;\n color: #444;\n}\n.igv-roi-table > .igv-roi-table-description {\n height: fit-content;\n padding: 4px;\n margin-left: 4px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-roi-table > .igv-roi-table-goto-explainer {\n margin-left: 4px;\n color: #7F7F7F;\n font-style: italic;\n}\n.igv-roi-table > .igv-roi-table-column-titles {\n height: 24px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: stretch;\n align-items: stretch;\n padding-right: 16px;\n background-color: white;\n border-top-color: #7f7f7f;\n border-top-style: solid;\n border-top-width: thin;\n border-bottom-color: #7f7f7f;\n border-bottom-style: solid;\n border-bottom-width: thin;\n}\n.igv-roi-table > .igv-roi-table-column-titles > div {\n font-size: 14px;\n vertical-align: middle;\n line-height: 24px;\n text-align: left;\n margin-left: 4px;\n height: 24px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n border-right-color: #7f7f7f;\n border-right-style: solid;\n border-right-width: thin;\n}\n.igv-roi-table > .igv-roi-table-column-titles > div:last-child {\n border-right: unset;\n}\n.igv-roi-table > .igv-roi-table-row-container {\n resize: both;\n overflow: scroll;\n min-height: 72px;\n height: 144px;\n max-height: 480px;\n background-color: white;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row {\n height: 24px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: stretch;\n align-items: stretch;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row > div {\n font-size: 14px;\n vertical-align: middle;\n line-height: 24px;\n text-align: left;\n margin-left: 4px;\n height: 24px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n border-right-color: transparent;\n border-right-style: solid;\n border-right-width: thin;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row > div:last-child {\n border-right: unset;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row-hover {\n background-color: rgba(0, 0, 0, 0.04);\n}\n.igv-roi-table > div:last-child {\n height: 32px;\n line-height: 32px;\n border-top-color: #7f7f7f;\n border-top-style: solid;\n border-top-width: thin;\n border-bottom-color: transparent;\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n border-bottom-width: 0;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-around;\n align-items: center;\n}\n\n.igv-roi-table-row-selected {\n background-color: rgba(0, 0, 0, 0.125);\n}\n\n.igv-roi-table-button {\n cursor: pointer;\n height: 20px;\n user-select: none;\n line-height: 20px;\n text-align: center;\n vertical-align: middle;\n font-family: \"Open Sans\", sans-serif;\n font-size: 13px;\n font-weight: 400;\n color: black;\n padding-left: 6px;\n padding-right: 6px;\n background-color: rgb(239, 239, 239);\n border-color: black;\n border-style: solid;\n border-width: thin;\n border-radius: 3px;\n}\n\n.igv-roi-table-button:hover {\n font-weight: 400;\n background-color: rgba(0, 0, 0, 0.13);\n}\n\n.igv-roi-region {\n z-index: 64;\n position: absolute;\n top: 0;\n bottom: 0;\n pointer-events: none;\n overflow: visible;\n margin-top: 44px;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n}\n.igv-roi-region > div {\n position: relative;\n width: 100%;\n height: 8px;\n pointer-events: auto;\n}\n\n.igv-roi-menu {\n position: absolute;\n z-index: 1024;\n width: 144px;\n border-color: #7f7f7f;\n border-radius: 4px;\n border-style: solid;\n border-width: thin;\n font-family: \"Open Sans\", sans-serif;\n background-color: white;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n}\n.igv-roi-menu > div:not(:last-child) {\n border-bottom-color: rgba(128, 128, 128, 0.5);\n border-bottom-style: solid;\n border-bottom-width: thin;\n}\n.igv-roi-menu > div:first-child {\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-top-color: transparent;\n border-top-style: solid;\n border-top-width: 0;\n}\n.igv-roi-menu > div:last-child {\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n border-bottom-color: transparent;\n border-bottom-style: solid;\n border-bottom-width: 0;\n}\n\n.igv-roi-menu-row {\n height: 24px;\n padding-left: 8px;\n font-size: small;\n text-align: start;\n vertical-align: middle;\n line-height: 24px;\n background-color: white;\n}\n\n.igv-roi-menu-row-edit-description {\n width: -webkit-fill-available;\n font-size: small;\n text-align: start;\n vertical-align: middle;\n background-color: white;\n padding-left: 4px;\n padding-right: 4px;\n padding-bottom: 4px;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: stretch;\n align-items: stretch;\n}\n.igv-roi-menu-row-edit-description > label {\n margin-left: 2px;\n margin-bottom: 0;\n display: block;\n width: -webkit-fill-available;\n}\n.igv-roi-menu-row-edit-description > input {\n display: block;\n margin-left: 2px;\n margin-right: 2px;\n margin-bottom: 1px;\n width: -webkit-fill-available;\n}\n\n.igv-container {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n padding-top: 4px;\n user-select: none;\n -webkit-user-select: none;\n -ms-user-select: none;\n}\n\n.igv-viewport {\n position: relative;\n margin-top: 5px;\n line-height: 1;\n overflow-x: hidden;\n overflow-y: hidden;\n}\n\n.igv-viewport-content {\n position: relative;\n width: 100%;\n}\n.igv-viewport-content > canvas {\n position: relative;\n display: block;\n}\n\n.igv-column-container {\n position: relative;\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n width: 100%;\n}\n\n.igv-column-shim {\n width: 1px;\n margin-left: 2px;\n margin-right: 2px;\n background-color: #545453;\n}\n\n.igv-column {\n position: relative;\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n}\n\n.igv-axis-column {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n width: 50px;\n}\n.igv-axis-column > div {\n margin-top: 5px;\n width: 100%;\n}\n\n.igv-sample-name-column {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n}\n\n.igv-scrollbar-column {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n width: 14px;\n}\n.igv-scrollbar-column > div {\n position: relative;\n margin-top: 5px;\n width: 14px;\n}\n.igv-scrollbar-column > div > div {\n cursor: pointer;\n position: absolute;\n top: 0;\n left: 2px;\n width: 8px;\n border-width: 1px;\n border-style: solid;\n border-color: #c4c4c4;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n}\n.igv-scrollbar-column > div > div:hover {\n background-color: #c4c4c4;\n}\n\n.igv-track-drag-column {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n width: 12px;\n background-color: white;\n}\n.igv-track-drag-column > .igv-track-drag-handle {\n z-index: 512;\n position: relative;\n cursor: pointer;\n margin-top: 5px;\n width: 100%;\n border-style: solid;\n border-width: 0;\n border-top-right-radius: 6px;\n border-bottom-right-radius: 6px;\n background-color: #c4c4c4;\n}\n.igv-track-drag-column .igv-track-drag-handle-hover {\n background-color: #787878;\n}\n.igv-track-drag-column > .igv-track-drag-shim {\n position: relative;\n margin-top: 5px;\n width: 100%;\n border-style: solid;\n border-width: 0;\n}\n\n.igv-gear-menu-column {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n width: 28px;\n}\n.igv-gear-menu-column > div {\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n margin-top: 5px;\n width: 100%;\n background: white;\n}\n.igv-gear-menu-column > div > div {\n position: relative;\n margin-top: 4px;\n width: 16px;\n height: 16px;\n color: #7F7F7F;\n}\n.igv-gear-menu-column > div > div:hover {\n cursor: pointer;\n color: #444;\n}\n\n/*# sourceMappingURL=dom.css.map */\n';
62063
+ var css = '.igv-navbar {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n box-sizing: border-box;\n width: 100%;\n color: #444;\n font-size: 12px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n line-height: 32px;\n padding-left: 8px;\n padding-right: 8px;\n margin-top: 2px;\n margin-bottom: 6px;\n height: 32px;\n border-style: solid;\n border-radius: 3px;\n border-width: thin;\n border-color: #bfbfbf;\n background-color: #f3f3f3;\n}\n.igv-navbar .igv-navbar-left-container {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n height: 32px;\n line-height: 32px;\n}\n.igv-navbar .igv-navbar-left-container .igv-logo {\n width: 34px;\n height: 32px;\n margin-right: 8px;\n}\n.igv-navbar .igv-navbar-left-container .igv-current-genome {\n height: 32px;\n margin-left: 4px;\n margin-right: 4px;\n user-select: none;\n line-height: 32px;\n vertical-align: middle;\n text-align: center;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n height: 100%;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-chromosome-select-widget-container {\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: space-around;\n align-items: center;\n height: 100%;\n width: 125px;\n margin-right: 4px;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-chromosome-select-widget-container select {\n display: block;\n cursor: pointer;\n width: 100px;\n height: 75%;\n outline: none;\n font-size: 12px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-locus-size-group {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n margin-left: 8px;\n height: 22px;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-locus-size-group .igv-search-container {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n width: 210px;\n height: 22px;\n line-height: 22px;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-locus-size-group .igv-search-container input.igv-search-input {\n cursor: text;\n width: 85%;\n height: 22px;\n line-height: 22px;\n font-size: 12px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n text-align: left;\n padding-left: 8px;\n margin-right: 8px;\n outline: none;\n border-style: solid;\n border-radius: 3px;\n border-width: thin;\n border-color: #bfbfbf;\n background-color: white;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-locus-size-group .igv-search-container .igv-search-icon-container {\n cursor: pointer;\n height: 16px;\n width: 16px;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-locus-size-group .igv-windowsize-panel-container {\n margin-left: 4px;\n user-select: none;\n}\n.igv-navbar .igv-navbar-right-container {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n height: 32px;\n line-height: 32px;\n}\n.igv-navbar .igv-navbar-right-container .igv-navbar-toggle-button-container {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n height: 100%;\n}\n.igv-navbar .igv-navbar-right-container .igv-navbar-toggle-button-container div {\n margin-left: 0;\n margin-right: 4px;\n}\n.igv-navbar .igv-navbar-right-container .igv-navbar-toggle-button-container div:last-child {\n margin-left: 0;\n margin-right: 0;\n}\n.igv-navbar .igv-navbar-right-container .igv-navbar-toggle-button-container-750 {\n display: none;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget {\n color: #737373;\n font-size: 18px;\n height: 32px;\n line-height: 32px;\n margin-left: 8px;\n user-select: none;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget div {\n cursor: pointer;\n margin-left: unset;\n margin-right: unset;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget div:first-child {\n height: 24px;\n width: 24px;\n margin-left: unset;\n margin-right: 8px;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget div:last-child {\n height: 24px;\n width: 24px;\n margin-left: 8px;\n margin-right: unset;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget div:nth-child(even) {\n display: block;\n height: fit-content;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget input {\n display: block;\n width: 125px;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget svg {\n display: block;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 {\n color: #737373;\n font-size: 18px;\n height: 32px;\n line-height: 32px;\n margin-left: 8px;\n user-select: none;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 div {\n cursor: pointer;\n margin-left: unset;\n margin-right: unset;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 div:first-child {\n height: 24px;\n width: 24px;\n margin-left: unset;\n margin-right: 8px;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 div:last-child {\n height: 24px;\n width: 24px;\n margin-left: 8px;\n margin-right: unset;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 div:nth-child(even) {\n width: 0;\n height: 0;\n display: none;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 input {\n width: 0;\n height: 0;\n display: none;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 svg {\n display: block;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-hidden {\n display: none;\n}\n\n.igv-navbar-button {\n display: block;\n box-sizing: unset;\n padding-left: 6px;\n padding-right: 6px;\n height: 18px;\n text-transform: capitalize;\n user-select: none;\n line-height: 18px;\n text-align: center;\n vertical-align: middle;\n font-family: \"Open Sans\", sans-serif;\n font-size: 11px;\n font-weight: 200;\n color: #737373;\n background-color: #f3f3f3;\n border-color: #737373;\n border-style: solid;\n border-width: thin;\n border-radius: 6px;\n}\n\n.igv-navbar-button-clicked {\n color: white;\n background-color: #737373;\n}\n\n.igv-navbar-button:hover {\n cursor: pointer;\n}\n\n.igv-zoom-in-notice-container {\n z-index: 1024;\n position: absolute;\n top: 8px;\n left: 50%;\n transform: translate(-50%, 0%);\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: center;\n align-items: center;\n background-color: white;\n}\n.igv-zoom-in-notice-container > div {\n padding-left: 4px;\n padding-right: 4px;\n padding-top: 2px;\n padding-bottom: 2px;\n width: 100%;\n height: 100%;\n font-family: \"Open Sans\", sans-serif;\n font-size: 14px;\n font-weight: 400;\n color: #3f3f3f;\n}\n\n.igv-zoom-in-notice {\n position: absolute;\n top: 10px;\n left: 50%;\n}\n.igv-zoom-in-notice div {\n position: relative;\n left: -50%;\n font-family: \"Open Sans\", sans-serif;\n font-size: medium;\n font-weight: 400;\n color: #3f3f3f;\n background-color: rgba(255, 255, 255, 0.51);\n z-index: 64;\n}\n\n.igv-container-spinner {\n position: absolute;\n top: 90%;\n left: 50%;\n transform: translate(-50%, -50%);\n z-index: 1024;\n width: 24px;\n height: 24px;\n pointer-events: none;\n color: #737373;\n}\n\n.igv-multi-locus-close-button {\n position: absolute;\n top: 2px;\n right: 0;\n padding-left: 2px;\n padding-right: 2px;\n width: 12px;\n height: 12px;\n color: #666666;\n background-color: white;\n z-index: 1000;\n}\n.igv-multi-locus-close-button > svg {\n vertical-align: top;\n}\n\n.igv-multi-locus-close-button:hover {\n cursor: pointer;\n color: #434343;\n}\n\n.igv-multi-locus-ruler-label {\n z-index: 64;\n position: absolute;\n top: 2px;\n left: 0;\n width: 100%;\n height: 12px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: center;\n align-items: center;\n}\n.igv-multi-locus-ruler-label > div {\n font-family: \"Open Sans\", sans-serif;\n font-size: 12px;\n color: rgb(16, 16, 16);\n background-color: white;\n}\n.igv-multi-locus-ruler-label > div {\n cursor: pointer;\n}\n\n.igv-multi-locus-ruler-label-square-dot {\n z-index: 64;\n position: absolute;\n left: 50%;\n top: 5%;\n transform: translate(-50%, 0%);\n background-color: white;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-multi-locus-ruler-label-square-dot > div:first-child {\n width: 14px;\n height: 14px;\n}\n.igv-multi-locus-ruler-label-square-dot > div:last-child {\n margin-left: 16px;\n font-family: \"Open Sans\", sans-serif;\n font-size: 14px;\n font-weight: 400;\n color: rgb(16, 16, 16);\n}\n\n.igv-ruler-sweeper {\n display: none;\n pointer-events: none;\n position: absolute;\n top: 26px;\n bottom: 0;\n left: 0;\n width: 0;\n z-index: 99999;\n background-color: rgba(68, 134, 247, 0.25);\n}\n\n.igv-ruler-tooltip {\n pointer-events: none;\n z-index: 128;\n position: absolute;\n top: 0;\n left: 0;\n width: 1px;\n height: 32px;\n background-color: transparent;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-ruler-tooltip > div {\n pointer-events: none;\n width: 128px;\n height: auto;\n padding: 1px;\n color: #373737;\n font-size: 10px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n background-color: white;\n border-style: solid;\n border-width: thin;\n border-color: #373737;\n}\n\n.igv-track-label {\n position: absolute;\n left: 8px;\n top: 8px;\n width: auto;\n height: auto;\n max-width: 50%;\n padding-left: 4px;\n padding-right: 4px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n font-family: \"Open Sans\", sans-serif;\n font-size: small;\n font-weight: 400;\n text-align: center;\n user-select: none;\n -moz-user-select: none;\n -webkit-user-select: none;\n border-color: #444;\n border-radius: 2px;\n border-style: solid;\n border-width: thin;\n background-color: white;\n z-index: 128;\n cursor: pointer;\n}\n\n.igv-track-label:hover,\n.igv-track-label:focus,\n.igv-track-label:active {\n background-color: #e8e8e8;\n}\n\n.igv-track-label-popup-shim {\n padding-left: 8px;\n padding-right: 8px;\n padding-top: 4px;\n}\n\n.igv-center-line {\n display: none;\n pointer-events: none;\n position: absolute;\n top: 0;\n bottom: 0;\n left: 50%;\n transform: translateX(-50%);\n z-index: 8;\n user-select: none;\n -moz-user-select: none;\n -webkit-user-select: none;\n border-left-style: dashed;\n border-left-width: thin;\n border-right-style: dashed;\n border-right-width: thin;\n}\n\n.igv-center-line-wide {\n background-color: rgba(0, 0, 0, 0);\n border-left-color: rgba(127, 127, 127, 0.51);\n border-right-color: rgba(127, 127, 127, 0.51);\n}\n\n.igv-center-line-thin {\n background-color: rgba(0, 0, 0, 0);\n border-left-color: rgba(127, 127, 127, 0.51);\n border-right-color: rgba(0, 0, 0, 0);\n}\n\n.igv-cursor-guide-horizontal {\n display: none;\n pointer-events: none;\n user-select: none;\n -moz-user-select: none;\n -webkit-user-select: none;\n position: absolute;\n left: 0;\n right: 0;\n top: 50%;\n height: 1px;\n z-index: 1;\n margin-left: 50px;\n margin-right: 54px;\n border-top-style: dotted;\n border-top-width: thin;\n border-top-color: rgba(127, 127, 127, 0.76);\n}\n\n.igv-cursor-guide-vertical {\n pointer-events: none;\n user-select: none;\n -moz-user-select: none;\n -webkit-user-select: none;\n position: absolute;\n top: 0;\n bottom: 0;\n left: 50%;\n width: 1px;\n z-index: 1;\n border-left-style: dotted;\n border-left-width: thin;\n border-left-color: rgba(127, 127, 127, 0.76);\n display: none;\n}\n\n.igv-user-feedback {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 512px;\n height: 360px;\n z-index: 2048;\n background-color: white;\n border-color: #a2a2a2;\n border-style: solid;\n border-width: thin;\n font-family: \"Open Sans\", sans-serif;\n font-size: medium;\n font-weight: 400;\n color: #444;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-user-feedback div:first-child {\n position: relative;\n height: 24px;\n width: 100%;\n background-color: white;\n border-bottom-color: #a2a2a2;\n border-bottom-style: solid;\n border-bottom-width: thin;\n}\n.igv-user-feedback div:first-child div {\n position: absolute;\n top: 2px;\n width: 16px;\n height: 16px;\n background-color: transparent;\n}\n.igv-user-feedback div:first-child div:first-child {\n left: 8px;\n}\n.igv-user-feedback div:first-child div:last-child {\n cursor: pointer;\n right: 8px;\n}\n.igv-user-feedback div:last-child {\n width: 100%;\n height: calc(100% - 24px);\n border-width: 0;\n}\n.igv-user-feedback div:last-child div {\n width: auto;\n height: auto;\n margin: 8px;\n}\n\n.igv-generic-dialog-container {\n position: absolute;\n top: 0;\n left: 0;\n width: 300px;\n height: 200px;\n border-color: #7F7F7F;\n border-radius: 4px;\n border-style: solid;\n border-width: thin;\n font-family: \"Open Sans\", sans-serif;\n font-size: medium;\n font-weight: 400;\n z-index: 2048;\n background-color: white;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-generic-dialog-container .igv-generic-dialog-header {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n width: 100%;\n height: 24px;\n cursor: move;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-color: #7F7F7F;\n border-bottom-style: solid;\n border-bottom-width: thin;\n background-color: #eee;\n}\n.igv-generic-dialog-container .igv-generic-dialog-header div {\n margin-right: 4px;\n margin-bottom: 2px;\n height: 12px;\n width: 12px;\n color: #7F7F7F;\n}\n.igv-generic-dialog-container .igv-generic-dialog-header div:hover {\n cursor: pointer;\n color: #444;\n}\n.igv-generic-dialog-container .igv-generic-dialog-one-liner {\n color: #373737;\n width: 95%;\n height: 24px;\n line-height: 24px;\n text-align: left;\n margin-top: 8px;\n padding-left: 8px;\n overflow-wrap: break-word;\n background-color: white;\n}\n.igv-generic-dialog-container .igv-generic-dialog-label-input {\n margin-top: 8px;\n width: 95%;\n height: 24px;\n color: #373737;\n line-height: 24px;\n padding-left: 8px;\n background-color: white;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-generic-dialog-container .igv-generic-dialog-label-input div {\n width: 30%;\n height: 100%;\n font-size: 16px;\n text-align: right;\n padding-right: 8px;\n background-color: white;\n}\n.igv-generic-dialog-container .igv-generic-dialog-label-input input {\n display: block;\n height: 100%;\n width: 100%;\n padding-left: 4px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n color: #373737;\n text-align: left;\n outline: none;\n border-style: solid;\n border-width: thin;\n border-color: #7F7F7F;\n background-color: white;\n}\n.igv-generic-dialog-container .igv-generic-dialog-label-input input {\n width: 50%;\n font-size: 16px;\n}\n.igv-generic-dialog-container .igv-generic-dialog-input {\n margin-top: 8px;\n width: calc(100% - 16px);\n height: 24px;\n color: #373737;\n line-height: 24px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-around;\n align-items: center;\n}\n.igv-generic-dialog-container .igv-generic-dialog-input input {\n display: block;\n height: 100%;\n width: 100%;\n padding-left: 4px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n color: #373737;\n text-align: left;\n outline: none;\n border-style: solid;\n border-width: thin;\n border-color: #7F7F7F;\n background-color: white;\n}\n.igv-generic-dialog-container .igv-generic-dialog-input input {\n font-size: 16px;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel {\n width: 100%;\n height: 28px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-around;\n align-items: center;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel div {\n margin-top: 32px;\n color: white;\n font-family: \"Open Sans\", sans-serif;\n font-size: 14px;\n font-weight: 400;\n width: 75px;\n height: 28px;\n line-height: 28px;\n text-align: center;\n border-color: transparent;\n border-style: solid;\n border-width: thin;\n border-radius: 2px;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel div:first-child {\n margin-left: 32px;\n margin-right: 0;\n background-color: #5ea4e0;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel div:last-child {\n margin-left: 0;\n margin-right: 32px;\n background-color: #c4c4c4;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel div:first-child:hover {\n cursor: pointer;\n background-color: #3b5c7f;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel div:last-child:hover {\n cursor: pointer;\n background-color: #7f7f7f;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok {\n width: 100%;\n height: 36px;\n margin-top: 32px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-around;\n align-items: center;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok div {\n width: 98px;\n height: 36px;\n line-height: 36px;\n text-align: center;\n color: white;\n font-family: \"Open Sans\", sans-serif;\n font-size: medium;\n font-weight: 400;\n border-color: white;\n border-style: solid;\n border-width: thin;\n border-radius: 4px;\n background-color: #2B81AF;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok div:hover {\n cursor: pointer;\n background-color: #25597f;\n}\n\n.igv-generic-container {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 2048;\n background-color: white;\n cursor: pointer;\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-generic-container div:first-child {\n cursor: move;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n height: 24px;\n width: 100%;\n background-color: #dddddd;\n}\n.igv-generic-container div:first-child i {\n display: block;\n color: #5f5f5f;\n cursor: pointer;\n width: 14px;\n height: 14px;\n margin-right: 8px;\n margin-bottom: 4px;\n}\n\n.igv-menu-popup {\n position: absolute;\n top: 0;\n left: 0;\n width: max-content;\n z-index: 4096;\n cursor: pointer;\n font-family: \"Open Sans\", sans-serif;\n font-size: small;\n font-weight: 400;\n color: #4b4b4b;\n background: white;\n border-radius: 4px;\n border-color: #7F7F7F;\n border-style: solid;\n border-width: thin;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-end;\n text-align: left;\n}\n.igv-menu-popup > div:not(:first-child) {\n width: 100%;\n}\n.igv-menu-popup > div:not(:first-child) > div {\n background: white;\n}\n.igv-menu-popup > div:not(:first-child) > div.context-menu {\n padding-left: 4px;\n padding-right: 4px;\n}\n.igv-menu-popup > div:not(:first-child) > div:last-child {\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n border-bottom-color: transparent;\n border-bottom-style: solid;\n border-bottom-width: thin;\n}\n.igv-menu-popup > div:not(:first-child) > div:hover {\n background: #efefef;\n}\n\n.igv-menu-popup-shim {\n padding-left: 8px;\n padding-right: 8px;\n padding-bottom: 1px;\n padding-top: 1px;\n}\n\n.igv-menu-popup-header {\n position: relative;\n width: 100%;\n height: 24px;\n cursor: move;\n border-top-color: transparent;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-color: #7F7F7F;\n border-bottom-style: solid;\n border-bottom-width: thin;\n background-color: #eee;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n}\n.igv-menu-popup-header div {\n margin-right: 4px;\n height: 12px;\n width: 12px;\n color: #7F7F7F;\n}\n.igv-menu-popup-header div:hover {\n cursor: pointer;\n color: #444;\n}\n\n.igv-menu-popup-check-container {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n width: 100%;\n height: 20px;\n margin-right: 4px;\n background-color: transparent;\n}\n.igv-menu-popup-check-container div {\n padding-top: 2px;\n padding-left: 8px;\n}\n.igv-menu-popup-check-container div:first-child {\n position: relative;\n width: 12px;\n height: 12px;\n}\n.igv-menu-popup-check-container div:first-child svg {\n position: absolute;\n width: 12px;\n height: 12px;\n}\n\n.igv-user-feedback {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 512px;\n height: 360px;\n z-index: 2048;\n background-color: white;\n border-color: #a2a2a2;\n border-style: solid;\n border-width: thin;\n font-family: \"Open Sans\", sans-serif;\n font-size: medium;\n font-weight: 400;\n color: #444;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-user-feedback div:first-child {\n position: relative;\n height: 24px;\n width: 100%;\n background-color: white;\n border-bottom-color: #a2a2a2;\n border-bottom-style: solid;\n border-bottom-width: thin;\n}\n.igv-user-feedback div:first-child div {\n position: absolute;\n top: 2px;\n width: 16px;\n height: 16px;\n background-color: transparent;\n}\n.igv-user-feedback div:first-child div:first-child {\n left: 8px;\n}\n.igv-user-feedback div:first-child div:last-child {\n cursor: pointer;\n right: 8px;\n}\n.igv-user-feedback div:last-child {\n width: 100%;\n height: calc(100% - 24px);\n border-width: 0;\n}\n.igv-user-feedback div:last-child div {\n width: auto;\n height: auto;\n margin: 8px;\n}\n\n.igv-loading-spinner-container {\n z-index: 1024;\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 32px;\n height: 32px;\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: center;\n align-items: center;\n}\n.igv-loading-spinner-container > div {\n box-sizing: border-box;\n width: 100%;\n height: 100%;\n border-radius: 50%;\n border: 4px solid rgba(128, 128, 128, 0.5);\n border-top-color: rgb(255, 255, 255);\n animation: spin 1s ease-in-out infinite;\n -webkit-animation: spin 1s ease-in-out infinite;\n}\n\n@keyframes spin {\n to {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n}\n@-webkit-keyframes spin {\n to {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n}\n.igv-roi-menu-next-gen {\n position: absolute;\n z-index: 512;\n font-family: \"Open Sans\", sans-serif;\n font-size: small;\n font-weight: 400;\n color: #4b4b4b;\n background-color: white;\n width: 192px;\n border-radius: 4px;\n border-color: #7F7F7F;\n border-style: solid;\n border-width: thin;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n}\n.igv-roi-menu-next-gen > div:first-child {\n height: 24px;\n border-top-color: transparent;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-color: #7F7F7F;\n border-bottom-style: solid;\n border-bottom-width: thin;\n background-color: #eee;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n}\n.igv-roi-menu-next-gen > div:first-child > div {\n margin-right: 4px;\n height: 12px;\n width: 12px;\n color: #7F7F7F;\n}\n.igv-roi-menu-next-gen > div:first-child > div:hover {\n cursor: pointer;\n color: #444;\n}\n.igv-roi-menu-next-gen > div:last-child {\n background-color: white;\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n border-bottom-color: transparent;\n border-bottom-style: solid;\n border-bottom-width: 0;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n text-align: start;\n vertical-align: middle;\n}\n.igv-roi-menu-next-gen > div:last-child > div {\n height: 24px;\n padding-left: 4px;\n border-bottom-style: solid;\n border-bottom-width: thin;\n border-bottom-color: #7f7f7f;\n}\n.igv-roi-menu-next-gen > div:last-child > div:not(:first-child):hover {\n background-color: rgba(127, 127, 127, 0.1);\n}\n.igv-roi-menu-next-gen > div:last-child div:first-child {\n font-style: italic;\n text-align: center;\n padding-right: 4px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.igv-roi-menu-next-gen > div:last-child > div:last-child {\n border-bottom-width: 0;\n border-bottom-color: transparent;\n}\n\n.igv-roi-placeholder {\n font-style: normal;\n color: rgba(75, 75, 75, 0.6);\n}\n\n.igv-roi-table {\n position: absolute;\n z-index: 1024;\n width: min-content;\n max-width: 1600px;\n border-color: #7f7f7f;\n border-radius: 4px;\n border-style: solid;\n border-width: thin;\n font-family: \"Open Sans\", sans-serif;\n font-size: 12px;\n font-weight: 400;\n background-color: white;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n cursor: default;\n}\n.igv-roi-table > div {\n height: 24px;\n font-size: 14px;\n text-align: start;\n vertical-align: middle;\n line-height: 24px;\n}\n.igv-roi-table > div:first-child {\n border-color: transparent;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-top-width: 0;\n border-bottom-color: #7f7f7f;\n border-bottom-style: solid;\n border-bottom-width: thin;\n background-color: #eee;\n cursor: move;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n}\n.igv-roi-table > div:first-child > div:first-child {\n text-align: center;\n white-space: nowrap;\n text-overflow: ellipsis;\n overflow: hidden;\n margin-left: 4px;\n margin-right: 4px;\n width: calc(100% - 4px - 12px);\n}\n.igv-roi-table > div:first-child > div:last-child {\n margin-right: 4px;\n margin-bottom: 2px;\n height: 12px;\n width: 12px;\n color: #7f7f7f;\n}\n.igv-roi-table > div:first-child > div:last-child > svg {\n display: block;\n}\n.igv-roi-table > div:first-child > div:last-child:hover {\n cursor: pointer;\n color: #444;\n}\n.igv-roi-table > .igv-roi-table-description {\n padding: 4px;\n margin-left: 4px;\n word-break: break-all;\n overflow-y: auto;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n background-color: transparent;\n}\n.igv-roi-table > .igv-roi-table-goto-explainer {\n margin-top: 5px;\n margin-left: 4px;\n color: #7F7F7F;\n font-style: italic;\n height: 24px;\n border-top: solid lightgray;\n background-color: transparent;\n}\n.igv-roi-table > .igv-roi-table-column-titles {\n height: 24px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: stretch;\n align-items: stretch;\n padding-right: 16px;\n background-color: white;\n border-top-color: #7f7f7f;\n border-top-style: solid;\n border-top-width: thin;\n border-bottom-color: #7f7f7f;\n border-bottom-style: solid;\n border-bottom-width: thin;\n}\n.igv-roi-table > .igv-roi-table-column-titles > div {\n font-size: 14px;\n vertical-align: middle;\n line-height: 24px;\n text-align: left;\n margin-left: 4px;\n height: 24px;\n overflow: hidden;\n text-overflow: ellipsis;\n border-right-color: #7f7f7f;\n border-right-style: solid;\n border-right-width: thin;\n}\n.igv-roi-table > .igv-roi-table-column-titles > div:last-child {\n border-right: unset;\n}\n.igv-roi-table > .igv-roi-table-row-container {\n overflow: auto;\n resize: both;\n max-width: 1600px;\n height: 360px;\n background-color: transparent;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row {\n height: 24px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: stretch;\n align-items: stretch;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row > div {\n font-size: 14px;\n vertical-align: middle;\n line-height: 24px;\n text-align: left;\n margin-left: 4px;\n height: 24px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n border-right-color: transparent;\n border-right-style: solid;\n border-right-width: thin;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row > div:last-child {\n border-right: unset;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row-hover {\n background-color: rgba(0, 0, 0, 0.04);\n}\n.igv-roi-table > div:last-child {\n height: 32px;\n line-height: 32px;\n border-top-color: #7f7f7f;\n border-top-style: solid;\n border-top-width: thin;\n border-bottom-color: transparent;\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n border-bottom-width: 0;\n background-color: #eee;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-around;\n align-items: center;\n}\n\n.igv-roi-table-row-selected {\n background-color: rgba(0, 0, 0, 0.125);\n}\n\n.igv-roi-table-button {\n cursor: pointer;\n height: 20px;\n user-select: none;\n line-height: 20px;\n text-align: center;\n vertical-align: middle;\n font-family: \"Open Sans\", sans-serif;\n font-size: 13px;\n font-weight: 400;\n color: black;\n padding-left: 6px;\n padding-right: 6px;\n background-color: rgb(239, 239, 239);\n border-color: black;\n border-style: solid;\n border-width: thin;\n border-radius: 3px;\n}\n\n.igv-roi-table-button:hover {\n font-weight: 400;\n background-color: rgba(0, 0, 0, 0.13);\n}\n\n.igv-roi-region {\n z-index: 64;\n position: absolute;\n top: 0;\n bottom: 0;\n pointer-events: none;\n overflow: visible;\n margin-top: 44px;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n}\n.igv-roi-region > div {\n position: relative;\n width: 100%;\n height: 8px;\n pointer-events: auto;\n}\n\n.igv-roi-menu {\n position: absolute;\n z-index: 1024;\n width: 144px;\n border-color: #7f7f7f;\n border-radius: 4px;\n border-style: solid;\n border-width: thin;\n font-family: \"Open Sans\", sans-serif;\n background-color: white;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n}\n.igv-roi-menu > div:not(:last-child) {\n border-bottom-color: rgba(128, 128, 128, 0.5);\n border-bottom-style: solid;\n border-bottom-width: thin;\n}\n.igv-roi-menu > div:first-child {\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-top-color: transparent;\n border-top-style: solid;\n border-top-width: 0;\n}\n.igv-roi-menu > div:last-child {\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n border-bottom-color: transparent;\n border-bottom-style: solid;\n border-bottom-width: 0;\n}\n\n.igv-roi-menu-row {\n height: 24px;\n padding-left: 8px;\n font-size: small;\n text-align: start;\n vertical-align: middle;\n line-height: 24px;\n background-color: white;\n}\n\n.igv-roi-menu-row-edit-description {\n width: -webkit-fill-available;\n font-size: small;\n text-align: start;\n vertical-align: middle;\n background-color: white;\n padding-left: 4px;\n padding-right: 4px;\n padding-bottom: 4px;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: stretch;\n align-items: stretch;\n}\n.igv-roi-menu-row-edit-description > label {\n margin-left: 2px;\n margin-bottom: 0;\n display: block;\n width: -webkit-fill-available;\n}\n.igv-roi-menu-row-edit-description > input {\n display: block;\n margin-left: 2px;\n margin-right: 2px;\n margin-bottom: 1px;\n width: -webkit-fill-available;\n}\n\n.igv-container {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n padding-top: 4px;\n user-select: none;\n -webkit-user-select: none;\n -ms-user-select: none;\n}\n\n.igv-viewport {\n position: relative;\n margin-top: 5px;\n line-height: 1;\n overflow-x: hidden;\n overflow-y: hidden;\n}\n\n.igv-viewport-content {\n position: relative;\n width: 100%;\n}\n.igv-viewport-content > canvas {\n position: relative;\n display: block;\n}\n\n.igv-column-container {\n position: relative;\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n width: 100%;\n}\n\n.igv-column-shim {\n width: 1px;\n margin-left: 2px;\n margin-right: 2px;\n background-color: #545453;\n}\n\n.igv-column {\n position: relative;\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n}\n\n.igv-axis-column {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n width: 50px;\n}\n.igv-axis-column > div {\n margin-top: 5px;\n width: 100%;\n}\n\n.igv-sample-name-column {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n}\n\n.igv-scrollbar-column {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n width: 14px;\n}\n.igv-scrollbar-column > div {\n position: relative;\n margin-top: 5px;\n width: 14px;\n}\n.igv-scrollbar-column > div > div {\n cursor: pointer;\n position: absolute;\n top: 0;\n left: 2px;\n width: 8px;\n border-width: 1px;\n border-style: solid;\n border-color: #c4c4c4;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n}\n.igv-scrollbar-column > div > div:hover {\n background-color: #c4c4c4;\n}\n\n.igv-track-drag-column {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n width: 12px;\n background-color: white;\n}\n.igv-track-drag-column > .igv-track-drag-handle {\n z-index: 512;\n position: relative;\n cursor: pointer;\n margin-top: 5px;\n width: 100%;\n border-style: solid;\n border-width: 0;\n border-top-right-radius: 6px;\n border-bottom-right-radius: 6px;\n background-color: #c4c4c4;\n}\n.igv-track-drag-column .igv-track-drag-handle-hover {\n background-color: #787878;\n}\n.igv-track-drag-column > .igv-track-drag-shim {\n position: relative;\n margin-top: 5px;\n width: 100%;\n border-style: solid;\n border-width: 0;\n}\n\n.igv-gear-menu-column {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n width: 28px;\n}\n.igv-gear-menu-column > div {\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n margin-top: 5px;\n width: 100%;\n background: white;\n}\n.igv-gear-menu-column > div > div {\n position: relative;\n margin-top: 4px;\n width: 16px;\n height: 16px;\n color: #7F7F7F;\n}\n.igv-gear-menu-column > div > div:hover {\n cursor: pointer;\n color: #444;\n}\n\n/*# sourceMappingURL=dom.css.map */\n';
62015
62064
 
62016
62065
  var style = document.createElement('style');
62017
62066
  style.setAttribute('type', 'text/css');