{"version":3,"file":"2608.0dfd49f78dc93c695e30.js","mappings":"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","sources":["webpack://grafana/./.yarn/__virtual__/@emotion-css-virtual-15ef12e38d/3/opt/drone/yarncache/@emotion-css-npm-11.7.1-25ff8755a7-ac1f56656f.zip/node_modules/@emotion/css/create-instance/dist/emotion-css-create-instance.esm.js","webpack://grafana/./.yarn/__virtual__/@emotion-css-virtual-15ef12e38d/3/opt/drone/yarncache/@emotion-css-npm-11.7.1-25ff8755a7-ac1f56656f.zip/node_modules/@emotion/css/dist/emotion-css.esm.js","webpack://grafana/./packages/jaeger-ui-components/src/Theme.tsx","webpack://grafana/./packages/jaeger-ui-components/src/keyboard-mappings.tsx","webpack://grafana/./packages/jaeger-ui-components/src/keyboard-shortcuts.tsx","webpack://grafana/./packages/jaeger-ui-components/src/url/externalLinkContext.tsx","webpack://grafana/./packages/jaeger-ui-components/src/utils/date.tsx","webpack://grafana/./packages/jaeger-ui-components/src/utils/number.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TraceTimelineViewer/utils.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TraceTimelineViewer/Ticks.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TraceTimelineViewer/TimelineRow.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TraceTimelineViewer/TimelineHeaderRow/TimelineCollapser.tsx","webpack://grafana/./packages/jaeger-ui-components/src/utils/DraggableManager/EUpdateTypes.tsx","webpack://grafana/./packages/jaeger-ui-components/src/utils/DraggableManager/DraggableManager.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TraceTimelineViewer/TimelineHeaderRow/TimelineColumnResizer.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TraceTimelineViewer/TimelineHeaderRow/TimelineViewingLayer.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TraceTimelineViewer/TimelineHeaderRow/TimelineHeaderRow.tsx","webpack://grafana/./packages/jaeger-ui-components/src/utils/color-generator.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TraceTimelineViewer/ListView/Positions.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TraceTimelineViewer/ListView/index.tsx","webpack://grafana/./packages/jaeger-ui-components/src/url/ReferenceLink.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TraceTimelineViewer/ReferencesButton.tsx","webpack://grafana/./packages/jaeger-ui-components/src/common/Popover.tsx","webpack://grafana/./packages/jaeger-ui-components/src/common/CopyIcon.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TraceTimelineViewer/SpanDetail/KeyValuesTable.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TraceTimelineViewer/SpanDetail/AccordianKeyValues.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TraceTimelineViewer/SpanDetail/AccordianKeyValues.markers.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TraceTimelineViewer/SpanDetail/AccordianLogs.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TraceTimelineViewer/SpanBar.tsx","webpack://grafana/./packages/jaeger-ui-components/src/utils/span-ancestor-ids.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TraceTimelineViewer/SpanTreeOffset.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TraceTimelineViewer/SpanBarRow.tsx","webpack://grafana/./packages/jaeger-ui-components/src/common/Divider.tsx","webpack://grafana/./packages/jaeger-ui-components/src/common/LabeledList.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TraceTimelineViewer/SpanDetail/AccordianReferences.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TraceTimelineViewer/SpanDetail/TextList.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TraceTimelineViewer/SpanDetail/AccordianText.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TraceTimelineViewer/SpanDetail/index.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TraceTimelineViewer/SpanDetailRow.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TraceTimelineViewer/VirtualizedTraceView.tsx","webpack://grafana/./packages/jaeger-ui-components/src/constants/tag-keys.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TraceTimelineViewer/index.tsx","webpack://grafana/./packages/jaeger-ui-components/src/common/NewWindowIcon.tsx","webpack://grafana/./packages/jaeger-ui-components/src/common/ExternalLinks.tsx","webpack://grafana/./packages/jaeger-ui-components/src/constants/index.tsx","webpack://grafana/./packages/jaeger-ui-components/src/common/BreakableText.tsx","webpack://grafana/./packages/jaeger-ui-components/src/common/TraceName.tsx","webpack://grafana/../../opt/drone/yarncache/lru-memoize-npm-1.1.0-281b40912f-cc0c8f8427.zip/node_modules/lru-memoize/dist/lru-memoize.es.js","webpack://grafana/./packages/jaeger-ui-components/src/constants/default-config.tsx","webpack://grafana/./packages/jaeger-ui-components/src/utils/config/get-config.tsx","webpack://grafana/./packages/jaeger-ui-components/src/model/span.tsx","webpack://grafana/./packages/jaeger-ui-components/src/model/link-patterns.tsx","webpack://grafana/./packages/jaeger-ui-components/src/model/trace-viewer.ts","webpack://grafana/./packages/jaeger-ui-components/src/TracePageHeader/SpanGraph/CanvasSpanGraph.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TracePageHeader/SpanGraph/render-into-canvas.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TracePageHeader/SpanGraph/TickLabels.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TracePageHeader/SpanGraph/GraphTicks.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TracePageHeader/SpanGraph/Scrubber.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TracePageHeader/SpanGraph/ViewingLayer.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TracePageHeader/SpanGraph/index.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TracePageHeader/TracePageHeader.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TraceTimelineViewer/SpanDetail/DetailState.tsx","webpack://grafana/./packages/jaeger-ui-components/src/utils/TreeNode.js","webpack://grafana/./packages/jaeger-ui-components/src/selectors/process.js","webpack://grafana/./packages/jaeger-ui-components/src/selectors/span.js","webpack://grafana/./packages/jaeger-ui-components/src/selectors/trace.js","webpack://grafana/./packages/jaeger-ui-components/src/utils/sort.js","webpack://grafana/./packages/jaeger-ui-components/src/model/transform-trace-data.tsx","webpack://grafana/./packages/jaeger-ui-components/src/utils/filter-spans.tsx","webpack://grafana/./packages/jaeger-ui-components/src/uberUtilityStyles.ts","webpack://grafana/./public/app/core/utils/tracing.ts","webpack://grafana/./public/app/plugins/datasource/jaeger/responseTransform.ts","webpack://grafana/./.yarn/__virtual__/react-icon-base-virtual-e209b164a7/3/opt/drone/yarncache/react-icon-base-npm-2.1.0-caadf8254e-62b6bfe486.zip/node_modules/react-icon-base/lib/index.js","webpack://grafana/./.yarn/__virtual__/react-icons-virtual-f314220a93/3/opt/drone/yarncache/react-icons-npm-2.2.7-c2e0e4d90b-74e692fdd3.zip/node_modules/react-icons/lib/io/alert.js","webpack://grafana/./.yarn/__virtual__/react-icons-virtual-f314220a93/3/opt/drone/yarncache/react-icons-npm-2.2.7-c2e0e4d90b-74e692fdd3.zip/node_modules/react-icons/lib/io/android-open.js","webpack://grafana/./.yarn/__virtual__/react-icons-virtual-f314220a93/3/opt/drone/yarncache/react-icons-npm-2.2.7-c2e0e4d90b-74e692fdd3.zip/node_modules/react-icons/lib/io/arrow-right-a.js","webpack://grafana/./.yarn/__virtual__/react-icons-virtual-f314220a93/3/opt/drone/yarncache/react-icons-npm-2.2.7-c2e0e4d90b-74e692fdd3.zip/node_modules/react-icons/lib/io/chevron-right.js","webpack://grafana/./.yarn/__virtual__/react-icons-virtual-f314220a93/3/opt/drone/yarncache/react-icons-npm-2.2.7-c2e0e4d90b-74e692fdd3.zip/node_modules/react-icons/lib/io/ios-arrow-down.js","webpack://grafana/./.yarn/__virtual__/react-icons-virtual-f314220a93/3/opt/drone/yarncache/react-icons-npm-2.2.7-c2e0e4d90b-74e692fdd3.zip/node_modules/react-icons/lib/io/ios-arrow-right.js","webpack://grafana/./.yarn/__virtual__/react-icons-virtual-f314220a93/3/opt/drone/yarncache/react-icons-npm-2.2.7-c2e0e4d90b-74e692fdd3.zip/node_modules/react-icons/lib/io/link.js","webpack://grafana/./.yarn/__virtual__/react-icons-virtual-f314220a93/3/opt/drone/yarncache/react-icons-npm-2.2.7-c2e0e4d90b-74e692fdd3.zip/node_modules/react-icons/lib/md/file-upload.js","webpack://grafana/./.yarn/__virtual__/react-icons-virtual-f314220a93/3/opt/drone/yarncache/react-icons-npm-2.2.7-c2e0e4d90b-74e692fdd3.zip/node_modules/react-icons/lib/md/keyboard-arrow-right.js","webpack://grafana/./packages/jaeger-ui-components/src/TraceTimelineViewer/SpanDetail/jsonMarkup.js","webpack://grafana/../../opt/drone/yarncache/combokeys-npm-3.0.1-45601d2e33-37ad8d0257.zip/node_modules/combokeys/Combokeys/index.js","webpack://grafana/../../opt/drone/yarncache/combokeys-npm-3.0.1-45601d2e33-37ad8d0257.zip/node_modules/combokeys/Combokeys/prototype/addEvents.js","webpack://grafana/../../opt/drone/yarncache/combokeys-npm-3.0.1-45601d2e33-37ad8d0257.zip/node_modules/combokeys/Combokeys/prototype/bind.js","webpack://grafana/../../opt/drone/yarncache/combokeys-npm-3.0.1-45601d2e33-37ad8d0257.zip/node_modules/combokeys/Combokeys/prototype/bindMultiple.js","webpack://grafana/../../opt/drone/yarncache/combokeys-npm-3.0.1-45601d2e33-37ad8d0257.zip/node_modules/combokeys/Combokeys/prototype/bindSequence.js","webpack://grafana/../../opt/drone/yarncache/combokeys-npm-3.0.1-45601d2e33-37ad8d0257.zip/node_modules/combokeys/Combokeys/prototype/bindSingle.js","webpack://grafana/../../opt/drone/yarncache/combokeys-npm-3.0.1-45601d2e33-37ad8d0257.zip/node_modules/combokeys/Combokeys/prototype/detach.js","webpack://grafana/../../opt/drone/yarncache/combokeys-npm-3.0.1-45601d2e33-37ad8d0257.zip/node_modules/combokeys/Combokeys/prototype/dom-event.js","webpack://grafana/../../opt/drone/yarncache/combokeys-npm-3.0.1-45601d2e33-37ad8d0257.zip/node_modules/combokeys/Combokeys/prototype/fireCallback.js","webpack://grafana/../../opt/drone/yarncache/combokeys-npm-3.0.1-45601d2e33-37ad8d0257.zip/node_modules/combokeys/Combokeys/prototype/getKeyInfo.js","webpack://grafana/../../opt/drone/yarncache/combokeys-npm-3.0.1-45601d2e33-37ad8d0257.zip/node_modules/combokeys/Combokeys/prototype/getMatches.js","webpack://grafana/../../opt/drone/yarncache/combokeys-npm-3.0.1-45601d2e33-37ad8d0257.zip/node_modules/combokeys/Combokeys/prototype/getReverseMap.js","webpack://grafana/../../opt/drone/yarncache/combokeys-npm-3.0.1-45601d2e33-37ad8d0257.zip/node_modules/combokeys/Combokeys/prototype/handleKey.js","webpack://grafana/../../opt/drone/yarncache/combokeys-npm-3.0.1-45601d2e33-37ad8d0257.zip/node_modules/combokeys/Combokeys/prototype/handleKeyEvent.js","webpack://grafana/../../opt/drone/yarncache/combokeys-npm-3.0.1-45601d2e33-37ad8d0257.zip/node_modules/combokeys/Combokeys/prototype/modifiersMatch.js","webpack://grafana/../../opt/drone/yarncache/combokeys-npm-3.0.1-45601d2e33-37ad8d0257.zip/node_modules/combokeys/Combokeys/prototype/pickBestAction.js","webpack://grafana/../../opt/drone/yarncache/combokeys-npm-3.0.1-45601d2e33-37ad8d0257.zip/node_modules/combokeys/Combokeys/prototype/reset.js","webpack://grafana/../../opt/drone/yarncache/combokeys-npm-3.0.1-45601d2e33-37ad8d0257.zip/node_modules/combokeys/Combokeys/prototype/resetSequenceTimer.js","webpack://grafana/../../opt/drone/yarncache/combokeys-npm-3.0.1-45601d2e33-37ad8d0257.zip/node_modules/combokeys/Combokeys/prototype/resetSequences.js","webpack://grafana/../../opt/drone/yarncache/combokeys-npm-3.0.1-45601d2e33-37ad8d0257.zip/node_modules/combokeys/Combokeys/prototype/stopCallback.js","webpack://grafana/../../opt/drone/yarncache/combokeys-npm-3.0.1-45601d2e33-37ad8d0257.zip/node_modules/combokeys/Combokeys/prototype/trigger.js","webpack://grafana/../../opt/drone/yarncache/combokeys-npm-3.0.1-45601d2e33-37ad8d0257.zip/node_modules/combokeys/Combokeys/prototype/unbind.js","webpack://grafana/../../opt/drone/yarncache/combokeys-npm-3.0.1-45601d2e33-37ad8d0257.zip/node_modules/combokeys/Combokeys/reset.js","webpack://grafana/../../opt/drone/yarncache/combokeys-npm-3.0.1-45601d2e33-37ad8d0257.zip/node_modules/combokeys/helpers/characterFromEvent.js","webpack://grafana/../../opt/drone/yarncache/combokeys-npm-3.0.1-45601d2e33-37ad8d0257.zip/node_modules/combokeys/helpers/eventModifiers.js","webpack://grafana/../../opt/drone/yarncache/combokeys-npm-3.0.1-45601d2e33-37ad8d0257.zip/node_modules/combokeys/helpers/isModifier.js","webpack://grafana/../../opt/drone/yarncache/combokeys-npm-3.0.1-45601d2e33-37ad8d0257.zip/node_modules/combokeys/helpers/keysFromString.js","webpack://grafana/../../opt/drone/yarncache/combokeys-npm-3.0.1-45601d2e33-37ad8d0257.zip/node_modules/combokeys/helpers/preventDefault.js","webpack://grafana/../../opt/drone/yarncache/combokeys-npm-3.0.1-45601d2e33-37ad8d0257.zip/node_modules/combokeys/helpers/shift-map.js","webpack://grafana/../../opt/drone/yarncache/combokeys-npm-3.0.1-45601d2e33-37ad8d0257.zip/node_modules/combokeys/helpers/special-aliases.js","webpack://grafana/../../opt/drone/yarncache/combokeys-npm-3.0.1-45601d2e33-37ad8d0257.zip/node_modules/combokeys/helpers/special-characters-map.js","webpack://grafana/../../opt/drone/yarncache/combokeys-npm-3.0.1-45601d2e33-37ad8d0257.zip/node_modules/combokeys/helpers/special-keys-map.js","webpack://grafana/../../opt/drone/yarncache/combokeys-npm-3.0.1-45601d2e33-37ad8d0257.zip/node_modules/combokeys/helpers/stopPropagation.js","webpack://grafana/../../opt/drone/yarncache/copy-to-clipboard-npm-3.3.1-18029bce99-3c7b1c333d.zip/node_modules/copy-to-clipboard/index.js","webpack://grafana/../../opt/drone/yarncache/deep-freeze-npm-0.0.1-12d684fc1a-1e43c98e44.zip/node_modules/deep-freeze/index.js","webpack://grafana/../../opt/drone/yarncache/fuzzy-npm-0.1.3-a0dfe08bd0-acc09c6173.zip/node_modules/fuzzy/lib/fuzzy.js","webpack://grafana/../../opt/drone/yarncache/toggle-selection-npm-1.0.6-c506b73005-a90dc80ed1.zip/node_modules/toggle-selection/index.js"],"sourcesContent":["import createCache from '@emotion/cache';\nimport { serializeStyles } from '@emotion/serialize';\nimport { getRegisteredStyles, insertStyles } from '@emotion/utils';\n\nfunction insertWithoutScoping(cache, serialized) {\n  if (cache.inserted[serialized.name] === undefined) {\n    return cache.insert('', serialized, cache.sheet, true);\n  }\n}\n\nfunction merge(registered, css, className) {\n  var registeredStyles = [];\n  var rawClassName = getRegisteredStyles(registered, registeredStyles, className);\n\n  if (registeredStyles.length < 2) {\n    return className;\n  }\n\n  return rawClassName + css(registeredStyles);\n}\n\nvar createEmotion = function createEmotion(options) {\n  var cache = createCache(options); // $FlowFixMe\n\n  cache.sheet.speedy = function (value) {\n    if (process.env.NODE_ENV !== 'production' && this.ctr !== 0) {\n      throw new Error('speedy must be changed before any rules are inserted');\n    }\n\n    this.isSpeedy = value;\n  };\n\n  cache.compat = true;\n\n  var css = function css() {\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    var serialized = serializeStyles(args, cache.registered, undefined);\n    insertStyles(cache, serialized, false);\n    return cache.key + \"-\" + serialized.name;\n  };\n\n  var keyframes = function keyframes() {\n    for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n      args[_key2] = arguments[_key2];\n    }\n\n    var serialized = serializeStyles(args, cache.registered);\n    var animation = \"animation-\" + serialized.name;\n    insertWithoutScoping(cache, {\n      name: serialized.name,\n      styles: \"@keyframes \" + animation + \"{\" + serialized.styles + \"}\"\n    });\n    return animation;\n  };\n\n  var injectGlobal = function injectGlobal() {\n    for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n      args[_key3] = arguments[_key3];\n    }\n\n    var serialized = serializeStyles(args, cache.registered);\n    insertWithoutScoping(cache, serialized);\n  };\n\n  var cx = function cx() {\n    for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n      args[_key4] = arguments[_key4];\n    }\n\n    return merge(cache.registered, css, classnames(args));\n  };\n\n  return {\n    css: css,\n    cx: cx,\n    injectGlobal: injectGlobal,\n    keyframes: keyframes,\n    hydrate: function hydrate(ids) {\n      ids.forEach(function (key) {\n        cache.inserted[key] = true;\n      });\n    },\n    flush: function flush() {\n      cache.registered = {};\n      cache.inserted = {};\n      cache.sheet.flush();\n    },\n    // $FlowFixMe\n    sheet: cache.sheet,\n    cache: cache,\n    getRegisteredStyles: getRegisteredStyles.bind(null, cache.registered),\n    merge: merge.bind(null, cache.registered, css)\n  };\n};\n\nvar classnames = function classnames(args) {\n  var cls = '';\n\n  for (var i = 0; i < args.length; i++) {\n    var arg = args[i];\n    if (arg == null) continue;\n    var toAdd = void 0;\n\n    switch (typeof arg) {\n      case 'boolean':\n        break;\n\n      case 'object':\n        {\n          if (Array.isArray(arg)) {\n            toAdd = classnames(arg);\n          } else {\n            toAdd = '';\n\n            for (var k in arg) {\n              if (arg[k] && k) {\n                toAdd && (toAdd += ' ');\n                toAdd += k;\n              }\n            }\n          }\n\n          break;\n        }\n\n      default:\n        {\n          toAdd = arg;\n        }\n    }\n\n    if (toAdd) {\n      cls && (cls += ' ');\n      cls += toAdd;\n    }\n  }\n\n  return cls;\n};\n\nexport default createEmotion;\n","import '@emotion/cache';\nimport '@emotion/serialize';\nimport '@emotion/utils';\nimport createEmotion from '../create-instance/dist/emotion-css-create-instance.esm.js';\n\nvar _createEmotion = createEmotion({\n  key: 'css'\n}),\n    flush = _createEmotion.flush,\n    hydrate = _createEmotion.hydrate,\n    cx = _createEmotion.cx,\n    merge = _createEmotion.merge,\n    getRegisteredStyles = _createEmotion.getRegisteredStyles,\n    injectGlobal = _createEmotion.injectGlobal,\n    keyframes = _createEmotion.keyframes,\n    css = _createEmotion.css,\n    sheet = _createEmotion.sheet,\n    cache = _createEmotion.cache;\n\nexport { cache, css, cx, flush, getRegisteredStyles, hydrate, injectGlobal, keyframes, merge, sheet };\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport tinycolor from 'tinycolor2';\n\nimport { GrafanaTheme2 } from '@grafana/data';\n\n/**\n * Tries to get a dark variant color. Either by simply inverting the luminosity and darkening or lightening the color\n * a bit, or if base is provided, tries 2 variants of lighter and darker colors and checks which is more readable with\n * the base.\n * @param theme\n * @param hex\n * @param base\n */\nexport function autoColor(theme: GrafanaTheme2, hex: string, base?: string) {\n  if (theme.isLight) {\n    return hex;\n  } else {\n    if (base) {\n      const color = tinycolor(hex);\n      return tinycolor\n        .mostReadable(\n          base,\n          [\n            color.clone().lighten(25),\n            color.clone().lighten(10),\n            color,\n            color.clone().darken(10),\n            color.clone().darken(25),\n          ],\n          {\n            includeFallbackColors: false,\n          }\n        )\n        .toHex8String();\n    }\n    const color = tinycolor(hex).toHsl();\n    color.l = 1 - color.l;\n    const newColor = tinycolor(color);\n    return newColor.isLight() ? newColor.darken(5).toHex8String() : newColor.lighten(5).toHex8String();\n  }\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nconst keyboardMappings: Record<string, { binding: string | string[]; label: string }> = {\n  scrollPageDown: { binding: 's', label: 'Scroll down' },\n  scrollPageUp: { binding: 'w', label: 'Scroll up' },\n  scrollToNextVisibleSpan: { binding: 'f', label: 'Scroll to the next visible span' },\n  scrollToPrevVisibleSpan: { binding: 'b', label: 'Scroll to the previous visible span' },\n  panLeft: { binding: ['a', 'left'], label: 'Pan left' },\n  panLeftFast: { binding: ['shift+a', 'shift+left'], label: 'Pan left — Large' },\n  panRight: { binding: ['d', 'right'], label: 'Pan right' },\n  panRightFast: { binding: ['shift+d', 'shift+right'], label: 'Pan right — Large' },\n  zoomIn: { binding: 'up', label: 'Zoom in' },\n  zoomInFast: { binding: 'shift+up', label: 'Zoom in — Large' },\n  zoomOut: { binding: 'down', label: 'Zoom out' },\n  zoomOutFast: { binding: 'shift+down', label: 'Zoom out — Large' },\n  collapseAll: { binding: ']', label: 'Collapse All' },\n  expandAll: { binding: '[', label: 'Expand All' },\n  collapseOne: { binding: 'p', label: 'Collapse One Level' },\n  expandOne: { binding: 'o', label: 'Expand One Level' },\n  searchSpans: { binding: 'ctrl+b', label: 'Search Spans' },\n  clearSearch: { binding: 'escape', label: 'Clear Search' },\n};\n\nexport default keyboardMappings;\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport Combokeys from 'combokeys';\nimport * as React from 'react';\n\nimport keyboardMappings from './keyboard-mappings';\n\nexport type CombokeysHandler =\n  | (() => void)\n  | ((event: React.KeyboardEvent<any>) => void)\n  | ((event: React.KeyboardEvent<any>, s: string) => void);\n\nexport type ShortcutCallbacks = {\n  [name: string]: CombokeysHandler;\n};\n\nlet instance: Combokeys | undefined;\n\nfunction getInstance(): Combokeys {\n  if (instance) {\n    return instance;\n  }\n  const local = new Combokeys(document.body);\n  instance = local;\n  return local;\n}\n\nexport function merge(callbacks: ShortcutCallbacks) {\n  const inst = getInstance();\n  Object.keys(callbacks).forEach((name) => {\n    const keysHandler = callbacks[name];\n    if (keysHandler) {\n      inst.bind(keyboardMappings[name].binding, keysHandler);\n    }\n  });\n}\n\nexport function reset() {\n  const combokeys = getInstance();\n  combokeys.reset();\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport React from 'react';\n\n/**\n * There are several places where external links to spans are created. The url layout though is something\n * that should be decided on the application level and not on the component level but at the same time\n * propagating the factory function everywhere could be cumbersome so we use this context for that.\n */\nconst ExternalLinkContext = React.createContext<((traceID: string, spanID: string) => string) | undefined>(undefined);\nExternalLinkContext.displayName = 'ExternalLinkContext';\nexport default ExternalLinkContext;\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { round as _round, dropWhile as _dropWhile } from 'lodash';\nimport moment from 'moment-timezone';\n\nimport { toFloatPrecision } from './number';\n\nconst TODAY = 'Today';\nconst YESTERDAY = 'Yesterday';\n\nexport const STANDARD_DATE_FORMAT = 'YYYY-MM-DD';\nexport const STANDARD_TIME_FORMAT = 'HH:mm';\nexport const STANDARD_DATETIME_FORMAT = 'MMMM D YYYY, HH:mm:ss.SSS';\nexport const ONE_MILLISECOND = 1000;\nexport const ONE_SECOND = 1000 * ONE_MILLISECOND;\nexport const ONE_MINUTE = 60 * ONE_SECOND;\nexport const ONE_HOUR = 60 * ONE_MINUTE;\nexport const ONE_DAY = 24 * ONE_HOUR;\nexport const DEFAULT_MS_PRECISION = Math.log10(ONE_MILLISECOND);\n\nconst UNIT_STEPS: Array<{ unit: string; microseconds: number; ofPrevious: number }> = [\n  { unit: 'd', microseconds: ONE_DAY, ofPrevious: 24 },\n  { unit: 'h', microseconds: ONE_HOUR, ofPrevious: 60 },\n  { unit: 'm', microseconds: ONE_MINUTE, ofPrevious: 60 },\n  { unit: 's', microseconds: ONE_SECOND, ofPrevious: 1000 },\n  { unit: 'ms', microseconds: ONE_MILLISECOND, ofPrevious: 1000 },\n  { unit: 'μs', microseconds: 1, ofPrevious: 1000 },\n];\n\n/**\n * @param {number} timestamp\n * @param {number} initialTimestamp\n * @param {number} totalDuration\n * @returns {number} 0-100 percentage\n */\nexport function getPercentageOfDuration(duration: number, totalDuration: number) {\n  return (duration / totalDuration) * 100;\n}\n\nconst quantizeDuration = (duration: number, floatPrecision: number, conversionFactor: number) =>\n  toFloatPrecision(duration / conversionFactor, floatPrecision) * conversionFactor;\n\n/**\n * @param {number} duration (in microseconds)\n * @returns {string} formatted, unit-labelled string with time in milliseconds\n */\nexport function formatDate(duration: number) {\n  return moment(duration / ONE_MILLISECOND).format(STANDARD_DATE_FORMAT);\n}\n\n/**\n * @param {number} duration (in microseconds)\n * @returns {string} formatted, unit-labelled string with time in milliseconds\n */\nexport function formatTime(duration: number) {\n  return moment(duration / ONE_MILLISECOND).format(STANDARD_TIME_FORMAT);\n}\n\n/**\n * @param {number} duration (in microseconds)\n * @returns {string} formatted, unit-labelled string with time in milliseconds\n */\nexport function formatDatetime(duration: number) {\n  return moment(duration / ONE_MILLISECOND).format(STANDARD_DATETIME_FORMAT);\n}\n\n/**\n * @param {number} duration (in microseconds)\n * @returns {string} formatted, unit-labelled string with time in milliseconds\n */\nexport function formatMillisecondTime(duration: number) {\n  const targetDuration = quantizeDuration(duration, DEFAULT_MS_PRECISION, ONE_MILLISECOND);\n  return `${moment.duration(targetDuration / ONE_MILLISECOND).asMilliseconds()}ms`;\n}\n\n/**\n * @param {number} duration (in microseconds)\n * @returns {string} formatted, unit-labelled string with time in seconds\n */\nexport function formatSecondTime(duration: number) {\n  const targetDuration = quantizeDuration(duration, DEFAULT_MS_PRECISION, ONE_SECOND);\n  return `${moment.duration(targetDuration / ONE_MILLISECOND).asSeconds()}s`;\n}\n\n/**\n * Humanizes the duration for display.\n *\n * Example:\n * 5000ms => 5s\n * 1000μs => 1ms\n * 183840s => 2d 3h\n *\n * @param {number} duration (in microseconds)\n * @return {string} formatted duration\n */\nexport function formatDuration(duration: number): string {\n  // Drop all units that are too large except the last one\n  const [primaryUnit, secondaryUnit] = _dropWhile(\n    UNIT_STEPS,\n    ({ microseconds }, index) => index < UNIT_STEPS.length - 1 && microseconds > duration\n  );\n\n  if (primaryUnit.ofPrevious === 1000) {\n    // If the unit is decimal based, display as a decimal\n    return `${_round(duration / primaryUnit.microseconds, 2)}${primaryUnit.unit}`;\n  }\n\n  const primaryValue = Math.floor(duration / primaryUnit.microseconds);\n  const primaryUnitString = `${primaryValue}${primaryUnit.unit}`;\n  const secondaryValue = Math.round((duration / secondaryUnit.microseconds) % primaryUnit.ofPrevious);\n  const secondaryUnitString = `${secondaryValue}${secondaryUnit.unit}`;\n  return secondaryValue === 0 ? primaryUnitString : `${primaryUnitString} ${secondaryUnitString}`;\n}\n\nexport function formatRelativeDate(value: any, fullMonthName = false) {\n  const m = moment.isMoment(value) ? value : moment(value);\n  const monthFormat = fullMonthName ? 'MMMM' : 'MMM';\n  const dt = new Date();\n  if (dt.getFullYear() !== m.year()) {\n    return m.format(`${monthFormat} D, YYYY`);\n  }\n  const mMonth = m.month();\n  const mDate = m.date();\n  const date = dt.getDate();\n  if (mMonth === dt.getMonth() && mDate === date) {\n    return TODAY;\n  }\n  dt.setDate(date - 1);\n  if (mMonth === dt.getMonth() && mDate === dt.getDate()) {\n    return YESTERDAY;\n  }\n  return m.format(`${monthFormat} D`);\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * given a number and a desired precision for the floating\n * side, return the number at the new precision.\n *\n * toFloatPrecision(3.55, 1) // 3.5\n * toFloatPrecision(0.04422, 2) // 0.04\n * toFloatPrecision(6.24e6, 2) // 6240000.00\n *\n * does not support numbers that use \"e\" notation on toString.\n *\n * @param {number} number\n * @param {number} precision\n * @returns {number} number at new floating precision\n */\nexport function toFloatPrecision(number: number, precision: number): number {\n  const log10Length = Math.floor(Math.log10(Math.abs(number))) + 1;\n  const targetPrecision = precision + log10Length;\n\n  if (targetPrecision <= 0) {\n    return Math.trunc(number);\n  }\n\n  return Number(number.toPrecision(targetPrecision));\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { TraceSpan } from '../types/trace';\n\nexport type ViewedBoundsFunctionType = (start: number, end: number) => { start: number; end: number };\n/**\n * Given a range (`min`, `max`) and factoring in a zoom (`viewStart`, `viewEnd`)\n * a function is created that will find the position of a sub-range (`start`, `end`).\n * The calling the generated method will return the result as a `{ start, end }`\n * object with values ranging in [0, 1].\n *\n * @param  {number} min       The start of the outer range.\n * @param  {number} max       The end of the outer range.\n * @param  {number} viewStart The start of the zoom, on a range of [0, 1],\n *                            relative to the `min`, `max`.\n * @param  {number} viewEnd   The end of the zoom, on a range of [0, 1],\n *                            relative to the `min`, `max`.\n * @returns {(number, number) => Object} Created view bounds function\n */\nexport function createViewedBoundsFunc(viewRange: { min: number; max: number; viewStart: number; viewEnd: number }) {\n  const { min, max, viewStart, viewEnd } = viewRange;\n  const duration = max - min;\n  const viewMin = min + viewStart * duration;\n  const viewMax = max - (1 - viewEnd) * duration;\n  const viewWindow = viewMax - viewMin;\n\n  /**\n   * View bounds function\n   * @param  {number} start     The start of the sub-range.\n   * @param  {number} end       The end of the sub-range.\n   * @returns {Object}           The resultant range.\n   */\n  return (start: number, end: number) => ({\n    start: (start - viewMin) / viewWindow,\n    end: (end - viewMin) / viewWindow,\n  });\n}\n\n/**\n * Returns `true` if the `span` has a tag matching `key` = `value`.\n *\n * @param  {string} key   The tag key to match on.\n * @param  {any}    value The tag value to match.\n * @param  {{tags}} span  An object with a `tags` property of { key, value }\n *                        items.\n * @returns {boolean}      True if a match was found.\n */\nexport function spanHasTag(key: string, value: any, span: TraceSpan) {\n  if (!Array.isArray(span.tags) || !span.tags.length) {\n    return false;\n  }\n  return span.tags.some((tag) => tag.key === key && tag.value === value);\n}\n\nexport const isClientSpan = spanHasTag.bind(null, 'span.kind', 'client');\nexport const isServerSpan = spanHasTag.bind(null, 'span.kind', 'server');\n\nconst isErrorBool = spanHasTag.bind(null, 'error', true);\nconst isErrorStr = spanHasTag.bind(null, 'error', 'true');\nexport const isErrorSpan = (span: TraceSpan) => isErrorBool(span) || isErrorStr(span);\n\n/**\n * Returns `true` if at least one of the descendants of the `parentSpanIndex`\n * span contains an error tag.\n *\n * @param      {TraceSpan[]}   spans            The spans for a trace - should be\n *                                         sorted with children following parents.\n * @param      {number}   parentSpanIndex  The index of the parent span - only\n *                                         subsequent spans with depth less than\n *                                         the parent span will be checked.\n * @returns     {boolean}  Returns `true` if a descendant contains an error tag.\n */\nexport function spanContainsErredSpan(spans: TraceSpan[], parentSpanIndex: number) {\n  const { depth } = spans[parentSpanIndex];\n  let i = parentSpanIndex + 1;\n  for (; i < spans.length && spans[i].depth > depth; i++) {\n    if (isErrorSpan(spans[i])) {\n      return true;\n    }\n  }\n  return false;\n}\n\n/**\n * Expects the first span to be the parent span.\n */\nexport function findServerChildSpan(spans: TraceSpan[]) {\n  if (spans.length <= 1 || !isClientSpan(spans[0])) {\n    return false;\n  }\n  const span = spans[0];\n  const spanChildDepth = span.depth + 1;\n  let i = 1;\n  while (i < spans.length && spans[i].depth === spanChildDepth) {\n    if (isServerSpan(spans[i])) {\n      return spans[i];\n    }\n    i++;\n  }\n  return null;\n}\n\nexport const isKindClient = (span: TraceSpan): Boolean =>\n  span.tags.some(({ key, value }) => key === 'span.kind' && value === 'client');\n\nexport { formatDuration } from '../utils/date';\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport cx from 'classnames';\nimport * as React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useStyles2 } from '@grafana/ui';\n\nimport { autoColor } from '../Theme';\nimport { TNil } from '../types';\n\nimport { formatDuration } from './utils';\n\nconst getStyles = (theme: GrafanaTheme2) => {\n  return {\n    Ticks: css`\n      label: Ticks;\n      pointer-events: none;\n    `,\n    TicksTick: css`\n      label: TicksTick;\n      position: absolute;\n      height: 100%;\n      width: 1px;\n      background: ${autoColor(theme, '#d8d8d8')};\n      &:last-child {\n        width: 0;\n      }\n    `,\n    TicksTickLabel: css`\n      label: TicksTickLabel;\n      left: 0.25rem;\n      position: absolute;\n    `,\n    TicksTickLabelEndAnchor: css`\n      label: TicksTickLabelEndAnchor;\n      left: initial;\n      right: 0.25rem;\n    `,\n  };\n};\n\ntype TicksProps = {\n  endTime?: number | TNil;\n  numTicks: number;\n  showLabels?: boolean | TNil;\n  startTime?: number | TNil;\n};\n\nexport default function Ticks(props: TicksProps) {\n  const { endTime, numTicks, showLabels, startTime } = props;\n\n  let labels: undefined | string[];\n  if (showLabels) {\n    labels = [];\n    const viewingDuration = (endTime || 0) - (startTime || 0);\n    for (let i = 0; i < numTicks; i++) {\n      const durationAtTick = (startTime || 0) + (i / (numTicks - 1)) * viewingDuration;\n      labels.push(formatDuration(durationAtTick));\n    }\n  }\n  const styles = useStyles2(getStyles);\n  const ticks: React.ReactNode[] = [];\n  for (let i = 0; i < numTicks; i++) {\n    const portion = i / (numTicks - 1);\n    ticks.push(\n      <div\n        key={portion}\n        className={styles.TicksTick}\n        style={{\n          left: `${portion * 100}%`,\n        }}\n      >\n        {labels && (\n          <span className={cx(styles.TicksTickLabel, { [styles.TicksTickLabelEndAnchor]: portion >= 1 })}>\n            {labels[i]}\n          </span>\n        )}\n      </div>\n    );\n  }\n  return <div className={styles.Ticks}>{ticks}</div>;\n}\n\nTicks.defaultProps = {\n  endTime: null,\n  showLabels: null,\n  startTime: null,\n};\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport cx from 'classnames';\nimport * as React from 'react';\n\nimport { useStyles2 } from '@grafana/ui';\n\nimport { ubRelative } from '../uberUtilityStyles';\n\nconst getStyles = () => {\n  return {\n    flexRow: css`\n      display: flex;\n      flex: 0 1 auto;\n      flex-direction: row;\n    `,\n  };\n};\n\ntype TTimelineRowProps = {\n  children: React.ReactNode;\n  className?: string;\n};\n\ninterface TimelineRowCellProps extends React.HTMLAttributes<HTMLDivElement> {\n  children: React.ReactNode;\n  className?: string;\n  width: number;\n  style?: {};\n}\n\nexport default function TimelineRow(props: TTimelineRowProps) {\n  const { children, className = '', ...rest } = props;\n  const styles = useStyles2(getStyles);\n  return (\n    <div className={cx(styles.flexRow, className)} {...rest}>\n      {children}\n    </div>\n  );\n}\n\nTimelineRow.defaultProps = {\n  className: '',\n};\n\nexport function TimelineRowCell(props: TimelineRowCellProps) {\n  const { children, className = '', width, style, ...rest } = props;\n  const widthPercent = `${width * 100}%`;\n  const mergedStyle = { ...style, flexBasis: widthPercent, maxWidth: widthPercent };\n  return (\n    <div className={cx(ubRelative, className)} style={mergedStyle} {...(rest as any)}>\n      {children}\n    </div>\n  );\n}\n\nTimelineRowCell.defaultProps = { className: '', style: {} };\n\nTimelineRow.Cell = TimelineRowCell;\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport React from 'react';\n\nimport { IconButton, useStyles2 } from '@grafana/ui';\n\nconst getStyles = () => {\n  return {\n    TimelineCollapser: css`\n      align-items: center;\n      display: flex;\n      flex: none;\n      justify-content: center;\n      margin-right: 0.5rem;\n    `,\n  };\n};\n\ntype CollapserProps = {\n  onCollapseAll: () => void;\n  onCollapseOne: () => void;\n  onExpandOne: () => void;\n  onExpandAll: () => void;\n};\n\nexport function TimelineCollapser(props: CollapserProps) {\n  const { onExpandAll, onExpandOne, onCollapseAll, onCollapseOne } = props;\n  const styles = useStyles2(getStyles);\n  return (\n    <div className={styles.TimelineCollapser} data-test-id=\"TimelineCollapser\">\n      <IconButton tooltip=\"Expand +1\" size=\"xl\" tooltipPlacement=\"top\" name=\"angle-down\" onClick={onExpandOne} />\n      <IconButton tooltip=\"Collapse +1\" size=\"xl\" tooltipPlacement=\"top\" name=\"angle-right\" onClick={onCollapseOne} />\n      <IconButton\n        tooltip=\"Expand All\"\n        size=\"xl\"\n        tooltipPlacement=\"top\"\n        name=\"angle-double-down\"\n        onClick={onExpandAll}\n      />\n      <IconButton\n        tooltip=\"Collapse All\"\n        size=\"xl\"\n        tooltipPlacement=\"top\"\n        name=\"angle-double-right\"\n        onClick={onCollapseAll}\n      />\n    </div>\n  );\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// // export default {\n// const updateTypes = {\n//   DRAG_END: 'DRAG_END',\n//   DRAG_MOVE: 'DRAG_MOVE',\n//   DRAG_START: 'DRAG_START',\n//   MOUSE_ENTER: 'MOUSE_ENTER',\n//   MOUSE_LEAVE: 'MOUSE_LEAVE',\n//   MOUSE_MOVE: 'MOUSE_MOVE',\n// };\n\n// const typeUpdateTypes = updateTypes as { [K in keyof typeof updateTypes]: K };\n\nenum EUpdateTypes {\n  DragEnd = 'DragEnd',\n  DragMove = 'DragMove',\n  DragStart = 'DragStart',\n  MouseEnter = 'MouseEnter',\n  MouseLeave = 'MouseLeave',\n  MouseMove = 'MouseMove',\n}\n\nexport default EUpdateTypes;\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { get as _get } from 'lodash';\n\nimport { TNil } from '../../types';\n\nimport EUpdateTypes from './EUpdateTypes';\nimport { DraggableBounds, DraggingUpdate } from './types';\n\nconst LEFT_MOUSE_BUTTON = 0;\n\ntype DraggableManagerOptions = {\n  getBounds: (tag: string | TNil) => DraggableBounds;\n  onMouseEnter?: (update: DraggingUpdate) => void;\n  onMouseLeave?: (update: DraggingUpdate) => void;\n  onMouseMove?: (update: DraggingUpdate) => void;\n  onDragStart?: (update: DraggingUpdate) => void;\n  onDragMove?: (update: DraggingUpdate) => void;\n  onDragEnd?: (update: DraggingUpdate) => void;\n  resetBoundsOnResize?: boolean;\n  tag?: string;\n};\n\nexport default class DraggableManager {\n  // cache the last known DraggableBounds (invalidate via `#resetBounds())\n  _bounds: DraggableBounds | TNil;\n  _isDragging: boolean;\n  // optional callbacks for various dragging events\n  _onMouseEnter: ((update: DraggingUpdate) => void) | TNil;\n  _onMouseLeave: ((update: DraggingUpdate) => void) | TNil;\n  _onMouseMove: ((update: DraggingUpdate) => void) | TNil;\n  _onDragStart: ((update: DraggingUpdate) => void) | TNil;\n  _onDragMove: ((update: DraggingUpdate) => void) | TNil;\n  _onDragEnd: ((update: DraggingUpdate) => void) | TNil;\n  // whether to reset the bounds on window resize\n  _resetBoundsOnResize: boolean;\n\n  /**\n   * Get the `DraggableBounds` for the current drag. The returned value is\n   * cached until either `#resetBounds()` is called or the window is resized\n   * (assuming `_resetBoundsOnResize` is `true`). The `DraggableBounds` defines\n   * the range the current drag can span to. It also establishes the left offset\n   * to adjust `clientX` by (from the `MouseEvent`s).\n   */\n  getBounds: (tag: string | TNil) => DraggableBounds;\n\n  // convenience data\n  tag: string | TNil;\n\n  // handlers for integration with DOM elements\n  handleMouseEnter: (event: React.MouseEvent<any>) => void;\n  handleMouseMove: (event: React.MouseEvent<any>) => void;\n  handleMouseLeave: (event: React.MouseEvent<any>) => void;\n  handleMouseDown: (event: React.MouseEvent<any>) => void;\n\n  constructor({ getBounds, tag, resetBoundsOnResize = true, ...rest }: DraggableManagerOptions) {\n    this.handleMouseDown = this._handleDragEvent;\n    this.handleMouseEnter = this._handleMinorMouseEvent;\n    this.handleMouseMove = this._handleMinorMouseEvent;\n    this.handleMouseLeave = this._handleMinorMouseEvent;\n\n    this.getBounds = getBounds;\n    this.tag = tag;\n    this._isDragging = false;\n    this._bounds = undefined;\n    this._resetBoundsOnResize = Boolean(resetBoundsOnResize);\n    if (this._resetBoundsOnResize) {\n      window.addEventListener('resize', this.resetBounds);\n    }\n    this._onMouseEnter = rest.onMouseEnter;\n    this._onMouseLeave = rest.onMouseLeave;\n    this._onMouseMove = rest.onMouseMove;\n    this._onDragStart = rest.onDragStart;\n    this._onDragMove = rest.onDragMove;\n    this._onDragEnd = rest.onDragEnd;\n  }\n\n  _getBounds(): DraggableBounds {\n    if (!this._bounds) {\n      this._bounds = this.getBounds(this.tag);\n    }\n    return this._bounds;\n  }\n\n  _getPosition(clientX: number) {\n    const { clientXLeft, maxValue, minValue, width } = this._getBounds();\n    let x = clientX - clientXLeft;\n    let value = x / width;\n    if (minValue != null && value < minValue) {\n      value = minValue;\n      x = minValue * width;\n    } else if (maxValue != null && value > maxValue) {\n      value = maxValue;\n      x = maxValue * width;\n    }\n    return { value, x };\n  }\n\n  _stopDragging() {\n    window.removeEventListener('mousemove', this._handleDragEvent);\n    window.removeEventListener('mouseup', this._handleDragEvent);\n    const style = _get(document, 'body.style');\n    if (style) {\n      style.userSelect = null;\n    }\n    this._isDragging = false;\n  }\n\n  isDragging() {\n    return this._isDragging;\n  }\n\n  dispose() {\n    if (this._isDragging) {\n      this._stopDragging();\n    }\n    if (this._resetBoundsOnResize) {\n      window.removeEventListener('resize', this.resetBounds);\n    }\n    this._bounds = undefined;\n    this._onMouseEnter = undefined;\n    this._onMouseLeave = undefined;\n    this._onMouseMove = undefined;\n    this._onDragStart = undefined;\n    this._onDragMove = undefined;\n    this._onDragEnd = undefined;\n  }\n\n  resetBounds = () => {\n    this._bounds = undefined;\n  };\n\n  _handleMinorMouseEvent = (event: React.MouseEvent<any>) => {\n    const { button, clientX, type: eventType } = event;\n    if (this._isDragging || button !== LEFT_MOUSE_BUTTON) {\n      return;\n    }\n    let type: EUpdateTypes | null = null;\n    let handler: ((update: DraggingUpdate) => void) | TNil;\n    if (eventType === 'mouseenter') {\n      type = EUpdateTypes.MouseEnter;\n      handler = this._onMouseEnter;\n    } else if (eventType === 'mouseleave') {\n      type = EUpdateTypes.MouseLeave;\n      handler = this._onMouseLeave;\n    } else if (eventType === 'mousemove') {\n      type = EUpdateTypes.MouseMove;\n      handler = this._onMouseMove;\n    } else {\n      throw new Error(`invalid event type: ${eventType}`);\n    }\n    if (!handler) {\n      return;\n    }\n    const { value, x } = this._getPosition(clientX);\n    handler({\n      event,\n      type,\n      value,\n      x,\n      manager: this,\n      tag: this.tag,\n    });\n  };\n\n  _handleDragEvent = (event: MouseEvent | React.MouseEvent<any>) => {\n    const { button, clientX, type: eventType } = event;\n    let type: EUpdateTypes | null = null;\n    let handler: ((update: DraggingUpdate) => void) | TNil;\n    if (eventType === 'mousedown') {\n      if (this._isDragging || button !== LEFT_MOUSE_BUTTON) {\n        return;\n      }\n      window.addEventListener('mousemove', this._handleDragEvent);\n      window.addEventListener('mouseup', this._handleDragEvent);\n      const style = _get(document, 'body.style');\n      if (style) {\n        style.userSelect = 'none';\n      }\n      this._isDragging = true;\n\n      type = EUpdateTypes.DragStart;\n      handler = this._onDragStart;\n    } else if (eventType === 'mousemove') {\n      if (!this._isDragging) {\n        return;\n      }\n      type = EUpdateTypes.DragMove;\n      handler = this._onDragMove;\n    } else if (eventType === 'mouseup') {\n      if (!this._isDragging) {\n        return;\n      }\n      this._stopDragging();\n      type = EUpdateTypes.DragEnd;\n      handler = this._onDragEnd;\n    } else {\n      throw new Error(`invalid event type: ${eventType}`);\n    }\n    if (!handler) {\n      return;\n    }\n    const { value, x } = this._getPosition(clientX);\n    handler({\n      event,\n      type,\n      value,\n      x,\n      manager: this,\n      tag: this.tag,\n    });\n  };\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport cx from 'classnames';\nimport * as React from 'react';\n\nimport { stylesFactory } from '@grafana/ui';\n\nimport { TNil } from '../../types';\nimport DraggableManager, { DraggableBounds, DraggingUpdate } from '../../utils/DraggableManager';\n\nexport const getStyles = stylesFactory(() => {\n  return {\n    TimelineColumnResizer: css`\n      left: 0;\n      position: absolute;\n      right: 0;\n      top: 0;\n    `,\n    wrapper: css`\n      bottom: 0;\n      position: absolute;\n      top: 0;\n    `,\n    dragger: css`\n      border-left: 2px solid transparent;\n      cursor: col-resize;\n      height: 5000px;\n      margin-left: -1px;\n      position: absolute;\n      top: 0;\n      width: 1px;\n      z-index: 10;\n      &:hover {\n        border-left: 2px solid rgba(0, 0, 0, 0.3);\n      }\n      &::before {\n        position: absolute;\n        top: 0;\n        bottom: 0;\n        left: -8px;\n        right: 0;\n        content: ' ';\n      }\n    `,\n    draggerDragging: css`\n      background: rgba(136, 0, 136, 0.05);\n      width: unset;\n      &::before {\n        left: -2000px;\n        right: -2000px;\n      }\n    `,\n    draggerDraggingLeft: css`\n      border-left: 2px solid #808;\n      border-right: 1px solid #999;\n    `,\n    draggerDraggingRight: css`\n      border-left: 1px solid #999;\n      border-right: 2px solid #808;\n    `,\n    gripIcon: css`\n      position: absolute;\n      top: 0;\n      bottom: 0;\n      &::before,\n      &::after {\n        border-right: 1px solid #ccc;\n        content: ' ';\n        height: 9px;\n        position: absolute;\n        right: 9px;\n        top: 25px;\n      }\n      &::after {\n        right: 5px;\n      }\n    `,\n    gripIconDragging: css`\n      &::before,\n      &::after {\n        border-right: 1px solid rgba(136, 0, 136, 0.5);\n      }\n    `,\n  };\n});\n\ntype TimelineColumnResizerProps = {\n  min: number;\n  max: number;\n  onChange: (newSize: number) => void;\n  position: number;\n  columnResizeHandleHeight: number;\n};\n\ntype TimelineColumnResizerState = {\n  dragPosition: number | TNil;\n};\n\nexport default class TimelineColumnResizer extends React.PureComponent<\n  TimelineColumnResizerProps,\n  TimelineColumnResizerState\n> {\n  state: TimelineColumnResizerState;\n\n  _dragManager: DraggableManager;\n  _rootElm: Element | TNil;\n\n  constructor(props: TimelineColumnResizerProps) {\n    super(props);\n    this._dragManager = new DraggableManager({\n      getBounds: this._getDraggingBounds,\n      onDragEnd: this._handleDragEnd,\n      onDragMove: this._handleDragUpdate,\n      onDragStart: this._handleDragUpdate,\n    });\n    this._rootElm = undefined;\n    this.state = {\n      dragPosition: null,\n    };\n  }\n\n  componentWillUnmount() {\n    this._dragManager.dispose();\n  }\n\n  _setRootElm = (elm: Element | TNil) => {\n    this._rootElm = elm;\n  };\n\n  _getDraggingBounds = (): DraggableBounds => {\n    if (!this._rootElm) {\n      throw new Error('invalid state');\n    }\n    const { left: clientXLeft, width } = this._rootElm.getBoundingClientRect();\n    const { min, max } = this.props;\n    return {\n      clientXLeft,\n      width,\n      maxValue: max,\n      minValue: min,\n    };\n  };\n\n  _handleDragUpdate = ({ value }: DraggingUpdate) => {\n    this.setState({ dragPosition: value });\n  };\n\n  _handleDragEnd = ({ manager, value }: DraggingUpdate) => {\n    manager.resetBounds();\n    this.setState({ dragPosition: null });\n    this.props.onChange(value);\n  };\n\n  render() {\n    let left;\n    let draggerStyle: React.CSSProperties;\n    const { position, columnResizeHandleHeight } = this.props;\n    const { dragPosition } = this.state;\n    left = `${position * 100}%`;\n    const gripStyle = { left };\n    let isDraggingLeft = false;\n    let isDraggingRight = false;\n    const styles = getStyles();\n\n    if (this._dragManager.isDragging() && this._rootElm && dragPosition != null) {\n      isDraggingLeft = dragPosition < position;\n      isDraggingRight = dragPosition > position;\n      left = `${dragPosition * 100}%`;\n      // Draw a highlight from the current dragged position back to the original\n      // position, e.g. highlight the change. Draw the highlight via `left` and\n      // `right` css styles (simpler than using `width`).\n      const draggerLeft = `${Math.min(position, dragPosition) * 100}%`;\n      // subtract 1px for draggerRight to deal with the right border being off\n      // by 1px when dragging left\n      const draggerRight = `calc(${(1 - Math.max(position, dragPosition)) * 100}% - 1px)`;\n      draggerStyle = { left: draggerLeft, right: draggerRight };\n    } else {\n      draggerStyle = gripStyle;\n    }\n    draggerStyle.height = columnResizeHandleHeight;\n\n    const isDragging = isDraggingLeft || isDraggingRight;\n    return (\n      <div className={styles.TimelineColumnResizer} ref={this._setRootElm} data-test-id=\"TimelineColumnResizer\">\n        <div\n          className={cx(styles.gripIcon, isDragging && styles.gripIconDragging)}\n          style={gripStyle}\n          data-test-id=\"TimelineColumnResizer--gripIcon\"\n        />\n        <div\n          aria-hidden\n          className={cx(\n            styles.dragger,\n            isDragging && styles.draggerDragging,\n            isDraggingRight && styles.draggerDraggingRight,\n            isDraggingLeft && styles.draggerDraggingLeft\n          )}\n          onMouseDown={this._dragManager.handleMouseDown}\n          style={draggerStyle}\n          data-test-id=\"TimelineColumnResizer--dragger\"\n        />\n      </div>\n    );\n  }\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css, cx } from '@emotion/css';\nimport * as React from 'react';\n\nimport { stylesFactory } from '@grafana/ui';\n\nimport { TNil } from '../../types';\nimport DraggableManager, { DraggableBounds, DraggingUpdate } from '../../utils/DraggableManager';\nimport { TUpdateViewRangeTimeFunction, ViewRangeTime, ViewRangeTimeUpdate } from '../types';\n\n// exported for testing\nexport const getStyles = stylesFactory(() => {\n  return {\n    TimelineViewingLayer: css`\n      label: TimelineViewingLayer;\n      bottom: 0;\n      cursor: vertical-text;\n      left: 0;\n      position: absolute;\n      right: 0;\n      top: 0;\n    `,\n    TimelineViewingLayerCursorGuide: css`\n      label: TimelineViewingLayerCursorGuide;\n      position: absolute;\n      top: 0;\n      bottom: 0;\n      left: 0;\n      width: 1px;\n      background-color: red;\n    `,\n    TimelineViewingLayerDragged: css`\n      label: TimelineViewingLayerDragged;\n      position: absolute;\n      top: 0;\n      bottom: 0;\n    `,\n    TimelineViewingLayerDraggedDraggingLeft: css`\n      label: TimelineViewingLayerDraggedDraggingLeft;\n      border-left: 1px solid;\n    `,\n    TimelineViewingLayerDraggedDraggingRight: css`\n      label: TimelineViewingLayerDraggedDraggingRight;\n      border-right: 1px solid;\n    `,\n    TimelineViewingLayerDraggedShiftDrag: css`\n      label: TimelineViewingLayerDraggedShiftDrag;\n      background-color: rgba(68, 68, 255, 0.2);\n      border-color: #44f;\n    `,\n    TimelineViewingLayerDraggedReframeDrag: css`\n      label: TimelineViewingLayerDraggedReframeDrag;\n      background-color: rgba(255, 68, 68, 0.2);\n      border-color: #f44;\n    `,\n    TimelineViewingLayerFullOverlay: css`\n      label: TimelineViewingLayerFullOverlay;\n      bottom: 0;\n      cursor: col-resize;\n      left: 0;\n      position: fixed;\n      right: 0;\n      top: 0;\n      user-select: none;\n    `,\n  };\n});\n\ntype TimelineViewingLayerProps = {\n  /**\n   * `boundsInvalidator` is an arbitrary prop that lets the component know the\n   * bounds for dragging need to be recalculated. In practice, the name column\n   * width serves fine for this.\n   */\n  boundsInvalidator: any | null | undefined;\n  updateNextViewRangeTime: (update: ViewRangeTimeUpdate) => void;\n  updateViewRangeTime: TUpdateViewRangeTimeFunction;\n  viewRangeTime: ViewRangeTime;\n};\n\ntype TDraggingLeftLayout = {\n  isDraggingLeft: boolean;\n  left: string;\n  width: string;\n};\n\ntype TOutOfViewLayout = {\n  isOutOfView: true;\n};\n\nfunction isOutOfView(layout: TDraggingLeftLayout | TOutOfViewLayout): layout is TOutOfViewLayout {\n  return Reflect.has(layout, 'isOutOfView');\n}\n\n/**\n * Map from a sub range to the greater view range, e.g, when the view range is\n * the middle half ([0.25, 0.75]), a value of 0.25 befomes 3/8.\n * @returns {number}\n */\nfunction mapFromViewSubRange(viewStart: number, viewEnd: number, value: number) {\n  return viewStart + value * (viewEnd - viewStart);\n}\n\n/**\n * Map a value from the view ([0, 1]) to a sub-range, e.g, when the view range is\n * the middle half ([0.25, 0.75]), a value of 3/8 becomes 1/4.\n * @returns {number}\n */\nfunction mapToViewSubRange(viewStart: number, viewEnd: number, value: number) {\n  return (value - viewStart) / (viewEnd - viewStart);\n}\n\n/**\n * Get the layout for the \"next\" view range time, e.g. the difference from the\n * drag start and the drag end. This is driven by `shiftStart`, `shiftEnd` or\n * `reframe` on `props.viewRangeTime`, not by the current state of the\n * component. So, it reflects in-progress dragging from the span minimap.\n */\nfunction getNextViewLayout(start: number, position: number): TDraggingLeftLayout | TOutOfViewLayout {\n  let [left, right] = start < position ? [start, position] : [position, start];\n  if (left >= 1 || right <= 0) {\n    return { isOutOfView: true };\n  }\n  if (left < 0) {\n    left = 0;\n  }\n  if (right > 1) {\n    right = 1;\n  }\n  return {\n    isDraggingLeft: start > position,\n    left: `${left * 100}%`,\n    width: `${(right - left) * 100}%`,\n  };\n}\n\n/**\n * Render the visual indication of the \"next\" view range.\n */\nfunction getMarkers(viewStart: number, viewEnd: number, from: number, to: number, isShift: boolean): React.ReactNode {\n  const mappedFrom = mapToViewSubRange(viewStart, viewEnd, from);\n  const mappedTo = mapToViewSubRange(viewStart, viewEnd, to);\n  const layout = getNextViewLayout(mappedFrom, mappedTo);\n  if (isOutOfView(layout)) {\n    return null;\n  }\n  const { isDraggingLeft, left, width } = layout;\n  const styles = getStyles();\n  const cls = cx({\n    [styles.TimelineViewingLayerDraggedDraggingRight]: !isDraggingLeft,\n    [styles.TimelineViewingLayerDraggedReframeDrag]: !isShift,\n    [styles.TimelineViewingLayerDraggedShiftDrag]: isShift,\n  });\n  return (\n    <div\n      className={cx(styles.TimelineViewingLayerDragged, styles.TimelineViewingLayerDraggedDraggingLeft, cls)}\n      style={{ left, width }}\n      data-test-id=\"Dragged\"\n    />\n  );\n}\n\n/**\n * `TimelineViewingLayer` is rendered on top of the TimelineHeaderRow time\n * labels; it handles showing the current view range and handles mouse UX for\n * modifying it.\n */\nexport default class TimelineViewingLayer extends React.PureComponent<TimelineViewingLayerProps> {\n  _draggerReframe: DraggableManager;\n  _root: Element | TNil;\n\n  constructor(props: TimelineViewingLayerProps) {\n    super(props);\n    this._draggerReframe = new DraggableManager({\n      getBounds: this._getDraggingBounds,\n      onDragEnd: this._handleReframeDragEnd,\n      onDragMove: this._handleReframeDragUpdate,\n      onDragStart: this._handleReframeDragUpdate,\n      onMouseLeave: this._handleReframeMouseLeave,\n      onMouseMove: this._handleReframeMouseMove,\n    });\n    this._root = undefined;\n  }\n\n  UNSAFE_componentWillReceiveProps(nextProps: TimelineViewingLayerProps) {\n    const { boundsInvalidator } = this.props;\n    if (boundsInvalidator !== nextProps.boundsInvalidator) {\n      this._draggerReframe.resetBounds();\n    }\n  }\n\n  componentWillUnmount() {\n    this._draggerReframe.dispose();\n  }\n\n  _setRoot = (elm: Element | TNil) => {\n    this._root = elm;\n  };\n\n  _getDraggingBounds = (): DraggableBounds => {\n    if (!this._root) {\n      throw new Error('invalid state');\n    }\n    const { left: clientXLeft, width } = this._root.getBoundingClientRect();\n    return { clientXLeft, width };\n  };\n\n  _handleReframeMouseMove = ({ value }: DraggingUpdate) => {\n    const [viewStart, viewEnd] = this.props.viewRangeTime.current;\n    const cursor = mapFromViewSubRange(viewStart, viewEnd, value);\n    this.props.updateNextViewRangeTime({ cursor });\n  };\n\n  _handleReframeMouseLeave = () => {\n    this.props.updateNextViewRangeTime({ cursor: undefined });\n  };\n\n  _handleReframeDragUpdate = ({ value }: DraggingUpdate) => {\n    const { current, reframe } = this.props.viewRangeTime;\n    const [viewStart, viewEnd] = current;\n    const shift = mapFromViewSubRange(viewStart, viewEnd, value);\n    const anchor = reframe ? reframe.anchor : shift;\n    const update = { reframe: { anchor, shift } };\n    this.props.updateNextViewRangeTime(update);\n  };\n\n  _handleReframeDragEnd = ({ manager, value }: DraggingUpdate) => {\n    const { current, reframe } = this.props.viewRangeTime;\n    const [viewStart, viewEnd] = current;\n    const shift = mapFromViewSubRange(viewStart, viewEnd, value);\n    const anchor = reframe ? reframe.anchor : shift;\n    const [start, end] = shift < anchor ? [shift, anchor] : [anchor, shift];\n    manager.resetBounds();\n    this.props.updateViewRangeTime(start, end, 'timeline-header');\n  };\n\n  render() {\n    const { viewRangeTime } = this.props;\n    const { current, cursor, reframe, shiftEnd, shiftStart } = viewRangeTime;\n    const [viewStart, viewEnd] = current;\n    const haveNextTimeRange = reframe != null || shiftEnd != null || shiftStart != null;\n    let cusrorPosition: string | TNil;\n    if (!haveNextTimeRange && cursor != null && cursor >= viewStart && cursor <= viewEnd) {\n      cusrorPosition = `${mapToViewSubRange(viewStart, viewEnd, cursor) * 100}%`;\n    }\n    const styles = getStyles();\n    return (\n      <div\n        aria-hidden\n        className={styles.TimelineViewingLayer}\n        ref={this._setRoot}\n        onMouseDown={this._draggerReframe.handleMouseDown}\n        onMouseLeave={this._draggerReframe.handleMouseLeave}\n        onMouseMove={this._draggerReframe.handleMouseMove}\n        data-test-id=\"TimelineViewingLayer\"\n      >\n        {cusrorPosition != null && (\n          <div\n            className={styles.TimelineViewingLayerCursorGuide}\n            style={{ left: cusrorPosition }}\n            data-test-id=\"TimelineViewingLayer--cursorGuide\"\n          />\n        )}\n        {reframe != null && getMarkers(viewStart, viewEnd, reframe.anchor, reframe.shift, false)}\n        {shiftEnd != null && getMarkers(viewStart, viewEnd, viewEnd, shiftEnd, true)}\n        {shiftStart != null && getMarkers(viewStart, viewEnd, viewStart, shiftStart, true)}\n      </div>\n    );\n  }\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport cx from 'classnames';\nimport * as React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useStyles2 } from '@grafana/ui';\n\nimport { autoColor } from '../../Theme';\nimport { ubFlex, ubPx2 } from '../../uberUtilityStyles';\nimport Ticks from '../Ticks';\nimport TimelineRow from '../TimelineRow';\nimport { TUpdateViewRangeTimeFunction, ViewRangeTime, ViewRangeTimeUpdate } from '../types';\n\nimport { TimelineCollapser } from './TimelineCollapser';\nimport TimelineColumnResizer from './TimelineColumnResizer';\nimport TimelineViewingLayer from './TimelineViewingLayer';\n\nconst getStyles = (theme: GrafanaTheme2) => {\n  return {\n    TimelineHeaderRow: css`\n      label: TimelineHeaderRow;\n      background: ${autoColor(theme, '#ececec')};\n      border-bottom: 1px solid ${autoColor(theme, '#ccc')};\n      height: 38px;\n      line-height: 38px;\n      width: 100%;\n      z-index: 4;\n      position: relative;\n    `,\n    TimelineHeaderRowTitle: css`\n      label: TimelineHeaderRowTitle;\n      flex: 1;\n      overflow: hidden;\n      margin: 0;\n      text-overflow: ellipsis;\n      white-space: nowrap;\n    `,\n    TimelineHeaderWrapper: css`\n      label: TimelineHeaderWrapper;\n      align-items: center;\n    `,\n  };\n};\n\ntype TimelineHeaderRowProps = {\n  duration: number;\n  nameColumnWidth: number;\n  numTicks: number;\n  onCollapseAll: () => void;\n  onCollapseOne: () => void;\n  onColummWidthChange: (width: number) => void;\n  onExpandAll: () => void;\n  onExpandOne: () => void;\n  updateNextViewRangeTime: (update: ViewRangeTimeUpdate) => void;\n  updateViewRangeTime: TUpdateViewRangeTimeFunction;\n  viewRangeTime: ViewRangeTime;\n  columnResizeHandleHeight: number;\n};\n\nexport default function TimelineHeaderRow(props: TimelineHeaderRowProps) {\n  const {\n    duration,\n    nameColumnWidth,\n    numTicks,\n    onCollapseAll,\n    onCollapseOne,\n    onColummWidthChange,\n    onExpandAll,\n    onExpandOne,\n    updateViewRangeTime,\n    updateNextViewRangeTime,\n    viewRangeTime,\n    columnResizeHandleHeight,\n  } = props;\n  const [viewStart, viewEnd] = viewRangeTime.current;\n  const styles = useStyles2(getStyles);\n  return (\n    <TimelineRow className={styles.TimelineHeaderRow} data-test-id=\"TimelineHeaderRow\">\n      <TimelineRow.Cell className={cx(ubFlex, ubPx2, styles.TimelineHeaderWrapper)} width={nameColumnWidth}>\n        <h4 className={styles.TimelineHeaderRowTitle}>Service &amp; Operation</h4>\n        <TimelineCollapser\n          onCollapseAll={onCollapseAll}\n          onExpandAll={onExpandAll}\n          onCollapseOne={onCollapseOne}\n          onExpandOne={onExpandOne}\n        />\n      </TimelineRow.Cell>\n      <TimelineRow.Cell width={1 - nameColumnWidth}>\n        <TimelineViewingLayer\n          boundsInvalidator={nameColumnWidth}\n          updateNextViewRangeTime={updateNextViewRangeTime}\n          updateViewRangeTime={updateViewRangeTime}\n          viewRangeTime={viewRangeTime}\n        />\n        <Ticks numTicks={numTicks} startTime={viewStart * duration} endTime={viewEnd * duration} showLabels />\n      </TimelineRow.Cell>\n      <TimelineColumnResizer\n        columnResizeHandleHeight={columnResizeHandleHeight}\n        position={nameColumnWidth}\n        onChange={onColummWidthChange}\n        min={0.2}\n        max={0.85}\n      />\n    </TimelineRow>\n  );\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport memoizeOne from 'memoize-one';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { colors } from '@grafana/ui';\n\n// TS needs the precise return type\nfunction strToRgb(s: string): [number, number, number] {\n  if (s.length !== 7) {\n    return [0, 0, 0];\n  }\n  const r = s.slice(1, 3);\n  const g = s.slice(3, 5);\n  const b = s.slice(5);\n  return [parseInt(r, 16), parseInt(g, 16), parseInt(b, 16)];\n}\n\nclass ColorGenerator {\n  colorsHex: string[];\n  colorsRgb: Array<[number, number, number]>;\n  cache: Map<string, number>;\n  currentIdx: number;\n\n  constructor(colorsHex: string[]) {\n    this.colorsHex = colorsHex;\n    this.colorsRgb = colorsHex.map(strToRgb);\n    this.cache = new Map();\n    this.currentIdx = 0;\n  }\n\n  _getColorIndex(key: string): number {\n    let i = this.cache.get(key);\n    if (i == null) {\n      i = this.currentIdx;\n      this.cache.set(key, this.currentIdx);\n      this.currentIdx = ++this.currentIdx % this.colorsHex.length;\n    }\n    return i;\n  }\n\n  /**\n   * Will assign a color to an arbitrary key.\n   * If the key has been used already, it will\n   * use the same color.\n   */\n  getColorByKey(key: string) {\n    const i = this._getColorIndex(key);\n    return this.colorsHex[i];\n  }\n\n  /**\n   * Retrieve the RGB values associated with a key. Adds the key and associates\n   * it with a color if the key is not recognized.\n   * @returns {number[]} An array of three ints [0, 255] representing a color.\n   */\n  getRgbColorByKey(key: string): [number, number, number] {\n    const i = this._getColorIndex(key);\n    return this.colorsRgb[i];\n  }\n\n  clear() {\n    this.cache.clear();\n    this.currentIdx = 0;\n  }\n}\n\nconst getGenerator = memoizeOne((colors: string[]) => {\n  return new ColorGenerator(colors);\n});\n\nexport function clear() {\n  getGenerator([]);\n}\n\nexport function getColorByKey(key: string, theme: GrafanaTheme2) {\n  return getGenerator(colors).getColorByKey(key);\n}\n\nexport function getRgbColorByKey(key: string, theme: GrafanaTheme2): [number, number, number] {\n  return getGenerator(colors).getRgbColorByKey(key);\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\ntype THeightGetter = (index: number) => number;\n\n/**\n * Keeps track of the height and y-position for anything sequenctial where\n * y-positions follow one-after-another and can be derived from the height of\n * the prior entries. The height is known from an accessor function parameter\n * to the methods that require new knowledge the heights.\n *\n * @export\n * @class Positions\n */\nexport default class Positions {\n  /**\n   * Indicates how far past the explicitly required height or y-values should\n   * checked.\n   */\n  bufferLen: number;\n  dataLen: number;\n  heights: number[];\n  /**\n   * `lastI` keeps track of which values have already been visited. In many\n   * scenarios, values do not need to be revisited. But, revisiting is required\n   * when heights have changed, so `lastI` can be forced.\n   */\n  lastI: number;\n  ys: number[];\n\n  constructor(bufferLen: number) {\n    this.ys = [];\n    this.heights = [];\n    this.bufferLen = bufferLen;\n    this.dataLen = -1;\n    this.lastI = -1;\n  }\n\n  /**\n   * Used to make sure the length of y-values and heights is consistent with\n   * the context; in particular `lastI` needs to remain valid.\n   */\n  profileData(dataLength: number) {\n    if (dataLength !== this.dataLen) {\n      this.dataLen = dataLength;\n      this.ys.length = dataLength;\n      this.heights.length = dataLength;\n      if (this.lastI >= dataLength) {\n        this.lastI = dataLength - 1;\n      }\n    }\n  }\n\n  /**\n   * Calculate and save the heights and y-values, based on `heightGetter`, from\n   * `lastI` until the`max` index; the starting point (`lastI`) can be forced\n   * via the `forcedLastI` parameter.\n   * @param {number=} forcedLastI\n   */\n  calcHeights(max: number, heightGetter: THeightGetter, forcedLastI?: number) {\n    if (forcedLastI != null) {\n      this.lastI = forcedLastI;\n    }\n    let _max = max + this.bufferLen;\n    if (_max <= this.lastI) {\n      return;\n    }\n    if (_max >= this.heights.length) {\n      _max = this.heights.length - 1;\n    }\n    let i = this.lastI;\n    if (this.lastI === -1) {\n      i = 0;\n      this.ys[0] = 0;\n    }\n    while (i <= _max) {\n      // eslint-disable-next-line no-multi-assign\n      const h = (this.heights[i] = heightGetter(i));\n      this.ys[i + 1] = this.ys[i] + h;\n      i++;\n    }\n    this.lastI = _max;\n  }\n\n  /**\n   * Verify the height and y-values from `lastI` up to `yValue`.\n   */\n  calcYs(yValue: number, heightGetter: THeightGetter) {\n    while ((this.ys[this.lastI] == null || yValue > this.ys[this.lastI]) && this.lastI < this.dataLen - 1) {\n      this.calcHeights(this.lastI, heightGetter);\n    }\n  }\n\n  /**\n   * Get the latest height for index `_i`. If it's in new terretory\n   * (_i > lastI), find the heights (and y-values) leading up to it. If it's in\n   * known territory (_i <= lastI) and the height is different than what is\n   * known, recalculate subsequent y values, but don't confirm the heights of\n   * those items, just update based on the difference.\n   */\n  confirmHeight(_i: number, heightGetter: THeightGetter) {\n    let i = _i;\n    if (i > this.lastI) {\n      this.calcHeights(i, heightGetter);\n      return;\n    }\n    const h = heightGetter(i);\n    if (h === this.heights[i]) {\n      return;\n    }\n    const chg = h - this.heights[i];\n    this.heights[i] = h;\n    // shift the y positions by `chg` for all known y positions\n    while (++i <= this.lastI) {\n      this.ys[i] += chg;\n    }\n    if (this.ys[this.lastI + 1] != null) {\n      this.ys[this.lastI + 1] += chg;\n    }\n  }\n\n  /**\n   * Given a target y-value (`yValue`), find the closest index (in the `.ys`\n   * array) that is prior to the y-value; e.g. map from y-value to index in\n   * `.ys`.\n   */\n  findFloorIndex(yValue: number, heightGetter: THeightGetter): number {\n    this.calcYs(yValue, heightGetter);\n\n    let imin = 0;\n    let imax = this.lastI;\n\n    if (this.ys.length < 2 || yValue < this.ys[1]) {\n      return 0;\n    }\n    if (yValue > this.ys[imax]) {\n      return imax;\n    }\n    let i;\n    while (imin < imax) {\n      // eslint-disable-next-line no-bitwise\n      i = (imin + 0.5 * (imax - imin)) | 0;\n      if (yValue > this.ys[i]) {\n        if (yValue <= this.ys[i + 1]) {\n          return i;\n        }\n        imin = i;\n      } else if (yValue < this.ys[i]) {\n        if (yValue >= this.ys[i - 1]) {\n          return i - 1;\n        }\n        imax = i;\n      } else {\n        return i;\n      }\n    }\n    throw new Error(`unable to find floor index for y=${yValue}`);\n  }\n\n  /**\n   * Get the `y` and `height` for a given row.\n   *\n   * @returns {{ height: number, y: number }}\n   */\n  getRowPosition(index: number, heightGetter: THeightGetter) {\n    this.confirmHeight(index, heightGetter);\n    return {\n      height: this.heights[index],\n      y: this.ys[index],\n    };\n  }\n\n  /**\n   * Get the estimated height of the whole shebang by extrapolating based on\n   * the average known height.\n   */\n  getEstimatedHeight(): number {\n    const known = this.ys[this.lastI] + this.heights[this.lastI];\n    if (this.lastI >= this.dataLen - 1) {\n      // eslint-disable-next-line no-bitwise\n      return known | 0;\n    }\n    // eslint-disable-next-line no-bitwise\n    return ((known / (this.lastI + 1)) * this.heights.length) | 0;\n  }\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport * as React from 'react';\n\nimport { TNil } from '../../types';\n\nimport Positions from './Positions';\n\ntype TWrapperProps = {\n  style: React.CSSProperties;\n  ref: (elm: HTMLDivElement) => void;\n  onScroll?: () => void;\n};\n\n/**\n * @typedef\n */\ntype TListViewProps = {\n  /**\n   * Number of elements in the list.\n   */\n  dataLength: number;\n  /**\n   * Convert item index (number) to the key (string). ListView uses both indexes\n   * and keys to handle the addition of new rows.\n   */\n  getIndexFromKey: (key: string) => number;\n  /**\n   * Convert item key (string) to the index (number). ListView uses both indexes\n   * and keys to handle the addition of new rows.\n   */\n  getKeyFromIndex: (index: number) => string;\n  /**\n   * Number of items to draw and add to the DOM, initially.\n   */\n  initialDraw?: number;\n  /**\n   * The parent provides fallback height measurements when there is not a\n   * rendered element to measure.\n   */\n  itemHeightGetter: (index: number, key: string) => number;\n  /**\n   * Function that renders an item; rendered items are added directly to the\n   * DOM, they are not wrapped in list item wrapper HTMLElement.\n   */\n  // itemRenderer(itemKey, style, i, attrs)\n  itemRenderer: (\n    itemKey: string,\n    style: Record<string, string | number>,\n    index: number,\n    attributes: Record<string, string>\n  ) => React.ReactNode;\n  /**\n   * `className` for the HTMLElement that holds the items.\n   */\n  itemsWrapperClassName?: string;\n  /**\n   * When adding new items to the DOM, this is the number of items to add above\n   * and below the current view. E.g. if list is 100 items and is scrolled\n   * halfway down (so items [46, 55] are in view), then when a new range of\n   * items is rendered, it will render items `46 - viewBuffer` to\n   * `55 + viewBuffer`.\n   */\n  viewBuffer: number;\n  /**\n   * The minimum number of items offscreen in either direction; e.g. at least\n   * `viewBuffer` number of items must be off screen above and below the\n   * current view, or more items will be rendered.\n   */\n  viewBufferMin: number;\n  /**\n   * When `true`, expect `_wrapperElm` to have `overflow: visible` and to,\n   * essentially, be tall to the point the entire page will will end up\n   * scrolling as a result of the ListView. Similar to react-virtualized\n   * window scroller.\n   *\n   * - Ref: https://bvaughn.github.io/react-virtualized/#/components/WindowScroller\n   * - Ref:https://github.com/bvaughn/react-virtualized/blob/497e2a1942529560681d65a9ef9f5e9c9c9a49ba/docs/WindowScroller.md\n   */\n  windowScroller?: boolean;\n  /**\n   * You need to pass in scrollElement when windowScroller is set to false.\n   * This element is responsible for tracking scrolling for lazy loading.\n   */\n  scrollElement?: Element;\n};\n\nconst DEFAULT_INITIAL_DRAW = 100;\n\n/**\n * Virtualized list view component, for the most part, only renders the window\n * of items that are in-view with some buffer before and after. Listens for\n * scroll events and updates which items are rendered. See react-virtualized\n * for a suite of components with similar, but generalized, functionality.\n * https://github.com/bvaughn/react-virtualized\n *\n * Note: Presently, ListView cannot be a PureComponent. This is because ListView\n * is sensitive to the underlying state that drives the list items, but it\n * doesn't actually receive that state. So, a render may still be required even\n * if ListView's props are unchanged.\n *\n * @export\n * @class ListView\n */\nexport default class ListView extends React.Component<TListViewProps> {\n  /**\n   * Keeps track of the height and y-value of items, by item index, in the\n   * ListView.\n   */\n  _yPositions: Positions;\n  /**\n   * Keep track of the known / measured heights of the rendered items; populated\n   * with values through observation and keyed on the item key, not the item\n   * index.\n   */\n  _knownHeights: Map<string, number>;\n  /**\n   * The start index of the items currently drawn.\n   */\n  _startIndexDrawn: number;\n  /**\n   * The end index of the items currently drawn.\n   */\n  _endIndexDrawn: number;\n  /**\n   * The start index of the items currently in view.\n   */\n  _startIndex: number;\n  /**\n   * The end index of the items currently in view.\n   */\n  _endIndex: number;\n  /**\n   * Height of the visual window, e.g. height of the scroller element.\n   */\n  _viewHeight: number;\n  /**\n   * `scrollTop` of the current scroll position.\n   */\n  _scrollTop: number;\n  /**\n   * Used to keep track of whether or not a re-calculation of what should be\n   * drawn / viewable has been scheduled.\n   */\n  _isScrolledOrResized: boolean;\n  /**\n   * If `windowScroller` is true, this notes how far down the page the scroller\n   * is located. (Note: repositioning and below-the-fold views are untested)\n   */\n  _htmlTopOffset: number;\n  _windowScrollListenerAdded: boolean;\n  _htmlElm: HTMLElement;\n  /**\n   * Element holding the scroller.\n   */\n  _wrapperElm: Element | TNil;\n  /**\n   * HTMLElement holding the rendered items.\n   */\n  _itemHolderElm: HTMLElement | TNil;\n\n  static defaultProps = {\n    initialDraw: DEFAULT_INITIAL_DRAW,\n    itemsWrapperClassName: '',\n    windowScroller: false,\n  };\n\n  constructor(props: TListViewProps) {\n    super(props);\n\n    this._yPositions = new Positions(200);\n    // _knownHeights is (item-key -> observed height) of list items\n    this._knownHeights = new Map();\n\n    this._startIndexDrawn = 2 ** 20;\n    this._endIndexDrawn = -(2 ** 20);\n    this._startIndex = 0;\n    this._endIndex = 0;\n    this._viewHeight = -1;\n    this._scrollTop = -1;\n    this._isScrolledOrResized = false;\n\n    this._htmlTopOffset = -1;\n    this._windowScrollListenerAdded = false;\n    // _htmlElm is only relevant if props.windowScroller is true\n    this._htmlElm = document.documentElement as any;\n    this._wrapperElm = undefined;\n    this._itemHolderElm = undefined;\n  }\n\n  componentDidMount() {\n    if (this.props.windowScroller) {\n      if (this._wrapperElm) {\n        const { top } = this._wrapperElm.getBoundingClientRect();\n        this._htmlTopOffset = top + this._htmlElm.scrollTop;\n      }\n      window.addEventListener('scroll', this._onScroll);\n      this._windowScrollListenerAdded = true;\n    } else {\n      // The wrapper element should be the one that handles the scrolling. Once we are not using scroll-canvas we can remove this.\n      this._wrapperElm = this.props.scrollElement;\n      this._wrapperElm?.addEventListener('scroll', this._onScroll);\n    }\n  }\n\n  componentDidUpdate() {\n    if (this._itemHolderElm) {\n      this._scanItemHeights();\n    }\n  }\n\n  componentWillUnmount() {\n    if (this._windowScrollListenerAdded) {\n      window.removeEventListener('scroll', this._onScroll);\n    } else {\n      this._wrapperElm?.removeEventListener('scroll', this._onScroll);\n    }\n  }\n\n  getViewHeight = () => this._viewHeight;\n\n  /**\n   * Get the index of the item at the bottom of the current view.\n   */\n  getBottomVisibleIndex = (): number => {\n    const bottomY = this._scrollTop + this._viewHeight;\n    return this._yPositions.findFloorIndex(bottomY, this._getHeight);\n  };\n\n  /**\n   * Get the index of the item at the top of the current view.\n   */\n  getTopVisibleIndex = (): number => this._yPositions.findFloorIndex(this._scrollTop, this._getHeight);\n\n  getRowPosition = (index: number): { height: number; y: number } =>\n    this._yPositions.getRowPosition(index, this._getHeight);\n\n  scrollToIndex = (index: number) => {\n    // calculate the position of the list view relative to the scroll parent\n    const { scrollElement } = this.props;\n    const scrollElementTop = scrollElement?.getBoundingClientRect().top || 0;\n    const listViewTop = (scrollElement?.scrollTop || 0) + (this._itemHolderElm?.getBoundingClientRect().top || 0);\n    const listViewOffset = listViewTop - scrollElementTop;\n\n    const itemOffset = this.getRowPosition(index).y;\n\n    // hard code a small offset to leave a little bit of space above the focused span, so it is visually clear\n    // that there is content above\n    this.props.scrollElement?.scrollTo({ top: itemOffset + listViewOffset - 80 });\n  };\n\n  /**\n   * Scroll event listener that schedules a remeasuring of which items should be\n   * rendered.\n   */\n  _onScroll = () => {\n    if (!this._isScrolledOrResized) {\n      this._isScrolledOrResized = true;\n      window.requestAnimationFrame(this._positionList);\n    }\n  };\n\n  /**\n   * Returns true is the view height (scroll window) or scroll position have\n   * changed.\n   */\n  _isViewChanged() {\n    if (!this._wrapperElm) {\n      return false;\n    }\n    const useRoot = this.props.windowScroller;\n    const clientHeight = useRoot ? this._htmlElm.clientHeight : this._wrapperElm.clientHeight;\n    const scrollTop = useRoot ? this._htmlElm.scrollTop : this._wrapperElm.scrollTop;\n    return clientHeight !== this._viewHeight || scrollTop !== this._scrollTop;\n  }\n\n  /**\n   * Recalculate _startIndex and _endIndex, e.g. which items are in view.\n   */\n  _calcViewIndexes() {\n    const useRoot = this.props.windowScroller;\n    // funky if statement is to satisfy flow\n    if (!useRoot) {\n      /* istanbul ignore next */\n      if (!this._wrapperElm) {\n        this._viewHeight = -1;\n        this._startIndex = 0;\n        this._endIndex = 0;\n        return;\n      }\n      this._viewHeight = this._wrapperElm.clientHeight;\n      this._scrollTop = this._wrapperElm.scrollTop;\n    } else {\n      this._viewHeight = window.innerHeight - this._htmlTopOffset;\n      this._scrollTop = window.scrollY;\n    }\n    const yStart = this._scrollTop;\n    const yEnd = this._scrollTop + this._viewHeight;\n    this._startIndex = this._yPositions.findFloorIndex(yStart, this._getHeight);\n    this._endIndex = this._yPositions.findFloorIndex(yEnd, this._getHeight);\n  }\n\n  /**\n   * Checked to see if the currently rendered items are sufficient, if not,\n   * force an update to trigger more items to be rendered.\n   */\n  _positionList = () => {\n    this._isScrolledOrResized = false;\n    if (!this._wrapperElm) {\n      return;\n    }\n    this._calcViewIndexes();\n    // indexes drawn should be padded by at least props.viewBufferMin\n    const maxStart = this.props.viewBufferMin > this._startIndex ? 0 : this._startIndex - this.props.viewBufferMin;\n    const minEnd =\n      this.props.viewBufferMin < this.props.dataLength - this._endIndex\n        ? this._endIndex + this.props.viewBufferMin\n        : this.props.dataLength - 1;\n    if (maxStart < this._startIndexDrawn || minEnd > this._endIndexDrawn) {\n      this.forceUpdate();\n    }\n  };\n\n  _initWrapper = (elm: HTMLElement | TNil) => {\n    if (!this.props.windowScroller) {\n      return;\n    }\n    this._wrapperElm = elm;\n    if (elm) {\n      this._viewHeight = elm.clientHeight;\n    }\n  };\n\n  _initItemHolder = (elm: HTMLElement | TNil) => {\n    this._itemHolderElm = elm;\n    this._scanItemHeights();\n  };\n\n  /**\n   * Go through all items that are rendered and save their height based on their\n   * item-key (which is on a data-* attribute). If any new or adjusted heights\n   * are found, re-measure the current known y-positions (via .yPositions).\n   */\n  _scanItemHeights = () => {\n    const getIndexFromKey = this.props.getIndexFromKey;\n    if (!this._itemHolderElm) {\n      return;\n    }\n    // note the keys for the first and last altered heights, the `yPositions`\n    // needs to be updated\n    let lowDirtyKey = null;\n    let highDirtyKey = null;\n    let isDirty = false;\n    // iterating childNodes is faster than children\n    // https://jsperf.com/large-htmlcollection-vs-large-nodelist\n    const nodes = this._itemHolderElm.childNodes;\n    const max = nodes.length;\n    for (let i = 0; i < max; i++) {\n      const node: HTMLElement = nodes[i] as any;\n      // use `.getAttribute(...)` instead of `.dataset` for jest / JSDOM\n      const itemKey = node.getAttribute('data-item-key');\n      if (!itemKey) {\n        // eslint-disable-next-line no-console\n        console.warn('itemKey not found');\n        continue;\n      }\n      // measure the first child, if it's available, otherwise the node itself\n      // (likely not transferable to other contexts, and instead is specific to\n      // how we have the items rendered)\n      const measureSrc: Element = node.firstElementChild || node;\n      const observed = measureSrc.clientHeight;\n      const known = this._knownHeights.get(itemKey);\n      if (observed !== known) {\n        this._knownHeights.set(itemKey, observed);\n        if (!isDirty) {\n          isDirty = true;\n          // eslint-disable-next-line no-multi-assign\n          lowDirtyKey = highDirtyKey = itemKey;\n        } else {\n          highDirtyKey = itemKey;\n        }\n      }\n    }\n    if (lowDirtyKey != null && highDirtyKey != null) {\n      // update yPositions, then redraw\n      const imin = getIndexFromKey(lowDirtyKey);\n      const imax = highDirtyKey === lowDirtyKey ? imin : getIndexFromKey(highDirtyKey);\n      this._yPositions.calcHeights(imax, this._getHeight, imin);\n      this.forceUpdate();\n    }\n  };\n\n  /**\n   * Get the height of the element at index `i`; first check the known heights,\n   * fallback to `.props.itemHeightGetter(...)`.\n   */\n  _getHeight = (i: number) => {\n    const key = this.props.getKeyFromIndex(i);\n    const known = this._knownHeights.get(key);\n    // known !== known iff known is NaN\n    // eslint-disable-next-line no-self-compare\n    if (known != null && known === known) {\n      return known;\n    }\n    return this.props.itemHeightGetter(i, key);\n  };\n\n  render() {\n    const {\n      dataLength,\n      getKeyFromIndex,\n      initialDraw = DEFAULT_INITIAL_DRAW,\n      itemRenderer,\n      viewBuffer,\n      viewBufferMin,\n    } = this.props;\n    const heightGetter = this._getHeight;\n    const items = [];\n    let start;\n    let end;\n\n    this._yPositions.profileData(dataLength);\n\n    if (!this._wrapperElm) {\n      start = 0;\n      end = (initialDraw < dataLength ? initialDraw : dataLength) - 1;\n    } else {\n      if (this._isViewChanged()) {\n        this._calcViewIndexes();\n      }\n      const maxStart = viewBufferMin > this._startIndex ? 0 : this._startIndex - viewBufferMin;\n      const minEnd = viewBufferMin < dataLength - this._endIndex ? this._endIndex + viewBufferMin : dataLength - 1;\n      if (maxStart < this._startIndexDrawn || minEnd > this._endIndexDrawn) {\n        start = viewBuffer > this._startIndex ? 0 : this._startIndex - viewBuffer;\n        end = this._endIndex + viewBuffer;\n        if (end >= dataLength) {\n          end = dataLength - 1;\n        }\n      } else {\n        start = this._startIndexDrawn;\n        end = this._endIndexDrawn > dataLength - 1 ? dataLength - 1 : this._endIndexDrawn;\n      }\n    }\n\n    this._yPositions.calcHeights(end, heightGetter, start || -1);\n    this._startIndexDrawn = start;\n    this._endIndexDrawn = end;\n\n    items.length = end - start + 1;\n    for (let i = start; i <= end; i++) {\n      const { y: top, height } = this._yPositions.getRowPosition(i, heightGetter);\n      const style = {\n        height,\n        top,\n        position: 'absolute',\n      };\n      const itemKey = getKeyFromIndex(i);\n      const attrs = { 'data-item-key': itemKey };\n      items.push(itemRenderer(itemKey, style, i, attrs));\n    }\n    const wrapperProps: TWrapperProps = {\n      style: { position: 'relative' },\n      ref: this._initWrapper,\n    };\n    if (!this.props.windowScroller) {\n      wrapperProps.onScroll = this._onScroll;\n      wrapperProps.style.height = '100%';\n      wrapperProps.style.overflowY = 'auto';\n    }\n    const scrollerStyle = {\n      position: 'relative' as 'relative',\n      height: this._yPositions.getEstimatedHeight(),\n    };\n    return (\n      <div {...wrapperProps}>\n        <div style={scrollerStyle}>\n          <div\n            style={{\n              position: 'absolute',\n              top: 0,\n              margin: 0,\n              padding: 0,\n            }}\n            className={this.props.itemsWrapperClassName}\n            ref={this._initItemHolder}\n          >\n            {items}\n          </div>\n        </div>\n      </div>\n    );\n  }\n}\n","// Copyright (c) 2019 The Jaeger Authors.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport React from 'react';\n\nimport { TraceSpanReference } from '../types/trace';\n\nimport ExternalLinkContext from './externalLinkContext';\n\ntype ReferenceLinkProps = {\n  reference: TraceSpanReference;\n  children: React.ReactNode;\n  className?: string;\n  focusSpan: (spanID: string) => void;\n  onClick?: () => void;\n};\n\nexport default function ReferenceLink(props: ReferenceLinkProps) {\n  const { reference, children, className, focusSpan, ...otherProps } = props;\n  delete otherProps.onClick;\n  if (reference.span) {\n    return (\n      <a role=\"button\" onClick={() => focusSpan(reference.spanID)} className={className} {...otherProps}>\n        {children}\n      </a>\n    );\n  }\n\n  return (\n    <ExternalLinkContext.Consumer>\n      {(createLinkToExternalSpan) => {\n        if (!createLinkToExternalSpan) {\n          throw new Error(\"ExternalLinkContext does not have a value, you probably forgot to setup it's provider\");\n        }\n\n        return (\n          <a\n            href={createLinkToExternalSpan(reference.traceID, reference.spanID)}\n            target=\"_blank\"\n            rel=\"noopener noreferrer\"\n            className={className}\n            {...otherProps}\n          >\n            {children}\n          </a>\n        );\n      }}\n    </ExternalLinkContext.Consumer>\n  );\n}\n","// Copyright (c) 2019 The Jaeger Authors.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport React from 'react';\n\nimport { Tooltip, useStyles2 } from '@grafana/ui';\n\nimport { TraceSpanReference } from '../types/trace';\nimport ReferenceLink from '../url/ReferenceLink';\n\nexport const getStyles = () => {\n  return {\n    MultiParent: css`\n      padding: 0 5px;\n      & ~ & {\n        margin-left: 5px;\n      }\n    `,\n    TraceRefLink: css`\n      display: flex;\n      justify-content: space-between;\n    `,\n    NewWindowIcon: css`\n      margin: 0.2em 0 0;\n    `,\n    tooltip: css`\n      max-width: none;\n    `,\n  };\n};\n\ntype TReferencesButtonProps = {\n  references: TraceSpanReference[];\n  children: React.ReactNode;\n  tooltipText: string;\n  focusSpan: (spanID: string) => void;\n};\n\nconst ReferencesButton = (props: TReferencesButtonProps) => {\n  const { references, children, tooltipText, focusSpan } = props;\n  const styles = useStyles2(getStyles);\n\n  // TODO: handle multiple items with some dropdown\n  const ref = references[0];\n  return (\n    <Tooltip content={tooltipText}>\n      <ReferenceLink reference={ref} focusSpan={focusSpan} className={styles.MultiParent}>\n        {children}\n      </ReferenceLink>\n    </Tooltip>\n  );\n};\n\nexport default ReferencesButton;\n","import React, { ReactElement, useRef } from 'react';\n\nimport { Popover as GrafanaPopover, PopoverController } from '@grafana/ui';\n\nexport type PopoverProps = {\n  children: ReactElement;\n  content: ReactElement;\n  overlayClassName?: string;\n};\n\nexport function Popover({ children, content, overlayClassName }: PopoverProps) {\n  const popoverRef = useRef<HTMLElement>(null);\n\n  return (\n    <PopoverController content={content} hideAfter={300}>\n      {(showPopper, hidePopper, popperProps) => {\n        return (\n          <>\n            {popoverRef.current && (\n              <GrafanaPopover\n                {...popperProps}\n                referenceElement={popoverRef.current}\n                wrapperClassName={overlayClassName}\n                onMouseLeave={hidePopper}\n                onMouseEnter={showPopper}\n              />\n            )}\n\n            {React.cloneElement(children, {\n              ref: popoverRef,\n              onMouseEnter: showPopper,\n              onMouseLeave: hidePopper,\n            })}\n          </>\n        );\n      }}\n    </PopoverController>\n  );\n}\n","// Copyright (c) 2019 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport cx from 'classnames';\nimport copy from 'copy-to-clipboard';\nimport * as React from 'react';\n\nimport { Button, IconName, stylesFactory, Tooltip } from '@grafana/ui';\n\nconst getStyles = stylesFactory(() => {\n  return {\n    CopyIcon: css`\n      background-color: transparent;\n      border: none;\n      color: inherit;\n      height: 100%;\n      overflow: hidden;\n      padding: 0px;\n      &:focus {\n        background-color: rgba(255, 255, 255, 0.25);\n        color: inherit;\n      }\n    `,\n  };\n});\n\ntype PropsType = {\n  className?: string;\n  copyText: string;\n  icon?: IconName;\n  tooltipTitle: string;\n};\n\ntype StateType = {\n  hasCopied: boolean;\n};\n\nexport default class CopyIcon extends React.PureComponent<PropsType, StateType> {\n  static defaultProps: Partial<PropsType> = {\n    className: undefined,\n    icon: 'copy',\n  };\n\n  state = {\n    hasCopied: false,\n  };\n\n  handleClick = () => {\n    this.setState({\n      hasCopied: true,\n    });\n    copy(this.props.copyText);\n  };\n\n  handleTooltipVisibilityChange = (visible: boolean) => {\n    if (!visible && this.state.hasCopied) {\n      this.setState({\n        hasCopied: false,\n      });\n    }\n  };\n\n  render() {\n    const styles = getStyles();\n    return (\n      <Tooltip content={this.state.hasCopied ? 'Copied' : this.props.tooltipTitle}>\n        <Button\n          className={cx(styles.CopyIcon, this.props.className)}\n          type=\"button\"\n          icon={this.props.icon}\n          onClick={this.handleClick}\n        />\n      </Tooltip>\n    );\n  }\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport cx from 'classnames';\nimport * as React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { Icon, useStyles2 } from '@grafana/ui';\n\nimport { autoColor } from '../../Theme';\nimport CopyIcon from '../../common/CopyIcon';\nimport { TNil } from '../../types';\nimport { TraceKeyValuePair, TraceLink } from '../../types/trace';\nimport { ubInlineBlock, uWidth100 } from '../../uberUtilityStyles';\n\nimport jsonMarkup from './jsonMarkup';\n\nconst copyIconClassName = 'copyIcon';\n\nexport const getStyles = (theme: GrafanaTheme2) => {\n  return {\n    KeyValueTable: css`\n      label: KeyValueTable;\n      background: ${autoColor(theme, '#fff')};\n      border: 1px solid ${autoColor(theme, '#ddd')};\n      margin-bottom: 0.5rem;\n      max-height: 450px;\n      overflow: auto;\n    `,\n    body: css`\n      label: body;\n      vertical-align: baseline;\n    `,\n    row: css`\n      label: row;\n      & > td {\n        padding: 0rem 0.5rem;\n      }\n      &:nth-child(2n) > td {\n        background: ${autoColor(theme, '#f5f5f5')};\n      }\n      &:not(:hover) .${copyIconClassName} {\n        visibility: hidden;\n      }\n    `,\n    keyColumn: css`\n      label: keyColumn;\n      color: ${autoColor(theme, '#888')};\n      white-space: pre;\n      width: 125px;\n    `,\n    copyColumn: css`\n      label: copyColumn;\n      text-align: right;\n    `,\n    linkIcon: css`\n      label: linkIcon;\n      vertical-align: middle;\n      font-weight: bold;\n    `,\n  };\n};\n\nconst jsonObjectOrArrayStartRegex = /^(\\[|\\{)/;\n\nfunction parseIfComplexJson(value: any) {\n  // if the value is a string representing actual json object or array, then use json-markup\n  if (typeof value === 'string' && jsonObjectOrArrayStartRegex.test(value)) {\n    // otherwise just return as is\n    try {\n      return JSON.parse(value);\n      // eslint-disable-next-line no-empty\n    } catch (_) {}\n  }\n  return value;\n}\n\nexport const LinkValue = (props: { href: string; title?: string; children: React.ReactNode }) => {\n  return (\n    <a href={props.href} title={props.title} target=\"_blank\" rel=\"noopener noreferrer\">\n      {props.children} <Icon name=\"external-link-alt\" />\n    </a>\n  );\n};\n\nLinkValue.defaultProps = {\n  title: '',\n};\n\ntype KeyValuesTableProps = {\n  data: TraceKeyValuePair[];\n  linksGetter: ((pairs: TraceKeyValuePair[], index: number) => TraceLink[]) | TNil;\n};\n\nexport default function KeyValuesTable(props: KeyValuesTableProps) {\n  const { data, linksGetter } = props;\n  const styles = useStyles2(getStyles);\n  return (\n    <div className={cx(styles.KeyValueTable)} data-test-id=\"KeyValueTable\">\n      <table className={uWidth100}>\n        <tbody className={styles.body}>\n          {data.map((row, i) => {\n            const markup = {\n              __html: jsonMarkup(parseIfComplexJson(row.value)),\n            };\n            const jsonTable = <div className={ubInlineBlock} dangerouslySetInnerHTML={markup} />;\n            const links = linksGetter ? linksGetter(data, i) : null;\n            let valueMarkup;\n            if (links && links.length) {\n              // TODO: handle multiple items\n              valueMarkup = (\n                <div>\n                  <LinkValue href={links[0].url} title={links[0].text}>\n                    {jsonTable}\n                  </LinkValue>\n                </div>\n              );\n            } else {\n              valueMarkup = jsonTable;\n            }\n            return (\n              // `i` is necessary in the key because row.key can repeat\n              <tr className={styles.row} key={`${row.key}-${i}`}>\n                <td className={styles.keyColumn} data-test-id=\"KeyValueTable--keyColumn\">\n                  {row.key}\n                </td>\n                <td>{valueMarkup}</td>\n                <td className={styles.copyColumn}>\n                  <CopyIcon\n                    className={copyIconClassName}\n                    copyText={JSON.stringify(row, null, 2)}\n                    tooltipTitle=\"Copy JSON\"\n                  />\n                </td>\n              </tr>\n            );\n          })}\n        </tbody>\n      </table>\n    </div>\n  );\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport cx from 'classnames';\nimport * as React from 'react';\nimport IoIosArrowDown from 'react-icons/lib/io/ios-arrow-down';\nimport IoIosArrowRight from 'react-icons/lib/io/ios-arrow-right';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useStyles2 } from '@grafana/ui';\n\nimport { autoColor } from '../../Theme';\nimport { TNil } from '../../types';\nimport { TraceKeyValuePair, TraceLink } from '../../types/trace';\nimport { uAlignIcon, uTxEllipsis } from '../../uberUtilityStyles';\n\nimport * as markers from './AccordianKeyValues.markers';\nimport KeyValuesTable from './KeyValuesTable';\n\nexport const getStyles = (theme: GrafanaTheme2) => {\n  return {\n    header: css`\n      label: header;\n      cursor: pointer;\n      overflow: hidden;\n      padding: 0.25em 0.1em;\n      text-overflow: ellipsis;\n      white-space: nowrap;\n      &:hover {\n        background: ${autoColor(theme, '#e8e8e8')};\n      }\n    `,\n    headerEmpty: css`\n      label: headerEmpty;\n      background: none;\n      cursor: initial;\n    `,\n    headerHighContrast: css`\n      label: headerHighContrast;\n      &:hover {\n        background: ${autoColor(theme, '#ddd')};\n      }\n    `,\n    emptyIcon: css`\n      label: emptyIcon;\n      color: ${autoColor(theme, '#aaa')};\n    `,\n    summary: css`\n      label: summary;\n      display: inline;\n      list-style: none;\n      padding: 0;\n    `,\n    summaryItem: css`\n      label: summaryItem;\n      display: inline;\n      margin-left: 0.7em;\n      padding-right: 0.5rem;\n      border-right: 1px solid ${autoColor(theme, '#ddd')};\n      &:last-child {\n        padding-right: 0;\n        border-right: none;\n      }\n    `,\n    summaryLabel: css`\n      label: summaryLabel;\n      color: ${autoColor(theme, '#777')};\n    `,\n    summaryDelim: css`\n      label: summaryDelim;\n      color: ${autoColor(theme, '#bbb')};\n      padding: 0 0.2em;\n    `,\n  };\n};\n\ntype AccordianKeyValuesProps = {\n  className?: string | TNil;\n  data: TraceKeyValuePair[];\n  highContrast?: boolean;\n  interactive?: boolean;\n  isOpen: boolean;\n  label: string;\n  linksGetter: ((pairs: TraceKeyValuePair[], index: number) => TraceLink[]) | TNil;\n  onToggle?: null | (() => void);\n};\n\n// export for tests\nexport function KeyValuesSummary(props: { data?: TraceKeyValuePair[] }) {\n  const { data } = props;\n  const styles = useStyles2(getStyles);\n\n  if (!Array.isArray(data) || !data.length) {\n    return null;\n  }\n\n  return (\n    <ul className={styles.summary}>\n      {data.map((item, i) => (\n        // `i` is necessary in the key because item.key can repeat\n        <li className={styles.summaryItem} key={`${item.key}-${i}`}>\n          <span className={styles.summaryLabel}>{item.key}</span>\n          <span className={styles.summaryDelim}>=</span>\n          {String(item.value)}\n        </li>\n      ))}\n    </ul>\n  );\n}\n\nKeyValuesSummary.defaultProps = {\n  data: null,\n};\n\nexport default function AccordianKeyValues(props: AccordianKeyValuesProps) {\n  const { className, data, highContrast, interactive, isOpen, label, linksGetter, onToggle } = props;\n  const isEmpty = !Array.isArray(data) || !data.length;\n  const styles = useStyles2(getStyles);\n  const iconCls = cx(uAlignIcon, { [styles.emptyIcon]: isEmpty });\n  let arrow: React.ReactNode | null = null;\n  let headerProps: {} | null = null;\n  if (interactive) {\n    arrow = isOpen ? <IoIosArrowDown className={iconCls} /> : <IoIosArrowRight className={iconCls} />;\n    headerProps = {\n      'aria-checked': isOpen,\n      onClick: isEmpty ? null : onToggle,\n      role: 'switch',\n    };\n  }\n\n  return (\n    <div className={cx(className, uTxEllipsis)}>\n      <div\n        className={cx(styles.header, {\n          [styles.headerEmpty]: isEmpty,\n          [styles.headerHighContrast]: highContrast && !isEmpty,\n        })}\n        {...headerProps}\n        data-test-id=\"AccordianKeyValues--header\"\n      >\n        {arrow}\n        <strong data-test={markers.LABEL}>\n          {label}\n          {isOpen || ':'}\n        </strong>\n        {!isOpen && <KeyValuesSummary data={data} />}\n      </div>\n      {isOpen && <KeyValuesTable data={data} linksGetter={linksGetter} />}\n    </div>\n  );\n}\n\nAccordianKeyValues.defaultProps = {\n  className: null,\n  highContrast: false,\n  interactive: true,\n  onToggle: null,\n};\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nexport const LABEL = 'label';\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport { sortBy as _sortBy } from 'lodash';\nimport * as React from 'react';\nimport IoIosArrowDown from 'react-icons/lib/io/ios-arrow-down';\nimport IoIosArrowRight from 'react-icons/lib/io/ios-arrow-right';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useStyles2 } from '@grafana/ui';\n\nimport { autoColor } from '../../Theme';\nimport { TNil } from '../../types';\nimport { TraceLog, TraceKeyValuePair, TraceLink } from '../../types/trace';\nimport { uAlignIcon, ubMb1 } from '../../uberUtilityStyles';\nimport { formatDuration } from '../utils';\n\nimport AccordianKeyValues from './AccordianKeyValues';\n\nconst getStyles = (theme: GrafanaTheme2) => {\n  return {\n    AccordianLogs: css`\n      label: AccordianLogs;\n      border: 1px solid ${autoColor(theme, '#d8d8d8')};\n      position: relative;\n      margin-bottom: 0.25rem;\n    `,\n    AccordianLogsHeader: css`\n      label: AccordianLogsHeader;\n      background: ${autoColor(theme, '#e4e4e4')};\n      color: inherit;\n      display: block;\n      padding: 0.25rem 0.5rem;\n      &:hover {\n        background: ${autoColor(theme, '#dadada')};\n      }\n    `,\n    AccordianLogsContent: css`\n      label: AccordianLogsContent;\n      background: ${autoColor(theme, '#f0f0f0')};\n      border-top: 1px solid ${autoColor(theme, '#d8d8d8')};\n      padding: 0.5rem 0.5rem 0.25rem 0.5rem;\n    `,\n    AccordianLogsFooter: css`\n      label: AccordianLogsFooter;\n      color: ${autoColor(theme, '#999')};\n    `,\n  };\n};\n\ntype AccordianLogsProps = {\n  interactive?: boolean;\n  isOpen: boolean;\n  linksGetter: ((pairs: TraceKeyValuePair[], index: number) => TraceLink[]) | TNil;\n  logs: TraceLog[];\n  onItemToggle?: (log: TraceLog) => void;\n  onToggle?: () => void;\n  openedItems?: Set<TraceLog>;\n  timestamp: number;\n};\n\nexport default function AccordianLogs(props: AccordianLogsProps) {\n  const { interactive, isOpen, linksGetter, logs, openedItems, onItemToggle, onToggle, timestamp } = props;\n  let arrow: React.ReactNode | null = null;\n  let HeaderComponent: 'span' | 'a' = 'span';\n  let headerProps: {} | null = null;\n  if (interactive) {\n    arrow = isOpen ? <IoIosArrowDown className={uAlignIcon} /> : <IoIosArrowRight className=\"u-align-icon\" />;\n    HeaderComponent = 'a';\n    headerProps = {\n      'aria-checked': isOpen,\n      onClick: onToggle,\n      role: 'switch',\n    };\n  }\n\n  const styles = useStyles2(getStyles);\n  return (\n    <div className={styles.AccordianLogs}>\n      <HeaderComponent className={styles.AccordianLogsHeader} {...headerProps}>\n        {arrow} <strong>Logs</strong> ({logs.length})\n      </HeaderComponent>\n      {isOpen && (\n        <div className={styles.AccordianLogsContent}>\n          {_sortBy(logs, 'timestamp').map((log, i) => (\n            <AccordianKeyValues\n              // `i` is necessary in the key because timestamps can repeat\n              key={`${log.timestamp}-${i}`}\n              className={i < logs.length - 1 ? ubMb1 : null}\n              data={log.fields || []}\n              highContrast\n              interactive={interactive}\n              isOpen={openedItems ? openedItems.has(log) : false}\n              label={`${formatDuration(log.timestamp - timestamp)}`}\n              linksGetter={linksGetter}\n              onToggle={interactive && onItemToggle ? () => onItemToggle(log) : null}\n            />\n          ))}\n          <small className={styles.AccordianLogsFooter}>\n            Log timestamps are relative to the start time of the full trace.\n          </small>\n        </div>\n      )}\n    </div>\n  );\n}\n\nAccordianLogs.defaultProps = {\n  interactive: true,\n  linksGetter: undefined,\n  onItemToggle: undefined,\n  onToggle: undefined,\n  openedItems: undefined,\n};\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport cx from 'classnames';\nimport { groupBy as _groupBy } from 'lodash';\nimport React, { useState } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useStyles2 } from '@grafana/ui';\n\nimport { autoColor } from '../Theme';\nimport { Popover } from '../common/Popover';\nimport { TNil } from '../types';\nimport { TraceSpan } from '../types/trace';\n\nimport AccordianLogs from './SpanDetail/AccordianLogs';\nimport { ViewedBoundsFunctionType } from './utils';\n\nconst getStyles = (theme: GrafanaTheme2) => {\n  return {\n    wrapper: css`\n      label: wrapper;\n      bottom: 0;\n      left: 0;\n      position: absolute;\n      right: 0;\n      top: 0;\n      overflow: hidden;\n      z-index: 0;\n    `,\n    bar: css`\n      label: bar;\n      border-radius: 3px;\n      min-width: 2px;\n      position: absolute;\n      height: 36%;\n      top: 32%;\n    `,\n    rpc: css`\n      label: rpc;\n      position: absolute;\n      top: 35%;\n      bottom: 35%;\n      z-index: 1;\n    `,\n    label: css`\n      label: label;\n      color: #aaa;\n      font-size: 12px;\n      font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;\n      line-height: 1em;\n      white-space: nowrap;\n      padding: 0 0.5em;\n      position: absolute;\n    `,\n    logMarker: css`\n      label: logMarker;\n      background-color: ${autoColor(theme, '#2c3235')};\n      cursor: pointer;\n      height: 60%;\n      min-width: 1px;\n      position: absolute;\n      top: 20%;\n      &:hover {\n        background-color: ${autoColor(theme, '#464c54')};\n      }\n      &::before,\n      &::after {\n        content: '';\n        position: absolute;\n        top: 0;\n        bottom: 0;\n        right: 0;\n        border: 1px solid transparent;\n      }\n      &::after {\n        left: 0;\n      }\n    `,\n  };\n};\n\ntype Props = {\n  color: string;\n  onClick?: (evt: React.MouseEvent<any>) => void;\n  viewEnd: number;\n  viewStart: number;\n  getViewedBounds: ViewedBoundsFunctionType;\n  rpc:\n    | {\n        viewStart: number;\n        viewEnd: number;\n        color: string;\n      }\n    | TNil;\n  traceStartTime: number;\n  span: TraceSpan;\n  className?: string;\n  labelClassName?: string;\n  longLabel: string;\n  shortLabel: string;\n};\n\nfunction toPercent(value: number) {\n  return `${(value * 100).toFixed(1)}%`;\n}\n\nfunction SpanBar({\n  viewEnd,\n  viewStart,\n  getViewedBounds,\n  color,\n  shortLabel,\n  longLabel,\n  onClick,\n  rpc,\n  traceStartTime,\n  span,\n  className,\n  labelClassName,\n}: Props) {\n  const [label, setLabel] = useState(shortLabel);\n  const setShortLabel = () => setLabel(shortLabel);\n  const setLongLabel = () => setLabel(longLabel);\n\n  // group logs based on timestamps\n  const logGroups = _groupBy(span.logs, (log) => {\n    const posPercent = getViewedBounds(log.timestamp, log.timestamp).start;\n    // round to the nearest 0.2%\n    return toPercent(Math.round(posPercent * 500) / 500);\n  });\n  const styles = useStyles2(getStyles);\n\n  return (\n    <div\n      className={cx(styles.wrapper, className)}\n      onClick={onClick}\n      onMouseLeave={setShortLabel}\n      onMouseOver={setLongLabel}\n      aria-hidden\n      data-test-id=\"SpanBar--wrapper\"\n    >\n      <div\n        aria-label={label}\n        className={styles.bar}\n        style={{\n          background: color,\n          left: toPercent(viewStart),\n          width: toPercent(viewEnd - viewStart),\n        }}\n      >\n        <div className={cx(styles.label, labelClassName)} data-test-id=\"SpanBar--label\">\n          {label}\n        </div>\n      </div>\n      <div>\n        {Object.keys(logGroups).map((positionKey) => (\n          <Popover\n            key={positionKey}\n            content={\n              <AccordianLogs interactive={false} isOpen logs={logGroups[positionKey]} timestamp={traceStartTime} />\n            }\n          >\n            <div className={styles.logMarker} style={{ left: positionKey }} />\n          </Popover>\n        ))}\n      </div>\n      {rpc && (\n        <div\n          className={styles.rpc}\n          style={{\n            background: rpc.color,\n            left: toPercent(rpc.viewStart),\n            width: toPercent(rpc.viewEnd - rpc.viewStart),\n          }}\n        />\n      )}\n    </div>\n  );\n}\n\nexport default React.memo(SpanBar);\n","// Copyright (c) 2019 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { find as _find, get as _get } from 'lodash';\n\nimport { TNil } from '../types';\nimport { TraceSpan } from '../types/trace';\n\nfunction getFirstAncestor(span: TraceSpan): TraceSpan | TNil {\n  return _get(\n    _find(\n      span.references,\n      ({ span: ref, refType }) => ref && ref.spanID && (refType === 'CHILD_OF' || refType === 'FOLLOWS_FROM')\n    ),\n    'span'\n  );\n}\n\nexport default function spanAncestorIds(span: TraceSpan | TNil): string[] {\n  const ancestorIDs: string[] = [];\n  if (!span) {\n    return ancestorIDs;\n  }\n  let ref = getFirstAncestor(span);\n  while (ref) {\n    ancestorIDs.push(ref.spanID);\n    ref = getFirstAncestor(ref);\n  }\n  return ancestorIDs;\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport cx from 'classnames';\nimport { get as _get } from 'lodash';\nimport React from 'react';\nimport IoChevronRight from 'react-icons/lib/io/chevron-right';\nimport IoIosArrowDown from 'react-icons/lib/io/ios-arrow-down';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { stylesFactory, withTheme2 } from '@grafana/ui';\n\nimport { autoColor } from '../Theme';\nimport { TraceSpan } from '../types/trace';\nimport spanAncestorIds from '../utils/span-ancestor-ids';\n\nexport const getStyles = stylesFactory((theme: GrafanaTheme2) => {\n  return {\n    SpanTreeOffset: css`\n      label: SpanTreeOffset;\n      color: ${autoColor(theme, '#000')};\n      position: relative;\n    `,\n    SpanTreeOffsetParent: css`\n      label: SpanTreeOffsetParent;\n      &:hover {\n        cursor: pointer;\n      }\n    `,\n    indentGuide: css`\n      label: indentGuide;\n      /* The size of the indentGuide is based off of the iconWrapper */\n      padding-right: calc(0.5rem + 12px);\n      height: 100%;\n      border-left: 3px solid transparent;\n      display: inline-flex;\n      &::before {\n        content: '';\n        padding-left: 1px;\n        background-color: ${autoColor(theme, 'lightgrey')};\n      }\n    `,\n    indentGuideActive: css`\n      label: indentGuideActive;\n      border-color: ${autoColor(theme, 'darkgrey')};\n      &::before {\n        background-color: transparent;\n      }\n    `,\n    iconWrapper: css`\n      label: iconWrapper;\n      position: absolute;\n      right: 0.25rem;\n    `,\n  };\n});\n\ntype TProps = {\n  childrenVisible?: boolean;\n  onClick?: () => void;\n  span: TraceSpan;\n  showChildrenIcon?: boolean;\n\n  hoverIndentGuideIds: Set<string>;\n  addHoverIndentGuideId: (spanID: string) => void;\n  removeHoverIndentGuideId: (spanID: string) => void;\n  theme: GrafanaTheme2;\n};\n\nexport class UnthemedSpanTreeOffset extends React.PureComponent<TProps> {\n  static displayName = 'UnthemedSpanTreeOffset';\n\n  ancestorIds: string[];\n\n  static defaultProps = {\n    childrenVisible: false,\n    showChildrenIcon: true,\n  };\n\n  constructor(props: TProps) {\n    super(props);\n\n    this.ancestorIds = spanAncestorIds(props.span);\n    // Some traces have multiple root-level spans, this connects them all under one guideline and adds the\n    // necessary padding for the collapse icon on root-level spans.\n    this.ancestorIds.push('root');\n\n    this.ancestorIds.reverse();\n  }\n\n  /**\n   * If the mouse leaves to anywhere except another span with the same ancestor id, this span's ancestor id is\n   * removed from the set of hoverIndentGuideIds.\n   *\n   * @param {Object} event - React Synthetic event tied to mouseleave. Includes the related target which is\n   *     the element the user is now hovering.\n   * @param {string} ancestorId - The span id that the user was hovering over.\n   */\n  handleMouseLeave = (event: React.MouseEvent<HTMLSpanElement>, ancestorId: string) => {\n    if (\n      !(event.relatedTarget instanceof HTMLSpanElement) ||\n      _get(event, 'relatedTarget.dataset.ancestorId') !== ancestorId\n    ) {\n      this.props.removeHoverIndentGuideId(ancestorId);\n    }\n  };\n\n  /**\n   * If the mouse entered this span from anywhere except another span with the same ancestor id, this span's\n   * ancestorId is added to the set of hoverIndentGuideIds.\n   *\n   * @param {Object} event - React Synthetic event tied to mouseenter. Includes the related target which is\n   *     the last element the user was hovering.\n   * @param {string} ancestorId - The span id that the user is now hovering over.\n   */\n  handleMouseEnter = (event: React.MouseEvent<HTMLSpanElement>, ancestorId: string) => {\n    if (\n      !(event.relatedTarget instanceof HTMLSpanElement) ||\n      _get(event, 'relatedTarget.dataset.ancestorId') !== ancestorId\n    ) {\n      this.props.addHoverIndentGuideId(ancestorId);\n    }\n  };\n\n  render() {\n    const { childrenVisible, onClick, showChildrenIcon, span, theme } = this.props;\n    const { hasChildren, spanID } = span;\n    const wrapperProps = hasChildren ? { onClick, role: 'switch', 'aria-checked': childrenVisible } : null;\n    const icon = showChildrenIcon && hasChildren && (childrenVisible ? <IoIosArrowDown /> : <IoChevronRight />);\n    const styles = getStyles(theme);\n    return (\n      <span className={cx(styles.SpanTreeOffset, { [styles.SpanTreeOffsetParent]: hasChildren })} {...wrapperProps}>\n        {this.ancestorIds.map((ancestorId) => (\n          <span\n            key={ancestorId}\n            className={cx(styles.indentGuide, {\n              [styles.indentGuideActive]: this.props.hoverIndentGuideIds.has(ancestorId),\n            })}\n            data-ancestor-id={ancestorId}\n            data-test-id=\"SpanTreeOffset--indentGuide\"\n            onMouseEnter={(event) => this.handleMouseEnter(event, ancestorId)}\n            onMouseLeave={(event) => this.handleMouseLeave(event, ancestorId)}\n          />\n        ))}\n        {icon && (\n          <span\n            className={styles.iconWrapper}\n            onMouseEnter={(event) => this.handleMouseEnter(event, spanID)}\n            onMouseLeave={(event) => this.handleMouseLeave(event, spanID)}\n            data-test-id=\"icon-wrapper\"\n          >\n            {icon}\n          </span>\n        )}\n      </span>\n    );\n  }\n}\n\nexport default withTheme2(UnthemedSpanTreeOffset);\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css, keyframes } from '@emotion/css';\nimport cx from 'classnames';\nimport * as React from 'react';\nimport IoAlert from 'react-icons/lib/io/alert';\nimport IoArrowRightA from 'react-icons/lib/io/arrow-right-a';\nimport MdFileUpload from 'react-icons/lib/md/file-upload';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { Icon, stylesFactory, withTheme2 } from '@grafana/ui';\n\nimport { autoColor } from '../Theme';\nimport { SpanLinkFunc, TNil } from '../types';\nimport { TraceSpan } from '../types/trace';\n\nimport ReferencesButton from './ReferencesButton';\nimport SpanBar from './SpanBar';\nimport SpanTreeOffset from './SpanTreeOffset';\nimport Ticks from './Ticks';\nimport TimelineRow from './TimelineRow';\nimport { formatDuration, ViewedBoundsFunctionType } from './utils';\n\nconst spanBarClassName = 'spanBar';\nconst spanBarLabelClassName = 'spanBarLabel';\nconst nameWrapperClassName = 'nameWrapper';\nconst nameWrapperMatchingFilterClassName = 'nameWrapperMatchingFilter';\nconst viewClassName = 'jaegerView';\nconst nameColumnClassName = 'nameColumn';\n\nconst getStyles = stylesFactory((theme: GrafanaTheme2) => {\n  const animations = {\n    flash: keyframes`\n    label: flash;\n    from {\n      background-color: ${autoColor(theme, '#68b9ff')};\n    }\n    to {\n      background-color: default;\n    }\n  `,\n  };\n\n  return {\n    nameWrapper: css`\n      label: nameWrapper;\n      line-height: 27px;\n      overflow: hidden;\n      display: flex;\n    `,\n    nameWrapperMatchingFilter: css`\n      label: nameWrapperMatchingFilter;\n      background-color: ${autoColor(theme, '#fffce4')};\n    `,\n    nameColumn: css`\n      label: nameColumn;\n      position: relative;\n      white-space: nowrap;\n      z-index: 1;\n      &:hover {\n        z-index: 1;\n      }\n    `,\n    endpointName: css`\n      label: endpointName;\n      color: ${autoColor(theme, '#808080')};\n    `,\n    view: css`\n      label: view;\n      position: relative;\n    `,\n    viewExpanded: css`\n      label: viewExpanded;\n      background: ${autoColor(theme, '#f8f8f8')};\n      outline: 1px solid ${autoColor(theme, '#ddd')};\n    `,\n    viewExpandedAndMatchingFilter: css`\n      label: viewExpandedAndMatchingFilter;\n      background: ${autoColor(theme, '#fff3d7')};\n      outline: 1px solid ${autoColor(theme, '#ddd')};\n    `,\n    row: css`\n      label: row;\n      &:hover .${spanBarClassName} {\n        opacity: 1;\n      }\n      &:hover .${spanBarLabelClassName} {\n        color: ${autoColor(theme, '#000')};\n      }\n      &:hover .${nameWrapperClassName} {\n        background: #f8f8f8;\n        background: linear-gradient(\n          90deg,\n          ${autoColor(theme, '#fafafa')},\n          ${autoColor(theme, '#f8f8f8')} 75%,\n          ${autoColor(theme, '#eee')}\n        );\n      }\n      &:hover .${viewClassName} {\n        background-color: ${autoColor(theme, '#f5f5f5')};\n        outline: 1px solid ${autoColor(theme, '#ddd')};\n      }\n    `,\n    rowClippingLeft: css`\n      label: rowClippingLeft;\n      & .${nameColumnClassName}::before {\n        content: ' ';\n        height: 100%;\n        position: absolute;\n        width: 6px;\n        background-image: linear-gradient(\n          to right,\n          ${autoColor(theme, 'rgba(25, 25, 25, 0.25)')},\n          ${autoColor(theme, 'rgba(32, 32, 32, 0)')}\n        );\n        left: 100%;\n        z-index: -1;\n      }\n    `,\n    rowClippingRight: css`\n      label: rowClippingRight;\n      & .${viewClassName}::before {\n        content: ' ';\n        height: 100%;\n        position: absolute;\n        width: 6px;\n        background-image: linear-gradient(\n          to left,\n          ${autoColor(theme, 'rgba(25, 25, 25, 0.25)')},\n          ${autoColor(theme, 'rgba(25, 25, 25, 0.25)')}\n        );\n        right: 0%;\n        z-index: 1;\n      }\n    `,\n    rowExpanded: css`\n      label: rowExpanded;\n      & .${spanBarClassName} {\n        opacity: 1;\n      }\n      & .${spanBarLabelClassName} {\n        color: ${autoColor(theme, '#000')};\n      }\n      & .${nameWrapperClassName}, &:hover .${nameWrapperClassName} {\n        background: ${autoColor(theme, '#f0f0f0')};\n        box-shadow: 0 1px 0 ${autoColor(theme, '#ddd')};\n      }\n      & .${nameWrapperMatchingFilterClassName} {\n        background: ${autoColor(theme, '#fff3d7')};\n      }\n      &:hover .${viewClassName} {\n        background: ${autoColor(theme, '#eee')};\n      }\n    `,\n    rowMatchingFilter: css`\n      label: rowMatchingFilter;\n      background-color: ${autoColor(theme, '#fffbde')};\n      &:hover .${nameWrapperClassName} {\n        background: linear-gradient(\n          90deg,\n          ${autoColor(theme, '#fffbde')},\n          ${autoColor(theme, '#fffbde')} 75%,\n          ${autoColor(theme, '#f7f1c6')}\n        );\n      }\n      &:hover .${viewClassName} {\n        background-color: ${autoColor(theme, '#f7f1c6')};\n        outline: 1px solid ${autoColor(theme, '#ddd')};\n      }\n    `,\n    rowFocused: css`\n      label: rowFocused;\n      background-color: ${autoColor(theme, '#cbe7ff')};\n      animation: ${animations.flash} 1s cubic-bezier(0.12, 0, 0.39, 0);\n      & .${nameWrapperClassName}, .${viewClassName}, .${nameWrapperMatchingFilterClassName} {\n        background-color: ${autoColor(theme, '#cbe7ff')};\n        animation: ${animations.flash} 1s cubic-bezier(0.12, 0, 0.39, 0);\n      }\n      & .${spanBarClassName} {\n        opacity: 1;\n      }\n      & .${spanBarLabelClassName} {\n        color: ${autoColor(theme, '#000')};\n      }\n      &:hover .${nameWrapperClassName}, :hover .${viewClassName} {\n        background: ${autoColor(theme, '#d5ebff')};\n        box-shadow: 0 1px 0 ${autoColor(theme, '#ddd')};\n      }\n    `,\n\n    rowExpandedAndMatchingFilter: css`\n      label: rowExpandedAndMatchingFilter;\n      &:hover .${viewClassName} {\n        background: ${autoColor(theme, '#ffeccf')};\n      }\n    `,\n\n    name: css`\n      label: name;\n      color: ${autoColor(theme, '#000')};\n      cursor: pointer;\n      flex: 1 1 auto;\n      outline: none;\n      overflow: hidden;\n      padding-left: 4px;\n      padding-right: 0.25em;\n      position: relative;\n      text-overflow: ellipsis;\n      &::before {\n        content: ' ';\n        position: absolute;\n        top: 4px;\n        bottom: 4px;\n        left: 0;\n        border-left: 4px solid;\n        border-left-color: inherit;\n      }\n\n      /* This is so the hit area of the span-name extends the rest of the width of the span-name column */\n      &::after {\n        background: transparent;\n        bottom: 0;\n        content: ' ';\n        left: 0;\n        position: absolute;\n        top: 0;\n        width: 1000px;\n      }\n      &:focus {\n        text-decoration: none;\n      }\n      &:hover > small {\n        color: ${autoColor(theme, '#000')};\n      }\n    `,\n    nameDetailExpanded: css`\n      label: nameDetailExpanded;\n      &::before {\n        bottom: 0;\n      }\n    `,\n    svcName: css`\n      label: svcName;\n      padding: 0 0.25rem 0 0.5rem;\n      font-size: 1.05em;\n    `,\n    svcNameChildrenCollapsed: css`\n      label: svcNameChildrenCollapsed;\n      font-weight: bold;\n      font-style: italic;\n    `,\n    errorIcon: css`\n      label: errorIcon;\n      border-radius: 6.5px;\n      color: ${autoColor(theme, '#fff')};\n      font-size: 0.85em;\n      margin-right: 0.25rem;\n      padding: 1px;\n    `,\n    rpcColorMarker: css`\n      label: rpcColorMarker;\n      border-radius: 6.5px;\n      display: inline-block;\n      font-size: 0.85em;\n      height: 1em;\n      margin-right: 0.25rem;\n      padding: 1px;\n      width: 1em;\n      vertical-align: middle;\n    `,\n    labelRight: css`\n      label: labelRight;\n      left: 100%;\n    `,\n    labelLeft: css`\n      label: labelLeft;\n      right: 100%;\n    `,\n  };\n});\n\ntype SpanBarRowProps = {\n  className?: string;\n  theme: GrafanaTheme2;\n  color: string;\n  columnDivision: number;\n  isChildrenExpanded: boolean;\n  isDetailExpanded: boolean;\n  isMatchingFilter: boolean;\n  isFocused: boolean;\n  onDetailToggled: (spanID: string) => void;\n  onChildrenToggled: (spanID: string) => void;\n  numTicks: number;\n  rpc?:\n    | {\n        viewStart: number;\n        viewEnd: number;\n        color: string;\n        operationName: string;\n        serviceName: string;\n      }\n    | TNil;\n  noInstrumentedServer?:\n    | {\n        color: string;\n        serviceName: string;\n      }\n    | TNil;\n  showErrorIcon: boolean;\n  getViewedBounds: ViewedBoundsFunctionType;\n  traceStartTime: number;\n  span: TraceSpan;\n  focusSpan: (spanID: string) => void;\n  hoverIndentGuideIds: Set<string>;\n  addHoverIndentGuideId: (spanID: string) => void;\n  removeHoverIndentGuideId: (spanID: string) => void;\n  clippingLeft?: boolean;\n  clippingRight?: boolean;\n  createSpanLink?: SpanLinkFunc;\n};\n\n/**\n * This was originally a stateless function, but changing to a PureComponent\n * reduced the render time of expanding a span row detail by ~50%. This is\n * even true in the case where the stateless function has the same prop types as\n * this class and arrow functions are created in the stateless function as\n * handlers to the onClick props. E.g. for now, the PureComponent is more\n * performance than the stateless function.\n */\nexport class UnthemedSpanBarRow extends React.PureComponent<SpanBarRowProps> {\n  static displayName = 'UnthemedSpanBarRow';\n  static defaultProps: Partial<SpanBarRowProps> = {\n    className: '',\n    rpc: null,\n  };\n\n  _detailToggle = () => {\n    this.props.onDetailToggled(this.props.span.spanID);\n  };\n\n  _childrenToggle = () => {\n    this.props.onChildrenToggled(this.props.span.spanID);\n  };\n\n  render() {\n    const {\n      className,\n      color,\n      columnDivision,\n      isChildrenExpanded,\n      isDetailExpanded,\n      isMatchingFilter,\n      isFocused,\n      numTicks,\n      rpc,\n      noInstrumentedServer,\n      showErrorIcon,\n      getViewedBounds,\n      traceStartTime,\n      span,\n      focusSpan,\n      hoverIndentGuideIds,\n      addHoverIndentGuideId,\n      removeHoverIndentGuideId,\n      clippingLeft,\n      clippingRight,\n      theme,\n      createSpanLink,\n    } = this.props;\n    const {\n      duration,\n      hasChildren: isParent,\n      operationName,\n      process: { serviceName },\n    } = span;\n    const label = formatDuration(duration);\n    const viewBounds = getViewedBounds(span.startTime, span.startTime + span.duration);\n    const viewStart = viewBounds.start;\n    const viewEnd = viewBounds.end;\n    const styles = getStyles(theme);\n\n    const labelDetail = `${serviceName}::${operationName}`;\n    let longLabel;\n    let hintClassName;\n    if (viewStart > 1 - viewEnd) {\n      longLabel = `${labelDetail} | ${label}`;\n      hintClassName = styles.labelLeft;\n    } else {\n      longLabel = `${label} | ${labelDetail}`;\n      hintClassName = styles.labelRight;\n    }\n\n    return (\n      <TimelineRow\n        className={cx(\n          styles.row,\n          {\n            [styles.rowExpanded]: isDetailExpanded,\n            [styles.rowMatchingFilter]: isMatchingFilter,\n            [styles.rowExpandedAndMatchingFilter]: isMatchingFilter && isDetailExpanded,\n            [styles.rowFocused]: isFocused,\n            [styles.rowClippingLeft]: clippingLeft,\n            [styles.rowClippingRight]: clippingRight,\n          },\n          className\n        )}\n      >\n        <TimelineRow.Cell className={cx(styles.nameColumn, nameColumnClassName)} width={columnDivision}>\n          <div\n            className={cx(styles.nameWrapper, nameWrapperClassName, {\n              [styles.nameWrapperMatchingFilter]: isMatchingFilter,\n              nameWrapperMatchingFilter: isMatchingFilter,\n            })}\n          >\n            <SpanTreeOffset\n              childrenVisible={isChildrenExpanded}\n              span={span}\n              onClick={isParent ? this._childrenToggle : undefined}\n              hoverIndentGuideIds={hoverIndentGuideIds}\n              addHoverIndentGuideId={addHoverIndentGuideId}\n              removeHoverIndentGuideId={removeHoverIndentGuideId}\n            />\n            <a\n              className={cx(styles.name, { [styles.nameDetailExpanded]: isDetailExpanded })}\n              aria-checked={isDetailExpanded}\n              title={labelDetail}\n              onClick={this._detailToggle}\n              role=\"switch\"\n              style={{ borderColor: color }}\n              tabIndex={0}\n            >\n              <span\n                className={cx(styles.svcName, {\n                  [styles.svcNameChildrenCollapsed]: isParent && !isChildrenExpanded,\n                })}\n              >\n                {showErrorIcon && (\n                  <IoAlert\n                    style={{\n                      backgroundColor: span.errorIconColor\n                        ? autoColor(theme, span.errorIconColor)\n                        : autoColor(theme, '#db2828'),\n                    }}\n                    className={styles.errorIcon}\n                  />\n                )}\n                {serviceName}{' '}\n                {rpc && (\n                  <span>\n                    <IoArrowRightA /> <i className={styles.rpcColorMarker} style={{ background: rpc.color }} />\n                    {rpc.serviceName}\n                  </span>\n                )}\n                {noInstrumentedServer && (\n                  <span>\n                    <IoArrowRightA />{' '}\n                    <i className={styles.rpcColorMarker} style={{ background: noInstrumentedServer.color }} />\n                    {noInstrumentedServer.serviceName}\n                  </span>\n                )}\n              </span>\n              <small className={styles.endpointName}>{rpc ? rpc.operationName : operationName}</small>\n              <small className={styles.endpointName}> | {label}</small>\n            </a>\n            {createSpanLink &&\n              (() => {\n                const link = createSpanLink(span);\n                if (link) {\n                  return (\n                    <a\n                      href={link.href}\n                      // Needs to have target otherwise preventDefault would not work due to angularRouter.\n                      target={'_blank'}\n                      style={{ marginRight: '5px' }}\n                      rel=\"noopener noreferrer\"\n                      onClick={\n                        link.onClick\n                          ? (event) => {\n                              if (!(event.ctrlKey || event.metaKey || event.shiftKey) && link.onClick) {\n                                event.preventDefault();\n                                link.onClick(event);\n                              }\n                            }\n                          : undefined\n                      }\n                    >\n                      {link.content}\n                    </a>\n                  );\n                } else {\n                  return null;\n                }\n              })()}\n\n            {span.references && span.references.length > 1 && (\n              <ReferencesButton\n                references={span.references}\n                tooltipText=\"Contains multiple references\"\n                focusSpan={focusSpan}\n              >\n                <Icon name=\"link\" />\n              </ReferencesButton>\n            )}\n            {span.subsidiarilyReferencedBy && span.subsidiarilyReferencedBy.length > 0 && (\n              <ReferencesButton\n                references={span.subsidiarilyReferencedBy}\n                tooltipText={`This span is referenced by ${\n                  span.subsidiarilyReferencedBy.length === 1 ? 'another span' : 'multiple other spans'\n                }`}\n                focusSpan={focusSpan}\n              >\n                <MdFileUpload />\n              </ReferencesButton>\n            )}\n          </div>\n        </TimelineRow.Cell>\n        <TimelineRow.Cell\n          className={cx(styles.view, viewClassName, {\n            [styles.viewExpanded]: isDetailExpanded,\n            [styles.viewExpandedAndMatchingFilter]: isMatchingFilter && isDetailExpanded,\n          })}\n          data-test-id=\"span-view\"\n          style={{ cursor: 'pointer' }}\n          width={1 - columnDivision}\n          onClick={this._detailToggle}\n        >\n          <Ticks numTicks={numTicks} />\n          <SpanBar\n            rpc={rpc}\n            viewStart={viewStart}\n            viewEnd={viewEnd}\n            getViewedBounds={getViewedBounds}\n            color={color}\n            shortLabel={label}\n            longLabel={longLabel}\n            traceStartTime={traceStartTime}\n            span={span}\n            labelClassName={`${spanBarLabelClassName} ${hintClassName}`}\n            className={spanBarClassName}\n          />\n        </TimelineRow.Cell>\n      </TimelineRow>\n    );\n  }\n}\n\nexport default withTheme2(UnthemedSpanBarRow);\n","import { css, cx } from '@emotion/css';\nimport React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useStyles2 } from '@grafana/ui';\n\nimport { autoColor } from '../Theme';\n\nconst getStyles = (theme: GrafanaTheme2) => {\n  return {\n    Divider: css`\n      background: ${autoColor(theme, '#ddd')};\n    `,\n\n    DividerVertical: css`\n      label: DividerVertical;\n      display: inline-block;\n      width: 1px;\n      height: 0.9em;\n      margin: 0 8px;\n      vertical-align: middle;\n    `,\n\n    DividerHorizontal: css`\n      label: DividerHorizontal;\n      display: block;\n      height: 1px;\n      width: 100%;\n      margin: 24px 0;\n      clear: both;\n      vertical-align: middle;\n      position: relative;\n      top: -0.06em;\n    `,\n  };\n};\n\ninterface Props {\n  className?: string;\n  style?: React.CSSProperties;\n  type?: 'vertical' | 'horizontal';\n}\nexport function Divider({ className, style, type }: Props) {\n  const styles = useStyles2(getStyles);\n  return (\n    <div\n      style={style}\n      className={cx(\n        styles.Divider,\n        type === 'horizontal' ? styles.DividerHorizontal : styles.DividerVertical,\n        className\n      )}\n    />\n  );\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport cx from 'classnames';\nimport * as React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useStyles2 } from '@grafana/ui';\n\nimport { autoColor } from '../Theme';\n\nconst getStyles = (divider: boolean) => (theme: GrafanaTheme2) => {\n  return {\n    LabeledList: css`\n      label: LabeledList;\n      list-style: none;\n      margin: 0;\n      padding: 0;\n      ${divider === true &&\n      `\n        margin-right: -8px;\n        display: flex;\n        flex-wrap: wrap;\n        justify-content: flex-end;\n      `}\n    `,\n    LabeledListItem: css`\n      label: LabeledListItem;\n      display: inline-block;\n      ${divider === true &&\n      `\n        border-right: 1px solid ${autoColor(theme, '#ddd')};\n        padding: 0 8px;\n      `}\n    `,\n    LabeledListLabel: css`\n      label: LabeledListLabel;\n      color: ${theme.isLight ? '#999' : '#666'};\n      margin-right: 0.25rem;\n    `,\n    LabeledListValue: css`\n      label: LabeledListValue;\n      margin-right: 0.55rem;\n    `,\n  };\n};\n\ntype LabeledListProps = {\n  className?: string;\n  divider?: boolean;\n  items: Array<{ key: string; label: React.ReactNode; value: React.ReactNode }>;\n};\n\nexport default function LabeledList(props: LabeledListProps) {\n  const { className, divider = false, items } = props;\n  const styles = useStyles2(getStyles(divider));\n\n  return (\n    <ul className={cx(styles.LabeledList, className)}>\n      {items.map(({ key, label, value }) => {\n        return (\n          <li className={styles.LabeledListItem} key={`${key}`}>\n            <span className={styles.LabeledListLabel}>{label}</span>\n            <strong className={styles.LabeledListValue}>{value}</strong>\n          </li>\n        );\n      })}\n    </ul>\n  );\n}\n","// Copyright (c) 2019 The Jaeger Authors.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css, cx } from '@emotion/css';\nimport * as React from 'react';\nimport IoIosArrowDown from 'react-icons/lib/io/ios-arrow-down';\nimport IoIosArrowRight from 'react-icons/lib/io/ios-arrow-right';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { Icon, useStyles2 } from '@grafana/ui';\n\nimport { autoColor } from '../../Theme';\nimport { TraceSpanReference } from '../../types/trace';\nimport { uAlignIcon, ubMb1 } from '../../uberUtilityStyles';\nimport ReferenceLink from '../../url/ReferenceLink';\n\nimport AccordianKeyValues from './AccordianKeyValues';\n\nconst getStyles = (theme: GrafanaTheme2) => {\n  return {\n    AccordianReferenceItem: css`\n      border-bottom: 1px solid ${autoColor(theme, '#d8d8d8')};\n    `,\n    AccordianKeyValues: css`\n      margin-left: 10px;\n    `,\n    AccordianReferences: css`\n      label: AccordianReferences;\n      border: 1px solid ${autoColor(theme, '#d8d8d8')};\n      position: relative;\n      margin-bottom: 0.25rem;\n    `,\n    AccordianReferencesHeader: css`\n      label: AccordianReferencesHeader;\n      background: ${autoColor(theme, '#e4e4e4')};\n      color: inherit;\n      display: block;\n      padding: 0.25rem 0.5rem;\n      &:hover {\n        background: ${autoColor(theme, '#dadada')};\n      }\n    `,\n    AccordianReferencesContent: css`\n      label: AccordianReferencesContent;\n      background: ${autoColor(theme, '#f0f0f0')};\n      border-top: 1px solid ${autoColor(theme, '#d8d8d8')};\n      padding: 0.5rem 0.5rem 0.25rem 0.5rem;\n    `,\n    AccordianReferencesFooter: css`\n      label: AccordianReferencesFooter;\n      color: ${autoColor(theme, '#999')};\n    `,\n    ReferencesList: css`\n      background: #fff;\n      border: 1px solid #ddd;\n      margin-bottom: 0.7em;\n      max-height: 450px;\n      overflow: auto;\n    `,\n    list: css`\n      width: 100%;\n      list-style: none;\n      padding: 0;\n      margin: 0;\n      background: #fff;\n    `,\n    itemContent: css`\n      padding: 0.25rem 0.5rem;\n      display: flex;\n      width: 100%;\n      justify-content: space-between;\n    `,\n    item: css`\n      &:nth-child(2n) {\n        background: #f5f5f5;\n      }\n    `,\n    debugInfo: css`\n      letter-spacing: 0.25px;\n      margin: 0.5em 0 0;\n      flex-wrap: wrap;\n      display: flex;\n      justify-content: flex-end;\n    `,\n    debugLabel: css`\n      margin: 0 5px 0 5px;\n      &::before {\n        color: #bbb;\n        content: attr(data-label);\n      }\n    `,\n    serviceName: css`\n      margin-right: 8px;\n    `,\n  };\n};\n\ntype AccordianReferencesProps = {\n  data: TraceSpanReference[];\n  highContrast?: boolean;\n  interactive?: boolean;\n  isOpen: boolean;\n  openedItems?: Set<TraceSpanReference>;\n  onItemToggle?: (reference: TraceSpanReference) => void;\n  onToggle?: null | (() => void);\n  focusSpan: (uiFind: string) => void;\n};\n\ntype ReferenceItemProps = {\n  data: TraceSpanReference[];\n  interactive?: boolean;\n  openedItems?: Set<TraceSpanReference>;\n  onItemToggle?: (reference: TraceSpanReference) => void;\n  focusSpan: (uiFind: string) => void;\n};\n\n// export for test\nexport function References(props: ReferenceItemProps) {\n  const { data, focusSpan, openedItems, onItemToggle, interactive } = props;\n  const styles = useStyles2(getStyles);\n\n  return (\n    <div className={styles.AccordianReferencesContent}>\n      {data.map((reference, i) => (\n        <div className={i < data.length - 1 ? styles.AccordianReferenceItem : undefined} key={reference.spanID}>\n          <div className={styles.item} key={`${reference.spanID}`}>\n            <ReferenceLink reference={reference} focusSpan={focusSpan}>\n              <span className={styles.itemContent}>\n                {reference.span ? (\n                  <span>\n                    <span className={cx('span-svc-name', styles.serviceName)}>\n                      {reference.span.process.serviceName}\n                    </span>\n                    <small className=\"endpoint-name\">{reference.span.operationName}</small>\n                  </span>\n                ) : (\n                  <span className=\"span-svc-name\">\n                    View Linked Span <Icon name=\"external-link-alt\" />\n                  </span>\n                )}\n                <small className={styles.debugInfo}>\n                  <span className={styles.debugLabel} data-label=\"TraceID:\">\n                    {reference.traceID}\n                  </span>\n                  <span className={styles.debugLabel} data-label=\"SpanID:\">\n                    {reference.spanID}\n                  </span>\n                </small>\n              </span>\n            </ReferenceLink>\n          </div>\n          {!!reference.tags?.length && (\n            <div className={styles.AccordianKeyValues}>\n              <AccordianKeyValues\n                className={i < data.length - 1 ? ubMb1 : null}\n                data={reference.tags || []}\n                highContrast\n                interactive={interactive}\n                isOpen={openedItems ? openedItems.has(reference) : false}\n                label={'attributes'}\n                linksGetter={null}\n                onToggle={interactive && onItemToggle ? () => onItemToggle(reference) : null}\n              />\n            </div>\n          )}\n        </div>\n      ))}\n    </div>\n  );\n}\n\nconst AccordianReferences: React.FC<AccordianReferencesProps> = ({\n  data,\n  interactive = true,\n  isOpen,\n  onToggle,\n  onItemToggle,\n  openedItems,\n  focusSpan,\n}) => {\n  const isEmpty = !Array.isArray(data) || !data.length;\n  let arrow: React.ReactNode | null = null;\n  let HeaderComponent: 'span' | 'a' = 'span';\n  let headerProps: {} | null = null;\n  if (interactive) {\n    arrow = isOpen ? <IoIosArrowDown className={uAlignIcon} /> : <IoIosArrowRight className={uAlignIcon} />;\n    HeaderComponent = 'a';\n    headerProps = {\n      'aria-checked': isOpen,\n      onClick: isEmpty ? null : onToggle,\n      role: 'switch',\n    };\n  }\n\n  const styles = useStyles2(getStyles);\n  return (\n    <div className={styles.AccordianReferences}>\n      <HeaderComponent className={styles.AccordianReferencesHeader} {...headerProps}>\n        {arrow}\n        <strong>\n          <span>References</span>\n        </strong>{' '}\n        ({data.length})\n      </HeaderComponent>\n      {isOpen && (\n        <References\n          data={data}\n          openedItems={openedItems}\n          focusSpan={focusSpan}\n          onItemToggle={onItemToggle}\n          interactive={interactive}\n        />\n      )}\n    </div>\n  );\n};\n\nexport default React.memo(AccordianReferences);\n","// Copyright (c) 2019 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport cx from 'classnames';\nimport * as React from 'react';\n\nimport { useStyles2 } from '@grafana/ui';\n\nconst getStyles = () => {\n  return {\n    TextList: css`\n      max-height: 450px;\n      overflow: auto;\n    `,\n    List: css`\n      width: 100%;\n      list-style: none;\n      padding: 0;\n      margin: 0;\n    `,\n    item: css`\n      padding: 0.25rem 0.5rem;\n      vertical-align: top;\n      &:nth-child(2n) {\n        background: #f5f5f5;\n      }\n    `,\n  };\n};\n\ntype TextListProps = {\n  data: string[];\n};\n\nexport default function TextList(props: TextListProps) {\n  const { data } = props;\n  const styles = useStyles2(getStyles);\n  return (\n    <div className={cx(styles.TextList)} data-test-id=\"TextList\">\n      <ul className={styles.List}>\n        {data.map((row, i) => {\n          return (\n            // `i` is necessary in the key because row.key can repeat\n            <li className={styles.item} key={`${i}`}>\n              {row}\n            </li>\n          );\n        })}\n      </ul>\n    </div>\n  );\n}\n","// Copyright (c) 2019 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport cx from 'classnames';\nimport * as React from 'react';\nimport IoIosArrowDown from 'react-icons/lib/io/ios-arrow-down';\nimport IoIosArrowRight from 'react-icons/lib/io/ios-arrow-right';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useStyles2 } from '@grafana/ui';\n\nimport { autoColor } from '../../Theme';\nimport { TNil } from '../../types';\nimport { uAlignIcon } from '../../uberUtilityStyles';\n\nimport { getStyles as getAccordianKeyValuesStyles } from './AccordianKeyValues';\nimport TextList from './TextList';\n\nconst getStyles = (theme: GrafanaTheme2) => {\n  return {\n    header: css`\n      cursor: pointer;\n      overflow: hidden;\n      padding: 0.25em 0.1em;\n      text-overflow: ellipsis;\n      white-space: nowrap;\n      &:hover {\n        background: ${autoColor(theme, '#e8e8e8')};\n      }\n    `,\n  };\n};\n\ntype AccordianTextProps = {\n  className?: string | TNil;\n  headerClassName?: string | TNil;\n  data: string[];\n  highContrast?: boolean;\n  interactive?: boolean;\n  isOpen: boolean;\n  label: React.ReactNode | string;\n  onToggle?: null | (() => void);\n  TextComponent?: React.ElementType<{ data: string[] }>;\n};\n\nfunction DefaultTextComponent({ data }: { data: string[] }) {\n  return <TextList data={data} />;\n}\n\nexport default function AccordianText(props: AccordianTextProps) {\n  const {\n    className,\n    data,\n    headerClassName,\n    interactive,\n    isOpen,\n    label,\n    onToggle,\n    TextComponent = DefaultTextComponent,\n  } = props;\n  const isEmpty = !Array.isArray(data) || !data.length;\n  const accordianKeyValuesStyles = useStyles2(getAccordianKeyValuesStyles);\n  const iconCls = cx(uAlignIcon, { [accordianKeyValuesStyles.emptyIcon]: isEmpty });\n  let arrow: React.ReactNode | null = null;\n  let headerProps: {} | null = null;\n  if (interactive) {\n    arrow = isOpen ? <IoIosArrowDown className={iconCls} /> : <IoIosArrowRight className={iconCls} />;\n    headerProps = {\n      'aria-checked': isOpen,\n      onClick: isEmpty ? null : onToggle,\n      role: 'switch',\n    };\n  }\n  const styles = useStyles2(getStyles);\n  return (\n    <div className={className || ''}>\n      <div className={cx(styles.header, headerClassName)} {...headerProps} data-test-id=\"AccordianText--header\">\n        {arrow}\n        <strong>{label}</strong> ({data.length})\n      </div>\n      {isOpen && <TextComponent data={data} />}\n    </div>\n  );\n}\n\nAccordianText.defaultProps = {\n  className: null,\n  highContrast: false,\n  interactive: true,\n  onToggle: null,\n};\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport cx from 'classnames';\nimport React from 'react';\nimport IoLink from 'react-icons/lib/io/link';\n\nimport { GrafanaTheme2, LinkModel } from '@grafana/data';\nimport { DataLinkButton, TextArea, useStyles2 } from '@grafana/ui';\n\nimport { autoColor } from '../../Theme';\nimport { Divider } from '../../common/Divider';\nimport LabeledList from '../../common/LabeledList';\nimport { SpanLinkFunc, TNil } from '../../types';\nimport { TraceKeyValuePair, TraceLink, TraceLog, TraceSpan, TraceSpanReference } from '../../types/trace';\nimport { uAlignIcon, ubM0, ubMb1, ubMy1, ubTxRightAlign } from '../../uberUtilityStyles';\nimport { formatDuration } from '../utils';\n\nimport AccordianKeyValues from './AccordianKeyValues';\nimport AccordianLogs from './AccordianLogs';\nimport AccordianReferences from './AccordianReferences';\nimport AccordianText from './AccordianText';\nimport DetailState from './DetailState';\n\nconst getStyles = (theme: GrafanaTheme2) => {\n  return {\n    header: css`\n      display: flex;\n      align-items: flex-start;\n      justify-content: space-between;\n      gap: 0 1rem;\n      margin-bottom: 0.25rem;\n    `,\n    listWrapper: css`\n      overflow: hidden;\n    `,\n    debugInfo: css`\n      label: debugInfo;\n      display: block;\n      letter-spacing: 0.25px;\n      margin: 0.5em 0 -0.75em;\n      text-align: right;\n    `,\n    debugLabel: css`\n      label: debugLabel;\n      &::before {\n        color: ${autoColor(theme, '#bbb')};\n        content: attr(data-label);\n      }\n    `,\n    debugValue: css`\n      label: debugValue;\n      background-color: inherit;\n      border: none;\n      color: ${autoColor(theme, '#888')};\n      cursor: pointer;\n      &:hover {\n        color: ${autoColor(theme, '#333')};\n      }\n    `,\n    AccordianWarnings: css`\n      label: AccordianWarnings;\n      background: ${autoColor(theme, '#fafafa')};\n      border: 1px solid ${autoColor(theme, '#e4e4e4')};\n      margin-bottom: 0.25rem;\n    `,\n    AccordianWarningsHeader: css`\n      label: AccordianWarningsHeader;\n      background: ${autoColor(theme, '#fff7e6')};\n      padding: 0.25rem 0.5rem;\n      &:hover {\n        background: ${autoColor(theme, '#ffe7ba')};\n      }\n    `,\n    AccordianWarningsHeaderOpen: css`\n      label: AccordianWarningsHeaderOpen;\n      border-bottom: 1px solid ${autoColor(theme, '#e8e8e8')};\n    `,\n    AccordianWarningsLabel: css`\n      label: AccordianWarningsLabel;\n      color: ${autoColor(theme, '#d36c08')};\n    `,\n    Textarea: css`\n      word-break: break-all;\n      white-space: pre;\n    `,\n    LinkIcon: css`\n      font-size: 1.5em;\n    `,\n  };\n};\n\ntype SpanDetailProps = {\n  detailState: DetailState;\n  linksGetter: ((links: TraceKeyValuePair[], index: number) => TraceLink[]) | TNil;\n  logItemToggle: (spanID: string, log: TraceLog) => void;\n  logsToggle: (spanID: string) => void;\n  processToggle: (spanID: string) => void;\n  span: TraceSpan;\n  tagsToggle: (spanID: string) => void;\n  traceStartTime: number;\n  warningsToggle: (spanID: string) => void;\n  stackTracesToggle: (spanID: string) => void;\n  referenceItemToggle: (spanID: string, reference: TraceSpanReference) => void;\n  referencesToggle: (spanID: string) => void;\n  focusSpan: (uiFind: string) => void;\n  createSpanLink?: SpanLinkFunc;\n  focusedSpanId?: string;\n  createFocusSpanLink: (traceId: string, spanId: string) => LinkModel;\n};\n\nexport default function SpanDetail(props: SpanDetailProps) {\n  const {\n    detailState,\n    linksGetter,\n    logItemToggle,\n    logsToggle,\n    processToggle,\n    span,\n    tagsToggle,\n    traceStartTime,\n    warningsToggle,\n    stackTracesToggle,\n    referencesToggle,\n    referenceItemToggle,\n    focusSpan,\n    createSpanLink,\n    createFocusSpanLink,\n  } = props;\n  const {\n    isTagsOpen,\n    isProcessOpen,\n    logs: logsState,\n    isWarningsOpen,\n    references: referencesState,\n    isStackTracesOpen,\n  } = detailState;\n  const {\n    operationName,\n    process,\n    duration,\n    relativeStartTime,\n    traceID,\n    spanID,\n    logs,\n    tags,\n    warnings,\n    references,\n    stackTraces,\n  } = span;\n  const overviewItems = [\n    {\n      key: 'svc',\n      label: 'Service:',\n      value: process.serviceName,\n    },\n    {\n      key: 'duration',\n      label: 'Duration:',\n      value: formatDuration(duration),\n    },\n    {\n      key: 'start',\n      label: 'Start Time:',\n      value: formatDuration(relativeStartTime),\n    },\n    ...(span.childSpanCount > 0\n      ? [\n          {\n            key: 'child_count',\n            label: 'Child Count:',\n            value: span.childSpanCount,\n          },\n        ]\n      : []),\n  ];\n  const styles = useStyles2(getStyles);\n  const link = createSpanLink?.(span);\n  const focusSpanLink = createFocusSpanLink(traceID, spanID);\n\n  return (\n    <div>\n      <div className={styles.header}>\n        <h2 className={cx(ubM0)}>{operationName}</h2>\n        <div className={styles.listWrapper}>\n          <LabeledList className={ubTxRightAlign} divider={true} items={overviewItems} />\n        </div>\n      </div>\n      {link ? (\n        <DataLinkButton link={{ ...link, title: 'Logs for this span' } as any} buttonProps={{ icon: 'gf-logs' }} />\n      ) : null}\n      <Divider className={ubMy1} type={'horizontal'} />\n      <div>\n        <div>\n          <AccordianKeyValues\n            data={tags}\n            label=\"Tags\"\n            linksGetter={linksGetter}\n            isOpen={isTagsOpen}\n            onToggle={() => tagsToggle(spanID)}\n          />\n          {process.tags && (\n            <AccordianKeyValues\n              className={ubMb1}\n              data={process.tags}\n              label=\"Process\"\n              linksGetter={linksGetter}\n              isOpen={isProcessOpen}\n              onToggle={() => processToggle(spanID)}\n            />\n          )}\n        </div>\n        {logs && logs.length > 0 && (\n          <AccordianLogs\n            linksGetter={linksGetter}\n            logs={logs}\n            isOpen={logsState.isOpen}\n            openedItems={logsState.openedItems}\n            onToggle={() => logsToggle(spanID)}\n            onItemToggle={(logItem) => logItemToggle(spanID, logItem)}\n            timestamp={traceStartTime}\n          />\n        )}\n        {warnings && warnings.length > 0 && (\n          <AccordianText\n            className={styles.AccordianWarnings}\n            headerClassName={styles.AccordianWarningsHeader}\n            label={<span className={styles.AccordianWarningsLabel}>Warnings</span>}\n            data={warnings}\n            isOpen={isWarningsOpen}\n            onToggle={() => warningsToggle(spanID)}\n          />\n        )}\n        {stackTraces && stackTraces.length && (\n          <AccordianText\n            label=\"Stack trace\"\n            data={stackTraces}\n            isOpen={isStackTracesOpen}\n            TextComponent={(textComponentProps) => {\n              let text;\n              if (textComponentProps.data?.length > 1) {\n                text = textComponentProps.data\n                  .map((stackTrace, index) => `StackTrace ${index + 1}:\\n${stackTrace}`)\n                  .join('\\n');\n              } else {\n                text = textComponentProps.data?.[0];\n              }\n              return (\n                <TextArea\n                  className={styles.Textarea}\n                  style={{ cursor: 'unset' }}\n                  readOnly\n                  cols={10}\n                  rows={10}\n                  value={text}\n                />\n              );\n            }}\n            onToggle={() => stackTracesToggle(spanID)}\n          />\n        )}\n        {references && references.length > 0 && (references.length > 1 || references[0].refType !== 'CHILD_OF') && (\n          <AccordianReferences\n            data={references}\n            isOpen={referencesState.isOpen}\n            openedItems={referencesState.openedItems}\n            onToggle={() => referencesToggle(spanID)}\n            onItemToggle={(reference) => referenceItemToggle(spanID, reference)}\n            focusSpan={focusSpan}\n          />\n        )}\n        <small className={styles.debugInfo}>\n          <a\n            {...focusSpanLink}\n            onClick={(e) => {\n              // click handling logic copied from react router:\n              // https://github.com/remix-run/react-router/blob/997b4d67e506d39ac6571cb369d6d2d6b3dda557/packages/react-router-dom/index.tsx#L392-L394s\n              if (\n                focusSpanLink.onClick &&\n                e.button === 0 && // Ignore everything but left clicks\n                (!e.currentTarget.target || e.currentTarget.target === '_self') && // Let browser handle \"target=_blank\" etc.\n                !(e.metaKey || e.altKey || e.ctrlKey || e.shiftKey) // Ignore clicks with modifier keys\n              ) {\n                e.preventDefault();\n                focusSpanLink.onClick(e);\n              }\n            }}\n          >\n            <IoLink className={cx(uAlignIcon, styles.LinkIcon)}></IoLink>\n          </a>\n          <span className={styles.debugLabel} data-label=\"SpanID:\" /> {spanID}\n        </small>\n      </div>\n    </div>\n  );\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport React from 'react';\n\nimport { GrafanaTheme2, LinkModel } from '@grafana/data';\nimport { stylesFactory, withTheme2 } from '@grafana/ui';\n\nimport { autoColor } from '../Theme';\nimport { SpanLinkFunc } from '../types';\nimport { TraceLog, TraceSpan, TraceKeyValuePair, TraceLink, TraceSpanReference } from '../types/trace';\n\nimport SpanDetail from './SpanDetail';\nimport DetailState from './SpanDetail/DetailState';\nimport SpanTreeOffset from './SpanTreeOffset';\nimport TimelineRow from './TimelineRow';\n\nconst getStyles = stylesFactory((theme: GrafanaTheme2) => {\n  return {\n    expandedAccent: css`\n      cursor: pointer;\n      height: 100%;\n      overflow: hidden;\n      position: absolute;\n      width: 100%;\n      &::before {\n        border-left: 4px solid;\n        pointer-events: none;\n        width: 1000px;\n      }\n      &::after {\n        border-right: 1000px solid;\n        border-color: inherit;\n        cursor: pointer;\n        opacity: 0.2;\n      }\n\n      /* border-color inherit must come AFTER other border declarations for accent */\n      &::before,\n      &::after {\n        border-color: inherit;\n        content: ' ';\n        position: absolute;\n        height: 100%;\n      }\n\n      &:hover::after {\n        opacity: 0.35;\n      }\n    `,\n    infoWrapper: css`\n      label: infoWrapper;\n      border: 1px solid ${autoColor(theme, '#d3d3d3')};\n      border-top: 3px solid;\n      padding: 0.75rem;\n    `,\n  };\n});\n\ntype SpanDetailRowProps = {\n  color: string;\n  columnDivision: number;\n  detailState: DetailState;\n  onDetailToggled: (spanID: string) => void;\n  linksGetter: (span: TraceSpan, links: TraceKeyValuePair[], index: number) => TraceLink[];\n  logItemToggle: (spanID: string, log: TraceLog) => void;\n  logsToggle: (spanID: string) => void;\n  processToggle: (spanID: string) => void;\n  referenceItemToggle: (spanID: string, reference: TraceSpanReference) => void;\n  referencesToggle: (spanID: string) => void;\n  warningsToggle: (spanID: string) => void;\n  stackTracesToggle: (spanID: string) => void;\n  span: TraceSpan;\n  tagsToggle: (spanID: string) => void;\n  traceStartTime: number;\n  focusSpan: (uiFind: string) => void;\n  hoverIndentGuideIds: Set<string>;\n  addHoverIndentGuideId: (spanID: string) => void;\n  removeHoverIndentGuideId: (spanID: string) => void;\n  theme: GrafanaTheme2;\n  createSpanLink?: SpanLinkFunc;\n  focusedSpanId?: string;\n  createFocusSpanLink: (traceId: string, spanId: string) => LinkModel;\n};\n\nexport class UnthemedSpanDetailRow extends React.PureComponent<SpanDetailRowProps> {\n  _detailToggle = () => {\n    this.props.onDetailToggled(this.props.span.spanID);\n  };\n\n  _linksGetter = (items: TraceKeyValuePair[], itemIndex: number) => {\n    const { linksGetter, span } = this.props;\n    return linksGetter(span, items, itemIndex);\n  };\n\n  render() {\n    const {\n      color,\n      columnDivision,\n      detailState,\n      logItemToggle,\n      logsToggle,\n      processToggle,\n      referenceItemToggle,\n      referencesToggle,\n      warningsToggle,\n      stackTracesToggle,\n      span,\n      tagsToggle,\n      traceStartTime,\n      focusSpan,\n      hoverIndentGuideIds,\n      addHoverIndentGuideId,\n      removeHoverIndentGuideId,\n      theme,\n      createSpanLink,\n      focusedSpanId,\n      createFocusSpanLink,\n    } = this.props;\n    const styles = getStyles(theme);\n    return (\n      <TimelineRow>\n        <TimelineRow.Cell width={columnDivision} style={{ overflow: 'hidden' }}>\n          <SpanTreeOffset\n            span={span}\n            showChildrenIcon={false}\n            hoverIndentGuideIds={hoverIndentGuideIds}\n            addHoverIndentGuideId={addHoverIndentGuideId}\n            removeHoverIndentGuideId={removeHoverIndentGuideId}\n          />\n          <span>\n            <span\n              className={styles.expandedAccent}\n              aria-checked=\"true\"\n              onClick={this._detailToggle}\n              role=\"switch\"\n              style={{ borderColor: color }}\n              data-test-id=\"detail-row-expanded-accent\"\n            />\n          </span>\n        </TimelineRow.Cell>\n        <TimelineRow.Cell width={1 - columnDivision}>\n          <div className={styles.infoWrapper} style={{ borderTopColor: color }}>\n            <SpanDetail\n              detailState={detailState}\n              linksGetter={this._linksGetter}\n              logItemToggle={logItemToggle}\n              logsToggle={logsToggle}\n              processToggle={processToggle}\n              referenceItemToggle={referenceItemToggle}\n              referencesToggle={referencesToggle}\n              warningsToggle={warningsToggle}\n              stackTracesToggle={stackTracesToggle}\n              span={span}\n              tagsToggle={tagsToggle}\n              traceStartTime={traceStartTime}\n              focusSpan={focusSpan}\n              createSpanLink={createSpanLink}\n              focusedSpanId={focusedSpanId}\n              createFocusSpanLink={createFocusSpanLink}\n            />\n          </div>\n        </TimelineRow.Cell>\n      </TimelineRow>\n    );\n  }\n}\n\nexport default withTheme2(UnthemedSpanDetailRow);\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport { isEqual } from 'lodash';\nimport memoizeOne from 'memoize-one';\nimport * as React from 'react';\nimport { createRef, RefObject } from 'react';\n\nimport { GrafanaTheme2, LinkModel } from '@grafana/data';\nimport { stylesFactory, withTheme2, ToolbarButton } from '@grafana/ui';\n\nimport { Accessors } from '../ScrollManager';\nimport { PEER_SERVICE } from '../constants/tag-keys';\nimport { SpanLinkFunc, TNil } from '../types';\nimport TTraceTimeline from '../types/TTraceTimeline';\nimport { TraceLog, TraceSpan, Trace, TraceKeyValuePair, TraceLink, TraceSpanReference } from '../types/trace';\nimport { getColorByKey } from '../utils/color-generator';\n\nimport ListView from './ListView';\nimport SpanBarRow from './SpanBarRow';\nimport DetailState from './SpanDetail/DetailState';\nimport SpanDetailRow from './SpanDetailRow';\nimport {\n  createViewedBoundsFunc,\n  findServerChildSpan,\n  isErrorSpan,\n  isKindClient,\n  spanContainsErredSpan,\n  ViewedBoundsFunctionType,\n} from './utils';\n\ntype TExtractUiFindFromStateReturn = {\n  uiFind: string | undefined;\n};\n\nconst getStyles = stylesFactory(() => {\n  return {\n    rowsWrapper: css`\n      width: 100%;\n    `,\n    row: css`\n      width: 100%;\n    `,\n    scrollToTopButton: css`\n      display: flex;\n      flex-direction: column;\n      justify-content: center;\n      align-items: center;\n      width: 40px;\n      height: 40px;\n      position: fixed;\n      bottom: 30px;\n      right: 30px;\n      z-index: 1;\n    `,\n  };\n});\n\ntype RowState = {\n  isDetail: boolean;\n  span: TraceSpan;\n  spanIndex: number;\n};\n\ntype TVirtualizedTraceViewOwnProps = {\n  currentViewRangeTime: [number, number];\n  findMatchesIDs: Set<string> | TNil;\n  scrollToFirstVisibleSpan: () => void;\n  registerAccessors: (accesors: Accessors) => void;\n  trace: Trace;\n  focusSpan: (uiFind: string) => void;\n  linksGetter: (span: TraceSpan, items: TraceKeyValuePair[], itemIndex: number) => TraceLink[];\n  childrenToggle: (spanID: string) => void;\n  clearShouldScrollToFirstUiFindMatch: () => void;\n  detailLogItemToggle: (spanID: string, log: TraceLog) => void;\n  detailLogsToggle: (spanID: string) => void;\n  detailWarningsToggle: (spanID: string) => void;\n  detailStackTracesToggle: (spanID: string) => void;\n  detailReferencesToggle: (spanID: string) => void;\n  detailReferenceItemToggle: (spanID: string, reference: TraceSpanReference) => void;\n  detailProcessToggle: (spanID: string) => void;\n  detailTagsToggle: (spanID: string) => void;\n  detailToggle: (spanID: string) => void;\n  setSpanNameColumnWidth: (width: number) => void;\n  setTrace: (trace: Trace | TNil, uiFind: string | TNil) => void;\n  hoverIndentGuideIds: Set<string>;\n  addHoverIndentGuideId: (spanID: string) => void;\n  removeHoverIndentGuideId: (spanID: string) => void;\n  theme: GrafanaTheme2;\n  createSpanLink?: SpanLinkFunc;\n  scrollElement?: Element;\n  focusedSpanId?: string;\n  focusedSpanIdForSearch: string;\n  createFocusSpanLink: (traceId: string, spanId: string) => LinkModel;\n  topOfExploreViewRef?: RefObject<HTMLDivElement>;\n};\n\ntype VirtualizedTraceViewProps = TVirtualizedTraceViewOwnProps & TExtractUiFindFromStateReturn & TTraceTimeline;\n\n// export for tests\nexport const DEFAULT_HEIGHTS = {\n  bar: 28,\n  detail: 161,\n  detailWithLogs: 197,\n};\n\nconst NUM_TICKS = 5;\n\nfunction generateRowStates(\n  spans: TraceSpan[] | TNil,\n  childrenHiddenIDs: Set<string>,\n  detailStates: Map<string, DetailState | TNil>\n): RowState[] {\n  if (!spans) {\n    return [];\n  }\n  let collapseDepth = null;\n  const rowStates = [];\n  for (let i = 0; i < spans.length; i++) {\n    const span = spans[i];\n    const { spanID, depth } = span;\n    let hidden = false;\n    if (collapseDepth != null) {\n      if (depth >= collapseDepth) {\n        hidden = true;\n      } else {\n        collapseDepth = null;\n      }\n    }\n    if (hidden) {\n      continue;\n    }\n    if (childrenHiddenIDs.has(spanID)) {\n      collapseDepth = depth + 1;\n    }\n    rowStates.push({\n      span,\n      isDetail: false,\n      spanIndex: i,\n    });\n    if (detailStates.has(spanID)) {\n      rowStates.push({\n        span,\n        isDetail: true,\n        spanIndex: i,\n      });\n    }\n  }\n  return rowStates;\n}\n\nfunction getClipping(currentViewRange: [number, number]) {\n  const [zoomStart, zoomEnd] = currentViewRange;\n  return {\n    left: zoomStart > 0,\n    right: zoomEnd < 1,\n  };\n}\n\nfunction generateRowStatesFromTrace(\n  trace: Trace | TNil,\n  childrenHiddenIDs: Set<string>,\n  detailStates: Map<string, DetailState | TNil>\n): RowState[] {\n  return trace ? generateRowStates(trace.spans, childrenHiddenIDs, detailStates) : [];\n}\n\nconst memoizedGenerateRowStates = memoizeOne(generateRowStatesFromTrace);\nconst memoizedViewBoundsFunc = memoizeOne(createViewedBoundsFunc, isEqual);\nconst memoizedGetClipping = memoizeOne(getClipping, isEqual);\n\n// export from tests\nexport class UnthemedVirtualizedTraceView extends React.Component<VirtualizedTraceViewProps> {\n  listView: ListView | TNil;\n  topTraceViewRef = createRef<HTMLDivElement>();\n\n  constructor(props: VirtualizedTraceViewProps) {\n    super(props);\n    const { setTrace, trace, uiFind } = props;\n    setTrace(trace, uiFind);\n  }\n\n  componentDidMount() {\n    this.scrollToSpan(this.props.focusedSpanId);\n  }\n\n  shouldComponentUpdate(nextProps: VirtualizedTraceViewProps) {\n    // If any prop updates, VirtualizedTraceViewImpl should update.\n    const nextPropKeys = Object.keys(nextProps) as Array<keyof VirtualizedTraceViewProps>;\n    for (let i = 0; i < nextPropKeys.length; i += 1) {\n      if (nextProps[nextPropKeys[i]] !== this.props[nextPropKeys[i]]) {\n        // Unless the only change was props.shouldScrollToFirstUiFindMatch changing to false.\n        if (nextPropKeys[i] === 'shouldScrollToFirstUiFindMatch') {\n          if (nextProps[nextPropKeys[i]]) {\n            return true;\n          }\n        } else {\n          return true;\n        }\n      }\n    }\n    return false;\n  }\n\n  componentDidUpdate(prevProps: Readonly<VirtualizedTraceViewProps>) {\n    const { registerAccessors, trace } = prevProps;\n    const {\n      shouldScrollToFirstUiFindMatch,\n      clearShouldScrollToFirstUiFindMatch,\n      scrollToFirstVisibleSpan,\n      registerAccessors: nextRegisterAccessors,\n      setTrace,\n      trace: nextTrace,\n      uiFind,\n      focusedSpanId,\n      focusedSpanIdForSearch,\n    } = this.props;\n\n    if (trace !== nextTrace) {\n      setTrace(nextTrace, uiFind);\n    }\n\n    if (this.listView && registerAccessors !== nextRegisterAccessors) {\n      nextRegisterAccessors(this.getAccessors());\n    }\n\n    if (shouldScrollToFirstUiFindMatch) {\n      scrollToFirstVisibleSpan();\n      clearShouldScrollToFirstUiFindMatch();\n    }\n\n    if (focusedSpanId !== prevProps.focusedSpanId) {\n      this.scrollToSpan(focusedSpanId);\n    }\n\n    if (focusedSpanIdForSearch !== prevProps.focusedSpanIdForSearch) {\n      this.scrollToSpan(focusedSpanIdForSearch);\n    }\n  }\n\n  getRowStates(): RowState[] {\n    const { childrenHiddenIDs, detailStates, trace } = this.props;\n    return memoizedGenerateRowStates(trace, childrenHiddenIDs, detailStates);\n  }\n\n  getClipping(): { left: boolean; right: boolean } {\n    const { currentViewRangeTime } = this.props;\n    return memoizedGetClipping(currentViewRangeTime);\n  }\n\n  getViewedBounds(): ViewedBoundsFunctionType {\n    const { currentViewRangeTime, trace } = this.props;\n    const [zoomStart, zoomEnd] = currentViewRangeTime;\n\n    return memoizedViewBoundsFunc({\n      min: trace.startTime,\n      max: trace.endTime,\n      viewStart: zoomStart,\n      viewEnd: zoomEnd,\n    });\n  }\n\n  getAccessors() {\n    const lv = this.listView;\n    if (!lv) {\n      throw new Error('ListView unavailable');\n    }\n    return {\n      getViewRange: this.getViewRange,\n      getSearchedSpanIDs: this.getSearchedSpanIDs,\n      getCollapsedChildren: this.getCollapsedChildren,\n      getViewHeight: lv.getViewHeight,\n      getBottomRowIndexVisible: lv.getBottomVisibleIndex,\n      getTopRowIndexVisible: lv.getTopVisibleIndex,\n      getRowPosition: lv.getRowPosition,\n      mapRowIndexToSpanIndex: this.mapRowIndexToSpanIndex,\n      mapSpanIndexToRowIndex: this.mapSpanIndexToRowIndex,\n    };\n  }\n\n  getViewRange = () => this.props.currentViewRangeTime;\n\n  getSearchedSpanIDs = () => this.props.findMatchesIDs;\n\n  getCollapsedChildren = () => this.props.childrenHiddenIDs;\n\n  mapRowIndexToSpanIndex = (index: number) => this.getRowStates()[index].spanIndex;\n\n  mapSpanIndexToRowIndex = (index: number) => {\n    const max = this.getRowStates().length;\n    for (let i = 0; i < max; i++) {\n      const { spanIndex } = this.getRowStates()[i];\n      if (spanIndex === index) {\n        return i;\n      }\n    }\n    throw new Error(`unable to find row for span index: ${index}`);\n  };\n\n  setListView = (listView: ListView | TNil) => {\n    const isChanged = this.listView !== listView;\n    this.listView = listView;\n    if (listView && isChanged) {\n      this.props.registerAccessors(this.getAccessors());\n    }\n  };\n\n  // use long form syntax to avert flow error\n  // https://github.com/facebook/flow/issues/3076#issuecomment-290944051\n  getKeyFromIndex = (index: number) => {\n    const { isDetail, span } = this.getRowStates()[index];\n    return `${span.traceID}--${span.spanID}--${isDetail ? 'detail' : 'bar'}`;\n  };\n\n  getIndexFromKey = (key: string) => {\n    const parts = key.split('--');\n    const _traceID = parts[0];\n    const _spanID = parts[1];\n    const _isDetail = parts[2] === 'detail';\n    const max = this.getRowStates().length;\n    for (let i = 0; i < max; i++) {\n      const { span, isDetail } = this.getRowStates()[i];\n      if (span.spanID === _spanID && span.traceID === _traceID && isDetail === _isDetail) {\n        return i;\n      }\n    }\n    return -1;\n  };\n\n  getRowHeight = (index: number) => {\n    const { span, isDetail } = this.getRowStates()[index];\n    if (!isDetail) {\n      return DEFAULT_HEIGHTS.bar;\n    }\n    if (Array.isArray(span.logs) && span.logs.length) {\n      return DEFAULT_HEIGHTS.detailWithLogs;\n    }\n    return DEFAULT_HEIGHTS.detail;\n  };\n\n  renderRow = (key: string, style: React.CSSProperties, index: number, attrs: {}) => {\n    const { isDetail, span, spanIndex } = this.getRowStates()[index];\n    return isDetail\n      ? this.renderSpanDetailRow(span, key, style, attrs)\n      : this.renderSpanBarRow(span, spanIndex, key, style, attrs);\n  };\n\n  scrollToSpan = (spanID?: string) => {\n    if (spanID == null) {\n      return;\n    }\n    const i = this.getRowStates().findIndex((row) => row.span.spanID === spanID);\n    if (i >= 0) {\n      this.listView?.scrollToIndex(i);\n    }\n  };\n\n  renderSpanBarRow(span: TraceSpan, spanIndex: number, key: string, style: React.CSSProperties, attrs: {}) {\n    const { spanID } = span;\n    const { serviceName } = span.process;\n    const {\n      childrenHiddenIDs,\n      childrenToggle,\n      detailStates,\n      detailToggle,\n      findMatchesIDs,\n      spanNameColumnWidth,\n      trace,\n      focusSpan,\n      hoverIndentGuideIds,\n      addHoverIndentGuideId,\n      removeHoverIndentGuideId,\n      theme,\n      createSpanLink,\n      focusedSpanId,\n      focusedSpanIdForSearch,\n    } = this.props;\n    // to avert flow error\n    if (!trace) {\n      return null;\n    }\n    const color = getColorByKey(serviceName, theme);\n    const isCollapsed = childrenHiddenIDs.has(spanID);\n    const isDetailExpanded = detailStates.has(spanID);\n    const isMatchingFilter = findMatchesIDs ? findMatchesIDs.has(spanID) : false;\n    const isFocused = spanID === focusedSpanId || spanID === focusedSpanIdForSearch;\n    const showErrorIcon = isErrorSpan(span) || (isCollapsed && spanContainsErredSpan(trace.spans, spanIndex));\n\n    // Check for direct child \"server\" span if the span is a \"client\" span.\n    let rpc = null;\n    if (isCollapsed) {\n      const rpcSpan = findServerChildSpan(trace.spans.slice(spanIndex));\n      if (rpcSpan) {\n        const rpcViewBounds = this.getViewedBounds()(rpcSpan.startTime, rpcSpan.startTime + rpcSpan.duration);\n        rpc = {\n          color: getColorByKey(rpcSpan.process.serviceName, theme),\n          operationName: rpcSpan.operationName,\n          serviceName: rpcSpan.process.serviceName,\n          viewEnd: rpcViewBounds.end,\n          viewStart: rpcViewBounds.start,\n        };\n      }\n    }\n\n    const peerServiceKV = span.tags.find((kv) => kv.key === PEER_SERVICE);\n    // Leaf, kind == client and has peer.service.tag, is likely a client span that does a request\n    // to an uninstrumented/external service\n    let noInstrumentedServer = null;\n    if (!span.hasChildren && peerServiceKV && isKindClient(span)) {\n      noInstrumentedServer = {\n        serviceName: peerServiceKV.value,\n        color: getColorByKey(peerServiceKV.value, theme),\n      };\n    }\n\n    const styles = getStyles();\n    return (\n      <div className={styles.row} key={key} style={style} {...attrs}>\n        <SpanBarRow\n          clippingLeft={this.getClipping().left}\n          clippingRight={this.getClipping().right}\n          color={color}\n          columnDivision={spanNameColumnWidth}\n          isChildrenExpanded={!isCollapsed}\n          isDetailExpanded={isDetailExpanded}\n          isMatchingFilter={isMatchingFilter}\n          isFocused={isFocused}\n          numTicks={NUM_TICKS}\n          onDetailToggled={detailToggle}\n          onChildrenToggled={childrenToggle}\n          rpc={rpc}\n          noInstrumentedServer={noInstrumentedServer}\n          showErrorIcon={showErrorIcon}\n          getViewedBounds={this.getViewedBounds()}\n          traceStartTime={trace.startTime}\n          span={span}\n          focusSpan={focusSpan}\n          hoverIndentGuideIds={hoverIndentGuideIds}\n          addHoverIndentGuideId={addHoverIndentGuideId}\n          removeHoverIndentGuideId={removeHoverIndentGuideId}\n          createSpanLink={createSpanLink}\n        />\n      </div>\n    );\n  }\n\n  renderSpanDetailRow(span: TraceSpan, key: string, style: React.CSSProperties, attrs: {}) {\n    const { spanID } = span;\n    const { serviceName } = span.process;\n    const {\n      detailLogItemToggle,\n      detailLogsToggle,\n      detailProcessToggle,\n      detailReferencesToggle,\n      detailReferenceItemToggle,\n      detailWarningsToggle,\n      detailStackTracesToggle,\n      detailStates,\n      detailTagsToggle,\n      detailToggle,\n      spanNameColumnWidth,\n      trace,\n      focusSpan,\n      hoverIndentGuideIds,\n      addHoverIndentGuideId,\n      removeHoverIndentGuideId,\n      linksGetter,\n      theme,\n      createSpanLink,\n      focusedSpanId,\n      createFocusSpanLink,\n    } = this.props;\n    const detailState = detailStates.get(spanID);\n    if (!trace || !detailState) {\n      return null;\n    }\n    const color = getColorByKey(serviceName, theme);\n    const styles = getStyles();\n    return (\n      <div className={styles.row} key={key} style={{ ...style, zIndex: 1 }} {...attrs}>\n        <SpanDetailRow\n          color={color}\n          columnDivision={spanNameColumnWidth}\n          onDetailToggled={detailToggle}\n          detailState={detailState}\n          linksGetter={linksGetter}\n          logItemToggle={detailLogItemToggle}\n          logsToggle={detailLogsToggle}\n          processToggle={detailProcessToggle}\n          referenceItemToggle={detailReferenceItemToggle}\n          referencesToggle={detailReferencesToggle}\n          warningsToggle={detailWarningsToggle}\n          stackTracesToggle={detailStackTracesToggle}\n          span={span}\n          tagsToggle={detailTagsToggle}\n          traceStartTime={trace.startTime}\n          focusSpan={focusSpan}\n          hoverIndentGuideIds={hoverIndentGuideIds}\n          addHoverIndentGuideId={addHoverIndentGuideId}\n          removeHoverIndentGuideId={removeHoverIndentGuideId}\n          createSpanLink={createSpanLink}\n          focusedSpanId={focusedSpanId}\n          createFocusSpanLink={createFocusSpanLink}\n        />\n      </div>\n    );\n  }\n\n  scrollToTop = () => {\n    const { topOfExploreViewRef } = this.props;\n    topOfExploreViewRef?.current?.scrollIntoView({ behavior: 'smooth' });\n  };\n\n  render() {\n    const styles = getStyles();\n    const { scrollElement } = this.props;\n    return (\n      <>\n        <ListView\n          ref={this.setListView}\n          dataLength={this.getRowStates().length}\n          itemHeightGetter={this.getRowHeight}\n          itemRenderer={this.renderRow}\n          viewBuffer={50}\n          viewBufferMin={50}\n          itemsWrapperClassName={styles.rowsWrapper}\n          getKeyFromIndex={this.getKeyFromIndex}\n          getIndexFromKey={this.getIndexFromKey}\n          windowScroller={false}\n          scrollElement={scrollElement}\n        />\n\n        <ToolbarButton\n          className={styles.scrollToTopButton}\n          onClick={this.scrollToTop}\n          title=\"Scroll to top\"\n          icon=\"arrow-up\"\n        ></ToolbarButton>\n      </>\n    );\n  }\n}\n\nexport default withTheme2(UnthemedVirtualizedTraceView);\n","// Copyright (c) 2018 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nexport const HTTP_METHOD = 'http.method' as 'http.method';\nexport const PEER_SERVICE = 'peer.service' as 'peer.service';\nexport const SPAN_KIND = 'span.kind' as 'span.kind';\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport React, { RefObject } from 'react';\n\nimport { GrafanaTheme2, LinkModel } from '@grafana/data';\nimport { stylesFactory, withTheme2 } from '@grafana/ui';\n\nimport { Accessors } from '../ScrollManager';\nimport { autoColor } from '../Theme';\nimport { merge as mergeShortcuts } from '../keyboard-shortcuts';\nimport { SpanLinkFunc, TNil } from '../types';\nimport TTraceTimeline from '../types/TTraceTimeline';\nimport { TraceSpan, Trace, TraceLog, TraceKeyValuePair, TraceLink, TraceSpanReference } from '../types/trace';\nimport ExternalLinkContext from '../url/externalLinkContext';\n\nimport TimelineHeaderRow from './TimelineHeaderRow';\nimport VirtualizedTraceView from './VirtualizedTraceView';\nimport { TUpdateViewRangeTimeFunction, ViewRange, ViewRangeTimeUpdate } from './types';\n\ntype TExtractUiFindFromStateReturn = {\n  uiFind: string | undefined;\n};\n\nconst getStyles = stylesFactory((theme: GrafanaTheme2) => {\n  return {\n    TraceTimelineViewer: css`\n      label: TraceTimelineViewer;\n      border-bottom: 1px solid ${autoColor(theme, '#bbb')};\n\n      & .json-markup {\n        line-height: 17px;\n        font-size: 13px;\n        font-family: monospace;\n        white-space: pre-wrap;\n      }\n\n      & .json-markup-key {\n        font-weight: bold;\n      }\n\n      & .json-markup-bool {\n        color: ${autoColor(theme, 'firebrick')};\n      }\n\n      & .json-markup-string {\n        color: ${autoColor(theme, 'teal')};\n      }\n\n      & .json-markup-null {\n        color: ${autoColor(theme, 'teal')};\n      }\n\n      & .json-markup-number {\n        color: ${autoColor(theme, 'blue', 'black')};\n      }\n    `,\n  };\n});\n\ntype TProps = TExtractUiFindFromStateReturn & {\n  registerAccessors: (accessors: Accessors) => void;\n  findMatchesIDs: Set<string> | TNil;\n  scrollToFirstVisibleSpan: () => void;\n  traceTimeline: TTraceTimeline;\n  trace: Trace;\n  updateNextViewRangeTime: (update: ViewRangeTimeUpdate) => void;\n  updateViewRangeTime: TUpdateViewRangeTimeFunction;\n  viewRange: ViewRange;\n  focusSpan: (uiFind: string) => void;\n  createLinkToExternalSpan: (traceID: string, spanID: string) => string;\n\n  setSpanNameColumnWidth: (width: number) => void;\n  collapseAll: (spans: TraceSpan[]) => void;\n  collapseOne: (spans: TraceSpan[]) => void;\n  expandAll: () => void;\n  expandOne: (spans: TraceSpan[]) => void;\n\n  childrenToggle: (spanID: string) => void;\n  clearShouldScrollToFirstUiFindMatch: () => void;\n  detailLogItemToggle: (spanID: string, log: TraceLog) => void;\n  detailLogsToggle: (spanID: string) => void;\n  detailWarningsToggle: (spanID: string) => void;\n  detailStackTracesToggle: (spanID: string) => void;\n  detailReferencesToggle: (spanID: string) => void;\n  detailReferenceItemToggle: (spanID: string, reference: TraceSpanReference) => void;\n  detailProcessToggle: (spanID: string) => void;\n  detailTagsToggle: (spanID: string) => void;\n  detailToggle: (spanID: string) => void;\n  setTrace: (trace: Trace | TNil, uiFind: string | TNil) => void;\n  addHoverIndentGuideId: (spanID: string) => void;\n  removeHoverIndentGuideId: (spanID: string) => void;\n  linksGetter: (span: TraceSpan, items: TraceKeyValuePair[], itemIndex: number) => TraceLink[];\n  theme: GrafanaTheme2;\n  createSpanLink?: SpanLinkFunc;\n  scrollElement?: Element;\n  focusedSpanId?: string;\n  focusedSpanIdForSearch: string;\n  createFocusSpanLink: (traceId: string, spanId: string) => LinkModel;\n  topOfExploreViewRef?: RefObject<HTMLDivElement>;\n};\n\ntype State = {\n  // Will be set to real height of the component so it can be passed down to size some other elements.\n  height: number;\n};\n\nconst NUM_TICKS = 5;\n\n/**\n * `TraceTimelineViewer` now renders the header row because it is sensitive to\n * `props.viewRange.time.cursor`. If `VirtualizedTraceView` renders it, it will\n * re-render the ListView every time the cursor is moved on the trace minimap\n * or `TimelineHeaderRow`.\n */\nexport class UnthemedTraceTimelineViewer extends React.PureComponent<TProps, State> {\n  constructor(props: TProps) {\n    super(props);\n    this.state = { height: 0 };\n  }\n\n  componentDidMount() {\n    mergeShortcuts({\n      collapseAll: this.collapseAll,\n      expandAll: this.expandAll,\n      collapseOne: this.collapseOne,\n      expandOne: this.expandOne,\n    });\n  }\n\n  collapseAll = () => {\n    this.props.collapseAll(this.props.trace.spans);\n  };\n\n  collapseOne = () => {\n    this.props.collapseOne(this.props.trace.spans);\n  };\n\n  expandAll = () => {\n    this.props.expandAll();\n  };\n\n  expandOne = () => {\n    this.props.expandOne(this.props.trace.spans);\n  };\n\n  render() {\n    const {\n      setSpanNameColumnWidth,\n      updateNextViewRangeTime,\n      updateViewRangeTime,\n      viewRange,\n      createLinkToExternalSpan,\n      traceTimeline,\n      theme,\n      topOfExploreViewRef,\n      focusedSpanIdForSearch,\n      ...rest\n    } = this.props;\n    const { trace } = rest;\n    const styles = getStyles(theme);\n\n    return (\n      <ExternalLinkContext.Provider value={createLinkToExternalSpan}>\n        <div\n          className={styles.TraceTimelineViewer}\n          ref={(ref: HTMLDivElement | null) => ref && this.setState({ height: ref.getBoundingClientRect().height })}\n        >\n          <TimelineHeaderRow\n            duration={trace.duration}\n            nameColumnWidth={traceTimeline.spanNameColumnWidth}\n            numTicks={NUM_TICKS}\n            onCollapseAll={this.collapseAll}\n            onCollapseOne={this.collapseOne}\n            onColummWidthChange={setSpanNameColumnWidth}\n            onExpandAll={this.expandAll}\n            onExpandOne={this.expandOne}\n            viewRangeTime={viewRange.time}\n            updateNextViewRangeTime={updateNextViewRangeTime}\n            updateViewRangeTime={updateViewRangeTime}\n            columnResizeHandleHeight={this.state.height}\n          />\n          <VirtualizedTraceView\n            {...rest}\n            {...traceTimeline}\n            setSpanNameColumnWidth={setSpanNameColumnWidth}\n            currentViewRangeTime={viewRange.time.current}\n            topOfExploreViewRef={topOfExploreViewRef}\n            focusedSpanIdForSearch={focusedSpanIdForSearch}\n          />\n        </div>\n      </ExternalLinkContext.Provider>\n    );\n  }\n}\n\nexport default withTheme2(UnthemedTraceTimelineViewer);\n","// Copyright (c) 2018 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport cx from 'classnames';\nimport React from 'react';\nimport IoAndroidOpen from 'react-icons/lib/io/android-open';\n\nimport { useStyles2 } from '@grafana/ui';\n\nexport const getStyles = () => {\n  return {\n    NewWindowIconLarge: css`\n      label: NewWindowIconLarge;\n      font-size: 1.5em;\n    `,\n  };\n};\n\ntype Props = {\n  isLarge?: boolean;\n  className?: string;\n};\n\nexport default function NewWindowIcon(props: Props) {\n  const { isLarge, className, ...rest } = props;\n  const styles = useStyles2(getStyles);\n  const cls = cx({ [styles.NewWindowIconLarge]: isLarge }, className);\n  return <IoAndroidOpen className={cls} {...rest} />;\n}\n\nNewWindowIcon.defaultProps = {\n  isLarge: false,\n};\n","// Copyright (c) 2019 The Jaeger Authors.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport * as React from 'react';\n\nimport NewWindowIcon from './NewWindowIcon';\n\ntype Link = {\n  text: string;\n  url: string;\n};\n\ntype ExternalLinksProps = {\n  links: Link[];\n  className?: string;\n};\n\nconst LinkValue = (props: { href: string; title?: string; children?: React.ReactNode; className?: string }) => (\n  <a href={props.href} title={props.title} target=\"_blank\" rel=\"noopener noreferrer\" className={props.className}>\n    {props.children} <NewWindowIcon />\n  </a>\n);\n\nexport default function ExternalLinks(props: ExternalLinksProps) {\n  const { links } = props;\n  // TODO: handle multiple items\n  return <LinkValue href={links[0].url} title={links[0].text} className={props.className} />;\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nexport const FALLBACK_DAG_MAX_NUM_SERVICES = 100 as 100;\nexport const FALLBACK_TRACE_NAME = '<trace-without-root-span>' as '<trace-without-root-span>';\n\nexport const FETCH_DONE = 'FETCH_DONE' as 'FETCH_DONE';\nexport const FETCH_ERROR = 'FETCH_ERROR' as 'FETCH_ERROR';\nexport const FETCH_LOADING = 'FETCH_LOADING' as 'FETCH_LOADING';\n\nexport const fetchedState = {\n  DONE: FETCH_DONE,\n  ERROR: FETCH_ERROR,\n  LOADING: FETCH_LOADING,\n};\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport * as React from 'react';\n\nimport { useStyles2 } from '@grafana/ui';\n\nconst getStyles = () => {\n  return {\n    BreakableText: css`\n      label: BreakableText;\n      display: inline-block;\n      white-space: pre;\n    `,\n  };\n};\n\nconst WORD_RX = /\\W*\\w+\\W*/g;\n\ntype Props = {\n  text: string;\n  className?: string;\n  wordRegexp?: RegExp;\n};\n\n// TODO typescript doesn't understand text or null as react nodes\n// https://github.com/Microsoft/TypeScript/issues/21699\nexport default function BreakableText(\n  props: Props\n): any /* React.ReactNode /* React.ReactElement | React.ReactElement[] \\*\\/ */ {\n  const { className, text, wordRegexp = WORD_RX } = props;\n  const styles = useStyles2(getStyles);\n  if (!text) {\n    return typeof text === 'string' ? text : null;\n  }\n  const spans = [];\n  wordRegexp.exec('');\n  // if the given text has no words, set the first match to the entire text\n  let match: RegExpExecArray | string[] | null = wordRegexp.exec(text) || [text];\n  while (match) {\n    spans.push(\n      <span key={`${text}-${spans.length}`} className={className || styles.BreakableText}>\n        {match[0]}\n      </span>\n    );\n    match = wordRegexp.exec(text);\n  }\n  return spans;\n}\n\nBreakableText.defaultProps = {\n  wordRegexp: WORD_RX,\n};\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport cx from 'classnames';\nimport * as React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useStyles2 } from '@grafana/ui';\n\nimport { FALLBACK_TRACE_NAME } from '../constants';\nimport { TNil } from '../types';\n\nimport BreakableText from './BreakableText';\n\nconst getStyles = (theme: GrafanaTheme2) => {\n  return {\n    TraceName: css`\n      label: TraceName;\n      font-size: ${theme.typography.size.lg};\n    `,\n  };\n};\n\ntype Props = {\n  className?: string;\n  traceName?: string | TNil;\n};\n\nexport default function TraceName(props: Props) {\n  const { className, traceName } = props;\n  const styles = useStyles2(getStyles);\n  const text = String(traceName || FALLBACK_TRACE_NAME);\n  const title = <BreakableText text={text} />;\n  return <span className={cx(styles.TraceName, className)}>{title}</span>;\n}\n","//      \nvar hasOwn = function hasOwn(object, key) {\n  return Object.prototype.hasOwnProperty.call(object, key);\n};\n\nfunction deepEquals(equals, deepObjects) {\n  function deep(valueA, valueB) {\n    if (equals(valueA, valueB)) {\n      return true;\n    }\n\n    if (Array.isArray(valueA)) {\n      if (!Array.isArray(valueB) || valueA.length !== valueB.length) {\n        return false;\n      } // Check deep equality of each value in A against the same indexed value in B\n\n\n      if (!valueA.every(function (value, index) {\n        return deep(value, valueB[index]);\n      })) {\n        return false;\n      } // could not find unequal items\n\n\n      return true;\n    }\n\n    if (Array.isArray(valueB)) {\n      return false;\n    }\n\n    if (typeof valueA === \"object\") {\n      if (typeof valueB !== \"object\") {\n        return false;\n      }\n\n      var isANull = valueA === null;\n      var isBNull = valueB === null;\n\n      if (isANull || isBNull) {\n        return isANull === isBNull;\n      }\n\n      var aKeys = Object.keys(valueA);\n      var bKeys = Object.keys(valueB);\n\n      if (aKeys.length !== bKeys.length) {\n        return false;\n      } // Should we compare with shallow equivalence or deep equivalence?\n\n\n      var equalityChecker = deepObjects ? deep : equals; // Check if objects share same keys, and each of those keys are equal\n\n      if (!aKeys.every(function (aKey) {\n        return hasOwn(valueA, aKey) && hasOwn(valueB, aKey) && equalityChecker(valueA[aKey], valueB[aKey]);\n      })) {\n        return false;\n      } // could not find unequal keys or values\n\n\n      return true;\n    }\n\n    return false;\n  }\n\n  return deep;\n}\n\n//      \nvar findIndex = function findIndex(arr, fn) {\n  for (var i = 0; i < arr.length; i++) {\n    if (fn(arr[i])) {\n      return i;\n    }\n  }\n\n  return -1;\n};\n\nfunction lruCache(limit, equals) {\n  var entries = [];\n\n  function get(key) {\n    var cacheIndex = findIndex(entries, function (entry) {\n      return equals(key, entry.key);\n    }); // We found a cached entry\n\n    if (cacheIndex > -1) {\n      var entry = entries[cacheIndex]; // Cached entry not at top of cache, move it to the top\n\n      if (cacheIndex > 0) {\n        entries.splice(cacheIndex, 1);\n        entries.unshift(entry);\n      }\n\n      return entry.value;\n    } // No entry found in cache, return null\n\n\n    return undefined;\n  }\n\n  function put(key, value) {\n    if (!get(key)) {\n      entries.unshift({\n        key: key,\n        value: value\n      });\n\n      if (entries.length > limit) {\n        entries.pop();\n      }\n    }\n  }\n\n  return {\n    get: get,\n    put: put\n  };\n}\n\n//      \nfunction singletonCache(equals) {\n  var entry;\n  return {\n    get: function get(key) {\n      if (entry && equals(key, entry.key)) {\n        return entry.value;\n      }\n    },\n    put: function put(key, value) {\n      entry = {\n        key: key,\n        value: value\n      };\n    }\n  };\n}\n\n//      \n\nfunction createCache(limit, equals) {\n  return limit === 1 ? singletonCache(equals) : lruCache(limit, equals);\n}\n\nfunction createEqualsFn(basicEquals, deepObjects) {\n  // Choose strategy for basic or deep object equals\n  var equals = deepObjects ? deepEquals(basicEquals, deepObjects) : basicEquals;\n  return function (valueA, valueB) {\n    // The arguments are always the argument array-like objects\n    // Different lengths means they are not the same\n    if (valueA.length !== valueB.length) {\n      return false;\n    } // Compare the values\n\n\n    for (var index = 0; index < valueA.length; index += 1) {\n      if (!equals(valueA[index], valueB[index])) {\n        return false;\n      }\n    } // Found no conflicts\n\n\n    return true;\n  };\n}\n\nfunction memoize() {\n  var limit = 1;\n\n  var equals = function equals(valueA, valueB) {\n    return valueA === valueB;\n  };\n\n  var deepObjects = false;\n\n  for (var _len = arguments.length, config = new Array(_len), _key = 0; _key < _len; _key++) {\n    config[_key] = arguments[_key];\n  }\n\n  if (typeof config[0] === \"number\") {\n    limit = config.shift();\n  }\n\n  if (typeof config[0] === \"function\") {\n    equals = config.shift();\n  } else if (typeof config[0] === \"undefined\") {\n    // Support passing undefined equal argument;\n    config.shift();\n  }\n\n  if (typeof config[0] === \"boolean\") {\n    deepObjects = config[0];\n  }\n\n  var cache = createCache(limit, createEqualsFn(equals, deepObjects));\n  return function (fn) {\n    return function () {\n      for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n        args[_key2] = arguments[_key2];\n      }\n\n      var value = cache.get(args);\n\n      if (value === undefined) {\n        value = fn.apply(fn, args);\n        cache.put(args, value);\n      }\n\n      return value;\n    };\n  };\n}\n\nexport default memoize;\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport deepFreeze from 'deep-freeze';\n\nimport { FALLBACK_DAG_MAX_NUM_SERVICES } from './index';\n\nexport default deepFreeze(\n  Object.defineProperty(\n    {\n      archiveEnabled: false,\n      dependencies: {\n        dagMaxNumServices: FALLBACK_DAG_MAX_NUM_SERVICES,\n        menuEnabled: true,\n      },\n      linkPatterns: [],\n      menu: [\n        {\n          label: 'About Jaeger',\n          items: [\n            {\n              label: 'GitHub',\n              url: 'https://github.com/uber/jaeger',\n            },\n            {\n              label: 'Docs',\n              url: 'http://jaeger.readthedocs.io/en/latest/',\n            },\n            {\n              label: 'Twitter',\n              url: 'https://twitter.com/JaegerTracing',\n            },\n            {\n              label: 'Discussion Group',\n              url: 'https://groups.google.com/forum/#!forum/jaeger-tracing',\n            },\n            {\n              label: 'Gitter.im',\n              url: 'https://gitter.im/jaegertracing/Lobby',\n            },\n            {\n              label: 'Blog',\n              url: 'https://medium.com/jaegertracing/',\n            },\n          ],\n        },\n      ],\n      search: {\n        maxLookback: {\n          label: '2 Days',\n          value: '2d',\n        },\n        maxLimit: 1500,\n      },\n      tracking: {\n        gaID: null,\n        trackErrors: true,\n      },\n    },\n    // fields that should be individually merged vs wholesale replaced\n    '__mergeFields',\n    { value: ['dependencies', 'search', 'tracking'] }\n  )\n);\n\nexport const deprecations = [\n  {\n    formerKey: 'dependenciesMenuEnabled',\n    currentKey: 'dependencies.menuEnabled',\n  },\n  {\n    formerKey: 'gaTrackingID',\n    currentKey: 'tracking.gaID',\n  },\n];\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { get as _get } from 'lodash';\n\nimport defaultConfig from '../../constants/default-config';\n\n/**\n * Merge the embedded config from the query service (if present) with the\n * default config from `../../constants/default-config`.\n */\nexport default function getConfig() {\n  return defaultConfig;\n}\n\nexport function getConfigValue(path: string) {\n  return _get(getConfig(), path);\n}\n","// Copyright (c) 2017 The Jaeger Authors.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { TraceSpan } from '../types/trace';\n\n/**\n * Searches the span.references to find 'CHILD_OF' reference type or returns null.\n * @param  {TraceSpan} span The span whose parent is to be returned.\n * @returns {TraceSpan|null} The parent span if there is one, null otherwise.\n */\nexport function getParent(span: TraceSpan) {\n  const parentRef = span.references ? span.references.find((ref) => ref.refType === 'CHILD_OF') : null;\n  return parentRef ? parentRef.span : null;\n}\n","// Copyright (c) 2017 The Jaeger Authors.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { uniq as _uniq } from 'lodash';\nimport memoize from 'lru-memoize';\n\nimport { TNil } from '../types';\nimport { TraceSpan, TraceLink, TraceKeyValuePair, Trace } from '../types/trace';\nimport { getConfigValue } from '../utils/config/get-config';\n\nimport { getParent } from './span';\n\nconst parameterRegExp = /#\\{([^{}]*)\\}/g;\n\ntype ProcessedTemplate = {\n  parameters: string[];\n  template: (template: { [key: string]: any }) => string;\n};\n\ntype ProcessedLinkPattern = {\n  object: any;\n  type: (link: string) => boolean;\n  key: (link: string) => boolean;\n  value: (value: any) => boolean;\n  url: ProcessedTemplate;\n  text: ProcessedTemplate;\n  parameters: string[];\n};\n\ntype TLinksRV = Array<{ url: string; text: string }>;\n\nfunction getParamNames(str: string) {\n  const names = new Set<string>();\n  str.replace(parameterRegExp, (match, name) => {\n    names.add(name);\n    return match;\n  });\n  return Array.from(names);\n}\n\nfunction stringSupplant(str: string, encodeFn: (unencoded: any) => string, map: Record<string, any>) {\n  return str.replace(parameterRegExp, (_, name) => {\n    const value = map[name];\n    return value == null ? '' : encodeFn(value);\n  });\n}\n\nexport function processTemplate(template: any, encodeFn: (unencoded: any) => string): ProcessedTemplate {\n  if (typeof template !== 'string') {\n    /*\n\n    // kept on ice until #123 is implemented:\n    if (template && Array.isArray(template.parameters) && (typeof template.template === 'function')) {\n      return template;\n    }\n\n    */\n    throw new Error('Invalid template');\n  }\n  return {\n    parameters: getParamNames(template),\n    template: stringSupplant.bind(null, template, encodeFn),\n  };\n}\n\nexport function createTestFunction(entry: any) {\n  if (typeof entry === 'string') {\n    return (arg: any) => arg === entry;\n  }\n  if (Array.isArray(entry)) {\n    return (arg: any) => entry.indexOf(arg) > -1;\n  }\n  /*\n\n  // kept on ice until #123 is implemented:\n  if (entry instanceof RegExp) {\n    return (arg: any) => entry.test(arg);\n  }\n  if (typeof entry === 'function') {\n    return entry;\n  }\n\n  */\n  if (entry == null) {\n    return () => true;\n  }\n  throw new Error(`Invalid value: ${entry}`);\n}\n\nconst identity = (a: any): typeof a => a;\n\nexport function processLinkPattern(pattern: any): ProcessedLinkPattern | TNil {\n  try {\n    const url = processTemplate(pattern.url, encodeURIComponent);\n    const text = processTemplate(pattern.text, identity);\n    return {\n      object: pattern,\n      type: createTestFunction(pattern.type),\n      key: createTestFunction(pattern.key),\n      value: createTestFunction(pattern.value),\n      url,\n      text,\n      parameters: _uniq(url.parameters.concat(text.parameters)),\n    };\n  } catch (error) {\n    // eslint-disable-next-line no-console\n    console.error(`Ignoring invalid link pattern: ${error}`, pattern);\n    return null;\n  }\n}\n\nexport function getParameterInArray(name: string, array: TraceKeyValuePair[]) {\n  if (array) {\n    return array.find((entry) => entry.key === name);\n  }\n  return undefined;\n}\n\nexport function getParameterInAncestor(name: string, span: TraceSpan) {\n  let currentSpan: TraceSpan | TNil = span;\n  while (currentSpan) {\n    const result = getParameterInArray(name, currentSpan.tags) || getParameterInArray(name, currentSpan.process.tags);\n    if (result) {\n      return result;\n    }\n    currentSpan = getParent(currentSpan);\n  }\n  return undefined;\n}\n\nfunction callTemplate(template: ProcessedTemplate, data: any) {\n  return template.template(data);\n}\n\nexport function computeTraceLink(linkPatterns: ProcessedLinkPattern[], trace: Trace) {\n  const result: TLinksRV = [];\n  const validKeys = (Object.keys(trace) as Array<keyof Trace>).filter(\n    (key) => typeof trace[key] === 'string' || trace[key] === 'number'\n  );\n\n  linkPatterns\n    .filter((pattern) => pattern.type('traces'))\n    .forEach((pattern) => {\n      const parameterValues: Record<string, any> = {};\n      const allParameters = pattern.parameters.every((parameter) => {\n        const key = parameter as keyof Trace;\n        if (validKeys.includes(key)) {\n          // At this point is safe to access to trace object using parameter variable because\n          // we validated parameter against validKeys, this implies that parameter a keyof Trace.\n          parameterValues[parameter] = trace[key];\n          return true;\n        }\n        return false;\n      });\n      if (allParameters) {\n        result.push({\n          url: callTemplate(pattern.url, parameterValues),\n          text: callTemplate(pattern.text, parameterValues),\n        });\n      }\n    });\n\n  return result;\n}\n\nexport function computeLinks(\n  linkPatterns: ProcessedLinkPattern[],\n  span: TraceSpan,\n  items: TraceKeyValuePair[],\n  itemIndex: number\n) {\n  const item = items[itemIndex];\n  let type = 'logs';\n  const processTags = span.process.tags === items;\n  if (processTags) {\n    type = 'process';\n  }\n  const spanTags = span.tags === items;\n  if (spanTags) {\n    type = 'tags';\n  }\n  const result: Array<{ url: string; text: string }> = [];\n  linkPatterns.forEach((pattern) => {\n    if (pattern.type(type) && pattern.key(item.key) && pattern.value(item.value)) {\n      const parameterValues: Record<string, any> = {};\n      const allParameters = pattern.parameters.every((parameter) => {\n        let entry = getParameterInArray(parameter, items);\n        if (!entry && !processTags) {\n          // do not look in ancestors for process tags because the same object may appear in different places in the hierarchy\n          // and the cache in getLinks uses that object as a key\n          entry = getParameterInAncestor(parameter, span);\n        }\n        if (entry) {\n          parameterValues[parameter] = entry.value;\n          return true;\n        }\n        // eslint-disable-next-line no-console\n        console.warn(\n          `Skipping link pattern, missing parameter ${parameter} for key ${item.key} in ${type}.`,\n          pattern.object\n        );\n        return false;\n      });\n      if (allParameters) {\n        result.push({\n          url: callTemplate(pattern.url, parameterValues),\n          text: callTemplate(pattern.text, parameterValues),\n        });\n      }\n    }\n  });\n  return result;\n}\n\nexport function createGetLinks(linkPatterns: ProcessedLinkPattern[], cache: WeakMap<TraceKeyValuePair, TraceLink[]>) {\n  return (span: TraceSpan, items: TraceKeyValuePair[], itemIndex: number) => {\n    if (linkPatterns.length === 0) {\n      return [];\n    }\n    const item = items[itemIndex];\n    let result = cache.get(item);\n    if (!result) {\n      result = computeLinks(linkPatterns, span, items, itemIndex);\n      cache.set(item, result);\n    }\n    return result;\n  };\n}\n\nconst processedLinks: ProcessedLinkPattern[] = (getConfigValue('linkPatterns') || [])\n  .map(processLinkPattern)\n  .filter(Boolean);\n\nexport const getTraceLinks: (trace: Trace | undefined) => TLinksRV = memoize(10)((trace: Trace | undefined) => {\n  const result: TLinksRV = [];\n  if (!trace) {\n    return result;\n  }\n  return computeTraceLink(processedLinks, trace);\n});\n\nexport default createGetLinks(processedLinks, new WeakMap());\n","// Copyright (c) 2020 The Jaeger Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { memoize } from 'lodash';\n\nimport { TraceSpan } from '../types/trace';\n\nexport function _getTraceNameImpl(spans: TraceSpan[]) {\n  // Use a span with no references to another span in given array\n  // prefering the span with the fewest references\n  // using start time as a tie breaker\n  let candidateSpan: TraceSpan | undefined;\n  const allIDs: Set<string> = new Set(spans.map(({ spanID }) => spanID));\n\n  for (let i = 0; i < spans.length; i++) {\n    const hasInternalRef =\n      spans[i].references &&\n      spans[i].references.some(({ traceID, spanID }) => traceID === spans[i].traceID && allIDs.has(spanID));\n    if (hasInternalRef) {\n      continue;\n    }\n\n    if (!candidateSpan) {\n      candidateSpan = spans[i];\n      continue;\n    }\n\n    const thisRefLength = (spans[i].references && spans[i].references.length) || 0;\n    const candidateRefLength = (candidateSpan.references && candidateSpan.references.length) || 0;\n\n    if (\n      thisRefLength < candidateRefLength ||\n      (thisRefLength === candidateRefLength && spans[i].startTime < candidateSpan.startTime)\n    ) {\n      candidateSpan = spans[i];\n    }\n  }\n  return candidateSpan ? `${candidateSpan.process.serviceName}: ${candidateSpan.operationName}` : '';\n}\n\nexport const getTraceName = memoize(_getTraceNameImpl, (spans: TraceSpan[]) => {\n  if (!spans.length) {\n    return 0;\n  }\n  return spans[0].traceID;\n});\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport * as React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { withTheme2, stylesFactory } from '@grafana/ui';\n\nimport { autoColor } from '../../Theme';\nimport { TNil } from '../../types';\nimport { getRgbColorByKey } from '../../utils/color-generator';\n\nimport renderIntoCanvas from './render-into-canvas';\n\nconst getStyles = stylesFactory((theme: GrafanaTheme2) => {\n  return {\n    CanvasSpanGraph: css`\n      label: CanvasSpanGraph;\n      background: ${autoColor(theme, '#fafafa')};\n      height: 60px;\n      position: absolute;\n      width: 100%;\n    `,\n  };\n});\n\ntype CanvasSpanGraphProps = {\n  items: Array<{ valueWidth: number; valueOffset: number; serviceName: string }>;\n  valueWidth: number;\n  theme: GrafanaTheme2;\n};\n\nexport class UnthemedCanvasSpanGraph extends React.PureComponent<CanvasSpanGraphProps> {\n  _canvasElm: HTMLCanvasElement | TNil;\n\n  constructor(props: CanvasSpanGraphProps) {\n    super(props);\n    this._canvasElm = undefined;\n  }\n\n  getColor = (key: string) => getRgbColorByKey(key, this.props.theme);\n\n  componentDidMount() {\n    this._draw();\n  }\n\n  componentDidUpdate() {\n    this._draw();\n  }\n\n  _setCanvasRef = (elm: HTMLCanvasElement | TNil) => {\n    this._canvasElm = elm;\n  };\n\n  _draw() {\n    if (this._canvasElm) {\n      const { valueWidth: totalValueWidth, items } = this.props;\n      renderIntoCanvas(this._canvasElm, items, totalValueWidth, this.getColor, autoColor(this.props.theme, '#fff'));\n    }\n  }\n\n  render() {\n    return <canvas className={getStyles(this.props.theme).CanvasSpanGraph} ref={this._setCanvasRef} />;\n  }\n}\n\nexport default withTheme2(UnthemedCanvasSpanGraph);\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { TNil } from '../..';\n\n// exported for tests\nexport const ITEM_ALPHA = 0.8;\nexport const MIN_ITEM_HEIGHT = 2;\nexport const MAX_TOTAL_HEIGHT = 200;\nexport const MIN_ITEM_WIDTH = 10;\nexport const MIN_TOTAL_HEIGHT = 60;\nexport const MAX_ITEM_HEIGHT = 6;\n\nexport default function renderIntoCanvas(\n  canvas: HTMLCanvasElement,\n  items: Array<{ valueWidth: number; valueOffset: number; serviceName: string }>,\n  totalValueWidth: number,\n  getFillColor: (serviceName: string) => [number, number, number],\n  bgColor: string\n) {\n  const fillCache: Map<string, string | TNil> = new Map();\n  const cHeight = items.length < MIN_TOTAL_HEIGHT ? MIN_TOTAL_HEIGHT : Math.min(items.length, MAX_TOTAL_HEIGHT);\n  const cWidth = window.innerWidth * 2;\n  // eslint-disable-next-line no-param-reassign\n  canvas.width = cWidth;\n  // eslint-disable-next-line no-param-reassign\n  canvas.height = cHeight;\n  const itemHeight = Math.min(MAX_ITEM_HEIGHT, Math.max(MIN_ITEM_HEIGHT, cHeight / items.length));\n  const itemYChange = cHeight / items.length;\n\n  const ctx = canvas.getContext('2d', { alpha: false }) as CanvasRenderingContext2D;\n  ctx.fillStyle = bgColor;\n  ctx.fillRect(0, 0, cWidth, cHeight);\n  for (let i = 0; i < items.length; i++) {\n    const { valueWidth, valueOffset, serviceName } = items[i];\n    const x = (valueOffset / totalValueWidth) * cWidth;\n    let width = (valueWidth / totalValueWidth) * cWidth;\n    if (width < MIN_ITEM_WIDTH) {\n      width = MIN_ITEM_WIDTH;\n    }\n    let fillStyle = fillCache.get(serviceName);\n    if (!fillStyle) {\n      fillStyle = `rgba(${getFillColor(serviceName).concat(ITEM_ALPHA).join()})`;\n      fillCache.set(serviceName, fillStyle);\n    }\n    ctx.fillStyle = fillStyle;\n    ctx.fillRect(x, i * itemYChange, width, itemHeight);\n  }\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport React from 'react';\n\nimport { useStyles2 } from '@grafana/ui';\n\nimport { formatDuration } from '../../utils/date';\n\nconst getStyles = () => {\n  return {\n    TickLabels: css`\n      label: TickLabels;\n      height: 1rem;\n      position: relative;\n    `,\n    TickLabelsLabel: css`\n      label: TickLabelsLabel;\n      color: #717171;\n      font-size: 0.7rem;\n      position: absolute;\n      user-select: none;\n    `,\n  };\n};\n\ntype TickLabelsProps = {\n  numTicks: number;\n  duration: number;\n};\n\nexport default function TickLabels(props: TickLabelsProps) {\n  const { numTicks, duration } = props;\n  const styles = useStyles2(getStyles);\n\n  const ticks = [];\n  for (let i = 0; i < numTicks + 1; i++) {\n    const portion = i / numTicks;\n    const style = portion === 1 ? { right: '0%' } : { left: `${portion * 100}%` };\n    ticks.push(\n      <div key={portion} className={styles.TickLabelsLabel} style={style} data-test=\"tick\">\n        {formatDuration(duration * portion)}\n      </div>\n    );\n  }\n\n  return <div className={styles.TickLabels}>{ticks}</div>;\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport React from 'react';\n\nimport { useStyles2 } from '@grafana/ui';\n\nconst getStyles = () => {\n  return {\n    GraphTick: css`\n      label: GraphTick;\n      stroke: #aaa;\n      stroke-width: 1px;\n    `,\n  };\n};\n\ntype GraphTicksProps = {\n  numTicks: number;\n};\n\nexport default function GraphTicks(props: GraphTicksProps) {\n  const { numTicks } = props;\n  const styles = useStyles2(getStyles);\n  const ticks = [];\n  // i starts at 1, limit is `i < numTicks` so the first and last ticks aren't drawn\n  for (let i = 1; i < numTicks; i++) {\n    const x = `${(i / numTicks) * 100}%`;\n    ticks.push(<line className={styles.GraphTick} x1={x} y1=\"0%\" x2={x} y2=\"100%\" key={i / numTicks} />);\n  }\n\n  return (\n    <g data-test=\"ticks\" aria-hidden=\"true\">\n      {ticks}\n    </g>\n  );\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport cx from 'classnames';\nimport React from 'react';\n\nimport { useStyles2 } from '@grafana/ui';\n\nexport const getStyles = () => {\n  return {\n    ScrubberHandleExpansion: cx(\n      css`\n        label: ScrubberHandleExpansion;\n        cursor: col-resize;\n        fill-opacity: 0;\n        fill: #44f;\n      `,\n      'scrubber-handle-expansion'\n    ),\n    ScrubberHandle: cx(\n      css`\n        label: ScrubberHandle;\n        cursor: col-resize;\n        fill: #555;\n      `,\n      'scrubber-handle'\n    ),\n    ScrubberLine: cx(\n      css`\n        label: ScrubberLine;\n        pointer-events: none;\n        stroke: #555;\n      `,\n      'scrubber-line'\n    ),\n    ScrubberDragging: css`\n      label: ScrubberDragging;\n      & .scrubber-handle-expansion {\n        fill-opacity: 1;\n      }\n      & .scrubber-handle {\n        fill: #44f;\n      }\n      & > .scrubber-line {\n        stroke: #44f;\n      }\n    `,\n    ScrubberHandles: css`\n      label: ScrubberHandles;\n      &:hover > .scrubber-handle-expansion {\n        fill-opacity: 1;\n      }\n      &:hover > .scrubber-handle {\n        fill: #44f;\n      }\n      &:hover + .scrubber.line {\n        stroke: #44f;\n      }\n    `,\n  };\n};\n\ntype ScrubberProps = {\n  isDragging: boolean;\n  position: number;\n  onMouseDown: (evt: React.MouseEvent<any>) => void;\n  onMouseEnter: (evt: React.MouseEvent<any>) => void;\n  onMouseLeave: (evt: React.MouseEvent<any>) => void;\n};\n\nexport default function Scrubber({ isDragging, onMouseDown, onMouseEnter, onMouseLeave, position }: ScrubberProps) {\n  const xPercent = `${position * 100}%`;\n  const styles = useStyles2(getStyles);\n  const className = cx({ [styles.ScrubberDragging]: isDragging });\n  return (\n    <g className={className}>\n      <g\n        className={styles.ScrubberHandles}\n        onMouseDown={onMouseDown}\n        onMouseEnter={onMouseEnter}\n        onMouseLeave={onMouseLeave}\n      >\n        {/* handleExpansion is only visible when `isDragging` is true */}\n        <rect\n          x={xPercent}\n          className={styles.ScrubberHandleExpansion}\n          style={{ transform: `translate(-4.5px)` }}\n          width=\"9\"\n          height=\"20\"\n        />\n        <rect\n          x={xPercent}\n          className={styles.ScrubberHandle}\n          style={{ transform: `translate(-1.5px)` }}\n          width=\"3\"\n          height=\"20\"\n        />\n      </g>\n      <line className={styles.ScrubberLine} y2=\"100%\" x1={xPercent} x2={xPercent} />\n    </g>\n  );\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport cx from 'classnames';\nimport * as React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { withTheme2, stylesFactory, Button } from '@grafana/ui';\n\nimport { TUpdateViewRangeTimeFunction, ViewRange, ViewRangeTimeUpdate, TNil } from '../..';\nimport { autoColor } from '../../Theme';\nimport DraggableManager, { DraggableBounds, DraggingUpdate, EUpdateTypes } from '../../utils/DraggableManager';\n\nimport GraphTicks from './GraphTicks';\nimport Scrubber from './Scrubber';\n\nexport const getStyles = stylesFactory((theme: GrafanaTheme2) => {\n  // Need this cause emotion will merge emotion generated classes into single className if used with cx from emotion\n  // package and the selector won't work\n  const ViewingLayerResetZoomHoverClassName = 'JaegerUiComponents__ViewingLayerResetZoomHoverClassName';\n  const ViewingLayerResetZoom = css`\n    label: ViewingLayerResetZoom;\n    display: none;\n    position: absolute;\n    right: 1%;\n    top: 10%;\n    z-index: 1;\n  `;\n  return {\n    ViewingLayer: css`\n      label: ViewingLayer;\n      cursor: vertical-text;\n      position: relative;\n      z-index: 1;\n      &:hover > .${ViewingLayerResetZoomHoverClassName} {\n        display: unset;\n      }\n    `,\n    ViewingLayerGraph: css`\n      label: ViewingLayerGraph;\n      border: 1px solid ${autoColor(theme, '#999')};\n      /* need !important here to overcome something from semantic UI */\n      overflow: visible !important;\n      position: relative;\n      transform-origin: 0 0;\n      width: 100%;\n    `,\n    ViewingLayerInactive: css`\n      label: ViewingLayerInactive;\n      fill: ${autoColor(theme, 'rgba(214, 214, 214, 0.5)')};\n    `,\n    ViewingLayerCursorGuide: css`\n      label: ViewingLayerCursorGuide;\n      stroke: ${autoColor(theme, '#f44')};\n      stroke-width: 1;\n    `,\n    ViewingLayerDraggedShift: css`\n      label: ViewingLayerDraggedShift;\n      fill-opacity: 0.2;\n    `,\n    ViewingLayerDrag: css`\n      label: ViewingLayerDrag;\n      fill: ${autoColor(theme, '#44f')};\n    `,\n    ViewingLayerFullOverlay: css`\n      label: ViewingLayerFullOverlay;\n      bottom: 0;\n      cursor: col-resize;\n      left: 0;\n      position: fixed;\n      right: 0;\n      top: 0;\n      user-select: none;\n    `,\n    ViewingLayerResetZoom,\n    ViewingLayerResetZoomHoverClassName,\n  };\n});\n\ntype ViewingLayerProps = {\n  height: number;\n  numTicks: number;\n  updateViewRangeTime: TUpdateViewRangeTimeFunction;\n  updateNextViewRangeTime: (update: ViewRangeTimeUpdate) => void;\n  viewRange: ViewRange;\n  theme: GrafanaTheme2;\n};\n\ntype ViewingLayerState = {\n  /**\n   * Cursor line should not be drawn when the mouse is over the scrubber handle.\n   */\n  preventCursorLine: boolean;\n};\n\n/**\n * Designate the tags for the different dragging managers. Exported for tests.\n */\nexport const dragTypes = {\n  /**\n   * Tag for dragging the right scrubber, e.g. end of the current view range.\n   */\n  SHIFT_END: 'SHIFT_END',\n  /**\n   * Tag for dragging the left scrubber, e.g. start of the current view range.\n   */\n  SHIFT_START: 'SHIFT_START',\n  /**\n   * Tag for dragging a new view range.\n   */\n  REFRAME: 'REFRAME',\n};\n\n/**\n * Returns the layout information for drawing the view-range differential, e.g.\n * show what will change when the mouse is released. Basically, this is the\n * difference from the start of the drag to the current position.\n *\n * @returns {{ x: string, width: string, leadginX: string }}\n */\nfunction getNextViewLayout(start: number, position: number) {\n  const [left, right] = start < position ? [start, position] : [position, start];\n  return {\n    x: `${left * 100}%`,\n    width: `${(right - left) * 100}%`,\n    leadingX: `${position * 100}%`,\n  };\n}\n\n/**\n * `ViewingLayer` is rendered on top of the Canvas rendering of the minimap and\n * handles showing the current view range and handles mouse UX for modifying it.\n */\nexport class UnthemedViewingLayer extends React.PureComponent<ViewingLayerProps, ViewingLayerState> {\n  state: ViewingLayerState;\n\n  _root: Element | TNil;\n\n  /**\n   * `_draggerReframe` handles clicking and dragging on the `ViewingLayer` to\n   * redefined the view range.\n   */\n  _draggerReframe: DraggableManager;\n\n  /**\n   * `_draggerStart` handles dragging the left scrubber to adjust the start of\n   * the view range.\n   */\n  _draggerStart: DraggableManager;\n\n  /**\n   * `_draggerEnd` handles dragging the right scrubber to adjust the end of\n   * the view range.\n   */\n  _draggerEnd: DraggableManager;\n\n  constructor(props: ViewingLayerProps) {\n    super(props);\n\n    this._draggerReframe = new DraggableManager({\n      getBounds: this._getDraggingBounds,\n      onDragEnd: this._handleReframeDragEnd,\n      onDragMove: this._handleReframeDragUpdate,\n      onDragStart: this._handleReframeDragUpdate,\n      onMouseMove: this._handleReframeMouseMove,\n      onMouseLeave: this._handleReframeMouseLeave,\n      tag: dragTypes.REFRAME,\n    });\n\n    this._draggerStart = new DraggableManager({\n      getBounds: this._getDraggingBounds,\n      onDragEnd: this._handleScrubberDragEnd,\n      onDragMove: this._handleScrubberDragUpdate,\n      onDragStart: this._handleScrubberDragUpdate,\n      onMouseEnter: this._handleScrubberEnterLeave,\n      onMouseLeave: this._handleScrubberEnterLeave,\n      tag: dragTypes.SHIFT_START,\n    });\n\n    this._draggerEnd = new DraggableManager({\n      getBounds: this._getDraggingBounds,\n      onDragEnd: this._handleScrubberDragEnd,\n      onDragMove: this._handleScrubberDragUpdate,\n      onDragStart: this._handleScrubberDragUpdate,\n      onMouseEnter: this._handleScrubberEnterLeave,\n      onMouseLeave: this._handleScrubberEnterLeave,\n      tag: dragTypes.SHIFT_END,\n    });\n\n    this._root = undefined;\n    this.state = {\n      preventCursorLine: false,\n    };\n  }\n\n  componentWillUnmount() {\n    this._draggerReframe.dispose();\n    this._draggerEnd.dispose();\n    this._draggerStart.dispose();\n  }\n\n  _setRoot = (elm: SVGElement | TNil) => {\n    this._root = elm;\n  };\n\n  _getDraggingBounds = (tag: string | TNil): DraggableBounds => {\n    if (!this._root) {\n      throw new Error('invalid state');\n    }\n    const { left: clientXLeft, width } = this._root.getBoundingClientRect();\n    const [viewStart, viewEnd] = this.props.viewRange.time.current;\n    let maxValue = 1;\n    let minValue = 0;\n    if (tag === dragTypes.SHIFT_START) {\n      maxValue = viewEnd;\n    } else if (tag === dragTypes.SHIFT_END) {\n      minValue = viewStart;\n    }\n    return { clientXLeft, maxValue, minValue, width };\n  };\n\n  _handleReframeMouseMove = ({ value }: DraggingUpdate) => {\n    this.props.updateNextViewRangeTime({ cursor: value });\n  };\n\n  _handleReframeMouseLeave = () => {\n    this.props.updateNextViewRangeTime({ cursor: null });\n  };\n\n  _handleReframeDragUpdate = ({ value }: DraggingUpdate) => {\n    const shift = value;\n    const { time } = this.props.viewRange;\n    const anchor = time.reframe ? time.reframe.anchor : shift;\n    const update = { reframe: { anchor, shift } };\n    this.props.updateNextViewRangeTime(update);\n  };\n\n  _handleReframeDragEnd = ({ manager, value }: DraggingUpdate) => {\n    const { time } = this.props.viewRange;\n    const anchor = time.reframe ? time.reframe.anchor : value;\n    const [start, end] = value < anchor ? [value, anchor] : [anchor, value];\n    manager.resetBounds();\n    this.props.updateViewRangeTime(start, end, 'minimap');\n  };\n\n  _handleScrubberEnterLeave = ({ type }: DraggingUpdate) => {\n    const preventCursorLine = type === EUpdateTypes.MouseEnter;\n    this.setState({ preventCursorLine });\n  };\n\n  _handleScrubberDragUpdate = ({ event, tag, type, value }: DraggingUpdate) => {\n    if (type === EUpdateTypes.DragStart) {\n      event.stopPropagation();\n    }\n    if (tag === dragTypes.SHIFT_START) {\n      this.props.updateNextViewRangeTime({ shiftStart: value });\n    } else if (tag === dragTypes.SHIFT_END) {\n      this.props.updateNextViewRangeTime({ shiftEnd: value });\n    }\n  };\n\n  _handleScrubberDragEnd = ({ manager, tag, value }: DraggingUpdate) => {\n    const [viewStart, viewEnd] = this.props.viewRange.time.current;\n    let update: [number, number];\n    if (tag === dragTypes.SHIFT_START) {\n      update = [value, viewEnd];\n    } else if (tag === dragTypes.SHIFT_END) {\n      update = [viewStart, value];\n    } else {\n      // to satisfy flow\n      throw new Error('bad state');\n    }\n    manager.resetBounds();\n    this.setState({ preventCursorLine: false });\n    this.props.updateViewRangeTime(update[0], update[1], 'minimap');\n  };\n\n  /**\n   * Resets the zoom to fully zoomed out.\n   */\n  _resetTimeZoomClickHandler = () => {\n    this.props.updateViewRangeTime(0, 1);\n  };\n\n  /**\n   * Renders the difference between where the drag started and the current\n   * position, e.g. the red or blue highlight.\n   *\n   * @returns React.Node[]\n   */\n  _getMarkers(from: number, to: number) {\n    const styles = getStyles(this.props.theme);\n    const layout = getNextViewLayout(from, to);\n    return [\n      <rect\n        key=\"fill\"\n        className={cx(styles.ViewingLayerDraggedShift, styles.ViewingLayerDrag)}\n        x={layout.x}\n        y=\"0\"\n        width={layout.width}\n        height={this.props.height - 2}\n      />,\n      <rect\n        key=\"edge\"\n        className={cx(styles.ViewingLayerDrag)}\n        x={layout.leadingX}\n        y=\"0\"\n        width=\"1\"\n        height={this.props.height - 2}\n      />,\n    ];\n  }\n\n  render() {\n    const { height, viewRange, numTicks, theme } = this.props;\n    const { preventCursorLine } = this.state;\n    const { current, cursor, shiftStart, shiftEnd, reframe } = viewRange.time;\n    const haveNextTimeRange = shiftStart != null || shiftEnd != null || reframe != null;\n    const [viewStart, viewEnd] = current;\n    let leftInactive = 0;\n    if (viewStart) {\n      leftInactive = viewStart * 100;\n    }\n    let rightInactive = 100;\n    if (viewEnd) {\n      rightInactive = 100 - viewEnd * 100;\n    }\n    let cursorPosition: string | undefined;\n    if (!haveNextTimeRange && cursor != null && !preventCursorLine) {\n      cursorPosition = `${cursor * 100}%`;\n    }\n    const styles = getStyles(theme);\n\n    return (\n      <div aria-hidden className={styles.ViewingLayer} style={{ height }}>\n        {(viewStart !== 0 || viewEnd !== 1) && (\n          <Button\n            onClick={this._resetTimeZoomClickHandler}\n            className={cx(styles.ViewingLayerResetZoom, styles.ViewingLayerResetZoomHoverClassName)}\n            type=\"button\"\n            variant=\"secondary\"\n          >\n            Reset Selection\n          </Button>\n        )}\n        <svg\n          height={height}\n          className={styles.ViewingLayerGraph}\n          ref={this._setRoot}\n          onMouseDown={this._draggerReframe.handleMouseDown}\n          onMouseLeave={this._draggerReframe.handleMouseLeave}\n          onMouseMove={this._draggerReframe.handleMouseMove}\n        >\n          {leftInactive > 0 && (\n            <rect x={0} y={0} height=\"100%\" width={`${leftInactive}%`} className={styles.ViewingLayerInactive} />\n          )}\n          {rightInactive > 0 && (\n            <rect\n              x={`${100 - rightInactive}%`}\n              y={0}\n              height=\"100%\"\n              width={`${rightInactive}%`}\n              className={styles.ViewingLayerInactive}\n            />\n          )}\n          <GraphTicks numTicks={numTicks} />\n          {cursorPosition && (\n            <line\n              className={styles.ViewingLayerCursorGuide}\n              x1={cursorPosition}\n              y1=\"0\"\n              x2={cursorPosition}\n              y2={height - 2}\n              strokeWidth=\"1\"\n            />\n          )}\n          {shiftStart != null && this._getMarkers(viewStart, shiftStart)}\n          {shiftEnd != null && this._getMarkers(viewEnd, shiftEnd)}\n          <Scrubber\n            isDragging={shiftStart != null}\n            onMouseDown={this._draggerStart.handleMouseDown}\n            onMouseEnter={this._draggerStart.handleMouseEnter}\n            onMouseLeave={this._draggerStart.handleMouseLeave}\n            position={viewStart || 0}\n          />\n          <Scrubber\n            isDragging={shiftEnd != null}\n            position={viewEnd || 1}\n            onMouseDown={this._draggerEnd.handleMouseDown}\n            onMouseEnter={this._draggerEnd.handleMouseEnter}\n            onMouseLeave={this._draggerEnd.handleMouseLeave}\n          />\n          {reframe != null && this._getMarkers(reframe.anchor, reframe.shift)}\n        </svg>\n        {/* fullOverlay updates the mouse cursor blocks mouse events */}\n        {haveNextTimeRange && <div className={styles.ViewingLayerFullOverlay} />}\n      </div>\n    );\n  }\n}\n\nexport default withTheme2(UnthemedViewingLayer);\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport cx from 'classnames';\nimport memoizeOne from 'memoize-one';\nimport * as React from 'react';\n\nimport { TUpdateViewRangeTimeFunction, ViewRange, ViewRangeTimeUpdate } from '../..';\nimport { TraceSpan, Trace } from '../../types/trace';\nimport { ubPb2, ubPx2, ubRelative } from '../../uberUtilityStyles';\n\nimport CanvasSpanGraph from './CanvasSpanGraph';\nimport TickLabels from './TickLabels';\nimport ViewingLayer from './ViewingLayer';\n\nconst DEFAULT_HEIGHT = 60;\nconst TIMELINE_TICK_INTERVAL = 4;\n\ntype SpanGraphProps = {\n  height?: number;\n  trace: Trace;\n  viewRange: ViewRange;\n  updateViewRangeTime: TUpdateViewRangeTimeFunction;\n  updateNextViewRangeTime: (nextUpdate: ViewRangeTimeUpdate) => void;\n};\n\ntype SpanItem = {\n  valueOffset: number;\n  valueWidth: number;\n  serviceName: string;\n};\n\nfunction getItem(span: TraceSpan): SpanItem {\n  return {\n    valueOffset: span.relativeStartTime,\n    valueWidth: span.duration,\n    serviceName: span.process.serviceName,\n  };\n}\n\nfunction getItems(trace: Trace): SpanItem[] {\n  return trace.spans.map(getItem);\n}\n\nconst memoizedGetitems = memoizeOne(getItems);\n\nexport default class SpanGraph extends React.PureComponent<SpanGraphProps> {\n  static defaultProps = {\n    height: DEFAULT_HEIGHT,\n  };\n\n  render() {\n    const { height, trace, viewRange, updateNextViewRangeTime, updateViewRangeTime } = this.props;\n    if (!trace) {\n      return <div />;\n    }\n\n    const items = memoizedGetitems(trace);\n    return (\n      <div className={cx(ubPb2, ubPx2)}>\n        <TickLabels numTicks={TIMELINE_TICK_INTERVAL} duration={trace.duration} />\n        <div className={ubRelative}>\n          <CanvasSpanGraph valueWidth={trace.duration} items={items} />\n          <ViewingLayer\n            viewRange={viewRange}\n            numTicks={TIMELINE_TICK_INTERVAL}\n            height={height || DEFAULT_HEIGHT}\n            updateViewRangeTime={updateViewRangeTime}\n            updateNextViewRangeTime={updateNextViewRangeTime}\n          />\n        </div>\n      </div>\n    );\n  }\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport cx from 'classnames';\nimport { get as _get, maxBy as _maxBy, values as _values } from 'lodash';\nimport * as React from 'react';\nimport MdKeyboardArrowRight from 'react-icons/lib/md/keyboard-arrow-right';\n\nimport { dateTimeFormat, GrafanaTheme2, TimeZone } from '@grafana/data';\nimport { useStyles2 } from '@grafana/ui';\n\nimport { autoColor, TUpdateViewRangeTimeFunction, ViewRange, ViewRangeTimeUpdate } from '..';\nimport ExternalLinks from '../common/ExternalLinks';\nimport LabeledList from '../common/LabeledList';\nimport TraceName from '../common/TraceName';\nimport { getTraceLinks } from '../model/link-patterns';\nimport { getTraceName } from '../model/trace-viewer';\nimport { Trace } from '../types/trace';\nimport { uTxMuted } from '../uberUtilityStyles';\nimport { formatDuration } from '../utils/date';\n\nimport SpanGraph from './SpanGraph';\n\nconst getStyles = (theme: GrafanaTheme2) => {\n  return {\n    TracePageHeader: css`\n      label: TracePageHeader;\n      & > :first-child {\n        border-bottom: 1px solid ${autoColor(theme, '#e8e8e8')};\n      }\n      & > :nth-child(2) {\n        background-color: ${autoColor(theme, '#eee')};\n        border-bottom: 1px solid ${autoColor(theme, '#e4e4e4')};\n      }\n      & > :last-child {\n        border-bottom: 1px solid ${autoColor(theme, '#ccc')};\n      }\n    `,\n    TracePageHeaderTitleRow: css`\n      label: TracePageHeaderTitleRow;\n      align-items: center;\n      display: flex;\n    `,\n    TracePageHeaderBack: css`\n      label: TracePageHeaderBack;\n      align-items: center;\n      align-self: stretch;\n      background-color: #fafafa;\n      border-bottom: 1px solid #ddd;\n      border-right: 1px solid #ddd;\n      color: inherit;\n      display: flex;\n      font-size: 1.4rem;\n      padding: 0 1rem;\n      margin-bottom: -1px;\n      &:hover {\n        background-color: #f0f0f0;\n        border-color: #ccc;\n      }\n    `,\n    TracePageHeaderTitleLink: css`\n      label: TracePageHeaderTitleLink;\n      align-items: center;\n      display: flex;\n      flex: 1;\n\n      &:hover * {\n        text-decoration: underline;\n      }\n      &:hover > *,\n      &:hover small {\n        text-decoration: none;\n      }\n    `,\n    TracePageHeaderDetailToggle: css`\n      label: TracePageHeaderDetailToggle;\n      font-size: 2.5rem;\n      transition: transform 0.07s ease-out;\n    `,\n    TracePageHeaderDetailToggleExpanded: css`\n      label: TracePageHeaderDetailToggleExpanded;\n      transform: rotate(90deg);\n    `,\n    TracePageHeaderTitle: css`\n      label: TracePageHeaderTitle;\n      color: inherit;\n      flex: 1;\n      font-size: 1.7em;\n      line-height: 1em;\n      margin: 0 0 0 0.5em;\n      padding-bottom: 0.5em;\n    `,\n    TracePageHeaderTitleCollapsible: css`\n      label: TracePageHeaderTitleCollapsible;\n      margin-left: 0;\n    `,\n    TracePageHeaderOverviewItems: css`\n      label: TracePageHeaderOverviewItems;\n      border-bottom: 1px solid #e4e4e4;\n      padding: 0.25rem 0.5rem !important;\n    `,\n    TracePageHeaderOverviewItemValueDetail: cx(\n      css`\n        label: TracePageHeaderOverviewItemValueDetail;\n        color: #aaa;\n      `,\n      'trace-item-value-detail'\n    ),\n    TracePageHeaderOverviewItemValue: css`\n      label: TracePageHeaderOverviewItemValue;\n      &:hover > .trace-item-value-detail {\n        color: unset;\n      }\n    `,\n    TracePageHeaderArchiveIcon: css`\n      label: TracePageHeaderArchiveIcon;\n      font-size: 1.78em;\n      margin-right: 0.15em;\n    `,\n    TracePageHeaderTraceId: css`\n      label: TracePageHeaderTraceId;\n      white-space: nowrap;\n    `,\n  };\n};\n\ntype TracePageHeaderEmbedProps = {\n  canCollapse: boolean;\n  hideMap: boolean;\n  hideSummary: boolean;\n  onSlimViewClicked: () => void;\n  onTraceGraphViewClicked: () => void;\n  slimView: boolean;\n  trace: Trace;\n  updateNextViewRangeTime: (update: ViewRangeTimeUpdate) => void;\n  updateViewRangeTime: TUpdateViewRangeTimeFunction;\n  viewRange: ViewRange;\n  timeZone: TimeZone;\n};\n\nexport const HEADER_ITEMS = [\n  {\n    key: 'timestamp',\n    label: 'Trace Start:',\n    renderer(trace: Trace, timeZone: TimeZone, styles: ReturnType<typeof getStyles>) {\n      // Convert date from micro to milli seconds\n      const dateStr = dateTimeFormat(trace.startTime / 1000, { timeZone, defaultWithMS: true });\n      const match = dateStr.match(/^(.+)(:\\d\\d\\.\\d+)$/);\n      return match ? (\n        <span className={styles.TracePageHeaderOverviewItemValue}>\n          {match[1]}\n          <span className={styles.TracePageHeaderOverviewItemValueDetail}>{match[2]}</span>\n        </span>\n      ) : (\n        dateStr\n      );\n    },\n  },\n  {\n    key: 'duration',\n    label: 'Duration:',\n    renderer: (trace: Trace) => formatDuration(trace.duration),\n  },\n  {\n    key: 'service-count',\n    label: 'Services:',\n    renderer: (trace: Trace) => new Set(_values(trace.processes).map((p) => p.serviceName)).size,\n  },\n  {\n    key: 'depth',\n    label: 'Depth:',\n    renderer: (trace: Trace) => _get(_maxBy(trace.spans, 'depth'), 'depth', 0) + 1,\n  },\n  {\n    key: 'span-count',\n    label: 'Total Spans:',\n    renderer: (trace: Trace) => trace.spans.length,\n  },\n];\n\nexport default function TracePageHeader(props: TracePageHeaderEmbedProps) {\n  const {\n    canCollapse,\n    hideMap,\n    hideSummary,\n    onSlimViewClicked,\n    slimView,\n    trace,\n    updateNextViewRangeTime,\n    updateViewRangeTime,\n    viewRange,\n    timeZone,\n  } = props;\n\n  const styles = useStyles2(getStyles);\n  const links = React.useMemo(() => {\n    if (!trace) {\n      return [];\n    }\n    return getTraceLinks(trace);\n  }, [trace]);\n\n  if (!trace) {\n    return null;\n  }\n\n  const summaryItems =\n    !hideSummary &&\n    !slimView &&\n    HEADER_ITEMS.map((item) => {\n      const { renderer, ...rest } = item;\n      return { ...rest, value: renderer(trace, timeZone, styles) };\n    });\n\n  const title = (\n    <h1 className={cx(styles.TracePageHeaderTitle, canCollapse && styles.TracePageHeaderTitleCollapsible)}>\n      <TraceName traceName={getTraceName(trace.spans)} />{' '}\n      <small className={cx(styles.TracePageHeaderTraceId, uTxMuted)}>{trace.traceID}</small>\n    </h1>\n  );\n\n  return (\n    <header className={styles.TracePageHeader}>\n      <div className={styles.TracePageHeaderTitleRow}>\n        {links && links.length > 0 && <ExternalLinks links={links} className={styles.TracePageHeaderBack} />}\n        {canCollapse ? (\n          <a\n            className={styles.TracePageHeaderTitleLink}\n            onClick={onSlimViewClicked}\n            role=\"switch\"\n            aria-checked={!slimView}\n          >\n            <MdKeyboardArrowRight\n              className={cx(\n                styles.TracePageHeaderDetailToggle,\n                !slimView && styles.TracePageHeaderDetailToggleExpanded\n              )}\n            />\n            {title}\n          </a>\n        ) : (\n          title\n        )}\n      </div>\n      {summaryItems && <LabeledList className={styles.TracePageHeaderOverviewItems} items={summaryItems} />}\n      {!hideMap && !slimView && (\n        <SpanGraph\n          trace={trace}\n          viewRange={viewRange}\n          updateNextViewRangeTime={updateNextViewRangeTime}\n          updateViewRangeTime={updateViewRangeTime}\n        />\n      )}\n    </header>\n  );\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { TraceLog, TraceSpanReference } from '../../types/trace';\n\n/**\n * Which items of a {@link SpanDetail} component are expanded.\n */\nexport default class DetailState {\n  isTagsOpen: boolean;\n  isProcessOpen: boolean;\n  logs: { isOpen: boolean; openedItems: Set<TraceLog> };\n  references: { isOpen: boolean; openedItems: Set<TraceSpanReference> };\n  isWarningsOpen: boolean;\n  isStackTracesOpen: boolean;\n  isReferencesOpen: boolean;\n\n  constructor(oldState?: DetailState) {\n    const {\n      isTagsOpen,\n      isProcessOpen,\n      isReferencesOpen,\n      isWarningsOpen,\n      isStackTracesOpen,\n      logs,\n      references,\n    }: DetailState | Record<string, undefined> = oldState || {};\n    this.isTagsOpen = Boolean(isTagsOpen);\n    this.isProcessOpen = Boolean(isProcessOpen);\n    this.isReferencesOpen = Boolean(isReferencesOpen);\n    this.isWarningsOpen = Boolean(isWarningsOpen);\n    this.isStackTracesOpen = Boolean(isStackTracesOpen);\n    this.logs = {\n      isOpen: Boolean(logs && logs.isOpen),\n      openedItems: logs && logs.openedItems ? new Set(logs.openedItems) : new Set(),\n    };\n    this.references = {\n      isOpen: Boolean(references && references.isOpen),\n      openedItems: references && references.openedItems ? new Set(references.openedItems) : new Set(),\n    };\n  }\n\n  toggleTags() {\n    const next = new DetailState(this);\n    next.isTagsOpen = !this.isTagsOpen;\n    return next;\n  }\n\n  toggleProcess() {\n    const next = new DetailState(this);\n    next.isProcessOpen = !this.isProcessOpen;\n    return next;\n  }\n\n  toggleReferences() {\n    const next = new DetailState(this);\n    next.references.isOpen = !this.references.isOpen;\n    return next;\n  }\n\n  toggleReferenceItem(reference: TraceSpanReference) {\n    const next = new DetailState(this);\n    if (next.references.openedItems.has(reference)) {\n      next.references.openedItems.delete(reference);\n    } else {\n      next.references.openedItems.add(reference);\n    }\n    return next;\n  }\n\n  toggleWarnings() {\n    const next = new DetailState(this);\n    next.isWarningsOpen = !this.isWarningsOpen;\n    return next;\n  }\n\n  toggleStackTraces() {\n    const next = new DetailState(this);\n    next.isStackTracesOpen = !this.isStackTracesOpen;\n    return next;\n  }\n\n  toggleLogs() {\n    const next = new DetailState(this);\n    next.logs.isOpen = !this.logs.isOpen;\n    return next;\n  }\n\n  toggleLogItem(logItem: TraceLog) {\n    const next = new DetailState(this);\n    if (next.logs.openedItems.has(logItem)) {\n      next.logs.openedItems.delete(logItem);\n    } else {\n      next.logs.openedItems.add(logItem);\n    }\n    return next;\n  }\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nexport default class TreeNode {\n  static iterFunction(fn, depth = 0) {\n    return (node) => fn(node.value, node, depth);\n  }\n\n  static searchFunction(search) {\n    if (typeof search === 'function') {\n      return search;\n    }\n\n    return (value, node) => (search instanceof TreeNode ? node === search : value === search);\n  }\n\n  constructor(value, children = []) {\n    this.value = value;\n    this.children = children;\n  }\n\n  get depth() {\n    return this.children.reduce((depth, child) => Math.max(child.depth + 1, depth), 1);\n  }\n\n  get size() {\n    let i = 0;\n    this.walk(() => i++);\n    return i;\n  }\n\n  addChild(child) {\n    this.children.push(child instanceof TreeNode ? child : new TreeNode(child));\n    return this;\n  }\n\n  find(search) {\n    const searchFn = TreeNode.iterFunction(TreeNode.searchFunction(search));\n    if (searchFn(this)) {\n      return this;\n    }\n    for (let i = 0; i < this.children.length; i++) {\n      const result = this.children[i].find(search);\n      if (result) {\n        return result;\n      }\n    }\n    return null;\n  }\n\n  getPath(search) {\n    const searchFn = TreeNode.iterFunction(TreeNode.searchFunction(search));\n\n    const findPath = (currentNode, currentPath) => {\n      // skip if we already found the result\n      const attempt = currentPath.concat([currentNode]);\n      // base case: return the array when there is a match\n      if (searchFn(currentNode)) {\n        return attempt;\n      }\n      for (let i = 0; i < currentNode.children.length; i++) {\n        const child = currentNode.children[i];\n        const match = findPath(child, attempt);\n        if (match) {\n          return match;\n        }\n      }\n      return null;\n    };\n\n    return findPath(this, []);\n  }\n\n  walk(fn, depth = 0) {\n    const nodeStack = [];\n    let actualDepth = depth;\n    nodeStack.push({ node: this, depth: actualDepth });\n    while (nodeStack.length) {\n      const { node, depth: nodeDepth } = nodeStack.pop();\n      fn(node.value, node, nodeDepth);\n      actualDepth = nodeDepth + 1;\n      let i = node.children.length - 1;\n      while (i >= 0) {\n        nodeStack.push({ node: node.children[i], depth: actualDepth });\n        i--;\n      }\n    }\n  }\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nexport const getProcessServiceName = (proc) => proc.serviceName;\nexport const getProcessTags = (proc) => proc.tags;\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport fuzzy from 'fuzzy';\nimport { createSelector } from 'reselect';\n\nimport { getProcessServiceName } from './process';\n\nexport const getSpanId = (span) => span.spanID;\nexport const getSpanName = (span) => span.operationName;\nexport const getSpanDuration = (span) => span.duration;\nexport const getSpanTimestamp = (span) => span.startTime;\nexport const getSpanProcessId = (span) => span.processID;\nexport const getSpanReferences = (span) => span.references || [];\nexport const getSpanReferenceByType = createSelector(\n  createSelector(({ span }) => span, getSpanReferences),\n  ({ type }) => type,\n  (references, type) => references.find((ref) => ref.refType === type)\n);\nexport const getSpanParentId = createSelector(\n  (span) => getSpanReferenceByType({ span, type: 'CHILD_OF' }),\n  (childOfRef) => (childOfRef ? childOfRef.spanID : null)\n);\n\nexport const getSpanProcess = (span) => {\n  if (!span.process) {\n    throw new Error(\n      `\n      you must hydrate the spans with the processes, perhaps\n      using hydrateSpansWithProcesses(), before accessing a span's process\n    `\n    );\n  }\n\n  return span.process;\n};\n\nexport const getSpanServiceName = createSelector(getSpanProcess, getProcessServiceName);\n\nexport const filterSpansForTimestamps = createSelector(\n  ({ spans }) => spans,\n  ({ leftBound }) => leftBound,\n  ({ rightBound }) => rightBound,\n  (spans, leftBound, rightBound) =>\n    spans.filter((span) => getSpanTimestamp(span) >= leftBound && getSpanTimestamp(span) <= rightBound)\n);\n\nexport const filterSpansForText = createSelector(\n  ({ spans }) => spans,\n  ({ text }) => text,\n  (spans, text) =>\n    fuzzy\n      .filter(text, spans, {\n        extract: (span) => `${getSpanServiceName(span)} ${getSpanName(span)}`,\n      })\n      .map(({ original }) => original)\n);\n\nconst getTextFilterdSpansAsMap = createSelector(filterSpansForText, (matchingSpans) =>\n  matchingSpans.reduce(\n    (obj, span) => ({\n      ...obj,\n      [getSpanId(span)]: span,\n    }),\n    {}\n  )\n);\n\nexport const highlightSpansForTextFilter = createSelector(\n  ({ spans }) => spans,\n  getTextFilterdSpansAsMap,\n  (spans, textFilteredSpansMap) =>\n    spans.map((span) => ({\n      ...span,\n      muted: !textFilteredSpansMap[getSpanId(span)],\n    }))\n);\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { createSelector, createStructuredSelector } from 'reselect';\n\nimport TreeNode from '../utils/TreeNode';\nimport { formatMillisecondTime, formatSecondTime, ONE_SECOND } from '../utils/date';\nimport { numberSortComparator } from '../utils/sort';\n\nimport { getProcessServiceName } from './process';\nimport {\n  getSpanId,\n  getSpanName,\n  getSpanServiceName,\n  getSpanTimestamp,\n  getSpanDuration,\n  getSpanProcessId,\n} from './span';\n\nexport const getTraceId = (trace) => trace.traceID;\n\nexport const getTraceSpans = (trace) => trace.spans;\n\nconst getTraceProcesses = (trace) => trace.processes;\n\nconst getSpanWithProcess = createSelector(\n  (state) => state.span,\n  (state) => state.processes,\n  (span, processes) => ({\n    ...span,\n    process: processes[getSpanProcessId(span)],\n  })\n);\n\nexport const getTraceSpansAsMap = createSelector(getTraceSpans, (spans) =>\n  spans.reduce((map, span) => map.set(getSpanId(span), span), new Map())\n);\n\nexport const TREE_ROOT_ID = '__root__';\n\n/**\n * Build a tree of { value: spanID, children } items derived from the\n * `span.references` information. The tree represents the grouping of parent /\n * child relationships. The root-most node is nominal in that\n * `.value === TREE_ROOT_ID`. This is done because a root span (the main trace\n * span) is not always included with the trace data. Thus, there can be\n * multiple top-level spans, and the root node acts as their common parent.\n *\n * The children are sorted by `span.startTime` after the tree is built.\n *\n * @param  {Trace} trace The trace to build the tree of spanIDs.\n * @return {TreeNode}    A tree of spanIDs derived from the relationships\n *                       between spans in the trace.\n */\nexport function getTraceSpanIdsAsTree(trace) {\n  const nodesById = new Map(trace.spans.map((span) => [span.spanID, new TreeNode(span.spanID)]));\n  const spansById = new Map(trace.spans.map((span) => [span.spanID, span]));\n  const root = new TreeNode(TREE_ROOT_ID);\n  trace.spans.forEach((span) => {\n    const node = nodesById.get(span.spanID);\n    if (Array.isArray(span.references) && span.references.length) {\n      const { refType, spanID: parentID } = span.references[0];\n      if (refType === 'CHILD_OF' || refType === 'FOLLOWS_FROM') {\n        const parent = nodesById.get(parentID) || root;\n        parent.children.push(node);\n      } else {\n        throw new Error(`Unrecognized ref type: ${refType}`);\n      }\n    } else {\n      root.children.push(node);\n    }\n  });\n  const comparator = (nodeA, nodeB) => {\n    const a = spansById.get(nodeA.value);\n    const b = spansById.get(nodeB.value);\n    return +(a.startTime > b.startTime) || +(a.startTime === b.startTime) - 1;\n  };\n  trace.spans.forEach((span) => {\n    const node = nodesById.get(span.spanID);\n    if (node.children.length > 1) {\n      node.children.sort(comparator);\n    }\n  });\n  root.children.sort(comparator);\n  return root;\n}\n\n// attach \"process\" as an object to each span.\nexport const hydrateSpansWithProcesses = (trace) => {\n  const spans = getTraceSpans(trace);\n  const processes = getTraceProcesses(trace);\n\n  return {\n    ...trace,\n    spans: spans.map((span) => getSpanWithProcess({ span, processes })),\n  };\n};\n\nexport const getTraceSpanCount = createSelector(getTraceSpans, (spans) => spans.length);\n\nexport const getTraceTimestamp = createSelector(getTraceSpans, (spans) =>\n  spans.reduce(\n    (prevTimestamp, span) => (prevTimestamp ? Math.min(prevTimestamp, getSpanTimestamp(span)) : getSpanTimestamp(span)),\n    null\n  )\n);\n\nexport const getTraceDuration = createSelector(getTraceSpans, getTraceTimestamp, (spans, timestamp) =>\n  spans.reduce(\n    (prevDuration, span) =>\n      prevDuration\n        ? Math.max(getSpanTimestamp(span) - timestamp + getSpanDuration(span), prevDuration)\n        : getSpanDuration(span),\n    null\n  )\n);\n\nexport const getTraceEndTimestamp = createSelector(\n  getTraceTimestamp,\n  getTraceDuration,\n  (timestamp, duration) => timestamp + duration\n);\n\nexport const getParentSpan = createSelector(\n  getTraceSpanIdsAsTree,\n  getTraceSpansAsMap,\n  (tree, spanMap) =>\n    tree.children\n      .map((node) => spanMap.get(node.value))\n      .sort((spanA, spanB) => numberSortComparator(getSpanTimestamp(spanA), getSpanTimestamp(spanB)))[0]\n);\n\nexport const getTraceDepth = createSelector(getTraceSpanIdsAsTree, (spanTree) => spanTree.depth - 1);\n\nexport const getSpanDepthForTrace = createSelector(\n  createSelector((state) => state.trace, getTraceSpanIdsAsTree),\n  createSelector((state) => state.span, getSpanId),\n  (node, spanID) => node.getPath(spanID).length - 1\n);\n\nexport const getTraceServices = createSelector(getTraceProcesses, (processes) =>\n  Object.keys(processes).reduce(\n    (services, processID) => services.add(getProcessServiceName(processes[processID])),\n    new Set()\n  )\n);\n\nexport const getTraceServiceCount = createSelector(getTraceServices, (services) => services.size);\n\n// establish constants to determine how math should be handled\n// for nanosecond-to-millisecond conversions.\nexport const DURATION_FORMATTERS = {\n  ms: formatMillisecondTime,\n  s: formatSecondTime,\n};\n\nconst getDurationFormatterForTrace = createSelector(getTraceDuration, (totalDuration) =>\n  totalDuration >= ONE_SECOND ? DURATION_FORMATTERS.s : DURATION_FORMATTERS.ms\n);\n\nexport const formatDurationForUnit = createSelector(\n  ({ duration }) => duration,\n  ({ unit }) => DURATION_FORMATTERS[unit],\n  (duration, formatter) => formatter(duration)\n);\n\nexport const formatDurationForTrace = createSelector(\n  ({ duration }) => duration,\n  createSelector(({ trace }) => trace, getDurationFormatterForTrace),\n  (duration, formatter) => formatter(duration)\n);\n\nexport const getSortedSpans = createSelector(\n  ({ trace }) => trace,\n  ({ spans }) => spans,\n  ({ sort }) => sort,\n  (trace, spans, { dir, comparator, selector }) =>\n    [...spans].sort((spanA, spanB) => dir * comparator(selector(spanA, trace), selector(spanB, trace)))\n);\n\nconst getTraceSpansByHierarchyPosition = createSelector(getTraceSpanIdsAsTree, (tree) => {\n  const hierarchyPositionMap = new Map();\n  let i = 0;\n  tree.walk((spanID) => hierarchyPositionMap.set(spanID, i++));\n  return hierarchyPositionMap;\n});\n\nexport const getTreeSizeForTraceSpan = createSelector(\n  createSelector((state) => state.trace, getTraceSpanIdsAsTree),\n  createSelector((state) => state.span, getSpanId),\n  (tree, spanID) => {\n    const node = tree.find(spanID);\n    if (!node) {\n      return -1;\n    }\n    return node.size - 1;\n  }\n);\n\nexport const getSpanHierarchySortPositionForTrace = createSelector(\n  createSelector(({ trace }) => trace, getTraceSpansByHierarchyPosition),\n  ({ span }) => span,\n  (hierarchyPositionMap, span) => hierarchyPositionMap.get(getSpanId(span))\n);\n\nexport const getTraceName = createSelector(\n  createSelector(\n    createSelector(hydrateSpansWithProcesses, getParentSpan),\n    createStructuredSelector({\n      name: getSpanName,\n      serviceName: getSpanServiceName,\n    })\n  ),\n  ({ name, serviceName }) => `${serviceName}: ${name}`\n);\n\nexport const omitCollapsedSpans = createSelector(\n  ({ spans }) => spans,\n  createSelector(({ trace }) => trace, getTraceSpanIdsAsTree),\n  ({ collapsed }) => collapsed,\n  (spans, tree, collapse) => {\n    const hiddenSpanIds = collapse.reduce((result, collapsedSpanId) => {\n      tree.find(collapsedSpanId).walk((id) => id !== collapsedSpanId && result.add(id));\n      return result;\n    }, new Set());\n\n    return hiddenSpanIds.size > 0 ? spans.filter((span) => !hiddenSpanIds.has(getSpanId(span))) : spans;\n  }\n);\n\nexport const DEFAULT_TICK_INTERVAL = 4;\nexport const DEFAULT_TICK_WIDTH = 3;\nexport const getTicksForTrace = createSelector(\n  ({ trace }) => trace,\n  ({ interval = DEFAULT_TICK_INTERVAL }) => interval,\n  ({ width = DEFAULT_TICK_WIDTH }) => width,\n  (\n    trace,\n    interval,\n    width\n    // timestamps will be spaced over the interval, starting from the initial timestamp\n  ) =>\n    [...Array(interval + 1).keys()].map((num) => ({\n      timestamp: getTraceTimestamp(trace) + getTraceDuration(trace) * (num / interval),\n      width,\n    }))\n);\n\n// TODO: delete this when the backend can ensure uniqueness\n/* istanbul ignore next */\nexport const enforceUniqueSpanIds = createSelector(\n  /* istanbul ignore next */ (trace) => trace,\n  getTraceSpans,\n  /* istanbul ignore next */ (trace, spans) => {\n    const map = new Map();\n\n    return {\n      ...trace,\n      spans: spans.reduce((result, span) => {\n        const spanID = map.has(getSpanId(span)) ? `${getSpanId(span)}_${map.get(getSpanId(span))}` : getSpanId(span);\n        const updatedSpan = { ...span, spanID };\n\n        if (spanID !== getSpanId(span)) {\n          // eslint-disable-next-line no-console\n          console.warn('duplicate spanID in trace replaced', getSpanId(span), 'new:', spanID);\n        }\n\n        // set the presence of the span in the map or increment the number\n        map.set(getSpanId(span), (map.get(getSpanId(span)) || 0) + 1);\n\n        return result.concat([updatedSpan]);\n      }, []),\n    };\n  }\n);\n\n// TODO: delete this when the backend can ensure uniqueness\nexport const dropEmptyStartTimeSpans = createSelector(\n  /* istanbul ignore next */ (trace) => trace,\n  getTraceSpans,\n  /* istanbul ignore next */ (trace, spans) => ({\n    ...trace,\n    spans: spans.filter((span) => !!getSpanTimestamp(span)),\n  })\n);\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nexport function localeStringComparator(itemA, itemB) {\n  return itemA.localeCompare(itemB);\n}\n\nexport function numberSortComparator(itemA, itemB) {\n  return itemA - itemB;\n}\n\nexport function classNameForSortDir(dir) {\n  return `sorted ${dir === 1 ? 'ascending' : 'descending'}`;\n}\n\nexport function getNewSortForClick(prevSort, column) {\n  const { defaultDir = 1 } = column;\n\n  return {\n    key: column.name,\n    dir: prevSort.key === column.name ? -1 * prevSort.dir : defaultDir,\n  };\n}\n\nexport function createSortClickHandler(column, currentSortKey, currentSortDir, updateSort) {\n  return function onClickSortingElement() {\n    const { key, dir } = getNewSortForClick({ key: currentSortKey, dir: currentSortDir }, column);\n    updateSort(key, dir);\n  };\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { isEqual as _isEqual } from 'lodash';\n\n// @ts-ignore\nimport { getTraceSpanIdsAsTree } from '../selectors/trace';\nimport { TraceKeyValuePair, TraceSpan, Trace, TraceResponse } from '../types/trace';\n// @ts-ignore\nimport TreeNode from '../utils/TreeNode';\nimport { getConfigValue } from '../utils/config/get-config';\n\nimport { getTraceName } from './trace-viewer';\n\n// exported for tests\nexport function deduplicateTags(spanTags: TraceKeyValuePair[]) {\n  const warningsHash: Map<string, string> = new Map<string, string>();\n  const tags: TraceKeyValuePair[] = spanTags.reduce<TraceKeyValuePair[]>((uniqueTags, tag) => {\n    if (!uniqueTags.some((t) => t.key === tag.key && t.value === tag.value)) {\n      uniqueTags.push(tag);\n    } else {\n      warningsHash.set(`${tag.key}:${tag.value}`, `Duplicate tag \"${tag.key}:${tag.value}\"`);\n    }\n    return uniqueTags;\n  }, []);\n  const warnings = Array.from(warningsHash.values());\n  return { tags, warnings };\n}\n\n// exported for tests\nexport function orderTags(spanTags: TraceKeyValuePair[], topPrefixes?: string[]) {\n  const orderedTags: TraceKeyValuePair[] = spanTags.slice();\n  const tp = (topPrefixes || []).map((p: string) => p.toLowerCase());\n\n  orderedTags.sort((a, b) => {\n    const aKey = a.key.toLowerCase();\n    const bKey = b.key.toLowerCase();\n\n    for (let i = 0; i < tp.length; i++) {\n      const p = tp[i];\n      if (aKey.startsWith(p) && !bKey.startsWith(p)) {\n        return -1;\n      }\n      if (!aKey.startsWith(p) && bKey.startsWith(p)) {\n        return 1;\n      }\n    }\n\n    if (aKey > bKey) {\n      return 1;\n    }\n    if (aKey < bKey) {\n      return -1;\n    }\n    return 0;\n  });\n\n  return orderedTags;\n}\n\n/**\n * NOTE: Mutates `data` - Transform the HTTP response data into the form the app\n * generally requires.\n */\nexport default function transformTraceData(data: TraceResponse | undefined): Trace | null {\n  if (!data?.traceID) {\n    return null;\n  }\n  const traceID = data.traceID.toLowerCase();\n\n  let traceEndTime = 0;\n  let traceStartTime = Number.MAX_SAFE_INTEGER;\n  const spanIdCounts = new Map();\n  const spanMap = new Map<string, TraceSpan>();\n  // filter out spans with empty start times\n  // eslint-disable-next-line no-param-reassign\n  data.spans = data.spans.filter((span) => Boolean(span.startTime));\n\n  const max = data.spans.length;\n  for (let i = 0; i < max; i++) {\n    const span: TraceSpan = data.spans[i] as TraceSpan;\n    const { startTime, duration, processID } = span;\n    //\n    let spanID = span.spanID;\n    // check for start / end time for the trace\n    if (startTime < traceStartTime) {\n      traceStartTime = startTime;\n    }\n    if (startTime + duration > traceEndTime) {\n      traceEndTime = startTime + duration;\n    }\n    // make sure span IDs are unique\n    const idCount = spanIdCounts.get(spanID);\n    if (idCount != null) {\n      // eslint-disable-next-line no-console\n      console.warn(`Dupe spanID, ${idCount + 1} x ${spanID}`, span, spanMap.get(spanID));\n      if (_isEqual(span, spanMap.get(spanID))) {\n        // eslint-disable-next-line no-console\n        console.warn('\\t two spans with same ID have `isEqual(...) === true`');\n      }\n      spanIdCounts.set(spanID, idCount + 1);\n      spanID = `${spanID}_${idCount}`;\n      span.spanID = spanID;\n    } else {\n      spanIdCounts.set(spanID, 1);\n    }\n    span.process = data.processes[processID];\n    spanMap.set(spanID, span);\n  }\n  // tree is necessary to sort the spans, so children follow parents, and\n  // siblings are sorted by start time\n  const tree = getTraceSpanIdsAsTree(data);\n  const spans: TraceSpan[] = [];\n  const svcCounts: Record<string, number> = {};\n\n  // Eslint complains about number type not needed but then TS complains it is implicitly any.\n  // eslint-disable-next-line @typescript-eslint/no-inferrable-types\n  tree.walk((spanID: string, node: TreeNode, depth: number = 0) => {\n    if (spanID === '__root__') {\n      return;\n    }\n    const span = spanMap.get(spanID) as TraceSpan;\n    if (!span) {\n      return;\n    }\n    const { serviceName } = span.process;\n    svcCounts[serviceName] = (svcCounts[serviceName] || 0) + 1;\n    span.relativeStartTime = span.startTime - traceStartTime;\n    span.depth = depth - 1;\n    span.hasChildren = node.children.length > 0;\n    span.childSpanCount = node.children.length;\n    span.warnings = span.warnings || [];\n    span.tags = span.tags || [];\n    span.references = span.references || [];\n    const tagsInfo = deduplicateTags(span.tags);\n    span.tags = orderTags(tagsInfo.tags, getConfigValue('topTagPrefixes'));\n    span.warnings = span.warnings.concat(tagsInfo.warnings);\n    span.references.forEach((ref, index) => {\n      const refSpan = spanMap.get(ref.spanID) as TraceSpan;\n      if (refSpan) {\n        // eslint-disable-next-line no-param-reassign\n        ref.span = refSpan;\n        if (index > 0) {\n          // Don't take into account the parent, just other references.\n          refSpan.subsidiarilyReferencedBy = refSpan.subsidiarilyReferencedBy || [];\n          refSpan.subsidiarilyReferencedBy.push({\n            spanID,\n            traceID,\n            span,\n            refType: ref.refType,\n          });\n        }\n      }\n    });\n    spans.push(span);\n  });\n  const traceName = getTraceName(spans);\n  const services = Object.keys(svcCounts).map((name) => ({ name, numberOfSpans: svcCounts[name] }));\n  return {\n    services,\n    spans,\n    traceID,\n    traceName,\n    // can't use spread operator for intersection types\n    // repl: https://goo.gl/4Z23MJ\n    // issue: https://github.com/facebook/flow/issues/1511\n    processes: data.processes,\n    duration: traceEndTime - traceStartTime,\n    startTime: traceStartTime,\n    endTime: traceEndTime,\n  };\n}\n","// Copyright (c) 2019 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { TNil } from '../types';\nimport { TraceKeyValuePair, TraceSpan } from '../types/trace';\n\nexport default function filterSpans(textFilter: string, spans: TraceSpan[] | TNil) {\n  if (!spans) {\n    return undefined;\n  }\n\n  // if a span field includes at least one filter in includeFilters, the span is a match\n  const includeFilters: string[] = [];\n\n  // values with keys that include text in any one of the excludeKeys will be ignored\n  const excludeKeys: string[] = [];\n\n  // split textFilter by whitespace, remove empty strings, and extract includeFilters and excludeKeys\n  textFilter\n    .split(/\\s+/)\n    .filter(Boolean)\n    .forEach((w) => {\n      if (w[0] === '-') {\n        excludeKeys.push(w.slice(1).toLowerCase());\n      } else {\n        includeFilters.push(w.toLowerCase());\n      }\n    });\n\n  const isTextInFilters = (filters: string[], text: string) =>\n    filters.some((filter) => text.toLowerCase().includes(filter));\n\n  const isTextInKeyValues = (kvs: TraceKeyValuePair[]) =>\n    kvs\n      ? kvs.some((kv) => {\n          // ignore checking key and value for a match if key is in excludeKeys\n          if (isTextInFilters(excludeKeys, kv.key)) {\n            return false;\n          }\n          // match if key or value matches an item in includeFilters\n          return isTextInFilters(includeFilters, kv.key) || isTextInFilters(includeFilters, kv.value.toString());\n        })\n      : false;\n\n  const isSpanAMatch = (span: TraceSpan) =>\n    isTextInFilters(includeFilters, span.operationName) ||\n    isTextInFilters(includeFilters, span.process.serviceName) ||\n    isTextInKeyValues(span.tags) ||\n    (span.logs !== null && span.logs.some((log) => isTextInKeyValues(log.fields))) ||\n    isTextInKeyValues(span.process.tags) ||\n    includeFilters.some((filter) => filter === span.spanID);\n\n  // declare as const because need to disambiguate the type\n  const rv: Set<string> = new Set(spans.filter(isSpanAMatch).map((span: TraceSpan) => span.spanID));\n  return rv;\n}\n","import { css } from '@emotion/css';\n\nexport const ubRelative = css`\n  position: relative;\n`;\n\nexport const ubMb1 = css`\n  margin-bottom: 0.25rem;\n`;\n\nexport const ubMy1 = css`\n  margin-top: 0.25rem;\n  margin-bottom: 0.25rem;\n`;\n\nexport const ubM0 = css`\n  margin: 0;\n`;\n\nexport const ubPx2 = css`\n  padding-left: 0.5rem;\n  padding-right: 0.5rem;\n`;\n\nexport const ubPb2 = css`\n  padding-bottom: 0.5rem;\n`;\n\nexport const ubFlex = css`\n  display: flex;\n`;\n\nexport const ubItemsCenter = css`\n  align-items: center;\n`;\n\nexport const ubItemsStart = css`\n  align-items: start;\n`;\n\nexport const ubFlexAuto = css`\n  flex: 1 1 auto;\n  min-width: 0; /* 1 */\n  min-height: 0; /* 1 */\n`;\n\nexport const ubTxRightAlign = css`\n  text-align: right;\n`;\n\nexport const ubInlineBlock = css`\n  display: inline-block;\n`;\n\nexport const uAlignIcon = css`\n  margin: -0.2rem 0.25rem 0 0;\n`;\n\nexport const uTxEllipsis = css`\n  text-overflow: ellipsis;\n`;\n\nexport const uWidth100 = css`\n  width: 100%;\n`;\n\nexport const uTxMuted = css`\n  color: #aaa;\n`;\n\nexport const ubJustifyEnd = css`\n  justify-content: flex-end;\n`;\n","/**\n * Get non overlapping duration of the ranges as they can overlap or have gaps.\n */\nimport { FieldType, MutableDataFrame, NodeGraphDataFrameFieldNames as Fields } from '@grafana/data';\n\nexport function getNonOverlappingDuration(ranges: Array<[number, number]>): number {\n  ranges.sort((a, b) => a[0] - b[0]);\n  const mergedRanges = ranges.reduce((acc, range) => {\n    if (!acc.length) {\n      return [range];\n    }\n    const tail = acc.slice(-1)[0];\n    const [prevStart, prevEnd] = tail;\n    const [start, end] = range;\n    if (end < prevEnd) {\n      // In this case the range is completely inside the prev range so we can just ignore it.\n      return acc;\n    }\n\n    if (start > prevEnd) {\n      // There is no overlap so we can just add it to stack\n      return [...acc, range];\n    }\n\n    // We know there is overlap and current range ends later than previous so we can just extend the range\n    return [...acc.slice(0, -1), [prevStart, end]] as Array<[number, number]>;\n  }, [] as Array<[number, number]>);\n\n  return mergedRanges.reduce((acc, range) => {\n    return acc + (range[1] - range[0]);\n  }, 0);\n}\n\n/**\n * Returns a map of the spans with children array for easier processing. It will also contain empty spans in case\n * span is missing but other spans are it's children. This is more generic because it needs to allow iterating over\n * both arrays and dataframe views.\n */\nexport function makeSpanMap<T>(getSpan: (index: number) => { span: T; id: string; parentIds: string[] } | undefined): {\n  [id: string]: { span: T; children: string[] };\n} {\n  const spanMap: { [id: string]: { span?: T; children: string[] } } = {};\n\n  let span;\n  for (let index = 0; (span = getSpan(index)), !!span; index++) {\n    if (!spanMap[span.id]) {\n      spanMap[span.id] = {\n        span: span.span,\n        children: [],\n      };\n    } else {\n      spanMap[span.id].span = span.span;\n    }\n\n    for (const parentId of span.parentIds) {\n      if (parentId) {\n        if (!spanMap[parentId]) {\n          spanMap[parentId] = {\n            span: undefined,\n            children: [span.id],\n          };\n        } else {\n          spanMap[parentId].children.push(span.id);\n        }\n      }\n    }\n  }\n  return spanMap as { [id: string]: { span: T; children: string[] } };\n}\n\nexport function getStats(duration: number, traceDuration: number, selfDuration: number) {\n  return {\n    main: `${toFixedNoTrailingZeros(duration)}ms (${toFixedNoTrailingZeros((duration / traceDuration) * 100)}%)`,\n    secondary: `${toFixedNoTrailingZeros(selfDuration)}ms (${toFixedNoTrailingZeros(\n      (selfDuration / duration) * 100\n    )}%)`,\n  };\n}\n\nfunction toFixedNoTrailingZeros(n: number) {\n  return parseFloat(n.toFixed(2));\n}\n\n/**\n * Create default frames used when returning data for node graph.\n */\nexport function makeFrames() {\n  const nodesFrame = new MutableDataFrame({\n    fields: [\n      { name: Fields.id, type: FieldType.string },\n      { name: Fields.title, type: FieldType.string },\n      { name: Fields.subTitle, type: FieldType.string },\n      { name: Fields.mainStat, type: FieldType.string, config: { displayName: 'Total time (% of trace)' } },\n      { name: Fields.secondaryStat, type: FieldType.string, config: { displayName: 'Self time (% of total)' } },\n      {\n        name: Fields.color,\n        type: FieldType.number,\n        config: { color: { mode: 'continuous-GrYlRd' }, displayName: 'Self time / Trace duration' },\n      },\n    ],\n    meta: {\n      preferredVisualisationType: 'nodeGraph',\n    },\n  });\n\n  const edgesFrame = new MutableDataFrame({\n    fields: [\n      { name: Fields.id, type: FieldType.string },\n      { name: Fields.target, type: FieldType.string },\n      { name: Fields.source, type: FieldType.string },\n    ],\n    meta: {\n      preferredVisualisationType: 'nodeGraph',\n    },\n  });\n\n  return [nodesFrame, edgesFrame];\n}\n","import {\n  DataFrame,\n  DataSourceInstanceSettings,\n  FieldType,\n  MutableDataFrame,\n  TraceLog,\n  TraceSpanRow,\n} from '@grafana/data';\nimport { transformTraceData } from '@jaegertracing/jaeger-ui-components';\n\nimport { JaegerResponse, Span, TraceProcess, TraceResponse } from './types';\n\nexport function createTraceFrame(data: TraceResponse): DataFrame {\n  const spans = data.spans.map((s) => toSpanRow(s, data.processes));\n\n  const frame = new MutableDataFrame({\n    fields: [\n      { name: 'traceID', type: FieldType.string },\n      { name: 'spanID', type: FieldType.string },\n      { name: 'parentSpanID', type: FieldType.string },\n      { name: 'operationName', type: FieldType.string },\n      { name: 'serviceName', type: FieldType.string },\n      { name: 'serviceTags', type: FieldType.other },\n      { name: 'startTime', type: FieldType.number },\n      { name: 'duration', type: FieldType.number },\n      { name: 'logs', type: FieldType.other },\n      { name: 'tags', type: FieldType.other },\n      { name: 'warnings', type: FieldType.other },\n      { name: 'stackTraces', type: FieldType.other },\n    ],\n    meta: {\n      preferredVisualisationType: 'trace',\n      custom: {\n        traceFormat: 'jaeger',\n      },\n    },\n  });\n\n  for (const span of spans) {\n    frame.add(span);\n  }\n\n  return frame;\n}\n\nfunction toSpanRow(span: Span, processes: Record<string, TraceProcess>): TraceSpanRow {\n  return {\n    spanID: span.spanID,\n    traceID: span.traceID,\n    parentSpanID: span.references?.find((r) => r.refType === 'CHILD_OF')?.spanID,\n    operationName: span.operationName,\n    // from micro to millis\n    startTime: span.startTime / 1000,\n    duration: span.duration / 1000,\n    logs: span.logs.map((l) => ({\n      ...l,\n      timestamp: l.timestamp / 1000,\n    })),\n    tags: span.tags,\n    warnings: span.warnings ?? undefined,\n    stackTraces: span.stackTraces,\n    serviceName: processes[span.processID].serviceName,\n    serviceTags: processes[span.processID].tags,\n  };\n}\n\nexport function createTableFrame(data: TraceResponse[], instanceSettings: DataSourceInstanceSettings): DataFrame {\n  const frame = new MutableDataFrame({\n    fields: [\n      {\n        name: 'traceID',\n        type: FieldType.string,\n        config: {\n          unit: 'string',\n          displayNameFromDS: 'Trace ID',\n          links: [\n            {\n              title: 'Trace: ${__value.raw}',\n              url: '',\n              internal: {\n                datasourceUid: instanceSettings.uid,\n                datasourceName: instanceSettings.name,\n                query: {\n                  query: '${__value.raw}',\n                },\n              },\n            },\n          ],\n        },\n      },\n      { name: 'traceName', type: FieldType.string, config: { displayNameFromDS: 'Trace name' } },\n      { name: 'startTime', type: FieldType.time, config: { displayNameFromDS: 'Start time' } },\n      { name: 'duration', type: FieldType.number, config: { displayNameFromDS: 'Duration', unit: 'µs' } },\n    ],\n    meta: {\n      preferredVisualisationType: 'table',\n    },\n  });\n  // Show the most recent traces\n  const traceData = data.map(transformToTraceData).sort((a, b) => b?.startTime! - a?.startTime!);\n\n  for (const trace of traceData) {\n    frame.add(trace);\n  }\n\n  return frame;\n}\n\nfunction transformToTraceData(data: TraceResponse) {\n  const traceData = transformTraceData(data);\n  if (!traceData) {\n    return;\n  }\n\n  return {\n    traceID: traceData.traceID,\n    startTime: traceData.startTime / 1000,\n    duration: traceData.duration,\n    traceName: traceData.traceName,\n  };\n}\n\nexport function transformToJaeger(data: MutableDataFrame): JaegerResponse {\n  let traceResponse: TraceResponse = {\n    traceID: '',\n    spans: [],\n    processes: {},\n    warnings: null,\n  };\n  let processes: string[] = [];\n\n  for (let i = 0; i < data.length; i++) {\n    const span = data.get(i);\n\n    // Set traceID\n    if (!traceResponse.traceID) {\n      traceResponse.traceID = span.traceID;\n    }\n\n    // Create process if doesn't exist\n    if (!processes.find((p) => p === span.serviceName)) {\n      processes.push(span.serviceName);\n      traceResponse.processes[`p${processes.length}`] = {\n        serviceName: span.serviceName,\n        tags: span.serviceTags,\n      };\n    }\n\n    // Create span\n    traceResponse.spans.push({\n      traceID: span.traceID,\n      spanID: span.spanID,\n      duration: span.duration * 1000,\n      references: span.parentSpanID\n        ? [\n            {\n              refType: 'CHILD_OF',\n              spanID: span.parentSpanID,\n              traceID: span.traceID,\n            },\n          ]\n        : [],\n      flags: 0,\n      logs: span.logs.map((l: TraceLog) => ({\n        ...l,\n        timestamp: l.timestamp * 1000,\n      })),\n      operationName: span.operationName,\n      processID:\n        Object.keys(traceResponse.processes).find(\n          (key) => traceResponse.processes[key].serviceName === span.serviceName\n        ) || '',\n      startTime: span.startTime * 1000,\n      tags: span.tags,\n      warnings: span.warnings ? span.warnings : null,\n    });\n  }\n\n  return { data: [traceResponse], total: 0, limit: 0, offset: 0, errors: null };\n}\n","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = require('prop-types');\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }\n\nvar IconBase = function IconBase(_ref, _ref2) {\n  var children = _ref.children;\n  var color = _ref.color;\n  var size = _ref.size;\n  var style = _ref.style;\n  var width = _ref.width;\n  var height = _ref.height;\n\n  var props = _objectWithoutProperties(_ref, ['children', 'color', 'size', 'style', 'width', 'height']);\n\n  var _ref2$reactIconBase = _ref2.reactIconBase;\n  var reactIconBase = _ref2$reactIconBase === undefined ? {} : _ref2$reactIconBase;\n\n  var computedSize = size || reactIconBase.size || '1em';\n  return _react2.default.createElement('svg', _extends({\n    children: children,\n    fill: 'currentColor',\n    preserveAspectRatio: 'xMidYMid meet',\n    height: height || computedSize,\n    width: width || computedSize\n  }, reactIconBase, props, {\n    style: _extends({\n      verticalAlign: 'middle',\n      color: color || reactIconBase.color\n    }, reactIconBase.style || {}, style)\n  }));\n};\n\nIconBase.propTypes = {\n  color: _propTypes2.default.string,\n  size: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.number]),\n  width: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.number]),\n  height: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.number]),\n  style: _propTypes2.default.object\n};\n\nIconBase.contextTypes = {\n  reactIconBase: _propTypes2.default.shape(IconBase.propTypes)\n};\n\nexports.default = IconBase;\nmodule.exports = exports['default'];","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactIconBase = require('react-icon-base');\n\nvar _reactIconBase2 = _interopRequireDefault(_reactIconBase);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar IoAlert = function IoAlert(props) {\n    return _react2.default.createElement(\n        _reactIconBase2.default,\n        _extends({ viewBox: '0 0 40 40' }, props),\n        _react2.default.createElement(\n            'g',\n            null,\n            _react2.default.createElement('path', { d: 'm25 37.5h-10v-7.5h10v7.5z m-1.2-12.5h-7.5l-1.3-22.5h10z' })\n        )\n    );\n};\n\nexports.default = IoAlert;\nmodule.exports = exports['default'];","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactIconBase = require('react-icon-base');\n\nvar _reactIconBase2 = _interopRequireDefault(_reactIconBase);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar IoAndroidOpen = function IoAndroidOpen(props) {\n    return _react2.default.createElement(\n        _reactIconBase2.default,\n        _extends({ viewBox: '0 0 40 40' }, props),\n        _react2.default.createElement(\n            'g',\n            null,\n            _react2.default.createElement('path', { d: 'm31.6 31.6v-10.3h3.4v10.3c0 1.8-1.6 3.4-3.4 3.4h-23.2c-1.8 0-3.4-1.6-3.4-3.4v-23.2c0-1.8 1.6-3.4 3.4-3.4h10.4v3.4h-10.4v23.2h23.2z m-9.1-26.6h12.5v12.5h-3.4v-6.8l-16.8 16.8-2.3-2.3 16.8-16.8h-6.8v-3.4z' })\n        )\n    );\n};\n\nexports.default = IoAndroidOpen;\nmodule.exports = exports['default'];","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactIconBase = require('react-icon-base');\n\nvar _reactIconBase2 = _interopRequireDefault(_reactIconBase);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar IoArrowRightA = function IoArrowRightA(props) {\n    return _react2.default.createElement(\n        _reactIconBase2.default,\n        _extends({ viewBox: '0 0 40 40' }, props),\n        _react2.default.createElement(\n            'g',\n            null,\n            _react2.default.createElement('path', { d: 'm35 20l-15 15v-8.7h-15v-12.5h15v-8.8z' })\n        )\n    );\n};\n\nexports.default = IoArrowRightA;\nmodule.exports = exports['default'];","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactIconBase = require('react-icon-base');\n\nvar _reactIconBase2 = _interopRequireDefault(_reactIconBase);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar IoChevronRight = function IoChevronRight(props) {\n    return _react2.default.createElement(\n        _reactIconBase2.default,\n        _extends({ viewBox: '0 0 40 40' }, props),\n        _react2.default.createElement(\n            'g',\n            null,\n            _react2.default.createElement('path', { d: 'm23.3 20l-13.1-13.6c-0.3-0.3-0.3-0.9 0-1.2l2.4-2.4c0.3-0.3 0.9-0.4 1.2-0.1l16 16.7c0.1 0.1 0.2 0.4 0.2 0.6s-0.1 0.5-0.2 0.6l-16 16.7c-0.3 0.3-0.9 0.3-1.2 0l-2.4-2.5c-0.3-0.3-0.3-0.9 0-1.2z' })\n        )\n    );\n};\n\nexports.default = IoChevronRight;\nmodule.exports = exports['default'];","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactIconBase = require('react-icon-base');\n\nvar _reactIconBase2 = _interopRequireDefault(_reactIconBase);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar IoIosArrowDown = function IoIosArrowDown(props) {\n    return _react2.default.createElement(\n        _reactIconBase2.default,\n        _extends({ viewBox: '0 0 40 40' }, props),\n        _react2.default.createElement(\n            'g',\n            null,\n            _react2.default.createElement('path', { d: 'm31 12.5l1.5 1.6-12.5 13.4-12.5-13.4 1.5-1.6 11 11.7z' })\n        )\n    );\n};\n\nexports.default = IoIosArrowDown;\nmodule.exports = exports['default'];","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactIconBase = require('react-icon-base');\n\nvar _reactIconBase2 = _interopRequireDefault(_reactIconBase);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar IoIosArrowRight = function IoIosArrowRight(props) {\n    return _react2.default.createElement(\n        _reactIconBase2.default,\n        _extends({ viewBox: '0 0 40 40' }, props),\n        _react2.default.createElement(\n            'g',\n            null,\n            _react2.default.createElement('path', { d: 'm12.5 9l1.6-1.5 13.4 12.5-13.4 12.5-1.6-1.5 11.7-11z' })\n        )\n    );\n};\n\nexports.default = IoIosArrowRight;\nmodule.exports = exports['default'];","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactIconBase = require('react-icon-base');\n\nvar _reactIconBase2 = _interopRequireDefault(_reactIconBase);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar IoLink = function IoLink(props) {\n    return _react2.default.createElement(\n        _reactIconBase2.default,\n        _extends({ viewBox: '0 0 40 40' }, props),\n        _react2.default.createElement(\n            'g',\n            null,\n            _react2.default.createElement('path', { d: 'm20 16.3z m8.8-3.8c3.4 0 6.2 2.8 6.2 6.3v2.5c0 3.4-2.8 6.2-6.2 6.2h-8.8c-2.6 0-4.7-1.6-5.7-3.7-0.3-0.8-0.5-1.6-0.5-2.5v-2.5h3.7v2.5c0 1.4 1.1 2.5 2.5 2.5h8.8c1.4 0 2.5-1.1 2.5-2.5v-2.5c0-1.5-1.1-2.5-2.5-2.5h-1.3c-0.5-2.5-2.5-3.8-2.5-3.8h3.8z m-3 3.8c0.3 0.7 0.5 1.6 0.5 2.5v2.5h-3.8v-2.5c0-1.5-1.1-2.5-2.5-2.5h-8.7c-1.5 0-2.5 1-2.5 2.5v2.5c0 1.4 1 2.5 2.5 2.5h1.2c0.5 2.4 2.5 3.7 2.5 3.7h-3.7c-3.5 0-6.3-2.8-6.3-6.2v-2.5c0-3.5 2.8-6.3 6.3-6.3h8.7c2.6 0 4.8 1.6 5.8 3.8z' })\n        )\n    );\n};\n\nexports.default = IoLink;\nmodule.exports = exports['default'];","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactIconBase = require('react-icon-base');\n\nvar _reactIconBase2 = _interopRequireDefault(_reactIconBase);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar MdFileUpload = function MdFileUpload(props) {\n    return _react2.default.createElement(\n        _reactIconBase2.default,\n        _extends({ viewBox: '0 0 40 40' }, props),\n        _react2.default.createElement(\n            'g',\n            null,\n            _react2.default.createElement('path', { d: 'm8.4 30h23.2v3.4h-23.2v-3.4z m6.6-3.4v-10h-6.6l11.6-11.6 11.6 11.6h-6.6v10h-10z' })\n        )\n    );\n};\n\nexports.default = MdFileUpload;\nmodule.exports = exports['default'];","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactIconBase = require('react-icon-base');\n\nvar _reactIconBase2 = _interopRequireDefault(_reactIconBase);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar MdKeyboardArrowRight = function MdKeyboardArrowRight(props) {\n    return _react2.default.createElement(\n        _reactIconBase2.default,\n        _extends({ viewBox: '0 0 40 40' }, props),\n        _react2.default.createElement(\n            'g',\n            null,\n            _react2.default.createElement('path', { d: 'm14.3 27.3l7.7-7.7-7.7-7.7 2.3-2.3 10 10-10 10z' })\n        )\n    );\n};\n\nexports.default = MdKeyboardArrowRight;\nmodule.exports = exports['default'];","// The MIT License (MIT)\n//\n// Copyright (c) 2014 Mathias Buus\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nconst INDENT = '    ';\n\nfunction inlineRule(objRule) {\n  let str = '';\n  objRule &&\n    Object.keys(objRule).forEach(function (rule) {\n      str += rule + ':' + objRule[rule] + ';';\n    });\n  return str;\n}\n\nfunction Stylize(styleFile) {\n  function styleClass(cssClass) {\n    return 'class=\"' + cssClass + '\"';\n  }\n\n  function styleInline(cssClass) {\n    return 'style=\"' + inlineRule(styleFile['.' + cssClass]) + '\"';\n  }\n\n  if (!styleFile) {\n    return styleClass;\n  }\n  return styleInline;\n}\n\nfunction type(doc) {\n  if (doc === null) {\n    return 'null';\n  }\n  if (Array.isArray(doc)) {\n    return 'array';\n  }\n  if (typeof doc === 'string' && /^https?:/.test(doc)) {\n    return 'link';\n  }\n  if (typeof doc === 'object' && typeof doc.toISOString === 'function') {\n    return 'date';\n  }\n\n  return typeof doc;\n}\n\nfunction escape(str) {\n  return str.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\n}\n\nmodule.exports = function (doc, styleFile) {\n  let indent = '';\n  const style = Stylize(styleFile);\n\n  let forEach = function (list, start, end, fn) {\n    if (!list.length) {\n      return start + ' ' + end;\n    }\n\n    let out = start + '\\n';\n\n    indent += INDENT;\n    list.forEach(function (key, i) {\n      out += indent + fn(key) + (i < list.length - 1 ? ',' : '') + '\\n';\n    });\n    indent = indent.slice(0, -INDENT.length);\n\n    return out + indent + end;\n  };\n\n  function visit(obj) {\n    if (obj === undefined) {\n      return '';\n    }\n\n    switch (type(obj)) {\n      case 'boolean':\n        return '<span ' + style('json-markup-bool') + '>' + obj + '</span>';\n\n      case 'number':\n        return '<span ' + style('json-markup-number') + '>' + obj + '</span>';\n\n      case 'date':\n        return '<span class=\"json-markup-string\">\"' + escape(obj.toISOString()) + '\"</span>';\n\n      case 'null':\n        return '<span ' + style('json-markup-null') + '>null</span>';\n\n      case 'string':\n        return '<span ' + style('json-markup-string') + '>\"' + escape(obj.replace(/\\n/g, '\\n' + indent)) + '\"</span>';\n\n      case 'link':\n        return (\n          '<span ' + style('json-markup-string') + '>\"<a href=\"' + encodeURI(obj) + '\">' + escape(obj) + '</a>\"</span>'\n        );\n\n      case 'array':\n        return forEach(obj, '[', ']', visit);\n\n      case 'object':\n        const keys = Object.keys(obj).filter(function (key) {\n          return obj[key] !== undefined;\n        });\n\n        return forEach(keys, '{', '}', function (key) {\n          return '<span ' + style('json-markup-key') + '>\"' + escape(key) + '\":</span> ' + visit(obj[key]);\n        });\n    }\n\n    return '';\n  }\n\n  return '<div ' + style('json-markup') + '>' + visit(doc) + '</div>';\n};\n","/* eslint-env node, browser */\n'use strict'\n\nmodule.exports = function (element, options) {\n  var self = this\n  var Combokeys = self.constructor\n\n  /**\n   * an object of passed options\n   *\n   * @type { storeInstancesGlobally?: true }\n   */\n\n  self.options = Object.assign({ storeInstancesGlobally: true }, options || {})\n\n  /**\n   * a list of all the callbacks setup via Combokeys.bind()\n   *\n   * @type {Object}\n   */\n  self.callbacks = {}\n\n  /**\n   * direct map of string combinations to callbacks used for trigger()\n   *\n   * @type {Object}\n   */\n  self.directMap = {}\n\n  /**\n   * keeps track of what level each sequence is at since multiple\n   * sequences can start out with the same sequence\n   *\n   * @type {Object}\n   */\n  self.sequenceLevels = {}\n\n  /**\n   * variable to store the setTimeout call\n   *\n   * @type {null|number}\n   */\n  self.resetTimer = null\n\n  /**\n   * temporary state where we will ignore the next keyup\n   *\n   * @type {boolean|string}\n   */\n  self.ignoreNextKeyup = false\n\n  /**\n   * temporary state where we will ignore the next keypress\n   *\n   * @type {boolean}\n   */\n  self.ignoreNextKeypress = false\n\n  /**\n   * are we currently inside of a sequence?\n   * type of action (\"keyup\" or \"keydown\" or \"keypress\") or false\n   *\n   * @type {boolean|string}\n   */\n  self.nextExpectedAction = false\n\n  self.element = element\n\n  self.addEvents()\n\n  if (self.options.storeInstancesGlobally) {\n    Combokeys.instances.push(self)\n  }\n\n  return self\n}\n\nmodule.exports.prototype.bind = require('./prototype/bind')\nmodule.exports.prototype.bindMultiple = require('./prototype/bindMultiple')\nmodule.exports.prototype.unbind = require('./prototype/unbind')\nmodule.exports.prototype.trigger = require('./prototype/trigger')\nmodule.exports.prototype.reset = require('./prototype/reset.js')\nmodule.exports.prototype.stopCallback = require('./prototype/stopCallback')\nmodule.exports.prototype.handleKey = require('./prototype/handleKey')\nmodule.exports.prototype.addEvents = require('./prototype/addEvents')\nmodule.exports.prototype.bindSingle = require('./prototype/bindSingle')\nmodule.exports.prototype.getKeyInfo = require('./prototype/getKeyInfo')\nmodule.exports.prototype.pickBestAction = require('./prototype/pickBestAction')\nmodule.exports.prototype.getReverseMap = require('./prototype/getReverseMap')\nmodule.exports.prototype.getMatches = require('./prototype/getMatches')\nmodule.exports.prototype.resetSequences = require('./prototype/resetSequences')\nmodule.exports.prototype.fireCallback = require('./prototype/fireCallback')\nmodule.exports.prototype.bindSequence = require('./prototype/bindSequence')\nmodule.exports.prototype.resetSequenceTimer = require('./prototype/resetSequenceTimer')\nmodule.exports.prototype.detach = require('./prototype/detach')\n\nmodule.exports.instances = []\nmodule.exports.reset = require('./reset')\n\n/**\n * variable to store the flipped version of MAP from above\n * needed to check if we should use keypress or not when no action\n * is specified\n *\n * @type {Object|undefined}\n */\nmodule.exports.REVERSE_MAP = null\n","/* eslint-env node, browser */\n'use strict'\nmodule.exports = function () {\n  var self = this\n  var on = require('./dom-event')\n  var element = self.element\n\n  self.eventHandler = require('./handleKeyEvent').bind(self)\n\n  on(element, 'keypress', self.eventHandler)\n  on(element, 'keydown', self.eventHandler)\n  on(element, 'keyup', self.eventHandler)\n}\n","/* eslint-env node, browser */\n'use strict'\n/**\n * binds an event to Combokeys\n *\n * can be a single key, a combination of keys separated with +,\n * an array of keys, or a sequence of keys separated by spaces\n *\n * be sure to list the modifier keys first to make sure that the\n * correct key ends up getting bound (the last key in the pattern)\n *\n * @param {string|Array} keys\n * @param {Function} callback\n * @param {string=} action - \"keypress\", \"keydown\", or \"keyup\"\n * @returns void\n */\nmodule.exports = function (keys, callback, action) {\n  var self = this\n\n  keys = keys instanceof Array ? keys : [keys]\n  self.bindMultiple(keys, callback, action)\n  return self\n}\n","/* eslint-env node, browser */\n'use strict'\n\n/**\n * binds multiple combinations to the same callback\n *\n * @param {Array} combinations\n * @param {Function} callback\n * @param {string|undefined} action\n * @returns void\n */\nmodule.exports = function (combinations, callback, action) {\n  var self = this\n\n  for (var j = 0; j < combinations.length; ++j) {\n    self.bindSingle(combinations[j], callback, action)\n  }\n}\n","/* eslint-env node, browser */\n'use strict'\n\n/**\n * binds a key sequence to an event\n *\n * @param {string} combo - combo specified in bind call\n * @param {Array} keys\n * @param {Function} callback\n * @param {string=} action\n * @returns void\n */\nmodule.exports = function (combo, keys, callback, action) {\n  var self = this\n\n  // start off by adding a sequence level record for this combination\n  // and setting the level to 0\n  self.sequenceLevels[combo] = 0\n\n  /**\n   * callback to increase the sequence level for this sequence and reset\n   * all other sequences that were active\n   *\n   * @param {string} nextAction\n   * @returns {Function}\n   */\n  function increaseSequence (nextAction) {\n    return function () {\n      self.nextExpectedAction = nextAction\n      ++self.sequenceLevels[combo]\n      self.resetSequenceTimer()\n    }\n  }\n\n  /**\n   * wraps the specified callback inside of another function in order\n   * to reset all sequence counters as soon as this sequence is done\n   *\n   * @param {Event} e\n   * @returns void\n   */\n  function callbackAndReset (e) {\n    var characterFromEvent\n    self.fireCallback(callback, e, combo)\n\n    // we should ignore the next key up if the action is key down\n    // or keypress.  this is so if you finish a sequence and\n    // release the key the final key will not trigger a keyup\n    if (action !== 'keyup') {\n      characterFromEvent = require('../../helpers/characterFromEvent')\n      self.ignoreNextKeyup = characterFromEvent(e)\n    }\n\n    // weird race condition if a sequence ends with the key\n    // another sequence begins with\n    setTimeout(\n      function () {\n        self.resetSequences()\n      },\n      10\n    )\n  }\n\n  // loop through keys one at a time and bind the appropriate callback\n  // function.  for any key leading up to the final one it should\n  // increase the sequence. after the final, it should reset all sequences\n  //\n  // if an action is specified in the original bind call then that will\n  // be used throughout.  otherwise we will pass the action that the\n  // next key in the sequence should match.  this allows a sequence\n  // to mix and match keypress and keydown events depending on which\n  // ones are better suited to the key provided\n  for (var j = 0; j < keys.length; ++j) {\n    var isFinal = j + 1 === keys.length\n    var wrappedCallback = isFinal ? callbackAndReset : increaseSequence(action || self.getKeyInfo(keys[j + 1]).action)\n    self.bindSingle(keys[j], wrappedCallback, action, combo, j)\n  }\n}\n","/* eslint-env node, browser */\n'use strict'\n\n/**\n * binds a single keyboard combination\n *\n * @param {string} combination\n * @param {Function} callback\n * @param {string=} action\n * @param {string=} sequenceName - name of sequence if part of sequence\n * @param {number=} level - what part of the sequence the command is\n * @returns void\n */\nmodule.exports = function (combination, callback, action, sequenceName, level) {\n  var self = this\n\n  // store a direct mapped reference for use with Combokeys.trigger\n  self.directMap[combination + ':' + action] = callback\n\n  // make sure multiple spaces in a row become a single space\n  combination = combination.replace(/\\s+/g, ' ')\n\n  var sequence = combination.split(' ')\n  var info\n\n  // if this pattern is a sequence of keys then run through this method\n  // to reprocess each pattern one key at a time\n  if (sequence.length > 1) {\n    self.bindSequence(combination, sequence, callback, action)\n    return\n  }\n\n  info = self.getKeyInfo(combination, action)\n\n  // make sure to initialize array if this is the first time\n  // a callback is added for this key\n  self.callbacks[info.key] = self.callbacks[info.key] || []\n\n  // remove an existing match if there is one\n  self.getMatches(info.key, info.modifiers, {type: info.action}, sequenceName, combination, level)\n\n  // add this call back to the array\n  // if it is a sequence put it at the beginning\n  // if not put it at the end\n  //\n  // this is important because the way these are processed expects\n  // the sequence ones to come first\n  self.callbacks[info.key][sequenceName ? 'unshift' : 'push']({\n    callback: callback,\n    modifiers: info.modifiers,\n    action: info.action,\n    seq: sequenceName,\n    level: level,\n    combo: combination\n  })\n}\n","var off = require('./dom-event').off\nmodule.exports = function () {\n  var self = this\n  var element = self.element\n\n  off(element, 'keypress', self.eventHandler)\n  off(element, 'keydown', self.eventHandler)\n  off(element, 'keyup', self.eventHandler)\n}\n","module.exports = on\nmodule.exports.on = on\nmodule.exports.off = off\n\nfunction on (element, event, callback, capture) {\n  !element.addEventListener && (event = 'on' + event)\n  ;(element.addEventListener || element.attachEvent).call(element, event, callback, capture)\n  return callback\n}\n\nfunction off (element, event, callback, capture) {\n  !element.removeEventListener && (event = 'on' + event)\n  ;(element.removeEventListener || element.detachEvent).call(element, event, callback, capture)\n  return callback\n}\n","/* eslint-env node, browser */\n'use strict'\n\n/**\n * actually calls the callback function\n *\n * if your callback function returns false this will use the jquery\n * convention - prevent default and stop propogation on the event\n *\n * @param {Function} callback\n * @param {Event} e\n * @returns void\n */\nmodule.exports = function (callback, e, combo, sequence) {\n  var self = this\n  var preventDefault\n  var stopPropagation\n\n  // if this event should not happen stop here\n  if (self.stopCallback(e, e.target || e.srcElement, combo, sequence)) {\n    return\n  }\n\n  if (callback(e, combo) === false) {\n    preventDefault = require('../../helpers/preventDefault')\n    preventDefault(e)\n    stopPropagation = require('../../helpers/stopPropagation')\n    stopPropagation(e)\n  }\n}\n","/* eslint-env node, browser */\n'use strict'\n\n/**\n * Gets info for a specific key combination\n *\n * @param  {string} combination key combination (\"command+s\" or \"a\" or \"*\")\n * @param  {string=} action\n * @returns {Object}\n */\nmodule.exports = function (combination, action) {\n  var self = this\n  var keysFromString\n  var keys\n  var key\n  var j\n  var modifiers = []\n  var SPECIAL_ALIASES\n  var SHIFT_MAP\n  var isModifier\n\n  keysFromString = require('../../helpers/keysFromString')\n  // take the keys from this pattern and figure out what the actual\n  // pattern is all about\n  keys = keysFromString(combination)\n\n  SPECIAL_ALIASES = require('../../helpers/special-aliases')\n  SHIFT_MAP = require('../../helpers/shift-map')\n  isModifier = require('../../helpers/isModifier')\n  for (j = 0; j < keys.length; ++j) {\n    key = keys[j]\n\n    // normalize key names\n    if (SPECIAL_ALIASES[key]) {\n      key = SPECIAL_ALIASES[key]\n    }\n\n    // if this is not a keypress event then we should\n    // be smart about using shift keys\n    // this will only work for US keyboards however\n    if (action && action !== 'keypress' && SHIFT_MAP[key]) {\n      key = SHIFT_MAP[key]\n      modifiers.push('shift')\n    }\n\n    // if this key is a modifier then add it to the list of modifiers\n    if (isModifier(key)) {\n      modifiers.push(key)\n    }\n  }\n\n  // depending on what the key combination is\n  // we will try to pick the best event for it\n  action = self.pickBestAction(key, modifiers, action)\n\n  return {\n    key: key,\n    modifiers: modifiers,\n    action: action\n  }\n}\n","/* eslint-env node, browser */\n'use strict'\n\n/**\n * finds all callbacks that match based on the keycode, modifiers,\n * and action\n *\n * @param {string} character\n * @param {Array} modifiers\n * @param {Event|Object} e\n * @param {string=} sequenceName - name of the sequence we are looking for\n * @param {string=} combination\n * @param {number=} level\n * @returns {Array}\n */\nmodule.exports = function (character, modifiers, e, sequenceName, combination, level) {\n  var self = this\n  var j\n  var callback\n  var matches = []\n  var action = e.type\n  var isModifier\n  var modifiersMatch\n\n  if (\n      action === 'keypress' &&\n      // Firefox fires keypress for arrows\n      !(e.code && e.code.slice(0, 5) === 'Arrow')\n  ) {\n    // 'any-character' callbacks are only on `keypress`\n    var anyCharCallbacks = self.callbacks['any-character'] || []\n    anyCharCallbacks.forEach(function (callback) {\n      matches.push(callback)\n    })\n  }\n\n  if (!self.callbacks[character]) { return matches }\n\n  isModifier = require('../../helpers/isModifier')\n  // if a modifier key is coming up on its own we should allow it\n  if (action === 'keyup' && isModifier(character)) {\n    modifiers = [character]\n  }\n\n  // loop through all callbacks for the key that was pressed\n  // and see if any of them match\n  for (j = 0; j < self.callbacks[character].length; ++j) {\n    callback = self.callbacks[character][j]\n\n    // if a sequence name is not specified, but this is a sequence at\n    // the wrong level then move onto the next match\n    if (!sequenceName && callback.seq && self.sequenceLevels[callback.seq] !== callback.level) {\n      continue\n    }\n\n    // if the action we are looking for doesn't match the action we got\n    // then we should keep going\n    if (action !== callback.action) {\n      continue\n    }\n\n    // if this is a keypress event and the meta key and control key\n    // are not pressed that means that we need to only look at the\n    // character, otherwise check the modifiers as well\n    //\n    // chrome will not fire a keypress if meta or control is down\n    // safari will fire a keypress if meta or meta+shift is down\n    // firefox will fire a keypress if meta or control is down\n    modifiersMatch = require('./modifiersMatch')\n    if ((action === 'keypress' && !e.metaKey && !e.ctrlKey) || modifiersMatch(modifiers, callback.modifiers)) {\n      // when you bind a combination or sequence a second time it\n      // should overwrite the first one.  if a sequenceName or\n      // combination is specified in this call it does just that\n      //\n      // @todo make deleting its own method?\n      var deleteCombo = !sequenceName && callback.combo === combination\n      var deleteSequence = sequenceName && callback.seq === sequenceName && callback.level === level\n      if (deleteCombo || deleteSequence) {\n        self.callbacks[character].splice(j, 1)\n      }\n\n      matches.push(callback)\n    }\n  }\n\n  return matches\n}\n","/* eslint-env node, browser */\n'use strict'\n\n/**\n * reverses the map lookup so that we can look for specific keys\n * to see what can and can't use keypress\n *\n * @return {Object}\n */\nmodule.exports = function () {\n  var self = this\n  var constructor = self.constructor\n  var SPECIAL_KEYS_MAP\n\n  if (!constructor.REVERSE_MAP) {\n    constructor.REVERSE_MAP = {}\n    SPECIAL_KEYS_MAP = require('../../helpers/special-keys-map')\n    for (var key in SPECIAL_KEYS_MAP) {\n      // pull out the numeric keypad from here cause keypress should\n      // be able to detect the keys from the character\n      if (key > 95 && key < 112) {\n        continue\n      }\n\n      if (SPECIAL_KEYS_MAP.hasOwnProperty(key)) {\n        constructor.REVERSE_MAP[SPECIAL_KEYS_MAP[key]] = key\n      }\n    }\n  }\n  return constructor.REVERSE_MAP\n}\n","/* eslint-env node, browser */\n'use strict'\n\n/**\n * handles a character key event\n *\n * @param {string} character\n * @param {Array} modifiers\n * @param {Event} e\n * @returns void\n */\nmodule.exports = function (character, modifiers, e) {\n  var self = this\n  var callbacks\n  var j\n  var doNotReset = {}\n  var maxLevel = 0\n  var processedSequenceCallback = false\n  var isModifier\n  var ignoreThisKeypress\n\n  callbacks = self.getMatches(character, modifiers, e)\n  // Calculate the maxLevel for sequences so we can only execute the longest callback sequence\n  for (j = 0; j < callbacks.length; ++j) {\n    if (callbacks[j].seq) {\n      maxLevel = Math.max(maxLevel, callbacks[j].level)\n    }\n  }\n\n  // loop through matching callbacks for this key event\n  for (j = 0; j < callbacks.length; ++j) {\n    // fire for all sequence callbacks\n    // this is because if for example you have multiple sequences\n    // bound such as \"g i\" and \"g t\" they both need to fire the\n    // callback for matching g cause otherwise you can only ever\n    // match the first one\n    if (callbacks[j].seq) {\n      // only fire callbacks for the maxLevel to prevent\n      // subsequences from also firing\n      //\n      // for example 'a option b' should not cause 'option b' to fire\n      // even though 'option b' is part of the other sequence\n      //\n      // any sequences that do not match here will be discarded\n      // below by the resetSequences call\n      if (callbacks[j].level !== maxLevel) {\n        continue\n      }\n\n      processedSequenceCallback = true\n\n      // keep a list of which sequences were matches for later\n      doNotReset[callbacks[j].seq] = 1\n      self.fireCallback(callbacks[j].callback, e, callbacks[j].combo, callbacks[j].seq)\n      continue\n    }\n\n    // if there were no sequence matches but we are still here\n    // that means this is a regular match so we should fire that\n    if (!processedSequenceCallback) {\n      self.fireCallback(callbacks[j].callback, e, callbacks[j].combo)\n    }\n  }\n\n  // if the key you pressed matches the type of sequence without\n  // being a modifier (ie \"keyup\" or \"keypress\") then we should\n  // reset all sequences that were not matched by this event\n  //\n  // this is so, for example, if you have the sequence \"h a t\" and you\n  // type \"h e a r t\" it does not match.  in this case the \"e\" will\n  // cause the sequence to reset\n  //\n  // modifier keys are ignored because you can have a sequence\n  // that contains modifiers such as \"enter ctrl+space\" and in most\n  // cases the modifier key will be pressed before the next key\n  //\n  // also if you have a sequence such as \"ctrl+b a\" then pressing the\n  // \"b\" key will trigger a \"keypress\" and a \"keydown\"\n  //\n  // the \"keydown\" is expected when there is a modifier, but the\n  // \"keypress\" ends up matching the nextExpectedAction since it occurs\n  // after and that causes the sequence to reset\n  //\n  // we ignore keypresses in a sequence that directly follow a keydown\n  // for the same character\n  ignoreThisKeypress = e.type === 'keypress' && self.ignoreNextKeypress\n  isModifier = require('../../helpers/isModifier')\n  if (e.type === self.nextExpectedAction && !isModifier(character) && !ignoreThisKeypress) {\n    self.resetSequences(doNotReset)\n  }\n\n  self.ignoreNextKeypress = processedSequenceCallback && e.type === 'keydown'\n}\n","/* eslint-env node, browser */\n'use strict'\n\n/**\n * handles a keydown event\n *\n * @param {Event} e\n * @returns void\n */\nmodule.exports = function (e) {\n  var self = this\n  var characterFromEvent\n  var eventModifiers\n\n  // normalize e.which for key events\n  // @see http://stackoverflow.com/questions/4285627/javascript-keycode-vs-charcode-utter-confusion\n  if (typeof e.which !== 'number') {\n    e.which = e.keyCode\n  }\n  characterFromEvent = require('../../helpers/characterFromEvent')\n  var character = characterFromEvent(e)\n\n  // no character found then stop\n  if (character === undefined) {\n    return\n  }\n\n  // need to use === for the character check because the character can be 0\n  if (e.type === 'keyup' && self.ignoreNextKeyup === character) {\n    self.ignoreNextKeyup = false\n    return\n  }\n\n  eventModifiers = require('../../helpers/eventModifiers')\n  self.handleKey(character, eventModifiers(e), e)\n}\n","/* eslint-env node, browser */\n'use strict'\n\n/**\n * checks if two arrays are equal\n *\n * @param {Array} modifiers1\n * @param {Array} modifiers2\n * @returns {boolean}\n */\nmodule.exports = function (modifiers1, modifiers2) {\n  return modifiers1.sort().join(',') === modifiers2.sort().join(',')\n}\n","/* eslint-env node, browser */\n'use strict'\n\n/**\n * picks the best action based on the key combination\n *\n * @param {string} key - character for key\n * @param {Array} modifiers\n * @param {string=} action passed in\n */\nmodule.exports = function (key, modifiers, action) {\n  var self = this\n\n  // if no action was picked in we should try to pick the one\n  // that we think would work best for this key\n  if (!action) {\n    action = self.getReverseMap()[key] ? 'keydown' : 'keypress'\n  }\n\n  // modifier keys don't work as expected with keypress,\n  // switch to keydown\n  if (action === 'keypress' && modifiers.length) {\n    action = 'keydown'\n  }\n\n  return action\n}\n","/* eslint-env node, browser */\n'use strict'\n\n/**\n * resets the library back to its initial state. This is useful\n * if you want to clear out the current keyboard shortcuts and bind\n * new ones - for example if you switch to another page\n *\n * @returns void\n */\nmodule.exports = function () {\n  var self = this\n  self.callbacks = {}\n  self.directMap = {}\n  return this\n}\n","/* eslint-env node, browser */\n'use strict'\n/**\n * called to set a 1 second timeout on the specified sequence\n *\n * this is so after each key press in the sequence you have 1 second\n * to press the next key before you have to start over\n *\n * @returns void\n */\nmodule.exports = function () {\n  var self = this\n\n  clearTimeout(self.resetTimer)\n  self.resetTimer = setTimeout(\n    function () {\n      self.resetSequences()\n    },\n    1000\n  )\n}\n","/* eslint-env node, browser */\n'use strict'\n\n/**\n * resets all sequence counters except for the ones passed in\n *\n * @param {Object} doNotReset\n * @returns void\n */\nmodule.exports = function (doNotReset) {\n  var self = this\n\n  doNotReset = doNotReset || {}\n\n  var activeSequences = false\n  var key\n\n  for (key in self.sequenceLevels) {\n    if (doNotReset[key]) {\n      activeSequences = true\n      continue\n    }\n    self.sequenceLevels[key] = 0\n  }\n\n  if (!activeSequences) {\n    self.nextExpectedAction = false\n  }\n}\n","/* eslint-env node, browser */\n'use strict'\n\n/**\n* should we stop this event before firing off callbacks\n*\n* @param {Event} e\n* @param {Element} element\n* @return {boolean}\n*/\nmodule.exports = function (e, element) {\n  // if the element has the class \"combokeys\" then no need to stop\n  if ((' ' + element.className + ' ').indexOf(' combokeys ') > -1) {\n    return false\n  }\n\n  var tagName = element.tagName.toLowerCase()\n\n  // stop for input, select, and textarea\n  return tagName === 'input' || tagName === 'select' || tagName === 'textarea' || element.isContentEditable\n}\n","/* eslint-env node, browser */\n'use strict'\n/**\n * triggers an event that has already been bound\n *\n * @param {string} keys\n * @param {string=} action\n * @returns void\n */\nmodule.exports = function (keys, action) {\n  var self = this\n  if (self.directMap[keys + ':' + action]) {\n    self.directMap[keys + ':' + action]({}, keys)\n  }\n  return this\n}\n","/* eslint-env node, browser */\n'use strict'\n/**\n * unbinds an event to Combokeys\n *\n * the unbinding sets the callback function of the specified key combo\n * to an empty function and deletes the corresponding key in the\n * directMap dict.\n *\n * TODO: actually remove this from the callbacks dictionary instead\n * of binding an empty function\n *\n * the keycombo+action has to be exactly the same as\n * it was defined in the bind method\n *\n * @param {string|Array} keys\n * @param {string} action\n * @returns void\n */\nmodule.exports = function (keys, action) {\n  var self = this\n\n  return self.bind(keys, function () {}, action)\n}\n","/* eslint-env node, browser */\n'use strict'\n\nmodule.exports = function () {\n  var self = this\n\n  self.instances.forEach(function (combokeys) {\n    combokeys.reset()\n  })\n}\n","/* eslint-env node, browser */\n'use strict'\n\n/**\n * takes the event and returns the key character\n *\n * @param {Event} e\n * @return {string}\n */\nmodule.exports = function (e) {\n  var SPECIAL_KEYS_MAP,\n    SPECIAL_CHARACTERS_MAP\n  SPECIAL_KEYS_MAP = require('./special-keys-map')\n  SPECIAL_CHARACTERS_MAP = require('./special-characters-map')\n\n  // for keypress events we should return the character as is\n  if (e.type === 'keypress') {\n    var character = String.fromCharCode(e.which)\n\n    // if the shift key is not pressed then it is safe to assume\n    // that we want the character to be lowercase.  this means if\n    // you accidentally have caps lock on then your key bindings\n    // will continue to work\n    //\n    // the only side effect that might not be desired is if you\n    // bind something like 'A' cause you want to trigger an\n    // event when capital A is pressed caps lock will no longer\n    // trigger the event.  shift+a will though.\n    if (!e.shiftKey) {\n      character = character.toLowerCase()\n    }\n\n    return character\n  }\n\n  // for non keypress events the special maps are needed\n  if (SPECIAL_KEYS_MAP[e.which] !== undefined) {\n    return SPECIAL_KEYS_MAP[e.which]\n  }\n\n  if (SPECIAL_CHARACTERS_MAP[e.which] !== undefined) {\n    return SPECIAL_CHARACTERS_MAP[e.which]\n  }\n\n  // if it is not in the special map\n\n  // with keydown and keyup events the character seems to always\n  // come in as an uppercase character whether you are pressing shift\n  // or not.  we should make sure it is always lowercase for comparisons\n  return String.fromCharCode(e.which).toLowerCase()\n}\n","/* eslint-env node, browser */\n'use strict'\n\n/**\n * takes a key event and figures out what the modifiers are\n *\n * @param {Event} e\n * @returns {Array}\n */\nmodule.exports = function (e) {\n  var modifiers = []\n\n  if (e.shiftKey) {\n    modifiers.push('shift')\n  }\n\n  if (e.altKey) {\n    modifiers.push('alt')\n  }\n\n  if (e.ctrlKey) {\n    modifiers.push('ctrl')\n  }\n\n  if (e.metaKey) {\n    modifiers.push('meta')\n  }\n\n  return modifiers\n}\n","/* eslint-env node, browser */\n'use strict'\n\n/**\n * determines if the keycode specified is a modifier key or not\n *\n * @param {string} key\n * @returns {boolean}\n */\nmodule.exports = function (key) {\n  return key === 'shift' || key === 'ctrl' || key === 'alt' || key === 'meta'\n}\n","/* eslint-env node, browser */\n'use strict'\n\n/**\n * Converts from a string key combination to an array\n *\n * @param  {string} combination like \"command+shift+l\"\n * @return {Array}\n */\nmodule.exports = function (combination) {\n  if (combination === '+') {\n    return ['+']\n  }\n\n  return combination.split('+')\n}\n","/* eslint-env node, browser */\n'use strict'\n\n/**\n * prevents default for this event\n *\n * @param {Event} e\n * @returns void\n */\nmodule.exports = function (e) {\n  if (e.preventDefault) {\n    e.preventDefault()\n    return\n  }\n\n  e.returnValue = false\n}\n","/* eslint-env node, browser */\n'use strict'\n/**\n * this is a mapping of keys that require shift on a US keypad\n * back to the non shift equivelents\n *\n * this is so you can use keyup events with these keys\n *\n * note that this will only work reliably on US keyboards\n *\n * @type {Object}\n */\nmodule.exports = {\n  '~': '`',\n  '!': '1',\n  '@': '2',\n  '#': '3',\n  '$': '4',\n  '%': '5',\n  '^': '6',\n  '&': '7',\n  '*': '8',\n  '(': '9',\n  ')': '0',\n  '_': '-',\n  '+': '=',\n  ':': ';',\n  '\"': \"'\",\n  '<': ',',\n  '>': '.',\n  '?': '/',\n  '|': '\\\\'\n}\n","/* eslint-env node, browser */\n'use strict'\n/**\n * this is a list of special strings you can use to map\n * to modifier keys when you specify your keyboard shortcuts\n *\n * @type {Object}\n */\nmodule.exports = {\n  'option': 'alt',\n  'command': 'meta',\n  'return': 'enter',\n  'escape': 'esc',\n  'mod': /Mac|iPod|iPhone|iPad/.test(navigator.platform) ? 'meta' : 'ctrl'\n}\n","/* eslint-env node, browser */\n'use strict'\n/**\n * mapping for special characters so they can support\n *\n * this dictionary is only used incase you want to bind a\n * keyup or keydown event to one of these keys\n *\n * @type {Object}\n */\nmodule.exports = {\n  106: '*',\n  107: 'plus',\n  109: 'minus',\n  110: '.',\n  111: '/',\n  186: ';',\n  187: '=',\n  188: ',',\n  189: '-',\n  190: '.',\n  191: '/',\n  192: '`',\n  219: '[',\n  220: '\\\\',\n  221: ']',\n  222: \"'\"\n}\n","/* eslint-env node, browser */\n'use strict'\n/**\n * mapping of special keycodes to their corresponding keys\n *\n * everything in this dictionary cannot use keypress events\n * so it has to be here to map to the correct keycodes for\n * keyup/keydown events\n *\n * @type {Object}\n */\nmodule.exports = {\n  8: 'backspace',\n  9: 'tab',\n  13: 'enter',\n  16: 'shift',\n  17: 'ctrl',\n  18: 'alt',\n  20: 'capslock',\n  27: 'esc',\n  32: 'space',\n  33: 'pageup',\n  34: 'pagedown',\n  35: 'end',\n  36: 'home',\n  37: 'left',\n  38: 'up',\n  39: 'right',\n  40: 'down',\n  45: 'ins',\n  46: 'del',\n  91: 'meta',\n  93: 'meta',\n  173: 'minus',\n  187: 'plus',\n  189: 'minus',\n  224: 'meta'\n}\n\n/**\n * loop through the f keys, f1 to f19 and add them to the map\n * programatically\n */\nfor (var i = 1; i < 20; ++i) {\n  module.exports[111 + i] = 'f' + i\n}\n\n/**\n * loop through to map numbers on the numeric keypad\n */\nfor (i = 0; i <= 9; ++i) {\n  module.exports[i + 96] = i\n}\n","/* eslint-env node, browser */\n'use strict'\n\n/**\n * stops propogation for this event\n *\n * @param {Event} e\n * @returns void\n */\nmodule.exports = function (e) {\n  if (e.stopPropagation) {\n    e.stopPropagation()\n    return\n  }\n\n  e.cancelBubble = true\n}\n","\"use strict\";\n\nvar deselectCurrent = require(\"toggle-selection\");\n\nvar clipboardToIE11Formatting = {\n  \"text/plain\": \"Text\",\n  \"text/html\": \"Url\",\n  \"default\": \"Text\"\n}\n\nvar defaultMessage = \"Copy to clipboard: #{key}, Enter\";\n\nfunction format(message) {\n  var copyKey = (/mac os x/i.test(navigator.userAgent) ? \"⌘\" : \"Ctrl\") + \"+C\";\n  return message.replace(/#{\\s*key\\s*}/g, copyKey);\n}\n\nfunction copy(text, options) {\n  var debug,\n    message,\n    reselectPrevious,\n    range,\n    selection,\n    mark,\n    success = false;\n  if (!options) {\n    options = {};\n  }\n  debug = options.debug || false;\n  try {\n    reselectPrevious = deselectCurrent();\n\n    range = document.createRange();\n    selection = document.getSelection();\n\n    mark = document.createElement(\"span\");\n    mark.textContent = text;\n    // reset user styles for span element\n    mark.style.all = \"unset\";\n    // prevents scrolling to the end of the page\n    mark.style.position = \"fixed\";\n    mark.style.top = 0;\n    mark.style.clip = \"rect(0, 0, 0, 0)\";\n    // used to preserve spaces and line breaks\n    mark.style.whiteSpace = \"pre\";\n    // do not inherit user-select (it may be `none`)\n    mark.style.webkitUserSelect = \"text\";\n    mark.style.MozUserSelect = \"text\";\n    mark.style.msUserSelect = \"text\";\n    mark.style.userSelect = \"text\";\n    mark.addEventListener(\"copy\", function(e) {\n      e.stopPropagation();\n      if (options.format) {\n        e.preventDefault();\n        if (typeof e.clipboardData === \"undefined\") { // IE 11\n          debug && console.warn(\"unable to use e.clipboardData\");\n          debug && console.warn(\"trying IE specific stuff\");\n          window.clipboardData.clearData();\n          var format = clipboardToIE11Formatting[options.format] || clipboardToIE11Formatting[\"default\"]\n          window.clipboardData.setData(format, text);\n        } else { // all other browsers\n          e.clipboardData.clearData();\n          e.clipboardData.setData(options.format, text);\n        }\n      }\n      if (options.onCopy) {\n        e.preventDefault();\n        options.onCopy(e.clipboardData);\n      }\n    });\n\n    document.body.appendChild(mark);\n\n    range.selectNodeContents(mark);\n    selection.addRange(range);\n\n    var successful = document.execCommand(\"copy\");\n    if (!successful) {\n      throw new Error(\"copy command was unsuccessful\");\n    }\n    success = true;\n  } catch (err) {\n    debug && console.error(\"unable to copy using execCommand: \", err);\n    debug && console.warn(\"trying IE specific stuff\");\n    try {\n      window.clipboardData.setData(options.format || \"text\", text);\n      options.onCopy && options.onCopy(window.clipboardData);\n      success = true;\n    } catch (err) {\n      debug && console.error(\"unable to copy using clipboardData: \", err);\n      debug && console.error(\"falling back to prompt\");\n      message = format(\"message\" in options ? options.message : defaultMessage);\n      window.prompt(message, text);\n    }\n  } finally {\n    if (selection) {\n      if (typeof selection.removeRange == \"function\") {\n        selection.removeRange(range);\n      } else {\n        selection.removeAllRanges();\n      }\n    }\n\n    if (mark) {\n      document.body.removeChild(mark);\n    }\n    reselectPrevious();\n  }\n\n  return success;\n}\n\nmodule.exports = copy;\n","module.exports = function deepFreeze (o) {\n  Object.freeze(o);\n\n  Object.getOwnPropertyNames(o).forEach(function (prop) {\n    if (o.hasOwnProperty(prop)\n    && o[prop] !== null\n    && (typeof o[prop] === \"object\" || typeof o[prop] === \"function\")\n    && !Object.isFrozen(o[prop])) {\n      deepFreeze(o[prop]);\n    }\n  });\n  \n  return o;\n};\n","/*\n * Fuzzy\n * https://github.com/myork/fuzzy\n *\n * Copyright (c) 2012 Matt York\n * Licensed under the MIT license.\n */\n\n(function() {\n\nvar root = this;\n\nvar fuzzy = {};\n\n// Use in node or in browser\nif (typeof exports !== 'undefined') {\n  module.exports = fuzzy;\n} else {\n  root.fuzzy = fuzzy;\n}\n\n// Return all elements of `array` that have a fuzzy\n// match against `pattern`.\nfuzzy.simpleFilter = function(pattern, array) {\n  return array.filter(function(str) {\n    return fuzzy.test(pattern, str);\n  });\n};\n\n// Does `pattern` fuzzy match `str`?\nfuzzy.test = function(pattern, str) {\n  return fuzzy.match(pattern, str) !== null;\n};\n\n// If `pattern` matches `str`, wrap each matching character\n// in `opts.pre` and `opts.post`. If no match, return null\nfuzzy.match = function(pattern, str, opts) {\n  opts = opts || {};\n  var patternIdx = 0\n    , result = []\n    , len = str.length\n    , totalScore = 0\n    , currScore = 0\n    // prefix\n    , pre = opts.pre || ''\n    // suffix\n    , post = opts.post || ''\n    // String to compare against. This might be a lowercase version of the\n    // raw string\n    , compareString =  opts.caseSensitive && str || str.toLowerCase()\n    , ch;\n\n  pattern = opts.caseSensitive && pattern || pattern.toLowerCase();\n\n  // For each character in the string, either add it to the result\n  // or wrap in template if it's the next string in the pattern\n  for(var idx = 0; idx < len; idx++) {\n    ch = str[idx];\n    if(compareString[idx] === pattern[patternIdx]) {\n      ch = pre + ch + post;\n      patternIdx += 1;\n\n      // consecutive characters should increase the score more than linearly\n      currScore += 1 + currScore;\n    } else {\n      currScore = 0;\n    }\n    totalScore += currScore;\n    result[result.length] = ch;\n  }\n\n  // return rendered string if we have a match for every char\n  if(patternIdx === pattern.length) {\n    // if the string is an exact match with pattern, totalScore should be maxed\n    totalScore = (compareString === pattern) ? Infinity : totalScore;\n    return {rendered: result.join(''), score: totalScore};\n  }\n\n  return null;\n};\n\n// The normal entry point. Filters `arr` for matches against `pattern`.\n// It returns an array with matching values of the type:\n//\n//     [{\n//         string:   '<b>lah' // The rendered string\n//       , index:    2        // The index of the element in `arr`\n//       , original: 'blah'   // The original element in `arr`\n//     }]\n//\n// `opts` is an optional argument bag. Details:\n//\n//    opts = {\n//        // string to put before a matching character\n//        pre:     '<b>'\n//\n//        // string to put after matching character\n//      , post:    '</b>'\n//\n//        // Optional function. Input is an entry in the given arr`,\n//        // output should be the string to test `pattern` against.\n//        // In this example, if `arr = [{crying: 'koala'}]` we would return\n//        // 'koala'.\n//      , extract: function(arg) { return arg.crying; }\n//    }\nfuzzy.filter = function(pattern, arr, opts) {\n  if(!arr || arr.length === 0) {\n    return [];\n  }\n  if (typeof pattern !== 'string') {\n    return arr;\n  }\n  opts = opts || {};\n  return arr\n    .reduce(function(prev, element, idx, arr) {\n      var str = element;\n      if(opts.extract) {\n        str = opts.extract(element);\n      }\n      var rendered = fuzzy.match(pattern, str, opts);\n      if(rendered != null) {\n        prev[prev.length] = {\n            string: rendered.rendered\n          , score: rendered.score\n          , index: idx\n          , original: element\n        };\n      }\n      return prev;\n    }, [])\n\n    // Sort by score. Browsers are inconsistent wrt stable/unstable\n    // sorting, so force stable by using the index in the case of tie.\n    // See http://ofb.net/~sethml/is-sort-stable.html\n    .sort(function(a,b) {\n      var compare = b.score - a.score;\n      if(compare) return compare;\n      return a.index - b.index;\n    });\n};\n\n\n}());\n\n","\nmodule.exports = function () {\n  var selection = document.getSelection();\n  if (!selection.rangeCount) {\n    return function () {};\n  }\n  var active = document.activeElement;\n\n  var ranges = [];\n  for (var i = 0; i < selection.rangeCount; i++) {\n    ranges.push(selection.getRangeAt(i));\n  }\n\n  switch (active.tagName.toUpperCase()) { // .toUpperCase handles XHTML\n    case 'INPUT':\n    case 'TEXTAREA':\n      active.blur();\n      break;\n\n    default:\n      active = null;\n      break;\n  }\n\n  selection.removeAllRanges();\n  return function () {\n    selection.type === 'Caret' &&\n    selection.removeAllRanges();\n\n    if (!selection.rangeCount) {\n      ranges.forEach(function(range) {\n        selection.addRange(range);\n      });\n    }\n\n    active &&\n    active.focus();\n  };\n};\n"],"names":["insertWithoutScoping","cache","serialized","undefined","inserted","name","insert","sheet","merge","registered","css","className","registeredStyles","rawClassName","length","classnames","args","cls","i","arg","toAdd","Array","isArray","k","options","speedy","value","this","isSpeedy","compat","_len","arguments","_key","key","cx","_len4","_key4","injectGlobal","_len3","_key3","keyframes","_len2","_key2","animation","styles","hydrate","ids","forEach","flush","getRegisteredStyles","bind","_createEmotion","autoColor","theme","hex","base","isLight","color","tinycolor","clone","lighten","darken","includeFallbackColors","toHex8String","toHsl","l","newColor","scrollPageDown","binding","label","scrollPageUp","scrollToNextVisibleSpan","scrollToPrevVisibleSpan","panLeft","panLeftFast","panRight","panRightFast","zoomIn","zoomInFast","zoomOut","zoomOutFast","collapseAll","expandAll","collapseOne","expandOne","searchSpans","clearSearch","instance","getInstance","local","Combokeys","document","body","ExternalLinkContext","React","displayName","ONE_MILLISECOND","ONE_SECOND","ONE_MINUTE","ONE_HOUR","DEFAULT_MS_PRECISION","Math","log10","UNIT_STEPS","unit","microseconds","ofPrevious","quantizeDuration","duration","floatPrecision","conversionFactor","number","precision","targetPrecision","floor","abs","trunc","Number","toPrecision","toFloatPrecision","formatDuration","primaryUnit","secondaryUnit","_dropWhile","index","_round","primaryUnitString","secondaryValue","round","secondaryUnitString","spanHasTag","span","tags","some","tag","isClientSpan","isServerSpan","isErrorBool","isErrorStr","isErrorSpan","getStyles","Ticks","TicksTick","TicksTickLabel","TicksTickLabelEndAnchor","props","endTime","numTicks","showLabels","startTime","labels","viewingDuration","durationAtTick","push","useStyles2","ticks","portion","style","left","defaultProps","flexRow","TimelineRow","children","rest","TimelineRowCell","width","widthPercent","mergedStyle","flexBasis","maxWidth","ubRelative","Cell","TimelineCollapser","onExpandAll","onExpandOne","onCollapseAll","onCollapseOne","IconButton","tooltip","size","tooltipPlacement","onClick","EUpdateTypes","DraggableManager","constructor","getBounds","resetBoundsOnResize","_bounds","event","button","clientX","type","eventType","_isDragging","handler","_onMouseEnter","_onMouseLeave","Error","_onMouseMove","x","_getPosition","manager","window","addEventListener","_handleDragEvent","_get","userSelect","_onDragStart","_onDragMove","_stopDragging","_onDragEnd","handleMouseDown","handleMouseEnter","_handleMinorMouseEvent","handleMouseMove","handleMouseLeave","_resetBoundsOnResize","Boolean","resetBounds","onMouseEnter","onMouseLeave","onMouseMove","onDragStart","onDragMove","onDragEnd","_getBounds","clientXLeft","maxValue","minValue","removeEventListener","isDragging","dispose","stylesFactory","TimelineColumnResizer","wrapper","dragger","draggerDragging","draggerDraggingLeft","draggerDraggingRight","gripIcon","gripIconDragging","super","elm","_rootElm","getBoundingClientRect","min","max","setState","dragPosition","onChange","_dragManager","_getDraggingBounds","_handleDragEnd","_handleDragUpdate","state","componentWillUnmount","render","draggerStyle","position","columnResizeHandleHeight","gripStyle","isDraggingLeft","isDraggingRight","right","height","ref","_setRootElm","onMouseDown","TimelineViewingLayer","TimelineViewingLayerCursorGuide","TimelineViewingLayerDragged","TimelineViewingLayerDraggedDraggingLeft","TimelineViewingLayerDraggedDraggingRight","TimelineViewingLayerDraggedShiftDrag","TimelineViewingLayerDraggedReframeDrag","TimelineViewingLayerFullOverlay","mapFromViewSubRange","viewStart","viewEnd","mapToViewSubRange","getMarkers","from","to","isShift","layout","start","isOutOfView","getNextViewLayout","Reflect","has","_root","viewRangeTime","current","cursor","updateNextViewRangeTime","reframe","shift","update","anchor","end","updateViewRangeTime","_draggerReframe","_handleReframeDragEnd","_handleReframeDragUpdate","_handleReframeMouseLeave","_handleReframeMouseMove","UNSAFE_componentWillReceiveProps","nextProps","boundsInvalidator","shiftEnd","shiftStart","cusrorPosition","_setRoot","TimelineHeaderRow","TimelineHeaderRowTitle","TimelineHeaderWrapper","nameColumnWidth","onColummWidthChange","ubFlex","ubPx2","strToRgb","s","r","slice","g","b","parseInt","ColorGenerator","colorsHex","colorsRgb","map","Map","currentIdx","_getColorIndex","get","set","getColorByKey","getRgbColorByKey","clear","getGenerator","memoizeOne","colors","Positions","bufferLen","ys","heights","dataLen","lastI","profileData","dataLength","calcHeights","heightGetter","forcedLastI","_max","h","calcYs","yValue","confirmHeight","_i","chg","findFloorIndex","imin","imax","getRowPosition","y","getEstimatedHeight","known","DEFAULT_INITIAL_DRAW","ListView","_viewHeight","bottomY","_scrollTop","_yPositions","_getHeight","scrollElement","scrollElementTop","top","listViewOffset","scrollTop","_itemHolderElm","itemOffset","scrollTo","_isScrolledOrResized","requestAnimationFrame","_positionList","_wrapperElm","_calcViewIndexes","maxStart","viewBufferMin","_startIndex","minEnd","_endIndex","_startIndexDrawn","_endIndexDrawn","forceUpdate","windowScroller","clientHeight","_scanItemHeights","getIndexFromKey","lowDirtyKey","highDirtyKey","isDirty","nodes","childNodes","node","itemKey","getAttribute","console","warn","observed","firstElementChild","_knownHeights","getKeyFromIndex","itemHeightGetter","_htmlTopOffset","_windowScrollListenerAdded","_htmlElm","documentElement","componentDidMount","_onScroll","componentDidUpdate","_isViewChanged","useRoot","innerHeight","scrollY","yStart","yEnd","initialDraw","itemRenderer","viewBuffer","items","attrs","wrapperProps","_initWrapper","onScroll","overflowY","scrollerStyle","margin","padding","itemsWrapperClassName","_initItemHolder","ReferenceLink","reference","focusSpan","otherProps","role","spanID","createLinkToExternalSpan","href","traceID","target","rel","MultiParent","TraceRefLink","NewWindowIcon","references","tooltipText","Tooltip","content","Popover","overlayClassName","popoverRef","useRef","PopoverController","hideAfter","showPopper","hidePopper","popperProps","referenceElement","wrapperClassName","CopyIcon","hasCopied","copy","copyText","visible","tooltipTitle","Button","icon","handleClick","copyIconClassName","KeyValueTable","row","keyColumn","copyColumn","linkIcon","jsonObjectOrArrayStartRegex","parseIfComplexJson","test","JSON","parse","_","LinkValue","title","Icon","KeyValuesTable","data","linksGetter","uWidth100","markup","__html","jsonMarkup","jsonTable","ubInlineBlock","dangerouslySetInnerHTML","links","valueMarkup","url","text","stringify","header","headerEmpty","headerHighContrast","emptyIcon","summary","summaryItem","summaryLabel","summaryDelim","KeyValuesSummary","item","String","AccordianKeyValues","highContrast","interactive","isOpen","onToggle","isEmpty","iconCls","uAlignIcon","arrow","headerProps","uTxEllipsis","AccordianLogs","AccordianLogsHeader","AccordianLogsContent","AccordianLogsFooter","logs","openedItems","onItemToggle","timestamp","HeaderComponent","_sortBy","log","ubMb1","fields","bar","rpc","logMarker","toPercent","toFixed","SpanBar","getViewedBounds","shortLabel","longLabel","traceStartTime","labelClassName","setLabel","useState","logGroups","_groupBy","posPercent","onMouseOver","background","Object","keys","positionKey","getFirstAncestor","_find","refType","SpanTreeOffset","SpanTreeOffsetParent","indentGuide","indentGuideActive","iconWrapper","UnthemedSpanTreeOffset","ancestorId","relatedTarget","HTMLSpanElement","removeHoverIndentGuideId","addHoverIndentGuideId","ancestorIds","ancestorIDs","spanAncestorIds","reverse","childrenVisible","showChildrenIcon","hasChildren","hoverIndentGuideIds","withTheme2","spanBarClassName","spanBarLabelClassName","nameWrapperClassName","nameWrapperMatchingFilterClassName","viewClassName","nameColumnClassName","animations","nameWrapper","nameWrapperMatchingFilter","nameColumn","endpointName","view","viewExpanded","viewExpandedAndMatchingFilter","rowClippingLeft","rowClippingRight","rowExpanded","rowMatchingFilter","rowFocused","rowExpandedAndMatchingFilter","nameDetailExpanded","svcName","svcNameChildrenCollapsed","errorIcon","rpcColorMarker","labelRight","labelLeft","UnthemedSpanBarRow","onDetailToggled","onChildrenToggled","columnDivision","isChildrenExpanded","isDetailExpanded","isMatchingFilter","isFocused","noInstrumentedServer","showErrorIcon","clippingLeft","clippingRight","createSpanLink","isParent","operationName","process","serviceName","viewBounds","labelDetail","hintClassName","_childrenToggle","_detailToggle","borderColor","tabIndex","backgroundColor","errorIconColor","link","marginRight","ctrlKey","metaKey","shiftKey","preventDefault","subsidiarilyReferencedBy","Divider","DividerVertical","DividerHorizontal","LabeledList","divider","LabeledListItem","LabeledListLabel","LabeledListValue","AccordianReferenceItem","AccordianReferences","AccordianReferencesHeader","AccordianReferencesContent","AccordianReferencesFooter","ReferencesList","list","itemContent","debugInfo","debugLabel","References","TextList","List","DefaultTextComponent","AccordianText","headerClassName","TextComponent","accordianKeyValuesStyles","getAccordianKeyValuesStyles","listWrapper","debugValue","AccordianWarnings","AccordianWarningsHeader","AccordianWarningsHeaderOpen","AccordianWarningsLabel","Textarea","LinkIcon","SpanDetail","detailState","logItemToggle","logsToggle","processToggle","tagsToggle","warningsToggle","stackTracesToggle","referencesToggle","referenceItemToggle","createFocusSpanLink","isTagsOpen","isProcessOpen","logsState","isWarningsOpen","referencesState","isStackTracesOpen","relativeStartTime","warnings","stackTraces","overviewItems","childSpanCount","focusSpanLink","ubM0","ubTxRightAlign","DataLinkButton","buttonProps","ubMy1","logItem","textComponentProps","stackTrace","join","TextArea","readOnly","cols","rows","e","currentTarget","altKey","expandedAccent","infoWrapper","UnthemedSpanDetailRow","itemIndex","focusedSpanId","overflow","borderTopColor","_linksGetter","rowsWrapper","scrollToTopButton","DEFAULT_HEIGHTS","memoizedGenerateRowStates","trace","childrenHiddenIDs","detailStates","spans","collapseDepth","rowStates","depth","hidden","isDetail","spanIndex","generateRowStates","memoizedViewBoundsFunc","viewRange","viewMin","viewWindow","isEqual","memoizedGetClipping","currentViewRange","zoomStart","zoomEnd","UnthemedVirtualizedTraceView","createRef","currentViewRangeTime","findMatchesIDs","getRowStates","listView","isChanged","registerAccessors","getAccessors","parts","split","_traceID","_spanID","_isDetail","renderSpanDetailRow","renderSpanBarRow","findIndex","scrollToIndex","topOfExploreViewRef","scrollIntoView","behavior","setTrace","uiFind","scrollToSpan","shouldComponentUpdate","nextPropKeys","prevProps","shouldScrollToFirstUiFindMatch","clearShouldScrollToFirstUiFindMatch","scrollToFirstVisibleSpan","nextRegisterAccessors","nextTrace","focusedSpanIdForSearch","getClipping","lv","getViewRange","getSearchedSpanIDs","getCollapsedChildren","getViewHeight","getBottomRowIndexVisible","getBottomVisibleIndex","getTopRowIndexVisible","getTopVisibleIndex","mapRowIndexToSpanIndex","mapSpanIndexToRowIndex","childrenToggle","detailToggle","spanNameColumnWidth","isCollapsed","parentSpanIndex","spanContainsErredSpan","rpcSpan","spanChildDepth","findServerChildSpan","rpcViewBounds","peerServiceKV","find","kv","isKindClient","SpanBarRow","detailLogItemToggle","detailLogsToggle","detailProcessToggle","detailReferencesToggle","detailReferenceItemToggle","detailWarningsToggle","detailStackTracesToggle","detailTagsToggle","zIndex","SpanDetailRow","setListView","getRowHeight","renderRow","ToolbarButton","scrollToTop","TraceTimelineViewer","UnthemedTraceTimelineViewer","callbacks","inst","keysHandler","keyboardMappings","mergeShortcuts","setSpanNameColumnWidth","traceTimeline","time","VirtualizedTraceView","NewWindowIconLarge","isLarge","ExternalLinks","BreakableText","WORD_RX","wordRegexp","exec","match","TraceName","typography","lg","traceName","hasOwn","object","prototype","hasOwnProperty","call","createCache","limit","equals","entry","put","singletonCache","entries","cacheIndex","arr","fn","splice","unshift","pop","lruCache","createEqualsFn","basicEquals","deepObjects","deep","valueA","valueB","every","isANull","isBNull","aKeys","bKeys","equalityChecker","aKey","deepEquals","config","apply","deepFreeze","defineProperty","archiveEnabled","dependencies","dagMaxNumServices","menuEnabled","linkPatterns","menu","search","maxLookback","maxLimit","tracking","gaID","trackErrors","getConfigValue","path","defaultConfig","getParent","parentRef","parameterRegExp","getParamNames","str","names","Set","replace","add","stringSupplant","encodeFn","processTemplate","template","parameters","createTestFunction","indexOf","identity","a","getParameterInArray","array","callTemplate","computeLinks","processTags","result","pattern","parameterValues","allParameters","parameter","currentSpan","getParameterInAncestor","processedLinks","encodeURIComponent","_uniq","concat","error","filter","getTraceLinks","memoize","validKeys","includes","computeTraceLink","WeakMap","getTraceName","candidateSpan","allIDs","thisRefLength","candidateRefLength","CanvasSpanGraph","UnthemedCanvasSpanGraph","_canvasElm","_draw","valueWidth","totalValueWidth","canvas","getFillColor","bgColor","fillCache","cHeight","cWidth","innerWidth","itemHeight","itemYChange","ctx","getContext","alpha","fillStyle","fillRect","valueOffset","renderIntoCanvas","getColor","_setCanvasRef","TickLabels","TickLabelsLabel","GraphTick","GraphTicks","x1","y1","x2","y2","ScrubberHandleExpansion","ScrubberHandle","ScrubberLine","ScrubberDragging","ScrubberHandles","Scrubber","xPercent","transform","ViewingLayerResetZoomHoverClassName","ViewingLayerResetZoom","ViewingLayer","ViewingLayerGraph","ViewingLayerInactive","ViewingLayerCursorGuide","ViewingLayerDraggedShift","ViewingLayerDrag","ViewingLayerFullOverlay","dragTypes","UnthemedViewingLayer","preventCursorLine","stopPropagation","_draggerStart","_handleScrubberDragEnd","_handleScrubberDragUpdate","_handleScrubberEnterLeave","_draggerEnd","_getMarkers","leadingX","haveNextTimeRange","leftInactive","cursorPosition","rightInactive","_resetTimeZoomClickHandler","variant","strokeWidth","getItem","memoizedGetitems","SpanGraph","ubPb2","TracePageHeader","TracePageHeaderTitleRow","TracePageHeaderBack","TracePageHeaderTitleLink","TracePageHeaderDetailToggle","TracePageHeaderDetailToggleExpanded","TracePageHeaderTitle","TracePageHeaderTitleCollapsible","TracePageHeaderOverviewItems","TracePageHeaderOverviewItemValueDetail","TracePageHeaderOverviewItemValue","TracePageHeaderArchiveIcon","TracePageHeaderTraceId","HEADER_ITEMS","renderer","timeZone","dateStr","dateTimeFormat","defaultWithMS","_values","processes","p","_maxBy","canCollapse","hideMap","hideSummary","onSlimViewClicked","slimView","summaryItems","uTxMuted","DetailState","oldState","isReferencesOpen","toggleTags","next","toggleProcess","toggleReferences","toggleReferenceItem","delete","toggleWarnings","toggleStackTraces","toggleLogs","toggleLogItem","TreeNode","static","reduce","child","walk","addChild","iterFunction","searchFunction","searchFn","getPath","findPath","currentNode","currentPath","attempt","nodeStack","actualDepth","nodeDepth","getProcessServiceName","proc","getSpanId","getSpanName","getSpanDuration","getSpanTimestamp","getSpanProcessId","processID","getSpanReferenceByType","getSpanServiceName","childOfRef","filterSpansForText","leftBound","rightBound","extract","original","getTextFilterdSpansAsMap","matchingSpans","obj","getTraceSpans","textFilteredSpansMap","muted","getTraceProcesses","getSpanWithProcess","getTraceSpansAsMap","getTraceSpanIdsAsTree","nodesById","spansById","root","parentID","comparator","nodeA","nodeB","sort","getTraceTimestamp","prevTimestamp","getTraceDuration","prevDuration","getParentSpan","tree","spanMap","spanA","spanB","numberSortComparator","itemA","itemB","getTraceServices","spanTree","services","DURATION_FORMATTERS","ms","targetDuration","moment","asMilliseconds","asSeconds","getDurationFormatterForTrace","totalDuration","getTraceSpansByHierarchyPosition","formatter","dir","selector","hierarchyPositionMap","collapsed","collapse","hiddenSpanIds","collapsedSpanId","id","interval","num","updatedSpan","deduplicateTags","spanTags","warningsHash","uniqueTags","t","values","orderTags","topPrefixes","orderedTags","tp","toLowerCase","bKey","startsWith","transformTraceData","traceEndTime","MAX_SAFE_INTEGER","spanIdCounts","idCount","_isEqual","svcCounts","tagsInfo","refSpan","numberOfSpans","filterSpans","textFilter","includeFilters","excludeKeys","w","isTextInFilters","filters","isTextInKeyValues","kvs","toString","ubFlexAuto","ubJustifyEnd","getNonOverlappingDuration","ranges","acc","range","tail","prevStart","prevEnd","makeSpanMap","getSpan","parentId","parentIds","getStats","traceDuration","selfDuration","main","toFixedNoTrailingZeros","secondary","n","parseFloat","makeFrames","MutableDataFrame","Fields","FieldType","mode","meta","preferredVisualisationType","createTraceFrame","toSpanRow","parentSpanID","serviceTags","frame","custom","traceFormat","createTableFrame","instanceSettings","displayNameFromDS","internal","datasourceUid","uid","datasourceName","query","traceData","transformToTraceData","transformToJaeger","traceResponse","flags","total","offset","errors","exports","_extends","assign","source","_react2","_interopRequireDefault","_propTypes2","__esModule","default","IconBase","_ref","_ref2","_objectWithoutProperties","_ref2$reactIconBase","reactIconBase","computedSize","createElement","fill","preserveAspectRatio","verticalAlign","propTypes","string","oneOfType","contextTypes","shape","module","_reactIconBase2","viewBox","d","INDENT","Stylize","styleFile","cssClass","objRule","rule","inlineRule","escape","doc","indent","out","visit","toISOString","encodeURI","element","self","storeInstancesGlobally","directMap","sequenceLevels","resetTimer","ignoreNextKeyup","ignoreNextKeypress","nextExpectedAction","addEvents","instances","bindMultiple","unbind","trigger","reset","stopCallback","handleKey","bindSingle","getKeyInfo","pickBestAction","getReverseMap","getMatches","resetSequences","fireCallback","bindSequence","resetSequenceTimer","detach","REVERSE_MAP","on","eventHandler","callback","action","combinations","j","combo","increaseSequence","nextAction","callbackAndReset","characterFromEvent","setTimeout","wrappedCallback","combination","sequenceName","level","info","sequence","modifiers","seq","off","capture","attachEvent","detachEvent","srcElement","SPECIAL_ALIASES","SHIFT_MAP","isModifier","keysFromString","character","modifiersMatch","matches","code","deleteCombo","deleteSequence","SPECIAL_KEYS_MAP","ignoreThisKeypress","doNotReset","maxLevel","processedSequenceCallback","eventModifiers","which","keyCode","modifiers1","modifiers2","clearTimeout","activeSequences","tagName","isContentEditable","combokeys","SPECIAL_CHARACTERS_MAP","fromCharCode","returnValue","navigator","platform","cancelBubble","deselectCurrent","clipboardToIE11Formatting","debug","message","reselectPrevious","selection","mark","success","createRange","getSelection","textContent","all","clip","whiteSpace","webkitUserSelect","MozUserSelect","msUserSelect","format","clipboardData","clearData","setData","onCopy","appendChild","selectNodeContents","addRange","execCommand","err","copyKey","userAgent","prompt","removeRange","removeAllRanges","removeChild","o","freeze","getOwnPropertyNames","prop","isFrozen","fuzzy","simpleFilter","opts","ch","patternIdx","len","totalScore","currScore","pre","post","compareString","caseSensitive","idx","Infinity","rendered","score","prev","compare","rangeCount","active","activeElement","getRangeAt","toUpperCase","blur","focus"],"sourceRoot":""}